Skip to contentSkip to conversation

RT2x00: Add TXPOWER_FROM_DEV and TXPOWER_TO_DEV macros

PATCH Superseded Ivo van Doorn 1 participant 2 messages Jul 26, 2006

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 6/24 RT2x00: Add TXPOWER_FROM_DEV and TXPOWER_TO_DEV macros

Quoted 1 line

From Ivo van Doorn <[email protected]>

Add TXPOWER_FROM_DEV and TXPOWER_TO_DEV macro's to convert the txpower values read from the eeprom to the value dscape expects, and vice versa.

---

diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.c --- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2400pci.c

2006-07-23 17:01:06.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.c	
2006-07-23 17:24:56.000000000 +0200

@@ -582,8 +582,7 @@

static void rt2400pci_config_txpower(struct rt2x00_dev *rt2x00dev, u8
txpower)
{
- txpower = (txpower < 39) ? 39 : txpower;
- txpower = (txpower > 62) ? 62 : txpower;
+ txpower = TXPOWER_TO_DEV(txpower);
rt2x00_bbp_write(rt2x00dev, 3, txpower);
}

@@ -2343,15 +2342,11 @@
rt2x00_eeprom_read(rt2x00dev,
EEPROM_TXPOWER_START + i, &eeprom);

- channels[(i * 2)].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1);
- if (channels[(i * 2)].power_level > 0x7f)
- channels[(i * 2)].power_level = 0x27;
-
- channels[(i * 2) + 1].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2);
- if (channels[(i * 2) + 1].power_level > 0x7f)
- channels[(i * 2) + 1].power_level = 0x27;
+ channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1));
+
+ channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2));
}

/*
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2400pci.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.h --- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2400pci.h

2006-07-23 16:34:46.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.h	
2006-07-23 17:15:44.000000000 +0200

@@ -845,6 +845,34 @@
};

/*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ * NOTE: Logics in rt2400pci for txpower are reversed
+ * compared to the other rt2x00 drivers. A higher txpower
+ * value means that the txpower must be lowered. This is
+ * important when converting the value coming from the
+ * dscape stack to the rt2400 acceptable value.
+ */
+#define MIN_TXPOWER 31
+#define MAX_TXPOWER 62
+#define DEFAULT_TXPOWER 39
+
+#define TXPOWER_FROM_DEV(__txpower) \
+ ({ \
+ ((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER - MIN_TXPOWER : \
+ ((__txpower) < MIN_TXPOWER) ? DEFAULT_TXPOWER - MIN_TXPOWER : \
+ (((__txpower) - MAX_TXPOWER) + MIN_TXPOWER); \
+ })
+
+#define TXPOWER_TO_DEV(__txpower) \
+ ({ \
+ (__txpower) += MIN_TXPOWER; \
+ ((__txpower) < MIN_TXPOWER) ? MAX_TXPOWER : \
+ (((__txpower) > MAX_TXPOWER) ? MIN_TXPOWER : \
+ (MAX_TXPOWER - ((__txpower) - MIN_TXPOWER))); \
+ })
+
+/*
* IEEE stack callback functions declarations.
*/
static int rt2400pci_tx(struct net_device *net_dev,
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.c --- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500pci.c

2006-07-23 17:01:39.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.c	
2006-07-23 17:31:27.000000000 +0200

@@ -533,8 +533,9 @@
u32 rf3 = rt2x00dev->rf3;
u32 rf4 = rt2x00dev->rf4;

- txpower = (txpower < 19) ? 19 : txpower;
- txpower = (txpower > 31) ? 31 : txpower;
+ if (txpower == 0xff)
+ txpower = rt2x00dev->tx_power;
+ txpower = TXPOWER_TO_DEV(txpower);

if (rt2x00_rf(&rt2x00dev->chip, RF2525E) && channel == 14)
rf4 |= cpu_to_le32(0x00000010);
@@ -615,6 +616,14 @@
rt2x00_register_read(rt2x00dev, CNT0, &rf1);
}

+static void rt2500pci_config_txpower(struct rt2x00_dev *rt2x00dev, int txpower)
+{
+ txpower = TXPOWER_TO_DEV(txpower);
+
+ rt2x00_set_field32(&rt2x00dev->rf3, RF3_TXPOWER, txpower);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3);
+}
+
static void rt2500pci_config_antenna(struct rt2x00_dev *rt2x00dev, int
antenna)
{
u32 reg;
@@ -2003,6 +2012,7 @@
rt2500pci_config_channel(rt2x00dev,
conf->channel_val, conf->channel, conf->freq, conf->power_level);
+ rt2500pci_config_txpower(rt2x00dev, conf->power_level);
rt2500pci_config_antenna(rt2x00dev, conf->antenna_sel); rt2500pci_config_duration(rt2x00dev, conf->short_slot_time); rt2500pci_config_phymode(rt2x00dev, conf->phymode);
@@ -2471,7 +2481,7 @@
channels[i].flag = IEEE80211_CHAN_W_IBSS
| IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN;
- channels[i].power_level = 0x18;
+ channels[i].power_level = DEFAULT_TXPOWER;
channels[i].antenna_max = 0xff;
}
}
@@ -2542,15 +2552,11 @@
rt2x00_eeprom_read(rt2x00dev,
EEPROM_TXPOWER_START + i, &eeprom);

- channels[(i * 2)].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1);
- if (channels[(i * 2)].power_level > 0x20)
- channels[(i * 2)].power_level = 0x18;
-
- channels[(i * 2) + 1].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2);
- if (channels[(i * 2) + 1].power_level > 0x20)
- channels[(i * 2) + 1].power_level = 0x18;
+ channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1));
+
+ channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2));
}

/*
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500pci.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.h --- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500pci.h

2006-07-23 16:35:07.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.h	
2006-07-23 17:16:15.000000000 +0200

@@ -1114,6 +1114,26 @@
};

/*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER 0
+#define MAX_TXPOWER 31
+#define DEFAULT_TXPOWER 24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+ ({ \
+ ((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower); \
+ })
+
+#define TXPOWER_TO_DEV(__txpower) \
+ ({ \
+ ((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+ (((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+ (__txpower)); \
+ })
+
+/*
* IEEE stack callback functions declarations.
*/
static int rt2500pci_tx(struct net_device *net_dev,
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.c --- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500usb.c

2006-07-23 17:02:01.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.c	
2006-07-23 17:31:13.000000000 +0200

@@ -380,8 +380,9 @@
u32 rf3 = rt2x00dev->rf3;
u32 rf4 = rt2x00dev->rf4;

- txpower = (txpower < 19) ? 19 : txpower;
- txpower = (txpower > 31) ? 31 : txpower;
+ if (txpower == 0xff)
+ txpower = rt2x00dev->tx_power;
+ txpower = TXPOWER_TO_DEV(txpower);

 	if ((rt2x00_rf(&rt2x00dev->chip, RF2523) ||
 	     rt2x00_rf(&rt2x00dev->chip, RF2524) ||

@@ -444,6 +445,14 @@
rt2x00dev->rx_params.channel = channel;
}

+static void rt2500usb_config_txpower(struct rt2x00_dev *rt2x00dev, int txpower)
+{
+ txpower = TXPOWER_TO_DEV(txpower);
+
+ rt2x00_set_field32_nb(&rt2x00dev->rf3, RF3_TXPOWER, txpower);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3);
+}
+
static void rt2500usb_config_antenna(struct rt2x00_dev *rt2x00dev, int
antenna)
{
u8 reg_rx;
@@ -1665,6 +1674,7 @@
rt2500usb_config_channel(rt2x00dev,
conf->channel_val, conf->channel, conf->freq, conf->power_level);
+ rt2500usb_config_txpower(rt2x00dev, conf->power_level);
rt2500usb_config_antenna(rt2x00dev, conf->antenna_sel); rt2500usb_config_duration(rt2x00dev, conf->short_slot_time); rt2500usb_config_phymode(rt2x00dev, conf->phymode);
@@ -2104,7 +2114,7 @@
channels[i].flag = IEEE80211_CHAN_W_IBSS
| IEEE80211_CHAN_W_ACTIVE_SCAN | IEEE80211_CHAN_W_SCAN;
- channels[i].power_level = 0x18;
+ channels[i].power_level = DEFAULT_TXPOWER;
channels[i].antenna_max = 0xff;
}
}
@@ -2174,15 +2184,11 @@
rt2x00_eeprom_read(rt2x00dev,
EEPROM_TXPOWER_START + i, &eeprom);

- channels[(i * 2)].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1);
- if (channels[(i * 2)].power_level > 0x20)
- channels[(i * 2)].power_level = 0x18;
-
- channels[(i * 2) + 1].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2);
- if (channels[(i * 2) + 1].power_level > 0x20)
- channels[(i * 2) + 1].power_level = 0x18;
+ channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1));
+
+ channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2));
}

/*
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500usb.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.h --- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500usb.h

2006-07-23 16:35:21.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.h	
2006-07-23 17:16:31.000000000 +0200

@@ -634,6 +634,26 @@
};

/*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER 0
+#define MAX_TXPOWER 31
+#define DEFAULT_TXPOWER 24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+ ({ \
+ ((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower); \
+ })
+
+#define TXPOWER_TO_DEV(__txpower) \
+ ({ \
+ ((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+ (((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+ (__txpower)); \
+ })
+
+/*
* IEEE stack callback functions declarations.
*/
static int rt2500usb_tx(struct net_device *net_dev,
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt61pci.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt61pci.c
--- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt61pci.c 2006-07-23
17:02:10.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt61pci.c

2006-07-23 17:31:05.000000000 +0200

@@ -565,8 +565,9 @@
u32 rf3 = 0;
u32 rf4 = 0;

- txpower = (txpower < 0) ? 0 : txpower;
- txpower = (txpower > 31) ? 31 : txpower;
+ if (txpower == 0xff)
+ txpower = rt2x00dev->tx_power;
+ txpower = TXPOWER_TO_DEV(txpower);

if (!GET_FLAG(rt2x00dev, CONFIG_RF_SEQUENCE) || channel <= 14)
rf1 = cpu_to_le32(0x00002ccc);
@@ -783,6 +784,32 @@
rt2x00dev->rx_params.channel = channel;
}

+static void rt61pci_config_txpower(struct rt2x00_dev *rt2x00dev, int txpower) +{
+ txpower = TXPOWER_TO_DEV(txpower);
+
+ rt2x00_set_field32(&rt2x00dev->rf3, RF3_TXPOWER, txpower);
+
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf1);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf2);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3 & ~cpu_to_le32(0x00000004));
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf4);
+
+ udelay(200);
+
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf1);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf2);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3 | cpu_to_le32(0x00000004));
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf4);
+
+ udelay(200);
+
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf1);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf2);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3 & ~cpu_to_le32(0x00000004));
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf4);
+}
+
static void rt61pci_config_antenna(struct rt2x00_dev *rt2x00dev,
int antenna, int phymode)
{
@@ -1237,7 +1264,8 @@
rt2x00_set_field32(&txd->word1, TXD_W1_CWMIN, ring->tx_params.cw_min); rt2x00_set_field32(&txd->word1, TXD_W1_CWMAX, ring->tx_params.cw_max);

- rt2x00_set_field32(&txd->word5, TXD_W5_TX_POWER, control->power_level);
+ rt2x00_set_field32(&txd->word5, TXD_W5_TX_POWER,
+ TXPOWER_TO_DEV(control->power_level));

/*
* Add 4 bytes for FCS.
@@ -2460,6 +2488,7 @@
rt61pci_config_channel(rt2x00dev,
conf->channel_val, conf->channel, conf->freq, conf->power_level);
+ rt61pci_config_txpower(rt2x00dev, conf->power_level);
rt61pci_config_antenna(rt2x00dev, conf->antenna_sel, conf->phymode); rt61pci_config_duration(rt2x00dev, conf->short_slot_time); rt61pci_config_phymode(rt2x00dev, conf->phymode);
@@ -3081,15 +3110,11 @@
rt2x00_eeprom_read(rt2x00dev,
EEPROM_TXPOWER_G_START + i, &eeprom);

- channels[(i * 2)].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_1);
- if (channels[(i * 2)].power_level > 0x20)
- channels[(i * 2)].power_level = 0x18;
-
- channels[(i * 2) + 1].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_2);
- if (channels[(i * 2) + 1].power_level > 0x20)
- channels[(i * 2) + 1].power_level = 0x18;
+ channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_1));
+
+ channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_2));
}

if (rt2x00_rf(&rt2x00dev->chip, RF5225) ||
@@ -3098,15 +3123,13 @@
rt2x00_eeprom_read(rt2x00dev,
EEPROM_TXPOWER_A_START + i, &eeprom);

- channels[(i * 2)].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_A_1);
- if (channels[(i * 2)].power_level > 0x20)
- channels[(i * 2)].power_level = 0x18;
-
- channels[(i * 2) + 1].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_A_2);
- if (channels[(i * 2) + 1].power_level > 0x20)
- channels[(i * 2) + 1].power_level = 0x18;
+ channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom,
+ EEPROM_TXPOWER_A_1));
+
+ channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom,
+ EEPROM_TXPOWER_A_2));
}
}
}
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt61pci.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt61pci.h
--- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt61pci.h 2006-07-23
16:35:36.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt61pci.h

2006-07-23 17:16:49.000000000 +0200

@@ -1330,6 +1330,26 @@
};

/*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER 0
+#define MAX_TXPOWER 31
+#define DEFAULT_TXPOWER 24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+ ({ \
+ ((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower); \
+ })
+
+#define TXPOWER_TO_DEV(__txpower) \
+ ({ \
+ ((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+ (((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+ (__txpower)); \
+ })
+
+/*
* IEEE stack callback functions declarations.
*/
static int rt61pci_tx(struct net_device *net_dev,
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt73usb.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt73usb.c
--- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt73usb.c 2006-07-23
17:02:18.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt73usb.c

2006-07-23 17:30:57.000000000 +0200

@@ -386,8 +386,9 @@
u32 rf3 = rt2x00dev->rf3;
u32 rf4 = 0;

- txpower = (txpower < 0) ? 0 : txpower;
- txpower = (txpower > 31) ? 31 : txpower;
+ if (txpower == 0xff)
+ txpower = rt2x00dev->tx_power;
+ txpower = TXPOWER_TO_DEV(txpower);

if (rt2x00_rf(&rt2x00dev->chip, RF5225)) {
if (channel <= 14)
@@ -507,6 +508,28 @@
rt2x00dev->rx_params.channel = channel;
}

+static void rt73usb_config_txpower(struct rt2x00_dev *rt2x00dev, int txpower) +{
+ txpower = TXPOWER_TO_DEV(txpower);
+
+ rt2x00_set_field32(&rt2x00dev->rf3, RF3_TXPOWER, txpower);
+
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf1);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf2);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3 & ~cpu_to_le32(0x00000004));
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf4);
+
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf1);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf2);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3 | cpu_to_le32(0x00000004));
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf4);
+
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf1);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf2);
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3 & ~cpu_to_le32(0x00000004));
+ rt2x00_rf_write(rt2x00dev, rt2x00dev->rf4);
+}
+
static void rt73usb_config_antenna(struct rt2x00_dev *rt2x00dev,
int antenna, int phymode)
{
@@ -971,7 +994,8 @@
rt2x00_set_field32(&txd->word1, TXD_W1_CWMIN, ring->tx_params.cw_min); rt2x00_set_field32(&txd->word1, TXD_W1_CWMAX, ring->tx_params.cw_max);

- rt2x00_set_field32(&txd->word5, TXD_W5_TX_POWER, control->power_level);
+ rt2x00_set_field32(&txd->word5, TXD_W5_TX_POWER,
+ TXPOWER_TO_DEV(control->power_level));

/*
* Add 4 bytes for FCS.
@@ -1966,6 +1990,7 @@
rt73usb_config_channel(rt2x00dev,
conf->channel_val, conf->channel, conf->freq, conf->power_level);
+ rt73usb_config_txpower(rt2x00dev, conf->power_level);
rt73usb_config_antenna(rt2x00dev, conf->antenna_sel, conf->phymode); rt73usb_config_duration(rt2x00dev, conf->short_slot_time); rt73usb_config_phymode(rt2x00dev, conf->phymode);
@@ -2566,15 +2591,11 @@
rt2x00_eeprom_read(rt2x00dev,
EEPROM_TXPOWER_G_START + i, &eeprom);

- channels[(i * 2)].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_1);
- if (channels[(i * 2)].power_level > 0x20)
- channels[(i * 2)].power_level = 0x18;
-
- channels[(i * 2) + 1].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_2);
- if (channels[(i * 2) + 1].power_level > 0x20)
- channels[(i * 2) + 1].power_level = 0x18;
+ channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_1));
+
+ channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom, EEPROM_TXPOWER_G_2));
}

if (rt2x00_rf(&rt2x00dev->chip, RF5225) ||
@@ -2583,15 +2604,13 @@
rt2x00_eeprom_read(rt2x00dev,
EEPROM_TXPOWER_A_START + i, &eeprom);

- channels[(i * 2)].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_A_1);
- if (channels[(i * 2)].power_level > 0x20)
- channels[(i * 2)].power_level = 0x18;
-
- channels[(i * 2) + 1].power_level =
- rt2x00_get_field16(eeprom, EEPROM_TXPOWER_A_2);
- if (channels[(i * 2) + 1].power_level > 0x20)
- channels[(i * 2) + 1].power_level = 0x18;
+ channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom,
+ EEPROM_TXPOWER_A_1));
+
+ channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+ rt2x00_get_field16(eeprom,
+ EEPROM_TXPOWER_A_2));
}
}

diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt73usb.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt73usb.h
--- wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt73usb.h 2006-07-23
16:35:48.000000000 +0200
+++ wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt73usb.h

2006-07-23 17:17:09.000000000 +0200

@@ -893,6 +893,26 @@
};

/*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER 0
+#define MAX_TXPOWER 31
+#define DEFAULT_TXPOWER 24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+ ({ \
+ ((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower); \
+ })
+
+#define TXPOWER_TO_DEV(__txpower) \
+ ({ \
+ ((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+ (((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+ (__txpower)); \
+ })
+
+/*
* IEEE stack callback functions declarations.
*/
static int rt73usb_tx(struct net_device *net_dev,

#1 lore raw
Quoted 1 line

From Ivo van Doorn <[email protected]>

Add TXPOWER_FROM_DEV and TXPOWER_TO_DEV macro's to convert the txpower values read from the eeprom to the value dscape expects, and vice versa.

drivers/net/wireless/d80211/rt2x00/rt2400pci.c +6 -11
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
@@ -582,8 +582,7 @@
 
 static void rt2400pci_config_txpower(struct rt2x00_dev *rt2x00dev, u8 txpower)
 {
-	txpower = (txpower < 39) ? 39 : txpower;
-	txpower = (txpower > 62) ? 62 : txpower;
+	txpower = TXPOWER_TO_DEV(txpower);
 	rt2x00_bbp_write(rt2x00dev, 3, txpower);
 }
 
@@ -2343,15 +2342,11 @@
 		rt2x00_eeprom_read(rt2x00dev,
 			EEPROM_TXPOWER_START + i, &eeprom);
 
-		channels[(i * 2)].power_level =
-			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1);
-		if (channels[(i * 2)].power_level > 0x7f)
-			channels[(i * 2)].power_level = 0x27;
-
-		channels[(i * 2) + 1].power_level =
-			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2);
-		if (channels[(i * 2) + 1].power_level > 0x7f)
-			channels[(i * 2) + 1].power_level = 0x27;
+		channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1));
+
+		channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2));
 	}
 
 	/*
drivers/net/wireless/d80211/rt2x00/rt2400pci.h +28 -0
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2400pci.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2400pci.h
@@ -845,6 +845,34 @@
 };
 
 /*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ * NOTE: Logics in rt2400pci for txpower are reversed
+ * compared to the other rt2x00 drivers. A higher txpower
+ * value means that the txpower must be lowered. This is
+ * important when converting the value coming from the
+ * dscape stack to the rt2400 acceptable value.
+ */
+#define MIN_TXPOWER	31
+#define MAX_TXPOWER	62
+#define DEFAULT_TXPOWER	39
+
+#define TXPOWER_FROM_DEV(__txpower) \
+	({ \
+		((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER - MIN_TXPOWER : \
+		((__txpower) < MIN_TXPOWER) ? DEFAULT_TXPOWER - MIN_TXPOWER : \
+		(((__txpower) - MAX_TXPOWER) + MIN_TXPOWER); \
+	})
+
+#define TXPOWER_TO_DEV(__txpower) \
+	({ \
+		(__txpower) += MIN_TXPOWER; \
+		((__txpower) < MIN_TXPOWER) ? MAX_TXPOWER : \
+		(((__txpower) > MAX_TXPOWER) ? MIN_TXPOWER : \
+		(MAX_TXPOWER - ((__txpower) - MIN_TXPOWER))); \
+	})
+
+/*
  * IEEE stack callback functions declarations.
  */
 static int rt2400pci_tx(struct net_device *net_dev,
drivers/net/wireless/d80211/rt2x00/rt2500pci.c +18 -12
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
@@ -533,8 +533,9 @@
 	u32 rf3 = rt2x00dev->rf3;
 	u32 rf4 = rt2x00dev->rf4;
 
-	txpower = (txpower < 19) ? 19 : txpower;
-	txpower = (txpower > 31) ? 31 : txpower;
+	if (txpower == 0xff)
+		txpower = rt2x00dev->tx_power;
+	txpower = TXPOWER_TO_DEV(txpower);
 
 	if (rt2x00_rf(&rt2x00dev->chip, RF2525E) && channel == 14)
 		rf4 |= cpu_to_le32(0x00000010);
@@ -615,6 +616,14 @@
 	rt2x00_register_read(rt2x00dev, CNT0, &rf1);
 }
 
+static void rt2500pci_config_txpower(struct rt2x00_dev *rt2x00dev, int txpower)
+{
+	txpower = TXPOWER_TO_DEV(txpower);
+
+	rt2x00_set_field32(&rt2x00dev->rf3, RF3_TXPOWER, txpower);
+	rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3);
+}
+
 static void rt2500pci_config_antenna(struct rt2x00_dev *rt2x00dev, int antenna)
 {
 	u32 reg;
@@ -2003,6 +2012,7 @@
 	rt2500pci_config_channel(rt2x00dev,
 		conf->channel_val, conf->channel, conf->freq,
 		conf->power_level);
+	rt2500pci_config_txpower(rt2x00dev, conf->power_level);
 	rt2500pci_config_antenna(rt2x00dev, conf->antenna_sel);
 	rt2500pci_config_duration(rt2x00dev, conf->short_slot_time);
 	rt2500pci_config_phymode(rt2x00dev, conf->phymode);
@@ -2471,7 +2481,7 @@
 			channels[i].flag = IEEE80211_CHAN_W_IBSS
 				| IEEE80211_CHAN_W_ACTIVE_SCAN
 				| IEEE80211_CHAN_W_SCAN;
-			channels[i].power_level = 0x18;
+			channels[i].power_level = DEFAULT_TXPOWER;
 			channels[i].antenna_max = 0xff;
 		}
 	}
@@ -2542,15 +2552,11 @@
 		rt2x00_eeprom_read(rt2x00dev,
 			EEPROM_TXPOWER_START + i, &eeprom);
 
-		channels[(i * 2)].power_level =
-			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1);
-		if (channels[(i * 2)].power_level > 0x20)
-			channels[(i * 2)].power_level = 0x18;
-
-		channels[(i * 2) + 1].power_level =
-			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2);
-		if (channels[(i * 2) + 1].power_level > 0x20)
-			channels[(i * 2) + 1].power_level = 0x18;
+		channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1));
+
+		channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2));
 	}
 
 	/*
drivers/net/wireless/d80211/rt2x00/rt2500pci.h +20 -0
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500pci.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500pci.h
@@ -1114,6 +1114,26 @@
 };
 
 /*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER	0
+#define MAX_TXPOWER	31
+#define DEFAULT_TXPOWER	24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+	({ \
+		((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower); \
+	})
+
+#define TXPOWER_TO_DEV(__txpower) \
+	({ \
+		((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+		(((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+		(__txpower)); \
+	})
+
+/*
  * IEEE stack callback functions declarations.
  */
 static int rt2500pci_tx(struct net_device *net_dev,
drivers/net/wireless/d80211/rt2x00/rt2500usb.c +18 -12
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
@@ -380,8 +380,9 @@
 	u32 rf3 = rt2x00dev->rf3;
 	u32 rf4 = rt2x00dev->rf4;
 
-	txpower = (txpower < 19) ? 19 : txpower;
-	txpower = (txpower > 31) ? 31 : txpower;
+	if (txpower == 0xff)
+		txpower = rt2x00dev->tx_power;
+	txpower = TXPOWER_TO_DEV(txpower);
 
 	if ((rt2x00_rf(&rt2x00dev->chip, RF2523) ||
 	     rt2x00_rf(&rt2x00dev->chip, RF2524) ||
@@ -444,6 +445,14 @@
 	rt2x00dev->rx_params.channel = channel;
 }
 
+static void rt2500usb_config_txpower(struct rt2x00_dev *rt2x00dev, int txpower)
+{
+	txpower = TXPOWER_TO_DEV(txpower);
+
+	rt2x00_set_field32_nb(&rt2x00dev->rf3, RF3_TXPOWER, txpower);
+	rt2x00_rf_write(rt2x00dev, rt2x00dev->rf3);
+}
+
 static void rt2500usb_config_antenna(struct rt2x00_dev *rt2x00dev, int antenna)
 {
 	u8 reg_rx;
@@ -1665,6 +1674,7 @@
 	rt2500usb_config_channel(rt2x00dev,
 		conf->channel_val, conf->channel, conf->freq,
 		conf->power_level);
+	rt2500usb_config_txpower(rt2x00dev, conf->power_level);
 	rt2500usb_config_antenna(rt2x00dev, conf->antenna_sel);
 	rt2500usb_config_duration(rt2x00dev, conf->short_slot_time);
 	rt2500usb_config_phymode(rt2x00dev, conf->phymode);
@@ -2104,7 +2114,7 @@
 			channels[i].flag = IEEE80211_CHAN_W_IBSS
 				| IEEE80211_CHAN_W_ACTIVE_SCAN
 				| IEEE80211_CHAN_W_SCAN;
-			channels[i].power_level = 0x18;
+			channels[i].power_level = DEFAULT_TXPOWER;
 			channels[i].antenna_max = 0xff;
 		}
 	}
@@ -2174,15 +2184,11 @@
 		rt2x00_eeprom_read(rt2x00dev,
 			EEPROM_TXPOWER_START + i, &eeprom);
 
-		channels[(i * 2)].power_level =
-			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1);
-		if (channels[(i * 2)].power_level > 0x20)
-			channels[(i * 2)].power_level = 0x18;
-
-		channels[(i * 2) + 1].power_level =
-			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2);
-		if (channels[(i * 2) + 1].power_level > 0x20)
-			channels[(i * 2) + 1].power_level = 0x18;
+		channels[(i * 2)].power_level = TXPOWER_FROM_DEV(
+			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_1));
+
+		channels[(i * 2) + 1].power_level = TXPOWER_FROM_DEV(
+			rt2x00_get_field16(eeprom, EEPROM_TXPOWER_2));
 	}
 
 	/*
drivers/net/wireless/d80211/rt2x00/rt2500usb.h +20 -0
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt2500usb.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt2500usb.h
@@ -634,6 +634,26 @@
 };
 
 /*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER	0
+#define MAX_TXPOWER	31
+#define DEFAULT_TXPOWER	24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+	({ \
+		((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower);  \
+	})
+
+#define TXPOWER_TO_DEV(__txpower) \
+	({ \
+		((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+		(((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+		(__txpower)); \
+	})
+
+/*
  * IEEE stack callback functions declarations.
  */
 static int rt2500usb_tx(struct net_device *net_dev,
drivers/net/wireless/d80211/rt2x00/rt61pci.c +44 -21

101 lines not on this page · raw message

drivers/net/wireless/d80211/rt2x00/rt61pci.h +20 -0
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt61pci.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt61pci.h
@@ -1330,6 +1330,26 @@
 };
 
 /*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER	0
+#define MAX_TXPOWER	31
+#define DEFAULT_TXPOWER	24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+	({ \
+		((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower); \
+	})
+
+#define TXPOWER_TO_DEV(__txpower) \
+	({ \
+		((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+		(((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+		(__txpower)); \
+	})
+
+/*
  * IEEE stack callback functions declarations.
  */
 static int rt61pci_tx(struct net_device *net_dev,
drivers/net/wireless/d80211/rt2x00/rt73usb.c +40 -21

97 lines not on this page · raw message

drivers/net/wireless/d80211/rt2x00/rt73usb.h +20 -0
diff -rU3 wireless-dev-rates/drivers/net/wireless/d80211/rt2x00/rt73usb.h wireless-dev-txpower/drivers/net/wireless/d80211/rt2x00/rt73usb.h
@@ -893,6 +893,26 @@
 };
 
 /*
+ * Macro's for converting txpower from EEPROM to dscape value
+ * and from dscape value to register value.
+ */
+#define MIN_TXPOWER	0
+#define MAX_TXPOWER	31
+#define DEFAULT_TXPOWER	24
+
+#define TXPOWER_FROM_DEV(__txpower) \
+	({ \
+		((__txpower) > MAX_TXPOWER) ? DEFAULT_TXPOWER : (__txpower); \
+	})
+
+#define TXPOWER_TO_DEV(__txpower) \
+	({ \
+		((__txpower) < MIN_TXPOWER) ? MIN_TXPOWER : \
+		(((__txpower) > MAX_TXPOWER) ? MAX_TXPOWER : \
+		(__txpower)); \
+	})
+
+/*
  * IEEE stack callback functions declarations.
  */
 static int rt73usb_tx(struct net_device *net_dev,