OSDN Git Service

iwlwifi: mvm: rs: new rate scale API - add FW notifications
authorGregory Greenman <gregory.greenman@intel.com>
Wed, 1 Nov 2017 07:21:24 +0000 (09:21 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 5 Dec 2017 19:01:41 +0000 (21:01 +0200)
This patch sends to the FW notification configuration command and
handles the update responses.

Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/datapath.h
drivers/net/wireless/intel/iwlwifi/fw/api/rs.h
drivers/net/wireless/intel/iwlwifi/mvm/ops.c
drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c
drivers/net/wireless/intel/iwlwifi/mvm/rs.h

index 8ec1a7f..a57c722 100644 (file)
@@ -88,6 +88,16 @@ enum iwl_data_path_subcmd_ids {
        TLC_MNG_CONFIG_CMD = 0xF,
 
        /**
+        * @TLC_MNG_NOTIF_REQ_CMD: &struct iwl_tlc_notif_req_config_cmd
+        */
+       TLC_MNG_NOTIF_REQ_CMD = 0x10,
+
+       /**
+        * @TLC_MNG_UPDATE_NOTIF: &struct iwl_tlc_update_notif
+        */
+       TLC_MNG_UPDATE_NOTIF = 0xF7,
+
+       /**
         * @STA_PM_NOTIF: &struct iwl_mvm_pm_state_notification
         */
        STA_PM_NOTIF = 0xFD,
index ba88b0e..71707e1 100644 (file)
@@ -229,6 +229,40 @@ struct iwl_tlc_config_cmd {
        __le32 max_ampdu_cnt;
 } __packed; /* TLC_MNG_CONFIG_CMD_API_S_VER_1 */
 
+#define IWL_TLC_NOTIF_INIT_RATE_POS 0
+#define IWL_TLC_NOTIF_INIT_RATE_MSK BIT(IWL_TLC_NOTIF_INIT_RATE_POS)
+#define IWL_TLC_NOTIF_REQ_INTERVAL (500)
+
+/**
+ * struct iwl_tlc_notif_req_config_cmd - request notif on specific changes
+ * @sta_id: relevant station
+ * @reserved1: reserved
+ * @flags: bitmap of requested notifications %IWL_TLC_NOTIF_INIT_\*
+ * @interval: minimum time between notifications from TLC to the driver (msec)
+ * @reserved2: reserved
+ */
+struct iwl_tlc_notif_req_config_cmd {
+       u8 sta_id;
+       u8 reserved1;
+       __le16 flags;
+       __le16 interval;
+       __le16 reserved2;
+} __packed; /* TLC_MNG_NOTIF_REQ_CMD_API_S_VER_1 */
+
+/**
+ * struct iwl_tlc_update_notif - TLC notification from FW
+ * @sta_id: station id
+ * @reserved: reserved
+ * @flags: bitmap of notifications reported
+ * @values: field per flag in struct iwl_tlc_notif_req_config_cmd
+ */
+struct iwl_tlc_update_notif {
+       u8 sta_id;
+       u8 reserved;
+       __le16 flags;
+       __le32 values[16];
+} __packed; /* TLC_MNG_UPDATE_NTFY_API_S_VER_1 */
+
 /*
  * These serve as indexes into
  * struct iwl_rate_info fw_rate_idx_to_plcp[IWL_RATE_COUNT];
index a38a553..4773950 100644 (file)
@@ -1017,6 +1017,8 @@ static void iwl_mvm_rx_mq(struct iwl_op_mode *op_mode,
                iwl_mvm_rx_queue_notif(mvm, rxb, 0);
        else if (cmd == WIDE_ID(LEGACY_GROUP, FRAME_RELEASE))
                iwl_mvm_rx_frame_release(mvm, napi, rxb, 0);
+       else if (cmd == WIDE_ID(DATA_PATH_GROUP, TLC_MNG_UPDATE_NOTIF))
+               iwl_mvm_tlc_update_notif(mvm, pkt);
        else
                iwl_mvm_rx_common(mvm, rxb, pkt);
 }
index 8317b2f..4e5f094 100644 (file)
@@ -213,6 +213,46 @@ static void rs_fw_set_supp_rates(struct ieee80211_sta *sta,
        }
 }
 
+static void rs_fw_tlc_mng_notif_req_config(struct iwl_mvm *mvm, u8 sta_id)
+{
+       u32 cmd_id = iwl_cmd_id(TLC_MNG_NOTIF_REQ_CMD, DATA_PATH_GROUP, 0);
+       struct iwl_tlc_notif_req_config_cmd cfg_cmd = {
+               .sta_id = sta_id,
+               .flags = cpu_to_le16(IWL_TLC_NOTIF_INIT_RATE_MSK),
+               .interval = cpu_to_le16(IWL_TLC_NOTIF_REQ_INTERVAL),
+       };
+       int ret;
+
+       ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(cfg_cmd), &cfg_cmd);
+       if (ret)
+               IWL_ERR(mvm, "Failed to send TLC notif request (%d)\n", ret);
+}
+
+void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt)
+{
+       struct iwl_tlc_update_notif *notif;
+       struct iwl_mvm_sta *mvmsta;
+       struct iwl_lq_sta_rs_fw *lq_sta;
+
+       notif = (void *)pkt->data;
+       mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, notif->sta_id);
+
+       if (!mvmsta) {
+               IWL_ERR(mvm, "Invalid sta id (%d) in FW TLC notification\n",
+                       notif->sta_id);
+               return;
+       }
+
+       lq_sta = &mvmsta->lq_sta.rs_fw;
+
+       if (le16_to_cpu(notif->flags) & IWL_TLC_NOTIF_INIT_RATE_MSK) {
+               lq_sta->last_rate_n_flags =
+                       le32_to_cpu(notif->values[IWL_TLC_NOTIF_INIT_RATE_POS]);
+               IWL_DEBUG_RATE(mvm, "new rate_n_flags: 0x%X\n",
+                              lq_sta->last_rate_n_flags);
+       }
+}
+
 void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
                     enum nl80211_band band)
 {
@@ -243,6 +283,8 @@ void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
        ret = iwl_mvm_send_cmd_pdu(mvm, cmd_id, 0, sizeof(cfg_cmd), &cfg_cmd);
        if (ret)
                IWL_ERR(mvm, "Failed to send rate scale config (%d)\n", ret);
+
+       rs_fw_tlc_mng_notif_req_config(mvm, cfg_cmd.sta_id);
 }
 
 int rs_fw_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
index 5b58e2d..fb18cb8 100644 (file)
@@ -454,4 +454,5 @@ void rs_fw_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
                     enum nl80211_band band);
 int rs_fw_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
                        bool enable);
+void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt);
 #endif /* __rs__ */