diff options
Diffstat (limited to 'package/mac80211/patches/467-ath5k_optimize_rx_status.patch')
-rw-r--r-- | package/mac80211/patches/467-ath5k_optimize_rx_status.patch | 86 |
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 0000000000..b0ccb5fe48 --- /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; |