• Helmut Schaa's avatar
    rt2x00: Refactor beacon code to make use of start- and stop_queue · 69cf36a4
    Helmut Schaa authored
    This patch allows to dynamically remove beaconing interfaces without
    shutting beaconing down on all interfaces.
    
    The only place to start and stop beaconing are now the start- and
    stop_queue callbacks. Hence, we can remove some register writes during
    interface bring up (config_intf) and only write the correct sync mode
    to the register there.
    
    When multiple beaconing interfaces are present we should enable
    beaconing as soon as mac80211 enables beaconing on at least one of
    them. The beacon queue gets stopped when the last beaconing
    interface was stopped by mac80211. Therefore, introduce another
    interface counter to keep track ot the number of enabled beaconing
    interfaces and start or stop the beacon queue accordingly.
    
    To allow single interfaces to stop beaconing, add a new driver
    callback clear_beacon to clear a single interface's beacon without
    affecting the other interfaces. Don't overload the clear_entry callback
    for clearing beacons as that would introduce additional overhead
    (check for each TX queue) into the clear_entry callback which is used
    on the drivers TX/RX hotpaths.
    
    Furthermore, the write beacon callback doesn't need to enable beaconing
    anymore but since beaconing should be disabled while a new beacon is
    written or cleared we still disable beacon generation and enable it
    afterwards again in the driver specific callbacks. However, beacon
    related interrupts should not be disabled/enabled here, that's solely
    done from the start- and stop queue callbacks. It would be nice to stop
    the beacon queue just before the beacon update and enable it afterwards
    in rt2x00queue itself instead of the current implementation that relies
    on the driver doing the right thing. However, since start- and
    stop_queue are mutex protected we cannot use them for atomic beacon
    updates.
    Signed-off-by: default avatarHelmut Schaa <helmut.schaa@googlemail.com>
    Acked-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
    Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    69cf36a4
rt2x00queue.c 30.5 KB