diff --git a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h index d6354fa..482071b 100644 --- a/drivers/net/wireless/p54/p54.h +++ b/drivers/net/wireless/p54/p54.h @@ -181,6 +181,7 @@ struct p54_common { u32 tsf_low32, tsf_high32; u32 basic_rate_mask; u16 aid; + unsigned long beacon_timeout_guard; struct sk_buff *cached_beacon; /* cryptographic engine information */ diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index ad2503a..0bd5e73 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c @@ -1058,7 +1058,8 @@ static void p54_rx_trap(struct ieee80211_hw *dev, struct sk_buff *skb) wiphy_name(dev->wiphy), freq); break; case P54_TRAP_NO_BEACON: - if (priv->vif) + if (time_after(priv->beacon_timeout_guard, jiffies) && + priv->vif) ieee80211_beacon_loss(priv->vif); break; case P54_TRAP_SCAN: @@ -1941,10 +1942,12 @@ static int p54_set_ps(struct ieee80211_hw *dev) u16 mode; int i; - if (dev->conf.flags & IEEE80211_CONF_PS) + if (dev->conf.flags & IEEE80211_CONF_PS) { mode = P54_PSM | P54_PSM_BEACON_TIMEOUT | P54_PSM_DTIM | P54_PSM_CHECKSUM | P54_PSM_MCBC; - else + priv->beacon_timeout_guard = jiffies + msecs_to_jiffies( + priv->hw->conf.beacon_int); + } else mode = P54_PSM_CAM; skb = p54_alloc_skb(dev, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*psm), @@ -1963,8 +1966,8 @@ static int p54_set_ps(struct ieee80211_hw *dev) psm->beacon_rssi_skip_max = 200; psm->rssi_delta_threshold = 0; - psm->nr = 10; - psm->exclude[0] = 0; + psm->nr = 1; + psm->exclude[0] = WLAN_EID_TIM; priv->tx(dev, skb);