As reported a while ago (see http://marc.info/?l=openbsd-misc&m=132911890531492&w=2) athn(4) attaches to some ar9003 chips but fails to get past the hardware rfkill switch. It always reports "radio is disabled by hardware switch" regardless of the actual state of the switch.
I've got an ar9485 which the in-tree athn(4) does not yet attach to. It belongs to the same chip family and also has the rfkill switch problem so I could diagnose it. The bug is that the ar9003 gpio support code reads the wrong register to obtain the value of an gpio input pin. This diff makes gpio read code match the Linux driver and fixes rfkill switch state detection. I doubt that ar9300 cards will work properly with this patch. In my case the driver now fails a little later while trying to perform TX calibration. Will try looking into that next... ok? Index: ar9003.c =================================================================== RCS file: /cvs/src/sys/dev/ic/ar9003.c,v retrieving revision 1.23 diff -u -p -r1.23 ar9003.c --- ar9003.c 25 Aug 2012 12:14:31 -0000 1.23 +++ ar9003.c 7 Oct 2012 14:56:18 -0000 @@ -503,7 +506,7 @@ int ar9003_gpio_read(struct athn_softc *sc, int pin) { KASSERT(pin < sc->ngpiopins); - return ((AR_READ(sc, AR_GPIO_IN_OUT) >> pin) & 1); + return ((AR_READ(sc, AR_GPIO_IN) & (1 << pin)) != 0); } void Index: ar9003reg.h =================================================================== RCS file: /cvs/src/sys/dev/ic/ar9003reg.h,v retrieving revision 1.7 diff -u -p -r1.7 ar9003reg.h --- ar9003reg.h 1 Jan 2011 13:44:42 -0000 1.7 +++ ar9003reg.h 7 Oct 2012 14:49:25 -0000 @@ -25,6 +25,8 @@ #define AR_ISR_S4_S 0x00d8 #define AR_ISR_S5_S 0x00dc #define AR_GPIO_IN_OUT 0x4048 +#define AR_GPIO_IN 0x404c +#define AR9300_GPIO_IN_VAL 0x0001FFFF #define AR_GPIO_OE_OUT 0x4050 #define AR_GPIO_INTR_POL 0x4058 #define AR_GPIO_INPUT_EN_VAL 0x405c Index: ar9380.c =================================================================== RCS file: /cvs/src/sys/dev/ic/ar9380.c,v retrieving revision 1.15 diff -u -p -r1.15 ar9380.c --- ar9380.c 10 Jun 2012 21:23:36 -0000 1.15 +++ ar9380.c 6 Oct 2012 18:21:33 -0000 @@ -148,7 +150,11 @@ ar9380_setup(struct athn_softc *sc) if (base->rfSilent & AR_EEP_RFSILENT_ENABLED) { sc->flags |= ATHN_FLAG_RFSILENT; /* Get GPIO pin used by hardware radio switch. */ - sc->rfsilent_pin = base->wlanDisableGpio; + sc->rfsilent_pin = MS(base->rfSilent, + AR_EEP_RFSILENT_GPIO_SEL); + /* Get polarity of hardware radio switch. */ + if (base->rfSilent & AR_EEP_RFSILENT_POLARITY) + sc->flags |= ATHN_FLAG_RFSILENT_REVERSED; } /* Set the number of HW key cache entries. */ Index: ar9380reg.h =================================================================== RCS file: /cvs/src/sys/dev/ic/ar9380reg.h,v retrieving revision 1.17 diff -u -p -r1.17 ar9380reg.h --- ar9380reg.h 10 Jun 2012 21:23:36 -0000 1.17 +++ ar9380reg.h 6 Oct 2012 18:21:07 -0000 @@ -75,6 +75,8 @@ struct ar9380_base_eep_hdr { uint8_t eepMisc; uint8_t rfSilent; #define AR_EEP_RFSILENT_ENABLED 0x0001 +#define AR_EEP_RFSILENT_GPIO_SEL_M 0x001c +#define AR_EEP_RFSILENT_GPIO_SEL_S 2 #define AR_EEP_RFSILENT_POLARITY 0x0002 uint8_t blueToothOptions;