aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHalperin, Daniel C <daniel.c.halperin@intel.com>2008-12-05 10:58:36 -0500
committerJohn W. Linville <linville@tuxdriver.com>2008-12-12 13:48:20 -0500
commit00e540b3768c96a5e2a9d5d39524fef98b2cd981 (patch)
tree73de7a7ad96fe0755c3c1327d741178ae45faeb3
parent447107fb32d75425c95a33f58e6b4b760b470092 (diff)
iwlwifi: implement iwl_debug_report_frame for iwlagn
The old version of this code was copied from 3945 and never updated. This patch cleans up structs that do not apply and accounts for other changes from 3945->iwlagn (e.g., PHY info can come in a separate cmd response from the ucode.) Signed-off-by: Daniel Halperin <daniel.c.halperin@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-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,