ath10k: move wmm param storage to vif
authorMichal Kazior <michal.kazior@tieto.com>
Mon, 19 Jan 2015 08:53:41 +0000 (09:53 +0100)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 29 Jan 2015 10:11:44 +0000 (12:11 +0200)
mac80211 already requests WMM per vif but firmware
wasn't able to handle this until now. However new
wmi-tlv firmware for qca6174 is capable of this.

This prepares per-vif WMM param setup.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/wmi-ops.h
drivers/net/wireless/ath/ath10k/wmi-tlv.c
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h

index 2d9f871..abb3203 100644 (file)
@@ -315,6 +315,7 @@ struct ath10k_vif {
        bool use_cts_prot;
        int num_legacy_stations;
        int txpower;
+       struct wmi_wmm_params_all_arg wmm_params;
 };
 
 struct ath10k_vif_iter {
@@ -577,7 +578,6 @@ struct ath10k {
        u8 cfg_tx_chainmask;
        u8 cfg_rx_chainmask;
 
-       struct wmi_pdev_set_wmm_params_arg wmm_params;
        struct completion install_key_done;
 
        struct completion vdev_setup_done;
index 02e2bfc..62e8adc 100644 (file)
@@ -4092,6 +4092,7 @@ static int ath10k_conf_tx(struct ieee80211_hw *hw,
                          const struct ieee80211_tx_queue_params *params)
 {
        struct ath10k *ar = hw->priv;
+       struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
        struct wmi_wmm_params_arg *p = NULL;
        int ret;
 
@@ -4099,16 +4100,16 @@ static int ath10k_conf_tx(struct ieee80211_hw *hw,
 
        switch (ac) {
        case IEEE80211_AC_VO:
-               p = &ar->wmm_params.ac_vo;
+               p = &arvif->wmm_params.ac_vo;
                break;
        case IEEE80211_AC_VI:
-               p = &ar->wmm_params.ac_vi;
+               p = &arvif->wmm_params.ac_vi;
                break;
        case IEEE80211_AC_BE:
-               p = &ar->wmm_params.ac_be;
+               p = &arvif->wmm_params.ac_be;
                break;
        case IEEE80211_AC_BK:
-               p = &ar->wmm_params.ac_bk;
+               p = &arvif->wmm_params.ac_bk;
                break;
        }
 
@@ -4129,7 +4130,7 @@ static int ath10k_conf_tx(struct ieee80211_hw *hw,
        p->txop = params->txop * 32;
 
        /* FIXME: FW accepts wmm params per hw, not per vif */
-       ret = ath10k_wmi_pdev_set_wmm_params(ar, &ar->wmm_params);
+       ret = ath10k_wmi_pdev_set_wmm_params(ar, &arvif->wmm_params);
        if (ret) {
                ath10k_warn(ar, "failed to set wmm params: %d\n", ret);
                goto exit;
index 80bd28a..6e9e384 100644 (file)
@@ -104,7 +104,7 @@ struct wmi_ops {
                                              const struct wmi_scan_chan_list_arg *arg);
        struct sk_buff *(*gen_beacon_dma)(struct ath10k_vif *arvif);
        struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,
-                                           const struct wmi_pdev_set_wmm_params_arg *arg);
+                                           const struct wmi_wmm_params_all_arg *arg);
        struct sk_buff *(*gen_request_stats)(struct ath10k *ar,
                                             enum wmi_stats_id stats_id);
        struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,
@@ -774,7 +774,7 @@ ath10k_wmi_beacon_send_ref_nowait(struct ath10k_vif *arvif)
 
 static inline int
 ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
-                              const struct wmi_pdev_set_wmm_params_arg *arg)
+                              const struct wmi_wmm_params_all_arg *arg)
 {
        struct sk_buff *skb;
 
index d3cf91d..23a3761 100644 (file)
@@ -1584,6 +1584,21 @@ ath10k_wmi_tlv_op_gen_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id,
        return skb;
 }
 
+static void *ath10k_wmi_tlv_put_wmm(void *ptr,
+                                   const struct wmi_wmm_params_arg *arg)
+{
+       struct wmi_wmm_params *wmm;
+       struct wmi_tlv *tlv;
+
+       tlv = ptr;
+       tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_WMM_PARAMS);
+       tlv->len = __cpu_to_le16(sizeof(*wmm));
+       wmm = (void *)tlv->value;
+       ath10k_wmi_set_wmm_param(wmm, arg);
+
+       return ptr + sizeof(*tlv) + sizeof(*wmm);
+}
+
 static struct sk_buff *
 ath10k_wmi_tlv_op_gen_peer_create(struct ath10k *ar, u32 vdev_id,
                                  const u8 peer_addr[ETH_ALEN])
@@ -1944,24 +1959,9 @@ ath10k_wmi_tlv_op_gen_beacon_dma(struct ath10k_vif *arvif)
        return skb;
 }
 
-static void *ath10k_wmi_tlv_put_wmm(void *ptr,
-                                   const struct wmi_wmm_params_arg *arg)
-{
-       struct wmi_wmm_params *wmm;
-       struct wmi_tlv *tlv;
-
-       tlv = ptr;
-       tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_WMM_PARAMS);
-       tlv->len = __cpu_to_le16(sizeof(*wmm));
-       wmm = (void *)tlv->value;
-       ath10k_wmi_pdev_set_wmm_param(wmm, arg);
-
-       return ptr + sizeof(*tlv) + sizeof(*wmm);
-}
-
 static struct sk_buff *
 ath10k_wmi_tlv_op_gen_pdev_set_wmm(struct ath10k *ar,
-                                  const struct wmi_pdev_set_wmm_params_arg *arg)
+                                  const struct wmi_wmm_params_all_arg *arg)
 {
        struct wmi_tlv_pdev_set_wmm_cmd *cmd;
        struct wmi_wmm_params *wmm;
index fb1e2d1..050e508 100644 (file)
@@ -4890,8 +4890,8 @@ ath10k_wmi_op_gen_beacon_dma(struct ath10k_vif *arvif)
        return skb;
 }
 
-void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params,
-                                  const struct wmi_wmm_params_arg *arg)
+void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params,
+                             const struct wmi_wmm_params_arg *arg)
 {
        params->cwmin  = __cpu_to_le32(arg->cwmin);
        params->cwmax  = __cpu_to_le32(arg->cwmax);
@@ -4903,7 +4903,7 @@ void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params,
 
 static struct sk_buff *
 ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
-                              const struct wmi_pdev_set_wmm_params_arg *arg)
+                              const struct wmi_wmm_params_all_arg *arg)
 {
        struct wmi_pdev_set_wmm_params *cmd;
        struct sk_buff *skb;
@@ -4913,10 +4913,10 @@ ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
                return ERR_PTR(-ENOMEM);
 
        cmd = (struct wmi_pdev_set_wmm_params *)skb->data;
-       ath10k_wmi_pdev_set_wmm_param(&cmd->ac_be, &arg->ac_be);
-       ath10k_wmi_pdev_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
-       ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
-       ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
+       ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be);
+       ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk);
+       ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi);
+       ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
 
        ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
        return skb;
index 34d8c44..c009393 100644 (file)
@@ -2939,7 +2939,7 @@ struct wmi_wmm_params_arg {
        u32 no_ack;
 };
 
-struct wmi_pdev_set_wmm_params_arg {
+struct wmi_wmm_params_all_arg {
        struct wmi_wmm_params_arg ac_be;
        struct wmi_wmm_params_arg ac_bk;
        struct wmi_wmm_params_arg ac_vi;
@@ -4869,8 +4869,8 @@ void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar,
                                    struct wmi_host_mem_chunks *chunks);
 void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn,
                                      const struct wmi_start_scan_arg *arg);
-void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params,
-                                  const struct wmi_wmm_params_arg *arg);
+void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params,
+                             const struct wmi_wmm_params_arg *arg);
 void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch,
                                const struct wmi_channel_arg *arg);
 int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg);