aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-commands.h42
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rx.c85
3 files changed, 31 insertions, 105 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 528bcab49d13..45656f25c82e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -1023,25 +1023,6 @@ struct iwl_wep_cmd {
1023 * 1023 *
1024 *****************************************************************************/ 1024 *****************************************************************************/
1025 1025
1026struct iwl4965_rx_frame_stats {
1027 u8 phy_count;
1028 u8 id;
1029 u8 rssi;
1030 u8 agc;
1031 __le16 sig_avg;
1032 __le16 noise_diff;
1033 u8 payload[0];
1034} __attribute__ ((packed));
1035
1036struct iwl4965_rx_frame_hdr {
1037 __le16 channel;
1038 __le16 phy_flags;
1039 u8 reserved1;
1040 u8 rate;
1041 __le16 len;
1042 u8 payload[0];
1043} __attribute__ ((packed));
1044
1045#define RX_RES_STATUS_NO_CRC32_ERROR cpu_to_le32(1 << 0) 1026#define RX_RES_STATUS_NO_CRC32_ERROR cpu_to_le32(1 << 0)
1046#define RX_RES_STATUS_NO_RXE_OVERFLOW cpu_to_le32(1 << 1) 1027#define RX_RES_STATUS_NO_RXE_OVERFLOW cpu_to_le32(1 << 1)
1047 1028
@@ -1072,26 +1053,6 @@ struct iwl4965_rx_frame_hdr {
1072#define RX_MPDU_RES_STATUS_TTAK_OK (1 << 7) 1053#define RX_MPDU_RES_STATUS_TTAK_OK (1 << 7)
1073#define RX_MPDU_RES_STATUS_DEC_DONE_MSK (0x800) 1054#define RX_MPDU_RES_STATUS_DEC_DONE_MSK (0x800)
1074 1055
1075struct iwl4965_rx_frame_end {
1076 __le32 status;
1077 __le64 timestamp;
1078 __le32 beacon_timestamp;
1079} __attribute__ ((packed));
1080
1081/*
1082 * REPLY_3945_RX = 0x1b (response only, not a command)
1083 *
1084 * NOTE: DO NOT dereference from casts to this structure
1085 * It is provided only for calculating minimum data set size.
1086 * The actual offsets of the hdr and end are dynamic based on
1087 * stats.phy_count
1088 */
1089struct iwl4965_rx_frame {
1090 struct iwl4965_rx_frame_stats stats;
1091 struct iwl4965_rx_frame_hdr hdr;
1092 struct iwl4965_rx_frame_end end;
1093} __attribute__ ((packed));
1094
1095/* Fixed (non-configurable) rx data from phy */ 1056/* Fixed (non-configurable) rx data from phy */
1096 1057
1097#define IWL49_RX_RES_PHY_CNT 14 1058#define IWL49_RX_RES_PHY_CNT 14
@@ -3049,7 +3010,6 @@ struct iwl_rx_packet {
3049 struct iwl_cmd_header hdr; 3010 struct iwl_cmd_header hdr;
3050 union { 3011 union {
3051 struct iwl_alive_resp alive_frame; 3012 struct iwl_alive_resp alive_frame;
3052 struct iwl4965_rx_frame rx_frame;
3053 struct iwl4965_tx_resp tx_resp; 3013 struct iwl4965_tx_resp tx_resp;
3054 struct iwl4965_spectrum_notification spectrum_notif; 3014 struct iwl4965_spectrum_notification spectrum_notif;
3055 struct iwl4965_csa_notification csa_notif; 3015 struct iwl4965_csa_notification csa_notif;
@@ -3068,8 +3028,6 @@ struct iwl_rx_packet {
3068 } u; 3028 } u;
3069} __attribute__ ((packed)); 3029} __attribute__ ((packed));
3070 3030
3071#define IWL_RX_FRAME_SIZE (4 + sizeof(struct iwl4965_rx_frame))
3072
3073int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon); 3031int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon);
3074 3032
3075#endif /* __iwl_commands_h__ */ 3033#endif /* __iwl_commands_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index a19fbb5eaae4..9d678d1d19df 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -553,15 +553,6 @@ struct iwl_hw_params {
553#define HT_SHORT_GI_40MHZ (1 << 1) 553#define HT_SHORT_GI_40MHZ (1 << 1)
554 554
555 555
556#define IWL_RX_HDR(x) ((struct iwl4965_rx_frame_hdr *)(\
557 x->u.rx_frame.stats.payload + \
558 x->u.rx_frame.stats.phy_count))
559#define IWL_RX_END(x) ((struct iwl4965_rx_frame_end *)(\
560 IWL_RX_HDR(x)->payload + \
561 le16_to_cpu(IWL_RX_HDR(x)->len)))
562#define IWL_RX_STATS(x) (&x->u.rx_frame.stats)
563#define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload)
564
565/****************************************************************************** 556/******************************************************************************
566 * 557 *
567 * Functions implemented in core module which are forward declared here 558 * Functions implemented in core module which are forward declared here
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
index 8d2b73e194da..6dd16c7b5d93 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
@@ -622,20 +622,24 @@ static int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm)
622 return sig_qual; 622 return sig_qual;
623} 623}
624 624
625#ifdef CONFIG_IWLWIFI_DEBUG 625/* Calc max signal level (dBm) among 3 possible receivers */
626static inline int iwl_calc_rssi(struct iwl_priv *priv,
627 struct iwl_rx_phy_res *rx_resp)
628{
629 return priv->cfg->ops->utils->calc_rssi(priv, rx_resp);
630}
626 631
632#ifdef CONFIG_IWLWIFI_DEBUG
627/** 633/**
628 * iwl_dbg_report_frame - dump frame to syslog during debug sessions 634 * iwl_dbg_report_frame - dump frame to syslog during debug sessions
629 * 635 *
630 * You may hack this function to show different aspects of received frames, 636 * You may hack this function to show different aspects of received frames,
631 * including selective frame dumps. 637 * including selective frame dumps.
632 * group100 parameter selects whether to show 1 out of 100 good frames. 638 * group100 parameter selects whether to show 1 out of 100 good data frames.
633 * 639 * All beacon and probe response frames are printed.
634 * TODO: This was originally written for 3945, need to audit for
635 * proper operation with 4965.
636 */ 640 */
637static void iwl_dbg_report_frame(struct iwl_priv *priv, 641static void iwl_dbg_report_frame(struct iwl_priv *priv,
638 struct iwl_rx_packet *pkt, 642 struct iwl_rx_phy_res *phy_res, u16 length,
639 struct ieee80211_hdr *header, int group100) 643 struct ieee80211_hdr *header, int group100)
640{ 644{
641 u32 to_us; 645 u32 to_us;
@@ -647,20 +651,9 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
647 u16 seq_ctl; 651 u16 seq_ctl;
648 u16 channel; 652 u16 channel;
649 u16 phy_flags; 653 u16 phy_flags;
650 int rate_sym; 654 u32 rate_n_flags;
651 u16 length;
652 u16 status;
653 u16 bcn_tmr;
654 u32 tsf_low; 655 u32 tsf_low;
655 u64 tsf; 656 int rssi;
656 u8 rssi;
657 u8 agc;
658 u16 sig_avg;
659 u16 noise_diff;
660 struct iwl4965_rx_frame_stats *rx_stats = IWL_RX_STATS(pkt);
661 struct iwl4965_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt);
662 struct iwl4965_rx_frame_end *rx_end = IWL_RX_END(pkt);
663 u8 *data = IWL_RX_DATA(pkt);
664 657
665 if (likely(!(priv->debug_level & IWL_DL_RX))) 658 if (likely(!(priv->debug_level & IWL_DL_RX)))
666 return; 659 return;
@@ -670,22 +663,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
670 seq_ctl = le16_to_cpu(header->seq_ctrl); 663 seq_ctl = le16_to_cpu(header->seq_ctrl);
671 664
672 /* metadata */ 665 /* metadata */
673 channel = le16_to_cpu(rx_hdr->channel); 666 channel = le16_to_cpu(phy_res->channel);
674 phy_flags = le16_to_cpu(rx_hdr->phy_flags); 667 phy_flags = le16_to_cpu(phy_res->phy_flags);
675 rate_sym = rx_hdr->rate; 668 rate_n_flags = le32_to_cpu(phy_res->rate_n_flags);
676 length = le16_to_cpu(rx_hdr->len);
677
678 /* end-of-frame status and timestamp */
679 status = le32_to_cpu(rx_end->status);
680 bcn_tmr = le32_to_cpu(rx_end->beacon_timestamp);
681 tsf_low = le64_to_cpu(rx_end->timestamp) & 0x0ffffffff;
682 tsf = le64_to_cpu(rx_end->timestamp);
683 669
684 /* signal statistics */ 670 /* signal statistics */
685 rssi = rx_stats->rssi; 671 rssi = iwl_calc_rssi(priv, phy_res);
686 agc = rx_stats->agc; 672 tsf_low = le64_to_cpu(phy_res->timestamp) & 0x0ffffffff;
687 sig_avg = le16_to_cpu(rx_stats->sig_avg);
688 noise_diff = le16_to_cpu(rx_stats->noise_diff);
689 673
690 to_us = !compare_ether_addr(header->addr1, priv->mac_addr); 674 to_us = !compare_ether_addr(header->addr1, priv->mac_addr);
691 675
@@ -739,11 +723,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
739 else 723 else
740 title = "Frame"; 724 title = "Frame";
741 725
742 rate_idx = iwl_hwrate_to_plcp_idx(rate_sym); 726 rate_idx = iwl_hwrate_to_plcp_idx(rate_n_flags);
743 if (unlikely(rate_idx == -1)) 727 if (unlikely((rate_idx < 0) || (rate_idx >= IWL_RATE_COUNT))) {
744 bitrate = 0; 728 bitrate = 0;
745 else 729 WARN_ON_ONCE(1);
730 } else {
746 bitrate = iwl_rates[rate_idx].ieee / 2; 731 bitrate = iwl_rates[rate_idx].ieee / 2;
732 }
747 733
748 /* print frame summary. 734 /* print frame summary.
749 * MAC addresses show just the last byte (for brevity), 735 * MAC addresses show just the last byte (for brevity),
@@ -755,23 +741,22 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
755 length, rssi, channel, bitrate); 741 length, rssi, channel, bitrate);
756 else { 742 else {
757 /* src/dst addresses assume managed mode */ 743 /* src/dst addresses assume managed mode */
758 IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, " 744 IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, src=0x%02x, "
759 "src=0x%02x, rssi=%u, tim=%lu usec, " 745 "len=%u, rssi=%d, tim=%lu usec, "
760 "phy=0x%02x, chnl=%d\n", 746 "phy=0x%02x, chnl=%d\n",
761 title, le16_to_cpu(fc), header->addr1[5], 747 title, le16_to_cpu(fc), header->addr1[5],
762 header->addr3[5], rssi, 748 header->addr3[5], length, rssi,
763 tsf_low - priv->scan_start_tsf, 749 tsf_low - priv->scan_start_tsf,
764 phy_flags, channel); 750 phy_flags, channel);
765 } 751 }
766 } 752 }
767 if (print_dump) 753 if (print_dump)
768 iwl_print_hex_dump(priv, IWL_DL_RX, data, length); 754 iwl_print_hex_dump(priv, IWL_DL_RX, header, length);
769} 755}
770#else 756#else
771static inline void iwl_dbg_report_frame(struct iwl_priv *priv, 757static void iwl_dbg_report_frame(struct iwl_priv *priv,
772 struct iwl_rx_packet *pkt, 758 struct iwl_rx_phy_res *phy_res, u16 length,
773 struct ieee80211_hdr *header, 759 struct ieee80211_hdr *header, int group100)
774 int group100)
775{ 760{
776} 761}
777#endif 762#endif
@@ -966,14 +951,6 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv,
966 rxb->skb = NULL; 951 rxb->skb = NULL;
967} 952}
968 953
969/* Calc max signal level (dBm) among 3 possible receivers */
970static inline int iwl_calc_rssi(struct iwl_priv *priv,
971 struct iwl_rx_phy_res *rx_resp)
972{
973 return priv->cfg->ops->utils->calc_rssi(priv, rx_resp);
974}
975
976
977/* This is necessary only for a number of statistics, see the caller. */ 954/* This is necessary only for a number of statistics, see the caller. */
978static int iwl_is_network_packet(struct iwl_priv *priv, 955static int iwl_is_network_packet(struct iwl_priv *priv,
979 struct ieee80211_hdr *header) 956 struct ieee80211_hdr *header)
@@ -1096,8 +1073,8 @@ void iwl_rx_reply_rx(struct iwl_priv *priv,
1096 priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE; 1073 priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE;
1097 1074
1098 /* Set "1" to report good data frames in groups of 100 */ 1075 /* Set "1" to report good data frames in groups of 100 */
1099 /* FIXME: need to optimize the call: */ 1076 if (unlikely(priv->debug_level & IWL_DL_RX))
1100 iwl_dbg_report_frame(priv, pkt, header, 1); 1077 iwl_dbg_report_frame(priv, rx_start, len, header, 1);
1101 1078
1102 IWL_DEBUG_STATS_LIMIT("Rssi %d, noise %d, qual %d, TSF %llu\n", 1079 IWL_DEBUG_STATS_LIMIT("Rssi %d, noise %d, qual %d, TSF %llu\n",
1103 rx_status.signal, rx_status.noise, rx_status.signal, 1080 rx_status.signal, rx_status.noise, rx_status.signal,