Linux wireless drivers development
 help / color / mirror / Atom feed
* [PATCH 05/13] ath10k: split ath10k_wmi_service_ready_event_rx
From: Bartosz Markowski @ 2013-09-25  9:38 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski
In-Reply-To: <1380101891-18312-1-git-send-email-bartosz.markowski@tieto.com>

Since the both firmwares we are going to support,
have significantly different APIs (WMI and shared
structures), it's easier to actually split the whole
event handling functions, instead cutting them inside.

The fork starts now on ath10k_wmi_process_rx().

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
---
 drivers/net/wireless/ath/ath10k/wmi.c |   66 ++++++++++++++++++++++++++++++++-
 drivers/net/wireless/ath/ath10k/wmi.h |   40 ++++++++++++++++++++
 2 files changed, 105 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 7bbe51f..f87e79a 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1309,6 +1309,70 @@ static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
 	complete(&ar->wmi.service_ready);
 }
 
+static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar,
+						  struct sk_buff *skb)
+{
+	struct wmi_service_ready_event_10x *ev = (void *)skb->data;
+
+	if (skb->len < sizeof(*ev)) {
+		ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
+			    skb->len, sizeof(*ev));
+		return;
+	}
+
+	ar->hw_min_tx_power = __le32_to_cpu(ev->hw_min_tx_power);
+	ar->hw_max_tx_power = __le32_to_cpu(ev->hw_max_tx_power);
+	ar->ht_cap_info = __le32_to_cpu(ev->ht_cap_info);
+	ar->vht_cap_info = __le32_to_cpu(ev->vht_cap_info);
+	ar->fw_version_major =
+		(__le32_to_cpu(ev->sw_version) & 0xff000000) >> 24;
+	ar->fw_version_minor = (__le32_to_cpu(ev->sw_version) & 0x00ffffff);
+	ar->phy_capability = __le32_to_cpu(ev->phy_capability);
+	ar->num_rf_chains = __le32_to_cpu(ev->num_rf_chains);
+
+	if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) {
+		ath10k_warn("hardware advertises support for more spatial streams than it should (%d > %d)\n",
+			    ar->num_rf_chains, WMI_MAX_SPATIAL_STREAM);
+		ar->num_rf_chains = WMI_MAX_SPATIAL_STREAM;
+	}
+
+	ar->ath_common.regulatory.current_rd =
+		__le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd);
+
+	ath10k_debug_read_service_map(ar, ev->wmi_service_bitmap,
+				      sizeof(ev->wmi_service_bitmap));
+
+	if (strlen(ar->hw->wiphy->fw_version) == 0) {
+		snprintf(ar->hw->wiphy->fw_version,
+			 sizeof(ar->hw->wiphy->fw_version),
+			 "%u.%u",
+			 ar->fw_version_major,
+			 ar->fw_version_minor);
+	}
+
+	/* FIXME: it probably should be better to support this.
+	   TODO: Next patch introduce memory chunks. It's a must for 10.x FW */
+	if (__le32_to_cpu(ev->num_mem_reqs) > 0) {
+		ath10k_warn("target requested %d memory chunks; ignoring\n",
+			    __le32_to_cpu(ev->num_mem_reqs));
+	}
+
+	ath10k_dbg(ATH10K_DBG_WMI,
+		   "wmi event service ready sw_ver 0x%08x abi_ver %u phy_cap 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_msc 0x%08x sys_cap_info 0x%08x mem_reqs %u num_rf_chains %u\n",
+		   __le32_to_cpu(ev->sw_version),
+		   __le32_to_cpu(ev->abi_version),
+		   __le32_to_cpu(ev->phy_capability),
+		   __le32_to_cpu(ev->ht_cap_info),
+		   __le32_to_cpu(ev->vht_cap_info),
+		   __le32_to_cpu(ev->vht_supp_mcs),
+		   __le32_to_cpu(ev->sys_cap_info),
+		   __le32_to_cpu(ev->num_mem_reqs),
+		   __le32_to_cpu(ev->num_rf_chains));
+
+	complete(&ar->wmi.service_ready);
+}
+
+
 static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb)
 {
 	struct wmi_ready_event *ev = (struct wmi_ready_event *)skb->data;
@@ -1545,7 +1609,7 @@ static void ath10k_wmi_10x_process_rx(struct ath10k *ar, struct sk_buff *skb)
 		ath10k_wmi_event_vdev_resume_req(ar, skb);
 		break;
 	case WMI_10X_SERVICE_READY_EVENTID:
-		ath10k_wmi_service_ready_event_rx(ar, skb);
+		ath10k_wmi_10x_service_ready_event_rx(ar, skb);
 		break;
 	case WMI_10X_READY_EVENTID:
 		ath10k_wmi_ready_event_rx(ar, skb);
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index c23d070..d309b8b 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -1130,6 +1130,46 @@ struct wmi_service_ready_event {
 	struct wlan_host_mem_req mem_reqs[1];
 } __packed;
 
+/* This is the definition from 10.X firmware branch */
+struct wmi_service_ready_event_10x {
+	__le32 sw_version;
+	__le32 abi_version;
+
+	/* WMI_PHY_CAPABILITY */
+	__le32 phy_capability;
+
+	/* Maximum number of frag table entries that SW will populate less 1 */
+	__le32 max_frag_entry;
+	__le32 wmi_service_bitmap[WMI_SERVICE_BM_SIZE];
+	__le32 num_rf_chains;
+
+	/*
+	 * The following field is only valid for service type
+	 * WMI_SERVICE_11AC
+	 */
+	__le32 ht_cap_info; /* WMI HT Capability */
+	__le32 vht_cap_info; /* VHT capability info field of 802.11ac */
+	__le32 vht_supp_mcs; /* VHT Supported MCS Set field Rx/Tx same */
+	__le32 hw_min_tx_power;
+	__le32 hw_max_tx_power;
+
+	struct hal_reg_capabilities hal_reg_capabilities;
+
+	__le32 sys_cap_info;
+	__le32 min_pkt_size_enable; /* Enterprise mode short pkt enable */
+
+	/*
+	 * request to host to allocate a chuck of memory and pss it down to FW
+	 * via WM_INIT. FW uses this as FW extesnsion memory for saving its
+	 * data structures. Only valid for low latency interfaces like PCIE
+	 * where FW can access this memory directly (or) by DMA.
+	 */
+	__le32 num_mem_reqs;
+
+	struct wlan_host_mem_req mem_reqs[1];
+} __packed;
+
+
 #define WMI_SERVICE_READY_TIMEOUT_HZ (5*HZ)
 #define WMI_UNIFIED_READY_TIMEOUT_HZ (5*HZ)
 
-- 
1.7.10


^ permalink raw reply related

* [PATCH 04/13] ath10k: implement WMI events handling frame for both firmwares
From: Bartosz Markowski @ 2013-09-25  9:38 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski
In-Reply-To: <1380101891-18312-1-git-send-email-bartosz.markowski@tieto.com>

We still use the same function handlers for both main and 10.X
paths. Next step is to track down and make the split needed.

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
---
 drivers/net/wireless/ath/ath10k/wmi.c |  131 ++++++++++++++++++++++++++++++++-
 1 file changed, 130 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index ed137b8..7bbe51f 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1220,6 +1220,24 @@ static void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
 	ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
 }
 
+static void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar,
+					     struct sk_buff *skb)
+{
+	ath10k_dbg(ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
+}
+
+static void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar,
+					      struct sk_buff *skb)
+{
+	ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
+}
+
+static void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar,
+					     struct sk_buff *skb)
+{
+	ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
+}
+
 static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
 					      struct sk_buff *skb)
 {
@@ -1430,10 +1448,121 @@ static void ath10k_wmi_main_process_rx(struct ath10k *ar, struct sk_buff *skb)
 	dev_kfree_skb(skb);
 }
 
+static void ath10k_wmi_10x_process_rx(struct ath10k *ar, struct sk_buff *skb)
+{
+	struct wmi_cmd_hdr *cmd_hdr;
+	enum wmi_10x_event_id id;
+	u16 len;
+
+	cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
+	id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
+
+	if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
+		return;
+
+	len = skb->len;
+
+	trace_ath10k_wmi_event(id, skb->data, skb->len);
+
+	switch (id) {
+	case WMI_10X_MGMT_RX_EVENTID:
+		ath10k_wmi_event_mgmt_rx(ar, skb);
+		/* mgmt_rx() owns the skb now! */
+		return;
+	case WMI_10X_SCAN_EVENTID:
+		ath10k_wmi_event_scan(ar, skb);
+		break;
+	case WMI_10X_CHAN_INFO_EVENTID:
+		ath10k_wmi_event_chan_info(ar, skb);
+		break;
+	case WMI_10X_ECHO_EVENTID:
+		ath10k_wmi_event_echo(ar, skb);
+		break;
+	case WMI_10X_DEBUG_MESG_EVENTID:
+		ath10k_wmi_event_debug_mesg(ar, skb);
+		break;
+	case WMI_10X_UPDATE_STATS_EVENTID:
+		ath10k_wmi_event_update_stats(ar, skb);
+		break;
+	case WMI_10X_VDEV_START_RESP_EVENTID:
+		ath10k_wmi_event_vdev_start_resp(ar, skb);
+		break;
+	case WMI_10X_VDEV_STOPPED_EVENTID:
+		ath10k_wmi_event_vdev_stopped(ar, skb);
+		break;
+	case WMI_10X_PEER_STA_KICKOUT_EVENTID:
+		ath10k_wmi_event_peer_sta_kickout(ar, skb);
+		break;
+	case WMI_10X_HOST_SWBA_EVENTID:
+		ath10k_wmi_event_host_swba(ar, skb);
+		break;
+	case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
+		ath10k_wmi_event_tbttoffset_update(ar, skb);
+		break;
+	case WMI_10X_PHYERR_EVENTID:
+		ath10k_wmi_event_phyerr(ar, skb);
+		break;
+	case WMI_10X_ROAM_EVENTID:
+		ath10k_wmi_event_roam(ar, skb);
+		break;
+	case WMI_10X_PROFILE_MATCH:
+		ath10k_wmi_event_profile_match(ar, skb);
+		break;
+	case WMI_10X_DEBUG_PRINT_EVENTID:
+		ath10k_wmi_event_debug_print(ar, skb);
+		break;
+	case WMI_10X_PDEV_QVIT_EVENTID:
+		ath10k_wmi_event_pdev_qvit(ar, skb);
+		break;
+	case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
+		ath10k_wmi_event_wlan_profile_data(ar, skb);
+		break;
+	case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
+		ath10k_wmi_event_rtt_measurement_report(ar, skb);
+		break;
+	case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
+		ath10k_wmi_event_tsf_measurement_report(ar, skb);
+		break;
+	case WMI_10X_RTT_ERROR_REPORT_EVENTID:
+		ath10k_wmi_event_rtt_error_report(ar, skb);
+		break;
+	case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
+		ath10k_wmi_event_wow_wakeup_host(ar, skb);
+		break;
+	case WMI_10X_DCS_INTERFERENCE_EVENTID:
+		ath10k_wmi_event_dcs_interference(ar, skb);
+		break;
+	case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
+		ath10k_wmi_event_pdev_tpc_config(ar, skb);
+		break;
+	case WMI_10X_INST_RSSI_STATS_EVENTID:
+		ath10k_wmi_event_inst_rssi_stats(ar, skb);
+		break;
+	case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
+		ath10k_wmi_event_vdev_standby_req(ar, skb);
+		break;
+	case WMI_10X_VDEV_RESUME_REQ_EVENTID:
+		ath10k_wmi_event_vdev_resume_req(ar, skb);
+		break;
+	case WMI_10X_SERVICE_READY_EVENTID:
+		ath10k_wmi_service_ready_event_rx(ar, skb);
+		break;
+	case WMI_10X_READY_EVENTID:
+		ath10k_wmi_ready_event_rx(ar, skb);
+		break;
+	default:
+		ath10k_warn("Unknown eventid: %d\n", id);
+		break;
+	}
+
+	dev_kfree_skb(skb);
+}
+
+
 static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
 {
 	if (test_bit(ATH10K_FW_FEATURE_10X, ar->fw_features))
-		ath10k_warn("Firmware 10.X is not yet supported\n");
+		ath10k_wmi_10x_process_rx(ar, skb);
 	else
 		ath10k_wmi_main_process_rx(ar, skb);
 }
-- 
1.7.10


^ permalink raw reply related

* [PATCH 07/13] ath10k: implement host memory chunks
From: Bartosz Markowski @ 2013-09-25  9:38 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski
In-Reply-To: <1380101891-18312-1-git-send-email-bartosz.markowski@tieto.com>

10.X firmware can request a memory pool from host to offload
it's own resources. This is a feature designed especially
for AP mode where the target has to deal with large number
of peers.

So we allocate and map a consistent DMA memory which FW can
use to store e.g. peer rate contol maps.

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
---
 drivers/net/wireless/ath/ath10k/core.h |   12 +++
 drivers/net/wireless/ath/ath10k/wmi.c  |  128 ++++++++++++++++++++++++++++++--
 drivers/net/wireless/ath/ath10k/wmi.h  |    3 +
 3 files changed, 135 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 0db08ea..0c9e6f3 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -102,12 +102,24 @@ struct ath10k_bmi {
 	bool done_sent;
 };
 
+#define ATH10K_MAX_MEM_REQS 16
+
+struct ath10k_mem_chunk {
+	void *vaddr;
+	dma_addr_t paddr;
+	u32 len;
+	u32 req_id;
+};
+
 struct ath10k_wmi {
 	enum ath10k_htc_ep_id eid;
 	struct completion service_ready;
 	struct completion unified_ready;
 	wait_queue_head_t tx_credits_wq;
 	struct wmi_cmd_map *cmd;
+
+	u32 num_mem_chunks;
+	struct ath10k_mem_chunk mem_chunks[ATH10K_MAX_MEM_REQS];
 };
 
 struct ath10k_peer_stat {
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index f87e79a..3b1ae88 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1238,6 +1238,37 @@ static void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar,
 	ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
 }
 
+static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
+				      u32 num_units, u32 unit_len)
+{
+	dma_addr_t paddr;
+	u32 pool_size;
+	int idx = ar->wmi.num_mem_chunks;
+
+	pool_size = num_units * round_up(unit_len, 4);
+
+	if (!pool_size)
+		return -EINVAL;
+
+	ar->wmi.mem_chunks[idx].vaddr = dma_alloc_coherent(ar->dev,
+							   pool_size,
+							   &paddr,
+							   GFP_ATOMIC);
+	if (!ar->wmi.mem_chunks[idx].vaddr) {
+		ath10k_warn("failed to allocate memory chunk\n");
+		return -ENOMEM;
+	}
+
+	memset(ar->wmi.mem_chunks[idx].vaddr, 0, pool_size);
+
+	ar->wmi.mem_chunks[idx].paddr = paddr;
+	ar->wmi.mem_chunks[idx].len = pool_size;
+	ar->wmi.mem_chunks[idx].req_id = req_id;
+	ar->wmi.num_mem_chunks++;
+
+	return 0;
+}
+
 static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
 					      struct sk_buff *skb)
 {
@@ -1312,6 +1343,8 @@ static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
 static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar,
 						  struct sk_buff *skb)
 {
+	u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
+	int ret;
 	struct wmi_service_ready_event_10x *ev = (void *)skb->data;
 
 	if (skb->len < sizeof(*ev)) {
@@ -1350,13 +1383,52 @@ static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar,
 			 ar->fw_version_minor);
 	}
 
-	/* FIXME: it probably should be better to support this.
-	   TODO: Next patch introduce memory chunks. It's a must for 10.x FW */
-	if (__le32_to_cpu(ev->num_mem_reqs) > 0) {
-		ath10k_warn("target requested %d memory chunks; ignoring\n",
-			    __le32_to_cpu(ev->num_mem_reqs));
+	num_mem_reqs = __le32_to_cpu(ev->num_mem_reqs);
+
+	if (num_mem_reqs > ATH10K_MAX_MEM_REQS) {
+		ath10k_warn("requested memory chunks number (%d) exceeds the limit\n",
+			    num_mem_reqs);
+		return;
+	}
+
+	if (!num_mem_reqs)
+		goto exit;
+
+	ath10k_dbg(ATH10K_DBG_WMI, "firmware has requested %d memory chunks\n",
+		   num_mem_reqs);
+
+	for (i = 0; i < num_mem_reqs; ++i) {
+		req_id = __le32_to_cpu(ev->mem_reqs[i].req_id);
+		num_units = __le32_to_cpu(ev->mem_reqs[i].num_units);
+		unit_size = __le32_to_cpu(ev->mem_reqs[i].unit_size);
+		num_unit_info = __le32_to_cpu(ev->mem_reqs[i].num_unit_info);
+
+		if (num_unit_info) {
+			if (num_unit_info & NUM_UNITS_IS_NUM_PEERS)
+				/* number of units to allocate is number of
+				 * peers, 1 extra for self peer on target */
+				/* this needs to be tied, host and target
+				 * can get out of sync */
+				num_units = TARGET_NUM_PEERS + 1;
+			if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS)
+				num_units = TARGET_NUM_VDEVS + 1;
+		}
+
+		ath10k_dbg(ATH10K_DBG_WMI,
+			   "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
+			   req_id,
+			   __le32_to_cpu(ev->mem_reqs[i].num_units),
+			   num_unit_info,
+			   unit_size,
+			   num_units);
+
+		ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
+						unit_size);
+		if (ret)
+			return;
 	}
 
+exit:
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi event service ready sw_ver 0x%08x abi_ver %u phy_cap 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_msc 0x%08x sys_cap_info 0x%08x mem_reqs %u num_rf_chains %u\n",
 		   __le32_to_cpu(ev->sw_version),
@@ -1654,6 +1726,17 @@ int ath10k_wmi_attach(struct ath10k *ar)
 
 void ath10k_wmi_detach(struct ath10k *ar)
 {
+	int i;
+
+	/* free the host memory chunks requested by firmware */
+	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
+		dma_free_coherent(ar->dev,
+				  ar->wmi.mem_chunks[i].len,
+				  ar->wmi.mem_chunks[i].vaddr,
+				  ar->wmi.mem_chunks[i].paddr);
+	}
+
+	ar->wmi.num_mem_chunks = 0;
 }
 
 int ath10k_wmi_connect_htc_service(struct ath10k *ar)
@@ -1793,7 +1876,8 @@ int ath10k_wmi_cmd_init(struct ath10k *ar)
 	struct wmi_init_cmd *cmd;
 	struct sk_buff *buf;
 	struct wmi_resource_config config = {};
-	u32 val;
+	u32 len, val;
+	int i;
 
 	config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
 	config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS + TARGET_NUM_VDEVS);
@@ -1846,12 +1930,40 @@ int ath10k_wmi_cmd_init(struct ath10k *ar)
 	config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
 	config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
 
-	buf = ath10k_wmi_alloc_skb(sizeof(*cmd));
+	len = sizeof(*cmd) +
+	      (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
+
+	buf = ath10k_wmi_alloc_skb(len);
 	if (!buf)
 		return -ENOMEM;
 
 	cmd = (struct wmi_init_cmd *)buf->data;
-	cmd->num_host_mem_chunks = 0;
+
+	if (ar->wmi.num_mem_chunks == 0) {
+		cmd->num_host_mem_chunks = 0;
+		goto out;
+	}
+
+	ath10k_dbg(ATH10K_DBG_WMI, "wmi sending %d memory chunks info.\n",
+		   __cpu_to_le32(ar->wmi.num_mem_chunks));
+
+	cmd->num_host_mem_chunks = __cpu_to_le32(ar->wmi.num_mem_chunks);
+
+	for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
+		cmd->host_mem_chunks[i].ptr =
+			__cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
+		cmd->host_mem_chunks[i].size =
+			__cpu_to_le32(ar->wmi.mem_chunks[i].len);
+		cmd->host_mem_chunks[i].req_id =
+			__cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
+
+		ath10k_dbg(ATH10K_DBG_WMI,
+			   "wmi chunk %d len %d requested, addr 0x%x\n",
+			   i,
+			   cmd->host_mem_chunks[i].size,
+			   cmd->host_mem_chunks[i].ptr);
+	}
+out:
 	memcpy(&cmd->resource_config, &config, sizeof(config));
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi init\n");
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index d309b8b..3825937 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -1377,6 +1377,9 @@ struct wmi_resource_config {
 	__le32 max_frag_entries;
 } __packed;
 
+#define NUM_UNITS_IS_NUM_VDEVS   0x1
+#define NUM_UNITS_IS_NUM_PEERS   0x2
+
 /* strucutre describing host memory chunk. */
 struct host_memory_chunk {
 	/* id of the request that is passed up in service ready */
-- 
1.7.10


^ permalink raw reply related

* [PATCH 02/13] ath10k: add wmi_10x_<cmd/event> definitions
From: Bartosz Markowski @ 2013-09-25  9:38 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski
In-Reply-To: <1380101891-18312-1-git-send-email-bartosz.markowski@tieto.com>

Introduce the cmd and events definitions for 10.X FW API
and make up the wmi_10x_cmd_map. This is the core of
host-firmware WMI interface for 10.X FW branch.

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
---
 drivers/net/wireless/ath/ath10k/wmi.c |  132 +++++++++++++++++++-
 drivers/net/wireless/ath/ath10k/wmi.h |  215 ++++++++++++++++++++++++++++++++-
 2 files changed, 344 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 9cf426f..dd490b4 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -146,7 +146,133 @@ static struct wmi_cmd_map wmi_cmd_map = {
 	.wmi_gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
 };
 
-/* TODO: 10.X WMI cmd track */
+/* 10.X WMI cmd track */
+static struct wmi_cmd_map wmi_10x_cmd_map = {
+	.wmi_init_cmdid = WMI_10X_INIT_CMDID,
+	.wmi_start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
+	.wmi_stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
+	.wmi_scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
+	.wmi_scan_sch_prio_tbl_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
+	.wmi_pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
+	.wmi_pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
+	.wmi_pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
+	.wmi_pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
+	.wmi_pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
+	.wmi_pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
+	.wmi_pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
+	.wmi_pdev_set_dscp_tid_map_cmdid =
+				WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
+	.wmi_pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
+	.wmi_pdev_green_ap_ps_enable_cmdid =
+				WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
+	.wmi_pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
+	.wmi_pdev_set_base_macaddr_cmdid =
+				WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
+	.wmi_vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
+	.wmi_vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
+	.wmi_vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
+	.wmi_vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
+	.wmi_vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
+	.wmi_vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
+	.wmi_vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
+	.wmi_vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
+	.wmi_vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
+	.wmi_peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
+	.wmi_peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
+	.wmi_peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
+	.wmi_peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
+	.wmi_peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
+	.wmi_peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
+	.wmi_peer_remove_wds_entry_cmdid =
+				WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
+	.wmi_peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
+	.wmi_bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
+	.wmi_pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
+	.wmi_bcn_tmpl_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
+	.wmi_prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
+	.wmi_mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
+	.wmi_prb_tmpl_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
+	.wmi_addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
+	.wmi_addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
+	.wmi_delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
+	.wmi_addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
+	.wmi_send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
+	.wmi_sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
+	.wmi_sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
+	.wmi_sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
+	.wmi_pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
+	.wmi_pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
+	.wmi_roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
+	.wmi_roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
+	.wmi_roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
+	.wmi_roam_scan_rssi_change_threshold
+				= WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
+	.wmi_roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
+	.wmi_ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
+	.wmi_ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
+	.wmi_ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
+	.wmi_p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
+	.wmi_p2p_dev_set_discoverability =
+					WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
+	.wmi_p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
+	.wmi_p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
+	.wmi_p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_ap_ps_peer_param_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_peer_rate_retry_sched_cmdid =
+					WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
+	.wmi_wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
+	.wmi_wlan_profile_set_hist_intvl_cmdid =
+				WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
+	.wmi_wlan_profile_get_profile_data_cmdid =
+				WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
+	.wmi_wlan_profile_enable_profile_id_cmdid =
+				WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
+	.wmi_wlan_profile_list_profile_id_cmdid =
+				WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
+	.wmi_pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
+	.wmi_pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
+	.wmi_add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
+	.wmi_rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
+	.wmi_wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
+	.wmi_wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
+	.wmi_wow_enable_disable_wake_event_cmdid =
+				WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
+	.wmi_wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
+	.wmi_wow_hostwakeup_from_sleep_cmdid =
+				WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
+	.wmi_rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
+	.wmi_rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
+	.wmi_vdev_spectral_scan_configure_cmdid =
+				WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
+	.wmi_vdev_spectral_scan_enable_cmdid =
+				WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
+	.wmi_request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
+	.wmi_set_arp_ns_offload_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_network_list_offload_config_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_gtk_offload_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_csa_offload_enable_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_csa_offload_chanswitch_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_chatter_set_mode_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_peer_tid_addba_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_peer_tid_delba_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_sta_dtim_ps_method_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_sta_uapsd_auto_trig_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_sta_keepalive_cmd = WMI_CMD_UNDEFINED,
+	.wmi_echo_cmdid = WMI_10X_ECHO_CMDID,
+	.wmi_pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
+	.wmi_dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
+	.wmi_pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
+	.wmi_pdev_ftm_intg_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_vdev_set_keepalive_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_vdev_get_keepalive_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_force_fw_hang_cmdid = WMI_CMD_UNDEFINED,
+	.wmi_gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
+	.wmi_gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
+};
 
 int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
 {
@@ -1310,13 +1436,15 @@ static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
 /* WMI Initialization functions */
 int ath10k_wmi_attach(struct ath10k *ar)
 {
-	int ret = 0;
+	int ret;
 
 	if (test_bit(ATH10K_FW_FEATURE_10X, ar->fw_features)) {
 		ath10k_warn("Firmware 10.X is not yet supported\n");
+		ar->wmi.cmd = &wmi_10x_cmd_map;
 		ret = -ENOTSUPP;
 	} else {
 		ar->wmi.cmd = &wmi_cmd_map;
+		ret = 0;
 	}
 
 	init_completion(&ar->wmi.service_ready);
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 94fc008..c23d070 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -359,7 +359,9 @@ enum wmi_cmd_group {
 #define WMI_CMD_GRP(grp_id) (((grp_id) << 12) | 0x1)
 #define WMI_EVT_GRP_START_ID(grp_id) (((grp_id) << 12) | 0x1)
 
-/* Command IDs and commande events. */
+#define WMI_CMD_UNDEFINED 0
+
+/* Command IDs and command events for MAIN FW. */
 enum wmi_cmd_id {
 	WMI_INIT_CMDID = 0x1,
 
@@ -600,6 +602,217 @@ enum wmi_event_id {
 	WMI_GPIO_INPUT_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_GPIO),
 };
 
+/* Command IDs and command events for 10.X firmware */
+enum wmi_10x_cmd_id {
+	WMI_10X_START_CMDID = 0x9000,
+	WMI_10X_END_CMDID = 0x9FFF,
+
+	/* initialize the wlan sub system */
+	WMI_10X_INIT_CMDID,
+
+	/* Scan specific commands */
+
+	WMI_10X_START_SCAN_CMDID = WMI_10X_START_CMDID,
+	WMI_10X_STOP_SCAN_CMDID,
+	WMI_10X_SCAN_CHAN_LIST_CMDID,
+	WMI_10X_ECHO_CMDID,
+
+	/* PDEV(physical device) specific commands */
+	WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
+	WMI_10X_PDEV_SET_CHANNEL_CMDID,
+	WMI_10X_PDEV_SET_PARAM_CMDID,
+	WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
+	WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
+	WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
+	WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
+	WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
+	WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
+	WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
+	WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
+	WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
+	WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
+
+	/* VDEV(virtual device) specific commands */
+	WMI_10X_VDEV_CREATE_CMDID,
+	WMI_10X_VDEV_DELETE_CMDID,
+	WMI_10X_VDEV_START_REQUEST_CMDID,
+	WMI_10X_VDEV_RESTART_REQUEST_CMDID,
+	WMI_10X_VDEV_UP_CMDID,
+	WMI_10X_VDEV_STOP_CMDID,
+	WMI_10X_VDEV_DOWN_CMDID,
+	WMI_10X_VDEV_STANDBY_RESPONSE_CMDID,
+	WMI_10X_VDEV_RESUME_RESPONSE_CMDID,
+	WMI_10X_VDEV_SET_PARAM_CMDID,
+	WMI_10X_VDEV_INSTALL_KEY_CMDID,
+
+	/* peer specific commands */
+	WMI_10X_PEER_CREATE_CMDID,
+	WMI_10X_PEER_DELETE_CMDID,
+	WMI_10X_PEER_FLUSH_TIDS_CMDID,
+	WMI_10X_PEER_SET_PARAM_CMDID,
+	WMI_10X_PEER_ASSOC_CMDID,
+	WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
+	WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
+	WMI_10X_PEER_MCAST_GROUP_CMDID,
+
+	/* beacon/management specific commands */
+
+	WMI_10X_BCN_TX_CMDID,
+	WMI_10X_BCN_PRB_TMPL_CMDID,
+	WMI_10X_BCN_FILTER_RX_CMDID,
+	WMI_10X_PRB_REQ_FILTER_RX_CMDID,
+	WMI_10X_MGMT_TX_CMDID,
+
+	/* commands to directly control ba negotiation directly from host. */
+	WMI_10X_ADDBA_CLEAR_RESP_CMDID,
+	WMI_10X_ADDBA_SEND_CMDID,
+	WMI_10X_ADDBA_STATUS_CMDID,
+	WMI_10X_DELBA_SEND_CMDID,
+	WMI_10X_ADDBA_SET_RESP_CMDID,
+	WMI_10X_SEND_SINGLEAMSDU_CMDID,
+
+	/* Station power save specific config */
+	WMI_10X_STA_POWERSAVE_MODE_CMDID,
+	WMI_10X_STA_POWERSAVE_PARAM_CMDID,
+	WMI_10X_STA_MIMO_PS_MODE_CMDID,
+
+	/* set debug log config */
+	WMI_10X_DBGLOG_CFG_CMDID,
+
+	/* DFS-specific commands */
+	WMI_10X_PDEV_DFS_ENABLE_CMDID,
+	WMI_10X_PDEV_DFS_DISABLE_CMDID,
+
+	/* QVIT specific command id */
+	WMI_10X_PDEV_QVIT_CMDID,
+
+	/* Offload Scan and Roaming related  commands */
+	WMI_10X_ROAM_SCAN_MODE,
+	WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
+	WMI_10X_ROAM_SCAN_PERIOD,
+	WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
+	WMI_10X_ROAM_AP_PROFILE,
+	WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
+	WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
+	WMI_10X_OFL_SCAN_PERIOD,
+
+	/* P2P specific commands */
+	WMI_10X_P2P_DEV_SET_DEVICE_INFO,
+	WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
+	WMI_10X_P2P_GO_SET_BEACON_IE,
+	WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
+
+	/* AP power save specific config */
+	WMI_10X_AP_PS_PEER_PARAM_CMDID,
+	WMI_10X_AP_PS_PEER_UAPSD_COEX_CMDID,
+
+	/* Rate-control specific commands */
+	WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
+
+	/* WLAN Profiling commands. */
+	WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
+	WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
+	WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
+	WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
+	WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
+
+	/* Suspend resume command Ids */
+	WMI_10X_PDEV_SUSPEND_CMDID,
+	WMI_10X_PDEV_RESUME_CMDID,
+
+	/* Beacon filter commands */
+	WMI_10X_ADD_BCN_FILTER_CMDID,
+	WMI_10X_RMV_BCN_FILTER_CMDID,
+
+	/* WOW Specific WMI commands*/
+	WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
+	WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
+	WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
+	WMI_10X_WOW_ENABLE_CMDID,
+	WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
+
+	/* RTT measurement related cmd */
+	WMI_10X_RTT_MEASREQ_CMDID,
+	WMI_10X_RTT_TSF_CMDID,
+
+	/* transmit beacon by value */
+	WMI_10X_PDEV_SEND_BCN_CMDID,
+
+	/* F/W stats */
+	WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
+	WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
+	WMI_10X_REQUEST_STATS_CMDID,
+
+	/* GPIO Configuration */
+	WMI_10X_GPIO_CONFIG_CMDID,
+	WMI_10X_GPIO_OUTPUT_CMDID,
+
+	WMI_10X_PDEV_UTF_CMDID = WMI_10X_END_CMDID - 1,
+};
+
+enum wmi_10x_event_id {
+	WMI_10X_SERVICE_READY_EVENTID = 0x8000,
+	WMI_10X_READY_EVENTID,
+	WMI_10X_START_EVENTID = 0x9000,
+	WMI_10X_END_EVENTID = 0x9FFF,
+
+	/* Scan specific events */
+	WMI_10X_SCAN_EVENTID = WMI_10X_START_EVENTID,
+	WMI_10X_ECHO_EVENTID,
+	WMI_10X_DEBUG_MESG_EVENTID,
+	WMI_10X_UPDATE_STATS_EVENTID,
+
+	/* Instantaneous RSSI event */
+	WMI_10X_INST_RSSI_STATS_EVENTID,
+
+	/* VDEV specific events */
+	WMI_10X_VDEV_START_RESP_EVENTID,
+	WMI_10X_VDEV_STANDBY_REQ_EVENTID,
+	WMI_10X_VDEV_RESUME_REQ_EVENTID,
+	WMI_10X_VDEV_STOPPED_EVENTID,
+
+	/* peer  specific events */
+	WMI_10X_PEER_STA_KICKOUT_EVENTID,
+
+	/* beacon/mgmt specific events */
+	WMI_10X_HOST_SWBA_EVENTID,
+	WMI_10X_TBTTOFFSET_UPDATE_EVENTID,
+	WMI_10X_MGMT_RX_EVENTID,
+
+	/* Channel stats event */
+	WMI_10X_CHAN_INFO_EVENTID,
+
+	/* PHY Error specific WMI event */
+	WMI_10X_PHYERR_EVENTID,
+
+	/* Roam event to trigger roaming on host */
+	WMI_10X_ROAM_EVENTID,
+
+	/* matching AP found from list of profiles */
+	WMI_10X_PROFILE_MATCH,
+
+	/* debug print message used for tracing FW code while debugging */
+	WMI_10X_DEBUG_PRINT_EVENTID,
+	/* VI spoecific event */
+	WMI_10X_PDEV_QVIT_EVENTID,
+	/* FW code profile data in response to profile request */
+	WMI_10X_WLAN_PROFILE_DATA_EVENTID,
+
+	/*RTT related event ID*/
+	WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID,
+	WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID,
+	WMI_10X_RTT_ERROR_REPORT_EVENTID,
+
+	WMI_10X_WOW_WAKEUP_HOST_EVENTID,
+	WMI_10X_DCS_INTERFERENCE_EVENTID,
+
+	/* TPC config for the current operating channel */
+	WMI_10X_PDEV_TPC_CONFIG_EVENTID,
+
+	WMI_10X_GPIO_INPUT_EVENTID,
+	WMI_10X_PDEV_UTF_EVENTID = WMI_10X_END_EVENTID-1,
+};
+
 enum wmi_phy_mode {
 	MODE_11A        = 0,   /* 11a Mode */
 	MODE_11G        = 1,   /* 11b/g Mode */
-- 
1.7.10


^ permalink raw reply related

* [PATCH 03/13] ath10k: warn if give WMI command is not supported
From: Bartosz Markowski @ 2013-09-25  9:38 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski
In-Reply-To: <1380101891-18312-1-git-send-email-bartosz.markowski@tieto.com>

This will show and make it easier to track the API
differences in the new AP firmware.

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
---
 drivers/net/wireless/ath/ath10k/wmi.c |    5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index dd490b4..ed137b8 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -399,6 +399,11 @@ static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb,
 {
 	int ret = -EINVAL;
 
+	if (cmd_id == WMI_CMD_UNDEFINED) {
+		ath10k_warn("command not supported by given firmware\n");
+		return ret;
+	}
+
 	wait_event_timeout(ar->wmi.tx_credits_wq, ({
 		/* try to send pending beacons first. they take priority */
 		ath10k_wmi_tx_beacons_nowait(ar);
-- 
1.7.10


^ permalink raw reply related

* [PATCH 01/13] ath10k: introduce dynamic WMI structures
From: Bartosz Markowski @ 2013-09-25  9:37 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski
In-Reply-To: <1380101891-18312-1-git-send-email-bartosz.markowski@tieto.com>

This is the initial framework to implement dynamic
WMI API in order to support new firmware (from so
called 10.X branch)

The realization is to have a static WMI cmd map for
each of the firmwares, registered upom wmi init.

This patch creates such map for MAIN FW, updates
wmi_cmd_send() calls to take as a parameter
the map value instead of direct WMI enum.

As soon as complete 10.X API will be on place,
we will introduce the FW IE mechanics to dynamicaly
identify which FW is being used and based on that
we will use correct map, API, structures, etc.

Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com>
---
 drivers/net/wireless/ath/ath10k/core.h |    4 +
 drivers/net/wireless/ath/ath10k/wmi.c  |  246 +++++++++++++++++++++++++++-----
 drivers/net/wireless/ath/ath10k/wmi.h  |  112 +++++++++++++++
 3 files changed, 323 insertions(+), 39 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 292ad45..0db08ea 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -107,6 +107,7 @@ struct ath10k_wmi {
 	struct completion service_ready;
 	struct completion unified_ready;
 	wait_queue_head_t tx_credits_wq;
+	struct wmi_cmd_map *cmd;
 };
 
 struct ath10k_peer_stat {
@@ -268,6 +269,9 @@ enum ath10k_fw_features {
 	/* wmi_mgmt_rx_hdr contains extra RSSI information */
 	ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0,
 
+	/* firmware from 10X branch */
+	ATH10K_FW_FEATURE_10X = 1,
+
 	/* keep last */
 	ATH10K_FW_FEATURE_COUNT,
 };
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 6803ead..9cf426f 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -23,6 +23,131 @@
 #include "wmi.h"
 #include "mac.h"
 
+/* MAIN WMI cmd track */
+static struct wmi_cmd_map wmi_cmd_map = {
+	.wmi_init_cmdid = WMI_INIT_CMDID,
+	.wmi_start_scan_cmdid = WMI_START_SCAN_CMDID,
+	.wmi_stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
+	.wmi_scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
+	.wmi_scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
+	.wmi_pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
+	.wmi_pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
+	.wmi_pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
+	.wmi_pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
+	.wmi_pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
+	.wmi_pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
+	.wmi_pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
+	.wmi_pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
+	.wmi_pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
+	.wmi_pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
+	.wmi_pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
+	.wmi_pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
+	.wmi_pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
+	.wmi_vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
+	.wmi_vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
+	.wmi_vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
+	.wmi_vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
+	.wmi_vdev_up_cmdid = WMI_VDEV_UP_CMDID,
+	.wmi_vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
+	.wmi_vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
+	.wmi_vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
+	.wmi_vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
+	.wmi_peer_create_cmdid = WMI_PEER_CREATE_CMDID,
+	.wmi_peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
+	.wmi_peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
+	.wmi_peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
+	.wmi_peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
+	.wmi_peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
+	.wmi_peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
+	.wmi_peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
+	.wmi_bcn_tx_cmdid = WMI_BCN_TX_CMDID,
+	.wmi_pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
+	.wmi_bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
+	.wmi_bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
+	.wmi_prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
+	.wmi_mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
+	.wmi_prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
+	.wmi_addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
+	.wmi_addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
+	.wmi_addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
+	.wmi_delba_send_cmdid = WMI_DELBA_SEND_CMDID,
+	.wmi_addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
+	.wmi_send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
+	.wmi_sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
+	.wmi_sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
+	.wmi_sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
+	.wmi_pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
+	.wmi_pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
+	.wmi_roam_scan_mode = WMI_ROAM_SCAN_MODE,
+	.wmi_roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
+	.wmi_roam_scan_period = WMI_ROAM_SCAN_PERIOD,
+	.wmi_roam_scan_rssi_change_threshold =
+					WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
+	.wmi_roam_ap_profile = WMI_ROAM_AP_PROFILE,
+	.wmi_ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
+	.wmi_ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
+	.wmi_ofl_scan_period = WMI_OFL_SCAN_PERIOD,
+	.wmi_p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
+	.wmi_p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
+	.wmi_p2p_go_set_beacon_ie = WMI_P2P_DEV_SET_DISCOVERABILITY,
+	.wmi_p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
+	.wmi_p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
+	.wmi_ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
+	.wmi_ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
+	.wmi_peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
+	.wmi_wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
+	.wmi_wlan_profile_set_hist_intvl_cmdid =
+					 WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
+	.wmi_wlan_profile_get_profile_data_cmdid =
+				 WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
+	.wmi_wlan_profile_enable_profile_id_cmdid =
+				 WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
+	.wmi_wlan_profile_list_profile_id_cmdid =
+				 WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
+	.wmi_pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
+	.wmi_pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
+	.wmi_add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
+	.wmi_rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
+	.wmi_wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
+	.wmi_wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
+	.wmi_wow_enable_disable_wake_event_cmdid =
+				 WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
+	.wmi_wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
+	.wmi_wow_hostwakeup_from_sleep_cmdid =
+				 WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
+	.wmi_rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
+	.wmi_rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
+	.wmi_vdev_spectral_scan_configure_cmdid =
+				 WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
+	.wmi_vdev_spectral_scan_enable_cmdid =
+				 WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
+	.wmi_request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
+	.wmi_set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
+	.wmi_network_list_offload_config_cmdid =
+				 WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
+	.wmi_gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
+	.wmi_csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
+	.wmi_csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
+	.wmi_chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
+	.wmi_peer_tid_addba_cmdid = WMI_CHATTER_SET_MODE_CMDID,
+	.wmi_peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
+	.wmi_sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
+	.wmi_sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
+	.wmi_sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
+	.wmi_echo_cmdid = WMI_ECHO_CMDID,
+	.wmi_pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
+	.wmi_dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
+	.wmi_pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
+	.wmi_pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
+	.wmi_vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
+	.wmi_vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
+	.wmi_force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
+	.wmi_gpio_config_cmdid = WMI_FORCE_FW_HANG_CMDID,
+	.wmi_gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
+};
+
+/* TODO: 10.X WMI cmd track */
+
 int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
 {
 	int ret;
@@ -64,7 +189,7 @@ static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
 }
 
 static int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
-				      enum wmi_cmd_id cmd_id)
+				      u32 cmd_id)
 {
 	struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
 	struct wmi_cmd_hdr *cmd_hdr;
@@ -144,7 +269,7 @@ static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
 }
 
 static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb,
-			       enum wmi_cmd_id cmd_id)
+			       u32 cmd_id)
 {
 	int ret = -EINVAL;
 
@@ -1055,7 +1180,7 @@ static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb)
 	return 0;
 }
 
-static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
+static void ath10k_wmi_main_process_rx(struct ath10k *ar, struct sk_buff *skb)
 {
 	struct wmi_cmd_hdr *cmd_hdr;
 	enum wmi_event_id id;
@@ -1174,14 +1299,31 @@ static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
 	dev_kfree_skb(skb);
 }
 
+static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
+{
+	if (test_bit(ATH10K_FW_FEATURE_10X, ar->fw_features))
+		ath10k_warn("Firmware 10.X is not yet supported\n");
+	else
+		ath10k_wmi_main_process_rx(ar, skb);
+}
+
 /* WMI Initialization functions */
 int ath10k_wmi_attach(struct ath10k *ar)
 {
+	int ret = 0;
+
+	if (test_bit(ATH10K_FW_FEATURE_10X, ar->fw_features)) {
+		ath10k_warn("Firmware 10.X is not yet supported\n");
+		ret = -ENOTSUPP;
+	} else {
+		ar->wmi.cmd = &wmi_cmd_map;
+	}
+
 	init_completion(&ar->wmi.service_ready);
 	init_completion(&ar->wmi.unified_ready);
 	init_waitqueue_head(&ar->wmi.tx_credits_wq);
 
-	return 0;
+	return ret;
 }
 
 void ath10k_wmi_detach(struct ath10k *ar)
@@ -1237,7 +1379,8 @@ int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g,
 		   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
 		   rd, rd2g, rd5g, ctl2g, ctl5g);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_REGDOMAIN_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_pdev_set_regdomain_cmdid);
 }
 
 int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
@@ -1267,7 +1410,8 @@ int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
 		   "wmi set channel mode %d freq %d\n",
 		   arg->mode, arg->freq);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_CHANNEL_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_pdev_set_channel_cmdid);
 }
 
 int ath10k_wmi_pdev_suspend_target(struct ath10k *ar)
@@ -1282,7 +1426,8 @@ int ath10k_wmi_pdev_suspend_target(struct ath10k *ar)
 	cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
 	cmd->suspend_opt = WMI_PDEV_SUSPEND;
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SUSPEND_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_pdev_suspend_cmdid);
 }
 
 int ath10k_wmi_pdev_resume_target(struct ath10k *ar)
@@ -1293,7 +1438,8 @@ int ath10k_wmi_pdev_resume_target(struct ath10k *ar)
 	if (skb == NULL)
 		return -ENOMEM;
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_RESUME_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_pdev_resume_cmdid);
 }
 
 int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id,
@@ -1312,7 +1458,8 @@ int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id,
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
 		   id, value);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_PARAM_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_pdev_set_param_cmdid);
 }
 
 int ath10k_wmi_cmd_init(struct ath10k *ar)
@@ -1382,7 +1529,7 @@ int ath10k_wmi_cmd_init(struct ath10k *ar)
 	memcpy(&cmd->resource_config, &config, sizeof(config));
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi init\n");
-	return ath10k_wmi_cmd_send(ar, buf, WMI_INIT_CMDID);
+	return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->wmi_init_cmdid);
 }
 
 static int ath10k_wmi_start_scan_calc_len(const struct wmi_start_scan_arg *arg)
@@ -1543,7 +1690,8 @@ int ath10k_wmi_start_scan(struct ath10k *ar,
 	}
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi start scan\n");
-	return ath10k_wmi_cmd_send(ar, skb, WMI_START_SCAN_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_start_scan_cmdid);
 }
 
 void ath10k_wmi_start_scan_init(struct ath10k *ar,
@@ -1603,7 +1751,8 @@ int ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
 		   arg->req_id, arg->req_type, arg->u.scan_id);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_STOP_SCAN_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_stop_scan_cmdid);
 }
 
 int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
@@ -1628,7 +1777,8 @@ int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
 		   "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
 		   vdev_id, type, subtype, macaddr);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_CREATE_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_vdev_create_cmdid);
 }
 
 int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
@@ -1646,20 +1796,21 @@ int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "WMI vdev delete id %d\n", vdev_id);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_DELETE_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_vdev_delete_cmdid);
 }
 
 static int ath10k_wmi_vdev_start_restart(struct ath10k *ar,
 				const struct wmi_vdev_start_request_arg *arg,
-				enum wmi_cmd_id cmd_id)
+				u32 cmd_id)
 {
 	struct wmi_vdev_start_request_cmd *cmd;
 	struct sk_buff *skb;
 	const char *cmdname;
 	u32 flags = 0;
 
-	if (cmd_id != WMI_VDEV_START_REQUEST_CMDID &&
-	    cmd_id != WMI_VDEV_RESTART_REQUEST_CMDID)
+	if (cmd_id != ar->wmi.cmd->wmi_vdev_start_request_cmdid &&
+	    cmd_id != ar->wmi.cmd->wmi_vdev_restart_request_cmdid)
 		return -EINVAL;
 	if (WARN_ON(arg->ssid && arg->ssid_len == 0))
 		return -EINVAL;
@@ -1668,9 +1819,9 @@ static int ath10k_wmi_vdev_start_restart(struct ath10k *ar,
 	if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
 		return -EINVAL;
 
-	if (cmd_id == WMI_VDEV_START_REQUEST_CMDID)
+	if (cmd_id == ar->wmi.cmd->wmi_vdev_start_request_cmdid)
 		cmdname = "start";
-	else if (cmd_id == WMI_VDEV_RESTART_REQUEST_CMDID)
+	else if (cmd_id == ar->wmi.cmd->wmi_vdev_restart_request_cmdid)
 		cmdname = "restart";
 	else
 		return -EINVAL; /* should not happen, we already check cmd_id */
@@ -1722,14 +1873,14 @@ int ath10k_wmi_vdev_start(struct ath10k *ar,
 			  const struct wmi_vdev_start_request_arg *arg)
 {
 	return ath10k_wmi_vdev_start_restart(ar, arg,
-					     WMI_VDEV_START_REQUEST_CMDID);
+				ar->wmi.cmd->wmi_vdev_start_request_cmdid);
 }
 
 int ath10k_wmi_vdev_restart(struct ath10k *ar,
 		     const struct wmi_vdev_start_request_arg *arg)
 {
 	return ath10k_wmi_vdev_start_restart(ar, arg,
-					     WMI_VDEV_RESTART_REQUEST_CMDID);
+				ar->wmi.cmd->wmi_vdev_restart_request_cmdid);
 }
 
 int ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
@@ -1746,7 +1897,8 @@ int ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_STOP_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_vdev_stop_cmdid);
 }
 
 int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
@@ -1767,7 +1919,7 @@ int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
 		   "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
 		   vdev_id, aid, bssid);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_UP_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->wmi_vdev_up_cmdid);
 }
 
 int ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
@@ -1785,7 +1937,8 @@ int ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi mgmt vdev down id 0x%x\n", vdev_id);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_DOWN_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_vdev_down_cmdid);
 }
 
 int ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id,
@@ -1807,7 +1960,8 @@ int ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id,
 		   "wmi vdev id 0x%x set param %d value %d\n",
 		   vdev_id, param_id, param_value);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_SET_PARAM_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_vdev_set_param_cmdid);
 }
 
 int ath10k_wmi_vdev_install_key(struct ath10k *ar,
@@ -1842,7 +1996,8 @@ int ath10k_wmi_vdev_install_key(struct ath10k *ar,
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi vdev install key idx %d cipher %d len %d\n",
 		   arg->key_idx, arg->key_cipher, arg->key_len);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_INSTALL_KEY_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_vdev_install_key_cmdid);
 }
 
 int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
@@ -1862,7 +2017,8 @@ int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi peer create vdev_id %d peer_addr %pM\n",
 		   vdev_id, peer_addr);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_CREATE_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_peer_create_cmdid);
 }
 
 int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
@@ -1882,7 +2038,8 @@ int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi peer delete vdev_id %d peer_addr %pM\n",
 		   vdev_id, peer_addr);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_DELETE_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_peer_delete_cmdid);
 }
 
 int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
@@ -1903,7 +2060,8 @@ int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
 		   vdev_id, peer_addr, tid_bitmap);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_FLUSH_TIDS_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_peer_flush_tids_cmdid);
 }
 
 int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id,
@@ -1927,7 +2085,8 @@ int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id,
 		   "wmi vdev %d peer 0x%pM set param %d value %d\n",
 		   vdev_id, peer_addr, param_id, param_value);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_SET_PARAM_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_peer_set_param_cmdid);
 }
 
 int ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
@@ -1948,7 +2107,8 @@ int ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
 		   "wmi set powersave id 0x%x mode %d\n",
 		   vdev_id, psmode);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_STA_POWERSAVE_MODE_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_sta_powersave_mode_cmdid);
 }
 
 int ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
@@ -1970,7 +2130,8 @@ int ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi sta ps param vdev_id 0x%x param %d value %d\n",
 		   vdev_id, param_id, value);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_STA_POWERSAVE_PARAM_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_sta_powersave_param_cmdid);
 }
 
 int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
@@ -1996,7 +2157,8 @@ int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
 		   "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
 		   vdev_id, param_id, value, mac);
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_AP_PS_PEER_PARAM_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_ap_ps_peer_param_cmdid);
 }
 
 int ath10k_wmi_scan_chan_list(struct ath10k *ar,
@@ -2049,7 +2211,8 @@ int ath10k_wmi_scan_chan_list(struct ath10k *ar,
 		ci->flags            |= __cpu_to_le32(flags);
 	}
 
-	return ath10k_wmi_cmd_send(ar, skb, WMI_SCAN_CHAN_LIST_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_scan_chan_list_cmdid);
 }
 
 int ath10k_wmi_peer_assoc(struct ath10k *ar,
@@ -2108,7 +2271,8 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar,
 	ath10k_dbg(ATH10K_DBG_WMI,
 		   "wmi peer assoc vdev %d addr %pM\n",
 		   arg->vdev_id, arg->addr);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_ASSOC_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_peer_assoc_cmdid);
 }
 
 int ath10k_wmi_beacon_send_nowait(struct ath10k *ar,
@@ -2128,7 +2292,8 @@ int ath10k_wmi_beacon_send_nowait(struct ath10k *ar,
 	cmd->hdr.bcn_len  = __cpu_to_le32(arg->bcn_len);
 	memcpy(cmd->bcn, arg->bcn, arg->bcn_len);
 
-	return ath10k_wmi_cmd_send_nowait(ar, skb, WMI_BCN_TX_CMDID);
+	return ath10k_wmi_cmd_send_nowait(ar, skb,
+					  ar->wmi.cmd->wmi_bcn_tx_cmdid);
 }
 
 static void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params,
@@ -2159,7 +2324,8 @@ int ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
 	ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
-	return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_WMM_PARAMS_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_pdev_set_wmm_params_cmdid);
 }
 
 int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
@@ -2175,7 +2341,8 @@ int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
 	cmd->stats_id = __cpu_to_le32(stats_id);
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi request stats %d\n", (int)stats_id);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_REQUEST_STATS_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_request_stats_cmdid);
 }
 
 int ath10k_wmi_force_fw_hang(struct ath10k *ar,
@@ -2194,5 +2361,6 @@ int ath10k_wmi_force_fw_hang(struct ath10k *ar,
 
 	ath10k_dbg(ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
 		   type, delay_ms);
-	return ath10k_wmi_cmd_send(ar, skb, WMI_FORCE_FW_HANG_CMDID);
+	return ath10k_wmi_cmd_send(ar, skb,
+				   ar->wmi.cmd->wmi_force_fw_hang_cmdid);
 }
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 2c52c23..94fc008 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -208,6 +208,118 @@ struct wmi_mac_addr {
 	(c_macaddr)[5] = (((pwmi_mac_addr)->word1) >> 8) & 0xff; \
 	} while (0)
 
+struct wmi_cmd_map {
+	u32 wmi_init_cmdid;
+	u32 wmi_start_scan_cmdid;
+	u32 wmi_stop_scan_cmdid;
+	u32 wmi_scan_chan_list_cmdid;
+	u32 wmi_scan_sch_prio_tbl_cmdid;
+	u32 wmi_pdev_set_regdomain_cmdid;
+	u32 wmi_pdev_set_channel_cmdid;
+	u32 wmi_pdev_set_param_cmdid;
+	u32 wmi_pdev_pktlog_enable_cmdid;
+	u32 wmi_pdev_pktlog_disable_cmdid;
+	u32 wmi_pdev_set_wmm_params_cmdid;
+	u32 wmi_pdev_set_ht_cap_ie_cmdid;
+	u32 wmi_pdev_set_vht_cap_ie_cmdid;
+	u32 wmi_pdev_set_dscp_tid_map_cmdid;
+	u32 wmi_pdev_set_quiet_mode_cmdid;
+	u32 wmi_pdev_green_ap_ps_enable_cmdid;
+	u32 wmi_pdev_get_tpc_config_cmdid;
+	u32 wmi_pdev_set_base_macaddr_cmdid;
+	u32 wmi_vdev_create_cmdid;
+	u32 wmi_vdev_delete_cmdid;
+	u32 wmi_vdev_start_request_cmdid;
+	u32 wmi_vdev_restart_request_cmdid;
+	u32 wmi_vdev_up_cmdid;
+	u32 wmi_vdev_stop_cmdid;
+	u32 wmi_vdev_down_cmdid;
+	u32 wmi_vdev_set_param_cmdid;
+	u32 wmi_vdev_install_key_cmdid;
+	u32 wmi_peer_create_cmdid;
+	u32 wmi_peer_delete_cmdid;
+	u32 wmi_peer_flush_tids_cmdid;
+	u32 wmi_peer_set_param_cmdid;
+	u32 wmi_peer_assoc_cmdid;
+	u32 wmi_peer_add_wds_entry_cmdid;
+	u32 wmi_peer_remove_wds_entry_cmdid;
+	u32 wmi_peer_mcast_group_cmdid;
+	u32 wmi_bcn_tx_cmdid;
+	u32 wmi_pdev_send_bcn_cmdid;
+	u32 wmi_bcn_tmpl_cmdid;
+	u32 wmi_bcn_filter_rx_cmdid;
+	u32 wmi_prb_req_filter_rx_cmdid;
+	u32 wmi_mgmt_tx_cmdid;
+	u32 wmi_prb_tmpl_cmdid;
+	u32 wmi_addba_clear_resp_cmdid;
+	u32 wmi_addba_send_cmdid;
+	u32 wmi_addba_status_cmdid;
+	u32 wmi_delba_send_cmdid;
+	u32 wmi_addba_set_resp_cmdid;
+	u32 wmi_send_singleamsdu_cmdid;
+	u32 wmi_sta_powersave_mode_cmdid;
+	u32 wmi_sta_powersave_param_cmdid;
+	u32 wmi_sta_mimo_ps_mode_cmdid;
+	u32 wmi_pdev_dfs_enable_cmdid;
+	u32 wmi_pdev_dfs_disable_cmdid;
+	u32 wmi_roam_scan_mode;
+	u32 wmi_roam_scan_rssi_threshold;
+	u32 wmi_roam_scan_period;
+	u32 wmi_roam_scan_rssi_change_threshold;
+	u32 wmi_roam_ap_profile;
+	u32 wmi_ofl_scan_add_ap_profile;
+	u32 wmi_ofl_scan_remove_ap_profile;
+	u32 wmi_ofl_scan_period;
+	u32 wmi_p2p_dev_set_device_info;
+	u32 wmi_p2p_dev_set_discoverability;
+	u32 wmi_p2p_go_set_beacon_ie;
+	u32 wmi_p2p_go_set_probe_resp_ie;
+	u32 wmi_p2p_set_vendor_ie_data_cmdid;
+	u32 wmi_ap_ps_peer_param_cmdid;
+	u32 wmi_ap_ps_peer_uapsd_coex_cmdid;
+	u32 wmi_peer_rate_retry_sched_cmdid;
+	u32 wmi_wlan_profile_trigger_cmdid;
+	u32 wmi_wlan_profile_set_hist_intvl_cmdid;
+	u32 wmi_wlan_profile_get_profile_data_cmdid;
+	u32 wmi_wlan_profile_enable_profile_id_cmdid;
+	u32 wmi_wlan_profile_list_profile_id_cmdid;
+	u32 wmi_pdev_suspend_cmdid;
+	u32 wmi_pdev_resume_cmdid;
+	u32 wmi_add_bcn_filter_cmdid;
+	u32 wmi_rmv_bcn_filter_cmdid;
+	u32 wmi_wow_add_wake_pattern_cmdid;
+	u32 wmi_wow_del_wake_pattern_cmdid;
+	u32 wmi_wow_enable_disable_wake_event_cmdid;
+	u32 wmi_wow_enable_cmdid;
+	u32 wmi_wow_hostwakeup_from_sleep_cmdid;
+	u32 wmi_rtt_measreq_cmdid;
+	u32 wmi_rtt_tsf_cmdid;
+	u32 wmi_vdev_spectral_scan_configure_cmdid;
+	u32 wmi_vdev_spectral_scan_enable_cmdid;
+	u32 wmi_request_stats_cmdid;
+	u32 wmi_set_arp_ns_offload_cmdid;
+	u32 wmi_network_list_offload_config_cmdid;
+	u32 wmi_gtk_offload_cmdid;
+	u32 wmi_csa_offload_enable_cmdid;
+	u32 wmi_csa_offload_chanswitch_cmdid;
+	u32 wmi_chatter_set_mode_cmdid;
+	u32 wmi_peer_tid_addba_cmdid;
+	u32 wmi_peer_tid_delba_cmdid;
+	u32 wmi_sta_dtim_ps_method_cmdid;
+	u32 wmi_sta_uapsd_auto_trig_cmdid;
+	u32 wmi_sta_keepalive_cmd;
+	u32 wmi_echo_cmdid;
+	u32 wmi_pdev_utf_cmdid;
+	u32 wmi_dbglog_cfg_cmdid;
+	u32 wmi_pdev_qvit_cmdid;
+	u32 wmi_pdev_ftm_intg_cmdid;
+	u32 wmi_vdev_set_keepalive_cmdid;
+	u32 wmi_vdev_get_keepalive_cmdid;
+	u32 wmi_force_fw_hang_cmdid;
+	u32 wmi_gpio_config_cmdid;
+	u32 wmi_gpio_output_cmdid;
+};
+
 /*
  * wmi command groups.
  */
-- 
1.7.10


^ permalink raw reply related

* [PATCH 00/13] ath10k: dual-firmware support (MAIN and 10.X)
From: Bartosz Markowski @ 2013-09-25  9:37 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Bartosz Markowski

This patch-set adds framework for dynamic support of 10.X FW branch.

The major changes covered by this work:
* dynamic WMI structures
* WMI cmd/event definitions from 10.x FW track
* memory host chunks feature
* management frames path over WMI for 10.x
* WMI RX events handling for MAIN and 10.X split
* target config split (LARGE AP feature for 10.x)
* scan start sctructure split
* dynamic VDEV and PDEV parameters structures

TODO:
* add FW IEs to identify (runtime) which FW ath10k deals with

Bartosz Markowski (13):
  ath10k: introduce dynamic WMI structures
  ath10k: add wmi_10x_<cmd/event> definitions
  ath10k: warn if give WMI command is not supported
  ath10k: implement WMI events handling frame for both firmwares
  ath10k: split ath10k_wmi_service_ready_event_rx
  ath10k: drop the fw versioning sanity check
  ath10k: implement host memory chunks
  ath10k: bring back the WMI path for mgmt frames
  ath10k: split wmi_cmd_init path
  ath10k: add TARGET values for 10.x firmware
  ath10k: introduce dynamic vdev parameters
  ath10k: introduce dynamic pdev parameters
  ath10k: handle FW API differences for scan structures

 drivers/net/wireless/ath/ath10k/core.c   |   29 +-
 drivers/net/wireless/ath/ath10k/core.h   |   23 +-
 drivers/net/wireless/ath/ath10k/htt_tx.c |    4 +-
 drivers/net/wireless/ath/ath10k/hw.h     |   37 +-
 drivers/net/wireless/ath/ath10k/mac.c    |   93 ++-
 drivers/net/wireless/ath/ath10k/wmi.c    | 1129 ++++++++++++++++++++++++++++--
 drivers/net/wireless/ath/ath10k/wmi.h    |  969 ++++++++++++++++++++++++-
 7 files changed, 2160 insertions(+), 124 deletions(-)

-- 
1.7.10


^ permalink raw reply

* [patch] mwifiex: potential integer underflow in mwifiex_ret_wmm_get_status()
From: Dan Carpenter @ 2013-09-25  8:57 UTC (permalink / raw)
  To: Bing Zhao; +Cc: John W. Linville, linux-wireless, kernel-janitors

If "resp_len" gets set to negative then it counts as a high positive
value.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
I spotted this reviewing the int => bool changes, but I don't have the
hardware and can't test it.

diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c
index 2e8f9cd..3c6ee3a 100644
--- a/drivers/net/wireless/mwifiex/wmm.c
+++ b/drivers/net/wireless/mwifiex/wmm.c
@@ -772,6 +772,8 @@ int mwifiex_ret_wmm_get_status(struct mwifiex_private *priv,
 			break;
 		}
 
+		if (resp_len < tlv_len + sizeof(tlv_hdr->header))
+			break;
 		curr += (tlv_len + sizeof(tlv_hdr->header));
 		resp_len -= (tlv_len + sizeof(tlv_hdr->header));
 	}

^ permalink raw reply related

* (no subject)
From: Mario Vietri @ 2013-09-25  6:51 UTC (permalink / raw)
  To: linux-wireless

Dear Sirs,

I have a pc with an Intel Card, Intel Corporation Centrino 
Advanced-N 6235 [8086:088e] (rev 24), driven by iwlwifi. I 
have installed the backports version of iwlwifi.

The card and the driver work flawlessly. I am having troubles, 
though, when I try two build two   virtual interfaces on this 
card, one in Station mode and the other in AP mode.

The output of iw list states, among other things, that:

Supported interface modes: 
                                                            │
                  * IBSS
                  * managed
                  * AP
                  * AP/VLAN
                  * monitor
                  * P2P-client
                  * P2P-GO
         software interface modes (can always be added):
                  * AP/VLAN
                  * monitor
         valid interface combinations:
                  * #{ managed } <= 1, #{ AP, P2P-GO } <= 1,
                    total <= 2, #channels <= 1, STA/AP BI must 
match
                  * #{ managed } <= 2, #{ P2P-client } <= 1,
                    total <= 2, #channels <= 1


I have interpreted this to mean that I can put my card into AP 
mode (I did, it works). The "valid interface combinations" 
appeared to state (if I read them right) that I can have at 
most one vif in station mode, 1 vif in AP mode, for a grand 
total of two, provided that they are on the same channel, and 
provided that


  STA/AP BI must match


What does this mean? I have been unable to find this on 
Google, and several posts at moderately knowledgeable BBs like 
SuperUser, StackOverflow and the like have provided no 
enlightenment.

Since clients connecting to my AP are so far unable to obtain
an IP address from my network, I am wondering whether this
requirement, whose meaning I completely ignore, is the source
of the problem.

  

Do you think you can help me out on this one?


Cheers,


Mario
Prof. Mario Vietri
Scuola Normale Superiore
56100 Pisa
Italia

Tel.: 39-050-509096
FAX:  39-050-509045
Cell: 39-333-7877992

^ permalink raw reply

* [PATCH 3.12 2/2] mwifiex: fix NULL pointer dereference in usb suspend handler
From: Bing Zhao @ 2013-09-25  2:31 UTC (permalink / raw)
  To: linux-wireless
  Cc: John W. Linville, Dmitry Khromov, Amitkumar Karwar, Avinash Patil,
	Nishant Sarmukadam, Frank Huang, Bing Zhao
In-Reply-To: <1380076285-29930-1-git-send-email-bzhao@marvell.com>

Bug 60815 - Interface hangs in mwifiex_usb
https://bugzilla.kernel.org/show_bug.cgi?id=60815

[ 2.883807] BUG: unable to handle kernel NULL pointer dereference
            at 0000000000000048
[ 2.883813] IP: [<ffffffff815a65e0>] pfifo_fast_enqueue+0x90/0x90

[ 2.883834] CPU: 1 PID: 3220 Comm: kworker/u8:90 Not tainted
            3.11.1-monotone-l0 #6
[ 2.883834] Hardware name: Microsoft Corporation Surface with
            Windows 8 Pro/Surface with Windows 8 Pro,
            BIOS 1.03.0450 03/29/2013

On Surface Pro, suspend to ram gives a NULL pointer dereference in
pfifo_fast_enqueue(). The stack trace reveals that the offending
call is clearing carrier in mwifiex_usb suspend handler.

Since commit 1499d9f "mwifiex: don't drop carrier flag over suspend"
has removed the carrier flag handling over suspend/resume in SDIO
and PCIe drivers, I'm removing it in USB driver too. This also fixes
the bug for Surface Pro.

Cc: <stable@vger.kernel.org> # 3.5+
Tested-by: Dmitry Khromov <icechrome@gmail.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
---
 drivers/net/wireless/mwifiex/usb.c | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c
index 2472d4b..1c70b8d 100644
--- a/drivers/net/wireless/mwifiex/usb.c
+++ b/drivers/net/wireless/mwifiex/usb.c
@@ -447,9 +447,6 @@ static int mwifiex_usb_suspend(struct usb_interface *intf, pm_message_t message)
 	 */
 	adapter->is_suspended = true;
 
-	for (i = 0; i < adapter->priv_num; i++)
-		netif_carrier_off(adapter->priv[i]->netdev);
-
 	if (atomic_read(&card->rx_cmd_urb_pending) && card->rx_cmd.urb)
 		usb_kill_urb(card->rx_cmd.urb);
 
@@ -509,10 +506,6 @@ static int mwifiex_usb_resume(struct usb_interface *intf)
 						  MWIFIEX_RX_CMD_BUF_SIZE);
 	}
 
-	for (i = 0; i < adapter->priv_num; i++)
-		if (adapter->priv[i]->media_connected)
-			netif_carrier_on(adapter->priv[i]->netdev);
-
 	/* Disable Host Sleep */
 	if (adapter->hs_activated)
 		mwifiex_cancel_hs(mwifiex_get_priv(adapter,
-- 
1.8.2.3


^ permalink raw reply related

* [PATCH 3.12 1/2] mwifiex: fix hang issue for USB chipsets
From: Bing Zhao @ 2013-09-25  2:31 UTC (permalink / raw)
  To: linux-wireless
  Cc: John W. Linville, Dmitry Khromov, Amitkumar Karwar, Avinash Patil,
	Nishant Sarmukadam, Frank Huang, Bing Zhao

From: Amitkumar Karwar <akarwar@marvell.com>

Bug 60815 - Interface hangs in mwifiex_usb
https://bugzilla.kernel.org/show_bug.cgi?id=60815

We have 4 bytes of interface header for packets delivered to SDIO
and PCIe, but not for USB interface.

In Tx AMSDU case, currently 4 bytes of garbage data is unnecessarily
appended for USB packets. This sometimes leads to a firmware hang,
because it may not interpret the data packet correctly.

Problem is fixed by removing this redundant headroom for USB.

Cc: <stable@vger.kernel.org> # 3.5+
Tested-by: Dmitry Khromov <icechrome@gmail.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
---
 drivers/net/wireless/mwifiex/11n_aggr.c | 3 ++-
 drivers/net/wireless/mwifiex/11n_aggr.h | 2 +-
 drivers/net/wireless/mwifiex/wmm.c      | 3 +--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/mwifiex/11n_aggr.c b/drivers/net/wireless/mwifiex/11n_aggr.c
index 21c6882..1214c58 100644
--- a/drivers/net/wireless/mwifiex/11n_aggr.c
+++ b/drivers/net/wireless/mwifiex/11n_aggr.c
@@ -150,7 +150,7 @@ mwifiex_11n_form_amsdu_txpd(struct mwifiex_private *priv,
  */
 int
 mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
-			  struct mwifiex_ra_list_tbl *pra_list, int headroom,
+			  struct mwifiex_ra_list_tbl *pra_list,
 			  int ptrindex, unsigned long ra_list_flags)
 			  __releases(&priv->wmm.ra_list_spinlock)
 {
@@ -160,6 +160,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
 	int pad = 0, ret;
 	struct mwifiex_tx_param tx_param;
 	struct txpd *ptx_pd = NULL;
+	int headroom = adapter->iface_type == MWIFIEX_USB ? 0 : INTF_HEADER_LEN;
 
 	skb_src = skb_peek(&pra_list->skb_head);
 	if (!skb_src) {
diff --git a/drivers/net/wireless/mwifiex/11n_aggr.h b/drivers/net/wireless/mwifiex/11n_aggr.h
index 900e1c6..892098d 100644
--- a/drivers/net/wireless/mwifiex/11n_aggr.h
+++ b/drivers/net/wireless/mwifiex/11n_aggr.h
@@ -26,7 +26,7 @@
 int mwifiex_11n_deaggregate_pkt(struct mwifiex_private *priv,
 				struct sk_buff *skb);
 int mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
-			      struct mwifiex_ra_list_tbl *ptr, int headroom,
+			      struct mwifiex_ra_list_tbl *ptr,
 			      int ptr_index, unsigned long flags)
 			      __releases(&priv->wmm.ra_list_spinlock);
 
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c
index 2e8f9cd..95fa359 100644
--- a/drivers/net/wireless/mwifiex/wmm.c
+++ b/drivers/net/wireless/mwifiex/wmm.c
@@ -1239,8 +1239,7 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
 		if (enable_tx_amsdu && mwifiex_is_amsdu_allowed(priv, tid) &&
 		    mwifiex_is_11n_aggragation_possible(priv, ptr,
 							adapter->tx_buf_size))
-			mwifiex_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN,
-						  ptr_index, flags);
+			mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index, flags);
 			/* ra_list_spinlock has been freed in
 			   mwifiex_11n_aggregate_pkt() */
 		else
-- 
1.8.2.3


^ permalink raw reply related

* Tracing Association code
From: Prabhunath G @ 2013-09-25  1:40 UTC (permalink / raw)
  To: kernelnewbies, linux-wireless

Hi All,

         I am tracing the association code in linux-wireless. I
understand that association request has to be triggered from station
side (userspace-wpa_supplicant) and has to be sent to the AP
(userspace-hostapd).

In the process of tracing, I found the function ieee80211_assoc(...)
in net/mac80211/cfg.c and also I found that a timer is scheduled to
execute the timer function. My Questions are

1. Who is initiating the timer function, my guess is it should be the
driver & How ?
2. On the AP side how is the association request taken from driver  ->
mac80211 -> hostapd.

Appreciate your help.

Thanks,
Prabhu

^ permalink raw reply

* [PATCH tip/core/rcu 10/13] mac80211: Apply rcu_access_pointer() to avoid sparse false positive
From: Paul E. McKenney @ 2013-09-25  1:35 UTC (permalink / raw)
  To: linux-kernel
  Cc: mingo, laijs, dipankar, akpm, mathieu.desnoyers, josh, niv, tglx,
	peterz, rostedt, dhowells, edumazet, darren, fweisbec, sbw,
	Paul E. McKenney, John W. Linville, Johannes Berg,
	David S. Miller, linux-wireless, netdev
In-Reply-To: <1380072916-31557-1-git-send-email-paulmck@linux.vnet.ibm.com>

From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>

The sparse checking for rcu_assign_pointer() was recently upgraded
to reject non-__kernel address spaces.  This also rejects __rcu,
which is almost always the right thing to do.  However, the uses in
sta_info_hash_del() are legitimate: They is assigning a pointer to an
element from an RCU-protected list, and all elements of this list are
already visible to caller.

This commit therefore silences this false positive by laundering the
pointer using rcu_access_pointer() as suggested by Josh Triplett.

Reported-by: kbuild test robot <fengguang.wu@intel.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: "John W. Linville" <linville@tuxdriver.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
---
 net/mac80211/sta_info.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index aeb967a..d18ab89 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -75,7 +75,7 @@ static int sta_info_hash_del(struct ieee80211_local *local,
 		return -ENOENT;
 	if (s == sta) {
 		rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)],
-				   s->hnext);
+				   rcu_access_pointer(s->hnext));
 		return 0;
 	}
 
@@ -84,7 +84,7 @@ static int sta_info_hash_del(struct ieee80211_local *local,
 		s = rcu_dereference_protected(s->hnext,
 					lockdep_is_held(&local->sta_mtx));
 	if (rcu_access_pointer(s->hnext)) {
-		rcu_assign_pointer(s->hnext, sta->hnext);
+		rcu_assign_pointer(s->hnext, rcu_access_pointer(sta->hnext));
 		return 0;
 	}
 
-- 
1.8.1.5


^ permalink raw reply related

* Re: No connection with TP-Link TL-WN823N (rtl8192cu)
From: Larry Finger @ 2013-09-24 22:43 UTC (permalink / raw)
  To: Dan Williams; +Cc: linux-wireless
In-Reply-To: <1378764913.31180.9.camel@dcbw.foobar.com>

On 09/09/2013 05:15 PM, Dan Williams wrote:
> On Mon, 2013-09-09 at 16:52 -0500, Larry Finger wrote:

>> I have been running rtl8192cu for the past 24 hours without a permanent
>> disconnect. Under NetworkManager, I see some reason 7 deauthentications, but
>
> Running wpa_supplicant with debugging on might shed some light on these;
> basically:
>
> mv /usr/sbin/wpa_supplicant /
> killall -TERM wpa_supplicant
> /wpa_supplicant -dddtu <piped to your favorite log file>
>
> and NM should automatically reconnect, and then we can figure out what's
> going on in the supplicant.

Dan,

The log of wpa_supplicant associated with the reason 7 disconnects are as follows:

1380060983.255499: RTM_NEWLINK: operstate=1 ifi_flags=0x1003 ([UP])
1380060983.255516: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
1380060983.255588: nl80211: if_removed already cleared - ignore event
1380060983.255600: Ignore event for foreign ifindex 22
1380060983.272257: nl80211: Event message available
1380060983.272307: nl80211: Delete station 20:e5:2a:01:f7:ea
1380060983.280211: nl80211: Event message available
1380060983.280228: nl80211: MLME event 39
1380060983.280230: nl80211: MLME event frame - hexdump(len=26): c0 00 3a 01 1c 
65 9d 5a c3 9d 20 e5 2a 01 f7 ea 20 e5 2a 01 f7 ea 30 d2 07 00
1380060983.280248: wlan3: Event DEAUTH (12) received
1380060983.280252: wlan3: Deauthentication notification
1380060983.280255: wlan3:  * reason 7
1380060983.280258: wlan3:  * address 20:e5:2a:01:f7:ea
1380060983.280260: Deauthentication frame IE(s) - hexdump(len=0): [NULL]
1380060983.280264: wlan3: WPA: Auto connect enabled: try to reconnect (wps=0)
1380060983.280267: wlan3: Setting scan request: 0 sec 100000 usec
1380060983.280271: Added BSSID 20:e5:2a:01:f7:ea into blacklist
1380060983.280276: wlan3: Not rescheduling scan to ensure that specific SSID 
scans occur
1380060983.280281: wlan3: CTRL-EVENT-DISCONNECTED bssid=20:e5:2a:01:f7:ea reason=7
1380060983.280283: wlan3: Disconnect event - remove keys
1380060983.280362: wpa_driver_nl80211_set_key: ifindex=22 alg=0 addr=(nil) 
key_idx=0 set_tx=0 seq_len=0 key_len=0
1380060983.290262: wpa_driver_nl80211_set_key: ifindex=22 alg=0 addr=(nil) 
key_idx=1 set_tx=0 seq_len=0 key_len=0
1380060983.292660: wpa_driver_nl80211_set_key: ifindex=22 alg=0 addr=(nil) 
key_idx=2 set_tx=0 seq_len=0 key_len=0
1380060983.292791: wpa_driver_nl80211_set_key: ifindex=22 alg=0 addr=(nil) 
key_idx=3 set_tx=0 seq_len=0 key_len=0
1380060983.292896: wpa_driver_nl80211_set_key: ifindex=22 alg=0 addr=(nil) 
key_idx=4 set_tx=0 seq_len=0 key_len=0
1380060983.292992: wpa_driver_nl80211_set_key: ifindex=22 alg=0 addr=(nil) 
key_idx=5 set_tx=0 seq_len=0 key_len=0
1380060983.293104: wpa_driver_nl80211_set_key: ifindex=22 alg=0 addr=0x6f7710 
key_idx=0 set_tx=0 seq_len=0 key_len=0
1380060983.293110:    addr=20:e5:2a:01:f7:ea
1380060983.293174: wlan3: State: COMPLETED -> DISCONNECTED
1380060983.293178: wpa_driver_nl80211_set_operstate: operstate 1->0 (DORMANT)
1380060983.293182: netlink: Operstate: linkmode=-1, operstate=5
1380060983.293329: EAPOL: External notification - portEnabled=0
1380060983.293333: EAPOL: SUPP_PAE entering state DISCONNECTED
1380060983.293335: EAPOL: Supplicant port status: Unauthorized
1380060983.293445: EAPOL: SUPP_BE entering state INITIALIZE
1380060983.293449: EAPOL: Supplicant port status: Unauthorized
1380060983.293548: EAPOL: External notification - portValid=0
1380060983.293551: EAPOL: Supplicant port status: Unauthorized
1380060983.293862: EAPOL: External notification - EAP success=0
1380060983.293866: EAPOL: Supplicant port status: Unauthorized
1380060983.293998: RTM_NEWLINK: operstate=0 ifi_flags=0x1003 ([UP])
1380060983.294004: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
1380060983.294049: nl80211: if_removed already cleared - ignore event
1380060983.294071: Ignore event for foreign ifindex 22
1380060983.294075: nl80211: Event message available
1380060983.294096: nl80211: Ignore disconnect event when using userspace SME
1380060983.298420: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3
1380060983.300119: nl80211: Event message available
1380060983.300155: nl80211: Regulatory domain change
1380060983.300163: wlan3: Event CHANNEL_LIST_CHANGED (31) received
1380060983.306633: nl80211: Regulatory information - country=00
1380060983.306642: nl80211: 2402-2472 @ 40 MHz
1380060983.306645: nl80211: 2457-2482 @ 20 MHz
1380060983.306647: nl80211: 2474-2494 @ 20 MHz
1380060983.306649: nl80211: 5170-5250 @ 40 MHz
1380060983.306652: nl80211: 5735-5835 @ 40 MHz
1380060983.306665: nl80211: Added 802.11b mode based on 802.11g information
1380060983.312952: nl80211: Event message available
1380060983.313006: nl80211: Regulatory domain change
1380060983.313014: wlan3: Event CHANNEL_LIST_CHANGED (31) received
1380060983.313294: nl80211: Regulatory information - country=US
1380060983.313298: nl80211: 2402-2472 @ 40 MHz
1380060983.313301: nl80211: 5170-5250 @ 40 MHz
1380060983.313303: nl80211: 5250-5330 @ 40 MHz
1380060983.313306: nl80211: 5490-5600 @ 40 MHz
1380060983.313308: nl80211: 5650-5710 @ 40 MHz
1380060983.313311: nl80211: 5735-5835 @ 40 MHz
1380060983.313325: nl80211: Added 802.11b mode based on 802.11g information
1380060983.380401: wlan3: State: DISCONNECTED -> SCANNING
1380060983.380519: Scan SSID - hexdump_ascii(len=9):
      4e 45 54 47 45 41 52 38 31                        NETGEAR81
1380060983.380530: wlan3: Starting AP scan for wildcard SSID
1380060983.380594: nl80211: Scan SSID - hexdump_ascii(len=9):
      4e 45 54 47 45 41 52 38 31                        NETGEAR81
1380060983.380601: nl80211: Scan SSID - hexdump_ascii(len=0): [NULL]
1380060983.711836: Scan requested (ret=0) - scan timeout 30 seconds
1380060983.711858: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3
1380060983.711979: nl80211: Event message available
1380060983.711996: nl80211: Scan trigger
1380060984.417923: nl80211: Event message available
1380060984.417967: nl80211: New scan results available
1380060984.417978: wlan3: Event SCAN_RESULTS (3) received
1380060984.418197: nl80211: Received scan results (5 BSSes)
1380060984.418259: Sorted scan results
1380060984.418262: 00:e0:4c:81:86:86 freq=2462 qual=0 noise=0 level=-38 flags=0xb
1380060984.418267: c0:3f:0e:be:2b:44 freq=2422 qual=0 noise=0 level=-50 flags=0xb
1380060984.418271: 20:e5:2a:01:f7:ea freq=2437 qual=0 noise=0 level=-54 flags=0xb
1380060984.418274: 00:1a:70:46:ba:b1 freq=2462 qual=0 noise=0 level=-72 flags=0xb
1380060984.418278: 00:14:bf:85:49:fa freq=2412 qual=0 noise=0 level=-48 flags=0xb
1380060984.418283: wlan3: BSS: Start scan result update 15
1380060984.418325: Add randomness: count=213 entropy=148
1380060984.418328: random pool - hexdump(len=128): [REMOVED]
1380060984.418330: random_mix_pool - hexdump(len=16): [REMOVED]
1380060984.418333: random_mix_pool - hexdump(len=5): [REMOVED]
1380060984.418335: random pool - hexdump(len=128): [REMOVED]
1380060984.418337: Add randomness: count=214 entropy=149
1380060984.418340: random pool - hexdump(len=128): [REMOVED]
1380060984.418341: random_mix_pool - hexdump(len=16): [REMOVED]
1380060984.418343: random_mix_pool - hexdump(len=5): [REMOVED]
1380060984.418345: random pool - hexdump(len=128): [REMOVED]
1380060984.418347: Add randomness: count=215 entropy=150
1380060984.418350: random pool - hexdump(len=128): [REMOVED]
1380060984.418352: random_mix_pool - hexdump(len=16): [REMOVED]
1380060984.418486: random_mix_pool - hexdump(len=5): [REMOVED]
1380060984.418489: random pool - hexdump(len=128): [REMOVED]
1380060984.418491: Add randomness: count=216 entropy=151
1380060984.418494: random pool - hexdump(len=128): [REMOVED]
1380060984.418496: random_mix_pool - hexdump(len=16): [REMOVED]
1380060984.418498: random_mix_pool - hexdump(len=5): [REMOVED]
1380060984.418500: random pool - hexdump(len=128): [REMOVED]
1380060984.418502: Add randomness: count=217 entropy=152
1380060984.418505: random pool - hexdump(len=128): [REMOVED]
1380060984.418507: random_mix_pool - hexdump(len=16): [REMOVED]
1380060984.418510: random_mix_pool - hexdump(len=5): [REMOVED]
1380060984.418512: random pool - hexdump(len=128): [REMOVED]
1380060984.418516: wlan3: New scan results available
1380060984.418555: WPS: attr type=0x104a len=1
1380060984.418559: WPS: attr type=0x1044 len=1
1380060984.418561: WPS: attr type=0x104a len=1
1380060984.418563: WPS: attr type=0x1044 len=1
1380060984.418565: WPS: attr type=0x104a len=1
1380060984.418567: WPS: attr type=0x1044 len=1
1380060984.418570: WPS: attr type=0x104a len=1
1380060984.418572: WPS: attr type=0x1044 len=1
1380060984.418573: WPS: attr type=0x103b len=1
1380060984.418575: WPS: attr type=0x1047 len=16
1380060984.418578: WPS: attr type=0x1021 len=13
1380060984.418580: WPS: attr type=0x1023 len=10
1380060984.418582: WPS: attr type=0x1024 len=10
1380060984.418584: WPS: attr type=0x1042 len=2
1380060984.418586: WPS: attr type=0x1054 len=8
1380060984.418588: WPS: attr type=0x1011 len=10
1380060984.418590: WPS: attr type=0x1008 len=2
1380060984.418592: WPS: attr type=0x103c len=1
1380060984.418594: WPS: attr type=0x1049 len=6
1380060984.418596: WPS: WFA subelement id=0 len=1
1380060984.418598: WPS: attr type=0x104a len=1
1380060984.418600: WPS: attr type=0x1044 len=1
1380060984.418602: WPS: attr type=0x103b len=1
1380060984.418604: WPS: attr type=0x1047 len=16
1380060984.418606: WPS: attr type=0x1021 len=13
1380060984.418608: WPS: attr type=0x1023 len=10
1380060984.418610: WPS: attr type=0x1024 len=10
1380060984.418611: WPS: attr type=0x1042 len=2
1380060984.418613: WPS: attr type=0x1054 len=8
1380060984.418615: WPS: attr type=0x1011 len=10
1380060984.418617: WPS: attr type=0x1008 len=2
1380060984.418619: WPS: attr type=0x103c len=1
1380060984.418621: WPS: attr type=0x1049 len=6
1380060984.418623: WPS: WFA subelement id=0 len=1
1380060984.418625: WPS: attr type=0x104a len=1
1380060984.418627: WPS: attr type=0x1044 len=1
1380060984.418629: WPS: attr type=0x103b len=1
1380060984.418631: WPS: attr type=0x1047 len=16
1380060984.418632: WPS: attr type=0x1021 len=13
1380060984.418634: WPS: attr type=0x1023 len=10
1380060984.418636: WPS: attr type=0x1024 len=10
1380060984.418638: WPS: attr type=0x1042 len=2
1380060984.418640: WPS: attr type=0x1054 len=8
1380060984.418642: WPS: attr type=0x1011 len=10
1380060984.418644: WPS: attr type=0x1008 len=2
1380060984.418646: WPS: attr type=0x103c len=1
1380060984.418648: WPS: attr type=0x1049 len=6
1380060984.418650: WPS: WFA subelement id=0 len=1
1380060984.418688: wlan3: Selecting BSS from priority group 0
1380060984.418695: wlan3: 0: 00:e0:4c:81:86:86 ssid='OpenWrt' wpa_ie_len=0 
rsn_ie_len=20 caps=0x11 level=-38
1380060984.418698: wlan3:    skip - SSID mismatch
1380060984.418703: wlan3: 1: c0:3f:0e:be:2b:44 ssid='lwfdjf-n' wpa_ie_len=0 
rsn_ie_len=20 caps=0x411 level=-50 wps
1380060984.418706: wlan3:    skip - SSID mismatch
1380060984.418710: wlan3: 2: 20:e5:2a:01:f7:ea ssid='NETGEAR81' wpa_ie_len=0 
rsn_ie_len=20 caps=0x411 level=-54 wps
1380060984.418714: wlan3:    skip - blacklisted (count=1 limit=0)
1380060984.418719: wlan3: 3: 00:1a:70:46:ba:b1 ssid='Larry_wpa1' wpa_ie_len=24 
rsn_ie_len=0 caps=0x411 level=-72
1380060984.418721: wlan3:    skip - SSID mismatch
1380060984.418726: wlan3: 4: 00:14:bf:85:49:fa ssid='radius' wpa_ie_len=0 
rsn_ie_len=0 caps=0x411 level=-48
1380060984.418728: wlan3:    skip - SSID mismatch
1380060984.418731: wlan3: No APs found - clear blacklist and try again
1380060984.418733: Removed BSSID 20:e5:2a:01:f7:ea from blacklist (clear)
1380060984.418799: wlan3: Selecting BSS from priority group 0
1380060984.418804: wlan3: 0: 00:e0:4c:81:86:86 ssid='OpenWrt' wpa_ie_len=0 
rsn_ie_len=20 caps=0x11 level=-38
1380060984.418807: wlan3:    skip - SSID mismatch
1380060984.418811: wlan3: 1: c0:3f:0e:be:2b:44 ssid='lwfdjf-n' wpa_ie_len=0 
rsn_ie_len=20 caps=0x411 level=-50 wps
1380060984.418814: wlan3:    skip - SSID mismatch
1380060984.418818: wlan3: 2: 20:e5:2a:01:f7:ea ssid='NETGEAR81' wpa_ie_len=0 
rsn_ie_len=20 caps=0x411 level=-54 wps
1380060984.418823: wlan3:    selected based on RSN IE
1380060984.418828: wlan3:    selected BSS 20:e5:2a:01:f7:ea ssid='NETGEAR81'
1380060984.418837: wlan3: Request association: reassociate: 0  selected: 
20:e5:2a:01:f7:ea  bssid: 00:00:00:00:00:00  pending: 00:00:00:00:00:00 
wpa_state: SCANNING
1380060984.418841: wlan3: Automatic auth_alg selection: 0x1
1380060984.418845: wlan3: RSN: using IEEE 802.11i/D9.0
1380060984.418848: wlan3: WPA: Selected cipher suites: group 16 pairwise 16 
key_mgmt 2 proto 2
1380060984.418852: wlan3: WPA: clearing AP WPA IE
1380060984.418854: WPA: set AP RSN IE - hexdump(len=22): 30 14 01 00 00 0f ac 04 
01 00 00 0f ac 04 01 00 00 0f ac 02 0c 00
1380060984.418865: wlan3: WPA: using GTK CCMP
1380060984.418867: wlan3: WPA: using PTK CCMP
1380060984.418870: wlan3: WPA: using KEY_MGMT WPA-PSK
1380060984.418872: wlan3: WPA: not using MGMT group cipher
1380060984.418875: WPA: Set own WPA IE default - hexdump(len=22): 30 14 01 00 00 
0f ac 04 01 00 00 0f ac 04 01 00 00 0f ac 02 00 00
1380060984.418886: wlan3: Cancelling scan request
1380060984.418890: wlan3: SME: Trying to authenticate with 20:e5:2a:01:f7:ea 
(SSID='NETGEAR81' freq=2437 MHz)
1380060984.418893: wlan3: No keys have been configured - skip key clearing
1380060984.418896: wlan3: State: SCANNING -> AUTHENTICATING
1380060984.418956: EAPOL: External notification - EAP success=0
1380060984.418959: EAPOL: Supplicant port status: Unauthorized
1380060984.419094: EAPOL: External notification - EAP fail=0
1380060984.419097: EAPOL: Supplicant port status: Unauthorized
1380060984.419195: EAPOL: External notification - portControl=Auto
1380060984.419198: EAPOL: Supplicant port status: Unauthorized
1380060984.419294: nl80211: Authenticate (ifindex=22)
1380060984.419298:   * bssid=20:e5:2a:01:f7:ea
1380060984.419301:   * freq=2437
1380060984.419303:   * SSID - hexdump_ascii(len=9):
      4e 45 54 47 45 41 52 38 31                        NETGEAR81
1380060984.419311:   * IEs - hexdump(len=0): [NULL]
1380060984.419313:   * Auth Type 0
1380060984.439811: nl80211: Authentication request send successfully
1380060984.439836: wlan3: Checking for other virtual interfaces sharing same 
radio (phy0) in event_scan_results
1380060984.439857: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3
1380060984.440017: RTM_NEWLINK: operstate=0 ifi_flags=0x1003 ([UP])
1380060984.440022: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
1380060984.440171: nl80211: if_removed already cleared - ignore event
1380060984.440192: Ignore event for foreign ifindex 22
1380060984.440196: nl80211: Event message available
1380060984.440215: nl80211: New station 20:e5:2a:01:f7:ea
1380060984.440229: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3/BSSs/0
1380060984.440340: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3/BSSs/6
1380060984.440478: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3/BSSs/1
1380060984.440628: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3/BSSs/3
1380060984.441086: nl80211: Event message available
1380060984.441103: nl80211: MLME event 37
1380060984.441106: nl80211: MLME event frame - hexdump(len=41): b0 00 3a 01 1c 
65 9d 5a c3 9d 20 e5 2a 01 f7 ea 20 e5 2a 01 f7 ea 60 d3 00 00 02 00 00 00 dd 09 
00 10 18 02 00 f0 04 00 00
1380060984.441251: wlan3: Event AUTH (11) received
1380060984.441257: wlan3: SME: Authentication response: peer=20:e5:2a:01:f7:ea 
auth_type=0 status_code=0
1380060984.441259: SME: Authentication response IEs - hexdump(len=11): dd 09 00 
10 18 02 00 f0 04 00 00
1380060984.441269: wlan3: Trying to associate with 20:e5:2a:01:f7:ea 
(SSID='NETGEAR81' freq=2437 MHz)
1380060984.441272: wlan3: State: AUTHENTICATING -> ASSOCIATING
1380060984.441275: wpa_driver_nl80211_set_operstate: operstate 0->0 (DORMANT)
1380060984.441278: netlink: Operstate: linkmode=-1, operstate=5
1380060984.441370: WPA: set own WPA/RSN IE - hexdump(len=22): 30 14 01 00 00 0f 
ac 04 01 00 00 0f ac 04 01 00 00 0f ac 02 00 00
1380060984.441383: nl80211: Associate (ifindex=22)
1380060984.441388:   * bssid=20:e5:2a:01:f7:ea
1380060984.441391:   * freq=2437
1380060984.441393:   * SSID - hexdump_ascii(len=9):
      4e 45 54 47 45 41 52 38 31                        NETGEAR81
1380060984.441400:   * IEs - hexdump(len=22): 30 14 01 00 00 0f ac 04 01 00 00 
0f ac 04 01 00 00 0f ac 02 00 00
1380060984.441408:   * pairwise=0xfac04
1380060984.441410:   * group=0xfac04
1380060984.441412:   * prev_bssid=20:e5:2a:01:f7:ea
1380060984.441506: nl80211: Association request send successfully
1380060984.446458: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3
1380060984.447729: RTM_NEWLINK: operstate=0 ifi_flags=0x11003 ([UP][LOWER_UP])
1380060984.447745: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
1380060984.447824: nl80211: if_removed already cleared - ignore event
1380060984.447832: RTM_NEWLINK: operstate=0 ifi_flags=0x11003 ([UP][LOWER_UP])
1380060984.447835: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
1380060984.447882: nl80211: if_removed already cleared - ignore event
1380060984.447888: RTM_NEWLINK: operstate=0 ifi_flags=0x11003 ([UP][LOWER_UP])
1380060984.447891: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
1380060984.447934: nl80211: if_removed already cleared - ignore event
1380060984.447944: Ignore event for foreign ifindex 22
1380060984.447950: Ignore event for foreign ifindex 22
1380060984.447955: Ignore event for foreign ifindex 22
1380060984.447959: nl80211: Event message available
1380060984.447990: nl80211: MLME event 38
1380060984.447992: nl80211: MLME event frame - hexdump(len=180): 30 00 3a 01 1c 
65 9d 5a c3 9d 20 e5 2a 01 f7 ea 20 e5 2a 01 f7 ea 70 d3 11 04 00 00 02 c0 01 08 
82 84 0b 16 24 30 48 6c 32 04 0c 12 18 60 2d 1a fc 18 1f ff ff 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3d 16 06 00 17 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 7f 01 01 4a 0e 14 00 0a 00 2c 01 c8 00 14 00 
05 00 19 00 dd 18 00 50 f2 04 10 4a 00 01 10 10 3b 00 01 03 10 49 00 06 00 37 2a 
00 01 20 dd 09 00 10 18 02 00 f0 04 00 00 dd 18 00 50 f2 02 01 01 80 00 03 a4 00 
00 27 a4 00 00 42 43 5e 00 62 32 2f 00
1380060984.448058: wlan3: Event ASSOC (0) received
1380060984.448062: wlan3: Association info event
1380060984.448064: resp_ies - hexdump(len=150): 01 08 82 84 0b 16 24 30 48 6c 32 
04 0c 12 18 60 2d 1a fc 18 1f ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 3d 16 06 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 7f 01 01 4a 0e 14 00 0a 00 2c 01 c8 00 14 00 05 00 19 00 dd 18 00 50 f2 
04 10 4a 00 01 10 10 3b 00 01 03 10 49 00 06 00 37 2a 00 01 20 dd 09 00 10 18 02 
00 f0 04 00 00 dd 18 00 50 f2 02 01 01 80 00 03 a4 00 00 27 a4 00 00 42 43 5e 00 
62 32 2f 00
1380060984.448115: wlan3: freq=2437 MHz
1380060984.448119: wlan3: State: ASSOCIATING -> ASSOCIATED
1380060984.448122: wpa_driver_nl80211_set_operstate: operstate 0->0 (DORMANT)
1380060984.448125: netlink: Operstate: linkmode=-1, operstate=5
1380060984.448252: wlan3: Associated to a new BSS: BSSID=20:e5:2a:01:f7:ea
1380060984.448254: Add randomness: count=218 entropy=153
1380060984.448257: random pool - hexdump(len=128): [REMOVED]
1380060984.448259: random_mix_pool - hexdump(len=16): [REMOVED]
1380060984.448262: random_mix_pool - hexdump(len=6): [REMOVED]
1380060984.448264: random pool - hexdump(len=128): [REMOVED]
1380060984.448403: wlan3: No keys have been configured - skip key clearing
1380060984.448408: wlan3: Associated with 20:e5:2a:01:f7:ea
1380060984.448411: wlan3: WPA: Association event - clear replay counter
1380060984.448414: wlan3: WPA: Clear old PTK
1380060984.448416: EAPOL: External notification - portEnabled=0
1380060984.448419: EAPOL: Supplicant port status: Unauthorized
1380060984.448614: EAPOL: External notification - portValid=0
1380060984.448617: EAPOL: Supplicant port status: Unauthorized
1380060984.448725: EAPOL: External notification - EAP success=0
1380060984.448728: EAPOL: Supplicant port status: Unauthorized
1380060984.448833: EAPOL: External notification - portEnabled=1
1380060984.448836: EAPOL: SUPP_PAE entering state CONNECTING
1380060984.448838: EAPOL: enable timer tick
1380060984.448841: EAPOL: SUPP_BE entering state IDLE
1380060984.448845: wlan3: Setting authentication timeout: 10 sec 0 usec
1380060984.448849: wlan3: Cancelling scan request
1380060984.448873: nl80211: Event message available
1380060984.448888: nl80211: Ignore connect event (cmd=46) when using userspace SME
1380060984.452421: wlan3: RX EAPOL from 20:e5:2a:01:f7:ea
1380060984.452428: RX EAPOL - hexdump(len=121): 02 03 00 75 02 00 8a 00 10 00 00 
00 00 00 00 00 92 b8 c6 f1 75 b2 15 37 c3 eb 49 b9 2d fa 54 49 83 42 4e b9 00 32 
b8 68 2d 17 83 c6 8a 55 d7 cc 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 16 dd 14 00 0f ac 04 9a 21 ff 5f 52 07 69 ba 95 e1 53 81 98 50 
2f 73
1380060984.452472: wlan3: Setting authentication timeout: 10 sec 0 usec
1380060984.452479: wlan3: IEEE 802.1X RX: version=2 type=3 length=117
1380060984.452482: wlan3:   EAPOL-Key type=2
1380060984.452487: wlan3:   key_info 0x8a (ver=2 keyidx=0 rsvd=0 Pairwise Ack)
1380060984.452490: wlan3:   key_length=16 key_data_length=22
1380060984.452492:   replay_counter - hexdump(len=8): 00 00 00 00 00 00 00 92
1380060984.452497:   key_nonce - hexdump(len=32): b8 c6 f1 75 b2 15 37 c3 eb 49 
b9 2d fa 54 49 83 42 4e b9 00 32 b8 68 2d 17 83 c6 8a 55 d7 cc 6e
1380060984.452508:   key_iv - hexdump(len=16): 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00
1380060984.452515:   key_rsc - hexdump(len=8): 00 00 00 00 00 00 00 00
1380060984.452520:   key_id (reserved) - hexdump(len=8): 00 00 00 00 00 00 00 00
1380060984.452525:   key_mic - hexdump(len=16): 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00
1380060984.452535: WPA: RX EAPOL-Key - hexdump(len=121): 02 03 00 75 02 00 8a 00 
10 00 00 00 00 00 00 00 92 b8 c6 f1 75 b2 15 37 c3 eb 49 b9 2d fa 54 49 83 42 4e 
b9 00 32 b8 68 2d 17 83 c6 8a 55 d7 cc 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 16 dd 14 00 0f ac 04 9a 21 ff 5f 52 07 69 ba 95 e1 53 
81 98 50 2f 73
1380060984.452579: wlan3: State: ASSOCIATED -> 4WAY_HANDSHAKE
1380060984.452689: wlan3: WPA: RX message 1 of 4-Way Handshake from 
20:e5:2a:01:f7:ea (ver=2)
1380060984.452691: RSN: msg 1/4 key data - hexdump(len=22): dd 14 00 0f ac 04 9a 
21 ff 5f 52 07 69 ba 95 e1 53 81 98 50 2f 73
1380060984.452700: WPA: PMKID in EAPOL-Key - hexdump(len=22): dd 14 00 0f ac 04 
9a 21 ff 5f 52 07 69 ba 95 e1 53 81 98 50 2f 73
1380060984.452708: RSN: PMKID from Authenticator - hexdump(len=16): 9a 21 ff 5f 
52 07 69 ba 95 e1 53 81 98 50 2f 73
1380060984.452715: wlan3: RSN: no matching PMKID found
1380060984.452718: Get randomness: len=32 entropy=154
1380060984.453343: random from os_get_random - hexdump(len=32): [REMOVED]
1380060984.453359: random_mix_pool - hexdump(len=20): [REMOVED]
1380060984.453364: random from internal pool - hexdump(len=16): [REMOVED]
1380060984.453369: random_mix_pool - hexdump(len=20): [REMOVED]
1380060984.453373: random from internal pool - hexdump(len=16): [REMOVED]
1380060984.453375: mixed random - hexdump(len=32): [REMOVED]
1380060984.453378: WPA: Renewed SNonce - hexdump(len=32): 01 ea 42 a8 4d 73 75 
b7 40 11 7e 37 2d b5 10 f1 11 96 23 e4 6c ee fb 3e 12 1b 8d c6 34 05 e5 06
1380060984.453498: WPA: PTK derivation - A1=1c:65:9d:5a:c3:9d A2=20:e5:2a:01:f7:ea
1380060984.453502: WPA: Nonce1 - hexdump(len=32): 01 ea 42 a8 4d 73 75 b7 40 11 
7e 37 2d b5 10 f1 11 96 23 e4 6c ee fb 3e 12 1b 8d c6 34 05 e5 06
1380060984.453514: WPA: Nonce2 - hexdump(len=32): b8 c6 f1 75 b2 15 37 c3 eb 49 
b9 2d fa 54 49 83 42 4e b9 00 32 b8 68 2d 17 83 c6 8a 55 d7 cc 6e
1380060984.453526: WPA: PMK - hexdump(len=32): [REMOVED]
1380060984.453528: WPA: PTK - hexdump(len=48): [REMOVED]
1380060984.453530: WPA: WPA IE for msg 2/4 - hexdump(len=22): 30 14 01 00 00 0f 
ac 04 01 00 00 0f ac 04 01 00 00 0f ac 02 00 00
1380060984.453541: WPA: Replay Counter - hexdump(len=8): 00 00 00 00 00 00 00 92
1380060984.453547: wlan3: WPA: Sending EAPOL-Key 2/4
1380060984.453553: WPA: KCK - hexdump(len=16): [REMOVED]
1380060984.453555: WPA: Derived Key MIC - hexdump(len=16): 82 a7 a9 83 fa 60 f2 
6d 62 4c f5 04 0f f8 af 34
1380060984.453562: WPA: TX EAPOL-Key - hexdump(len=121): 01 03 00 75 02 01 0a 00 
00 00 00 00 00 00 00 00 92 01 ea 42 a8 4d 73 75 b7 40 11 7e 37 2d b5 10 f1 11 96 
23 e4 6c ee fb 3e 12 1b 8d c6 34 05 e5 06 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 82 a7 a9 83 fa 60 f2 6d 
62 4c f5 04 0f f8 af 34 00 16 30 14 01 00 00 0f ac 04 01 00 00 0f ac 04 01 00 00 
0f ac 02 00 00
1380060984.453700: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3
1380060984.469955: wlan3: RX EAPOL from 20:e5:2a:01:f7:ea
1380060984.469961: RX EAPOL - hexdump(len=155): 02 03 00 97 02 13 ca 00 10 00 00 
00 00 00 00 00 93 b8 c6 f1 75 b2 15 37 c3 eb 49 b9 2d fa 54 49 83 42 4e b9 00 32 
b8 68 2d 17 83 c6 8a 55 d7 cc 6e 42 4e b9 00 32 b8 68 2d 17 83 c6 8a 55 d7 cc 6f 
61 44 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 54 f2 53 22 36 cd f1 52 c4 9c 5b 
d4 94 7b 44 e9 00 38 5f 3e 85 a3 4a 51 74 0d 57 d5 cb 71 63 65 8b ac 25 22 59 67 
6b 18 6c ae f7 97 ba 0a 64 f2 1c 98 78 e7 8b b2 24 c9 6f b5 b7 f9 73 e2 e8 e4 dc 
6c 14 a9 fd 50 58 20 11 d8
1380060984.470007: wlan3: IEEE 802.1X RX: version=2 type=3 length=151
1380060984.470010: wlan3:   EAPOL-Key type=2
1380060984.470015: wlan3:   key_info 0x13ca (ver=2 keyidx=0 rsvd=0 Pairwise 
Install Ack MIC Secure Encr)
1380060984.470018: wlan3:   key_length=16 key_data_length=56
1380060984.470020:   replay_counter - hexdump(len=8): 00 00 00 00 00 00 00 93
1380060984.470025:   key_nonce - hexdump(len=32): b8 c6 f1 75 b2 15 37 c3 eb 49 
b9 2d fa 54 49 83 42 4e b9 00 32 b8 68 2d 17 83 c6 8a 55 d7 cc 6e
1380060984.470036:   key_iv - hexdump(len=16): 42 4e b9 00 32 b8 68 2d 17 83 c6 
8a 55 d7 cc 6f
1380060984.470043:   key_rsc - hexdump(len=8): 61 44 1a 00 00 00 00 00
1380060984.470048:   key_id (reserved) - hexdump(len=8): 00 00 00 00 00 00 00 00
1380060984.470052:   key_mic - hexdump(len=16): 54 f2 53 22 36 cd f1 52 c4 9c 5b 
d4 94 7b 44 e9
1380060984.470062: WPA: RX EAPOL-Key - hexdump(len=155): 02 03 00 97 02 13 ca 00 
10 00 00 00 00 00 00 00 93 b8 c6 f1 75 b2 15 37 c3 eb 49 b9 2d fa 54 49 83 42 4e 
b9 00 32 b8 68 2d 17 83 c6 8a 55 d7 cc 6e 42 4e b9 00 32 b8 68 2d 17 83 c6 8a 55 
d7 cc 6f 61 44 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 54 f2 53 22 36 cd f1 52 
c4 9c 5b d4 94 7b 44 e9 00 38 5f 3e 85 a3 4a 51 74 0d 57 d5 cb 71 63 65 8b ac 25 
22 59 67 6b 18 6c ae f7 97 ba 0a 64 f2 1c 98 78 e7 8b b2 24 c9 6f b5 b7 f9 73 e2 
e8 e4 dc 6c 14 a9 fd 50 58 20 11 d8
1380060984.470127: RSN: encrypted key data - hexdump(len=56): 5f 3e 85 a3 4a 51 
74 0d 57 d5 cb 71 63 65 8b ac 25 22 59 67 6b 18 6c ae f7 97 ba 0a 64 f2 1c 98 78 
e7 8b b2 24 c9 6f b5 b7 f9 73 e2 e8 e4 dc 6c 14 a9 fd 50 58 20 11 d8
1380060984.470163: WPA: decrypted EAPOL-Key key data - hexdump(len=48): [REMOVED]
1380060984.470168: wlan3: State: 4WAY_HANDSHAKE -> 4WAY_HANDSHAKE
1380060984.470172: wlan3: WPA: RX message 3 of 4-Way Handshake from 
20:e5:2a:01:f7:ea (ver=2)
1380060984.470174: WPA: IE KeyData - hexdump(len=48): 30 14 01 00 00 0f ac 04 01 
00 00 0f ac 04 01 00 00 0f ac 02 0c 00 dd 16 00 0f ac 01 01 00 6a 84 ef c7 88 2e 
78 30 d8 21 9e 13 f1 72 05 55 dd 00
1380060984.470304: WPA: RSN IE in EAPOL-Key - hexdump(len=22): 30 14 01 00 00 0f 
ac 04 01 00 00 0f ac 04 01 00 00 0f ac 02 0c 00
1380060984.470314: WPA: GTK in EAPOL-Key - hexdump(len=24): [REMOVED]
1380060984.470321: wlan3: WPA: Sending EAPOL-Key 4/4
1380060984.470328: WPA: KCK - hexdump(len=16): [REMOVED]
1380060984.470330: WPA: Derived Key MIC - hexdump(len=16): 8a 6a 7c fb 7d 2f 8b 
d1 33 d7 57 fe 7f 31 35 b4
1380060984.470337: WPA: TX EAPOL-Key - hexdump(len=99): 01 03 00 5f 02 03 0a 00 
00 00 00 00 00 00 00 00 93 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8a 6a 7c fb 7d 2f 8b d1 
33 d7 57 fe 7f 31 35 b4 00 00
1380060984.470457: wlan3: WPA: Installing PTK to the driver
1380060984.470552: wpa_driver_nl80211_set_key: ifindex=22 alg=3 addr=0x6f9ec8 
key_idx=0 set_tx=1 seq_len=6 key_len=16
1380060984.470568:    addr=20:e5:2a:01:f7:ea
1380060984.471873: EAPOL: External notification - portValid=1
1380060984.471879: wlan3: State: 4WAY_HANDSHAKE -> GROUP_HANDSHAKE
1380060984.471981: RSN: received GTK in pairwise handshake - hexdump(len=18): 
[REMOVED]
1380060984.471985: WPA: Group Key - hexdump(len=16): [REMOVED]
1380060984.471989: wlan3: WPA: Installing GTK to the driver (keyidx=1 tx=0 len=16)
1380060984.471991: WPA: RSC - hexdump(len=6): 61 44 1a 00 00 00
1380060984.472044: wpa_driver_nl80211_set_key: ifindex=22 alg=3 addr=0x492909 
key_idx=1 set_tx=0 seq_len=6 key_len=16
1380060984.472051:    broadcast key
1380060984.473171: wlan3: WPA: Key negotiation completed with 20:e5:2a:01:f7:ea 
[PTK=CCMP GTK=CCMP]
1380060984.473174: wlan3: Cancelling authentication timeout
1380060984.473178: wlan3: State: GROUP_HANDSHAKE -> COMPLETED
1380060984.473183: wlan3: CTRL-EVENT-CONNECTED - Connection to 20:e5:2a:01:f7:ea 
completed (reauth) [id=0 id_str=]
1380060984.473185: wpa_driver_nl80211_set_operstate: operstate 0->1 (UP)
1380060984.473189: netlink: Operstate: linkmode=-1, operstate=6
1380060984.473598: EAPOL: External notification - portValid=1
1380060984.473604: EAPOL: External notification - EAP success=1
1380060984.473607: EAPOL: SUPP_PAE entering state AUTHENTICATING
1380060984.473609: EAPOL: SUPP_BE entering state SUCCESS
1380060984.473611: EAP: EAP entering state DISABLED
1380060984.473613: EAPOL: SUPP_PAE entering state AUTHENTICATED
1380060984.473614: EAPOL: Supplicant port status: Authorized
1380060984.473733: EAPOL: SUPP_BE entering state IDLE
1380060984.473737: EAPOL authentication completed successfully
1380060984.473866: RTM_NEWLINK: operstate=1 ifi_flags=0x11043 
([UP][RUNNING][LOWER_UP])
1380060984.473870: RTM_NEWLINK, IFLA_IFNAME: Interface 'wlan3' added
1380060984.473917: nl80211: if_removed already cleared - ignore event
1380060984.473929: Ignore event for foreign ifindex 22
1380060984.477063: dbus: flush_object_timeout_handler: Timeout - sending changed 
properties of object /fi/w1/wpa_supplicant1/Interfaces/3
1380060985.449860: EAPOL: startWhen --> 0
1380060985.449872: EAPOL: disable timer tick

Any advice on how to debug this will be appreciated.

Thanks,

Larry


^ permalink raw reply

* [PATCH -stable] p54usb: add USB ID for Corega WLUSB2GTST USB adapter
From: Christian Lamparter @ 2013-09-24 19:56 UTC (permalink / raw)
  To: linux-wireless; +Cc: linville, the_force

Added USB ID for Corega WLUSB2GTST USB adapter.

Cc: <stable@vger.kernel.org>
Reported-by: Joerg Kalisch <the_force@gmx.de>
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
---
 drivers/net/wireless/p54/p54usb.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
index b9deef6..f42dc3c 100644
--- a/drivers/net/wireless/p54/p54usb.c
+++ b/drivers/net/wireless/p54/p54usb.c
@@ -83,6 +83,7 @@ static struct usb_device_id p54u_table[] = {
 	{USB_DEVICE(0x06a9, 0x000e)},	/* Westell 802.11g USB (A90-211WG-01) */
 	{USB_DEVICE(0x06b9, 0x0121)},	/* Thomson SpeedTouch 121g */
 	{USB_DEVICE(0x0707, 0xee13)},   /* SMC 2862W-G version 2 */
+	{USB_DEVICE(0x07aa, 0x0020)},	/* Corega WLUSB2GTST USB */
 	{USB_DEVICE(0x0803, 0x4310)},	/* Zoom 4410a */
 	{USB_DEVICE(0x083a, 0x4521)},   /* Siemens Gigaset USB Adapter 54 version 2 */
 	{USB_DEVICE(0x083a, 0x4531)},	/* T-Com Sinus 154 data II */
-- 
1.8.4.rc3


^ permalink raw reply related

* RE: [PATCH v5 2/2] Bluetooth: btmrvl: add calibration data download support
From: Bing Zhao @ 2013-09-24 19:54 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: linux-bluetooth@vger.kernel.org, Gustavo Padovan, Johan Hedberg,
	linux-wireless@vger.kernel.org, Mike Frysinger, Hyuckjoo Lee,
	Amitkumar Karwar
In-Reply-To: <C42E9D11-1E8B-499E-96E0-74469F7649EC@holtmann.org>

Hi Marcel,

> > We can extend __hci_cmd_sync() function with a new parameter 'type'.
> > This way we can pass HCI_VENDOR_PKT into __hci_cmd_sync(), while other drivers will pass in
> HCI_COMMAND_PKT.
> 
> That will actually not work. And I also do not want to do that. The __hci_cmd_sync() is for real HCI
> packets. That means types 0x01 and 0x04 only. They need to adhere to the HCI flow control mechanism
> for commands.

I see.

> 
> > Our driver will make HCI_VENDOR_PKT -> MRVL_VENDOR_PKT conversion before downloading the frame to
> firmware. And the MRVL_VENDOR_PKT frame from firmware will be replaced with HCI_VENDOR_PKT while
> uploading the frame to stack.
> >
> > Please let us know if this approach works for you or not.
> 
> I think this is best kept inside the driver. However you might consider building something like
> __hci_cmd_sync() that is specific to your driver, but allows for a similar flow within ->setup().

Sure, we will consider building a function in the driver to handle this.

Thanks,
Bing

^ permalink raw reply

* Re: [PATCH v5 2/2] Bluetooth: btmrvl: add calibration data download support
From: Marcel Holtmann @ 2013-09-24 19:43 UTC (permalink / raw)
  To: Bing Zhao
  Cc: linux-bluetooth@vger.kernel.org, Gustavo Padovan, Johan Hedberg,
	linux-wireless@vger.kernel.org, Mike Frysinger, Hyuckjoo Lee,
	Amitkumar Karwar
In-Reply-To: <477F20668A386D41ADCC57781B1F70430F450779BE@SC-VEXCH1.marvell.com>

Hi Bing,

>>> The reason of not using __hci_cmd_sync() is that we are sending vendor specific command here
>> (MRVL_VENDOR_PKT). The __hci_cmd_sync seems handle HCI_COMMAND_PKT only.
>>> Please let us know if you have any suggestion to solve this problem.
>> 
>> what is a MRVL_VENDOR_PKT actually?
> 
> It's defined as 0xfe in our driver. The firmware doesn't understand 0xff (HCI_VENDOR_PKT).

so it is actually out-of-channel vendor packet.

>> 
>> If you guys are not using standard HCI command/event for vendor operation, then this obviously does
>> not fit. However a similar model might make sense instead of manually building packets all the time.
> 
> We can extend __hci_cmd_sync() function with a new parameter 'type'.
> This way we can pass HCI_VENDOR_PKT into __hci_cmd_sync(), while other drivers will pass in HCI_COMMAND_PKT.

That will actually not work. And I also do not want to do that. The __hci_cmd_sync() is for real HCI packets. That means types 0x01 and 0x04 only. They need to adhere to the HCI flow control mechanism for commands.

> Our driver will make HCI_VENDOR_PKT -> MRVL_VENDOR_PKT conversion before downloading the frame to firmware. And the MRVL_VENDOR_PKT frame from firmware will be replaced with HCI_VENDOR_PKT while uploading the frame to stack.
> 
> Please let us know if this approach works for you or not.

I think this is best kept inside the driver. However you might consider building something like __hci_cmd_sync() that is specific to your driver, but allows for a similar flow within ->setup().

Regards

Marcel


^ permalink raw reply

* RE: [PATCH v5 1/2] Bluetooth: btmrvl: add setup handler
From: Bing Zhao @ 2013-09-24 19:42 UTC (permalink / raw)
  To: Johan Hedberg
  Cc: Marcel Holtmann, linux-bluetooth@vger.kernel.org, Gustavo Padovan,
	linux-wireless@vger.kernel.org, Mike Frysinger, Hyuckjoo Lee,
	Amitkumar Karwar
In-Reply-To: <20130924193010.GA2584@x220.p-661hnu-f1>

Hi Johan,

> Hi Bing,
> 
> On Tue, Sep 24, 2013, Bing Zhao wrote:
> > > that is a bug. It should only be ever called once. Could this be due
> > > to RFKILL issue we had? Please re-test with Johan's patches applied
> > > and check if it makes a difference. Otherwise please send some logs
> > > since we want to get this fixed.
> >
> > Amitkumar Karwar has tested it with latest code on bluetooth-next tree
> > but the result is the same.
> > Apparently two threads race to call hci_dev_open(). If the thread from
> > hci_sock calls hci_dev_open earlier, it ends up not updating HCI_SETUP
> > hdev flag in hci_power_on(). This results that the setup handler gets
> > called again when user brings up the interface later.
> 
> Let's see if I understood this right: the only hci_dev_open call in
> hci_sock.c is the one for the HCIDEVUP ioctl. So what you're doing is
> having user space call the HCIDEVUP ioctl before our own hci_power_on
> callback gets called to initialize the adapter?

That's right. The ioctl is initiated by the Bluetooth daemon.
Amitkumar has a setup that can reproduce this corner case easily.
I tested it on my Ubuntu but I couldn't replicate it.

> 
> You're right that we're missing the clearing of the HCI_SETUP flag for
> such a scenario. Could you try the attached patch. It should fix the
> issue. One problem that it does have is that if the HCIDEVUP ioctl path
> goes through before hci_power_on gets called we will never notify mgmt
> of the adapter. However, that might be acceptable here since if you're
> using HCIDEVUP like this it seems it's not a mgmt based system anyway.
> 
> > I checked the bluetooth-next tree, the following two patches (by
> > Johan) are not present in this tree.
> >
> > bf54303 Bluetooth: Fix rfkill functionality during the HCI setup stage
> > 5e13036 Bluetooth: Introduce a new HCI_RFKILLED flag
> >
> > They are in bluetooth.git tree. So, I'm not certain if Amitkumar has
> > applied them manually or not. Anyway we will re-test with Johan's
> > patches applied and confirm if they fix the race or not.
> 
> I don't think these patches will help you in this case.

OK, we will test your patch instead.

Thanks,
Bing


^ permalink raw reply

* Re: [PATCH v5 1/2] Bluetooth: btmrvl: add setup handler
From: Johan Hedberg @ 2013-09-24 19:30 UTC (permalink / raw)
  To: Bing Zhao
  Cc: Marcel Holtmann, linux-bluetooth@vger.kernel.org, Gustavo Padovan,
	linux-wireless@vger.kernel.org, Mike Frysinger, Hyuckjoo Lee,
	Amitkumar Karwar
In-Reply-To: <477F20668A386D41ADCC57781B1F70430F450779A4@SC-VEXCH1.marvell.com>

[-- Attachment #1: Type: text/plain, Size: 1869 bytes --]

Hi Bing,

On Tue, Sep 24, 2013, Bing Zhao wrote:
> > that is a bug. It should only be ever called once. Could this be due
> > to RFKILL issue we had? Please re-test with Johan's patches applied
> > and check if it makes a difference. Otherwise please send some logs
> > since we want to get this fixed.
> 
> Amitkumar Karwar has tested it with latest code on bluetooth-next tree
> but the result is the same.
> Apparently two threads race to call hci_dev_open(). If the thread from
> hci_sock calls hci_dev_open earlier, it ends up not updating HCI_SETUP
> hdev flag in hci_power_on(). This results that the setup handler gets
> called again when user brings up the interface later.

Let's see if I understood this right: the only hci_dev_open call in
hci_sock.c is the one for the HCIDEVUP ioctl. So what you're doing is
having user space call the HCIDEVUP ioctl before our own hci_power_on
callback gets called to initialize the adapter?

You're right that we're missing the clearing of the HCI_SETUP flag for
such a scenario. Could you try the attached patch. It should fix the
issue. One problem that it does have is that if the HCIDEVUP ioctl path
goes through before hci_power_on gets called we will never notify mgmt
of the adapter. However, that might be acceptable here since if you're
using HCIDEVUP like this it seems it's not a mgmt based system anyway.

> I checked the bluetooth-next tree, the following two patches (by
> Johan) are not present in this tree.
> 
> bf54303 Bluetooth: Fix rfkill functionality during the HCI setup stage
> 5e13036 Bluetooth: Introduce a new HCI_RFKILLED flag
> 
> They are in bluetooth.git tree. So, I'm not certain if Amitkumar has
> applied them manually or not. Anyway we will re-test with Johan's
> patches applied and confirm if they fix the race or not.

I don't think these patches will help you in this case.

Johan

[-- Attachment #2: hci-setup.patch --]
[-- Type: text/plain, Size: 1114 bytes --]

diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 634deba..c48bf1a 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1164,7 +1164,7 @@ int hci_dev_open(__u16 dev)
 	atomic_set(&hdev->cmd_cnt, 1);
 	set_bit(HCI_INIT, &hdev->flags);
 
-	if (hdev->setup && test_bit(HCI_SETUP, &hdev->dev_flags))
+	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags) && hdev->setup)
 		ret = hdev->setup(hdev);
 
 	if (!ret) {
@@ -1581,10 +1581,13 @@ static const struct rfkill_ops hci_rfkill_ops = {
 static void hci_power_on(struct work_struct *work)
 {
 	struct hci_dev *hdev = container_of(work, struct hci_dev, power_on);
+	bool setup;
 	int err;
 
 	BT_DBG("%s", hdev->name);
 
+	setup = test_bit(HCI_SETUP, &hdev->dev_flags);
+
 	err = hci_dev_open(hdev->id);
 	if (err < 0) {
 		mgmt_set_powered_failed(hdev, err);
@@ -1595,7 +1598,7 @@ static void hci_power_on(struct work_struct *work)
 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
 				   HCI_AUTO_OFF_TIMEOUT);
 
-	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
+	if (setup)
 		mgmt_index_added(hdev);
 }
 

^ permalink raw reply related

* RE: [PATCH v5 2/2] Bluetooth: btmrvl: add calibration data download support
From: Bing Zhao @ 2013-09-24 19:22 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: linux-bluetooth@vger.kernel.org, Gustavo Padovan, Johan Hedberg,
	linux-wireless@vger.kernel.org, Mike Frysinger, Hyuckjoo Lee,
	Amitkumar Karwar
In-Reply-To: <34088279-04B9-49D0-9387-88A602F518EC@holtmann.org>

Hi Marcel,

> > The reason of not using __hci_cmd_sync() is that we are sending vendor specific command here
> (MRVL_VENDOR_PKT). The __hci_cmd_sync seems handle HCI_COMMAND_PKT only.
> > Please let us know if you have any suggestion to solve this problem.
> 
> what is a MRVL_VENDOR_PKT actually?

It's defined as 0xfe in our driver. The firmware doesn't understand 0xff (HCI_VENDOR_PKT).

> 
> If you guys are not using standard HCI command/event for vendor operation, then this obviously does
> not fit. However a similar model might make sense instead of manually building packets all the time.

We can extend __hci_cmd_sync() function with a new parameter 'type'.
This way we can pass HCI_VENDOR_PKT into __hci_cmd_sync(), while other drivers will pass in HCI_COMMAND_PKT.

Our driver will make HCI_VENDOR_PKT -> MRVL_VENDOR_PKT conversion before downloading the frame to firmware. And the MRVL_VENDOR_PKT frame from firmware will be replaced with HCI_VENDOR_PKT while uploading the frame to stack.

Please let us know if this approach works for you or not.

Thanks,
Bing


^ permalink raw reply

* RE: [PATCH v5 1/2] Bluetooth: btmrvl: add setup handler
From: Bing Zhao @ 2013-09-24 19:04 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: linux-bluetooth@vger.kernel.org, Gustavo Padovan, Johan Hedberg,
	linux-wireless@vger.kernel.org, Mike Frysinger, Hyuckjoo Lee,
	Amitkumar Karwar
In-Reply-To: <DF6283E3-8476-400F-A230-CB7CA0F98564@holtmann.org>

[-- Attachment #1: Type: text/plain, Size: 1434 bytes --]

Hi Marcel,

> > It's observed that sometimes the setup handler is called twice when Bluetooth daemon is running in
> background. We will rebase to latest commit on bluetooth-next tree and test again. If the issue is
> gone with the latest code in -next tree we will remove the setup_done flag.
> 
> that is a bug. It should only be ever called once. Could this be due to RFKILL issue we had? Please
> re-test with Johan's patches applied and check if it makes a difference. Otherwise please send some
> logs since we want to get this fixed.

Amitkumar Karwar has tested it with latest code on bluetooth-next tree but the result is the same.
Apparently two threads race to call hci_dev_open(). If the thread from hci_sock calls hci_dev_open earlier, it ends up not updating HCI_SETUP hdev flag in hci_power_on(). This results that the setup handler gets called again when user brings up the interface later.

Attached are the debug logs and the patch used to generate them.

I checked the bluetooth-next tree, the following two patches (by Johan) are not present in this tree.

bf54303 Bluetooth: Fix rfkill functionality during the HCI setup stage
5e13036 Bluetooth: Introduce a new HCI_RFKILLED flag

They are in bluetooth.git tree. So, I'm not certain if Amitkumar has applied them manually or not. Anyway we will re-test with Johan's patches applied and confirm if they fix the race or not.

Thanks,
Bing


[-- Attachment #2: success.log --]
[-- Type: application/octet-stream, Size: 1097 bytes --]

[ 1717.100628] mmc1: new SDIO card at address 0001
[ 1717.100862] Bluetooth: vendor=0x2df, device=0x912a, class=255, fn=2
[ 1718.381306] BT_DBG: enter: hci_register_dev
[ 1718.381668] BT_DBG: in hci_register_dev queueing work power_on
[ 1718.381676] BT_DBG: exit: hci_register_dev
[ 1718.382658] BT_DBG: enter: hci_power_on line=1673 pid=3686
[ 1718.382664] BT_DBG: hci_dev_open line=1186 pid=3686
[ 1718.382669] BT_DBG: hci_dev_open line=1200 pid=3686
[ 1718.382673] BT_DBG: hci_dev_open line=1206 pid=3686
[ 1718.382677] BT_DBG: hci_dev_open line=1212 pid=3686
[ 1718.382681] BT_DBG: hci_dev_open line=1217 pid=3686
[ 1718.382684] btmrvl: enter btmrvl_setup()
[ 1718.383231] BT_DBG: calling hci_dev_open from hci_sock.c pid=3689
[ 1718.383236] BT_DBG: hci_dev_open line=1186 pid=3689
[ 1718.489930] BT_DBG: hci_dev_open line=1225 pid=3686
[ 1718.635973] BT_DBG: hci_power_on line=1684 updating HCI_SETUP hdev flag pid=3686
[ 1718.635984] BT_DBG: exit: hci_power_on line=1687 pid=3686
[ 1718.636282] BT_DBG: hci_dev_open line=1200 pid=3689
[ 1718.636288] BT_DBG: hci_dev_open line=1206 pid=3689


[-- Attachment #3: failure.log --]
[-- Type: application/octet-stream, Size: 951 bytes --]

[  132.180560] mmc1: new SDIO card at address 0001
[  132.415282] Bluetooth: vendor=0x2df, device=0x912a, class=255, fn=2
[  133.784309] BT_DBG: enter: hci_register_dev
[  133.784694] BT_DBG: in hci_register_dev queueing work power_on
[  133.784703] BT_DBG: exit: hci_register_dev
[  133.786616] BT_DBG: calling hci_dev_open from hci_sock.c pid=3287
[  133.786624] BT_DBG: hci_dev_open line=1186 pid=3287
[  133.786628] BT_DBG: hci_dev_open line=1200 pid=3287
[  133.786633] BT_DBG: hci_dev_open line=1206 pid=3287
[  133.786636] BT_DBG: hci_dev_open line=1212 pid=3287
[  133.786640] BT_DBG: hci_dev_open line=1217 pid=3287
[  133.786644] btmrvl: enter btmrvl_setup()
[  133.789683] BT_DBG: enter: hci_power_on line=1673 pid=3283
[  133.789691] BT_DBG: hci_dev_open line=1186 pid=3283
[  133.954749] BT_DBG: hci_dev_open line=1225 pid=3287
[  134.101863] BT_DBG: hci_dev_open line=1200 pid=3283
[  134.101871] BT_DBG: hci_dev_open line=1206 pid=3283

[-- Attachment #4: bt_debug.diff --]
[-- Type: application/octet-stream, Size: 3517 bytes --]

diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index 6eea188..b474dde 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -621,6 +621,7 @@ static int btmrvl_setup(struct hci_dev *hdev)
 	struct btmrvl_private *priv = hci_get_drvdata(hdev);
 	struct btmrvl_adapter *adapter = priv->adapter;
 
+	printk("btmrvl: enter btmrvl_setup()\n");
 	if (adapter->setup_done)
 		return 0;
 
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 3d9f02b..d0795e9 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1183,6 +1183,7 @@ int hci_dev_open(__u16 dev)
 	struct hci_dev *hdev;
 	int ret = 0;
 
+	printk("BT_DBG: hci_dev_open line=%d pid=%d\n", __LINE__, current->pid);
 	hdev = hci_dev_get(dev);
 	if (!hdev)
 		return -ENODEV;
@@ -1196,20 +1197,24 @@ int hci_dev_open(__u16 dev)
 		goto done;
 	}
 
+	printk("BT_DBG: hci_dev_open line=%d pid=%d\n", __LINE__, current->pid);
 	if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) {
 		ret = -ERFKILL;
 		goto done;
 	}
 
+	printk("BT_DBG: hci_dev_open line=%d pid=%d\n", __LINE__, current->pid);
 	if (test_bit(HCI_UP, &hdev->flags)) {
 		ret = -EALREADY;
 		goto done;
 	}
 
+	printk("BT_DBG: hci_dev_open line=%d pid=%d\n", __LINE__, current->pid);
 	if (hdev->open(hdev)) {
 		ret = -EIO;
 		goto done;
 	}
+	printk("BT_DBG: hci_dev_open line=%d pid=%d\n", __LINE__, current->pid);
 
 	atomic_set(&hdev->cmd_cnt, 1);
 	set_bit(HCI_INIT, &hdev->flags);
@@ -1217,6 +1222,7 @@ int hci_dev_open(__u16 dev)
 	if (hdev->setup && test_bit(HCI_SETUP, &hdev->dev_flags))
 		ret = hdev->setup(hdev);
 
+	printk("BT_DBG: hci_dev_open line=%d pid=%d\n", __LINE__, current->pid);
 	if (!ret) {
 		/* Treat all non BR/EDR controllers as raw devices if
 		 * enable_hs is not set.
@@ -1664,6 +1670,7 @@ static void hci_power_on(struct work_struct *work)
 
 	BT_DBG("%s", hdev->name);
 
+	printk("BT_DBG: enter: hci_power_on line=%d pid=%d\n", __LINE__, current->pid);
 	err = hci_dev_open(hdev->id);
 	if (err < 0) {
 		mgmt_set_powered_failed(hdev, err);
@@ -1674,8 +1681,10 @@ static void hci_power_on(struct work_struct *work)
 		queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
 				   HCI_AUTO_OFF_TIMEOUT);
 
+	printk("BT_DBG: hci_power_on line=%d updating HCI_SETUP hdev flag pid=%d\n", __LINE__, current->pid);
 	if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
 		mgmt_index_added(hdev);
+	printk("BT_DBG: exit: hci_power_on line=%d pid=%d\n", __LINE__, current->pid);
 }
 
 static void hci_power_off(struct work_struct *work)
@@ -2234,6 +2243,7 @@ int hci_register_dev(struct hci_dev *hdev)
 {
 	int id, error;
 
+	printk("BT_DBG: enter: hci_register_dev\n");
 	if (!hdev->open || !hdev->close)
 		return -EINVAL;
 
@@ -2300,7 +2310,9 @@ int hci_register_dev(struct hci_dev *hdev)
 	hci_notify(hdev, HCI_DEV_REG);
 	hci_dev_hold(hdev);
 
+	printk("BT_DBG: in hci_register_dev queueing work power_on\n");
 	queue_work(hdev->req_workqueue, &hdev->power_on);
+	printk("BT_DBG: exit: hci_register_dev\n");
 
 	return id;
 
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index c09e976..ddefcbe 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -587,6 +587,7 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,
 	case HCIDEVUP:
 		if (!capable(CAP_NET_ADMIN))
 			return -EPERM;
+		printk("BT_DBG: calling hci_dev_open from hci_sock.c pid=%d\n", current->pid);
 		return hci_dev_open(arg);
 
 	case HCIDEVDOWN:

^ permalink raw reply related

* Frame injection at arbitrary rate
From: Rahim Rasheed @ 2013-09-24 18:38 UTC (permalink / raw)
  To: linux-wireless

Hi,

I was wondering why frame injection at arbitrary rates is not
supported. Radiotap properly supports 11g/a and 11n and it is working
on 11ac. Some time ago i saw a few submission of patches for adding
this feature for both 11g and 11n. I'm using the former without
problems. Is there a particular reason why these patches are held
back? I think they would be useful to many people.

Respectfully

R^2

^ permalink raw reply

* [PATCH] ti-connectivity: add wl1251 firmware and license
From: Felipe Balbi @ 2013-09-24 14:44 UTC (permalink / raw)
  To: ben
  Cc: Linux Kernel Mailing List, linux-wireless, Felipe Balbi,
	Luciano Coelho, Pavel Machek

It's way overdue that we send these firmware
blobs upstream. Thanks for everybody involved
in getting this sorted out.

Cc: Luciano Coelho <luca@coelho.fi>
Cc: Pavel Machek <pavel@denx.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
---
 ti-connectivity/license-wl1251.txt |  59 +++++++++++++++++++++++++++++++++++++
 ti-connectivity/wl1251-fw.bin      | Bin 0 -> 194180 bytes
 ti-connectivity/wl1251-nvs.bin     | Bin 0 -> 752 bytes
 3 files changed, 59 insertions(+)
 create mode 100644 ti-connectivity/license-wl1251.txt
 create mode 100644 ti-connectivity/wl1251-fw.bin
 create mode 100644 ti-connectivity/wl1251-nvs.bin

diff --git a/ti-connectivity/license-wl1251.txt b/ti-connectivity/license-wl1251.txt
new file mode 100644
index 0000000..bd0f5f1
--- /dev/null
+++ b/ti-connectivity/license-wl1251.txt
@@ -0,0 +1,59 @@
+Copyright (c) 2000 – 2013 Texas Instruments Incorporated
+
+All rights reserved not granted herein.
+
+Limited License.
+
+Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
+license under copyrights and patents it now or hereafter owns or controls to
+make, have made, use, import, offer to sell and sell ("Utilize") this software
+subject to the terms herein.  With respect to the foregoing patent license,
+such license is granted  solely to the extent that any such patent is necessary
+to Utilize the software alone.  The patent license shall not apply to any
+combinations which include this software, other than combinations with devices
+manufactured by or for TI (“TI Devices”).  No hardware patent is licensed
+hereunder.
+
+Redistributions must preserve existing copyright notices and reproduce this
+license (including the above copyright notice and the disclaimer and (if
+applicable) source code license limitations below) in the documentation and/or
+other materials provided with the distribution
+
+Redistribution and use in binary form, without modification, are permitted
+provided that the following conditions are met:
+
+*	No reverse engineering, decompilation, or disassembly of this software
+	is permitted with respect to any software provided in binary form.
+
+*	any redistribution and use are licensed by TI for use only with TI
+	Devices.
+
+*	Nothing shall obligate TI to provide you with source code for the
+	software licensed and provided to you in object code.
+
+If software source code is provided to you, modification and redistribution of
+the source code are permitted provided that the following conditions are met:
+
+*	any redistribution and use of the source code, including any resulting
+	derivative works, are licensed by TI for use only with TI Devices.
+
+*	any redistribution and use of any object code compiled from the source
+	code and any resulting derivative works, are licensed by TI for use
+	only with TI Devices.
+
+Neither the name of Texas Instruments Incorporated nor the names of its
+suppliers may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+DISCLAIMER.
+
+THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/ti-connectivity/wl1251-fw.bin b/ti-connectivity/wl1251-fw.bin
new file mode 100644
index 0000000000000000000000000000000000000000..f89c98354cab391e7003ffe4c6841215ab7bef76
GIT binary patch
literal 194180
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%0DZNgQ|l$>G7j@jx>*t`nNMBOd&daWUgx^;5Z3
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
Wez@sOLAM^z7`-nFct1w-Xa5guw7pRP

literal 0
HcmV?d00001

diff --git a/ti-connectivity/wl1251-nvs.bin b/ti-connectivity/wl1251-nvs.bin
new file mode 100644
index 0000000000000000000000000000000000000000..2bf9c50b24d9306cb9a811018838fe265d27bd8e
GIT binary patch
literal 752
zcmZP)3}cgFV-!nZW@qFK6JlUsVB`&R08&i3A)L(Y3P2VEqiDnu5M>y~!~~>F!&oi~
zgTz5VfFX$?g`tdL9m5p{Ek<KTQ$}w_UM72{Xr^4IN~Xn3>p(gLAZih$G*Hxzp^9M}
z!x@Ih48MR9HVhRETNpkNU~#gz2>fAo#V`+HGKj^-$H8dLpu!NrlEQF+t(9{D&~z0B
z29^MZ3ycZE7m#>8A{>kexgDa&JQuO83_(DB?LbrVm|8g**@4zN0DZ&2z{<kF@DJqb
z|3L5;2!1pC{q@~|g`a_epG?dE)HmSR0O&W;058)NRtTI5q?;IKL*ZdyFbOcqNl3^s
zC^0aosH&-h%;jQK08wDT!OG6c%)r3}Oj5wa00UfXz@S9~oCsGjI-tqn=7ORI3jhGQ
C1YQIH

literal 0
HcmV?d00001

-- 
1.8.3.4.840.g6a90778


^ permalink raw reply related

* [PATCH 4/5] ath10k: fix Native Wifi decap mode RX
From: Michal Kazior @ 2013-09-24 13:09 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Michal Kazior
In-Reply-To: <1380028158-861-1-git-send-email-michal.kazior@tieto.com>

NWifi decap mode always reports 802.11 Data
Frames, even when QoS Data Frames are actually
received.

This made mac80211 not report frame priority
properly (since there was no QoS Control field).

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath10k/htt_rx.c |   32 +++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index f8620b0..c119057 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -618,7 +618,7 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
 	enum rx_msdu_decap_format fmt;
 	enum htt_rx_mpdu_encrypt_type enctype;
 	struct ieee80211_hdr *hdr;
-	u8 hdr_buf[64];
+	u8 hdr_buf[64], addr[ETH_ALEN], *qos;
 	unsigned int hdr_len;
 
 	rxd = (void *)skb->data - sizeof(*rxd);
@@ -671,7 +671,25 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
 			skb_trim(skb, skb->len - FCS_LEN);
 			break;
 		case RX_MSDU_DECAP_NATIVE_WIFI:
-			/* nothing to do */
+			/* pull decapped header and copy DA */
+			hdr = (struct ieee80211_hdr *)skb->data;
+			hdr_len = ieee80211_hdrlen(hdr->frame_control);
+			memcpy(addr, ieee80211_get_DA(hdr), ETH_ALEN);
+			skb_pull(skb, hdr_len);
+
+			/* push original 802.11 header */
+			hdr = (struct ieee80211_hdr *)hdr_buf;
+			hdr_len = ieee80211_hdrlen(hdr->frame_control);
+			memcpy(skb_push(skb, hdr_len), hdr, hdr_len);
+
+			/* original A-MSDU header has the bit set but we're
+			 * not including A-MSDU subframe header */
+			hdr = (struct ieee80211_hdr *)skb->data;
+			qos = ieee80211_get_qos_ctl(hdr);
+			qos[0] &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
+
+			/* original 802.11 header has a different DA */
+			memcpy(ieee80211_get_DA(hdr), addr, ETH_ALEN);
 			break;
 		case RX_MSDU_DECAP_ETHERNET2_DIX:
 			/* strip ethernet header and insert decapped 802.11
@@ -736,7 +754,15 @@ static void ath10k_htt_rx_msdu(struct ath10k_htt *htt, struct htt_rx_info *info)
 		skb_trim(skb, skb->len - FCS_LEN);
 		break;
 	case RX_MSDU_DECAP_NATIVE_WIFI:
-		/* nothing to do here */
+		/* Pull decapped header */
+		hdr = (struct ieee80211_hdr *)skb->data;
+		hdr_len = ieee80211_hdrlen(hdr->frame_control);
+		skb_pull(skb, hdr_len);
+
+		/* Push original header */
+		hdr = (struct ieee80211_hdr *)rxd->rx_hdr_status;
+		hdr_len = ieee80211_hdrlen(hdr->frame_control);
+		memcpy(skb_push(skb, hdr_len), hdr, hdr_len);
 		break;
 	case RX_MSDU_DECAP_ETHERNET2_DIX:
 		/* strip ethernet header and insert decapped 802.11 header and
-- 
1.7.9.5


^ permalink raw reply related

* [PATCH 5/5] ath10k: align RX frames properly
From: Michal Kazior @ 2013-09-24 13:09 UTC (permalink / raw)
  To: ath10k; +Cc: linux-wireless, Michal Kazior
In-Reply-To: <1380028158-861-1-git-send-email-michal.kazior@tieto.com>

Ethernet-like decapping mode leaves IP protocol
frame not aligned to 4-byte boundaries. This leads
to re-aligning in mac80211 which in turn leads to
poor CPU cache behaviour on some machines.

Since HW doesn't allow to change payload offset
properly the solution is to force HW to decap in
Native Wifi mode which always has 24-bytes long
802.11 header (even for QoS frames). This means IP
frame is properly aligned in this decap mode.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
---
 drivers/net/wireless/ath/ath10k/hw.h |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index 643f0c9..8c1be768 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -74,7 +74,11 @@ enum ath10k_mcast2ucast_mode {
 #define TARGET_RX_CHAIN_MASK			(BIT(0) | BIT(1) | BIT(2))
 #define TARGET_RX_TIMEOUT_LO_PRI		100
 #define TARGET_RX_TIMEOUT_HI_PRI		40
-#define TARGET_RX_DECAP_MODE			ATH10K_HW_TXRX_ETHERNET
+
+/* Native Wifi decap mode is used to align IP frames to 4-byte boundaries and
+ * avoid a very expensive re-alignment in mac80211. */
+#define TARGET_RX_DECAP_MODE			ATH10K_HW_TXRX_NATIVE_WIFI
+
 #define TARGET_SCAN_MAX_PENDING_REQS		4
 #define TARGET_BMISS_OFFLOAD_MAX_VDEV		3
 #define TARGET_ROAM_OFFLOAD_MAX_VDEV		3
-- 
1.7.9.5


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox