b43: add support for setting the beacon listen interval
authorHauke Mehrtens <hauke@hauke-m.de>
Sun, 14 Sep 2014 21:09:12 +0000 (23:09 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 15 Sep 2014 19:00:54 +0000 (15:00 -0400)
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/main.c

index 8ebce26ef4d01404dea3481eab9324cd370a3936..bb12586cd7cdfb05b0ac1e909a37a15d5bdc985e 100644 (file)
@@ -300,6 +300,7 @@ enum {
 #define B43_SHM_SH_LFFBLIM             0x0046  /* Long frame fallback retry limit */
 #define B43_SHM_SH_BEACPHYCTL          0x0054  /* Beacon PHY TX control word (see PHY TX control) */
 #define B43_SHM_SH_EXTNPHYCTL          0x00B0  /* Extended bytes for beacon PHY control (N) */
+#define B43_SHM_SH_BCN_LI              0x00B6  /* beacon listen interval */
 /* SHM_SHARED ACK/CTS control */
 #define B43_SHM_SH_ACKCTSPHYCTL                0x0022  /* ACK/CTS PHY control word (see PHY TX control) */
 /* SHM_SHARED probe response variables */
index 76cae3154ab3f3bcd10366cdf9cc1811d3449cde..5d4173ee55bcc4aaa32cbab54390fe3c3c242502 100644 (file)
@@ -3930,6 +3930,12 @@ static int b43_switch_band(struct b43_wldev *dev,
        return 0;
 }
 
+static void b43_set_beacon_listen_interval(struct b43_wldev *dev, u16 interval)
+{
+       interval = min_t(u16, interval, (u16)0xFF);
+       b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BCN_LI, interval);
+}
+
 /* Write the short and long frame retry limit values. */
 static void b43_set_retry_limits(struct b43_wldev *dev,
                                 unsigned int short_retry,
@@ -3958,6 +3964,9 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
        mutex_lock(&wl->mutex);
        b43_mac_suspend(dev);
 
+       if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL)
+               b43_set_beacon_listen_interval(dev, conf->listen_interval);
+
        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
                phy->chandef = &conf->chandef;
                phy->channel = conf->chandef.chan->hw_value;