> Date: Sun, 7 Oct 2012 18:02:23 +0200
> From: Stefan Sperling <[email protected]>
>
> 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?
Hmm, the AR9300_GPIO_IN_VAL define you introduce isn't actually used.
Not terribly important, but you could leave that one out. Either way:
ok kettenis@
> 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;