--- a/ath/if_ath.c +++ b/ath/if_ath.c @@ -10890,8 +10890,13 @@ break; #endif case ATH_ACKRATE: - sc->sc_ackrate = val; - ath_set_ack_bitrate(sc, sc->sc_ackrate); + if (val == -1) + sc->sc_ackrate_override = 0; + else { + sc->sc_ackrate_override = 1; + sc->sc_ackrate = val; + ath_set_ack_bitrate(sc, sc->sc_ackrate); + } break; case ATH_RP: ath_rp_record(sc, --- a/ath/if_athvar.h +++ b/ath/if_athvar.h @@ -698,6 +698,7 @@ unsigned int sc_hasclrkey:1; /* CLR key supported */ unsigned int sc_stagbeacons:1; /* use staggered beacons */ unsigned int sc_dfswait:1; /* waiting on channel for radar detect */ + unsigned int sc_ackrate_override:1; /* override ack rate */ unsigned int sc_ackrate:1; /* send acks at high bitrate */ unsigned int sc_dfs_cac:1; /* waiting on channel for radar detect */ unsigned int sc_hasintmit:1; /* Interference mitigation */ --- a/ath/if_ath_hal_extensions.c +++ b/ath/if_ath_hal_extensions.c @@ -129,6 +129,9 @@ int ath_set_ack_bitrate(struct ath_softc *sc, int high) { + if (!sc->sc_ackrate_override) + return 0; + if (ar_device(sc->devid) == 5212 || ar_device(sc->devid) == 5213) { /* set ack to be sent at low bit-rate */ u_int32_t v = AR5K_STA_ID1_BASE_RATE_11B | AR5K_STA_ID1_ACKCTS_6MB;