> Date: Sun, 7 Oct 2012 18:02:23 +0200
> From: Stefan Sperling <s...@openbsd.org>
> 
> 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;

Reply via email to