#define IEEE80211_RATE_SUPPORTED 0x00000010
 #define IEEE80211_RATE_OFDM 0x00000020
 #define IEEE80211_RATE_CCK 0x00000040
-#define IEEE80211_RATE_TURBO 0x00000080
 #define IEEE80211_RATE_MANDATORY 0x00000100
 
 #define IEEE80211_RATE_CCK_2 (IEEE80211_RATE_CCK | IEEE80211_RATE_PREAMBLE2)
 #define IEEE80211_RATE_MODULATION(f) \
        (f & (IEEE80211_RATE_CCK | IEEE80211_RATE_OFDM))
 
-/* Low-level driver should set PREAMBLE2, OFDM, CCK, and TURBO flags.
+/* Low-level driver should set PREAMBLE2, OFDM and CCK flags.
  * BASIC, SUPPORTED, ERP, and MANDATORY flags are set in 80211.o based on the
  * configuration. */
 struct ieee80211_rate {
 
 /* 802.11g is backwards-compatible with 802.11b, so a wlan card can
  * actually be both in 11b and 11g modes at the same time. */
-enum {
+enum ieee80211_phymode {
        MODE_IEEE80211A, /* IEEE 802.11a */
        MODE_IEEE80211B, /* IEEE 802.11b only */
-       MODE_ATHEROS_TURBO, /* Atheros Turbo mode (2x.11a at 5 GHz) */
        MODE_IEEE80211G, /* IEEE 802.11g (and 802.11b compatibility) */
-       MODE_ATHEROS_TURBOG, /* Atheros Turbo mode (2x.11g at 2.4 GHz) */
 
        /* keep last */
        NUM_IEEE80211_MODES
 
                return "IEEE 802.11b";
        case MODE_IEEE80211G:
                return "IEEE 802.11g";
-       case MODE_ATHEROS_TURBO:
-               return "Atheros Turbo (5 GHz)";
        default:
                return "UNKNOWN";
        }
 
                case MODE_IEEE80211G:
                        fi->phytype = htonl(ieee80211_phytype_pbcc_dot11_g);
                        break;
-               case MODE_ATHEROS_TURBO:
-                       fi->phytype =
-                               htonl(ieee80211_phytype_dsss_dot11_turbo);
-                       break;
                default:
                        fi->phytype = htonl(0xAAAAAAAA);
                        break;
        local->long_retry_limit = 4;
        local->hw.conf.radio_enabled = 1;
 
-       local->enabled_modes = (unsigned int) -1;
+       local->enabled_modes = ~0;
 
        INIT_LIST_HEAD(&local->modes_list);
 
 
        ieee80211_phytype_ofdm_dot11_g   = 6,
        ieee80211_phytype_pbcc_dot11_g   = 7,
        ieee80211_phytype_ofdm_dot11_a   = 8,
-       ieee80211_phytype_dsss_dot11_turbog = 255,
-       ieee80211_phytype_dsss_dot11_turbo = 256,
 };
 
 enum ieee80211_ssi_type {
 
 #include "wpa.h"
 #include "aes_ccm.h"
 
+
+/*
+ * Wow. This ioctl interface is such crap, it's tied
+ * to internal definitions. I hope it dies soon.
+ */
+static int mode_to_hostapd_mode(enum ieee80211_phymode mode)
+{
+       switch (mode) {
+       case MODE_IEEE80211A:
+               return 0;
+       case MODE_IEEE80211B:
+               return 1;
+       case MODE_IEEE80211G:
+               return 3;
+       case NUM_IEEE80211_MODES:
+               WARN_ON(1);
+               break;
+       }
+       WARN_ON(1);
+       return -1;
+}
+
+static enum ieee80211_phymode hostapd_mode_to_mode(int hostapd_mode)
+{
+       switch (hostapd_mode) {
+       case 0:
+               return MODE_IEEE80211A;
+       case 1:
+               return MODE_IEEE80211B;
+       case 3:
+               return MODE_IEEE80211G;
+       }
+       return NUM_IEEE80211_MODES;
+}
+
 static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr,
                                    int idx, int alg, int set_tx_key,
                                    const u8 *_key, size_t key_len)
        case MODE_IEEE80211G:
                strcpy(name, "IEEE 802.11g");
                break;
-       case MODE_ATHEROS_TURBO:
-               strcpy(name, "5GHz Turbo");
-               break;
        default:
                strcpy(name, "IEEE 802.11");
                break;
                struct ieee80211_rate *rates = &mode->rates[i];
                int this_rate = rates->rate;
 
-               if (mode->mode == MODE_ATHEROS_TURBO ||
-                   mode->mode == MODE_ATHEROS_TURBOG)
-                       this_rate *= 2;
                if (target_rate == this_rate) {
                        sdata->bss->max_ratectrl_rateidx = i;
                        if (rate->fixed)
        int param = *i;
        int value = *(i + 1);
        int ret = 0;
+       int mode;
 
        if (!capable(CAP_NET_ADMIN))
                return -EPERM;
                break;
 
        case PRISM2_PARAM_NEXT_MODE:
-               local->next_mode = value;
+               local->next_mode = hostapd_mode_to_mode(value);
                break;
 
        case PRISM2_PARAM_KEY_TX_RX_THRESHOLD:
                break;
 
        case PRISM2_PARAM_HW_MODES:
-               local->enabled_modes = value;
+               mode = 1;
+               local->enabled_modes = 0;
+               while (value) {
+                       if (value & 1)
+                               local->enabled_modes |=
+                                       hostapd_mode_to_mode(mode);
+                       mode <<= 1;
+                       value >>= 1;
+               }
                break;
 
        case PRISM2_PARAM_CREATE_IBSS:
        struct ieee80211_sub_if_data *sdata;
        int *param = (int *) extra;
        int ret = 0;
+       int mode;
 
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
                break;
 
        case PRISM2_PARAM_HW_MODES:
-               *param = local->enabled_modes;
+               mode = 0;
+               *param = 0;
+               while (mode < NUM_IEEE80211_MODES) {
+                       if (local->enabled_modes & (1<<mode))
+                               *param |= mode_to_hostapd_mode(1<<mode);
+                       mode++;
+               }
                break;
 
        case PRISM2_PARAM_CREATE_IBSS:
 
        *pos++ = len;
        for (i = 0; i < len; i++) {
                int rate = mode->rates[i].rate;
-               if (mode->mode == MODE_ATHEROS_TURBO)
-                       rate /= 2;
                *pos++ = (u8) (rate / 5);
        }
 
                *pos++ = mode->num_rates - len;
                for (i = len; i < mode->num_rates; i++) {
                        int rate = mode->rates[i].rate;
-                       if (mode->mode == MODE_ATHEROS_TURBO)
-                               rate /= 2;
                        *pos++ = (u8) (rate / 5);
                }
        }
                        pos = skb_put(skb, 1);
                        supp_rates[1]++;
                }
-               if (mode->mode == MODE_ATHEROS_TURBO)
-                       *pos = rate->rate / 10;
-               else
-                       *pos = rate->rate / 5;
+               *pos = rate->rate / 5;
        }
 
        ieee80211_sta_tx(dev, skb, 0);
        mode = local->oper_hw_mode;
        for (i = 0; i < elems.supp_rates_len; i++) {
                int rate = (elems.supp_rates[i] & 0x7f) * 5;
-               if (mode->mode == MODE_ATHEROS_TURBO)
-                       rate *= 2;
                for (j = 0; j < mode->num_rates; j++)
                        if (mode->rates[j].rate == rate)
                                rates |= BIT(j);
        }
        for (i = 0; i < elems.ext_supp_rates_len; i++) {
                int rate = (elems.ext_supp_rates[i] & 0x7f) * 5;
-               if (mode->mode == MODE_ATHEROS_TURBO)
-                       rate *= 2;
                for (j = 0; j < mode->num_rates; j++)
                        if (mode->rates[j].rate == rate)
                                rates |= BIT(j);
                                rate = elems.ext_supp_rates
                                        [i - elems.supp_rates_len];
                        own_rate = 5 * (rate & 0x7f);
-                       if (mode->mode == MODE_ATHEROS_TURBO)
-                               own_rate *= 2;
                        for (j = 0; j < num_rates; j++)
                                if (rates[j].rate == own_rate)
                                        supp_rates |= BIT(j);
                mode = local->oper_hw_mode;
                for (i = 0; i < bss->supp_rates_len; i++) {
                        int bitrate = (bss->supp_rates[i] & 0x7f) * 5;
-                       if (mode->mode == MODE_ATHEROS_TURBO)
-                               bitrate *= 2;
                        for (j = 0; j < mode->num_rates; j++)
                                if (mode->rates[j].rate == bitrate)
                                        rates |= BIT(j);
        pos = bss->supp_rates;
        for (i = 0; i < mode->num_rates; i++) {
                int rate = mode->rates[i].rate;
-               if (mode->mode == MODE_ATHEROS_TURBO)
-                       rate /= 2;
                *pos++ = (u8) (rate / 5);
        }
 
 
 
        chan->flag = 0;
 
-       if (ieee80211_regdom == 64 &&
-           (mode == MODE_ATHEROS_TURBO || mode == MODE_ATHEROS_TURBOG)) {
-               /* Do not allow Turbo modes in Japan. */
-               return;
-       }
-
        for (i = 0; channel_range[i].start_freq; i++) {
                const struct ieee80211_channel_range *r = &channel_range[i];
                if (r->start_freq <= chan->freq && r->end_freq >= chan->freq) {
 
         * 1 usec = 1/8 * (1080 / 10) = 13.5 */
 
        if (mode->mode == MODE_IEEE80211A ||
-           mode->mode == MODE_ATHEROS_TURBO ||
-           mode->mode == MODE_ATHEROS_TURBOG ||
            (mode->mode == MODE_IEEE80211G &&
             rate->flags & IEEE80211_RATE_ERP))
                hdrtime = CHAN_UTIL_HDR_SHORT;
 
         * 1 usec = 1/8 * (1080 / 10) = 13.5 */
 
        if (mode->mode == MODE_IEEE80211A ||
-           mode->mode == MODE_ATHEROS_TURBO ||
-           mode->mode == MODE_ATHEROS_TURBOG ||
            (mode->mode == MODE_IEEE80211G &&
             tx->u.tx.rate->flags & IEEE80211_RATE_ERP))
                hdrtime = CHAN_UTIL_HDR_SHORT;
 
                        if (rate->rate == 10 || rate->rate == 20)
                                rate->flags |= IEEE80211_RATE_BASIC;
                        break;
-               case MODE_ATHEROS_TURBO:
-                       if (rate->rate == 120 || rate->rate == 240 ||
-                           rate->rate == 480)
-                               rate->flags |= IEEE80211_RATE_BASIC;
-                       break;
                case MODE_IEEE80211G:
                        if (rate->rate == 10 || rate->rate == 20 ||
                            rate->rate == 55 || rate->rate == 110)
                        if (rate->rate == 10)
                                rate->flags |= IEEE80211_RATE_MANDATORY;
                        break;
-               case MODE_ATHEROS_TURBO:
-                       break;
                case MODE_IEEE80211G:
                        if (rate->rate == 10 || rate->rate == 20 ||
                            rate->rate == 55 || rate->rate == 110 ||
         * DIV_ROUND_UP() operations.
         */
 
-       if (local->hw.conf.phymode == MODE_IEEE80211A || erp ||
-           local->hw.conf.phymode == MODE_ATHEROS_TURBO) {
+       if (local->hw.conf.phymode == MODE_IEEE80211A || erp) {
                /*
                 * OFDM:
                 *
                 * 802.11g - 19.8.4: aSIFSTime = 10 usec +
                 *      signal ext = 6 usec
                 */
-               /* FIX: Atheros Turbo may have different (shorter) duration? */
                dur = 16; /* SIFS + signal ext */
                dur += 16; /* 17.3.2.3: T_PREAMBLE = 16 usec */
                dur += 4; /* 17.3.2.3: T_SIGNAL = 4 usec */