Search Linux Wireless

Re: [ath5k-devel] [PATCH] ath5k: Port to new bitrate/channel API

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thursday 31 January 2008 03:38:24 Nick Kossifidis wrote:
> Tested on 5211, 5213+5112, 5213A+2112A and it wors fine.
>
> Also i figured out a way to process rate vallue found on status
> descriptors, it's still buggy but we are getting closer (i think it
> improved stability a little).
> [...]
> +/*
> + * Match the hw provided rate index (through descriptors)
> + * to an index for sc->curband->bitrates, so it can be used
> + * by the stack.
> + *
> + * This one is a little bit tricky but i think i'm right
> + * about this...
> + *
> + * We have 4 rate tables in the following order:
> + * XR (4 rates)
> + * 802.11a (8 rates)
> + * 802.11b (4 rates)
> + * 802.11g (12 rates)
> + * that make the hw rate table.
> + *
> + * Lets take a 5211 for example that supports a and b modes only.
> + * First comes the 802.11a table and then 802.11b (total 12 rates).
> + * When hw returns eg. 11 it points to the last 802.11b rate (11Mbit),
> + * if it returns 2 it points to the second 802.11a rate etc.
> + *
> + * Same goes for 5212 who has xr/a/b/g support (total 28 rates).
> + * First comes the XR table, then 802.11a, 802.11b and 802.11g.
> + * When hw returns eg. 27 it points to the last 802.11g rate (54Mbits) etc
> + */
> +static void
> +ath5k_set_total_hw_rates(struct ath5k_softc *sc){
> +
> +	struct ath5k_hw *ah = sc->ah;
> +
> +	if(test_bit(AR5K_MODE_11A, ah->ah_modes))
> +		sc->a_rates = 8;
> +
> +	if(test_bit(AR5K_MODE_11B, ah->ah_modes))
> +		sc->b_rates = 4;
> +
> +	if(test_bit(AR5K_MODE_11G, ah->ah_modes))
> +		sc->g_rates = 12;
> +
> +	/* XXX: Need to see what what happens when
> +		xr disable bits in eeprom are set */
> +	if(ah->ah_version >= AR5K_AR5212)
> +		sc->xr_rates = 4;
> +
> +}
> +
> +static inline int
> +ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix){
> +
> +	int mac80211_rix;
> +
> +	if(sc->curband->band == IEEE80211_BAND_2GHZ){
> +		/* We setup a g ratetable for both b/g modes */
> +		mac80211_rix = hw_rix - sc->b_rates - sc->a_rates - sc->xr_rates;
> +	} else {
> +		mac80211_rix = hw_rix - sc->xr_rates;
> +	}
> +
> +	/* Something went wrong, fallback to basic rate for this band */
> +	if((mac80211_rix >= sc->curband->n_bitrates) ||
> +	(mac80211_rix <= 0 )){
> +		mac80211_rix = 1;
> +	}
> +
> +	return mac80211_rix;
> +}
> +

hi nick!

i don't think that works (for me / right now)... the reported rate on received 
frames is just all wrong. receiving a frame which was sent with 6Mbps (5GHz 
band) the hw rix is 0xb which translates to mac80211 rate index 7 = 54Mbps. 
looking at the dumped rate table it seems the hardware reports rates with a 
hw value which don't directly translate into indices (at least i can't see 
any pattern right now).

Band 5 GHz: channels 194, rates 8
 rates:
( rate hw )
    60 000b 0000 0000
    90 000f 0000 0000
   120 000a 0000 0000
   180 000e 0000 0000
   240 0009 0000 0000
   360 000d 0000 0000
   480 0008 0000 0000
   540 000c 0000 0000

i have verified that ds->ds_rxstat.rs_rate matches this table in 5GHz band on 
a AR5213 (meaning rs_rate 0xb == 6Mbps, 0xf == 9Mbps, etc...). i haven't done 
this on the 2GHz band, because it's just too noisy here.

bruno




-
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux