Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 379448fe authored by Gabor Juhos's avatar Gabor Juhos Committed by John W. Linville
Browse files

rt2x00: rt2800lib: introduce rt2800_eeprom_word_index helper



Instead of assign the offset value to the
enum directly use a new helper function to
convert a rt2800_eeprom_word enum into an
index of the rt2x00_dev->eeprom array.

The patch does not change the existing
behaviour, but makes it possible to add
support for three-chain devices which are
using a different EEPROM layout.

Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
Acked-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 022138ca
Loading
Loading
Loading
Loading
+39 −37
Original line number Diff line number Diff line
@@ -2207,43 +2207,45 @@ struct mac_iveiv_entry {
 */

enum rt2800_eeprom_word {
	EEPROM_CHIP_ID		= 0x0000,
	EEPROM_VERSION		= 0x0001,
	EEPROM_MAC_ADDR_0	= 0x0002,
	EEPROM_MAC_ADDR_1	= 0x0003,
	EEPROM_MAC_ADDR_2	= 0x0004,
	EEPROM_NIC_CONF0	= 0x001a,
	EEPROM_NIC_CONF1	= 0x001b,
	EEPROM_FREQ		= 0x001d,
	EEPROM_LED_AG_CONF	= 0x001e,
	EEPROM_LED_ACT_CONF	= 0x001f,
	EEPROM_LED_POLARITY	= 0x0020,
	EEPROM_NIC_CONF2	= 0x0021,
	EEPROM_LNA		= 0x0022,
	EEPROM_RSSI_BG		= 0x0023,
	EEPROM_RSSI_BG2		= 0x0024,
	EEPROM_TXMIXER_GAIN_BG	= 0x0024, /* overlaps with RSSI_BG2 */
	EEPROM_RSSI_A		= 0x0025,
	EEPROM_RSSI_A2		= 0x0026,
	EEPROM_TXMIXER_GAIN_A	= 0x0026, /* overlaps with RSSI_A2 */
	EEPROM_EIRP_MAX_TX_POWER = 0x0027,
	EEPROM_TXPOWER_DELTA	= 0x0028,
	EEPROM_TXPOWER_BG1	= 0x0029,
	EEPROM_TXPOWER_BG2	= 0x0030,
	EEPROM_TSSI_BOUND_BG1	= 0x0037,
	EEPROM_TSSI_BOUND_BG2	= 0x0038,
	EEPROM_TSSI_BOUND_BG3	= 0x0039,
	EEPROM_TSSI_BOUND_BG4	= 0x003a,
	EEPROM_TSSI_BOUND_BG5	= 0x003b,
	EEPROM_TXPOWER_A1	= 0x003c,
	EEPROM_TXPOWER_A2	= 0x0053,
	EEPROM_TSSI_BOUND_A1	= 0x006a,
	EEPROM_TSSI_BOUND_A2	= 0x006b,
	EEPROM_TSSI_BOUND_A3	= 0x006c,
	EEPROM_TSSI_BOUND_A4	= 0x006d,
	EEPROM_TSSI_BOUND_A5	= 0x006e,
	EEPROM_TXPOWER_BYRATE	= 0x006f,
	EEPROM_BBP_START	= 0x0078,
	EEPROM_CHIP_ID = 0,
	EEPROM_VERSION,
	EEPROM_MAC_ADDR_0,
	EEPROM_MAC_ADDR_1,
	EEPROM_MAC_ADDR_2,
	EEPROM_NIC_CONF0,
	EEPROM_NIC_CONF1,
	EEPROM_FREQ,
	EEPROM_LED_AG_CONF,
	EEPROM_LED_ACT_CONF,
	EEPROM_LED_POLARITY,
	EEPROM_NIC_CONF2,
	EEPROM_LNA,
	EEPROM_RSSI_BG,
	EEPROM_RSSI_BG2,
	EEPROM_TXMIXER_GAIN_BG,
	EEPROM_RSSI_A,
	EEPROM_RSSI_A2,
	EEPROM_TXMIXER_GAIN_A,
	EEPROM_EIRP_MAX_TX_POWER,
	EEPROM_TXPOWER_DELTA,
	EEPROM_TXPOWER_BG1,
	EEPROM_TXPOWER_BG2,
	EEPROM_TSSI_BOUND_BG1,
	EEPROM_TSSI_BOUND_BG2,
	EEPROM_TSSI_BOUND_BG3,
	EEPROM_TSSI_BOUND_BG4,
	EEPROM_TSSI_BOUND_BG5,
	EEPROM_TXPOWER_A1,
	EEPROM_TXPOWER_A2,
	EEPROM_TSSI_BOUND_A1,
	EEPROM_TSSI_BOUND_A2,
	EEPROM_TSSI_BOUND_A3,
	EEPROM_TSSI_BOUND_A4,
	EEPROM_TSSI_BOUND_A5,
	EEPROM_TXPOWER_BYRATE,
	EEPROM_BBP_START,
	/* New values must be added before this */
	EEPROM_WORD_COUNT
};

/*
+83 −4
Original line number Diff line number Diff line
@@ -221,22 +221,98 @@ static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev,
	mutex_unlock(&rt2x00dev->csr_mutex);
}

static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
	[EEPROM_CHIP_ID]		= 0x0000,
	[EEPROM_VERSION]		= 0x0001,
	[EEPROM_MAC_ADDR_0]		= 0x0002,
	[EEPROM_MAC_ADDR_1]		= 0x0003,
	[EEPROM_MAC_ADDR_2]		= 0x0004,
	[EEPROM_NIC_CONF0]		= 0x001a,
	[EEPROM_NIC_CONF1]		= 0x001b,
	[EEPROM_FREQ]			= 0x001d,
	[EEPROM_LED_AG_CONF]		= 0x001e,
	[EEPROM_LED_ACT_CONF]		= 0x001f,
	[EEPROM_LED_POLARITY]		= 0x0020,
	[EEPROM_NIC_CONF2]		= 0x0021,
	[EEPROM_LNA]			= 0x0022,
	[EEPROM_RSSI_BG]		= 0x0023,
	[EEPROM_RSSI_BG2]		= 0x0024,
	[EEPROM_TXMIXER_GAIN_BG]	= 0x0024, /* overlaps with RSSI_BG2 */
	[EEPROM_RSSI_A]			= 0x0025,
	[EEPROM_RSSI_A2]		= 0x0026,
	[EEPROM_TXMIXER_GAIN_A]		= 0x0026, /* overlaps with RSSI_A2 */
	[EEPROM_EIRP_MAX_TX_POWER]	= 0x0027,
	[EEPROM_TXPOWER_DELTA]		= 0x0028,
	[EEPROM_TXPOWER_BG1]		= 0x0029,
	[EEPROM_TXPOWER_BG2]		= 0x0030,
	[EEPROM_TSSI_BOUND_BG1]		= 0x0037,
	[EEPROM_TSSI_BOUND_BG2]		= 0x0038,
	[EEPROM_TSSI_BOUND_BG3]		= 0x0039,
	[EEPROM_TSSI_BOUND_BG4]		= 0x003a,
	[EEPROM_TSSI_BOUND_BG5]		= 0x003b,
	[EEPROM_TXPOWER_A1]		= 0x003c,
	[EEPROM_TXPOWER_A2]		= 0x0053,
	[EEPROM_TSSI_BOUND_A1]		= 0x006a,
	[EEPROM_TSSI_BOUND_A2]		= 0x006b,
	[EEPROM_TSSI_BOUND_A3]		= 0x006c,
	[EEPROM_TSSI_BOUND_A4]		= 0x006d,
	[EEPROM_TSSI_BOUND_A5]		= 0x006e,
	[EEPROM_TXPOWER_BYRATE]		= 0x006f,
	[EEPROM_BBP_START]		= 0x0078,
};

static unsigned int rt2800_eeprom_word_index(struct rt2x00_dev *rt2x00dev,
					     const enum rt2800_eeprom_word word)
{
	const unsigned int *map;
	unsigned int index;

	if (WARN_ONCE(word >= EEPROM_WORD_COUNT,
		      "%s: invalid EEPROM word %d\n",
		      wiphy_name(rt2x00dev->hw->wiphy), word))
		return 0;

	map = rt2800_eeprom_map;
	index = map[word];

	/* Index 0 is valid only for EEPROM_CHIP_ID.
	 * Otherwise it means that the offset of the
	 * given word is not initialized in the map,
	 * or that the field is not usable on the
	 * actual chipset.
	 */
	WARN_ONCE(word != EEPROM_CHIP_ID && index == 0,
		  "%s: invalid access of EEPROM word %d\n",
		  wiphy_name(rt2x00dev->hw->wiphy), word);

	return index;
}

static void *rt2800_eeprom_addr(struct rt2x00_dev *rt2x00dev,
				const enum rt2800_eeprom_word word)
{
	return rt2x00_eeprom_addr(rt2x00dev, word);
	unsigned int index;

	index = rt2800_eeprom_word_index(rt2x00dev, word);
	return rt2x00_eeprom_addr(rt2x00dev, index);
}

static void rt2800_eeprom_read(struct rt2x00_dev *rt2x00dev,
			       const enum rt2800_eeprom_word word, u16 *data)
{
	rt2x00_eeprom_read(rt2x00dev, word, data);
	unsigned int index;

	index = rt2800_eeprom_word_index(rt2x00dev, word);
	rt2x00_eeprom_read(rt2x00dev, index, data);
}

static void rt2800_eeprom_write(struct rt2x00_dev *rt2x00dev,
				const enum rt2800_eeprom_word word, u16 data)
{
	rt2x00_eeprom_write(rt2x00dev, word, data);
	unsigned int index;

	index = rt2800_eeprom_word_index(rt2x00dev, word);
	rt2x00_eeprom_write(rt2x00dev, index, data);
}

static void rt2800_eeprom_read_from_array(struct rt2x00_dev *rt2x00dev,
@@ -244,7 +320,10 @@ static void rt2800_eeprom_read_from_array(struct rt2x00_dev *rt2x00dev,
					  unsigned int offset,
					  u16 *data)
{
	rt2x00_eeprom_read(rt2x00dev, array + offset, data);
	unsigned int index;

	index = rt2800_eeprom_word_index(rt2x00dev, array);
	rt2x00_eeprom_read(rt2x00dev, index + offset, data);
}

static int rt2800_enable_wlan_rt3290(struct rt2x00_dev *rt2x00dev)