iwlagn: add statistic notification structure for WiFi/BT devices
authorWey-Yi Guy <wey-yi.w.guy@intel.com>
Wed, 14 Jul 2010 15:07:27 +0000 (08:07 -0700)
committerWey-Yi Guy <wey-yi.w.guy@intel.com>
Fri, 23 Jul 2010 15:40:47 +0000 (08:40 -0700)
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: Wey-Yi Guy <wey-yi.w.guy@intel.com>
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-agn-debugfs.c
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
drivers/net/wireless/iwlwifi/iwl-agn-rx.c
drivers/net/wireless/iwlwifi/iwl-commands.h

index 3a0d0adab1aea7c1f8b743c58a3df98a880bcccb..27a776f2f8fa487022003074df1476a3c0214fc9 100644 (file)
@@ -1605,8 +1605,8 @@ static int iwl4965_hw_get_temperature(struct iwl_priv *priv)
        if (!test_bit(STATUS_TEMPERATURE, &priv->status))
                vt = sign_extend(R4, 23);
        else
-               vt = sign_extend(le32_to_cpu(
-                               priv->_agn.statistics.general.temperature), 23);
+               vt = sign_extend(le32_to_cpu(priv->_agn.statistics.
+                                general.common.temperature), 23);
 
        IWL_DEBUG_TEMP(priv, "Calib values R[1-3]: %d %d %d R4: %d\n", R1, R2, R3, vt);
 
index 7d89d99ce19c56b34ca528940c0c9d154c1bbc39..a7077cd7afeeadbad6295012fded19ef4196445d 100644 (file)
@@ -265,7 +265,7 @@ static void iwl5150_temperature(struct iwl_priv *priv)
        u32 vt = 0;
        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;
        /* now vt hold the temperature in Kelvin */
        priv->temperature = KELVIN_TO_CELSIUS(vt);
index 5e5c5122fb152b2590257c17243a164f0b0943d4..11dd1f736bed4d1b50c82a234cf028e8275f41d9 100644 (file)
@@ -759,8 +759,8 @@ ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf,
        char *buf;
        int bufsz = sizeof(struct statistics_general) * 10 + 300;
        ssize_t ret;
-       struct statistics_general *general, *accum_general;
-       struct statistics_general *delta_general, *max_general;
+       struct statistics_general_common *general, *accum_general;
+       struct statistics_general_common *delta_general, *max_general;
        struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg;
        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,
          * the last statistics notification from uCode
          * might not reflect the current uCode activity
          */
-       general = &priv->_agn.statistics.general;
-       dbg = &priv->_agn.statistics.general.dbg;
-       div = &priv->_agn.statistics.general.div;
-       accum_general = &priv->_agn.accum_statistics.general;
-       delta_general = &priv->_agn.delta_statistics.general;
-       max_general = &priv->_agn.max_delta.general;
-       accum_dbg = &priv->_agn.accum_statistics.general.dbg;
-       delta_dbg = &priv->_agn.delta_statistics.general.dbg;
-       max_dbg = &priv->_agn.max_delta.general.dbg;
-       accum_div = &priv->_agn.accum_statistics.general.div;
-       delta_div = &priv->_agn.delta_statistics.general.div;
-       max_div = &priv->_agn.max_delta.general.div;
+       general = &priv->_agn.statistics.general.common;
+       dbg = &priv->_agn.statistics.general.common.dbg;
+       div = &priv->_agn.statistics.general.common.div;
+       accum_general = &priv->_agn.accum_statistics.general.common;
+       delta_general = &priv->_agn.delta_statistics.general.common;
+       max_general = &priv->_agn.max_delta.general.common;
+       accum_dbg = &priv->_agn.accum_statistics.general.common.dbg;
+       delta_dbg = &priv->_agn.delta_statistics.general.common.dbg;
+       max_dbg = &priv->_agn.max_delta.general.common.dbg;
+       accum_div = &priv->_agn.accum_statistics.general.common.div;
+       delta_div = &priv->_agn.delta_statistics.general.common.div;
+       max_div = &priv->_agn.max_delta.general.common.div;
        pos += iwl_statistics_flag(priv, buf, bufsz);
        pos += scnprintf(buf + pos, bufsz - pos, "%-32s     current"
                         "acumulative       delta         max\n",
index 74623e0d535f7b2b46487d4e831f92b3fc8bf434..dda71cd9aab124f49f0f24826ec44ff1073b57df 100644 (file)
@@ -364,7 +364,7 @@ void iwlagn_temperature(struct iwl_priv *priv)
 {
        /* store temperature from statistics (in Celsius) */
        priv->temperature =
-               le32_to_cpu(priv->_agn.statistics.general.temperature);
+               le32_to_cpu(priv->_agn.statistics.general.common.temperature);
        iwl_tt_handler(priv);
 }
 
index d54edc326f8158de91bf75fc6a2833c5062a67c0..249b77bbf63850e14a4a18378b77c0a913161a5e 100644 (file)
@@ -135,12 +135,12 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
        }
 
        /* reset accumulative statistics for "no-counter" type statistics */
-       priv->_agn.accum_statistics.general.temperature =
-               priv->_agn.statistics.general.temperature;
-       priv->_agn.accum_statistics.general.temperature_m =
-               priv->_agn.statistics.general.temperature_m;
-       priv->_agn.accum_statistics.general.ttl_timestamp =
-               priv->_agn.statistics.general.ttl_timestamp;
+       priv->_agn.accum_statistics.general.common.temperature =
+               priv->_agn.statistics.general.common.temperature;
+       priv->_agn.accum_statistics.general.common.temperature_m =
+               priv->_agn.statistics.general.common.temperature_m;
+       priv->_agn.accum_statistics.general.common.ttl_timestamp =
+               priv->_agn.statistics.general.common.ttl_timestamp;
        priv->_agn.accum_statistics.tx.tx_power.ant_a =
                priv->_agn.statistics.tx.tx_power.ant_a;
        priv->_agn.accum_statistics.tx.tx_power.ant_b =
@@ -232,8 +232,8 @@ void iwl_rx_statistics(struct iwl_priv *priv,
                     (int)sizeof(priv->_agn.statistics),
                     le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
 
-       change = ((priv->_agn.statistics.general.temperature !=
-                  pkt->u.stats.general.temperature) ||
+       change = ((priv->_agn.statistics.general.common.temperature !=
+                  pkt->u.stats.general.common.temperature) ||
                  ((priv->_agn.statistics.flag &
                    STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
                   (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
index 83247f7e019c42b8bea7ca306412a5e267181ed7..4be90637b568bfc0a319e3f4056a0508c64f83b1 100644 (file)
@@ -3127,6 +3127,13 @@ struct statistics_rx_non_phy {
        __le32 beacon_energy_c;
 } __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_phy ofdm;
        struct statistics_rx_phy cck;
@@ -3134,6 +3141,13 @@ struct statistics_rx {
        struct statistics_rx_ht_phy ofdm_ht;
 } __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
  *
@@ -3196,7 +3210,7 @@ struct statistics_div {
        __le32 reserved2;
 } __attribute__ ((packed));
 
-struct statistics_general {
+struct statistics_general_common {
        __le32 temperature;   /* radio temperature */
        __le32 temperature_m; /* for 5000 and up, this is radio voltage */
        struct statistics_dbg dbg;
@@ -3212,6 +3226,30 @@ struct statistics_general {
         *  in order to get out of bad PHY status
         */
        __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 reserved3;
 } __attribute__ ((packed));
@@ -3273,6 +3311,12 @@ struct iwl_notif_statistics {
        struct statistics_general general;
 } __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)