I actually did, your patch was the starting point, but I encountered "ath0:
device timeout" errors while testing with both patches applied, so it still
needs deeper research.

2010/4/25 Luis Henriques <[email protected]>

> Hi Alexander,
>
> I was wondering whether you tested this code + my original patch.  I
> just merged both patches and I'm still able to use my card.
>
> However, with my card the code you added (function ar5k_ar2425_channel)
> is not actually activated -- I follow into the default case where function
> ar5k_ar5112_channel is invoked.
>
> I can send a patch merging the 2 patches if anyone is interested but
> merging them is probably something easy to do for someone willing to
> test it (my original patch can be found at
> http://marc.info/?l=openbsd-tech&m=126438116226809&w=2 ).
>
> --
> Luis
>
> On Sun, Apr 25, 2010 at 01:51:12AM +0800, Alexander Vladimirov wrote:
> > On Sat, 24 Apr 2010 16:26:01 +0100
> > "Federico G. Schwindt" <[email protected]> wrote:
> >
> > > > +       else if (hal->ah_radio == AR5K_AR2425)
> > > > +               ret = ar5k_ar5111_channel(hal, channel);
> > >                              ^^^^^^
> > >   shouldn't that be ar_2425?
> > >
> > Oh sorry, sure it should. I was cleaning other changes and introduced
> this typo. Here is fixed and re-tested patch:
> >
> > Index: sys/dev/ic/ar5212.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/ar5212.c,v
> > retrieving revision 1.51
> > diff -u -p -u -p -r1.51 ar5212.c
> > --- sys/dev/ic/ar5212.c       2 Jun 2009 12:39:02 -0000       1.51
> > +++ sys/dev/ic/ar5212.c       24 Apr 2010 15:47:12 -0000
> > @@ -2860,10 +2860,8 @@ ar5k_ar5212_get_capabilities(struct ath_
> >
> >               if (b)
> >                       hal->ah_capabilities.cap_mode |= HAL_MODE_11B;
> > -#if 0
> >               if (g)
> >                       hal->ah_capabilities.cap_mode |= HAL_MODE_11G;
> > -#endif
> >       }
> >
> >       /* GPIO */
> > Index: sys/dev/ic/ar5xxx.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/ic/ar5xxx.c,v
> > retrieving revision 1.55
> > diff -u -p -u -p -r1.55 ar5xxx.c
> > --- sys/dev/ic/ar5xxx.c       23 Sep 2009 18:03:30 -0000      1.55
> > +++ sys/dev/ic/ar5xxx.c       24 Apr 2010 15:47:14 -0000
> > @@ -87,6 +87,7 @@ u_int32_t    ar5k_ar5110_chan2athchan(HAL_
> >  HAL_BOOL      ar5k_ar5111_channel(struct ath_hal *, HAL_CHANNEL *);
> >  HAL_BOOL      ar5k_ar5111_chan2athchan(u_int, struct ar5k_athchan_2ghz
> *);
> >  HAL_BOOL      ar5k_ar5112_channel(struct ath_hal *, HAL_CHANNEL *);
> > +HAL_BOOL      ar5k_ar2425_channel(struct ath_hal *, HAL_CHANNEL *);
> >  HAL_BOOL      ar5k_check_channel(struct ath_hal *, u_int16_t, u_int
> flags);
> >
> >  HAL_BOOL      ar5k_ar5111_rfregs(struct ath_hal *, HAL_CHANNEL *,
> u_int);
> > @@ -1127,6 +1128,8 @@ ar5k_channel(struct ath_hal *hal, HAL_CH
> >               ret = ar5k_ar5110_channel(hal, channel);
> >       else if (hal->ah_radio == AR5K_AR5111)
> >               ret = ar5k_ar5111_channel(hal, channel);
> > +     else if (hal->ah_radio == AR5K_AR2425)
> > +             ret = ar5k_ar2425_channel(hal, channel);
> >       else
> >               ret = ar5k_ar5112_channel(hal, channel);
> >
> > @@ -1283,6 +1286,44 @@ ar5k_ar5112_channel(struct ath_hal *hal,
> >
> >       AR5K_PHY_WRITE(0x27, data & 0xff);
> >       AR5K_PHY_WRITE(0x36, (data >> 8) & 0x7f);
> > +
> > +     return (AH_TRUE);
> > +}
> > +
> > +HAL_BOOL
> > +ar5k_ar2425_channel(struct ath_hal *hal, HAL_CHANNEL *channel)
> > +{
> > +     u_int32_t data, data0, data2;
> > +     u_int16_t c;
> > +
> > +     data = data0 = data2 = 0;
> > +     c = channel->c_channel + hal->ah_chanoff;
> > +
> > +     /*
> > +      * Set the channel on the AR2425
> > +      */
> > +     if (c < 4800) {
> > +             data0 = ar5k_bitswap((c - 2272), 8);
> > +             data2 = 0;
> > +     } else if ((c - (c % 5)) != 2 || c > 5435) {
> > +             if (!(c % 20) && c < 5120)
> > +                     data0 = ar5k_bitswap(((c - 4800) / 20 << 2), 8);
> > +             else if (!(c % 10))
> > +                     data0 = ar5k_bitswap(((c - 4800) / 10 << 1), 8);
> > +             else if (!(c % 5))
> > +                     data0 = ar5k_bitswap((c - 4800) / 5, 8);
> > +             else
> > +                     return (AH_FALSE);
> > +             data2 = ar5k_bitswap(1, 2);
> > +     } else {
> > +             data0 = ar5k_bitswap((10 * (c - 2) - 4800) / 25 + 1, 8);
> > +             data2 = ar5k_bitswap(0, 2);
> > +     }
> > +
> > +     data = (data0 << 4) | (data2 << 2) | 0x1001;
> > +
> > +     AR5K_PHY_WRITE(0x27, data & 0xff);
> > +     AR5K_PHY_WRITE(0x36, (data >> 8) & 0x7f);
> >
> >       return (AH_TRUE);
> >  }
> >
> > --
> > Alexander Vladimirov <[email protected]>

Reply via email to