* [PATCH 5/32] rt2x00: Optimize RATE flag handling
@ 2006-04-27 22:02 Ivo van Doorn
0 siblings, 0 replies; only message in thread
From: Ivo van Doorn @ 2006-04-27 22:02 UTC (permalink / raw)
To: netdev; +Cc: rt2x00-devel
[-- Attachment #1: Type: text/plain, Size: 8531 bytes --]
From: Ivo van Doorn <IvDoorn@gmail.com>
Optimize RATE flags by using the FIELD32() macro's,
also make the unit in which the rate is handled the
same as is used in the dscape stack.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-04-27 21:38:23.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-04-27 21:39:24.000000000 +0200
@@ -550,7 +550,7 @@ rt2400pci_config_duration(struct rt2x00_
rt2x00_register_read(rt2x00pci, CSR19, ®);
value = SIFS + (2 * short_slot_time);
rt2x00_set_field32(®, CSR19_DIFS, value);
- value = SIFS + get_duration(IEEE80211_HEADER + ACK_SIZE, 2);
+ value = SIFS + get_duration(IEEE80211_HEADER + ACK_SIZE, 10);
rt2x00_set_field32(®, CSR19_EIFS, value);
rt2x00_register_write(rt2x00pci, CSR19, reg);
@@ -580,11 +580,11 @@ rt2400pci_config_rate(struct rt2x00_pci
value = SIFS + PLCP
+ (2 * (conf->short_slot_time ? SHORT_SLOT_TIME : SLOT_TIME))
+ preamble
- + get_duration(ACK_SIZE, 2);
+ + get_duration(ACK_SIZE, 10);
rt2x00_set_field32(®[0], TXCSR1_ACK_TIMEOUT, value);
value = SIFS + PLCP
+ preamble
- + get_duration(ACK_SIZE, 2);
+ + get_duration(ACK_SIZE, 10);
rt2x00_set_field32(®[0], TXCSR1_ACK_CONSUME_TIME, value);
rt2x00_register_write(rt2x00pci, TXCSR1, reg[0]);
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-04-27 21:38:23.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-04-27 21:39:24.000000000 +0200
@@ -565,7 +565,7 @@ rt2500pci_config_duration(struct rt2x00_
rt2x00_register_read(rt2x00pci, CSR19, ®);
value = SIFS + (2 * short_slot_time);
rt2x00_set_field32(®, CSR19_DIFS, value);
- value = SIFS + get_duration(IEEE80211_HEADER + ACK_SIZE, 2);
+ value = SIFS + get_duration(IEEE80211_HEADER + ACK_SIZE, 10);
rt2x00_set_field32(®, CSR19_EIFS, value);
rt2x00_register_write(rt2x00pci, CSR19, reg);
@@ -595,11 +595,11 @@ rt2500pci_config_rate(struct rt2x00_pci
value = SIFS + PLCP
+ (2 * (conf->short_slot_time ? SHORT_SLOT_TIME : SLOT_TIME))
+ preamble
- + get_duration(ACK_SIZE, 2);
+ + get_duration(ACK_SIZE, 10);
rt2x00_set_field32(®[0], TXCSR1_ACK_TIMEOUT, value);
value = SIFS + PLCP
+ preamble
- + get_duration(ACK_SIZE, 2);
+ + get_duration(ACK_SIZE, 10);
rt2x00_set_field32(®[0], TXCSR1_ACK_CONSUME_TIME, value);
rt2x00_register_write(rt2x00pci, TXCSR1, reg[0]);
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-04-27 21:38:23.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-04-27 21:39:24.000000000 +0200
@@ -467,7 +467,7 @@ rt2500usb_config_rate(struct rt2x00_usb
value = SIFS + PLCP
+ (2 * (conf->short_slot_time ? SHORT_SLOT_TIME : SLOT_TIME))
+ preamble
- + get_duration(ACK_SIZE, 2);
+ + get_duration(ACK_SIZE, 10);
rt2x00_set_field16_nb(®, TXRX_CSR1_ACK_TIMEOUT, value);
rt2x00_register_write(rt2x00usb, TXRX_CSR1, reg);
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2x00.h wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2x00.h
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-04-27 21:36:19.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-04-27 21:39:24.000000000 +0200
@@ -609,71 +609,69 @@ struct scanning{
* passed to the ieee80211 kernel. We need to make it a consist of
* multiple fields because we want to store more then 1 device specific
* values inside the value.
- * 1 - rate, stored as 0.5Mbit/s.
- * 2 - MASK_RATE, which rates are enabled in this mode, this mask
+ * 1 - rate, stored as 100 kbit/s.
+ * 2 - preamble, short_preamble enabled flag.
+ * 3 - MASK_RATE, which rates are enabled in this mode, this mask
* corresponds with the TX register format for the current device.
- * 3 - plcp, 802.11b rates are device specific,
+ * 4 - plcp, 802.11b rates are device specific,
* 802.11g rates are set according to the ieee802.11a-1999 p.14.
- * 4 - preamble, short_preamble enabled flag.
* The bit to enable preamble is set in a seperate define.
*/
-#define OFFSET_RATE 0
-#define MASK_RATE 0x000000ff
-#define OFFSET_RATEMASK 8
-#define MASK_RATEMASK 0x00000fff
-#define OFFSET_PLCP 20
-#define MASK_PLCP 0x000000ff
-#define OFFSET_PREAMBLE 28
-#define MASK_PREAMBLE 0x000000ff
+#define DEV_RATE FIELD32(0x000007ff)
+#define DEV_PREAMBLE FIELD32(0x00000800)
+#define DEV_RATEMASK FIELD32(0x00fff000)
+#define DEV_PLCP FIELD32(0xff000000)
/*
- * Macro to set or get a field in the device
- * specific value.
+ * Macro's for creating the device specific rate value.
*/
#define DEVICE_RATE_VALUE(__rate, __mask, __plcp) \
- (int)( (__rate) << OFFSET_RATE \
- | (__mask) << OFFSET_RATEMASK \
- | (__plcp) << OFFSET_PLCP )
+ (int) ((((__rate) << DEV_RATE.bit_offset) & DEV_RATE.bit_mask) \
+ | (((__mask) << DEV_RATEMASK.bit_offset) & DEV_RATEMASK.bit_mask) \
+ | (((__plcp) << DEV_PLCP.bit_offset) & DEV_PLCP.bit_mask) )
#define DEVICE_RATE_PREAMBLE(__value) \
- (int)( (__value) | 1 << OFFSET_PREAMBLE )
+ (int)( (__value) | (1 << DEV_PREAMBLE.bit_offset) )
+/*
+ * Macro for reading the device specific rate value.
+ */
#define DEVICE_RATE_FIELD(__value, __mask) \
- (int)( ((__value) >> OFFSET_##__mask) & MASK_##__mask )
+ (int)( ((__value) & DEV_##__mask.bit_mask) >> DEV_##__mask.bit_offset)
-#define DEVICE_RATE_1MB DEVICE_RATE_VALUE(2, 0x001, 0x00)
-#define DEVICE_RATE_2MB DEVICE_RATE_VALUE(4, 0x003, 0x01)
+#define DEVICE_RATE_1MB DEVICE_RATE_VALUE(10, 0x001, 0x00)
+#define DEVICE_RATE_2MB DEVICE_RATE_VALUE(20, 0x003, 0x01)
#define DEVICE_RATE_2MB_PREAMBLE DEVICE_RATE_PREAMBLE(DEVICE_RATE_2MB)
-#define DEVICE_RATE_55MB DEVICE_RATE_VALUE(11, 0x007, 0x02)
+#define DEVICE_RATE_55MB DEVICE_RATE_VALUE(55, 0x007, 0x02)
#define DEVICE_RATE_55MB_PREAMBLE DEVICE_RATE_PREAMBLE(DEVICE_RATE_55MB)
-#define DEVICE_RATE_11MB DEVICE_RATE_VALUE(22, 0x00f, 0x03)
+#define DEVICE_RATE_11MB DEVICE_RATE_VALUE(110, 0x00f, 0x03)
#define DEVICE_RATE_11MB_PREAMBLE DEVICE_RATE_PREAMBLE(DEVICE_RATE_11MB)
-#define DEVICE_RATE_6MB DEVICE_RATE_VALUE(12, 0x01f, 0x0b)
-#define DEVICE_RATE_9MB DEVICE_RATE_VALUE(18, 0x03f, 0x0f)
-#define DEVICE_RATE_12MB DEVICE_RATE_VALUE(24, 0x07f, 0x0a)
-#define DEVICE_RATE_18MB DEVICE_RATE_VALUE(36, 0x0ff, 0x0e)
-#define DEVICE_RATE_24MB DEVICE_RATE_VALUE(48, 0x1ff, 0x09)
-#define DEVICE_RATE_36MB DEVICE_RATE_VALUE(72, 0x3ff, 0x0d)
-#define DEVICE_RATE_48MB DEVICE_RATE_VALUE(96, 0x7ff, 0x08)
-#define DEVICE_RATE_54MB DEVICE_RATE_VALUE(108, 0xfff, 0x0c)
+#define DEVICE_RATE_6MB DEVICE_RATE_VALUE(60, 0x01f, 0x0b)
+#define DEVICE_RATE_9MB DEVICE_RATE_VALUE(90, 0x03f, 0x0f)
+#define DEVICE_RATE_12MB DEVICE_RATE_VALUE(120, 0x07f, 0x0a)
+#define DEVICE_RATE_18MB DEVICE_RATE_VALUE(180, 0x0ff, 0x0e)
+#define DEVICE_RATE_24MB DEVICE_RATE_VALUE(240, 0x1ff, 0x09)
+#define DEVICE_RATE_36MB DEVICE_RATE_VALUE(360, 0x3ff, 0x0d)
+#define DEVICE_RATE_48MB DEVICE_RATE_VALUE(480, 0x7ff, 0x08)
+#define DEVICE_RATE_54MB DEVICE_RATE_VALUE(540, 0xfff, 0x0c)
/*
* Duration calculations
- * The rate variable passed is: 0.5MBs.
+ * The rate variable passed is: 100kbs.
* To convert from bytes to bits we multiply size with 8,
- * then the size is multiplied with 2 to make the
+ * then the size is multiplied with 10 to make the
* real rate -> rate argument correction.
*/
static inline u16
get_duration(const unsigned int size, const u8 rate)
{
- return ((size * 8 * 2) / rate);
+ return ((size * 8 * 10) / rate);
}
static inline u16
get_duration_res(const unsigned int size, const u8 rate)
{
- return ((size * 8 * 2) % rate);
+ return ((size * 8 * 10) % rate);
}
#define ACK_SIZE 14
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2006-04-27 22:01 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-27 22:02 [PATCH 5/32] rt2x00: Optimize RATE flag handling Ivo van Doorn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).