Commit 37c68ea6 authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho

wlcore: fix link count in single-link-PSM optimization

commit 144614f3eebd7d only allowed a single active link when
turning on the optimization, ignoring the fact that an AP has two
additional global links.
Use 3 links as an indication for a single active link. Use the
FW PSM bits to verify the extra active link belongs to the AP role.
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent d21553f8
...@@ -332,10 +332,9 @@ static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl, ...@@ -332,10 +332,9 @@ static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
struct wl12xx_vif *wlvif, struct wl12xx_vif *wlvif,
u8 hlid, u8 tx_pkts) u8 hlid, u8 tx_pkts)
{ {
bool fw_ps, single_link; bool fw_ps;
fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map); fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
single_link = (wl->active_link_count == 1);
/* /*
* Wake up from high level PS if the STA is asleep with too little * Wake up from high level PS if the STA is asleep with too little
...@@ -348,8 +347,13 @@ static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl, ...@@ -348,8 +347,13 @@ static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
* Start high-level PS if the STA is asleep with enough blocks in FW. * Start high-level PS if the STA is asleep with enough blocks in FW.
* Make an exception if this is the only connected link. In this * Make an exception if this is the only connected link. In this
* case FW-memory congestion is less of a problem. * 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.
*/ */
else if (!single_link && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS) else if (wl->active_link_count > 3 && fw_ps &&
tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
wl12xx_ps_link_start(wl, wlvif, hlid, true); wl12xx_ps_link_start(wl, wlvif, hlid, true);
} }
......
...@@ -104,7 +104,7 @@ static void wl1271_tx_regulate_link(struct wl1271 *wl, ...@@ -104,7 +104,7 @@ static void wl1271_tx_regulate_link(struct wl1271 *wl,
struct wl12xx_vif *wlvif, struct wl12xx_vif *wlvif,
u8 hlid) u8 hlid)
{ {
bool fw_ps, single_link; bool fw_ps;
u8 tx_pkts; u8 tx_pkts;
if (WARN_ON(!test_bit(hlid, wlvif->links_map))) if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
...@@ -112,15 +112,19 @@ static void wl1271_tx_regulate_link(struct wl1271 *wl, ...@@ -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); fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
tx_pkts = wl->links[hlid].allocated_pkts; 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 * 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. * into high-level PS and clean out its TX queues.
* Make an exception if this is the only connected link. In this * Make an exception if this is the only connected link. In this
* case FW-memory congestion is less of a problem. * 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); wl12xx_ps_link_start(wl, wlvif, hlid, true);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment