1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-18 10:35:55 +00:00

Add initial support to the AR9300 HAL to support FreeBSD's intmit API.

I don't like having it in this function; I may migrate it to ar9300_freebsd.c
at some point to keep the HAL code pollution down.

This allows ANI to be disabled via a sysctl.

Tested:

* AR9331, STA/TDMA modes
This commit is contained in:
Adrian Chadd 2015-02-15 21:15:09 +00:00
parent 78a452c36e
commit b8871f0823
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=278816

View File

@ -683,6 +683,7 @@ ar9300_get_capability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type,
{ {
struct ath_hal_9300 *ahp = AH9300(ah); struct ath_hal_9300 *ahp = AH9300(ah);
const HAL_CAPABILITIES *p_cap = &AH_PRIVATE(ah)->ah_caps; const HAL_CAPABILITIES *p_cap = &AH_PRIVATE(ah)->ah_caps;
struct ar9300_ani_state *ani;
switch (type) { switch (type) {
case HAL_CAP_CIPHER: /* cipher handled in hardware */ case HAL_CAP_CIPHER: /* cipher handled in hardware */
@ -911,6 +912,34 @@ ar9300_get_capability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type,
return HAL_ENOTSUPP; return HAL_ENOTSUPP;
} }
#endif #endif
/* FreeBSD ANI */
case HAL_CAP_INTMIT: /* interference mitigation */
switch (capability) {
case HAL_CAP_INTMIT_PRESENT: /* hardware capability */
return HAL_OK;
case HAL_CAP_INTMIT_ENABLE:
return (ahp->ah_proc_phy_err & HAL_PROCESS_ANI) ?
HAL_OK : HAL_ENXIO;
case HAL_CAP_INTMIT_NOISE_IMMUNITY_LEVEL:
case HAL_CAP_INTMIT_OFDM_WEAK_SIGNAL_LEVEL:
// case HAL_CAP_INTMIT_CCK_WEAK_SIGNAL_THR:
case HAL_CAP_INTMIT_FIRSTEP_LEVEL:
case HAL_CAP_INTMIT_SPUR_IMMUNITY_LEVEL:
ani = ar9300_ani_get_current_state(ah);
if (ani == AH_NULL)
return HAL_ENXIO;
switch (capability) {
/* XXX AR9300 HAL has OFDM/CCK noise immunity level params? */
case 2: *result = ani->ofdm_noise_immunity_level; break;
case 3: *result = !ani->ofdm_weak_sig_detect_off; break;
// case 4: *result = ani->cck_weak_sig_threshold; break;
case 5: *result = ani->firstep_level; break;
case 6: *result = ani->spur_immunity_level; break;
}
return HAL_OK;
}
return HAL_EINVAL;
default: default:
return ath_hal_getcapability(ah, type, capability, result); return ath_hal_getcapability(ah, type, capability, result);
} }
@ -986,6 +1015,27 @@ ar9300_set_capability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type,
return AH_TRUE; return AH_TRUE;
} }
return AH_FALSE; return AH_FALSE;
/* FreeBSD interrupt mitigation / ANI */
case HAL_CAP_INTMIT: { /* interference mitigation */
/* This maps the public ANI commands to the internal ANI commands */
/* Private: HAL_ANI_CMD; Public: HAL_CAP_INTMIT_CMD */
static const HAL_ANI_CMD cmds[] = {
HAL_ANI_PRESENT,
HAL_ANI_MODE,
HAL_ANI_NOISE_IMMUNITY_LEVEL,
HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION,
HAL_ANI_CCK_WEAK_SIGNAL_THR,
HAL_ANI_FIRSTEP_LEVEL,
HAL_ANI_SPUR_IMMUNITY_LEVEL,
};
#define N(a) (sizeof(a) / sizeof(a[0]))
return capability < N(cmds) ?
ar9300_ani_control(ah, cmds[capability], setting) :
AH_FALSE;
#undef N
}
case HAL_CAP_RXBUFSIZE: /* set MAC receive buffer size */ case HAL_CAP_RXBUFSIZE: /* set MAC receive buffer size */
ahp->rx_buf_size = setting & AR_DATABUF_MASK; ahp->rx_buf_size = setting & AR_DATABUF_MASK;
OS_REG_WRITE(ah, AR_DATABUF, ahp->rx_buf_size); OS_REG_WRITE(ah, AR_DATABUF, ahp->rx_buf_size);