|
@@ -491,8 +491,29 @@ EXPORT_SYMBOL(iwl_is_ht40_tx_allowed);
|
|
|
|
|
|
static u16 iwl_adjust_beacon_interval(u16 beacon_val, u16 max_beacon_val)
|
|
|
{
|
|
|
- u16 new_val = 0;
|
|
|
- u16 beacon_factor = 0;
|
|
|
+ u16 new_val;
|
|
|
+ u16 beacon_factor;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If mac80211 hasn't given us a beacon interval, program
|
|
|
+ * the default into the device (not checking this here
|
|
|
+ * would cause the adjustment below to return the maximum
|
|
|
+ * value, which may break PAN.)
|
|
|
+ */
|
|
|
+ if (!beacon_val)
|
|
|
+ return DEFAULT_BEACON_INTERVAL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the beacon interval we obtained from the peer
|
|
|
+ * is too large, we'll have to wake up more often
|
|
|
+ * (and in IBSS case, we'll beacon too much)
|
|
|
+ *
|
|
|
+ * For example, if max_beacon_val is 4096, and the
|
|
|
+ * requested beacon interval is 7000, we'll have to
|
|
|
+ * use 3500 to be able to wake up on the beacons.
|
|
|
+ *
|
|
|
+ * This could badly influence beacon detection stats.
|
|
|
+ */
|
|
|
|
|
|
beacon_factor = (beacon_val + max_beacon_val) / max_beacon_val;
|
|
|
new_val = beacon_val / beacon_factor;
|