<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-stable.git/drivers/net/wireless/rt2x00/rt2x00queue.c, branch linux-3.2.y</title>
<subtitle>Linux kernel stable tree</subtitle>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/'/>
<entry>
<title>rt2x00: do not align payload on modern H/W</title>
<updated>2014-12-14T16:23:56+00:00</updated>
<author>
<name>Stanislaw Gruszka</name>
<email>sgruszka@redhat.com</email>
</author>
<published>2014-11-11T13:28:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=f8ddde5a235cda17012fddd84c0d49d8d8325a16'/>
<id>f8ddde5a235cda17012fddd84c0d49d8d8325a16</id>
<content type='text'>
commit cfd9167af14eb4ec21517a32911d460083ee3d59 upstream.

RT2800 and newer hardware require padding between header and payload if
header length is not multiple of 4.

For historical reasons we also align payload to to 4 bytes boundary, but
such alignment is not needed on modern H/W.

Patch fixes skb_under_panic problems reported from time to time:

https://bugzilla.kernel.org/show_bug.cgi?id=84911
https://bugzilla.kernel.org/show_bug.cgi?id=72471
http://marc.info/?l=linux-wireless&amp;m=139108549530402&amp;w=2
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1087591

Panic happened because we eat 4 bytes of skb headroom on each
(re)transmission when sending frame without the payload and the header
length not being multiple of 4 (i.e. QoS header has 26 bytes). On such
case because paylad_aling=2 is bigger than header_align=0 we increase
header_align by 4 bytes. To prevent that we could change the check to:

	if (payload_length &amp;&amp; payload_align &gt; header_align)
		header_align += 4;

but not aligning payload at all is more effective and alignment is not
really needed by H/W (that has been tested on OpenWrt project for few
years now).

Reported-and-tested-by: Antti S. Lankila &lt;alankila@bel.fi&gt;
Debugged-by: Antti S. Lankila &lt;alankila@bel.fi&gt;
Reported-by: Henrik Asp &lt;solenskiner@gmail.com&gt;
Originally-From: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Stanislaw Gruszka &lt;sgruszka@redhat.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Ben Hutchings &lt;ben@decadent.org.uk&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit cfd9167af14eb4ec21517a32911d460083ee3d59 upstream.

RT2800 and newer hardware require padding between header and payload if
header length is not multiple of 4.

For historical reasons we also align payload to to 4 bytes boundary, but
such alignment is not needed on modern H/W.

Patch fixes skb_under_panic problems reported from time to time:

https://bugzilla.kernel.org/show_bug.cgi?id=84911
https://bugzilla.kernel.org/show_bug.cgi?id=72471
http://marc.info/?l=linux-wireless&amp;m=139108549530402&amp;w=2
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1087591

Panic happened because we eat 4 bytes of skb headroom on each
(re)transmission when sending frame without the payload and the header
length not being multiple of 4 (i.e. QoS header has 26 bytes). On such
case because paylad_aling=2 is bigger than header_align=0 we increase
header_align by 4 bytes. To prevent that we could change the check to:

	if (payload_length &amp;&amp; payload_align &gt; header_align)
		header_align += 4;

but not aligning payload at all is more effective and alignment is not
really needed by H/W (that has been tested on OpenWrt project for few
years now).

Reported-and-tested-by: Antti S. Lankila &lt;alankila@bel.fi&gt;
Debugged-by: Antti S. Lankila &lt;alankila@bel.fi&gt;
Reported-by: Henrik Asp &lt;solenskiner@gmail.com&gt;
Originally-From: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Stanislaw Gruszka &lt;sgruszka@redhat.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Ben Hutchings &lt;ben@decadent.org.uk&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: fix stop queue</title>
<updated>2013-09-10T00:57:17+00:00</updated>
<author>
<name>Stanislaw Gruszka</name>
<email>stf_xl@wp.pl</email>
</author>
<published>2013-07-28T11:17:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=9e77047af335a301ca5be02a7dcd5d73db0f92e5'/>
<id>9e77047af335a301ca5be02a7dcd5d73db0f92e5</id>
<content type='text'>
commit e2288b66fe7ff0288382b2af671b4da558b44472 upstream.

Since we clear QUEUE_STARTED in rt2x00queue_stop_queue(), following
call to rt2x00queue_pause_queue() reduce to noop, i.e we do not
stop queue in mac80211.

To fix that introduce rt2x00queue_pause_queue_nocheck() function,
which will stop queue in mac80211 directly.

Note that rt2x00_start_queue() explicitly set QUEUE_PAUSED bit.

Note also that reordering operations i.e. first call to
rt2x00queue_pause_queue() and then clear QUEUE_STARTED bit, will race
with rt2x00queue_unpause_queue(), so calling ieee80211_stop_queue()
directly is the only available solution to fix the problem without
major rework.

Signed-off-by: Stanislaw Gruszka &lt;stf_xl@wp.pl&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Ben Hutchings &lt;ben@decadent.org.uk&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit e2288b66fe7ff0288382b2af671b4da558b44472 upstream.

Since we clear QUEUE_STARTED in rt2x00queue_stop_queue(), following
call to rt2x00queue_pause_queue() reduce to noop, i.e we do not
stop queue in mac80211.

To fix that introduce rt2x00queue_pause_queue_nocheck() function,
which will stop queue in mac80211 directly.

Note that rt2x00_start_queue() explicitly set QUEUE_PAUSED bit.

Note also that reordering operations i.e. first call to
rt2x00queue_pause_queue() and then clear QUEUE_STARTED bit, will race
with rt2x00queue_unpause_queue(), so calling ieee80211_stop_queue()
directly is the only available solution to fix the problem without
major rework.

Signed-off-by: Stanislaw Gruszka &lt;stf_xl@wp.pl&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Ben Hutchings &lt;ben@decadent.org.uk&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: use atomic variable for seqno</title>
<updated>2012-06-19T22:18:12+00:00</updated>
<author>
<name>Stanislaw Gruszka</name>
<email>sgruszka@redhat.com</email>
</author>
<published>2012-06-01T09:29:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=6c6967906305e4681c555338d8ad8823e8487c42'/>
<id>6c6967906305e4681c555338d8ad8823e8487c42</id>
<content type='text'>
commit e5851dac2c95af7159716832300b9f50c62c648e upstream.

Remove spinlock as atomic_t can be used instead. Note we use only 16
lower bits, upper bits are changed but we impilcilty cast to u16.

This fix possible deadlock on IBSS mode reproted by lockdep:

=================================
[ INFO: inconsistent lock state ]
3.4.0-wl+ #4 Not tainted
---------------------------------
inconsistent {IN-SOFTIRQ-W} -&gt; {SOFTIRQ-ON-W} usage.
kworker/u:2/30374 [HC0[0]:SC0[0]:HE1:SE1] takes:
 (&amp;(&amp;intf-&gt;seqlock)-&gt;rlock){+.?...}, at: [&lt;f9979a20&gt;] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
{IN-SOFTIRQ-W} state was registered at:
  [&lt;c04978ab&gt;] __lock_acquire+0x47b/0x1050
  [&lt;c0498504&gt;] lock_acquire+0x84/0xf0
  [&lt;c0835733&gt;] _raw_spin_lock+0x33/0x40
  [&lt;f9979a20&gt;] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
  [&lt;f9979f2a&gt;] rt2x00queue_write_tx_frame+0x1a/0x300 [rt2x00lib]
  [&lt;f997834f&gt;] rt2x00mac_tx+0x7f/0x380 [rt2x00lib]
  [&lt;f98fe363&gt;] __ieee80211_tx+0x1b3/0x300 [mac80211]
  [&lt;f98ffdf5&gt;] ieee80211_tx+0x105/0x130 [mac80211]
  [&lt;f99000dd&gt;] ieee80211_xmit+0xad/0x100 [mac80211]
  [&lt;f9900519&gt;] ieee80211_subif_start_xmit+0x2d9/0x930 [mac80211]
  [&lt;c0782e87&gt;] dev_hard_start_xmit+0x307/0x660
  [&lt;c079bb71&gt;] sch_direct_xmit+0xa1/0x1e0
  [&lt;c0784bb3&gt;] dev_queue_xmit+0x183/0x730
  [&lt;c078c27a&gt;] neigh_resolve_output+0xfa/0x1e0
  [&lt;c07b436a&gt;] ip_finish_output+0x24a/0x460
  [&lt;c07b4897&gt;] ip_output+0xb7/0x100
  [&lt;c07b2d60&gt;] ip_local_out+0x20/0x60
  [&lt;c07e01ff&gt;] igmpv3_sendpack+0x4f/0x60
  [&lt;c07e108f&gt;] igmp_ifc_timer_expire+0x29f/0x330
  [&lt;c04520fc&gt;] run_timer_softirq+0x15c/0x2f0
  [&lt;c0449e3e&gt;] __do_softirq+0xae/0x1e0
irq event stamp: 18380437
hardirqs last  enabled at (18380437): [&lt;c0526027&gt;] __slab_alloc.clone.3+0x67/0x5f0
hardirqs last disabled at (18380436): [&lt;c0525ff3&gt;] __slab_alloc.clone.3+0x33/0x5f0
softirqs last  enabled at (18377616): [&lt;c0449eb3&gt;] __do_softirq+0x123/0x1e0
softirqs last disabled at (18377611): [&lt;c041278d&gt;] do_softirq+0x9d/0xe0

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(&amp;(&amp;intf-&gt;seqlock)-&gt;rlock);
  &lt;Interrupt&gt;
    lock(&amp;(&amp;intf-&gt;seqlock)-&gt;rlock);

 *** DEADLOCK ***

4 locks held by kworker/u:2/30374:
 #0:  (wiphy_name(local-&gt;hw.wiphy)){++++.+}, at: [&lt;c045cf99&gt;] process_one_work+0x109/0x3f0
 #1:  ((&amp;sdata-&gt;work)){+.+.+.}, at: [&lt;c045cf99&gt;] process_one_work+0x109/0x3f0
 #2:  (&amp;ifibss-&gt;mtx){+.+.+.}, at: [&lt;f98f005b&gt;] ieee80211_ibss_work+0x1b/0x470 [mac80211]
 #3:  (&amp;intf-&gt;beacon_skb_mutex){+.+...}, at: [&lt;f997a644&gt;] rt2x00queue_update_beacon+0x24/0x50 [rt2x00lib]

stack backtrace:
Pid: 30374, comm: kworker/u:2 Not tainted 3.4.0-wl+ #4
Call Trace:
 [&lt;c04962a6&gt;] print_usage_bug+0x1f6/0x220
 [&lt;c0496a12&gt;] mark_lock+0x2c2/0x300
 [&lt;c0495ff0&gt;] ? check_usage_forwards+0xc0/0xc0
 [&lt;c04978ec&gt;] __lock_acquire+0x4bc/0x1050
 [&lt;c0527890&gt;] ? __kmalloc_track_caller+0x1c0/0x1d0
 [&lt;c0777fb6&gt;] ? copy_skb_header+0x26/0x90
 [&lt;c0498504&gt;] lock_acquire+0x84/0xf0
 [&lt;f9979a20&gt;] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
 [&lt;c0835733&gt;] _raw_spin_lock+0x33/0x40
 [&lt;f9979a20&gt;] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
 [&lt;f9979a20&gt;] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
 [&lt;f997a5cf&gt;] rt2x00queue_update_beacon_locked+0x5f/0xb0 [rt2x00lib]
 [&lt;f997a64d&gt;] rt2x00queue_update_beacon+0x2d/0x50 [rt2x00lib]
 [&lt;f9977e3a&gt;] rt2x00mac_bss_info_changed+0x1ca/0x200 [rt2x00lib]
 [&lt;f9977c70&gt;] ? rt2x00mac_remove_interface+0x70/0x70 [rt2x00lib]
 [&lt;f98e4dd0&gt;] ieee80211_bss_info_change_notify+0xe0/0x1d0 [mac80211]
 [&lt;f98ef7b8&gt;] __ieee80211_sta_join_ibss+0x3b8/0x610 [mac80211]
 [&lt;c0496ab4&gt;] ? mark_held_locks+0x64/0xc0
 [&lt;c0440012&gt;] ? virt_efi_query_capsule_caps+0x12/0x50
 [&lt;f98efb09&gt;] ieee80211_sta_join_ibss+0xf9/0x140 [mac80211]
 [&lt;f98f0456&gt;] ieee80211_ibss_work+0x416/0x470 [mac80211]
 [&lt;c0496d8b&gt;] ? trace_hardirqs_on+0xb/0x10
 [&lt;c077683b&gt;] ? skb_dequeue+0x4b/0x70
 [&lt;f98f207f&gt;] ieee80211_iface_work+0x13f/0x230 [mac80211]
 [&lt;c045cf99&gt;] ? process_one_work+0x109/0x3f0
 [&lt;c045d015&gt;] process_one_work+0x185/0x3f0
 [&lt;c045cf99&gt;] ? process_one_work+0x109/0x3f0
 [&lt;f98f1f40&gt;] ? ieee80211_teardown_sdata+0xa0/0xa0 [mac80211]
 [&lt;c045ed86&gt;] worker_thread+0x116/0x270
 [&lt;c045ec70&gt;] ? manage_workers+0x1e0/0x1e0
 [&lt;c0462f64&gt;] kthread+0x84/0x90
 [&lt;c0462ee0&gt;] ? __init_kthread_worker+0x60/0x60
 [&lt;c083d382&gt;] kernel_thread_helper+0x6/0x10

Signed-off-by: Stanislaw Gruszka &lt;sgruszka@redhat.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Acked-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Ben Hutchings &lt;ben@decadent.org.uk&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit e5851dac2c95af7159716832300b9f50c62c648e upstream.

Remove spinlock as atomic_t can be used instead. Note we use only 16
lower bits, upper bits are changed but we impilcilty cast to u16.

This fix possible deadlock on IBSS mode reproted by lockdep:

=================================
[ INFO: inconsistent lock state ]
3.4.0-wl+ #4 Not tainted
---------------------------------
inconsistent {IN-SOFTIRQ-W} -&gt; {SOFTIRQ-ON-W} usage.
kworker/u:2/30374 [HC0[0]:SC0[0]:HE1:SE1] takes:
 (&amp;(&amp;intf-&gt;seqlock)-&gt;rlock){+.?...}, at: [&lt;f9979a20&gt;] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
{IN-SOFTIRQ-W} state was registered at:
  [&lt;c04978ab&gt;] __lock_acquire+0x47b/0x1050
  [&lt;c0498504&gt;] lock_acquire+0x84/0xf0
  [&lt;c0835733&gt;] _raw_spin_lock+0x33/0x40
  [&lt;f9979a20&gt;] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
  [&lt;f9979f2a&gt;] rt2x00queue_write_tx_frame+0x1a/0x300 [rt2x00lib]
  [&lt;f997834f&gt;] rt2x00mac_tx+0x7f/0x380 [rt2x00lib]
  [&lt;f98fe363&gt;] __ieee80211_tx+0x1b3/0x300 [mac80211]
  [&lt;f98ffdf5&gt;] ieee80211_tx+0x105/0x130 [mac80211]
  [&lt;f99000dd&gt;] ieee80211_xmit+0xad/0x100 [mac80211]
  [&lt;f9900519&gt;] ieee80211_subif_start_xmit+0x2d9/0x930 [mac80211]
  [&lt;c0782e87&gt;] dev_hard_start_xmit+0x307/0x660
  [&lt;c079bb71&gt;] sch_direct_xmit+0xa1/0x1e0
  [&lt;c0784bb3&gt;] dev_queue_xmit+0x183/0x730
  [&lt;c078c27a&gt;] neigh_resolve_output+0xfa/0x1e0
  [&lt;c07b436a&gt;] ip_finish_output+0x24a/0x460
  [&lt;c07b4897&gt;] ip_output+0xb7/0x100
  [&lt;c07b2d60&gt;] ip_local_out+0x20/0x60
  [&lt;c07e01ff&gt;] igmpv3_sendpack+0x4f/0x60
  [&lt;c07e108f&gt;] igmp_ifc_timer_expire+0x29f/0x330
  [&lt;c04520fc&gt;] run_timer_softirq+0x15c/0x2f0
  [&lt;c0449e3e&gt;] __do_softirq+0xae/0x1e0
irq event stamp: 18380437
hardirqs last  enabled at (18380437): [&lt;c0526027&gt;] __slab_alloc.clone.3+0x67/0x5f0
hardirqs last disabled at (18380436): [&lt;c0525ff3&gt;] __slab_alloc.clone.3+0x33/0x5f0
softirqs last  enabled at (18377616): [&lt;c0449eb3&gt;] __do_softirq+0x123/0x1e0
softirqs last disabled at (18377611): [&lt;c041278d&gt;] do_softirq+0x9d/0xe0

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(&amp;(&amp;intf-&gt;seqlock)-&gt;rlock);
  &lt;Interrupt&gt;
    lock(&amp;(&amp;intf-&gt;seqlock)-&gt;rlock);

 *** DEADLOCK ***

4 locks held by kworker/u:2/30374:
 #0:  (wiphy_name(local-&gt;hw.wiphy)){++++.+}, at: [&lt;c045cf99&gt;] process_one_work+0x109/0x3f0
 #1:  ((&amp;sdata-&gt;work)){+.+.+.}, at: [&lt;c045cf99&gt;] process_one_work+0x109/0x3f0
 #2:  (&amp;ifibss-&gt;mtx){+.+.+.}, at: [&lt;f98f005b&gt;] ieee80211_ibss_work+0x1b/0x470 [mac80211]
 #3:  (&amp;intf-&gt;beacon_skb_mutex){+.+...}, at: [&lt;f997a644&gt;] rt2x00queue_update_beacon+0x24/0x50 [rt2x00lib]

stack backtrace:
Pid: 30374, comm: kworker/u:2 Not tainted 3.4.0-wl+ #4
Call Trace:
 [&lt;c04962a6&gt;] print_usage_bug+0x1f6/0x220
 [&lt;c0496a12&gt;] mark_lock+0x2c2/0x300
 [&lt;c0495ff0&gt;] ? check_usage_forwards+0xc0/0xc0
 [&lt;c04978ec&gt;] __lock_acquire+0x4bc/0x1050
 [&lt;c0527890&gt;] ? __kmalloc_track_caller+0x1c0/0x1d0
 [&lt;c0777fb6&gt;] ? copy_skb_header+0x26/0x90
 [&lt;c0498504&gt;] lock_acquire+0x84/0xf0
 [&lt;f9979a20&gt;] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
 [&lt;c0835733&gt;] _raw_spin_lock+0x33/0x40
 [&lt;f9979a20&gt;] ? rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
 [&lt;f9979a20&gt;] rt2x00queue_create_tx_descriptor+0x380/0x490 [rt2x00lib]
 [&lt;f997a5cf&gt;] rt2x00queue_update_beacon_locked+0x5f/0xb0 [rt2x00lib]
 [&lt;f997a64d&gt;] rt2x00queue_update_beacon+0x2d/0x50 [rt2x00lib]
 [&lt;f9977e3a&gt;] rt2x00mac_bss_info_changed+0x1ca/0x200 [rt2x00lib]
 [&lt;f9977c70&gt;] ? rt2x00mac_remove_interface+0x70/0x70 [rt2x00lib]
 [&lt;f98e4dd0&gt;] ieee80211_bss_info_change_notify+0xe0/0x1d0 [mac80211]
 [&lt;f98ef7b8&gt;] __ieee80211_sta_join_ibss+0x3b8/0x610 [mac80211]
 [&lt;c0496ab4&gt;] ? mark_held_locks+0x64/0xc0
 [&lt;c0440012&gt;] ? virt_efi_query_capsule_caps+0x12/0x50
 [&lt;f98efb09&gt;] ieee80211_sta_join_ibss+0xf9/0x140 [mac80211]
 [&lt;f98f0456&gt;] ieee80211_ibss_work+0x416/0x470 [mac80211]
 [&lt;c0496d8b&gt;] ? trace_hardirqs_on+0xb/0x10
 [&lt;c077683b&gt;] ? skb_dequeue+0x4b/0x70
 [&lt;f98f207f&gt;] ieee80211_iface_work+0x13f/0x230 [mac80211]
 [&lt;c045cf99&gt;] ? process_one_work+0x109/0x3f0
 [&lt;c045d015&gt;] process_one_work+0x185/0x3f0
 [&lt;c045cf99&gt;] ? process_one_work+0x109/0x3f0
 [&lt;f98f1f40&gt;] ? ieee80211_teardown_sdata+0xa0/0xa0 [mac80211]
 [&lt;c045ed86&gt;] worker_thread+0x116/0x270
 [&lt;c045ec70&gt;] ? manage_workers+0x1e0/0x1e0
 [&lt;c0462f64&gt;] kthread+0x84/0x90
 [&lt;c0462ee0&gt;] ? __init_kthread_worker+0x60/0x60
 [&lt;c083d382&gt;] kernel_thread_helper+0x6/0x10

Signed-off-by: Stanislaw Gruszka &lt;sgruszka@redhat.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Acked-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Ben Hutchings &lt;ben@decadent.org.uk&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: fix random stalls</title>
<updated>2012-03-19T16:02:19+00:00</updated>
<author>
<name>Stanislaw Gruszka</name>
<email>sgruszka@redhat.com</email>
</author>
<published>2012-03-09T11:39:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=7d616fc050830adea3c00c515cf4cc41a6468a63'/>
<id>7d616fc050830adea3c00c515cf4cc41a6468a63</id>
<content type='text'>
commit 3780d038fdf4b5ef26ead10b0604ab1f46dd9510 upstream.

Is possible that we stop queue and then do not wake up it again,
especially when packets are transmitted fast. That can be easily
reproduced with modified tx queue entry_num to some small value e.g. 16.

If mac80211 already hold local-&gt;queue_stop_reason_lock, then we can wait
on that lock in both rt2x00queue_pause_queue() and
rt2x00queue_unpause_queue(). After drooping -&gt;queue_stop_reason_lock
is possible that __ieee80211_wake_queue() will be performed before
__ieee80211_stop_queue(), hence we stop queue and newer wake up it
again.

Another race condition is possible when between rt2x00queue_threshold()
check and rt2x00queue_pause_queue() we will process all pending tx
buffers on different cpu. This might happen if for example interrupt
will be triggered on cpu performing rt2x00mac_tx().

To prevent race conditions serialize pause/unpause by queue-&gt;tx_lock.

Signed-off-by: Stanislaw Gruszka &lt;sgruszka@redhat.com&gt;
Acked-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 3780d038fdf4b5ef26ead10b0604ab1f46dd9510 upstream.

Is possible that we stop queue and then do not wake up it again,
especially when packets are transmitted fast. That can be easily
reproduced with modified tx queue entry_num to some small value e.g. 16.

If mac80211 already hold local-&gt;queue_stop_reason_lock, then we can wait
on that lock in both rt2x00queue_pause_queue() and
rt2x00queue_unpause_queue(). After drooping -&gt;queue_stop_reason_lock
is possible that __ieee80211_wake_queue() will be performed before
__ieee80211_stop_queue(), hence we stop queue and newer wake up it
again.

Another race condition is possible when between rt2x00queue_threshold()
check and rt2x00queue_pause_queue() we will process all pending tx
buffers on different cpu. This might happen if for example interrupt
will be triggered on cpu performing rt2x00mac_tx().

To prevent race conditions serialize pause/unpause by queue-&gt;tx_lock.

Signed-off-by: Stanislaw Gruszka &lt;sgruszka@redhat.com&gt;
Acked-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: Add WCID to HT TX descriptor</title>
<updated>2011-09-14T17:56:56+00:00</updated>
<author>
<name>Helmut Schaa</name>
<email>helmut.schaa@googlemail.com</email>
</author>
<published>2011-09-08T12:37:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=ead2bb64a38c471ad0a769f61921f330f062dd50'/>
<id>ead2bb64a38c471ad0a769f61921f330f062dd50</id>
<content type='text'>
When sending an unencrypted frame to a STA the driver might want to pass
a suitable WCID since we don't have a key index to allow tx status
reports to get properly assigned to the correct STA.

Signed-off-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When sending an unencrypted frame to a STA the driver might want to pass
a suitable WCID since we don't have a key index to allow tx status
reports to get properly assigned to the correct STA.

Signed-off-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: Reduce window of a queue's tx lock.</title>
<updated>2011-07-07T17:20:58+00:00</updated>
<author>
<name>Gertjan van Wingerde</name>
<email>gwingerde@gmail.com</email>
</author>
<published>2011-07-06T20:57:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=128f8f773d77d41a7dbcaf5d36325a0f4e7955cd'/>
<id>128f8f773d77d41a7dbcaf5d36325a0f4e7955cd</id>
<content type='text'>
Currently a lot of actions that can be done without the queue's tx lock
being held are done inside the locked area.
Move them out to have a leaner and meaner code that operates while the
tx lock is being held.

Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Currently a lot of actions that can be done without the queue's tx lock
being held are done inside the locked area.
Move them out to have a leaner and meaner code that operates while the
tx lock is being held.

Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: Don't use queue entry as parameter when creating TX descriptor.</title>
<updated>2011-07-07T17:20:58+00:00</updated>
<author>
<name>Gertjan van Wingerde</name>
<email>gwingerde@gmail.com</email>
</author>
<published>2011-07-06T20:57:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=77b5621bac4a56b83b9081f48d4e7d1accdde400'/>
<id>77b5621bac4a56b83b9081f48d4e7d1accdde400</id>
<content type='text'>
The functions that create the tx descriptor structure do not operate on
a queue entry at all. Signal this fact in the code by not providing a
queue entry as a parameter, but the rt2x00 device structure and the skb
directly.

This patch is a preparation for reducing the time a queue is locked for
a tx operation.

Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The functions that create the tx descriptor structure do not operate on
a queue entry at all. Signal this fact in the code by not providing a
queue entry as a parameter, but the rt2x00 device structure and the skb
directly.

This patch is a preparation for reducing the time a queue is locked for
a tx operation.

Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: Serialize TX operations on a queue.</title>
<updated>2011-07-07T17:20:57+00:00</updated>
<author>
<name>Gertjan van Wingerde</name>
<email>gwingerde@gmail.com</email>
</author>
<published>2011-07-06T20:56:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=77a861c405da75d81e9e6e32c50eb7f9777777e8'/>
<id>77a861c405da75d81e9e6e32c50eb7f9777777e8</id>
<content type='text'>
The rt2x00 driver gets frequent occurrences of the following error message
when operating under load:
phy0 -&gt; rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the
non-full queue 2.

This is caused by simultaneous attempts from mac80211 to send a frame via
rt2x00, which are not properly serialized inside rt2x00queue_write_tx_frame,
causing the second frame to fail sending with the above mentioned error
message.

Fix this by introducing a per-queue spinlock to serialize the TX operations
on that queue.

Reported-by: Andreas Hartmann &lt;andihartmann@01019freenet.de&gt;
Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The rt2x00 driver gets frequent occurrences of the following error message
when operating under load:
phy0 -&gt; rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the
non-full queue 2.

This is caused by simultaneous attempts from mac80211 to send a frame via
rt2x00, which are not properly serialized inside rt2x00queue_write_tx_frame,
causing the second frame to fail sending with the above mentioned error
message.

Fix this by introducing a per-queue spinlock to serialize the TX operations
on that queue.

Reported-by: Andreas Hartmann &lt;andihartmann@01019freenet.de&gt;
Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Acked-by: Helmut Schaa &lt;helmut.schaa@googlemail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>rt2x00: Interface sequence lock doesn't have to disable interrupts.</title>
<updated>2011-06-01T19:10:59+00:00</updated>
<author>
<name>Gertjan van Wingerde</name>
<email>gwingerde@gmail.com</email>
</author>
<published>2011-05-18T18:25:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=798eefde3097f218849194f1abda1f179a169cc2'/>
<id>798eefde3097f218849194f1abda1f179a169cc2</id>
<content type='text'>
This lock is only used in the TX path and thus in process context. Therefore
we can use a much lighter spinlock variant.

Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This lock is only used in the TX path and thus in process context. Therefore
we can use a much lighter spinlock variant.

Signed-off-by: Gertjan van Wingerde &lt;gwingerde@gmail.com&gt;
Signed-off-by: Ivo van Doorn &lt;IvDoorn@gmail.com&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem</title>
<updated>2011-04-25T18:34:25+00:00</updated>
<author>
<name>John W. Linville</name>
<email>linville@tuxdriver.com</email>
</author>
<published>2011-04-25T18:34:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=cfef6047c4027a8448ec8dafeaf2bb362cc882e4'/>
<id>cfef6047c4027a8448ec8dafeaf2bb362cc882e4</id>
<content type='text'>
Conflicts:
	drivers/net/wireless/iwlwifi/iwl-core.c
	drivers/net/wireless/rt2x00/rt2x00queue.c
	drivers/net/wireless/rt2x00/rt2x00queue.h
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Conflicts:
	drivers/net/wireless/iwlwifi/iwl-core.c
	drivers/net/wireless/rt2x00/rt2x00queue.c
	drivers/net/wireless/rt2x00/rt2x00queue.h
</pre>
</div>
</content>
</entry>
</feed>
