|
@@ -104,7 +104,7 @@ static void wl1271_tx_regulate_link(struct wl1271 *wl,
|
|
|
struct wl12xx_vif *wlvif,
|
|
|
u8 hlid)
|
|
|
{
|
|
|
- bool fw_ps, single_link;
|
|
|
+ bool fw_ps;
|
|
|
u8 tx_pkts;
|
|
|
|
|
|
if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
|
|
@@ -112,15 +112,19 @@ static void wl1271_tx_regulate_link(struct wl1271 *wl,
|
|
|
|
|
|
fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
|
|
|
tx_pkts = wl->links[hlid].allocated_pkts;
|
|
|
- single_link = (wl->active_link_count == 1);
|
|
|
|
|
|
/*
|
|
|
* if in FW PS and there is enough data in FW we can put the link
|
|
|
* into high-level PS and clean out its TX queues.
|
|
|
* Make an exception if this is the only connected link. In this
|
|
|
* case FW-memory congestion is less of a problem.
|
|
|
+ * Note that a single connected STA means 3 active links, since we must
|
|
|
+ * account for the global and broadcast AP links. The "fw_ps" check
|
|
|
+ * assures us the third link is a STA connected to the AP. Otherwise
|
|
|
+ * the FW would not set the PSM bit.
|
|
|
*/
|
|
|
- if (!single_link && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
|
|
|
+ if (wl->active_link_count > 3 && fw_ps &&
|
|
|
+ tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
|
|
|
wl12xx_ps_link_start(wl, wlvif, hlid, true);
|
|
|
}
|
|
|
|