--- /dev/null
+From 64ed5771aca2fcfb8ea440fc679741054011fd7e Mon Sep 17 00:00:00 2001
+From: Tamizh chelvam <c_traja@qti.qualcomm.com>
+Date: Tue, 2 Aug 2016 16:13:14 +0530
+Subject: ath10k: Add WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT wmi service
+
+From: Tamizh chelvam <c_traja@qti.qualcomm.com>
+
+commit 64ed5771aca2fcfb8ea440fc679741054011fd7e upstream.
+
+WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT service has missed in
+the commit 7e247a9e88dc ("ath10k: add dynamic tx mode switch
+config support for qca4019"). This patch adds the service to
+avoid mismatch between host and target.
+
+Fixes: 7e247a9e88dc ("ath10k: add dynamic tx mode switch config support for qca4019")
+Signed-off-by: Tamizh chelvam <c_traja@qti.qualcomm.com>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/ath/ath10k/wmi.h | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/net/wireless/ath/ath10k/wmi.h
++++ b/drivers/net/wireless/ath/ath10k/wmi.h
+@@ -180,6 +180,7 @@ enum wmi_service {
+ WMI_SERVICE_MESH_NON_11S,
+ WMI_SERVICE_PEER_STATS,
+ WMI_SERVICE_RESTRT_CHNL_SUPPORT,
++ WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT,
+ WMI_SERVICE_TX_MODE_PUSH_ONLY,
+ WMI_SERVICE_TX_MODE_PUSH_PULL,
+ WMI_SERVICE_TX_MODE_DYNAMIC,
+@@ -305,6 +306,7 @@ enum wmi_10_4_service {
+ WMI_10_4_SERVICE_RESTRT_CHNL_SUPPORT,
+ WMI_10_4_SERVICE_PEER_STATS,
+ WMI_10_4_SERVICE_MESH_11S,
++ WMI_10_4_SERVICE_PERIODIC_CHAN_STAT_SUPPORT,
+ WMI_10_4_SERVICE_TX_MODE_PUSH_ONLY,
+ WMI_10_4_SERVICE_TX_MODE_PUSH_PULL,
+ WMI_10_4_SERVICE_TX_MODE_DYNAMIC,
+@@ -402,6 +404,7 @@ static inline char *wmi_service_name(int
+ SVCSTR(WMI_SERVICE_MESH_NON_11S);
+ SVCSTR(WMI_SERVICE_PEER_STATS);
+ SVCSTR(WMI_SERVICE_RESTRT_CHNL_SUPPORT);
++ SVCSTR(WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT);
+ SVCSTR(WMI_SERVICE_TX_MODE_PUSH_ONLY);
+ SVCSTR(WMI_SERVICE_TX_MODE_PUSH_PULL);
+ SVCSTR(WMI_SERVICE_TX_MODE_DYNAMIC);
+@@ -652,6 +655,8 @@ static inline void wmi_10_4_svc_map(cons
+ WMI_SERVICE_PEER_STATS, len);
+ SVCMAP(WMI_10_4_SERVICE_MESH_11S,
+ WMI_SERVICE_MESH_11S, len);
++ SVCMAP(WMI_10_4_SERVICE_PERIODIC_CHAN_STAT_SUPPORT,
++ WMI_SERVICE_PERIODIC_CHAN_STAT_SUPPORT, len);
+ SVCMAP(WMI_10_4_SERVICE_TX_MODE_PUSH_ONLY,
+ WMI_SERVICE_TX_MODE_PUSH_ONLY, len);
+ SVCMAP(WMI_10_4_SERVICE_TX_MODE_PUSH_PULL,
--- /dev/null
+From 77eb3d693182b4eaa88c6ba406fbb92b1f1bd636 Mon Sep 17 00:00:00 2001
+From: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
+Date: Fri, 2 Sep 2016 10:59:53 +0530
+Subject: ath10k: fix reporting channel survey data
+
+From: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
+
+commit 77eb3d693182b4eaa88c6ba406fbb92b1f1bd636 upstream.
+
+When user requests for survey dump data, driver is providing wrong survey
+information. This information we sent is the survey data that we have
+collected during previous user request.
+
+This issue occurs because we request survey dump for wrong channel. With
+this change, we correctly display the correct and current survey
+information to userspace.
+
+Fixes: fa7937e3d5c2 ("ath10k: update bss channel survey information")
+Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/ath/ath10k/mac.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/ath/ath10k/mac.c
++++ b/drivers/net/wireless/ath/ath10k/mac.c
+@@ -6558,7 +6558,7 @@ static int ath10k_get_survey(struct ieee
+ goto exit;
+ }
+
+- ath10k_mac_update_bss_chan_survey(ar, survey->channel);
++ ath10k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
+
+ spin_lock_bh(&ar->data_lock);
+ memcpy(survey, ar_survey, sizeof(*survey));
--- /dev/null
+From e4fd726f21cdae0dc9cea6cbfcb7e27f21393f88 Mon Sep 17 00:00:00 2001
+From: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
+Date: Thu, 18 Aug 2016 15:30:04 +0530
+Subject: ath10k: fix sending frame in management path in push txq logic
+
+From: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
+
+commit e4fd726f21cdae0dc9cea6cbfcb7e27f21393f88 upstream.
+
+In the wake tx queue path, we are not checking if the frame to be sent
+takes management path or not. For eg. QOS null func frame coming here will
+take the management path. Since we are not incrementing the descriptor
+counter (num_pending_mgmt_tx) w.r.t tx management, on tx completion it is
+possible to see negative values.
+
+When the above counter reaches a negative value, we will not be sending a
+probe response out.
+
+ if (is_presp &&
+ ar->hw_params.max_probe_resp_desc_thres < htt->num_pending_mgmt_tx)
+
+For IPQ4019, max_probe_resp_desc_thres (u32) is 24 is compared against
+num_pending_mgmt_tx (int) and the above condtions comes true if the counter
+is negative and we drop the probe response.
+
+To avoid this, check on the wake tx queue path as well for the tx path of
+the frame and increment the appropriate counters
+
+Fixes: cac085524cf1 "ath10k: move mgmt descriptor limit handle under mgmt_tx"
+Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/ath/ath10k/mac.c | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+--- a/drivers/net/wireless/ath/ath10k/mac.c
++++ b/drivers/net/wireless/ath/ath10k/mac.c
+@@ -3777,7 +3777,9 @@ int ath10k_mac_tx_push_txq(struct ieee80
+ enum ath10k_hw_txrx_mode txmode;
+ enum ath10k_mac_tx_path txpath;
+ struct sk_buff *skb;
++ struct ieee80211_hdr *hdr;
+ size_t skb_len;
++ bool is_mgmt, is_presp;
+ int ret;
+
+ spin_lock_bh(&ar->htt.tx_lock);
+@@ -3801,6 +3803,22 @@ int ath10k_mac_tx_push_txq(struct ieee80
+ skb_len = skb->len;
+ txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
+ txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
++ is_mgmt = (txpath == ATH10K_MAC_TX_HTT_MGMT);
++
++ if (is_mgmt) {
++ hdr = (struct ieee80211_hdr *)skb->data;
++ is_presp = ieee80211_is_probe_resp(hdr->frame_control);
++
++ spin_lock_bh(&ar->htt.tx_lock);
++ ret = ath10k_htt_tx_mgmt_inc_pending(htt, is_mgmt, is_presp);
++
++ if (ret) {
++ ath10k_htt_tx_dec_pending(htt);
++ spin_unlock_bh(&ar->htt.tx_lock);
++ return ret;
++ }
++ spin_unlock_bh(&ar->htt.tx_lock);
++ }
+
+ ret = ath10k_mac_tx(ar, vif, sta, txmode, txpath, skb);
+ if (unlikely(ret)) {
+@@ -3808,6 +3826,8 @@ int ath10k_mac_tx_push_txq(struct ieee80
+
+ spin_lock_bh(&ar->htt.tx_lock);
+ ath10k_htt_tx_dec_pending(htt);
++ if (is_mgmt)
++ ath10k_htt_tx_mgmt_dec_pending(htt);
+ spin_unlock_bh(&ar->htt.tx_lock);
+
+ return ret;
--- /dev/null
+From 18f53fe0f30331e826b075709ed7b26b9283235e Mon Sep 17 00:00:00 2001
+From: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
+Date: Fri, 2 Sep 2016 19:46:10 +0300
+Subject: ath10k: fix throughput regression in multi client mode
+
+From: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
+
+commit 18f53fe0f30331e826b075709ed7b26b9283235e upstream.
+
+commit 7a0adc83f34d ("ath10k: improve tx scheduling") is causing
+severe throughput drop in multi client mode. This issue is originally
+reported in veriwave setup with 50 clients with TCP downlink traffic.
+While increasing number of clients, the average throughput drops
+gradually. With 50 clients, the combined peak throughput is decreased
+to 98 Mbps whereas reverting given commit restored it to 550 Mbps.
+
+Processing txqs for every tx completion is causing overhead. Ideally for
+management frame tx completion, pending txqs processing can be avoided.
+The change partly reverts the commit "ath10k: improve tx scheduling".
+Processing pending txqs after all skbs tx completion will yeild enough
+room to burst tx frames.
+
+Fixes: 7a0adc83f34d ("ath10k: improve tx scheduling")
+Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
+Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/ath/ath10k/htt_rx.c | 2 ++
+ drivers/net/wireless/ath/ath10k/txrx.c | 2 --
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
++++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
+@@ -2394,6 +2394,8 @@ static void ath10k_htt_txrx_compl_task(u
+ skb_queue_splice_init(&htt->rx_in_ord_compl_q, &rx_ind_q);
+ spin_unlock_irqrestore(&htt->rx_in_ord_compl_q.lock, flags);
+
++ ath10k_mac_tx_push_pending(ar);
++
+ spin_lock_irqsave(&htt->tx_fetch_ind_q.lock, flags);
+ skb_queue_splice_init(&htt->tx_fetch_ind_q, &tx_ind_q);
+ spin_unlock_irqrestore(&htt->tx_fetch_ind_q.lock, flags);
+--- a/drivers/net/wireless/ath/ath10k/txrx.c
++++ b/drivers/net/wireless/ath/ath10k/txrx.c
+@@ -119,8 +119,6 @@ int ath10k_txrx_tx_unref(struct ath10k_h
+ ieee80211_tx_status(htt->ar->hw, msdu);
+ /* we do not own the msdu anymore */
+
+- ath10k_mac_tx_push_pending(ar);
+-
+ return 0;
+ }
+
--- /dev/null
+From 776b2e15f8af7900409456292efd45af6de97172 Mon Sep 17 00:00:00 2001
+From: Jacob Keller <jacob.e.keller@intel.com>
+Date: Tue, 19 Jul 2016 16:23:30 -0700
+Subject: i40e: fix broken i40e_config_rss_aq function
+
+From: Jacob Keller <jacob.e.keller@intel.com>
+
+commit 776b2e15f8af7900409456292efd45af6de97172 upstream.
+
+X722 hardware requires using the admin queue to configure RSS. This
+function was previously re-written in commit e69ff813af35 ("i40e: rework
+the functions to configure RSS with similar parameters").
+However, the previous refactor did not work correctly for a few reasons
+
+(a) it does not check whether seed is NULL before using it, resulting in
+a NULL pointer dereference
+
+[ 402.954721] BUG: unable to handle kernel NULL pointer dereference at (null)
+[ 402.955568] IP: [<ffffffffa0090ccf>] i40e_config_rss_aq.constprop.65+0x2f/0x1c0 [i40e]
+[ 402.956402] PGD ad610067 PUD accc0067 PMD 0
+[ 402.957235] Oops: 0000 [#1] SMP
+[ 402.958064] Modules linked in: ip6t_rpfilter ip6t_REJECT nf_reject_ipv6 xt_conntrack ip_set nfnetlink ebtable_filter ebtable_
+broute bridge stp llc ebtable_nat ebtables ip6table_mangle ip6table_raw ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv
+6 ip6table_security ip6table_filter ip6_tables iptable_mangle iptable_raw iptable_nat nf_conntrack_ipv4_ nf_defrag_ipv4_ nf_nat_ip
+v4_ nf_nat nf_conntrack iptable_security intel_rapl i86_kg_temp_thermal coretemp kvm_intel kvm irqbypass crct10dif_clMl crc32_
+pclMl ghash_clMlni_intel iTCO_wdt iTCO_vendor_support shpchp sb_edac dcdbas pcspkr joydev ipmi_devintf wmi edac_core ipmi_ssif
+ acpi_ad acpi_ower_meter ipmi_si ipmi_msghandler mei_me nfsd lpc_ich mei ioatdma tpm_tis auth_rpcgss tpm nfs_acl lockd grace s
+unrpc ifs nngag200 i2c_algo_bit drm_kms_helper ttm drm iigbe bnx2x i40e dca mdio ptp pps_core libcrc32c fjes crc32c_intel
+[ 402.965563] CPU: 22 PID: 2461 Conm: ethtool Not tainted 4.6.0-rc7_1.2-ABNidQ+ #20
+[ 402.966719] Hardware name: Dell Inc. PowerEdge R720/0C4Y3R, BIOS 2.5.2 01/28/2015
+[ 402.967862] task: ffff880219b51dc0 ti: ffff8800b3408000 task.ti: ffff8800b3408000
+[ 402.969046] RIP: 0010:[<ffffffffa0090ccf>] [<ffffffffa0090ccf>] i40e_config_rss_aq.constprop.65+0x2f/0x1c0 [i40e]
+[ 402.970339] RSP: 0018:ffff8800b340ba90 EFLAGS: 00010246
+[ 402.971616] RAX: 0000000000000000 RBX: ffff88042ec14000 RCX: 0000000000000200
+[ 402.972961] RDX: ffff880428eb9200 RSI: 0000000000000000 RDI: ffff88042ec14000
+[ 402.974312] RBP: ffff8800b340baf8 R08: ffff880237ada8f0 R09: ffff880428eb9200
+[ 402.975709] R10: ffff880428eb9200 R11: 0000000000000000 R12: ffff88042ec2e000
+[ 402.977104] R13: ffff88042ec2e000 R14: ffff88042ec14000 R15: ffff88022ea00800
+[ 402.978541] FS: 00007f84fd054700(0000) GS:ffff880237ac0000(0000) knlGS:0000000000000000
+[ 402.980003] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+[ 402.981508] CR2: 0000000000000000 CR3: 000000003289e000 CR4: 00000000000406e0
+[ 402.983028] Stack:
+[ 402.984578] 0000000002000200 0000000000000000 ffff88023ffeda68 ffff88023ffef000
+[ 402.986187] 0000000000000268 ffff8800b340bbf8 ffff88023ffedd80 0000000088ce4f1d
+[ 402.987844] ffff88042ec14000 ffff88022ea00800 ffff88042ec2e000 ffff88042ec14000
+[ 402.989509] Call Trace:
+[ 402.991200] [<ffffffffa009636f>] i40e_config_rss+0x11f/0x1c0 [i40e]
+[ 402.992924] [<ffffffffa00a1ae0>] i40e_set_rifh+0ic0/0x130 [i40e]
+[ 402.994684] [<ffffffff816d54b7>] ethtool_set_rifh+0x1f7/0x300
+[ 402.996446] [<ffffffff8136d02b>] ? cred_has_capability+0io6b/0x100
+[ 402.998203] [<ffffffff8136d102>] ? selinux_capable+0x12/0x20
+[ 402.999968] [<ffffffff8136277b>] ? security_capable+0x4b/0x70
+[ 403.001707] [<ffffffff816d6da3>] dev_ethtool+0x1423/0x2290
+[ 403.003461] [<ffffffff816eab41>] dev_ioctl+0x191/0io630
+[ 403.005186] [<ffffffff811cf80a>] ? lru_cache_add+0x3a/0i80
+[ 403.006942] [<ffffffff817f2a8e>] ? _raw_spin_unlock+0ie/0x20
+[ 403.008691] [<ffffffff816adb95>] sock_do_ioctl+0x45/0i50
+[ 403.010421] [<ffffffff816ae229>] sock_ioctl+0x209/0x2d0
+[ 403.012173] [<ffffffff81262194>] do_vfs_ioctl+0u4/0io6c0
+[ 403.013911] [<ffffffff81262829>] SyS_ioctl+0x79/0x90
+[ 403.015710] [<ffffffff817f2e72>] entry_SYSCALL_64_fastpath+0x1a/0u4
+[ 403.017500] Code: 90 55 48 89 e5 41 57 41 56 41 55 41 54 53 48 89 fb 48 83 ec 40 4c 8b a7 e0 05 00 00 65 48 8b 04 25 28 00 00 00 48 89 45 d0 31 c0 <48> 8b 06 41 0f b7 bc 24 f2 0f 00 00 48 89 45 9c 48 8b 46 08 48
+[ 403.021454] RIP [<ffffffffa0090ccf>] i40e_config_rss_aq.constprop.65+0x2f/0x1c0 [i40e]
+[ 403.023395] RSP <ffff8800b340ba90>
+[ 403.025271] CR2: 0000000000000000
+[ 403.027169] ---[ end trace 64561b528cf61cf0 ]---
+
+(b) it does not even bother to use the passed in *lut parameter which
+defines the requested lookup table. Instead it uses its own round robin
+table.
+
+Fix these issues by re-writing it to be similar to i40e_config_rss_reg
+and i40e_get_rss_aq.
+
+Fixes: e69ff813af35 ("i40e: rework the functions to configure RSS with similar parameters", 2015-10-21)
+Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
+Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/intel/i40e/i40e_main.c | 57 +++++++++++-----------------
+ 1 file changed, 23 insertions(+), 34 deletions(-)
+
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -7990,45 +7990,34 @@ static int i40e_setup_misc_vector(struct
+ static int i40e_config_rss_aq(struct i40e_vsi *vsi, const u8 *seed,
+ u8 *lut, u16 lut_size)
+ {
+- struct i40e_aqc_get_set_rss_key_data rss_key;
+ struct i40e_pf *pf = vsi->back;
+ struct i40e_hw *hw = &pf->hw;
+- bool pf_lut = false;
+- u8 *rss_lut;
+- int ret, i;
++ int ret = 0;
+
+- memcpy(&rss_key, seed, sizeof(rss_key));
+-
+- rss_lut = kzalloc(pf->rss_table_size, GFP_KERNEL);
+- if (!rss_lut)
+- return -ENOMEM;
+-
+- /* Populate the LUT with max no. of queues in round robin fashion */
+- for (i = 0; i < vsi->rss_table_size; i++)
+- rss_lut[i] = i % vsi->rss_size;
+-
+- ret = i40e_aq_set_rss_key(hw, vsi->id, &rss_key);
+- if (ret) {
+- dev_info(&pf->pdev->dev,
+- "Cannot set RSS key, err %s aq_err %s\n",
+- i40e_stat_str(&pf->hw, ret),
+- i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
+- goto config_rss_aq_out;
++ if (seed) {
++ struct i40e_aqc_get_set_rss_key_data *seed_dw =
++ (struct i40e_aqc_get_set_rss_key_data *)seed;
++ ret = i40e_aq_set_rss_key(hw, vsi->id, seed_dw);
++ if (ret) {
++ dev_info(&pf->pdev->dev,
++ "Cannot set RSS key, err %s aq_err %s\n",
++ i40e_stat_str(hw, ret),
++ i40e_aq_str(hw, hw->aq.asq_last_status));
++ return ret;
++ }
+ }
++ if (lut) {
++ bool pf_lut = vsi->type == I40E_VSI_MAIN ? true : false;
+
+- if (vsi->type == I40E_VSI_MAIN)
+- pf_lut = true;
+-
+- ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, rss_lut,
+- vsi->rss_table_size);
+- if (ret)
+- dev_info(&pf->pdev->dev,
+- "Cannot set RSS lut, err %s aq_err %s\n",
+- i40e_stat_str(&pf->hw, ret),
+- i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
+-
+-config_rss_aq_out:
+- kfree(rss_lut);
++ ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, lut, lut_size);
++ if (ret) {
++ dev_info(&pf->pdev->dev,
++ "Cannot set RSS lut, err %s aq_err %s\n",
++ i40e_stat_str(hw, ret),
++ i40e_aq_str(hw, hw->aq.asq_last_status));
++ return ret;
++ }
++ }
+ return ret;
+ }
+
--- /dev/null
+From be0cb0a66a1d426f7cd9b170c008725044ae147a Mon Sep 17 00:00:00 2001
+From: Dan Carpenter <dan.carpenter@oracle.com>
+Date: Wed, 3 Aug 2016 22:01:07 +0300
+Subject: i40e: remove a stray unlock
+
+From: Dan Carpenter <dan.carpenter@oracle.com>
+
+commit be0cb0a66a1d426f7cd9b170c008725044ae147a upstream.
+
+We shifted the locking around a bit but forgot to delete this unlock so
+now it can unlock twice.
+
+Fixes: cd3be169a5ff ('i40e: Move the mutex lock in i40e_client_unregister')
+Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
+Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/intel/i40e/i40e_client.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/drivers/net/ethernet/intel/i40e/i40e_client.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_client.c
+@@ -1009,7 +1009,6 @@ int i40e_unregister_client(struct i40e_c
+ if (!i40e_client_is_registered(client)) {
+ pr_info("i40e: Client %s has not been registered\n",
+ client->name);
+- mutex_unlock(&i40e_client_mutex);
+ ret = -ENODEV;
+ goto out;
+ }
--- /dev/null
+From b64db1b252e9974a43a51ba083fa7d03e4716167 Mon Sep 17 00:00:00 2001
+From: Xinming Hu <huxm@marvell.com>
+Date: Tue, 9 Aug 2016 20:20:44 +0530
+Subject: mwifiex: correct aid value during tdls setup
+
+From: Xinming Hu <huxm@marvell.com>
+
+commit b64db1b252e9974a43a51ba083fa7d03e4716167 upstream.
+
+AID gets updated during TDLS setup, but modified value isn't reflected
+in "priv->assoc_rsp_buf". This causes TDLS setup failure. The problem is
+fixed here.
+
+Fixes: 4aff53ef18e4a4 ("mwifiex: parsing aid while receiving..")
+Signed-off-by: Xinming Hu <huxm@marvell.com>
+Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/marvell/mwifiex/join.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/marvell/mwifiex/join.c
++++ b/drivers/net/wireless/marvell/mwifiex/join.c
+@@ -669,9 +669,8 @@ int mwifiex_ret_802_11_associate(struct
+ priv->assoc_rsp_size = min(le16_to_cpu(resp->size) - S_DS_GEN,
+ sizeof(priv->assoc_rsp_buf));
+
+- memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size);
+-
+ assoc_rsp->a_id = cpu_to_le16(aid);
++ memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size);
+
+ if (status_code) {
+ priv->adapter->dbg.num_cmd_assoc_failure++;
--- /dev/null
+From c8ccf3ade7851054f82bf88f5fcd393a394038a3 Mon Sep 17 00:00:00 2001
+From: Amitkumar Karwar <akarwar@marvell.com>
+Date: Mon, 25 Jul 2016 21:21:06 +0530
+Subject: mwifiex: fix failed to reconnect after interface disabled/enabled
+
+From: Amitkumar Karwar <akarwar@marvell.com>
+
+commit c8ccf3ade7851054f82bf88f5fcd393a394038a3 upstream.
+
+Recent patch "mwifiex: fix NULL pointer" skips extended scan event
+handling when suspend is in progress. It created a problem for scan
+after interface disabled/enabled case.
+
+This patch solves the problem by checking netif_running() status.
+
+Fixes:16d25da94f3d654 ("mwifiex: fix NULL pointer dereference during suspend")
+Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/wireless/marvell/mwifiex/sta_event.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/marvell/mwifiex/sta_event.c
++++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c
+@@ -708,7 +708,11 @@ int mwifiex_process_sta_event(struct mwi
+
+ case EVENT_EXT_SCAN_REPORT:
+ mwifiex_dbg(adapter, EVENT, "event: EXT_SCAN Report\n");
+- if (adapter->ext_scan && !priv->scan_aborting)
++ /* We intend to skip this event during suspend, but handle
++ * it in interface disabled case
++ */
++ if (adapter->ext_scan && (!priv->scan_aborting ||
++ !netif_running(priv->netdev)))
+ ret = mwifiex_handle_event_ext_scan_report(priv,
+ adapter->event_skb->data);
+
uio-fix-dmem_region_start-computation.patch
arm-clk-imx35-fix-name-for-ckil-clk.patch
spi-spi-fsl-dspi-drop-extra-spi_master_put-in-device-remove-function.patch
+i40e-remove-a-stray-unlock.patch
+i40e-fix-broken-i40e_config_rss_aq-function.patch
+mwifiex-correct-aid-value-during-tdls-setup.patch
+mwifiex-fix-failed-to-reconnect-after-interface-disabled-enabled.patch
+ath10k-add-wmi_service_periodic_chan_stat_support-wmi-service.patch
+ath10k-fix-sending-frame-in-management-path-in-push-txq-logic.patch
+ath10k-fix-reporting-channel-survey-data.patch
+ath10k-fix-throughput-regression-in-multi-client-mode.patch