<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.linux.kernel.wireless.general">
    <title>gmane.linux.kernel.wireless.general</title>
    <link>http://blog.gmane.org/gmane.linux.kernel.wireless.general</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91474"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91467"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91466"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91451"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91442"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91438"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91434"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91431"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91419"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91415"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91414"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91413"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91412"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91407"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91393"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91392"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91391"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91390"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91389"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91388"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91474">
    <title>[PATCH] mac80211: Add routine for retrieving qosnull frame</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91474</link>
    <description>&lt;pre&gt;From: Soumik Das &amp;lt;soumik.das-0IS4wlFg1OjSUeElwK9/Pw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

Add routine for retrieving qos null template frame.
Driver may need that for uploading it in the device.

Signed-off-by: Soumik Das &amp;lt;soumik.das-0IS4wlFg1OjSUeElwK9/Pw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Signed-off-by: Prakhar Vig &amp;lt;prakhar.vig-0IS4wlFg1OjSUeElwK9/Pw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 include/net/mac80211.h |   16 ++++++++++++++++
 net/mac80211/tx.c      |   38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 1937c7d..10a0529 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2876,6 +2876,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw,
        struct ieee80211_vif *vif);
 
 /**
+ * ieee80211_qosnullfunc_get - retrieve a qos nullfunc template
+ * &amp;lt; at &amp;gt;hw: pointer obtained from ieee80211_alloc_hw().
+ * &amp;lt; at &amp;gt;vif: &amp;amp;struct ieee80211_vif pointer from the add_interface callback.
+ *
+ * Creates a QOS Nullfunc template which can, for example, be uploaded to
+ * hardware. The template must be updated after association so that correct
+ * BSSID and address is used.
+ *
+ * Note: Caller (or hardware) is responsible for setting the
+ * &amp;amp;IEEE80211_FCTL_PM bit as well as Duration and Sequence Control fields.
+ * The qos ctl field is set to zero by the function. Caller must
+ * fill up proper value.
+ */
+struct sk_buff *ieee80211_qosnullfunc_get(struct ieee80211_hw *hw,
+  struct ieee80211_vif *vif);
+/**
  * ieee80211_probereq_get - retrieve a Probe Request template
  * &amp;lt; at &amp;gt;hw: pointer obtained from ieee80211_alloc_hw().
  * &amp;lt; at &amp;gt;vif: &amp;amp;struct ieee80211_vif pointer from the add_interface callback.
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index d67d36f..5e4b857 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2595,6 +2595,44 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw,
 }
 EXPORT_SYMBOL(ieee80211_nullfunc_get);
 
+struct sk_buff *ieee80211_qosnullfunc_get(struct ieee80211_hw *hw,
+  struct ieee80211_vif *vif)
+{
+struct ieee80211_qos_hdr *nullfunc;
+struct ieee80211_sub_if_data *sdata;
+struct ieee80211_if_managed *ifmgd;
+struct ieee80211_local *local;
+struct sk_buff *skb;
+
+if (WARN_ON(vif-&amp;gt;type != NL80211_IFTYPE_STATION))
+return NULL;
+
+sdata = vif_to_sdata(vif);
+ifmgd = &amp;amp;sdata-&amp;gt;u.mgd;
+local = sdata-&amp;gt;local;
+
+skb = dev_alloc_skb(local-&amp;gt;hw.extra_tx_headroom + sizeof(*nullfunc));
+if (!skb) {
+printk(KERN_DEBUG "%s: failed to allocate buffer for qos "
+       "nullfunc template\n", sdata-&amp;gt;name);
+return NULL;
+}
+skb_reserve(skb, local-&amp;gt;hw.extra_tx_headroom);
+
+nullfunc = (struct ieee80211_hdr_3addr *) skb_put(skb,
+  sizeof(*nullfunc));
+memset(nullfunc, 0, sizeof(*nullfunc));
+nullfunc-&amp;gt;frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
+      IEEE80211_STYPE_QOS_NULLFUNC |
+      IEEE80211_FCTL_TODS);
+memcpy(nullfunc-&amp;gt;addr1, ifmgd-&amp;gt;bssid, ETH_ALEN);
+memcpy(nullfunc-&amp;gt;addr2, vif-&amp;gt;addr, ETH_ALEN);
+memcpy(nullfunc-&amp;gt;addr3, ifmgd-&amp;gt;bssid, ETH_ALEN);
+
+return skb;
+}
+EXPORT_SYMBOL(ieee80211_qosnullfunc_get);
+
 struct sk_buff *ieee80211_probereq_get(struct ieee80211_hw *hw,
        struct ieee80211_vif *vif,
        const u8 *ssid, size_t ssid_len,
&lt;/pre&gt;</description>
    <dc:creator>Soumik Das</dc:creator>
    <dc:date>2012-05-26T10:06:21</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91467">
    <title>Anyone doing WiFi throughput tests?</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91467</link>
    <description>&lt;pre&gt;We've been doing some tests using Atheros stations and various APs.  The max throughput
we've seen so far is about 237Mbps (received UDP payload on the stations).
(Open-Air, AP about 5 feet away, 3x3 MIMO, HT40, 5Ghz, etc).

We are still running lots of different permutations, but I am interested if
anyone else has any numbers to share (official or otherwise).

Thanks,
Ben

&lt;/pre&gt;</description>
    <dc:creator>Ben Greear</dc:creator>
    <dc:date>2012-05-26T03:17:46</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91466">
    <title>(unknown)</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91466</link>
    <description>&lt;pre&gt;
 i am robothroli, Purchase manager from roli Merchant Ltd. We are
Import/export Company based in taiwan. We are interested in purchasing
your product and I would like to make an inquiry. Please inform me on:

Sample availability and price
Minimum order quantity
FOB Prices

Sincerely
Purchase Manager
robothroli



--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA&amp;lt; at &amp;gt;public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

&lt;/pre&gt;</description>
    <dc:creator>robothroli company</dc:creator>
    <dc:date>2012-05-25T13:45:54</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91451">
    <title>[ANN] QCA swiss army knife</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91451</link>
    <description>&lt;pre&gt;To help with simplifying placement of userspace tool development for
QCA for our different drivers we have merged together a few public
development repositories into one, a qca-swiss-army-knife:

Code: git://github.com/mcgrof/qca-swiss-army-knife.git
Wiki: https://github.com/mcgrof/qca-swiss-army-knife/wiki

Of most importance so far is the initval-tools [0], if you used to
send patches for this utility please update your git tree to point to
this new URL, a simple change in the name should let you git pull all
the new changes, you will not have to reset your tree. The other tools
that merged into this tree were  ath-utils and hal-reg-dump, so I've
nuked the old trees from github.

If you have any question please let us know.

[0] http://wireless.kernel.org/en/users/Drivers/ath9k_hw/initvals-tool

  Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA&amp;lt; at &amp;gt;public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

&lt;/pre&gt;</description>
    <dc:creator>Luis R. Rodriguez</dc:creator>
    <dc:date>2012-05-25T20:08:46</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91442">
    <title>[RFC] mac80211: net_ratelimit few aggregation related messages</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91442</link>
    <description>&lt;pre&gt;From: Mohammed Shafi Shajakhan &amp;lt;mohammed-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

net_ratelimit few aggregation related messages, these messages
floods the log when aggregation is disabled for some wifi
test cases in the AP side. mac80211 gives up after 15 addba
requests, but ieee80211_start_tx_ba_session will be
repeatedly called by drivers rate control tx_status callback

Signed-off-by: Mohammed Shafi Shajakhan &amp;lt;mohammed-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 net/mac80211/agg-tx.c |   21 ++++++++++++---------
 1 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 7cf0715..d9fb5ef 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -464,8 +464,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
 return -EINVAL;
 
 #ifdef CONFIG_MAC80211_HT_DEBUG
-printk(KERN_DEBUG "Open BA session requested for %pM tid %u\n",
-       pubsta-&amp;gt;addr, tid);
+if (net_ratelimit())
+printk(KERN_DEBUG "Open BA session requested for %pM tid %u\n",
+       pubsta-&amp;gt;addr, tid);
 #endif /* CONFIG_MAC80211_HT_DEBUG */
 
 if (sdata-&amp;gt;vif.type != NL80211_IFTYPE_STATION &amp;amp;&amp;amp;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -506,8 +507,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
 
 spin_lock_bh(&amp;amp;sta-&amp;gt;lock);
 
-/* we have tried too many times, receiver does not want A-MPDU */
 if (sta-&amp;gt;ampdu_mlme.addba_req_num[tid] &amp;gt; HT_AGG_MAX_RETRIES) {
+if (net_ratelimit())
+printk(KERN_DEBUG "receiver does not wants A-MPDU, maximum addba requests tried for tid %u",
+       tid);
 ret = -EBUSY;
 goto err_unlock_sta;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -521,10 +524,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
     time_before(jiffies, sta-&amp;gt;ampdu_mlme.last_addba_req_time[tid] +
 HT_AGG_RETRIES_PERIOD)) {
 #ifdef CONFIG_MAC80211_HT_DEBUG
-printk(KERN_DEBUG "BA request denied - "
-       "waiting a grace period after %d failed requests "
-       "on tid %u\n",
-       sta-&amp;gt;ampdu_mlme.addba_req_num[tid], tid);
+if (net_ratelimit())
+printk(KERN_DEBUG "BA request denied waiting a grace period after %d failed requests on tid %u\n",
+       sta-&amp;gt;ampdu_mlme.addba_req_num[tid], tid);
 #endif /* CONFIG_MAC80211_HT_DEBUG */
 ret = -EBUSY;
 goto err_unlock_sta;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -534,8 +536,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
 /* check if the TID is not in aggregation flow already */
 if (tid_tx || sta-&amp;gt;ampdu_mlme.tid_start_tx[tid]) {
 #ifdef CONFIG_MAC80211_HT_DEBUG
-printk(KERN_DEBUG "BA request denied - session is not "
- "idle on tid %u\n", tid);
+if (net_ratelimit())
+printk(KERN_DEBUG "BA request denied - session is not idle on tid %u\n",
+       tid);
 #endif /* CONFIG_MAC80211_HT_DEBUG */
 ret = -EAGAIN;
 goto err_unlock_sta;
&lt;/pre&gt;</description>
    <dc:creator>Mohammed Shafi Shajakhan</dc:creator>
    <dc:date>2012-05-25T15:37:04</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91438">
    <title>[PATCH V2 1/2] ath6kl: Fix race in aggregation reorder logic</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91438</link>
    <description>&lt;pre&gt;There are many places where tid data are accessed without
the lock (rxtid-&amp;gt;lock), this can lead to a race condition
when the timeout handler for aggregatin reorder and the
receive function are getting executed at the same time.
Fix this race, but still there are races which can not
be fixed without rewriting the whole aggregation reorder
logic, for now fix the obvious ones.

Signed-off-by: Vasanthakumar Thiagarajan &amp;lt;vthiagar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath6kl/txrx.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index 67206ae..60723be 100644
--- a/drivers/net/wireless/ath/ath6kl/txrx.c
+++ b/drivers/net/wireless/ath/ath6kl/txrx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1036,6 +1036,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
 rxtid = &amp;amp;agg_conn-&amp;gt;rx_tid[tid];
 stats = &amp;amp;agg_conn-&amp;gt;stat[tid];
 
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 idx = AGGR_WIN_IDX(rxtid-&amp;gt;seq_next, rxtid-&amp;gt;hold_q_sz);
 
 /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1054,8 +1055,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
 seq_end = seq_no ? seq_no : rxtid-&amp;gt;seq_next;
 idx_end = AGGR_WIN_IDX(seq_end, rxtid-&amp;gt;hold_q_sz);
 
-spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
-
 do {
 node = &amp;amp;rxtid-&amp;gt;hold_q[idx];
 if ((order == 1) &amp;amp;&amp;amp; (!node-&amp;gt;skb))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1127,11 +1126,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
     ((end &amp;gt; extended_end) &amp;amp;&amp;amp; (cur &amp;gt; extended_end) &amp;amp;&amp;amp;
      (cur &amp;lt; end))) {
 aggr_deque_frms(agg_conn, tid, 0, 0);
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (cur &amp;gt;= rxtid-&amp;gt;hold_q_sz - 1)
 rxtid-&amp;gt;seq_next = cur - (rxtid-&amp;gt;hold_q_sz - 1);
 else
 rxtid-&amp;gt;seq_next = ATH6KL_MAX_SEQ_NO -
   (rxtid-&amp;gt;hold_q_sz - 2 - cur);
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 } else {
 /*
  * Dequeue only those frames that are outside the
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1188,6 +1189,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
 rxtid-&amp;gt;progress = true;
 else
 for (idx = 0 ; idx &amp;lt; rxtid-&amp;gt;hold_q_sz; idx++) {
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (rxtid-&amp;gt;hold_q[idx].skb) {
 /*
  * There is a frame in the queue and no
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1201,8 +1203,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
    HZ * (AGGR_RX_TIMEOUT) / 1000));
 rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = true;
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 break;
 }
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 }
 
 return is_queued;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1627,12 +1631,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 
 if (rxtid-&amp;gt;aggr &amp;amp;&amp;amp; rxtid-&amp;gt;hold_q) {
 for (j = 0; j &amp;lt; rxtid-&amp;gt;hold_q_sz; j++) {
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (rxtid-&amp;gt;hold_q[j].skb) {
 aggr_conn-&amp;gt;timer_scheduled = true;
 rxtid-&amp;gt;timer_mon = true;
 rxtid-&amp;gt;progress = false;
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 break;
 }
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 }
 
 if (j &amp;gt;= rxtid-&amp;gt;hold_q_sz)
&lt;/pre&gt;</description>
    <dc:creator>Vasanthakumar Thiagarajan</dc:creator>
    <dc:date>2012-05-25T10:19:17</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91434">
    <title>[V2 1/2] ath6kl: Fix race in aggregation reorder logic</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91434</link>
    <description>&lt;pre&gt;There are many places where tid data are accessed without
the lock (rxtid-&amp;gt;lock), this can lead to a race condition
when the timeout handler for aggregatin reorder and the
receive function are getting executed at the same time.
Fix this race, but still there are races which can not
be fixed without rewriting the whole aggregation reorder
logic, for now fix the obvious ones.

Signed-off-by: Vasanthakumar Thiagarajan &amp;lt;vthiagar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath6kl/txrx.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index 67206ae..60723be 100644
--- a/drivers/net/wireless/ath/ath6kl/txrx.c
+++ b/drivers/net/wireless/ath/ath6kl/txrx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1036,6 +1036,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
 rxtid = &amp;amp;agg_conn-&amp;gt;rx_tid[tid];
 stats = &amp;amp;agg_conn-&amp;gt;stat[tid];
 
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 idx = AGGR_WIN_IDX(rxtid-&amp;gt;seq_next, rxtid-&amp;gt;hold_q_sz);
 
 /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1054,8 +1055,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
 seq_end = seq_no ? seq_no : rxtid-&amp;gt;seq_next;
 idx_end = AGGR_WIN_IDX(seq_end, rxtid-&amp;gt;hold_q_sz);
 
-spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
-
 do {
 node = &amp;amp;rxtid-&amp;gt;hold_q[idx];
 if ((order == 1) &amp;amp;&amp;amp; (!node-&amp;gt;skb))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1127,11 +1126,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
     ((end &amp;gt; extended_end) &amp;amp;&amp;amp; (cur &amp;gt; extended_end) &amp;amp;&amp;amp;
      (cur &amp;lt; end))) {
 aggr_deque_frms(agg_conn, tid, 0, 0);
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (cur &amp;gt;= rxtid-&amp;gt;hold_q_sz - 1)
 rxtid-&amp;gt;seq_next = cur - (rxtid-&amp;gt;hold_q_sz - 1);
 else
 rxtid-&amp;gt;seq_next = ATH6KL_MAX_SEQ_NO -
   (rxtid-&amp;gt;hold_q_sz - 2 - cur);
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 } else {
 /*
  * Dequeue only those frames that are outside the
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1188,6 +1189,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
 rxtid-&amp;gt;progress = true;
 else
 for (idx = 0 ; idx &amp;lt; rxtid-&amp;gt;hold_q_sz; idx++) {
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (rxtid-&amp;gt;hold_q[idx].skb) {
 /*
  * There is a frame in the queue and no
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1201,8 +1203,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
    HZ * (AGGR_RX_TIMEOUT) / 1000));
 rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = true;
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 break;
 }
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 }
 
 return is_queued;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1627,12 +1631,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 
 if (rxtid-&amp;gt;aggr &amp;amp;&amp;amp; rxtid-&amp;gt;hold_q) {
 for (j = 0; j &amp;lt; rxtid-&amp;gt;hold_q_sz; j++) {
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (rxtid-&amp;gt;hold_q[j].skb) {
 aggr_conn-&amp;gt;timer_scheduled = true;
 rxtid-&amp;gt;timer_mon = true;
 rxtid-&amp;gt;progress = false;
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 break;
 }
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 }
 
 if (j &amp;gt;= rxtid-&amp;gt;hold_q_sz)
&lt;/pre&gt;</description>
    <dc:creator>Vasanthakumar Thiagarajan</dc:creator>
    <dc:date>2012-05-25T10:04:39</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91431">
    <title>[PATCH 1/2] ath6kl: Fix race in aggregation reorder logic</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91431</link>
    <description>&lt;pre&gt;There are many places where tid data are accessed without
the lock (rxtid-&amp;gt;lock), this can lead to a race condition
when the timeout handler for aggregatin reorder and the
receive function are getting executed at the same time.
Fix this race, but still there are races which can not
be fixed without rewriting the whole aggregation reorder
logic, for now fix the obvious ones.

Signed-off-by: Vasanthakumar Thiagarajan &amp;lt;vthiagar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath6kl/txrx.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index 67206ae..60723be 100644
--- a/drivers/net/wireless/ath/ath6kl/txrx.c
+++ b/drivers/net/wireless/ath/ath6kl/txrx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1036,6 +1036,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
 rxtid = &amp;amp;agg_conn-&amp;gt;rx_tid[tid];
 stats = &amp;amp;agg_conn-&amp;gt;stat[tid];
 
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 idx = AGGR_WIN_IDX(rxtid-&amp;gt;seq_next, rxtid-&amp;gt;hold_q_sz);
 
 /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1054,8 +1055,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_deque_frms(struct aggr_info_conn *agg_conn, u8 tid,
 seq_end = seq_no ? seq_no : rxtid-&amp;gt;seq_next;
 idx_end = AGGR_WIN_IDX(seq_end, rxtid-&amp;gt;hold_q_sz);
 
-spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
-
 do {
 node = &amp;amp;rxtid-&amp;gt;hold_q[idx];
 if ((order == 1) &amp;amp;&amp;amp; (!node-&amp;gt;skb))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1127,11 +1126,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
     ((end &amp;gt; extended_end) &amp;amp;&amp;amp; (cur &amp;gt; extended_end) &amp;amp;&amp;amp;
      (cur &amp;lt; end))) {
 aggr_deque_frms(agg_conn, tid, 0, 0);
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (cur &amp;gt;= rxtid-&amp;gt;hold_q_sz - 1)
 rxtid-&amp;gt;seq_next = cur - (rxtid-&amp;gt;hold_q_sz - 1);
 else
 rxtid-&amp;gt;seq_next = ATH6KL_MAX_SEQ_NO -
   (rxtid-&amp;gt;hold_q_sz - 2 - cur);
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 } else {
 /*
  * Dequeue only those frames that are outside the
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1188,6 +1189,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
 rxtid-&amp;gt;progress = true;
 else
 for (idx = 0 ; idx &amp;lt; rxtid-&amp;gt;hold_q_sz; idx++) {
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (rxtid-&amp;gt;hold_q[idx].skb) {
 /*
  * There is a frame in the queue and no
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1201,8 +1203,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
    HZ * (AGGR_RX_TIMEOUT) / 1000));
 rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = true;
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 break;
 }
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 }
 
 return is_queued;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1627,12 +1631,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 
 if (rxtid-&amp;gt;aggr &amp;amp;&amp;amp; rxtid-&amp;gt;hold_q) {
 for (j = 0; j &amp;lt; rxtid-&amp;gt;hold_q_sz; j++) {
+spin_lock_bh(&amp;amp;rxtid-&amp;gt;lock);
 if (rxtid-&amp;gt;hold_q[j].skb) {
 aggr_conn-&amp;gt;timer_scheduled = true;
 rxtid-&amp;gt;timer_mon = true;
 rxtid-&amp;gt;progress = false;
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 break;
 }
+spin_unlock_bh(&amp;amp;rxtid-&amp;gt;lock);
 }
 
 if (j &amp;gt;= rxtid-&amp;gt;hold_q_sz)
&lt;/pre&gt;</description>
    <dc:creator>Vasanthakumar Thiagarajan</dc:creator>
    <dc:date>2012-05-25T09:55:52</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91419">
    <title>[PATCH 1/2] nl80211/cfg80211: add scan channel times to scan command</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91419</link>
    <description>&lt;pre&gt;In order to give the usermode an ability to configure
scan channel times, and as it required for the beacon
reports in the 802.11k standard.

Add to the scan command min/max channel times. Add
min/max passive channel times, since a single scan
can contain both passive and active channels due to
regulatory constraints.

Signed-off-by: Victor Goldenshtein &amp;lt;victorg-l0cyMroinI0&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 include/linux/nl80211.h |   22 ++++++++++++++++++++++
 include/net/cfg80211.h  |   11 +++++++++++
 net/wireless/nl80211.c  |   25 +++++++++++++++++++++++++
 3 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 2540e86..8dca611 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1222,6 +1222,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum nl80211_commands {
  * &amp;lt; at &amp;gt;NL80211_ATTR_BG_SCAN_PERIOD: Background scan period in seconds
  *      or 0 to disable background scan.
  *
+ * &amp;lt; at &amp;gt;NL80211_ATTR_SCAN_MIN_CH_TIME: Minimum active scan time (in TUs),
+ *u32 attribute to setup minimum time to wait on each channel, if received
+ *at least one probe_resp/beacon during this period will continue waiting
+ *&amp;lt; at &amp;gt;NL80211_ATTR_SCAN_MAX_CH_TIME, otherwise will move to next channel.
+ * &amp;lt; at &amp;gt;NL80211_ATTR_SCAN_MAX_CH_TIME: Maximum active scan time (in TUs),
+ *u32 attribute to setup maximum time to wait on the channel.
+ * &amp;lt; at &amp;gt;NL80211_ATTR_SCAN_PSV_MIN_CH_TIME: Minimum passive scan time (in TUs),
+ *u32 attribute (similar to &amp;lt; at &amp;gt;NL80211_ATTR_SCAN_MIN_CH_TIME).
+ * &amp;lt; at &amp;gt;NL80211_ATTR_SCAN_PSV_MAX_CH_TIME: Maximum passive scan time (in TUs),
+ *u32 attribute (similar to &amp;lt; at &amp;gt;NL80211_ATTR_SCAN_MAX_CH_TIME).
+ *Note:
+ * The above channel time attributes are for the %NL80211_CMD_TRIGGER_SCAN
+ * command. The attributes are optional, the driver will use default
+ * channel time values if the attribute is not set or set to zero.
+ * If one of the min times will be greater than max, -EINVAL will be
+ * returned. For the software scan only the min times are relevant.
+ *
  * &amp;lt; at &amp;gt;NL80211_ATTR_MAX: highest attribute number currently defined
  * &amp;lt; at &amp;gt;__NL80211_ATTR_AFTER_LAST: internal use
  */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1473,6 +1490,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum nl80211_attrs {
 
 NL80211_ATTR_BG_SCAN_PERIOD,
 
+NL80211_ATTR_SCAN_MIN_CH_TIME,
+NL80211_ATTR_SCAN_MAX_CH_TIME,
+NL80211_ATTR_SCAN_PSV_MIN_CH_TIME,
+NL80211_ATTR_SCAN_PSV_MAX_CH_TIME,
+
 /* add attributes here, update the policy in nl80211.c */
 
 __NL80211_ATTR_AFTER_LAST,
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index adb2320..948cf60 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -920,6 +920,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct cfg80211_ssid {
  * &amp;lt; at &amp;gt;dev: the interface
  * &amp;lt; at &amp;gt;aborted: (internal) scan request was notified as aborted
  * &amp;lt; at &amp;gt;no_cck: used to send probe requests at non CCK rate in 2GHz band
+ * &amp;lt; at &amp;gt;min_ch_time: minimum time to wait on each channel for active scans
+ * &amp;lt; at &amp;gt;max_ch_time: maximum time to wait on each channel for active scans
+ * &amp;lt; at &amp;gt;min_passive_ch_time: minimum time to wait on each channel for passive scans
+ * &amp;lt; at &amp;gt;max_passive_ch_time: maximum time to wait on each channel for passive scans
+ *  Note: If the above channel times are not set or set to zero, the default
+ *  channel times will be used.
  */
 struct cfg80211_scan_request {
 struct cfg80211_ssid *ssids;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -936,6 +942,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct cfg80211_scan_request {
 bool aborted;
 bool no_cck;
 
+u32 min_ch_time;
+u32 max_ch_time;
+u32 min_passive_ch_time;
+u32 max_passive_ch_time;
+
 /* keep last */
 struct ieee80211_channel *channels[0];
 };
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 859bd66..4ac8fed 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -206,6 +206,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
 [NL80211_ATTR_NOACK_MAP] = { .type = NLA_U16 },
 [NL80211_ATTR_INACTIVITY_TIMEOUT] = { .type = NLA_U16 },
 [NL80211_ATTR_BG_SCAN_PERIOD] = { .type = NLA_U16 },
+[NL80211_ATTR_SCAN_MIN_CH_TIME] = { .type = NLA_U32 },
+[NL80211_ATTR_SCAN_MAX_CH_TIME] = { .type = NLA_U32 },
+[NL80211_ATTR_SCAN_PSV_MIN_CH_TIME] = { .type = NLA_U32 },
+[NL80211_ATTR_SCAN_PSV_MAX_CH_TIME] = { .type = NLA_U32 },
 };
 
 /* policy for the key attributes */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3884,6 +3888,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
        request-&amp;gt;ie_len);
 }
 
+if (info-&amp;gt;attrs[NL80211_ATTR_SCAN_MIN_CH_TIME]) {
+request-&amp;gt;min_ch_time =
+nla_get_u32(info-&amp;gt;attrs[NL80211_ATTR_SCAN_MIN_CH_TIME]);
+}
+if (info-&amp;gt;attrs[NL80211_ATTR_SCAN_MAX_CH_TIME]) {
+request-&amp;gt;max_ch_time =
+nla_get_u32(info-&amp;gt;attrs[NL80211_ATTR_SCAN_MAX_CH_TIME]);
+if (request-&amp;gt;min_ch_time &amp;gt; request-&amp;gt;max_ch_time)
+return -EINVAL;
+}
+if (info-&amp;gt;attrs[NL80211_ATTR_SCAN_PSV_MIN_CH_TIME]) {
+request-&amp;gt;min_passive_ch_time =
+    nla_get_u32(info-&amp;gt;attrs[NL80211_ATTR_SCAN_PSV_MIN_CH_TIME]);
+}
+if (info-&amp;gt;attrs[NL80211_ATTR_SCAN_PSV_MAX_CH_TIME]) {
+request-&amp;gt;max_passive_ch_time =
+    nla_get_u32(info-&amp;gt;attrs[NL80211_ATTR_SCAN_PSV_MAX_CH_TIME]);
+if (request-&amp;gt;min_passive_ch_time &amp;gt; request-&amp;gt;max_passive_ch_time)
+return -EINVAL;
+}
+
 for (i = 0; i &amp;lt; IEEE80211_NUM_BANDS; i++)
 if (wiphy-&amp;gt;bands[i])
 request-&amp;gt;rates[i] =
&lt;/pre&gt;</description>
    <dc:creator>Victor Goldenshtein</dc:creator>
    <dc:date>2012-05-24T18:52:48</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91415">
    <title>[PATCH v2] mac80211: add op to configure default key id</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91415</link>
    <description>&lt;pre&gt;There are hardwares which support offload of data packets
for example when auto ARP is enabled the hw will send
the ARP response. In such cases if WEP encryption is
configured the hw must know the default WEP key in order
to encrypt the packets correctly.

When hw_accel is enabled and encryption type is set to WEP,
the driver should get the default key index from mac80211.

Signed-off-by: Yoni Divinsky &amp;lt;yoni.divinsky-l0cyMroinI0&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
v2: added documention and commit changelog
    added tracing function

 include/net/mac80211.h      |    7 ++++++-
 net/mac80211/cfg.c          |    3 +--
 net/mac80211/driver-ops.h   |   17 +++++++++++++++++
 net/mac80211/driver-trace.h |   24 ++++++++++++++++++++++++
 net/mac80211/key.c          |    6 +++++-
 net/mac80211/key.h          |    2 +-
 6 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 4d6e6c6..f368af5 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1427,6 +1427,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
  * rekeying), it will not include a valid phase 1 key. The valid phase 1 key is
  * provided by update_tkip_key only. The trigger that makes mac80211 call this
  * handler is software decryption with wrap around of iv16.
+ *
+ * The set_default_key_idx() call updates the default WEP key index configured
+ * to the hardware for WEP encryption type. This is required for hw which
+ * supports offload of data packets (i.e. auto ARP respones).
  */
 
 /**
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2361,7 +2365,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct ieee80211_ops {
 u16 tids, int num_frames,
 enum ieee80211_frame_release_type reason,
 bool more_data);
-
 int(*get_et_sset_count)(struct ieee80211_hw *hw,
      struct ieee80211_vif *vif, int sset);
 void(*get_et_stats)(struct ieee80211_hw *hw,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2370,6 +2373,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct ieee80211_ops {
 void(*get_et_strings)(struct ieee80211_hw *hw,
   struct ieee80211_vif *vif,
   u32 sset, u8 *data);
+int (*set_default_key_idx)(struct ieee80211_hw *hw,
+    struct ieee80211_vif *vif, int idx);
 };
 
 /**
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 0221270..6a82ae3 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -309,9 +309,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int ieee80211_config_default_key(struct wiphy *wiphy,
 {
 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
-ieee80211_set_default_key(sdata, key_idx, uni, multi);
+return ieee80211_set_default_key(sdata, key_idx, uni, multi);
 
-return 0;
 }
 
 static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index 6d33a0c..53d46d3 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -845,4 +845,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; drv_allow_buffered_frames(struct ieee80211_local *local,
   more_data);
 trace_drv_return_void(local);
 }
+
+static inline int
+drv_set_default_unicast_key(struct ieee80211_local *local,
+    struct ieee80211_sub_if_data *sdata,
+    int key_idx)
+{
+int ret = 0;
+check_sdata_in_driver(sdata);
+
+trace_drv_set_default_unitcast_key(local, sdata, key_idx);
+if (local-&amp;gt;ops-&amp;gt;set_default_key_idx)
+ret = local-&amp;gt;ops-&amp;gt;set_default_key_idx(&amp;amp;local-&amp;gt;hw, &amp;amp;sdata-&amp;gt;vif,
+key_idx);
+trace_drv_return_int(local, ret);
+
+return ret;
+}
 #endif /* __MAC80211_DRIVER_OPS */
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h
index 6de00b2..bd4cc06 100644
--- a/net/mac80211/driver-trace.h
+++ b/net/mac80211/driver-trace.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1606,6 +1606,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; TRACE_EVENT(stop_queue,
 LOCAL_PR_ARG, __entry-&amp;gt;queue, __entry-&amp;gt;reason
 )
 );
+
+TRACE_EVENT(drv_set_default_unicast_key,
+TP_PROTO(struct ieee80211_local *local,
+ struct ieee80211_sub_if_data *sdata,
+ int key_idx),
+
+TP_ARGS(local, sdata, key_idx),
+
+TP_STRUCT__entry(
+LOCAL_ENTRY
+VIF_ENTRY
+__field(int, key_idx)
+),
+
+TP_fast_assign(
+LOCAL_ASSIGN;
+VIF_ASSIGN;
+__entry-&amp;gt;key_idx = key_idx;
+),
+
+TP_printk(LOCAL_PR_FMT VIF_PR_FMT " key_idx:%d",
+  LOCAL_PR_ARG, VIF_PR_ARG, __entry-&amp;gt;key_idx)
+);
+
 #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
 
 #undef TRACE_INCLUDE_PATH
diff --git a/net/mac80211/key.c b/net/mac80211/key.c
index 5bb600d..365a521 100644
--- a/net/mac80211/key.c
+++ b/net/mac80211/key.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -232,12 +232,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
 ieee80211_debugfs_key_update_default(sdata);
 }
 
-void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
+int ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
        bool uni, bool multi)
 {
+int ret = 0;
 mutex_lock(&amp;amp;sdata-&amp;gt;local-&amp;gt;key_mtx);
 __ieee80211_set_default_key(sdata, idx, uni, multi);
+if (uni)
+ret = drv_set_default_unicast_key(sdata-&amp;gt;local, sdata, idx);
 mutex_unlock(&amp;amp;sdata-&amp;gt;local-&amp;gt;key_mtx);
+return ret;
 }
 
 static void
diff --git a/net/mac80211/key.h b/net/mac80211/key.h
index 7d4e31f..046d2b3 100644
--- a/net/mac80211/key.h
+++ b/net/mac80211/key.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -136,7 +136,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int __must_check ieee80211_key_link(struct ieee80211_key *key,
 void __ieee80211_key_free(struct ieee80211_key *key);
 void ieee80211_key_free(struct ieee80211_local *local,
 struct ieee80211_key *key);
-void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
+int ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
        bool uni, bool multi);
 void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
     int idx);
&lt;/pre&gt;</description>
    <dc:creator>Yoni Divinsky</dc:creator>
    <dc:date>2012-05-24T15:15:12</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91414">
    <title>[PATCH] Fix the Problem of Unreachable Mesh Station when joining from one MBSS to another MBSS</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91414</link>
    <description>&lt;pre&gt;Mesh station that joins an MBSS is reachable using mesh portal with 6 address frame
by mesh stations from another MBSS if these two different MBSSes are bridged. However,
if the mesh station later moves into the same MBSS of those mesh stations, it is unreachable
by mesh stations in the MBSS due to the mpp_paths table is not deleted. A quick fix is
to perform mesh_path_lookup, if it is available for the target destination, mpp_path_lookup
is not performed. When the mesh station moves back to its original MBSS, the mesh_paths will
be deleted once expired. So, it will be reachable using mpp_path_lookup again.

Signed-off-by: Chun-Yeow Yeoh &amp;lt;yeohchunyeow-Re5JQEeQqe8AvxtiuMwx3w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 net/mac80211/tx.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index d67d36f..f44cd9d 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1740,7 +1740,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
 __le16 fc;
 struct ieee80211_hdr hdr;
 struct ieee80211s_hdr mesh_hdr __maybe_unused;
-struct mesh_path __maybe_unused *mppath = NULL;
+struct mesh_path __maybe_unused *mppath = NULL, *mpath = NULL;
 const u8 *encaps_data;
 int encaps_len, skip_header_bytes;
 int nh_pos, h_pos;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1806,8 +1806,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
 goto fail;
 }
 rcu_read_lock();
-if (!is_multicast_ether_addr(skb-&amp;gt;data))
-mppath = mpp_path_lookup(skb-&amp;gt;data, sdata);
+if (!is_multicast_ether_addr(skb-&amp;gt;data)) {
+mpath = mesh_path_lookup(skb-&amp;gt;data, sdata);
+if (!mpath)
+mppath = mpp_path_lookup(skb-&amp;gt;data, sdata);
+}
 
 /*
  * Use address extension if it is a packet from
&lt;/pre&gt;</description>
    <dc:creator>Chun-Yeow Yeoh</dc:creator>
    <dc:date>2012-05-24T15:14:24</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91413">
    <title>[PATCH v2] compat: rename compat-3.5.c to compat-3.4.c</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91413</link>
    <description>&lt;pre&gt;It only contains simple_open, which is already available on Linux 3.4.
Fixes duplicate symbol issues on 3.4

Signed-off-by: Felix Fietkau &amp;lt;nbd-p3rKhJxN3npAfugRpC6u6w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 compat/Makefile            |    2 +-
 compat/compat-3.4.c        |   20 ++++++++++++++++++++
 compat/compat-3.5.c        |   20 --------------------
 include/linux/compat-3.4.h |    2 ++
 include/linux/compat-3.5.h |    2 --
 5 files changed, 23 insertions(+), 23 deletions(-)
 create mode 100644 compat/compat-3.4.c
 delete mode 100644 compat/compat-3.5.c

diff --git a/compat/Makefile b/compat/Makefile
index bda677b..667e727 100644
--- a/compat/Makefile
+++ b/compat/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -37,7 +37,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; compat-$(CONFIG_COMPAT_KERNEL_2_6_39) += \
 compat-$(CONFIG_COMPAT_KERNEL_3_0) += compat-3.0.o
 compat-$(CONFIG_COMPAT_KERNEL_3_2) += compat-3.2.o
 compat-$(CONFIG_COMPAT_KERNEL_3_3) += compat-3.3.o
-compat-$(CONFIG_COMPAT_KERNEL_3_5) += compat-3.5.o
+compat-$(CONFIG_COMPAT_KERNEL_3_4) += compat-3.4.o
 
 compat-$(CONFIG_COMPAT_CORDIC) += cordic.o
 compat-$(CONFIG_COMPAT_CRC8) += crc8.o
diff --git a/compat/compat-3.4.c b/compat/compat-3.4.c
new file mode 100644
index 0000000..5d516f0
--- /dev/null
+++ b/compat/compat-3.4.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * Copyright 2012  Luis R. Rodriguez &amp;lt;mcgrof-kCJ/WVjk54vrZ44/DZwexQ&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Compatibility file for Linux wireless for kernels 3.5.
+ */
+
+#include &amp;lt;linux/fs.h&amp;gt;
+#include &amp;lt;linux/module.h&amp;gt;
+
+int simple_open(struct inode *inode, struct file *file)
+{
+if (inode-&amp;gt;i_private)
+file-&amp;gt;private_data = inode-&amp;gt;i_private;
+return 0;
+}
+EXPORT_SYMBOL_GPL(simple_open);
diff --git a/compat/compat-3.5.c b/compat/compat-3.5.c
deleted file mode 100644
index 5d516f0..0000000
--- a/compat/compat-3.5.c
+++ /dev/null
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,20 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-/*
- * Copyright 2012  Luis R. Rodriguez &amp;lt;mcgrof-kCJ/WVjk54vrZ44/DZwexQ&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Compatibility file for Linux wireless for kernels 3.5.
- */
-
-#include &amp;lt;linux/fs.h&amp;gt;
-#include &amp;lt;linux/module.h&amp;gt;
-
-int simple_open(struct inode *inode, struct file *file)
-{
-if (inode-&amp;gt;i_private)
-file-&amp;gt;private_data = inode-&amp;gt;i_private;
-return 0;
-}
-EXPORT_SYMBOL_GPL(simple_open);
diff --git a/include/linux/compat-3.4.h b/include/linux/compat-3.4.h
index 1b72374..377d036 100644
--- a/include/linux/compat-3.4.h
+++ b/include/linux/compat-3.4.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -75,6 +75,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static inline void eth_hw_addr_random(struct net_device *dev)
 module_driver(__pci_driver, pci_register_driver, \
        pci_unregister_driver)
 
+extern int simple_open(struct inode *inode, struct file *file);
+
 #endif /* (LINUX_VERSION_CODE &amp;lt; KERNEL_VERSION(3,4,0)) */
 
 #endif /* LINUX_5_4_COMPAT_H */
diff --git a/include/linux/compat-3.5.h b/include/linux/compat-3.5.h
index c837deb..0bb35bb 100644
--- a/include/linux/compat-3.5.h
+++ b/include/linux/compat-3.5.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -8,8 +8,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 #if (LINUX_VERSION_CODE &amp;lt; KERNEL_VERSION(3,5,0))
 
-extern int simple_open(struct inode *inode, struct file *file);
&lt;/pre&gt;</description>
    <dc:creator>Felix Fietkau</dc:creator>
    <dc:date>2012-05-24T13:32:57</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91412">
    <title>[PATCH] compat: rename compat-3.5.c to compat-3.4.c</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91412</link>
    <description>&lt;pre&gt;It only contains simple_open, which is already available on Linux 3.4.
Fixes duplicate symbol issues on 3.4

Signed-off-by: Felix Fietkau &amp;lt;nbd-p3rKhJxN3npAfugRpC6u6w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 compat/Makefile     |    2 +-
 compat/compat-3.4.c |   20 ++++++++++++++++++++
 compat/compat-3.5.c |   20 --------------------
 3 files changed, 21 insertions(+), 21 deletions(-)
 create mode 100644 compat/compat-3.4.c
 delete mode 100644 compat/compat-3.5.c

diff --git a/compat/Makefile b/compat/Makefile
index bda677b..667e727 100644
--- a/compat/Makefile
+++ b/compat/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -37,7 +37,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; compat-$(CONFIG_COMPAT_KERNEL_2_6_39) += \
 compat-$(CONFIG_COMPAT_KERNEL_3_0) += compat-3.0.o
 compat-$(CONFIG_COMPAT_KERNEL_3_2) += compat-3.2.o
 compat-$(CONFIG_COMPAT_KERNEL_3_3) += compat-3.3.o
-compat-$(CONFIG_COMPAT_KERNEL_3_5) += compat-3.5.o
+compat-$(CONFIG_COMPAT_KERNEL_3_4) += compat-3.4.o
 
 compat-$(CONFIG_COMPAT_CORDIC) += cordic.o
 compat-$(CONFIG_COMPAT_CRC8) += crc8.o
diff --git a/compat/compat-3.4.c b/compat/compat-3.4.c
new file mode 100644
index 0000000..5d516f0
--- /dev/null
+++ b/compat/compat-3.4.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * Copyright 2012  Luis R. Rodriguez &amp;lt;mcgrof-kCJ/WVjk54vrZ44/DZwexQ&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Compatibility file for Linux wireless for kernels 3.5.
+ */
+
+#include &amp;lt;linux/fs.h&amp;gt;
+#include &amp;lt;linux/module.h&amp;gt;
+
+int simple_open(struct inode *inode, struct file *file)
+{
+if (inode-&amp;gt;i_private)
+file-&amp;gt;private_data = inode-&amp;gt;i_private;
+return 0;
+}
+EXPORT_SYMBOL_GPL(simple_open);
diff --git a/compat/compat-3.5.c b/compat/compat-3.5.c
deleted file mode 100644
index 5d516f0..0000000
--- a/compat/compat-3.5.c
+++ /dev/null
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,20 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-/*
- * Copyright 2012  Luis R. Rodriguez &amp;lt;mcgrof-kCJ/WVjk54vrZ44/DZwexQ&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Compatibility file for Linux wireless for kernels 3.5.
- */
-
-#include &amp;lt;linux/fs.h&amp;gt;
-#include &amp;lt;linux/module.h&amp;gt;
&lt;/pre&gt;</description>
    <dc:creator>Felix Fietkau</dc:creator>
    <dc:date>2012-05-24T13:29:28</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91407">
    <title>[PATCH 3.5 1/4] ath9k: stop rx dma before stopping tx</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91407</link>
    <description>&lt;pre&gt;It has been found that active Rx can interfere with stopping tx DMA, which
could result in at least parts of those "Failed to stop Tx DMA!" messages.
Stopping rx before tx should prevent that.

Signed-off-by: Felix Fietkau &amp;lt;nbd-p3rKhJxN3npAfugRpC6u6w&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/main.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index dfa78e8..4de4473 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -239,7 +239,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush)
 {
 struct ath_hw *ah = sc-&amp;gt;sc_ah;
 struct ath_common *common = ath9k_hw_common(ah);
-bool ret;
+bool ret = true;
 
 ieee80211_stop_queues(sc-&amp;gt;hw);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -250,11 +250,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush)
 ath9k_debug_samp_bb_mac(sc);
 ath9k_hw_disable_interrupts(ah);
 
-ret = ath_drain_all_txq(sc, retry_tx);
&lt;/pre&gt;</description>
    <dc:creator>Felix Fietkau</dc:creator>
    <dc:date>2012-05-24T12:32:19</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91393">
    <title>[PATCH v2 22/22] ath9k: improve BT FTP/PAN performance</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91393</link>
    <description>&lt;pre&gt;From: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

When BT FTP/PAN transmits while WLAN is idle, the one of 9462 chain
often picks up BT's tx signal and starts receiving. If the current
weight is set to be higher than BT tx, BT tx will be aborted and this
also degrades BT performance. Hence lower WLAN rx priority in this
case only when there are no WLAN traffic.

Signed-off-by: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/ath9k.h  |    2 ++
 drivers/net/wireless/ath/ath9k/btcoex.c |   10 ++++++++--
 drivers/net/wireless/ath/ath9k/btcoex.h |    4 ++++
 drivers/net/wireless/ath/ath9k/gpio.c   |   13 +++++++++++++
 drivers/net/wireless/ath/ath9k/recv.c   |    1 +
 5 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 9c54d4c..29248e5 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -307,6 +307,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct ath_rx {
 u8 defant;
 u8 rxotherant;
 u32 *rxlink;
+u32 num_pkts;
 unsigned int rxfilter;
 spinlock_t rxbuflock;
 struct list_head rxbuf;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -456,6 +457,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct ath_btcoex {
 u32 btcoex_period; /* in usec */
 u32 btscan_no_stomp; /* in usec */
 u32 duty_cycle;
+u32 bt_wait_time;
 struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */
 struct ath_mci_profile mci;
 };
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.c b/drivers/net/wireless/ath/ath9k/btcoex.c
index 1ca6da8..acd4373 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.c
+++ b/drivers/net/wireless/ath/ath9k/btcoex.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -336,10 +336,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ar9003_btcoex_bt_stomp(struct ath_hw *ah,
  enum ath_stomp_type stomp_type)
 {
 struct ath_btcoex_hw *btcoex = &amp;amp;ah-&amp;gt;btcoex_hw;
-const u32 *weight = AR_SREV_9462(ah) ? ar9003_wlan_weights[stomp_type] :
-       ar9462_wlan_weights[stomp_type];
+const u32 *weight = ar9003_wlan_weights[stomp_type];
 int i;
 
+if (AR_SREV_9462(ah)) {
+if ((stomp_type == ATH_BTCOEX_STOMP_LOW) &amp;amp;&amp;amp;
+    btcoex-&amp;gt;mci.stomp_ftp)
+stomp_type = ATH_BTCOEX_STOMP_LOW_FTP;
+weight = ar9462_wlan_weights[stomp_type];
+}
+
 for (i = 0; i &amp;lt; AR9300_NUM_WLAN_WEIGHTS; i++) {
 btcoex-&amp;gt;bt_weight[i] = AR9300_BT_WGHT;
 btcoex-&amp;gt;wlan_weight[i] = weight[i];
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h
index 3a1e1cf..20092f9 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.h
+++ b/drivers/net/wireless/ath/ath9k/btcoex.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,6 +36,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #define ATH_BT_CNT_THRESHOLD       3
 #define ATH_BT_CNT_SCAN_THRESHOLD      15
 
+#define ATH_BTCOEX_RX_WAIT_TIME       100
+#define ATH_BTCOEX_STOMP_FTP_THRESH   5
+
 #define AR9300_NUM_BT_WEIGHTS   4
 #define AR9300_NUM_WLAN_WEIGHTS 4
 /* Defines the BT AR_BT_COEX_WGHT used */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -80,6 +83,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct ath9k_hw_mci {
 u8 bt_ver_major;
 u8 bt_ver_minor;
 u8 bt_state;
+u8 stomp_ftp;
 };
 
 struct ath_btcoex_hw {
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c
index ab805be..ae31a96 100644
--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -190,6 +190,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ath_btcoex_period_timer(unsigned long data)
 struct ath_softc *sc = (struct ath_softc *) data;
 struct ath_hw *ah = sc-&amp;gt;sc_ah;
 struct ath_btcoex *btcoex = &amp;amp;sc-&amp;gt;btcoex;
+struct ath_mci_profile *mci = &amp;amp;btcoex-&amp;gt;mci;
 u32 timer_period;
 bool is_btscan;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -198,6 +199,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ath_btcoex_period_timer(unsigned long data)
 ath_detect_bt_priority(sc);
 is_btscan = !!(btcoex-&amp;gt;op_flags &amp;amp; BT_OP_SCAN);
 
+btcoex-&amp;gt;bt_wait_time += btcoex-&amp;gt;btcoex_period;
+if (btcoex-&amp;gt;bt_wait_time &amp;gt; ATH_BTCOEX_RX_WAIT_TIME) {
+if (ar9003_mci_state(ah, MCI_STATE_NEED_FTP_STOMP, NULL) &amp;amp;&amp;amp;
+    (mci-&amp;gt;num_pan || mci-&amp;gt;num_other_acl))
+ah-&amp;gt;btcoex_hw.mci.stomp_ftp =
+(sc-&amp;gt;rx.num_pkts &amp;lt; ATH_BTCOEX_STOMP_FTP_THRESH);
+else
+ah-&amp;gt;btcoex_hw.mci.stomp_ftp = false;
+btcoex-&amp;gt;bt_wait_time = 0;
+sc-&amp;gt;rx.num_pkts = 0;
+}
+
 spin_lock_bh(&amp;amp;btcoex-&amp;gt;btcoex_lock);
 
 ath9k_hw_btcoex_bt_stomp(ah, is_btscan ? ATH_BTCOEX_STOMP_ALL :
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 7fa1e01..2c5a214 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1841,6 +1841,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
 else
 rs.is_mybeacon = false;
 
+sc-&amp;gt;rx.num_pkts++;
 ath_debug_stat_rx(sc, &amp;amp;rs);
 
 /*
&lt;/pre&gt;</description>
    <dc:creator>Sujith Manoharan</dc:creator>
    <dc:date>2012-05-24T04:04:09</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91392">
    <title>[PATCH v2 21/22] ath9k_hw: fix power state for MCI</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91392</link>
    <description>&lt;pre&gt;From: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

Program MCI related power registers only if MCI interrupts
are enabled. This could help to reduce power consumptions when
WLAN alone is enabled in BT coex chips.

Signed-off-by: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/hw.c |   25 +++++++++----------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 9e8fef2..d13211d 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2006,12 +2006,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ath9k_set_power_sleep(struct ath_hw *ah)
 REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
 
 if (AR_SREV_9462(ah)) {
-REG_WRITE(ah, AR_TIMER_MODE,
-  REG_READ(ah, AR_TIMER_MODE) &amp;amp; 0xFFFFFF00);
-REG_WRITE(ah, AR_NDP2_TIMER_MODE,
-  REG_READ(ah, AR_NDP2_TIMER_MODE) &amp;amp; 0xFFFFFF00);
-REG_WRITE(ah, AR_SLP32_INC,
-  REG_READ(ah, AR_SLP32_INC) &amp;amp; 0xFFF00000);
+REG_CLR_BIT(ah, AR_TIMER_MODE, 0xff);
+REG_CLR_BIT(ah, AR_NDP2_TIMER_MODE, 0xff);
+REG_CLR_BIT(ah, AR_SLP32_INC, 0xfffff);
 /* xxx Required for WLAN only case ? */
 REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0);
 udelay(100);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2023,7 +2020,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ath9k_set_power_sleep(struct ath_hw *ah)
  */
 REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
 
-if (AR_SREV_9462(ah))
+if (ath9k_hw_mci_is_enabled(ah))
 udelay(100);
 
 if (!AR_SREV_9100(ah) &amp;amp;&amp;amp; !AR_SREV_9300_20_OR_LATER(ah))
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2048,7 +2045,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ath9k_set_power_sleep(struct ath_hw *ah)
 static void ath9k_set_power_network_sleep(struct ath_hw *ah)
 {
 struct ath9k_hw_capabilities *pCap = &amp;amp;ah-&amp;gt;caps;
-u32 val;
 
 REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2067,19 +2063,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ath9k_set_power_network_sleep(struct ath_hw *ah)
  * SYS_WAKING and SYS_SLEEPING messages which will make
  * BT CPU to busy to process.
  */
-if (AR_SREV_9462(ah)) {
-val = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_EN) &amp;amp;
-~AR_MCI_INTERRUPT_RX_HW_MSG_MASK;
-REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, val);
-}
+if (ath9k_hw_mci_is_enabled(ah))
+REG_CLR_BIT(ah, AR_MCI_INTERRUPT_RX_MSG_EN,
+    AR_MCI_INTERRUPT_RX_HW_MSG_MASK);
 /*
  * Clear the RTC force wake bit to allow the
  * mac to go to sleep.
  */
-REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE,
-    AR_RTC_FORCE_WAKE_EN);
+REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
 
-if (AR_SREV_9462(ah))
+if (ath9k_hw_mci_is_enabled(ah))
 udelay(30);
 }
 
&lt;/pre&gt;</description>
    <dc:creator>Sujith Manoharan</dc:creator>
    <dc:date>2012-05-24T04:04:03</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91391">
    <title>[PATCH v2 20/22] ath9k: always perform ani calibration at poll</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91391</link>
    <description>&lt;pre&gt;
From: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

Skiping the ani based on power state is delaying the ani cycles
further on an idle state. And also as the power state is updated
in different contexts, let us not skip the ani calibration.

Signed-off-by: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/main.c |    5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 3e8bef8..b9c9f4c 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -554,10 +554,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ath_ani_calibrate(unsigned long data)
 short_cal_interval = (ah-&amp;gt;opmode == NL80211_IFTYPE_AP) ?
 ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
 
-/* Only calibrate if awake */
-if (sc-&amp;gt;sc_ah-&amp;gt;power_mode != ATH9K_PM_AWAKE)
-goto set_timer;
&lt;/pre&gt;</description>
    <dc:creator>Sujith Manoharan</dc:creator>
    <dc:date>2012-05-24T04:03:55</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91390">
    <title>[PATCH v2 19/22] ath: do not update cycle counters with sleep mode</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91390</link>
    <description>&lt;pre&gt;
From: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

When the chip is waking up from sleep state, the cycle counters
might have incorrect readings. So it is better not to update those
readings with software counters.

Signed-off-by: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/main.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 02a8010..3e8bef8 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -101,6 +101,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ath9k_ps_wakeup(struct ath_softc *sc)
 spin_lock(&amp;amp;common-&amp;gt;cc_lock);
 ath_hw_cycle_counters_update(common);
 memset(&amp;amp;common-&amp;gt;cc_survey, 0, sizeof(common-&amp;gt;cc_survey));
+memset(&amp;amp;common-&amp;gt;cc_ani, 0, sizeof(common-&amp;gt;cc_ani));
 spin_unlock(&amp;amp;common-&amp;gt;cc_lock);
 }
 
&lt;/pre&gt;</description>
    <dc:creator>Sujith Manoharan</dc:creator>
    <dc:date>2012-05-24T04:03:50</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91389">
    <title>[PATCH v2 18/22] ath9k: BT coex performance tuning for AR9462</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91389</link>
    <description>&lt;pre&gt;From: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

Use smaller aggregation limit and increasing aggregation threshold
for osla that could improve wlan performance when there is HID profile.

Signed-off-by: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/ar9003_mci.c |    3 --
 drivers/net/wireless/ath/ath9k/ar9003_mci.h |    1 -
 drivers/net/wireless/ath/ath9k/mci.c        |   54 +++++++++++++++++----------
 3 files changed, 35 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.c b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
index 8b09a82..b1ced2a 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1381,9 +1381,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
 case MCI_STATE_NEED_FTP_STOMP:
 value = !(mci-&amp;gt;config &amp;amp; ATH_MCI_CONFIG_DISABLE_FTP_STOMP);
 break;
-case MCI_STATE_NEED_TUNING:
-value = !(mci-&amp;gt;config &amp;amp; ATH_MCI_CONFIG_DISABLE_TUNING);
-break;
 default:
 break;
 }
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.h b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
index f4a6a44..10282e2 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.h
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -212,7 +212,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum mci_state_type {
 MCI_STATE_SET_CONCUR_TX_PRI,
 MCI_STATE_RECOVER_RX,
 MCI_STATE_NEED_FTP_STOMP,
-MCI_STATE_NEED_TUNING,
 MCI_STATE_DEBUG,
 MCI_STATE_MAX
 };
diff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c
index 7b553f6..49137f4 100644
--- a/drivers/net/wireless/ath/ath9k/mci.c
+++ b/drivers/net/wireless/ath/ath9k/mci.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -116,42 +116,58 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ath_mci_update_scheme(struct ath_softc *sc)
 struct ath_common *common = ath9k_hw_common(sc-&amp;gt;sc_ah);
 struct ath_btcoex *btcoex = &amp;amp;sc-&amp;gt;btcoex;
 struct ath_mci_profile *mci = &amp;amp;btcoex-&amp;gt;mci;
+struct ath9k_hw_mci *mci_hw = &amp;amp;sc-&amp;gt;sc_ah-&amp;gt;btcoex_hw.mci;
 struct ath_mci_profile_info *info;
 u32 num_profile = NUM_PROF(mci);
 
+if (mci_hw-&amp;gt;config &amp;amp; ATH_MCI_CONFIG_DISABLE_TUNING)
+goto skip_tuning;
+
 if (num_profile == 1) {
 info = list_first_entry(&amp;amp;mci-&amp;gt;info,
 struct ath_mci_profile_info,
 list);
-if (mci-&amp;gt;num_sco &amp;amp;&amp;amp; info-&amp;gt;T == 12) {
-mci-&amp;gt;aggr_limit = 8;
+if (mci-&amp;gt;num_sco) {
+if (info-&amp;gt;T == 12)
+mci-&amp;gt;aggr_limit = 8;
+else if (info-&amp;gt;T == 6) {
+mci-&amp;gt;aggr_limit = 6;
+btcoex-&amp;gt;duty_cycle = 30;
+}
 ath_dbg(common, MCI,
-"Single SCO, aggregation limit 2 ms\n");
-} else if ((info-&amp;gt;type == MCI_GPM_COEX_PROFILE_BNEP) &amp;amp;&amp;amp;
-   !info-&amp;gt;master) {
-btcoex-&amp;gt;btcoex_period = 60;
+"Single SCO, aggregation limit %d 1/4 ms\n",
+mci-&amp;gt;aggr_limit);
+} else if (mci-&amp;gt;num_pan || mci-&amp;gt;num_other_acl) {
+/*
+ * For single PAN/FTP profile, allocate 35% for BT
+ * to improve WLAN throughput.
+ */
+btcoex-&amp;gt;duty_cycle = 35;
+btcoex-&amp;gt;btcoex_period = 53;
 ath_dbg(common, MCI,
-"Single slave PAN/FTP, bt period 60 ms\n");
-} else if ((info-&amp;gt;type == MCI_GPM_COEX_PROFILE_HID) &amp;amp;&amp;amp;
- (info-&amp;gt;T &amp;gt; 0 &amp;amp;&amp;amp; info-&amp;gt;T &amp;lt; 50) &amp;amp;&amp;amp;
- (info-&amp;gt;A &amp;gt; 1 || info-&amp;gt;W &amp;gt; 1)) {
+"Single PAN/FTP bt period %d ms dutycycle %d\n",
+btcoex-&amp;gt;duty_cycle, btcoex-&amp;gt;btcoex_period);
+} else if (mci-&amp;gt;num_hid) {
 btcoex-&amp;gt;duty_cycle = 30;
-mci-&amp;gt;aggr_limit = 8;
+mci-&amp;gt;aggr_limit = 6;
 ath_dbg(common, MCI,
 "Multiple attempt/timeout single HID "
-"aggregation limit 2 ms dutycycle 30%%\n");
+"aggregation limit 1.5 ms dutycycle 30%%\n");
 }
-} else if ((num_profile == 2) &amp;amp;&amp;amp; (mci-&amp;gt;num_hid == 2)) {
-btcoex-&amp;gt;duty_cycle = 30;
-mci-&amp;gt;aggr_limit = 8;
-ath_dbg(common, MCI,
-"Two HIDs aggregation limit 2 ms dutycycle 30%%\n");
-} else if (num_profile &amp;gt; 3) {
+} else if (num_profile == 2) {
+if (mci-&amp;gt;num_hid == 2)
+btcoex-&amp;gt;duty_cycle = 30;
 mci-&amp;gt;aggr_limit = 6;
 ath_dbg(common, MCI,
-"Three or more profiles aggregation limit 1.5 ms\n");
+"Two BT profiles aggr limit 1.5 ms dutycycle %d%%\n",
+btcoex-&amp;gt;duty_cycle);
+} else if (num_profile &amp;gt;= 3) {
+mci-&amp;gt;aggr_limit = 4;
+ath_dbg(common, MCI,
+"Three or more profiles aggregation limit 1 ms\n");
 }
 
+skip_tuning:
 if (IS_CHAN_2GHZ(sc-&amp;gt;sc_ah-&amp;gt;curchan)) {
 if (IS_CHAN_HT(sc-&amp;gt;sc_ah-&amp;gt;curchan))
 ath_mci_adjust_aggr_limit(btcoex);
&lt;/pre&gt;</description>
    <dc:creator>Sujith Manoharan</dc:creator>
    <dc:date>2012-05-24T04:03:43</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91388">
    <title>[PATCH v2 17/22] ath9k_hw: fix BT RF performance</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91388</link>
    <description>&lt;pre&gt;From: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

When software rfkill is triggered, before put the chip in reset
state, give LNA and SPDT control to BT to make sure BT can have
good RF performance.

Signed-off-by: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/ar9003_mci.c |   16 ++++++++++++++++
 drivers/net/wireless/ath/ath9k/ar9003_mci.h |    1 +
 drivers/net/wireless/ath/ath9k/hw.c         |    3 +++
 3 files changed, 20 insertions(+)

diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.c b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
index 854dff6..8b09a82 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1391,3 +1391,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
 return value;
 }
 EXPORT_SYMBOL(ar9003_mci_state);
+
+void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah)
+{
+struct ath_common *common = ath9k_hw_common(ah);
+struct ath9k_hw_mci *mci = &amp;amp;ah-&amp;gt;btcoex_hw.mci;
+
+ath_dbg(common, MCI, "Give LNA and SPDT control to BT\n");
+
+REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL);
+mci-&amp;gt;is_2g = false;
+mci-&amp;gt;update_2g5g = true;
+ar9003_mci_send_2g5g_status(ah, true);
+
+/* Force another 2g5g update at next scanning */
+mci-&amp;gt;update_2g5g = true;
+}
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.h b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
index 652ab8c..f4a6a44 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.h
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -266,6 +266,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,
 void ar9003_mci_cleanup(struct ath_hw *ah);
 void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,
       u32 *rx_msg_intr);
+void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah);
 
 /*
  * These functions are used by ath9k_hw.
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 53c5dea..9e8fef2 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2734,6 +2734,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; EXPORT_SYMBOL(ath9k_hw_setrxfilter);
 
 bool ath9k_hw_phy_disable(struct ath_hw *ah)
 {
+if (ath9k_hw_mci_is_enabled(ah))
+ar9003_mci_bt_gain_ctrl(ah);
+
 if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
 return false;
 
&lt;/pre&gt;</description>
    <dc:creator>Sujith Manoharan</dc:creator>
    <dc:date>2012-05-24T04:03:37</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.linux.kernel.wireless.general/91387">
    <title>[PATCH v2 16/22] ath9k_hw: configure ar9462 switching regulator</title>
    <link>http://comments.gmane.org/gmane.linux.kernel.wireless.general/91387</link>
    <description>&lt;pre&gt;
From: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;

Enable WLAN and BT mode for switching regulator discontinuous
orverride for AR9462 chips.

Signed-off-by: Rajkumar Manoharan &amp;lt;rmanohar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 drivers/net/wireless/ath/ath9k/ar9003_phy.c |    4 ++++
 drivers/net/wireless/ath/ath9k/hw.h         |    1 -
 drivers/net/wireless/ath/ath9k/reg.h        |    2 ++
 3 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
index 11abb97..d6baf69 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -676,6 +676,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int ar9003_hw_process_ini(struct ath_hw *ah,
 if (chan-&amp;gt;channel == 2484)
 ar9003_hw_prog_ini(ah, &amp;amp;ah-&amp;gt;ini_japan2484, 1);
 
+if (AR_SREV_9462(ah))
+REG_WRITE(ah, AR_GLB_SWREG_DISCONT_MODE,
+  AR_GLB_SWREG_DISCONT_EN_BT_WLAN);
+
 ah-&amp;gt;modes_index = modesIndex;
 ar9003_hw_override_ini(ah);
 ar9003_hw_set_channel_regs(ah, chan);
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 3740aab..03d5909 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -824,7 +824,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct ath_hw {
 struct ar5416IniArray ini_japan2484;
 struct ar5416IniArray iniModes_9271_ANI_reg;
 struct ar5416IniArray ini_radio_post_sys2ant;
-struct ar5416IniArray ini_BTCOEX_MAX_TXPWR;
 
 struct ar5416IniArray iniMac[ATH_INI_NUM_SPLIT];
 struct ar5416IniArray iniBB[ATH_INI_NUM_SPLIT];
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
index 458f81b..560d6ef 100644
--- a/drivers/net/wireless/ath/ath9k/reg.h
+++ b/drivers/net/wireless/ath/ath9k/reg.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2211,5 +2211,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum {
 #define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT0x00000fff
 #define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT_S0
 
+#define AR_GLB_SWREG_DISCONT_MODE         0x2002c
+#define AR_GLB_SWREG_DISCONT_EN_BT_WLAN   0x3
 
 #endif
&lt;/pre&gt;</description>
    <dc:creator>Sujith Manoharan</dc:creator>
    <dc:date>2012-05-24T04:03:30</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.linux.kernel.wireless.general">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.linux.kernel.wireless.general</link>
  </textinput>
</rdf:RDF>

