Search Linux Wireless

[PATCH] ath6kl: use WMI to set RSN capabilities

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This fixes AP mode when the ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE flag
is not present in the FW. The id of some WMI commands is also fixed
(there was an error in the enum order), and a function to set RSN caps
is added.

Signed-off-by: Alfonso Sánchez-Beato <alfonso.sanchez-beato@xxxxxxxxxxxxx>
---
 drivers/net/wireless/ath/ath6kl/cfg80211.c | 21 ++++++---------------
 drivers/net/wireless/ath/ath6kl/main.c     | 10 +++-------
 drivers/net/wireless/ath/ath6kl/wmi.c      | 23 +++++++++++++++++++++++
 drivers/net/wireless/ath/ath6kl/wmi.h      | 15 +++++++++++----
 4 files changed, 43 insertions(+), 26 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index 2ba8cf3f38af..1b89c53d47e7 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -2933,13 +2933,11 @@ static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
 	 * advertise the same in beacon/probe response. Send
 	 * the complete RSN IE capability field to firmware
 	 */
-	if (!ath6kl_get_rsn_capab(&info->beacon, (u8 *) &rsn_capab) &&
-	    test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE,
-		     ar->fw_capabilities)) {
-		res = ath6kl_wmi_set_ie_cmd(ar->wmi, vif->fw_vif_idx,
-					    WLAN_EID_RSN, WMI_RSN_IE_CAPB,
-					    (const u8 *) &rsn_capab,
-					    sizeof(rsn_capab));
+	if (!ath6kl_get_rsn_capab(&info->beacon, (u8 *)&rsn_capab)) {
+		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "RSN caps %d\n", rsn_capab);
+
+		res = ath6kl_wmi_set_rsn_cap(ar->wmi, vif->fw_vif_idx,
+					     rsn_capab);
 		vif->rsn_capab = rsn_capab;
 		if (res < 0)
 			return res;
@@ -3918,14 +3916,7 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)
 		return -EINVAL;
 	}
 
-	/*
-	 * Even if the fw has HT support, advertise HT cap only when
-	 * the firmware has support to override RSN capability, otherwise
-	 * 4-way handshake would fail.
-	 */
-	if (!(ht &&
-	      test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE,
-		       ar->fw_capabilities))) {
+	if (!ht) {
 		ath6kl_band_2ghz.ht_cap.cap = 0;
 		ath6kl_band_2ghz.ht_cap.ht_supported = false;
 		ath6kl_band_5ghz.ht_cap.cap = 0;
diff --git a/drivers/net/wireless/ath/ath6kl/main.c b/drivers/net/wireless/ath/ath6kl/main.c
index db95f85751e3..4e186f8b3950 100644
--- a/drivers/net/wireless/ath/ath6kl/main.c
+++ b/drivers/net/wireless/ath/ath6kl/main.c
@@ -579,13 +579,9 @@ static int ath6kl_commit_ch_switch(struct ath6kl_vif *vif, u16 channel)
 		 * reconfigure any saved RSN IE capabilites in the beacon /
 		 * probe response to stay in sync with the supplicant.
 		 */
-		if (vif->rsn_capab &&
-		    test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE,
-			     ar->fw_capabilities))
-			ath6kl_wmi_set_ie_cmd(ar->wmi, vif->fw_vif_idx,
-					      WLAN_EID_RSN, WMI_RSN_IE_CAPB,
-					      (const u8 *) &vif->rsn_capab,
-					      sizeof(vif->rsn_capab));
+		if (vif->rsn_capab)
+			ath6kl_wmi_set_rsn_cap(ar->wmi, vif->fw_vif_idx,
+					       vif->rsn_capab);
 
 		return ath6kl_wmi_ap_profile_commit(ar->wmi, vif->fw_vif_idx,
 						    &vif->profile);
diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c
index 777acc564ac9..d7de9224d755 100644
--- a/drivers/net/wireless/ath/ath6kl/wmi.c
+++ b/drivers/net/wireless/ath/ath6kl/wmi.c
@@ -4168,3 +4168,26 @@ void ath6kl_wmi_shutdown(struct wmi *wmi)
 	kfree(wmi->last_mgmt_tx_frame);
 	kfree(wmi);
 }
+
+int ath6kl_wmi_set_rsn_cap(struct wmi *wmi, u8 if_idx, u16 rsn_cap)
+{
+	struct sk_buff *skb;
+	struct wmi_rsn_cap_cmd *cmd;
+
+	skb = ath6kl_wmi_get_new_buf(sizeof(*cmd));
+	if (!skb)
+		return -ENOMEM;
+
+	ath6kl_dbg(ATH6KL_DBG_WMI, "set_rsn_cap: 0x%04x\n", rsn_cap);
+
+	cmd = (struct wmi_rsn_cap_cmd *)skb->data;
+	cmd->rsn_cap = cpu_to_le16(rsn_cap);
+
+	return ath6kl_wmi_cmd_send(wmi, if_idx, skb, WMI_SET_RSN_CAP_CMDID,
+				   NO_SYNC_WMIFLAG);
+}
+
+int ath6kl_wmi_get_rsn_cap(struct wmi *wmi, u8 if_idx)
+{
+	return ath6kl_wmi_simple_cmd(wmi, if_idx, WMI_GET_RSN_CAP_CMDID);
+}
diff --git a/drivers/net/wireless/ath/ath6kl/wmi.h b/drivers/net/wireless/ath/ath6kl/wmi.h
index a60bb49fe920..011d4b6fb5ab 100644
--- a/drivers/net/wireless/ath/ath6kl/wmi.h
+++ b/drivers/net/wireless/ath/ath6kl/wmi.h
@@ -597,10 +597,6 @@ enum wmi_cmd_id {
 
 	WMI_GREENTX_PARAMS_CMDID,
 
-	WMI_RTT_MEASREQ_CMDID,
-	WMI_RTT_CAPREQ_CMDID,
-	WMI_RTT_STATUSREQ_CMDID,
-
 	/* WPS Commands */
 	WMI_WPS_START_CMDID,
 	WMI_GET_WPS_STATUS_CMDID,
@@ -621,6 +617,10 @@ enum wmi_cmd_id {
 	WMI_RX_FILTER_COALESCE_FILTER_OP_CMDID,
 	WMI_RX_FILTER_SET_FRAME_TEST_LIST_CMDID,
 
+	WMI_RTT_MEASREQ_CMDID,
+	WMI_RTT_CAPREQ_CMDID,
+	WMI_RTT_STATUSREQ_CMDID,
+
 	WMI_SEND_MGMT_CMDID,
 	WMI_BEGIN_SCAN_CMDID,
 
@@ -2533,6 +2533,10 @@ enum wmi_sync_flag {
 	END_WMIFLAG
 };
 
+struct wmi_rsn_cap_cmd {
+	__le16 rsn_cap;
+} __packed;
+
 enum htc_endpoint_id ath6kl_wmi_get_control_ep(struct wmi *wmi);
 void ath6kl_wmi_set_control_ep(struct wmi *wmi, enum htc_endpoint_id ep_id);
 int ath6kl_wmi_dix_2_dot3(struct wmi *wmi, struct sk_buff *skb);
@@ -2728,4 +2732,7 @@ void *ath6kl_wmi_init(struct ath6kl *devt);
 void ath6kl_wmi_shutdown(struct wmi *wmi);
 void ath6kl_wmi_reset(struct wmi *wmi);
 
+int ath6kl_wmi_set_rsn_cap(struct wmi *wmi, u8 if_idx, u16 rsn_cap);
+int ath6kl_wmi_get_rsn_cap(struct wmi *wmi, u8 if_idx);
+
 #endif /* WMI_H */
-- 
2.14.1




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux