diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 57 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800usb.c | 2 |
5 files changed, 55 insertions, 10 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h index 3cda22931876..edd3734b8b32 100644 --- a/drivers/net/wireless/rt2x00/rt2800.h +++ b/drivers/net/wireless/rt2x00/rt2800.h | |||
@@ -74,7 +74,7 @@ | |||
74 | * Signal information. | 74 | * Signal information. |
75 | * Default offset is required for RSSI <-> dBm conversion. | 75 | * Default offset is required for RSSI <-> dBm conversion. |
76 | */ | 76 | */ |
77 | #define DEFAULT_RSSI_OFFSET 120 /* FIXME */ | 77 | #define DEFAULT_RSSI_OFFSET 120 |
78 | 78 | ||
79 | /* | 79 | /* |
80 | * Register layout information. | 80 | * Register layout information. |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 9030eef2403d..255d089e87ea 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -325,9 +325,53 @@ void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc) | |||
325 | } | 325 | } |
326 | EXPORT_SYMBOL_GPL(rt2800_write_txwi); | 326 | EXPORT_SYMBOL_GPL(rt2800_write_txwi); |
327 | 327 | ||
328 | void rt2800_process_rxwi(struct sk_buff *skb, struct rxdone_entry_desc *rxdesc) | 328 | static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxwi_w2) |
329 | { | 329 | { |
330 | __le32 *rxwi = (__le32 *) skb->data; | 330 | int rssi0 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI0); |
331 | int rssi1 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI1); | ||
332 | int rssi2 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI2); | ||
333 | u16 eeprom; | ||
334 | u8 offset0; | ||
335 | u8 offset1; | ||
336 | u8 offset2; | ||
337 | |||
338 | if (rt2x00dev->rx_status.band == IEEE80211_BAND_2GHZ) { | ||
339 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG, &eeprom); | ||
340 | offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET0); | ||
341 | offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET1); | ||
342 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom); | ||
343 | offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_OFFSET2); | ||
344 | } else { | ||
345 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &eeprom); | ||
346 | offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET0); | ||
347 | offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET1); | ||
348 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom); | ||
349 | offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_OFFSET2); | ||
350 | } | ||
351 | |||
352 | /* | ||
353 | * Convert the value from the descriptor into the RSSI value | ||
354 | * If the value in the descriptor is 0, it is considered invalid | ||
355 | * and the default (extremely low) rssi value is assumed | ||
356 | */ | ||
357 | rssi0 = (rssi0) ? (-12 - offset0 - rt2x00dev->lna_gain - rssi0) : -128; | ||
358 | rssi1 = (rssi1) ? (-12 - offset1 - rt2x00dev->lna_gain - rssi1) : -128; | ||
359 | rssi2 = (rssi2) ? (-12 - offset2 - rt2x00dev->lna_gain - rssi2) : -128; | ||
360 | |||
361 | /* | ||
362 | * mac80211 only accepts a single RSSI value. Calculating the | ||
363 | * average doesn't deliver a fair answer either since -60:-60 would | ||
364 | * be considered equally good as -50:-70 while the second is the one | ||
365 | * which gives less energy... | ||
366 | */ | ||
367 | rssi0 = max(rssi0, rssi1); | ||
368 | return max(rssi0, rssi2); | ||
369 | } | ||
370 | |||
371 | void rt2800_process_rxwi(struct queue_entry *entry, | ||
372 | struct rxdone_entry_desc *rxdesc) | ||
373 | { | ||
374 | __le32 *rxwi = (__le32 *) entry->skb->data; | ||
331 | u32 word; | 375 | u32 word; |
332 | 376 | ||
333 | rt2x00_desc_read(rxwi, 0, &word); | 377 | rt2x00_desc_read(rxwi, 0, &word); |
@@ -358,14 +402,15 @@ void rt2800_process_rxwi(struct sk_buff *skb, struct rxdone_entry_desc *rxdesc) | |||
358 | 402 | ||
359 | rt2x00_desc_read(rxwi, 2, &word); | 403 | rt2x00_desc_read(rxwi, 2, &word); |
360 | 404 | ||
361 | rxdesc->rssi = | 405 | /* |
362 | (rt2x00_get_field32(word, RXWI_W2_RSSI0) + | 406 | * Convert descriptor AGC value to RSSI value. |
363 | rt2x00_get_field32(word, RXWI_W2_RSSI1)) / 2; | 407 | */ |
408 | rxdesc->rssi = rt2800_agc_to_rssi(entry->queue->rt2x00dev, word); | ||
364 | 409 | ||
365 | /* | 410 | /* |
366 | * Remove RXWI descriptor from start of buffer. | 411 | * Remove RXWI descriptor from start of buffer. |
367 | */ | 412 | */ |
368 | skb_pull(skb, RXWI_DESC_SIZE); | 413 | skb_pull(entry->skb, RXWI_DESC_SIZE); |
369 | } | 414 | } |
370 | EXPORT_SYMBOL_GPL(rt2800_process_rxwi); | 415 | EXPORT_SYMBOL_GPL(rt2800_process_rxwi); |
371 | 416 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h index 8313dbf441a5..eb3a4f50a363 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/rt2x00/rt2800lib.h | |||
@@ -121,7 +121,7 @@ void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, | |||
121 | const u8 arg0, const u8 arg1); | 121 | const u8 arg0, const u8 arg1); |
122 | 122 | ||
123 | void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc); | 123 | void rt2800_write_txwi(__le32 *txwi, struct txentry_desc *txdesc); |
124 | void rt2800_process_rxwi(struct sk_buff *skb, struct rxdone_entry_desc *txdesc); | 124 | void rt2800_process_rxwi(struct queue_entry *entry, struct rxdone_entry_desc *txdesc); |
125 | 125 | ||
126 | void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc); | 126 | void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc); |
127 | 127 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 6f11760117da..faf71e2aeb64 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -805,7 +805,7 @@ static void rt2800pci_fill_rxdone(struct queue_entry *entry, | |||
805 | /* | 805 | /* |
806 | * Process the RXWI structure that is at the start of the buffer. | 806 | * Process the RXWI structure that is at the start of the buffer. |
807 | */ | 807 | */ |
808 | rt2800_process_rxwi(entry->skb, rxdesc); | 808 | rt2800_process_rxwi(entry, rxdesc); |
809 | 809 | ||
810 | /* | 810 | /* |
811 | * Set RX IDX in register to inform hardware that we have handled | 811 | * Set RX IDX in register to inform hardware that we have handled |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 4f85f7b42441..f2cd37e5aea8 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -563,7 +563,7 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry, | |||
563 | /* | 563 | /* |
564 | * Process the RXWI structure. | 564 | * Process the RXWI structure. |
565 | */ | 565 | */ |
566 | rt2800_process_rxwi(entry->skb, rxdesc); | 566 | rt2800_process_rxwi(entry, rxdesc); |
567 | } | 567 | } |
568 | 568 | ||
569 | /* | 569 | /* |