ath9k_hw: Abort transmission for sleeping station

The data transmission to the power save station should be aborted
immediately, whenever the station informs sleep state. Right now
the frames queued into into hardware are being transmitted until
the hardware detects the power save station based excessive retries
of the data frames due to unacknowlegdement. Then remaining frames
are returned with filetered status and might be retried later by
driver or mac80211.

Per WFA certification testing, AP should not send out more than two
frames after processing nullfunc with PM bit set from associated
station. To speed up tx filtering, the pending frames in hardware
queues for given station will be aborted immediately via tx filter
registers. This transmit filters can be ignored if the descriptor
is having invalid destination index or clear destination mask set.

Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
此提交包含在:
Rajkumar Manoharan
2014-05-19 11:44:37 +05:30
提交者 John W. Linville
父節點 1db10595c6
當前提交 08232bf949
共有 4 個檔案被更改,包括 31 行新增3 行删除

查看文件

@@ -958,3 +958,25 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah)
return;
}
EXPORT_SYMBOL(ath9k_hw_set_interrupts);
#define ATH9K_HW_MAX_DCU 10
#define ATH9K_HW_SLICE_PER_DCU 16
#define ATH9K_HW_BIT_IN_SLICE 16
void ath9k_hw_set_tx_filter(struct ath_hw *ah, u8 destidx, bool set)
{
int dcu_idx;
u32 filter;
for (dcu_idx = 0; dcu_idx < 10; dcu_idx++) {
filter = SM(set, AR_D_TXBLK_WRITE_COMMAND);
filter |= SM(dcu_idx, AR_D_TXBLK_WRITE_DCU);
filter |= SM((destidx / ATH9K_HW_SLICE_PER_DCU),
AR_D_TXBLK_WRITE_SLICE);
filter |= BIT(destidx % ATH9K_HW_BIT_IN_SLICE);
ath_dbg(ath9k_hw_common(ah), PS,
"DCU%d staid %d set %d txfilter %08x\n",
dcu_idx, destidx, set, filter);
REG_WRITE(ah, AR_D_TXBLK_BASE, filter);
}
}
EXPORT_SYMBOL(ath9k_hw_set_tx_filter);