summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/467-ath5k_optimize_rx_status.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/467-ath5k_optimize_rx_status.patch')
-rw-r--r--package/mac80211/patches/467-ath5k_optimize_rx_status.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/package/mac80211/patches/467-ath5k_optimize_rx_status.patch b/package/mac80211/patches/467-ath5k_optimize_rx_status.patch
new file mode 100644
index 000000000..b0ccb5fe4
--- /dev/null
+++ b/package/mac80211/patches/467-ath5k_optimize_rx_status.patch
@@ -0,0 +1,86 @@
+--- a/drivers/net/wireless/ath/ath5k/desc.c
++++ b/drivers/net/wireless/ath/ath5k/desc.c
+@@ -603,37 +603,37 @@ static int ath5k_hw_proc_5212_rx_status(
+ struct ath5k_rx_status *rs)
+ {
+ struct ath5k_hw_rx_status *rx_status;
++ u32 rxstat0, rxstat1;
+
+ rx_status = &desc->ud.ds_rx.rx_stat;
++ rxstat1 = ACCESS_ONCE(rx_status->rx_status_1);
+
+ /* No frame received / not ready */
+- if (unlikely(!(rx_status->rx_status_1 &
+- AR5K_5212_RX_DESC_STATUS1_DONE)))
++ if (unlikely(!(rxstat1 & AR5K_5212_RX_DESC_STATUS1_DONE)))
+ return -EINPROGRESS;
+
+ memset(rs, 0, sizeof(struct ath5k_rx_status));
++ rxstat0 = ACCESS_ONCE(rx_status->rx_status_0);
+
+ /*
+ * Frame receive status
+ */
+- rs->rs_datalen = rx_status->rx_status_0 &
+- AR5K_5212_RX_DESC_STATUS0_DATA_LEN;
+- rs->rs_rssi = AR5K_REG_MS(rx_status->rx_status_0,
++ rs->rs_datalen = rxstat0 & AR5K_5212_RX_DESC_STATUS0_DATA_LEN;
++ rs->rs_rssi = AR5K_REG_MS(rxstat0,
+ AR5K_5212_RX_DESC_STATUS0_RECEIVE_SIGNAL);
+- rs->rs_rate = AR5K_REG_MS(rx_status->rx_status_0,
++ rs->rs_rate = AR5K_REG_MS(rxstat0,
+ AR5K_5212_RX_DESC_STATUS0_RECEIVE_RATE);
+- rs->rs_antenna = AR5K_REG_MS(rx_status->rx_status_0,
++ rs->rs_antenna = AR5K_REG_MS(rxstat0,
+ AR5K_5212_RX_DESC_STATUS0_RECEIVE_ANTENNA);
+- rs->rs_more = !!(rx_status->rx_status_0 &
+- AR5K_5212_RX_DESC_STATUS0_MORE);
+- rs->rs_tstamp = AR5K_REG_MS(rx_status->rx_status_1,
++ rs->rs_more = !!(rxstat0 & AR5K_5212_RX_DESC_STATUS0_MORE);
++ rs->rs_tstamp = AR5K_REG_MS(rxstat1,
+ AR5K_5212_RX_DESC_STATUS1_RECEIVE_TIMESTAMP);
+
+ /*
+ * Key table status
+ */
+- if (rx_status->rx_status_1 & AR5K_5212_RX_DESC_STATUS1_KEY_INDEX_VALID)
+- rs->rs_keyix = AR5K_REG_MS(rx_status->rx_status_1,
++ if (rxstat1 & AR5K_5212_RX_DESC_STATUS1_KEY_INDEX_VALID)
++ rs->rs_keyix = AR5K_REG_MS(rxstat1,
+ AR5K_5212_RX_DESC_STATUS1_KEY_INDEX);
+ else
+ rs->rs_keyix = AR5K_RXKEYIX_INVALID;
+@@ -641,27 +641,22 @@ static int ath5k_hw_proc_5212_rx_status(
+ /*
+ * Receive/descriptor errors
+ */
+- if (!(rx_status->rx_status_1 &
+- AR5K_5212_RX_DESC_STATUS1_FRAME_RECEIVE_OK)) {
+- if (rx_status->rx_status_1 &
+- AR5K_5212_RX_DESC_STATUS1_CRC_ERROR)
++ if (!(rxstat1 & AR5K_5212_RX_DESC_STATUS1_FRAME_RECEIVE_OK)) {
++ if (rxstat1 & AR5K_5212_RX_DESC_STATUS1_CRC_ERROR)
+ rs->rs_status |= AR5K_RXERR_CRC;
+
+- if (rx_status->rx_status_1 &
+- AR5K_5212_RX_DESC_STATUS1_PHY_ERROR) {
++ if (rxstat1 & AR5K_5212_RX_DESC_STATUS1_PHY_ERROR) {
+ rs->rs_status |= AR5K_RXERR_PHY;
+- rs->rs_phyerr = AR5K_REG_MS(rx_status->rx_status_1,
++ rs->rs_phyerr = AR5K_REG_MS(rxstat1,
+ AR5K_5212_RX_DESC_STATUS1_PHY_ERROR_CODE);
+ if (!ah->ah_capabilities.cap_has_phyerr_counters)
+ ath5k_ani_phy_error_report(ah, rs->rs_phyerr);
+ }
+
+- if (rx_status->rx_status_1 &
+- AR5K_5212_RX_DESC_STATUS1_DECRYPT_CRC_ERROR)
++ if (rxstat1 & AR5K_5212_RX_DESC_STATUS1_DECRYPT_CRC_ERROR)
+ rs->rs_status |= AR5K_RXERR_DECRYPT;
+
+- if (rx_status->rx_status_1 &
+- AR5K_5212_RX_DESC_STATUS1_MIC_ERROR)
++ if (rxstat1 & AR5K_5212_RX_DESC_STATUS1_MIC_ERROR)
+ rs->rs_status |= AR5K_RXERR_MIC;
+ }
+ return 0;