source: trunk/package/mac80211/patches/551-ath9k_fix_keymiss_handling.patch @ 28250

Last change on this file since 28250 was 28250, checked in by nbd, 5 years ago

ath9k: fix a regression in handling of MAC key miss events (should improve connection stability)

File size: 2.6 KB
  • drivers/net/wireless/ath/ath9k/ar9003_mac.c

    a b int ath9k_hw_process_rxdesc_edma(struct  
    525525                        rxs->rs_status |= ATH9K_RXERR_DECRYPT; 
    526526                else if (rxsp->status11 & AR_MichaelErr) 
    527527                        rxs->rs_status |= ATH9K_RXERR_MIC; 
    528                 else if (rxsp->status11 & AR_KeyMiss) 
    529                         rxs->rs_status |= ATH9K_RXERR_DECRYPT; 
     528                if (rxsp->status11 & AR_KeyMiss) 
     529                        rxs->rs_status |= ATH9K_RXERR_KEYMISS; 
    530530        } 
    531531 
    532532        return 0; 
  • drivers/net/wireless/ath/ath9k/mac.c

    a b int ath9k_hw_rxprocdesc(struct ath_hw *a 
    620620                        rs->rs_status |= ATH9K_RXERR_DECRYPT; 
    621621                else if (ads.ds_rxstatus8 & AR_MichaelErr) 
    622622                        rs->rs_status |= ATH9K_RXERR_MIC; 
    623                 else if (ads.ds_rxstatus8 & AR_KeyMiss) 
    624                         rs->rs_status |= ATH9K_RXERR_DECRYPT; 
     623                if (ads.ds_rxstatus8 & AR_KeyMiss) 
     624                        rs->rs_status |= ATH9K_RXERR_KEYMISS; 
    625625        } 
    626626 
    627627        return 0; 
  • drivers/net/wireless/ath/ath9k/mac.h

    a b struct ath_htc_rx_status { 
    181181#define ATH9K_RXERR_FIFO          0x04 
    182182#define ATH9K_RXERR_DECRYPT       0x08 
    183183#define ATH9K_RXERR_MIC           0x10 
     184#define ATH9K_RXERR_KEYMISS       0x20 
    184185 
    185186#define ATH9K_RX_MORE             0x01 
    186187#define ATH9K_RX_MORE_AGGR        0x02 
  • drivers/net/wireless/ath/ath9k/recv.c

    a b static bool ath9k_rx_accept(struct ath_c 
    854854         * descriptors. 
    855855         */ 
    856856        if (rx_stats->rs_status != 0) { 
     857                u8 status_mask; 
     858 
    857859                if (rx_stats->rs_status & ATH9K_RXERR_CRC) { 
    858860                        rxs->flag |= RX_FLAG_FAILED_FCS_CRC; 
    859861                        mic_error = false; 
    static bool ath9k_rx_accept(struct ath_c 
    861863                if (rx_stats->rs_status & ATH9K_RXERR_PHY) 
    862864                        return false; 
    863865 
    864                 if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) { 
     866                if ((rx_stats->rs_status & ATH9K_RXERR_DECRYPT) || 
     867                    (!is_mc && (rx_stats->rs_status & ATH9K_RXERR_KEYMISS))) { 
    865868                        *decrypt_error = true; 
    866869                        mic_error = false; 
    867870                } 
    static bool ath9k_rx_accept(struct ath_c 
    871874                 * decryption and MIC failures. For monitor mode, 
    872875                 * we also ignore the CRC error. 
    873876                 */ 
    874                 if (ah->is_monitoring) { 
    875                         if (rx_stats->rs_status & 
    876                             ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC | 
    877                               ATH9K_RXERR_CRC)) 
    878                                 return false; 
    879                 } else { 
    880                         if (rx_stats->rs_status & 
    881                             ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) { 
    882                                 return false; 
    883                         } 
    884                 } 
     877                status_mask = ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC | 
     878                              ATH9K_RXERR_KEYMISS; 
     879 
     880                if (ah->is_monitoring) 
     881                        status_mask |= ATH9K_RXERR_CRC; 
     882 
     883                if (rx_stats->rs_status & ~status_mask) 
     884                        return false; 
    885885        } 
    886886 
    887887        /* 
Note: See TracBrowser for help on using the repository browser.