aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-rx.c
diff options
context:
space:
mode:
authorDon Fry <donald.h.fry@intel.com>2011-07-08 11:46:29 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-07-11 15:02:10 -0400
commit5c3d29fc0d083e674c09407f1bc78e9dbf4ae8a5 (patch)
treeaacef653a991d96398cbbfce5524375b17dac611 /drivers/net/wireless/iwlwifi/iwl-rx.c
parent4e308119771573f949203f9f4732bcbfb9628279 (diff)
iwlagn: remove iwlagn_hcmd_utils structure and call directly
Not needed since the driver split. Move single use routines to calling location and keep static where possible. Signed-off-by: Don Fry <donald.h.fry@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-rx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rx.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
index 1690b49bb136..f3f3efe38ce2 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
@@ -902,6 +902,47 @@ static u32 iwl_translate_rx_status(struct iwl_priv *priv, u32 decrypt_in)
902 return decrypt_out; 902 return decrypt_out;
903} 903}
904 904
905/* Calc max signal level (dBm) among 3 possible receivers */
906static int iwlagn_calc_rssi(struct iwl_priv *priv,
907 struct iwl_rx_phy_res *rx_resp)
908{
909 /* data from PHY/DSP regarding signal strength, etc.,
910 * contents are always there, not configurable by host
911 */
912 struct iwlagn_non_cfg_phy *ncphy =
913 (struct iwlagn_non_cfg_phy *)rx_resp->non_cfg_phy_buf;
914 u32 val, rssi_a, rssi_b, rssi_c, max_rssi;
915 u8 agc;
916
917 val = le32_to_cpu(ncphy->non_cfg_phy[IWLAGN_RX_RES_AGC_IDX]);
918 agc = (val & IWLAGN_OFDM_AGC_MSK) >> IWLAGN_OFDM_AGC_BIT_POS;
919
920 /* Find max rssi among 3 possible receivers.
921 * These values are measured by the digital signal processor (DSP).
922 * They should stay fairly constant even as the signal strength varies,
923 * if the radio's automatic gain control (AGC) is working right.
924 * AGC value (see below) will provide the "interesting" info.
925 */
926 val = le32_to_cpu(ncphy->non_cfg_phy[IWLAGN_RX_RES_RSSI_AB_IDX]);
927 rssi_a = (val & IWLAGN_OFDM_RSSI_INBAND_A_BITMSK) >>
928 IWLAGN_OFDM_RSSI_A_BIT_POS;
929 rssi_b = (val & IWLAGN_OFDM_RSSI_INBAND_B_BITMSK) >>
930 IWLAGN_OFDM_RSSI_B_BIT_POS;
931 val = le32_to_cpu(ncphy->non_cfg_phy[IWLAGN_RX_RES_RSSI_C_IDX]);
932 rssi_c = (val & IWLAGN_OFDM_RSSI_INBAND_C_BITMSK) >>
933 IWLAGN_OFDM_RSSI_C_BIT_POS;
934
935 max_rssi = max_t(u32, rssi_a, rssi_b);
936 max_rssi = max_t(u32, max_rssi, rssi_c);
937
938 IWL_DEBUG_STATS(priv, "Rssi In A %d B %d C %d Max %d AGC dB %d\n",
939 rssi_a, rssi_b, rssi_c, max_rssi, agc);
940
941 /* dBm = max_rssi dB - agc dB - constant.
942 * Higher AGC (higher radio gain) means lower signal. */
943 return max_rssi - agc - IWLAGN_RSSI_OFFSET;
944}
945
905/* Called for REPLY_RX (legacy ABG frames), or 946/* Called for REPLY_RX (legacy ABG frames), or
906 * REPLY_RX_MPDU_CMD (HT high-throughput N frames). */ 947 * REPLY_RX_MPDU_CMD (HT high-throughput N frames). */
907static void iwl_rx_reply_rx(struct iwl_priv *priv, 948static void iwl_rx_reply_rx(struct iwl_priv *priv,
@@ -983,7 +1024,7 @@ static void iwl_rx_reply_rx(struct iwl_priv *priv,
983 priv->ucode_beacon_time = le32_to_cpu(phy_res->beacon_time_stamp); 1024 priv->ucode_beacon_time = le32_to_cpu(phy_res->beacon_time_stamp);
984 1025
985 /* Find max signal strength (dBm) among 3 antenna/receiver chains */ 1026 /* Find max signal strength (dBm) among 3 antenna/receiver chains */
986 rx_status.signal = priv->cfg->ops->utils->calc_rssi(priv, phy_res); 1027 rx_status.signal = iwlagn_calc_rssi(priv, phy_res);
987 1028
988 iwl_dbg_log_rx_data_frame(priv, len, header); 1029 iwl_dbg_log_rx_data_frame(priv, len, header);
989 IWL_DEBUG_STATS_LIMIT(priv, "Rssi %d, TSF %llu\n", 1030 IWL_DEBUG_STATS_LIMIT(priv, "Rssi %d, TSF %llu\n",