hi!

this is just a preview and a RFC. i would like to know what you think about the
general approach and will send a cleaned up version for final review later.

i am trying to cleanup the rates structures for ath5k. there was a lot of
useless junk and complication in the code which was not used.

i replaced that all with a static ieee80211_rate array which we index according
to the band. no conversion between ath5k_rates and ieee80211_rates has to be
done any more.

what i left out is control_rates. it would be good if we could get that
information from mac80211 somehow but if that is not possible we can set up a
small table for them. they are the same for a given rate in any mode.

i also left out XR rates in the table. will we support XR already or anytime
soon?

also i think i figured a way for reverse conversion from hw code to rate index.

bruno
 
---

 drivers/net/wireless/ath5k/ath5k.h |  148 ++++-------------------
 drivers/net/wireless/ath5k/base.c  |  230 ++++++++++++++++--------------------
 drivers/net/wireless/ath5k/base.h  |    7 -
 drivers/net/wireless/ath5k/debug.c |    1 
 drivers/net/wireless/ath5k/hw.c    |   67 +++-------
 5 files changed, 145 insertions(+), 308 deletions(-)

diff --git a/drivers/net/wireless/ath5k/ath5k.h 
b/drivers/net/wireless/ath5k/ath5k.h
index ba35c30..cd1c0e4 100644
--- a/drivers/net/wireless/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath5k/ath5k.h
@@ -269,11 +269,6 @@ enum ath5k_driver_mode {
 /* adding this flag to rate_code enables short preamble, see ar5212_reg.h */
 #define AR5K_SET_SHORT_PREAMBLE 0x04
 
-#define HAS_SHPREAMBLE(_ix) \
-       (rt->rates[_ix].modulation == IEEE80211_RATE_SHORT_PREAMBLE)
-#define SHPREAMBLE_FLAG(_ix) \
-       (HAS_SHPREAMBLE(_ix) ? AR5K_SET_SHORT_PREAMBLE : 0)
-
 
 /****************\
   TX DEFINITIONS
@@ -566,45 +561,19 @@ struct ath5k_athchan_2ghz {
        u16     a2_athchan;
 };
 
+
 /*
  * Rate definitions
- * TODO: Clean them up or move them on mac80211 -most of these infos are
- *      used by the rate control algorytm on MadWiFi.
  */
 
-/* Max number of rates on the rate table and what it seems
- * Atheros hardware supports */
-#define AR5K_MAX_RATES 32
-
 /**
- * struct ath5k_rate - rate structure
- * @valid: is this a valid rate for rate control (remove)
- * @modulation: respective mac80211 modulation
- * @rate_kbps: rate in kbit/s
- * @rate_code: hardware rate value, used in &struct ath5k_desc, on RX on
- *     &struct ath5k_rx_status.rs_rate and on TX on
- *     &struct ath5k_tx_status.ts_rate. Seems the ar5xxx harware supports
- *     up to 32 rates, indexed by 1-32. This means we really only need
- *     6 bits for the rate_code.
- * @dot11_rate: respective IEEE-802.11 rate value
- * @control_rate: index of rate assumed to be used to send control frames.
- *     This can be used to set override the value on the rate duration
- *     registers. This is only useful if we can override in the harware at
- *     what rate we want to send control frames at. Note that IEEE-802.11
- *     Ch. 9.6 (after IEEE 802.11g changes) defines the rate at which we
- *     should send ACK/CTS, if we change this value we can be breaking
- *     the spec.
+ * Seems the ar5xxx harware supports up to 32 rates, indexed by 1-32.
  *
  * This structure is used to get the RX rate or set the TX rate on the
  * hardware descriptors. It is also used for internal modulation control
  * and settings.
  *
- * On RX after the &struct ath5k_desc is parsed by the appropriate
- * ah_proc_rx_desc() the respective hardware rate value is set in
- * &struct ath5k_rx_status.rs_rate. On TX the desired rate is set in
- * &struct ath5k_tx_status.ts_rate which is later used to setup the
- * &struct ath5k_desc correctly. This is the hardware rate map we are
- * aware of:
+ * This is the hardware rate map we are aware of:
  *
  * rate_code   1       2       3       4       5       6       7       8
  * rate_kbps   3000    1000    ?       ?       ?       2000    500     48000
@@ -619,99 +588,28 @@ struct ath5k_athchan_2ghz {
  * rate_kbps   5500    2000    1000    ?       ?       ?       ?       ?
  *
  */
-struct ath5k_rate {
-       u8      valid;
-       u32     modulation;
-       u16     rate_kbps;
-       u8      rate_code;
-       u8      dot11_rate;
-       u8      control_rate;
-};
-
-/* XXX: GRR all this stuff to get leds blinking ??? (check out setcurmode) */
-struct ath5k_rate_table {
-       u16     rate_count;
-       u8      rate_code_to_index[AR5K_MAX_RATES];     /* Back-mapping */
-       struct ath5k_rate rates[AR5K_MAX_RATES];
-};
-
-/*
- * Rate tables...
- * TODO: CLEAN THIS !!!
- */
-#define AR5K_RATES_11A { 8, {                                  \
-       255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,     \
-       7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
-       { 1, 0, 6000, 11, 140, 0 },             \
-       { 1, 0, 9000, 15, 18, 0 },              \
-       { 1, 0, 12000, 10, 152, 2 },            \
-       { 1, 0, 18000, 14, 36, 2 },             \
-       { 1, 0, 24000, 9, 176, 4 },             \
-       { 1, 0, 36000, 13, 72, 4 },             \
-       { 1, 0, 48000, 8, 96, 4 },              \
-       { 1, 0, 54000, 12, 108, 4 } }           \
-}
-
-#define AR5K_RATES_11B { 4, {                                          \
-       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       3, 2, 1, 0, 255, 255, 255, 255 }, {                             \
-       { 1, 0, 1000, 27, 130, 0 },     \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 2000, 26, 132, 1 }, \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 5500, 25, 139, 1 }, \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 11000, 24, 150, 1 } }       \
-}
-
-#define AR5K_RATES_11G { 12, {                                 \
-       255, 255, 255, 255, 255, 255, 255, 255, 10, 8, 6, 4,    \
-       11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,    \
-       3, 2, 1, 0, 255, 255, 255, 255 }, {                     \
-       { 1, 0, 1000, 27, 2, 0 },               \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 2000, 26, 4, 1 },           \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 5500, 25, 11, 1 },          \
-       { 1, IEEE80211_RATE_SHORT_PREAMBLE, 11000, 24, 22, 1 }, \
-       { 0, 0, 6000, 11, 12, 4 },      \
-       { 0, 0, 9000, 15, 18, 4 },      \
-       { 1, 0, 12000, 10, 24, 6 },     \
-       { 1, 0, 18000, 14, 36, 6 },     \
-       { 1, 0, 24000, 9, 48, 8 },      \
-       { 1, 0, 36000, 13, 72, 8 },     \
-       { 1, 0, 48000, 8, 96, 8 },      \
-       { 1, 0, 54000, 12, 108, 8 } }   \
-}
+#define AR5K_MAX_RATES 32
 
-#define AR5K_RATES_TURBO { 8, {                                        \
-       255, 255, 255, 255, 255, 255, 255, 255, 6, 4, 2, 0,     \
-       7, 5, 3, 1, 255, 255, 255, 255, 255, 255, 255, 255,     \
-       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
-       { 1, MODULATION_TURBO, 6000, 11, 140, 0 },      \
-       { 1, MODULATION_TURBO, 9000, 15, 18, 0 },       \
-       { 1, MODULATION_TURBO, 12000, 10, 152, 2 },     \
-       { 1, MODULATION_TURBO, 18000, 14, 36, 2 },      \
-       { 1, MODULATION_TURBO, 24000, 9, 176, 4 },      \
-       { 1, MODULATION_TURBO, 36000, 13, 72, 4 },      \
-       { 1, MODULATION_TURBO, 48000, 8, 96, 4 },       \
-       { 1, MODULATION_TURBO, 54000, 12, 108, 4 } }    \
-}
+/* B */
+#define ATH5K_RATE_CODE_1M     27
+#define ATH5K_RATE_CODE_2M     26
+#define ATH5K_RATE_CODE_5_5M   25
+#define ATH5K_RATE_CODE_11M    24
+/* A and G */
+#define ATH5K_RATE_CODE_6M     11
+#define ATH5K_RATE_CODE_9M     15
+#define ATH5K_RATE_CODE_12M    10
+#define ATH5K_RATE_CODE_18M    14
+#define ATH5K_RATE_CODE_24M    9
+#define ATH5K_RATE_CODE_36M    13
+#define ATH5K_RATE_CODE_48M    8
+#define ATH5K_RATE_CODE_54M    12
+/* XR */
+#define ATH5K_RATE_CODE_XR_500K        7
+#define ATH5K_RATE_CODE_XR_1M  2
+#define ATH5K_RATE_CODE_XR_2M  6
+#define ATH5K_RATE_CODE_XR_3M  1
 
-#define AR5K_RATES_XR { 12, {                                  \
-       255, 3, 1, 255, 255, 255, 2, 0, 10, 8, 6, 4,            \
-       11, 9, 7, 5, 255, 255, 255, 255, 255, 255, 255, 255,    \
-       255, 255, 255, 255, 255, 255, 255, 255 }, {             \
-       { 1, MODULATION_XR, 500, 7, 129, 0 },           \
-       { 1, MODULATION_XR, 1000, 2, 139, 1 },          \
-       { 1, MODULATION_XR, 2000, 6, 150, 2 },          \
-       { 1, MODULATION_XR, 3000, 1, 150, 3 },          \
-       { 1, 0, 6000, 11, 140, 4 },     \
-       { 1, 0, 9000, 15, 18, 4 },      \
-       { 1, 0, 12000, 10, 152, 6 },    \
-       { 1, 0, 18000, 14, 36, 6 },     \
-       { 1, 0, 24000, 9, 176, 8 },     \
-       { 1, 0, 36000, 13, 72, 8 },     \
-       { 1, 0, 48000, 8, 96, 8 },      \
-       { 1, 0, 54000, 12, 108, 8 } }   \
-}
 
 /*
  * Crypto definitions
diff --git a/drivers/net/wireless/ath5k/base.c 
b/drivers/net/wireless/ath5k/base.c
index 217d506..2cb56d3 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -133,6 +133,48 @@ static struct ath5k_srev_name srev_names[] = {
        { "xxxxx",      AR5K_VERSION_RAD,       AR5K_SREV_UNKNOWN },
 };
 
+static struct ieee80211_rate ath5k_rates[] = {
+       { .bitrate = 10,
+         .hw_value = ATH5K_RATE_CODE_1M, },
+       { .bitrate = 20,
+         .hw_value = ATH5K_RATE_CODE_2M,
+         .hw_value_short = ATH5K_RATE_CODE_2M,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 55,
+         .hw_value = ATH5K_RATE_CODE_5_5M,
+         .hw_value_short = ATH5K_RATE_CODE_5_5M,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 110,
+         .hw_value = ATH5K_RATE_CODE_11M,
+         .hw_value_short = ATH5K_RATE_CODE_11M,
+         .flags = IEEE80211_RATE_SHORT_PREAMBLE },
+       { .bitrate = 60,
+         .hw_value = ATH5K_RATE_CODE_6M,
+         .flags = 0 },
+       { .bitrate = 90,
+         .hw_value = ATH5K_RATE_CODE_9M,
+         .flags = 0 },
+       { .bitrate = 120,
+         .hw_value = ATH5K_RATE_CODE_12M,
+         .flags = 0 },
+       { .bitrate = 180,
+         .hw_value = ATH5K_RATE_CODE_18M,
+         .flags = 0 },
+       { .bitrate = 240,
+         .hw_value = ATH5K_RATE_CODE_24M,
+         .flags = 0 },
+       { .bitrate = 360,
+         .hw_value = ATH5K_RATE_CODE_36M,
+         .flags = 0 },
+       { .bitrate = 480,
+         .hw_value = ATH5K_RATE_CODE_48M,
+         .flags = 0 },
+       { .bitrate = 540,
+         .hw_value = ATH5K_RATE_CODE_54M,
+         .flags = 0 },
+       /* XR missing */
+};
+
 /*
  * Prototypes - PCI stack related functions
  */
@@ -219,9 +261,6 @@ static void         ath5k_detach(struct pci_dev *pdev,
                        struct ieee80211_hw *hw);
 /* Channel/mode setup */
 static inline short ath5k_ieee2mhz(short chan);
-static unsigned int ath5k_copy_rates(struct ieee80211_rate *rates,
-                               const struct ath5k_rate_table *rt,
-                               unsigned int max);
 static unsigned int ath5k_copy_channels(struct ath5k_hw *ah,
                                struct ieee80211_channel *channels,
                                unsigned int mode,
@@ -232,7 +271,6 @@ static int  ath5k_chan_set(struct ath5k_softc *sc,
 static void    ath5k_setcurmode(struct ath5k_softc *sc,
                                unsigned int mode);
 static void    ath5k_mode_setup(struct ath5k_softc *sc);
-static void    ath5k_set_total_hw_rates(struct ath5k_softc *sc);
 
 /* Descriptor setup */
 static int     ath5k_desc_alloc(struct ath5k_softc *sc,
@@ -639,7 +677,6 @@ ath5k_pci_resume(struct pci_dev *pdev)
 #endif /* CONFIG_PM */
 
 
-
 /***********************\
 * Driver Initialization *
 \***********************/
@@ -687,9 +724,6 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
                goto err;
        }
 
-       /* Set *_rates so we can map hw rate index */
-       ath5k_set_total_hw_rates(sc);
-
        /* NB: setup here so ath5k_rate_update is happy */
        if (test_bit(AR5K_MODE_11A, ah->ah_modes))
                ath5k_setcurmode(sc, AR5K_MODE_11A);
@@ -806,27 +840,6 @@ ath5k_ieee2mhz(short chan)
 }
 
 static unsigned int
-ath5k_copy_rates(struct ieee80211_rate *rates,
-               const struct ath5k_rate_table *rt,
-               unsigned int max)
-{
-       unsigned int i, count;
-
-       if (rt == NULL)
-               return 0;
-
-       for (i = 0, count = 0; i < rt->rate_count && max > 0; i++) {
-               rates[count].bitrate = rt->rates[i].rate_kbps / 100;
-               rates[count].hw_value = rt->rates[i].rate_code;
-               rates[count].flags = rt->rates[i].modulation;
-               count++;
-               max--;
-       }
-
-       return count;
-}
-
-static unsigned int
 ath5k_copy_channels(struct ath5k_hw *ah,
                struct ieee80211_channel *channels,
                unsigned int mode,
@@ -893,67 +906,58 @@ ath5k_getchannels(struct ieee80211_hw *hw)
 {
        struct ath5k_softc *sc = hw->priv;
        struct ath5k_hw *ah = sc->ah;
-       struct ieee80211_supported_band *sbands = sc->sbands;
-       const struct ath5k_rate_table *hw_rates;
-       unsigned int max_r, max_c, count_r, count_c;
-       int mode2g = AR5K_MODE_11G;
+       struct ieee80211_supported_band *sband;
+       int max_c, count_c = 0;
 
        BUILD_BUG_ON(ARRAY_SIZE(sc->sbands) < IEEE80211_NUM_BANDS);
-
-       max_r = ARRAY_SIZE(sc->rates);
        max_c = ARRAY_SIZE(sc->channels);
-       count_r = count_c = 0;
 
        /* 2GHz band */
-       if (!test_bit(AR5K_MODE_11G, sc->ah->ah_capabilities.cap_mode)) {
-               mode2g = AR5K_MODE_11B;
-               if (!test_bit(AR5K_MODE_11B,
-                       sc->ah->ah_capabilities.cap_mode))
-                       mode2g = -1;
-       }
+       if (test_bit(AR5K_MODE_11G, sc->ah->ah_capabilities.cap_mode)) {
+               /* G mode */
+               sband = &sc->sbands[IEEE80211_BAND_2GHZ];
+               sband->band = IEEE80211_BAND_2GHZ;
 
-       if (mode2g > 0) {
-               struct ieee80211_supported_band *sband =
-                       &sbands[IEEE80211_BAND_2GHZ];
+               sband->bitrates = &ath5k_rates[0];
+               sband->n_bitrates = 12;
 
-               sband->bitrates = sc->rates;
                sband->channels = sc->channels;
+               sband->n_channels = ath5k_copy_channels(ah, sband->channels,
+                                       AR5K_MODE_11G, max_c);
 
+               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
+               count_c = sband->n_channels;
+               max_c -= count_c;
+       }
+       else if (test_bit(AR5K_MODE_11B, sc->ah->ah_capabilities.cap_mode)) {
+               /* B mode */
+               sband = &sc->sbands[IEEE80211_BAND_2GHZ];
                sband->band = IEEE80211_BAND_2GHZ;
-               sband->n_channels = ath5k_copy_channels(ah, sband->channels,
-                                       mode2g, max_c);
 
-               hw_rates = ath5k_hw_get_rate_table(ah, mode2g);
-               sband->n_bitrates = ath5k_copy_rates(sband->bitrates,
-                                       hw_rates, max_r);
+               sband->bitrates = &ath5k_rates[0];
+               sband->n_bitrates = 4;
 
-               count_c = sband->n_channels;
-               count_r = sband->n_bitrates;
+               sband->channels = sc->channels;
+               sband->n_channels = ath5k_copy_channels(ah, sband->channels,
+                                       AR5K_MODE_11B, max_c);
 
                hw->wiphy->bands[IEEE80211_BAND_2GHZ] = sband;
-
-               max_r -= count_r;
+               count_c = sband->n_channels;
                max_c -= count_c;
-
        }
 
-       /* 5GHz band */
-
+       /* 5GHz band, A mode */
        if (test_bit(AR5K_MODE_11A, sc->ah->ah_capabilities.cap_mode)) {
-               struct ieee80211_supported_band *sband =
-                       &sbands[IEEE80211_BAND_5GHZ];
+               sband = &sc->sbands[IEEE80211_BAND_5GHZ];
+               sband->band = IEEE80211_BAND_5GHZ;
 
-               sband->bitrates = &sc->rates[count_r];
-               sband->channels = &sc->channels[count_c];
+               sband->bitrates = &ath5k_rates[4];
+               sband->n_bitrates = 8;
 
-               sband->band = IEEE80211_BAND_5GHZ;
+               sband->channels = &sc->channels[count_c];
                sband->n_channels = ath5k_copy_channels(ah, sband->channels,
                                        AR5K_MODE_11A, max_c);
 
-               hw_rates = ath5k_hw_get_rate_table(ah, AR5K_MODE_11A);
-               sband->n_bitrates = ath5k_copy_rates(sband->bitrates,
-                                       hw_rates, max_r);
-
                hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband;
        }
 
@@ -1062,74 +1066,46 @@ ath5k_mode_setup(struct ath5k_softc *sc)
 }
 
 /*
- * 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
+ * index into rate tables for fast lookup on receive
+ * dont use directly, only via ath5k_hw_to_driver_rix!
  */
-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 int ath5k_rates_rev_ofdm[] = {
+       6,      /* 8 ATH5K_RATE_CODE_48M */
+       4,      /* 9 ATH5K_RATE_CODE_24M */
+       2,      /* 10 ATH5K_RATE_CODE_12M */
+       0,      /* 11 ATH5K_RATE_CODE_6M */
+       7,      /* 12 ATH5K_RATE_CODE_54M */
+       5,      /* 13 ATH5K_RATE_CODE_36M */
+       3,      /* 14 ATH5K_RATE_CODE_18M */
+       1,      /* 15 ATH5K_RATE_CODE_9M */
+};
 
+/**
+ * lookup rate array
+ */
 static inline int
 ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix) {
+       int ix = -1;
 
-       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;
+       if (sc->curband->band == IEEE80211_BAND_5GHZ) {
+               if (hw_rix >= 8 && hw_rix <= 15)
+                       ix = ath5k_rates_rev_ofdm[hw_rix - 8];
        }
-
-       /* 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;
+       else if (test_bit(AR5K_MODE_11G, sc->ah->ah_modes)) {
+               if (hw_rix >= 8 && hw_rix <= 15)
+                       ix = ath5k_rates_rev_ofdm[hw_rix - 8] + 4;
+               if (hw_rix >= 24 && hw_rix <= 27)
+                       ix = 27 - hw_rix;
+       }
+       else if (test_bit(AR5K_MODE_11B, sc->ah->ah_modes)) {
+               if (hw_rix >= 24 && hw_rix <= 27)
+                       ix = 27 - hw_rix;
+       }
+       if (ix == -1)
+               printk("hw_rix %d -> ix %d\n", hw_rix, ix);
+       return ix;
 }
 
-
-
-
 /***************\
 * Buffers setup *
 \***************/
diff --git a/drivers/net/wireless/ath5k/base.h 
b/drivers/net/wireless/ath5k/base.h
index 47f414b..95ee592 100644
--- a/drivers/net/wireless/ath5k/base.h
+++ b/drivers/net/wireless/ath5k/base.h
@@ -111,17 +111,12 @@ struct ath5k_softc {
        struct ieee80211_hw     *hw;            /* IEEE 802.11 common */
        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
        struct ieee80211_channel channels[ATH_CHAN_MAX];
-       struct ieee80211_rate   rates[AR5K_MAX_RATES * IEEE80211_NUM_BANDS];
+       struct ieee80211_rate   *rates;
        enum ieee80211_if_types opmode;
        struct ath5k_hw         *ah;            /* Atheros HW */
 
        struct ieee80211_supported_band         *curband;
 
-       u8                      a_rates;
-       u8                      b_rates;
-       u8                      g_rates;
-       u8                      xr_rates;
-
 #ifdef CONFIG_ATH5K_DEBUG
        struct ath5k_dbg_info   debug;          /* debug info */
 #endif /* CONFIG_ATH5K_DEBUG */
diff --git a/drivers/net/wireless/ath5k/debug.c 
b/drivers/net/wireless/ath5k/debug.c
index 41d5fa3..4c22826 100644
--- a/drivers/net/wireless/ath5k/debug.c
+++ b/drivers/net/wireless/ath5k/debug.c
@@ -488,6 +488,7 @@ ath5k_debug_dump_bands(struct ath5k_softc *sc)
                                        band->channels[i].center_freq,
                                        band->channels[i].hw_value,
                                        band->channels[i].flags);
+
                printk(KERN_DEBUG " rates:\n");
                for (i = 0; i < band->n_bitrates; i++)
                        printk(KERN_DEBUG "  %4d %.4x %.4x %.4x\n",
diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c
index c6d12c5..2f86edf 100644
--- a/drivers/net/wireless/ath5k/hw.c
+++ b/drivers/net/wireless/ath5k/hw.c
@@ -31,13 +31,6 @@
 #include "base.h"
 #include "debug.h"
 
-/* Rate tables */
-static const struct ath5k_rate_table ath5k_rt_11a = AR5K_RATES_11A;
-static const struct ath5k_rate_table ath5k_rt_11b = AR5K_RATES_11B;
-static const struct ath5k_rate_table ath5k_rt_11g = AR5K_RATES_11G;
-static const struct ath5k_rate_table ath5k_rt_turbo = AR5K_RATES_TURBO;
-static const struct ath5k_rate_table ath5k_rt_xr = AR5K_RATES_XR;
-
 /* Prototypes */
 static int ath5k_hw_nic_reset(struct ath5k_hw *, u32);
 static int ath5k_hw_nic_wakeup(struct ath5k_hw *, int, bool);
@@ -535,34 +528,6 @@ static int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int 
flags, bool initial)
 }
 
 /*
- * Get the rate table for a specific operation mode
- */
-const struct ath5k_rate_table *ath5k_hw_get_rate_table(struct ath5k_hw *ah,
-               unsigned int mode)
-{
-       ATH5K_TRACE(ah->ah_sc);
-
-       if (!test_bit(mode, ah->ah_capabilities.cap_mode))
-               return NULL;
-
-       /* Get rate tables */
-       switch (mode) {
-       case AR5K_MODE_11A:
-               return &ath5k_rt_11a;
-       case AR5K_MODE_11A_TURBO:
-               return &ath5k_rt_turbo;
-       case AR5K_MODE_11B:
-               return &ath5k_rt_11b;
-       case AR5K_MODE_11G:
-               return &ath5k_rt_11g;
-       case AR5K_MODE_11G_TURBO:
-               return &ath5k_rt_xr;
-       }
-
-       return NULL;
-}
-
-/*
  * Free the ath5k_hw struct
  */
 void ath5k_hw_detach(struct ath5k_hw *ah)
@@ -650,27 +615,29 @@ static inline void ath5k_hw_write_rate_duration(struct 
ath5k_hw *ah,
        unsigned int mode)
 {
        struct ath5k_softc *sc = ah->ah_sc;
-       const struct ath5k_rate_table *rt;
-       struct ieee80211_rate srate = {};
+       struct ieee80211_rate *rate;
        unsigned int i;
 
-       /* Get rate table for the current operating mode */
-       rt = ath5k_hw_get_rate_table(ah, mode);
-
        /* Write rate duration table */
-       for (i = 0; i < rt->rate_count; i++) {
-               const struct ath5k_rate *rate, *control_rate;
-
+       for (i = 0; i < sc->curband->n_bitrates; i++) {
                u32 reg;
                u16 tx_time;
 
-               rate = &rt->rates[i];
-               control_rate = &rt->rates[rate->control_rate];
+               rate = &sc->curband->bitrates[i];
+/*
+ * @control_rate: index of rate assumed to be used to send control frames.
+ *     This can be used to set override the value on the rate duration
+ *     registers. This is only useful if we can override in the harware at
+ *     what rate we want to send control frames at. Note that IEEE-802.11
+ *     Ch. 9.6 (after IEEE 802.11g changes) defines the rate at which we
+ *     should send ACK/CTS, if we change this value we can be breaking
+ *     the spec.
+ */
+               //TODO get controlrate
+               //printk("rate dur %d %d", rate->bitrate, rate->hw_value );
 
                /* Set ACK timeout */
-               reg = AR5K_RATE_DUR(rate->rate_code);
-
-               srate.bitrate = control_rate->rate_kbps/100;
+               reg = AR5K_RATE_DUR(rate->hw_value);
 
                /* An ACK frame consists of 10 bytes. If you add the FCS,
                 * which ieee80211_generic_frame_duration() adds,
@@ -679,11 +646,11 @@ static inline void ath5k_hw_write_rate_duration(struct 
ath5k_hw *ah,
                 * ieee80211_duration() for a brief description of
                 * what rate we should choose to TX ACKs. */
                tx_time = le16_to_cpu(ieee80211_generic_frame_duration(sc->hw,
-                                                       sc->vif, 10, &srate));
+                                                       sc->vif, 10, rate));
 
                ath5k_hw_reg_write(ah, tx_time, reg);
 
-               if (!HAS_SHPREAMBLE(i))
+               if (!(rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) )
                        continue;
 
                /*

_______________________________________________
ath5k-devel mailing list
ath5k-devel@lists.ath5k.org
https://lists.ath5k.org/mailman/listinfo/ath5k-devel

Reply via email to