<?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://permalink.gmane.org/gmane.linux.kernel.wireless.general/91440"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91439"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91438"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91437"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91436"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91435"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91434"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91433"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91432"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91431"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91430"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91427"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91426"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91424"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91423"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91422"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91421"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91420"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91419"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91418"/>
      </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://permalink.gmane.org/gmane.linux.kernel.wireless.general/91440">
    <title>Re: BCM4331 tx failures after S3</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91440</link>
    <description>&lt;pre&gt;
Okay, this one fixes it. The part that's needed seems to be:

        if (bus-&amp;gt;chipinfo.id == 0x4331)
                bcma_chipco_bcm4331_ext_pa_lines_ctl(&amp;amp;bus-&amp;gt;drv_cc, true);

I could have sworn I tried adding this to resume before, but apparently
I didn't.

Hmm. It turns out that BCMA_CC_CHIPCTL is completely reset to 0 when on
S3 without AC power, meaning all other fields in the register get
cleared as well. On this MBP that's affecting
BCMA_CHIPCTL_4331_BT_COEXIST. So we could save the value at suspend and
restore it during resume, but maybe the initialization of this register
also needs to be improved. Thoughts?

Thanks,
Seth

--
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>Seth Forshee</dc:creator>
    <dc:date>2012-05-25T14:13:39</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91439">
    <title>[PATCH V2 2/2] ath6kl: Fix unstable downlink throughput</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91439</link>
    <description>&lt;pre&gt;There is frequent downlink throughput drop to 0 when operating
at the signal level between -42dBm to -53dBm. This has been root
caused to the delay in releasing pending a-mpdu subframes in
reorder buffer. Right now the timeout value is 400ms, there
is also a race condition where timeout handler can be delayed
to run at an extra timeout interval. This patch reduces the
timout interval to reasonable 100ms and makes sure releasing
pending frames are not skipped in the timeout handler by removing
the flag (rxtid-&amp;gt;progress) which can delay the timeout logic.

Reported-by: Yu Yanzhi &amp;lt;yanzhiy-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Signed-off-by: Vasanthakumar Thiagarajan &amp;lt;vthiagar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
V2 - Fix code alignment

 drivers/net/wireless/ath/ath6kl/core.h |    3 +-
 drivers/net/wireless/ath/ath6kl/txrx.c |   43 ++++++++++++++-----------------
 2 files changed, 20 insertions(+), 26 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h
index b1bc6bc..a827bd7 100644
--- a/drivers/net/wireless/ath/ath6kl/core.h
+++ b/drivers/net/wireless/ath/ath6kl/core.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -215,7 +215,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum ath6kl_hw_flags {
 
 #define AGGR_NUM_OF_FREE_NETBUFS    16
 
-#define AGGR_RX_TIMEOUT     400/* in ms */
+#define AGGR_RX_TIMEOUT     100/* in ms */
 
 #define WMI_TIMEOUT (2 * HZ)
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -264,7 +264,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct skb_hold_q {
 
 struct rxtid {
 bool aggr;
-bool progress;
 bool timer_mon;
 u16 win_sz;
 u16 seq_next;
diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index 60723be..a6ff890 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; -1186,28 +1186,26 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
 aggr_deque_frms(agg_conn, tid, 0, 1);
 
 if (agg_conn-&amp;gt;timer_scheduled)
-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
- * timer so start a timer to ensure that
- * the frame doesn't remain stuck
- * forever.
- */
-agg_conn-&amp;gt;timer_scheduled = true;
-mod_timer(&amp;amp;agg_conn-&amp;gt;timer,
-  (jiffies +
-   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;
-}
+return is_queued;
+
+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
+ * timer so start a timer to ensure that
+ * the frame doesn't remain stuck
+ * forever.
+ */
+agg_conn-&amp;gt;timer_scheduled = true;
+mod_timer(&amp;amp;agg_conn-&amp;gt;timer,
+  (jiffies + HZ * (AGGR_RX_TIMEOUT) / 1000));
+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; -1612,7 +1610,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 rxtid = &amp;amp;aggr_conn-&amp;gt;rx_tid[i];
 stats = &amp;amp;aggr_conn-&amp;gt;stat[i];
 
-if (!rxtid-&amp;gt;aggr || !rxtid-&amp;gt;timer_mon || rxtid-&amp;gt;progress)
+if (!rxtid-&amp;gt;aggr || !rxtid-&amp;gt;timer_mon)
 continue;
 
 stats-&amp;gt;num_timeouts++;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1635,7 +1633,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 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;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1667,7 +1664,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_delete_tid_state(struct aggr_info_conn *aggr_conn, u8 tid)
 aggr_deque_frms(aggr_conn, tid, 0, 0);
 
 rxtid-&amp;gt;aggr = false;
-rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = false;
 rxtid-&amp;gt;win_sz = 0;
 rxtid-&amp;gt;seq_next = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1746,7 +1742,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,
 for (i = 0; i &amp;lt; NUM_OF_TIDS; i++) {
 rxtid = &amp;amp;aggr_conn-&amp;gt;rx_tid[i];
 rxtid-&amp;gt;aggr = false;
-rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = false;
 skb_queue_head_init(&amp;amp;rxtid-&amp;gt;q);
 spin_lock_init(&amp;amp;rxtid-&amp;gt;lock);
&lt;/pre&gt;</description>
    <dc:creator>Vasanthakumar Thiagarajan</dc:creator>
    <dc:date>2012-05-25T10:19:18</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91438">
    <title>[PATCH V2 1/2] ath6kl: Fix race in aggregation reorder logic</title>
    <link>http://permalink.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://permalink.gmane.org/gmane.linux.kernel.wireless.general/91437">
    <title>Re: [V2 2/2] ath6kl: Fix unstable downlink throughput</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91437</link>
    <description>&lt;pre&gt;
Oops, missing PATCH prefix, i'll resend them.

Vasanth
--
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>Vasanthakumar Thiagarajan</dc:creator>
    <dc:date>2012-05-25T10:17:09</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91436">
    <title>Re: BCM4331 tx failures after S3</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91436</link>
    <description>&lt;pre&gt;
No solution yet, but maybe another thing to try is b43/bcma with
bcm43224 and see if that works.

Gr. AvS

--
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>Arend van Spriel</dc:creator>
    <dc:date>2012-05-25T10:16:53</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91435">
    <title>[V2 2/2] ath6kl: Fix unstable downlink throughput</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91435</link>
    <description>&lt;pre&gt;There is frequent downlink throughput drop to 0 when operating
at the signal level between -42dBm to -53dBm. This has been root
caused to the delay in releasing pending a-mpdu subframes in
reorder buffer. Right now the timeout value is 400ms, there
is also a race condition where timeout handler can be delayed
to run at an extra timeout interval. This patch reduces the
timout interval to reasonable 100ms and makes sure releasing
pending frames are not skipped in the timeout handler by removing
the flag (rxtid-&amp;gt;progress) which can delay the timeout logic.

Reported-by: Yu Yanzhi &amp;lt;yanzhiy-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
Signed-off-by: Vasanthakumar Thiagarajan &amp;lt;vthiagar-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---

V2 - Fix code alignment

 drivers/net/wireless/ath/ath6kl/core.h |    3 +-
 drivers/net/wireless/ath/ath6kl/txrx.c |   43 ++++++++++++++-----------------
 2 files changed, 20 insertions(+), 26 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h
index b1bc6bc..a827bd7 100644
--- a/drivers/net/wireless/ath/ath6kl/core.h
+++ b/drivers/net/wireless/ath/ath6kl/core.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -215,7 +215,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum ath6kl_hw_flags {
 
 #define AGGR_NUM_OF_FREE_NETBUFS    16
 
-#define AGGR_RX_TIMEOUT     400/* in ms */
+#define AGGR_RX_TIMEOUT     100/* in ms */
 
 #define WMI_TIMEOUT (2 * HZ)
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -264,7 +264,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct skb_hold_q {
 
 struct rxtid {
 bool aggr;
-bool progress;
 bool timer_mon;
 u16 win_sz;
 u16 seq_next;
diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index 60723be..a6ff890 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; -1186,28 +1186,26 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
 aggr_deque_frms(agg_conn, tid, 0, 1);
 
 if (agg_conn-&amp;gt;timer_scheduled)
-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
- * timer so start a timer to ensure that
- * the frame doesn't remain stuck
- * forever.
- */
-agg_conn-&amp;gt;timer_scheduled = true;
-mod_timer(&amp;amp;agg_conn-&amp;gt;timer,
-  (jiffies +
-   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;
-}
+return is_queued;
+
+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
+ * timer so start a timer to ensure that
+ * the frame doesn't remain stuck
+ * forever.
+ */
+agg_conn-&amp;gt;timer_scheduled = true;
+mod_timer(&amp;amp;agg_conn-&amp;gt;timer,
+  (jiffies + HZ * (AGGR_RX_TIMEOUT) / 1000));
+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; -1612,7 +1610,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 rxtid = &amp;amp;aggr_conn-&amp;gt;rx_tid[i];
 stats = &amp;amp;aggr_conn-&amp;gt;stat[i];
 
-if (!rxtid-&amp;gt;aggr || !rxtid-&amp;gt;timer_mon || rxtid-&amp;gt;progress)
+if (!rxtid-&amp;gt;aggr || !rxtid-&amp;gt;timer_mon)
 continue;
 
 stats-&amp;gt;num_timeouts++;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1635,7 +1633,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 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;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1667,7 +1664,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_delete_tid_state(struct aggr_info_conn *aggr_conn, u8 tid)
 aggr_deque_frms(aggr_conn, tid, 0, 0);
 
 rxtid-&amp;gt;aggr = false;
-rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = false;
 rxtid-&amp;gt;win_sz = 0;
 rxtid-&amp;gt;seq_next = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1746,7 +1742,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,
 for (i = 0; i &amp;lt; NUM_OF_TIDS; i++) {
 rxtid = &amp;amp;aggr_conn-&amp;gt;rx_tid[i];
 rxtid-&amp;gt;aggr = false;
-rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = false;
 skb_queue_head_init(&amp;amp;rxtid-&amp;gt;q);
 spin_lock_init(&amp;amp;rxtid-&amp;gt;lock);
&lt;/pre&gt;</description>
    <dc:creator>Vasanthakumar Thiagarajan</dc:creator>
    <dc:date>2012-05-25T10:04:40</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91434">
    <title>[V2 1/2] ath6kl: Fix race in aggregation reorder logic</title>
    <link>http://permalink.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://permalink.gmane.org/gmane.linux.kernel.wireless.general/91433">
    <title>Re: [PATCH] mac80211: allow setting default U-APSD queues/max_sp_len for STA</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91433</link>
    <description>&lt;pre&gt;2012/5/25 Arik Nemtsov &amp;lt;arik-Ix1uc/W3ht7QT0dZR+AlfA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;:

Yes, we are using cfg80211/mac80211 and have a patch for that.
But this is for old-compat so I think this should be rewritten for new
one, while WMM and MAX_SP attr was added in meantime...

Question is if this is best interface for application that required UAPSD?
For Android it could be fine, but for linux I am not sure. Maybe iw
param should be added?



BR
Janusz
--
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>Janusz Dziedzic</dc:creator>
    <dc:date>2012-05-25T09:59:28</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91432">
    <title>[PATCH 2/2] ath6kl: Fix unstable downlink throughput</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91432</link>
    <description>&lt;pre&gt;There is frequent downlink throughput drop to 0 when operating
at the signal level between -42dBm to -53dBm. This has been root
caused to the delay in releasing pending a-mpdu subframes in
reorder buffer. Right now the timeout value is 400ms, there
is also a race condition where timeout handler can be delayed
to run at an extra timeout interval. This patch reduces the
timout interval to reasonable 100ms and makes sure releasing
pending frames are not skipped in the timeout handler by removing
the flag (rxtid-&amp;gt;progress) which can delay the timeout logic.

Reported-by: Yu Yanzhi &amp;lt;yanzhiy-A+ZNKFmMK5xy9aJCnZT0Uw&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
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/core.h |    3 +-
 drivers/net/wireless/ath/ath6kl/txrx.c |   44 ++++++++++++++-----------------
 2 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h
index b1bc6bc..a827bd7 100644
--- a/drivers/net/wireless/ath/ath6kl/core.h
+++ b/drivers/net/wireless/ath/ath6kl/core.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -215,7 +215,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; enum ath6kl_hw_flags {
 
 #define AGGR_NUM_OF_FREE_NETBUFS    16
 
-#define AGGR_RX_TIMEOUT     400/* in ms */
+#define AGGR_RX_TIMEOUT     100/* in ms */
 
 #define WMI_TIMEOUT (2 * HZ)
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -264,7 +264,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct skb_hold_q {
 
 struct rxtid {
 bool aggr;
-bool progress;
 bool timer_mon;
 u16 win_sz;
 u16 seq_next;
diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c
index 60723be..6fe730d 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; -1186,28 +1186,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static bool aggr_process_recv_frm(struct aggr_info_conn *agg_conn, u8 tid,
 aggr_deque_frms(agg_conn, tid, 0, 1);
 
 if (agg_conn-&amp;gt;timer_scheduled)
-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
- * timer so start a timer to ensure that
- * the frame doesn't remain stuck
- * forever.
- */
-agg_conn-&amp;gt;timer_scheduled = true;
-mod_timer(&amp;amp;agg_conn-&amp;gt;timer,
-  (jiffies +
-   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;
-}
+return is_queued;
+
+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
+ * timer so start a timer to ensure that
+ * the frame doesn't remain stuck
+ * forever.
+ */
+agg_conn-&amp;gt;timer_scheduled = true;
+mod_timer(&amp;amp;agg_conn-&amp;gt;timer,
+(jiffies +
+ HZ * (AGGR_RX_TIMEOUT) / 1000));
+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; -1612,7 +1611,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 rxtid = &amp;amp;aggr_conn-&amp;gt;rx_tid[i];
 stats = &amp;amp;aggr_conn-&amp;gt;stat[i];
 
-if (!rxtid-&amp;gt;aggr || !rxtid-&amp;gt;timer_mon || rxtid-&amp;gt;progress)
+if (!rxtid-&amp;gt;aggr || !rxtid-&amp;gt;timer_mon)
 continue;
 
 stats-&amp;gt;num_timeouts++;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1635,7 +1634,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_timeout(unsigned long arg)
 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;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1667,7 +1665,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void aggr_delete_tid_state(struct aggr_info_conn *aggr_conn, u8 tid)
 aggr_deque_frms(aggr_conn, tid, 0, 0);
 
 rxtid-&amp;gt;aggr = false;
-rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = false;
 rxtid-&amp;gt;win_sz = 0;
 rxtid-&amp;gt;seq_next = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1746,7 +1743,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,
 for (i = 0; i &amp;lt; NUM_OF_TIDS; i++) {
 rxtid = &amp;amp;aggr_conn-&amp;gt;rx_tid[i];
 rxtid-&amp;gt;aggr = false;
-rxtid-&amp;gt;progress = false;
 rxtid-&amp;gt;timer_mon = false;
 skb_queue_head_init(&amp;amp;rxtid-&amp;gt;q);
 spin_lock_init(&amp;amp;rxtid-&amp;gt;lock);
&lt;/pre&gt;</description>
    <dc:creator>Vasanthakumar Thiagarajan</dc:creator>
    <dc:date>2012-05-25T09:55:53</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91431">
    <title>[PATCH 1/2] ath6kl: Fix race in aggregation reorder logic</title>
    <link>http://permalink.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://permalink.gmane.org/gmane.linux.kernel.wireless.general/91430">
    <title>Re: [PATCH] mac80211: allow setting default U-APSD queues/max_sp_len for STA</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91430</link>
    <description>&lt;pre&gt;
Well I'm fine with hard-coding it in mac80211 to be VO only.

Are we sure there are real use-cases for changing this dynamically?
One would have to find out the AP is "bad" (how?), change the queues
and then re-associate.
That's why I this user-space is an overkill. But if the consensus here
is that user space is preferred, I can live with that too.

Janusz - It seems driver_nl80211.c doesn't really pass down the
"uapsd" parameter to kernel, and consequently mac80211 doesn't get it.
Are you working with a non-cfg80211 based driver? Or maybe you have an
internal patch to fix this?
Btw, it seems the "uapsd" param can be set via the regular wpa_s
control interface, not only in p2p mode. It's not hard to enable this
from user space as well (and maybe add it to the config file).

Arik
--
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>Arik Nemtsov</dc:creator>
    <dc:date>2012-05-25T05:37:51</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91427">
    <title>Re: [PATCH] compat: rename compat-3.5.c to compat-3.4.c</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91427</link>
    <description>&lt;pre&gt;
Oops I didn't see that, thanks!

  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-25T02:03:43</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91426">
    <title>Re: [PATCH] compat: rename compat-3.5.c to compat-3.4.c</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91426</link>
    <description>&lt;pre&gt;Yeah, v2 had that as well.

- Felix
--
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>Felix Fietkau</dc:creator>
    <dc:date>2012-05-25T02:02:49</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91424">
    <title>Re: [PATCH] compat: rename compat-3.5.c to compat-3.4.c</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91424</link>
    <description>&lt;pre&gt;
Thanks! The equivalent change was required from
include/linux/compat-3.5.h to include/linux/compat-3.4.h, I took care
of that though, merged and I'll push this shortly!

  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-25T00:51:37</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91423">
    <title>Re: BCM4331 tx failures after S3</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91423</link>
    <description>&lt;pre&gt;Hi Seth,

rmmod and insmod of b43 does not help but doing this with b43 and bcma
works is that correct?
Have you tried to add this code from bcma_host_pci_probe() to resume:

/* Disable the RETRY_TIMEOUT register (0x41) to keep
 * PCI Tx retries from interfering with C3 CPU state */
pci_read_config_dword(dev, 0x40, &amp;amp;val);
if ((val &amp;amp; 0x0000ff00) != 0)
pci_write_config_dword(dev, 0x40, val &amp;amp; 0xffff00ff);

Could you also try to run bcma_sprom_get() after resume.
And if that did not help run bcma_bus_scan() and remove the parts which
are chaining anything to struct bcma_bus.

If that all does not help or you already tried that, hopefully Arend has
a solution.

Hauke
--
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>Hauke Mehrtens</dc:creator>
    <dc:date>2012-05-24T21:34:37</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91422">
    <title>Re: BCM4331 tx failures after S3</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91422</link>
    <description>&lt;pre&gt;
I don't know if this helps, but I can do a successful passive scan when
tx isn't working. So it seems rx still works, only tx is broken. I also
forgot to state explicitly that it only matters that AC power isn't
present during the resume; i.e. I can suspend with AC connected, remove
AC, then resume, and I will still get tx failures.

I've been going through the suspend/resume paths for bcma and pci, and I
can't find anything that would account for differing behavior depending
on whether or not AC power is present. Even the ACPI _PS* methods for
the device appear to be (effectively) no-ops.

The only other thing that comes to mind that might be disabling tx is
firmware, either system firmware or the BCM4331's firmware. Perhaps
there's something that bcma or b43 is not initializing that's usually in
the needed state? That's mostly just a guess, but I'm at a loss for
other explanations at this point.

Cheers,
Seth

--
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>Seth Forshee</dc:creator>
    <dc:date>2012-05-24T21:21:15</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91421">
    <title>Re: firmware loading fails for b43 using linux 3.4?</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91421</link>
    <description>&lt;pre&gt;
The callback from request_firmware_nowait() seems to be about as good an 
indicator as any.

Yes, having the b43 module in the ramdisk would also cause a problem.

Larry
--
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>Larry Finger</dc:creator>
    <dc:date>2012-05-24T19:36:35</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91420">
    <title>[PATCH 2/2] mac80211: handle channel times in scan command</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91420</link>
    <description>&lt;pre&gt;Use the user scan times if those were set, otherwise
use the default values.

This patch handles both hw_scan and non-offload scan.

Signed-off-by: Victor Goldenshtein &amp;lt;victorg-l0cyMroinI0&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
---
 net/mac80211/scan.c |   34 +++++++++++++++++++++++++---------
 1 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 8282284..0757551 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -421,7 +421,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
  * After sending probe requests, wait for probe responses
  * on the channel.
  */
-*next_delay = IEEE80211_CHANNEL_TIME;
+*next_delay = local-&amp;gt;scan_req-&amp;gt;min_ch_time;
 local-&amp;gt;next_scan_state = SCAN_DECISION;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -456,6 +456,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
 
 local-&amp;gt;hw_scan_req-&amp;gt;ssids = req-&amp;gt;ssids;
 local-&amp;gt;hw_scan_req-&amp;gt;n_ssids = req-&amp;gt;n_ssids;
+local-&amp;gt;hw_scan_req-&amp;gt;max_ch_time = req-&amp;gt;max_ch_time;
+local-&amp;gt;hw_scan_req-&amp;gt;min_ch_time = req-&amp;gt;min_ch_time;
+local-&amp;gt;hw_scan_req-&amp;gt;max_passive_ch_time =
+req-&amp;gt;max_passive_ch_time;
+local-&amp;gt;hw_scan_req-&amp;gt;min_passive_ch_time =
+req-&amp;gt;min_passive_ch_time;
+
 ies = (u8 *)local-&amp;gt;hw_scan_req +
 sizeof(*local-&amp;gt;hw_scan_req) +
 req-&amp;gt;n_channels * sizeof(req-&amp;gt;channels[0]);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -475,6 +482,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
 local-&amp;gt;scan_req = req;
 local-&amp;gt;scan_sdata = sdata;
 
+if (!local-&amp;gt;scan_req-&amp;gt;min_passive_ch_time)
+local-&amp;gt;scan_req-&amp;gt;min_passive_ch_time =
+IEEE80211_PASSIVE_CHANNEL_TIME;
+if (!local-&amp;gt;scan_req-&amp;gt;min_ch_time)
+local-&amp;gt;scan_req-&amp;gt;min_ch_time = IEEE80211_CHANNEL_TIME;
+
 if (local-&amp;gt;ops-&amp;gt;hw_scan) {
 __set_bit(SCAN_HW_SCANNING, &amp;amp;local-&amp;gt;scanning);
 } else if ((req-&amp;gt;n_channels == 1) &amp;amp;&amp;amp;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -502,10 +515,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
 if ((req-&amp;gt;channels[0]-&amp;gt;flags &amp;amp;
      IEEE80211_CHAN_PASSIVE_SCAN) ||
     !local-&amp;gt;scan_req-&amp;gt;n_ssids) {
-next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
+next_delay = local-&amp;gt;scan_req-&amp;gt;min_passive_ch_time;
 } else {
 ieee80211_scan_state_send_probe(local, &amp;amp;next_delay);
-next_delay = IEEE80211_CHANNEL_TIME;
+next_delay = local-&amp;gt;scan_req-&amp;gt;min_ch_time;
 }
 
 /* Now, just wait a bit and we are all done! */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -540,15 +553,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
 }
 
 static unsigned long
-ieee80211_scan_get_channel_time(struct ieee80211_channel *chan)
+ieee80211_scan_get_channel_time(struct cfg80211_scan_request *scan_req,
+struct ieee80211_channel *chan)
 {
 /*
  * TODO: channel switching also consumes quite some time,
  * add that delay as well to get a better estimation
  */
 if (chan-&amp;gt;flags &amp;amp; IEEE80211_CHAN_PASSIVE_SCAN)
-return IEEE80211_PASSIVE_CHANNEL_TIME;
-return IEEE80211_PROBE_DELAY + IEEE80211_CHANNEL_TIME;
+return scan_req-&amp;gt;min_passive_ch_time;
+return IEEE80211_PROBE_DELAY + scan_req-&amp;gt;min_ch_time;
 }
 
 static void ieee80211_scan_state_decision(struct ieee80211_local *local,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -609,12 +623,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ieee80211_scan_state_decision(struct ieee80211_local *local,
  */
 
 bad_latency = time_after(jiffies +
-ieee80211_scan_get_channel_time(next_chan),
+ieee80211_scan_get_channel_time(local-&amp;gt;scan_req,
+next_chan),
 local-&amp;gt;leave_oper_channel_time +
 usecs_to_jiffies(pm_qos_request(PM_QOS_NETWORK_LATENCY)));
 
 listen_int_exceeded = time_after(jiffies +
-ieee80211_scan_get_channel_time(next_chan),
+ieee80211_scan_get_channel_time(local-&amp;gt;scan_req,
+next_chan),
 local-&amp;gt;leave_oper_channel_time +
 usecs_to_jiffies(min_beacon_int * 1024) *
 local-&amp;gt;hw.conf.listen_interval);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -662,7 +678,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void ieee80211_scan_state_set_channel(struct ieee80211_local *local,
  */
 if (chan-&amp;gt;flags &amp;amp; IEEE80211_CHAN_PASSIVE_SCAN ||
     !local-&amp;gt;scan_req-&amp;gt;n_ssids) {
-*next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
+*next_delay = local-&amp;gt;scan_req-&amp;gt;min_passive_ch_time;
 local-&amp;gt;next_scan_state = SCAN_DECISION;
 return;
 }
&lt;/pre&gt;</description>
    <dc:creator>Victor Goldenshtein</dc:creator>
    <dc:date>2012-05-24T18:52:49</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91419">
    <title>[PATCH 1/2] nl80211/cfg80211: add scan channel times to scan command</title>
    <link>http://permalink.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://permalink.gmane.org/gmane.linux.kernel.wireless.general/91418">
    <title>Re: rtl8192ce : freeze after connecting to network with FW Power Save on</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91418</link>
    <description>&lt;pre&gt;(sorry for the delay, I got caught up in other things, and forgot to send
answer email)

On Wed, 16 May 2012 11:18:16 -0500, Larry Finger &amp;lt;Larry.Finger-tQ5ms3gMjBLk1uMJSBkQmQ&amp;lt; at &amp;gt;public.gmane.org&amp;gt; wrote :


There's no zero difference in dmesg output. Have you tried with
debug_info disabled?

Unfortunately, I've lost access to this hardware, so I won't be able to
do more test for quite some time.
--
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>Anisse Astier</dc:creator>
    <dc:date>2012-05-24T17:10:37</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91417">
    <title>Re: firmware loading fails for b43 using linux 3.4?</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.wireless.general/91417</link>
    <description>&lt;pre&gt;
Is there no event that you can use to determine when user-space is
available? In the original udev discussion it was suggested to use
IFF_UP, but I did not find anyone saying what the equivalent mac80211
callback should be.

Also this issue can occur when the firmware is only available on the
real root, but the ramdisk contains the b43 module.

Gr. AvS

--
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>Arend van Spriel</dc:creator>
    <dc:date>2012-05-24T16:43:56</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>

