Fix a subtle corner case surrounding the handling of OFDM restart along

with AMPDU aggregate delimiters.

If there's an OFDM restart during an aggregate, the hardware ACKs
the previous frame, but communicates the RXed frame to the hardware
as having had CRC delimiter error + OFDM_RESTART phy error.
The frame however didn't have a CRC error and since the hardware ACKed
the aggregate to the sender, it thinks the frame was received.

Since I have no idea how often this occurs in the real world, add a
debug statement so trigger whenever this occurs.  I'd appreciate an
email if someone finds this particular situation is triggered.
This commit is contained in:
Adrian Chadd 2012-06-27 05:23:33 +00:00
parent 02c751922e
commit df5ea0d85b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=237626

View File

@ -240,11 +240,25 @@ ar5416ProcRxDesc(struct ath_hal *ah, struct ath_desc *ds,
if (ads->ds_rxstatus8 & AR_PHYErr) {
u_int phyerr;
rs->rs_status |= HAL_RXERR_PHY;
/*
* Packets with OFDM_RESTART on post delimiter are CRC OK and
* usable and MAC ACKs them.
* To avoid packet from being lost, we remove the PHY Err flag
* so that driver layer does not drop them.
*/
phyerr = MS(ads->ds_rxstatus8, AR_PHYErrCode);
rs->rs_phyerr = phyerr;
}
if ((phyerr == HAL_PHYERR_OFDM_RESTART) &&
(ads->ds_rxstatus8 & AR_PostDelimCRCErr)) {
ath_hal_printf(ah,
"%s: OFDM_RESTART on post-delim CRC error\n",
__func__);
rs->rs_phyerr = 0;
} else {
rs->rs_status |= HAL_RXERR_PHY;
rs->rs_phyerr = phyerr;
}
}
if (ads->ds_rxstatus8 & AR_CRCErr)
rs->rs_status |= HAL_RXERR_CRC;
else if (ads->ds_rxstatus8 & AR_DecryptCRCErr)