Commit 325322ee authored by Wey-Yi Guy's avatar Wey-Yi Guy

iwlagn: add statistic notification structure for WiFi/BT devices

If its WiFi/BT combo device, the statistics notification sent by
uCode will include the additional BT related statistics counters.

Adding new data structure to support the new layout.
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
parent 7a17a33c
...@@ -1605,8 +1605,8 @@ static int iwl4965_hw_get_temperature(struct iwl_priv *priv) ...@@ -1605,8 +1605,8 @@ static int iwl4965_hw_get_temperature(struct iwl_priv *priv)
if (!test_bit(STATUS_TEMPERATURE, &priv->status)) if (!test_bit(STATUS_TEMPERATURE, &priv->status))
vt = sign_extend(R4, 23); vt = sign_extend(R4, 23);
else else
vt = sign_extend(le32_to_cpu( vt = sign_extend(le32_to_cpu(priv->_agn.statistics.
priv->_agn.statistics.general.temperature), 23); general.common.temperature), 23);
IWL_DEBUG_TEMP(priv, "Calib values R[1-3]: %d %d %d R4: %d\n", R1, R2, R3, vt); IWL_DEBUG_TEMP(priv, "Calib values R[1-3]: %d %d %d R4: %d\n", R1, R2, R3, vt);
......
...@@ -265,7 +265,7 @@ static void iwl5150_temperature(struct iwl_priv *priv) ...@@ -265,7 +265,7 @@ static void iwl5150_temperature(struct iwl_priv *priv)
u32 vt = 0; u32 vt = 0;
s32 offset = iwl_temp_calib_to_offset(priv); s32 offset = iwl_temp_calib_to_offset(priv);
vt = le32_to_cpu(priv->_agn.statistics.general.temperature); vt = le32_to_cpu(priv->_agn.statistics.general.common.temperature);
vt = vt / IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF + offset; vt = vt / IWL_5150_VOLTAGE_TO_TEMPERATURE_COEFF + offset;
/* now vt hold the temperature in Kelvin */ /* now vt hold the temperature in Kelvin */
priv->temperature = KELVIN_TO_CELSIUS(vt); priv->temperature = KELVIN_TO_CELSIUS(vt);
......
...@@ -759,8 +759,8 @@ ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf, ...@@ -759,8 +759,8 @@ ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf,
char *buf; char *buf;
int bufsz = sizeof(struct statistics_general) * 10 + 300; int bufsz = sizeof(struct statistics_general) * 10 + 300;
ssize_t ret; ssize_t ret;
struct statistics_general *general, *accum_general; struct statistics_general_common *general, *accum_general;
struct statistics_general *delta_general, *max_general; struct statistics_general_common *delta_general, *max_general;
struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg;
struct statistics_div *div, *accum_div, *delta_div, *max_div; struct statistics_div *div, *accum_div, *delta_div, *max_div;
...@@ -777,18 +777,18 @@ ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf, ...@@ -777,18 +777,18 @@ ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf,
* the last statistics notification from uCode * the last statistics notification from uCode
* might not reflect the current uCode activity * might not reflect the current uCode activity
*/ */
general = &priv->_agn.statistics.general; general = &priv->_agn.statistics.general.common;
dbg = &priv->_agn.statistics.general.dbg; dbg = &priv->_agn.statistics.general.common.dbg;
div = &priv->_agn.statistics.general.div; div = &priv->_agn.statistics.general.common.div;
accum_general = &priv->_agn.accum_statistics.general; accum_general = &priv->_agn.accum_statistics.general.common;
delta_general = &priv->_agn.delta_statistics.general; delta_general = &priv->_agn.delta_statistics.general.common;
max_general = &priv->_agn.max_delta.general; max_general = &priv->_agn.max_delta.general.common;
accum_dbg = &priv->_agn.accum_statistics.general.dbg; accum_dbg = &priv->_agn.accum_statistics.general.common.dbg;
delta_dbg = &priv->_agn.delta_statistics.general.dbg; delta_dbg = &priv->_agn.delta_statistics.general.common.dbg;
max_dbg = &priv->_agn.max_delta.general.dbg; max_dbg = &priv->_agn.max_delta.general.common.dbg;
accum_div = &priv->_agn.accum_statistics.general.div; accum_div = &priv->_agn.accum_statistics.general.common.div;
delta_div = &priv->_agn.delta_statistics.general.div; delta_div = &priv->_agn.delta_statistics.general.common.div;
max_div = &priv->_agn.max_delta.general.div; max_div = &priv->_agn.max_delta.general.common.div;
pos += iwl_statistics_flag(priv, buf, bufsz); pos += iwl_statistics_flag(priv, buf, bufsz);
pos += scnprintf(buf + pos, bufsz - pos, "%-32s current" pos += scnprintf(buf + pos, bufsz - pos, "%-32s current"
"acumulative delta max\n", "acumulative delta max\n",
......
...@@ -364,7 +364,7 @@ void iwlagn_temperature(struct iwl_priv *priv) ...@@ -364,7 +364,7 @@ void iwlagn_temperature(struct iwl_priv *priv)
{ {
/* store temperature from statistics (in Celsius) */ /* store temperature from statistics (in Celsius) */
priv->temperature = priv->temperature =
le32_to_cpu(priv->_agn.statistics.general.temperature); le32_to_cpu(priv->_agn.statistics.general.common.temperature);
iwl_tt_handler(priv); iwl_tt_handler(priv);
} }
......
...@@ -135,12 +135,12 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv, ...@@ -135,12 +135,12 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
} }
/* reset accumulative statistics for "no-counter" type statistics */ /* reset accumulative statistics for "no-counter" type statistics */
priv->_agn.accum_statistics.general.temperature = priv->_agn.accum_statistics.general.common.temperature =
priv->_agn.statistics.general.temperature; priv->_agn.statistics.general.common.temperature;
priv->_agn.accum_statistics.general.temperature_m = priv->_agn.accum_statistics.general.common.temperature_m =
priv->_agn.statistics.general.temperature_m; priv->_agn.statistics.general.common.temperature_m;
priv->_agn.accum_statistics.general.ttl_timestamp = priv->_agn.accum_statistics.general.common.ttl_timestamp =
priv->_agn.statistics.general.ttl_timestamp; priv->_agn.statistics.general.common.ttl_timestamp;
priv->_agn.accum_statistics.tx.tx_power.ant_a = priv->_agn.accum_statistics.tx.tx_power.ant_a =
priv->_agn.statistics.tx.tx_power.ant_a; priv->_agn.statistics.tx.tx_power.ant_a;
priv->_agn.accum_statistics.tx.tx_power.ant_b = priv->_agn.accum_statistics.tx.tx_power.ant_b =
...@@ -232,8 +232,8 @@ void iwl_rx_statistics(struct iwl_priv *priv, ...@@ -232,8 +232,8 @@ void iwl_rx_statistics(struct iwl_priv *priv,
(int)sizeof(priv->_agn.statistics), (int)sizeof(priv->_agn.statistics),
le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK); le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
change = ((priv->_agn.statistics.general.temperature != change = ((priv->_agn.statistics.general.common.temperature !=
pkt->u.stats.general.temperature) || pkt->u.stats.general.common.temperature) ||
((priv->_agn.statistics.flag & ((priv->_agn.statistics.flag &
STATISTICS_REPLY_FLG_HT40_MODE_MSK) != STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
(pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK))); (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
......
...@@ -3127,6 +3127,13 @@ struct statistics_rx_non_phy { ...@@ -3127,6 +3127,13 @@ struct statistics_rx_non_phy {
__le32 beacon_energy_c; __le32 beacon_energy_c;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct statistics_rx_non_phy_bt {
struct statistics_rx_non_phy common;
/* additional stats for bt */
__le32 num_bt_kills;
__le32 reserved[2];
} __attribute__ ((packed));
struct statistics_rx { struct statistics_rx {
struct statistics_rx_phy ofdm; struct statistics_rx_phy ofdm;
struct statistics_rx_phy cck; struct statistics_rx_phy cck;
...@@ -3134,6 +3141,13 @@ struct statistics_rx { ...@@ -3134,6 +3141,13 @@ struct statistics_rx {
struct statistics_rx_ht_phy ofdm_ht; struct statistics_rx_ht_phy ofdm_ht;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct statistics_rx_bt {
struct statistics_rx_phy ofdm;
struct statistics_rx_phy cck;
struct statistics_rx_non_phy_bt general;
struct statistics_rx_ht_phy ofdm_ht;
} __attribute__ ((packed));
/** /**
* struct statistics_tx_power - current tx power * struct statistics_tx_power - current tx power
* *
...@@ -3196,7 +3210,7 @@ struct statistics_div { ...@@ -3196,7 +3210,7 @@ struct statistics_div {
__le32 reserved2; __le32 reserved2;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct statistics_general { struct statistics_general_common {
__le32 temperature; /* radio temperature */ __le32 temperature; /* radio temperature */
__le32 temperature_m; /* for 5000 and up, this is radio voltage */ __le32 temperature_m; /* for 5000 and up, this is radio voltage */
struct statistics_dbg dbg; struct statistics_dbg dbg;
...@@ -3212,6 +3226,30 @@ struct statistics_general { ...@@ -3212,6 +3226,30 @@ struct statistics_general {
* in order to get out of bad PHY status * in order to get out of bad PHY status
*/ */
__le32 num_of_sos_states; __le32 num_of_sos_states;
} __attribute__ ((packed));
struct statistics_bt_activity {
/* Tx statistics */
__le32 hi_priority_tx_req_cnt;
__le32 hi_priority_tx_denied_cnt;
__le32 lo_priority_tx_req_cnt;
__le32 lo_priority_tx_denied_cnt;
/* Rx statistics */
__le32 hi_priority_rx_req_cnt;
__le32 hi_priority_rx_denied_cnt;
__le32 lo_priority_rx_req_cnt;
__le32 lo_priority_rx_denied_cnt;
} __attribute__ ((packed));
struct statistics_general {
struct statistics_general_common common;
__le32 reserved2;
__le32 reserved3;
} __attribute__ ((packed));
struct statistics_general_bt {
struct statistics_general_common common;
struct statistics_bt_activity activity;
__le32 reserved2; __le32 reserved2;
__le32 reserved3; __le32 reserved3;
} __attribute__ ((packed)); } __attribute__ ((packed));
...@@ -3273,6 +3311,12 @@ struct iwl_notif_statistics { ...@@ -3273,6 +3311,12 @@ struct iwl_notif_statistics {
struct statistics_general general; struct statistics_general general;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct iwl_bt_notif_statistics {
__le32 flag;
struct statistics_rx_bt rx;
struct statistics_tx tx;
struct statistics_general_bt general;
} __attribute__ ((packed));
/* /*
* MISSED_BEACONS_NOTIFICATION = 0xa2 (notification only, not a command) * MISSED_BEACONS_NOTIFICATION = 0xa2 (notification only, not a command)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment