提交 00e540b3 编写于 作者: H Halperin, Daniel C 提交者: John W. Linville

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: NDaniel Halperin <daniel.c.halperin@intel.com>
Signed-off-by: NReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 447107fb
...@@ -1023,25 +1023,6 @@ struct iwl_wep_cmd { ...@@ -1023,25 +1023,6 @@ struct iwl_wep_cmd {
* *
*****************************************************************************/ *****************************************************************************/
struct iwl4965_rx_frame_stats {
u8 phy_count;
u8 id;
u8 rssi;
u8 agc;
__le16 sig_avg;
__le16 noise_diff;
u8 payload[0];
} __attribute__ ((packed));
struct iwl4965_rx_frame_hdr {
__le16 channel;
__le16 phy_flags;
u8 reserved1;
u8 rate;
__le16 len;
u8 payload[0];
} __attribute__ ((packed));
#define RX_RES_STATUS_NO_CRC32_ERROR cpu_to_le32(1 << 0) #define RX_RES_STATUS_NO_CRC32_ERROR cpu_to_le32(1 << 0)
#define RX_RES_STATUS_NO_RXE_OVERFLOW cpu_to_le32(1 << 1) #define RX_RES_STATUS_NO_RXE_OVERFLOW cpu_to_le32(1 << 1)
...@@ -1072,26 +1053,6 @@ struct iwl4965_rx_frame_hdr { ...@@ -1072,26 +1053,6 @@ struct iwl4965_rx_frame_hdr {
#define RX_MPDU_RES_STATUS_TTAK_OK (1 << 7) #define RX_MPDU_RES_STATUS_TTAK_OK (1 << 7)
#define RX_MPDU_RES_STATUS_DEC_DONE_MSK (0x800) #define RX_MPDU_RES_STATUS_DEC_DONE_MSK (0x800)
struct iwl4965_rx_frame_end {
__le32 status;
__le64 timestamp;
__le32 beacon_timestamp;
} __attribute__ ((packed));
/*
* REPLY_3945_RX = 0x1b (response only, not a command)
*
* NOTE: DO NOT dereference from casts to this structure
* It is provided only for calculating minimum data set size.
* The actual offsets of the hdr and end are dynamic based on
* stats.phy_count
*/
struct iwl4965_rx_frame {
struct iwl4965_rx_frame_stats stats;
struct iwl4965_rx_frame_hdr hdr;
struct iwl4965_rx_frame_end end;
} __attribute__ ((packed));
/* Fixed (non-configurable) rx data from phy */ /* Fixed (non-configurable) rx data from phy */
#define IWL49_RX_RES_PHY_CNT 14 #define IWL49_RX_RES_PHY_CNT 14
...@@ -3049,7 +3010,6 @@ struct iwl_rx_packet { ...@@ -3049,7 +3010,6 @@ struct iwl_rx_packet {
struct iwl_cmd_header hdr; struct iwl_cmd_header hdr;
union { union {
struct iwl_alive_resp alive_frame; struct iwl_alive_resp alive_frame;
struct iwl4965_rx_frame rx_frame;
struct iwl4965_tx_resp tx_resp; struct iwl4965_tx_resp tx_resp;
struct iwl4965_spectrum_notification spectrum_notif; struct iwl4965_spectrum_notification spectrum_notif;
struct iwl4965_csa_notification csa_notif; struct iwl4965_csa_notification csa_notif;
...@@ -3068,8 +3028,6 @@ struct iwl_rx_packet { ...@@ -3068,8 +3028,6 @@ struct iwl_rx_packet {
} u; } u;
} __attribute__ ((packed)); } __attribute__ ((packed));
#define IWL_RX_FRAME_SIZE (4 + sizeof(struct iwl4965_rx_frame))
int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon); int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon);
#endif /* __iwl_commands_h__ */ #endif /* __iwl_commands_h__ */
...@@ -553,15 +553,6 @@ struct iwl_hw_params { ...@@ -553,15 +553,6 @@ struct iwl_hw_params {
#define HT_SHORT_GI_40MHZ (1 << 1) #define HT_SHORT_GI_40MHZ (1 << 1)
#define IWL_RX_HDR(x) ((struct iwl4965_rx_frame_hdr *)(\
x->u.rx_frame.stats.payload + \
x->u.rx_frame.stats.phy_count))
#define IWL_RX_END(x) ((struct iwl4965_rx_frame_end *)(\
IWL_RX_HDR(x)->payload + \
le16_to_cpu(IWL_RX_HDR(x)->len)))
#define IWL_RX_STATS(x) (&x->u.rx_frame.stats)
#define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload)
/****************************************************************************** /******************************************************************************
* *
* Functions implemented in core module which are forward declared here * Functions implemented in core module which are forward declared here
......
...@@ -622,20 +622,24 @@ static int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm) ...@@ -622,20 +622,24 @@ static int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm)
return sig_qual; return sig_qual;
} }
#ifdef CONFIG_IWLWIFI_DEBUG /* Calc max signal level (dBm) among 3 possible receivers */
static inline int iwl_calc_rssi(struct iwl_priv *priv,
struct iwl_rx_phy_res *rx_resp)
{
return priv->cfg->ops->utils->calc_rssi(priv, rx_resp);
}
#ifdef CONFIG_IWLWIFI_DEBUG
/** /**
* iwl_dbg_report_frame - dump frame to syslog during debug sessions * iwl_dbg_report_frame - dump frame to syslog during debug sessions
* *
* You may hack this function to show different aspects of received frames, * You may hack this function to show different aspects of received frames,
* including selective frame dumps. * including selective frame dumps.
* group100 parameter selects whether to show 1 out of 100 good frames. * group100 parameter selects whether to show 1 out of 100 good data frames.
* * All beacon and probe response frames are printed.
* TODO: This was originally written for 3945, need to audit for
* proper operation with 4965.
*/ */
static void iwl_dbg_report_frame(struct iwl_priv *priv, static void iwl_dbg_report_frame(struct iwl_priv *priv,
struct iwl_rx_packet *pkt, struct iwl_rx_phy_res *phy_res, u16 length,
struct ieee80211_hdr *header, int group100) struct ieee80211_hdr *header, int group100)
{ {
u32 to_us; u32 to_us;
...@@ -647,20 +651,9 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, ...@@ -647,20 +651,9 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
u16 seq_ctl; u16 seq_ctl;
u16 channel; u16 channel;
u16 phy_flags; u16 phy_flags;
int rate_sym; u32 rate_n_flags;
u16 length;
u16 status;
u16 bcn_tmr;
u32 tsf_low; u32 tsf_low;
u64 tsf; int rssi;
u8 rssi;
u8 agc;
u16 sig_avg;
u16 noise_diff;
struct iwl4965_rx_frame_stats *rx_stats = IWL_RX_STATS(pkt);
struct iwl4965_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt);
struct iwl4965_rx_frame_end *rx_end = IWL_RX_END(pkt);
u8 *data = IWL_RX_DATA(pkt);
if (likely(!(priv->debug_level & IWL_DL_RX))) if (likely(!(priv->debug_level & IWL_DL_RX)))
return; return;
...@@ -670,22 +663,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, ...@@ -670,22 +663,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
seq_ctl = le16_to_cpu(header->seq_ctrl); seq_ctl = le16_to_cpu(header->seq_ctrl);
/* metadata */ /* metadata */
channel = le16_to_cpu(rx_hdr->channel); channel = le16_to_cpu(phy_res->channel);
phy_flags = le16_to_cpu(rx_hdr->phy_flags); phy_flags = le16_to_cpu(phy_res->phy_flags);
rate_sym = rx_hdr->rate; rate_n_flags = le32_to_cpu(phy_res->rate_n_flags);
length = le16_to_cpu(rx_hdr->len);
/* end-of-frame status and timestamp */
status = le32_to_cpu(rx_end->status);
bcn_tmr = le32_to_cpu(rx_end->beacon_timestamp);
tsf_low = le64_to_cpu(rx_end->timestamp) & 0x0ffffffff;
tsf = le64_to_cpu(rx_end->timestamp);
/* signal statistics */ /* signal statistics */
rssi = rx_stats->rssi; rssi = iwl_calc_rssi(priv, phy_res);
agc = rx_stats->agc; tsf_low = le64_to_cpu(phy_res->timestamp) & 0x0ffffffff;
sig_avg = le16_to_cpu(rx_stats->sig_avg);
noise_diff = le16_to_cpu(rx_stats->noise_diff);
to_us = !compare_ether_addr(header->addr1, priv->mac_addr); to_us = !compare_ether_addr(header->addr1, priv->mac_addr);
...@@ -739,11 +723,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, ...@@ -739,11 +723,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
else else
title = "Frame"; title = "Frame";
rate_idx = iwl_hwrate_to_plcp_idx(rate_sym); rate_idx = iwl_hwrate_to_plcp_idx(rate_n_flags);
if (unlikely(rate_idx == -1)) if (unlikely((rate_idx < 0) || (rate_idx >= IWL_RATE_COUNT))) {
bitrate = 0; bitrate = 0;
else WARN_ON_ONCE(1);
} else {
bitrate = iwl_rates[rate_idx].ieee / 2; bitrate = iwl_rates[rate_idx].ieee / 2;
}
/* print frame summary. /* print frame summary.
* MAC addresses show just the last byte (for brevity), * MAC addresses show just the last byte (for brevity),
...@@ -755,23 +741,22 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, ...@@ -755,23 +741,22 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv,
length, rssi, channel, bitrate); length, rssi, channel, bitrate);
else { else {
/* src/dst addresses assume managed mode */ /* src/dst addresses assume managed mode */
IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, " IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, src=0x%02x, "
"src=0x%02x, rssi=%u, tim=%lu usec, " "len=%u, rssi=%d, tim=%lu usec, "
"phy=0x%02x, chnl=%d\n", "phy=0x%02x, chnl=%d\n",
title, le16_to_cpu(fc), header->addr1[5], title, le16_to_cpu(fc), header->addr1[5],
header->addr3[5], rssi, header->addr3[5], length, rssi,
tsf_low - priv->scan_start_tsf, tsf_low - priv->scan_start_tsf,
phy_flags, channel); phy_flags, channel);
} }
} }
if (print_dump) if (print_dump)
iwl_print_hex_dump(priv, IWL_DL_RX, data, length); iwl_print_hex_dump(priv, IWL_DL_RX, header, length);
} }
#else #else
static inline void iwl_dbg_report_frame(struct iwl_priv *priv, static void iwl_dbg_report_frame(struct iwl_priv *priv,
struct iwl_rx_packet *pkt, struct iwl_rx_phy_res *phy_res, u16 length,
struct ieee80211_hdr *header, struct ieee80211_hdr *header, int group100)
int group100)
{ {
} }
#endif #endif
...@@ -966,14 +951,6 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv, ...@@ -966,14 +951,6 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv,
rxb->skb = NULL; rxb->skb = NULL;
} }
/* Calc max signal level (dBm) among 3 possible receivers */
static inline int iwl_calc_rssi(struct iwl_priv *priv,
struct iwl_rx_phy_res *rx_resp)
{
return priv->cfg->ops->utils->calc_rssi(priv, rx_resp);
}
/* This is necessary only for a number of statistics, see the caller. */ /* This is necessary only for a number of statistics, see the caller. */
static int iwl_is_network_packet(struct iwl_priv *priv, static int iwl_is_network_packet(struct iwl_priv *priv,
struct ieee80211_hdr *header) struct ieee80211_hdr *header)
...@@ -1096,8 +1073,8 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, ...@@ -1096,8 +1073,8 @@ void iwl_rx_reply_rx(struct iwl_priv *priv,
priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE; priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE;
/* Set "1" to report good data frames in groups of 100 */ /* Set "1" to report good data frames in groups of 100 */
/* FIXME: need to optimize the call: */ if (unlikely(priv->debug_level & IWL_DL_RX))
iwl_dbg_report_frame(priv, pkt, header, 1); iwl_dbg_report_frame(priv, rx_start, len, header, 1);
IWL_DEBUG_STATS_LIMIT("Rssi %d, noise %d, qual %d, TSF %llu\n", IWL_DEBUG_STATS_LIMIT("Rssi %d, noise %d, qual %d, TSF %llu\n",
rx_status.signal, rx_status.noise, rx_status.signal, rx_status.signal, rx_status.noise, rx_status.signal,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册