| From 8834d3608cc516f13e2e510f4057c263f3d2ce42 Mon Sep 17 00:00:00 2001 |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| Date: Thu, 17 Apr 2014 11:08:47 +0200 |
| Subject: rt2x00: fix beaconing on USB |
| |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| |
| commit 8834d3608cc516f13e2e510f4057c263f3d2ce42 upstream. |
| |
| When disable beaconing we clear register with beacon and newer set it |
| back, what make we stop send beacons infinitely. |
| |
| Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/rt2x00/rt2x00mac.c | 22 ++++++++++++---------- |
| 1 file changed, 12 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/net/wireless/rt2x00/rt2x00mac.c |
| +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c |
| @@ -623,20 +623,18 @@ void rt2x00mac_bss_info_changed(struct i |
| bss_conf->bssid); |
| |
| /* |
| - * Update the beacon. This is only required on USB devices. PCI |
| - * devices fetch beacons periodically. |
| - */ |
| - if (changes & BSS_CHANGED_BEACON && rt2x00_is_usb(rt2x00dev)) |
| - rt2x00queue_update_beacon(rt2x00dev, vif); |
| - |
| - /* |
| * Start/stop beaconing. |
| */ |
| if (changes & BSS_CHANGED_BEACON_ENABLED) { |
| if (!bss_conf->enable_beacon && intf->enable_beacon) { |
| - rt2x00queue_clear_beacon(rt2x00dev, vif); |
| rt2x00dev->intf_beaconing--; |
| intf->enable_beacon = false; |
| + /* |
| + * Clear beacon in the H/W for this vif. This is needed |
| + * to disable beaconing on this particular interface |
| + * and keep it running on other interfaces. |
| + */ |
| + rt2x00queue_clear_beacon(rt2x00dev, vif); |
| |
| if (rt2x00dev->intf_beaconing == 0) { |
| /* |
| @@ -647,11 +645,15 @@ void rt2x00mac_bss_info_changed(struct i |
| rt2x00queue_stop_queue(rt2x00dev->bcn); |
| mutex_unlock(&intf->beacon_skb_mutex); |
| } |
| - |
| - |
| } else if (bss_conf->enable_beacon && !intf->enable_beacon) { |
| rt2x00dev->intf_beaconing++; |
| intf->enable_beacon = true; |
| + /* |
| + * Upload beacon to the H/W. This is only required on |
| + * USB devices. PCI devices fetch beacons periodically. |
| + */ |
| + if (rt2x00_is_usb(rt2x00dev)) |
| + rt2x00queue_update_beacon(rt2x00dev, vif); |
| |
| if (rt2x00dev->intf_beaconing == 1) { |
| /* |