diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-rx.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-rx.c | 56 |
1 files changed, 4 insertions, 52 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 6090bc15a6d5..6f36b6e79f5e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
| @@ -345,10 +345,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
| 345 | pci_unmap_page(priv->pci_dev, rxq->pool[i].page_dma, | 345 | pci_unmap_page(priv->pci_dev, rxq->pool[i].page_dma, |
| 346 | PAGE_SIZE << priv->hw_params.rx_page_order, | 346 | PAGE_SIZE << priv->hw_params.rx_page_order, |
| 347 | PCI_DMA_FROMDEVICE); | 347 | PCI_DMA_FROMDEVICE); |
| 348 | __free_pages(rxq->pool[i].page, | 348 | __iwl_free_pages(priv, rxq->pool[i].page); |
| 349 | priv->hw_params.rx_page_order); | ||
| 350 | rxq->pool[i].page = NULL; | 349 | rxq->pool[i].page = NULL; |
| 351 | priv->alloc_rxb_page--; | ||
| 352 | } | 350 | } |
| 353 | } | 351 | } |
| 354 | 352 | ||
| @@ -416,9 +414,7 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
| 416 | pci_unmap_page(priv->pci_dev, rxq->pool[i].page_dma, | 414 | pci_unmap_page(priv->pci_dev, rxq->pool[i].page_dma, |
| 417 | PAGE_SIZE << priv->hw_params.rx_page_order, | 415 | PAGE_SIZE << priv->hw_params.rx_page_order, |
| 418 | PCI_DMA_FROMDEVICE); | 416 | PCI_DMA_FROMDEVICE); |
| 419 | priv->alloc_rxb_page--; | 417 | __iwl_free_pages(priv, rxq->pool[i].page); |
| 420 | __free_pages(rxq->pool[i].page, | ||
| 421 | priv->hw_params.rx_page_order); | ||
| 422 | rxq->pool[i].page = NULL; | 418 | rxq->pool[i].page = NULL; |
| 423 | } | 419 | } |
| 424 | list_add_tail(&rxq->pool[i].list, &rxq->rx_used); | 420 | list_add_tail(&rxq->pool[i].list, &rxq->rx_used); |
| @@ -654,47 +650,6 @@ void iwl_reply_statistics(struct iwl_priv *priv, | |||
| 654 | } | 650 | } |
| 655 | EXPORT_SYMBOL(iwl_reply_statistics); | 651 | EXPORT_SYMBOL(iwl_reply_statistics); |
| 656 | 652 | ||
| 657 | #define PERFECT_RSSI (-20) /* dBm */ | ||
| 658 | #define WORST_RSSI (-95) /* dBm */ | ||
| 659 | #define RSSI_RANGE (PERFECT_RSSI - WORST_RSSI) | ||
| 660 | |||
| 661 | /* Calculate an indication of rx signal quality (a percentage, not dBm!). | ||
| 662 | * See http://www.ces.clemson.edu/linux/signal_quality.shtml for info | ||
| 663 | * about formulas used below. */ | ||
| 664 | static int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm) | ||
| 665 | { | ||
| 666 | int sig_qual; | ||
| 667 | int degradation = PERFECT_RSSI - rssi_dbm; | ||
| 668 | |||
| 669 | /* If we get a noise measurement, use signal-to-noise ratio (SNR) | ||
| 670 | * as indicator; formula is (signal dbm - noise dbm). | ||
| 671 | * SNR at or above 40 is a great signal (100%). | ||
| 672 | * Below that, scale to fit SNR of 0 - 40 dB within 0 - 100% indicator. | ||
| 673 | * Weakest usable signal is usually 10 - 15 dB SNR. */ | ||
| 674 | if (noise_dbm) { | ||
| 675 | if (rssi_dbm - noise_dbm >= 40) | ||
| 676 | return 100; | ||
| 677 | else if (rssi_dbm < noise_dbm) | ||
| 678 | return 0; | ||
| 679 | sig_qual = ((rssi_dbm - noise_dbm) * 5) / 2; | ||
| 680 | |||
| 681 | /* Else use just the signal level. | ||
| 682 | * This formula is a least squares fit of data points collected and | ||
| 683 | * compared with a reference system that had a percentage (%) display | ||
| 684 | * for signal quality. */ | ||
| 685 | } else | ||
| 686 | sig_qual = (100 * (RSSI_RANGE * RSSI_RANGE) - degradation * | ||
| 687 | (15 * RSSI_RANGE + 62 * degradation)) / | ||
| 688 | (RSSI_RANGE * RSSI_RANGE); | ||
| 689 | |||
| 690 | if (sig_qual > 100) | ||
| 691 | sig_qual = 100; | ||
| 692 | else if (sig_qual < 1) | ||
| 693 | sig_qual = 0; | ||
| 694 | |||
| 695 | return sig_qual; | ||
| 696 | } | ||
| 697 | |||
| 698 | /* Calc max signal level (dBm) among 3 possible receivers */ | 653 | /* Calc max signal level (dBm) among 3 possible receivers */ |
| 699 | static inline int iwl_calc_rssi(struct iwl_priv *priv, | 654 | static inline int iwl_calc_rssi(struct iwl_priv *priv, |
| 700 | struct iwl_rx_phy_res *rx_resp) | 655 | struct iwl_rx_phy_res *rx_resp) |
| @@ -1105,11 +1060,8 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
| 1105 | if (iwl_is_associated(priv) && | 1060 | if (iwl_is_associated(priv) && |
| 1106 | !test_bit(STATUS_SCANNING, &priv->status)) { | 1061 | !test_bit(STATUS_SCANNING, &priv->status)) { |
| 1107 | rx_status.noise = priv->last_rx_noise; | 1062 | rx_status.noise = priv->last_rx_noise; |
| 1108 | rx_status.qual = iwl_calc_sig_qual(rx_status.signal, | ||
| 1109 | rx_status.noise); | ||
| 1110 | } else { | 1063 | } else { |
| 1111 | rx_status.noise = IWL_NOISE_MEAS_NOT_AVAILABLE; | 1064 | rx_status.noise = IWL_NOISE_MEAS_NOT_AVAILABLE; |
| 1112 | rx_status.qual = iwl_calc_sig_qual(rx_status.signal, 0); | ||
| 1113 | } | 1065 | } |
| 1114 | 1066 | ||
| 1115 | /* Reset beacon noise level if not associated. */ | 1067 | /* Reset beacon noise level if not associated. */ |
| @@ -1122,8 +1074,8 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
| 1122 | iwl_dbg_report_frame(priv, phy_res, len, header, 1); | 1074 | iwl_dbg_report_frame(priv, phy_res, len, header, 1); |
| 1123 | #endif | 1075 | #endif |
| 1124 | iwl_dbg_log_rx_data_frame(priv, len, header); | 1076 | iwl_dbg_log_rx_data_frame(priv, len, header); |
| 1125 | IWL_DEBUG_STATS_LIMIT(priv, "Rssi %d, noise %d, qual %d, TSF %llu\n", | 1077 | IWL_DEBUG_STATS_LIMIT(priv, "Rssi %d, noise %d, TSF %llu\n", |
| 1126 | rx_status.signal, rx_status.noise, rx_status.qual, | 1078 | rx_status.signal, rx_status.noise, |
| 1127 | (unsigned long long)rx_status.mactime); | 1079 | (unsigned long long)rx_status.mactime); |
| 1128 | 1080 | ||
| 1129 | /* | 1081 | /* |
