rt2800: unify rt2800*_probe_hw_mode()
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Sun, 8 Nov 2009 13:39:32 +0000 (14:39 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 11 Nov 2009 22:09:15 +0000 (17:09 -0500)
Add rf_vals tables and rt2800_probe_hw_mode() to rt2800lib.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Acked-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800lib.h
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800usb.c

index 2c211199e569f3edfbe8c6eea39d3a658bca35bc..d7771eaee04960fcf8bb5c8ebd98b27aaa710a47 100644 (file)
@@ -1858,6 +1858,224 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 }
 EXPORT_SYMBOL_GPL(rt2800_init_eeprom);
 
+/*
+ * RF value list for rt28x0
+ * Supports: 2.4 GHz (all) & 5.2 GHz (RF2850 & RF2750)
+ */
+static const struct rf_channel rf_vals[] = {
+       { 1,  0x18402ecc, 0x184c0786, 0x1816b455, 0x1800510b },
+       { 2,  0x18402ecc, 0x184c0786, 0x18168a55, 0x1800519f },
+       { 3,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800518b },
+       { 4,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800519f },
+       { 5,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800518b },
+       { 6,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800519f },
+       { 7,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800518b },
+       { 8,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800519f },
+       { 9,  0x18402ecc, 0x184c0796, 0x18168a55, 0x1800518b },
+       { 10, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800519f },
+       { 11, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800518b },
+       { 12, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800519f },
+       { 13, 0x18402ecc, 0x184c079e, 0x18168a55, 0x1800518b },
+       { 14, 0x18402ecc, 0x184c07a2, 0x18168a55, 0x18005193 },
+
+       /* 802.11 UNI / HyperLan 2 */
+       { 36, 0x18402ecc, 0x184c099a, 0x18158a55, 0x180ed1a3 },
+       { 38, 0x18402ecc, 0x184c099e, 0x18158a55, 0x180ed193 },
+       { 40, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed183 },
+       { 44, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed1a3 },
+       { 46, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed18b },
+       { 48, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed19b },
+       { 52, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed193 },
+       { 54, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed1a3 },
+       { 56, 0x18402ec8, 0x184c068e, 0x18158a55, 0x180ed18b },
+       { 60, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed183 },
+       { 62, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed193 },
+       { 64, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed1a3 },
+
+       /* 802.11 HyperLan 2 */
+       { 100, 0x18402ec8, 0x184c06b2, 0x18178a55, 0x180ed783 },
+       { 102, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed793 },
+       { 104, 0x18402ec8, 0x185c06b2, 0x18578a55, 0x180ed1a3 },
+       { 108, 0x18402ecc, 0x185c0a32, 0x18578a55, 0x180ed193 },
+       { 110, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed183 },
+       { 112, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed19b },
+       { 116, 0x18402ecc, 0x184c0a3a, 0x18178a55, 0x180ed1a3 },
+       { 118, 0x18402ecc, 0x184c0a3e, 0x18178a55, 0x180ed193 },
+       { 120, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed183 },
+       { 124, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed193 },
+       { 126, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed15b },
+       { 128, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed1a3 },
+       { 132, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed18b },
+       { 134, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed193 },
+       { 136, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed19b },
+       { 140, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed183 },
+
+       /* 802.11 UNII */
+       { 149, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed1a7 },
+       { 151, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed187 },
+       { 153, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed18f },
+       { 157, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed19f },
+       { 159, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed1a7 },
+       { 161, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed187 },
+       { 165, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed197 },
+       { 167, 0x18402ec4, 0x184c03d2, 0x18179855, 0x1815531f },
+       { 169, 0x18402ec4, 0x184c03d2, 0x18179855, 0x18155327 },
+       { 171, 0x18402ec4, 0x184c03d6, 0x18179855, 0x18155307 },
+       { 173, 0x18402ec4, 0x184c03d6, 0x18179855, 0x1815530f },
+
+       /* 802.11 Japan */
+       { 184, 0x15002ccc, 0x1500491e, 0x1509be55, 0x150c0a0b },
+       { 188, 0x15002ccc, 0x15004922, 0x1509be55, 0x150c0a13 },
+       { 192, 0x15002ccc, 0x15004926, 0x1509be55, 0x150c0a1b },
+       { 196, 0x15002ccc, 0x1500492a, 0x1509be55, 0x150c0a23 },
+       { 208, 0x15002ccc, 0x1500493a, 0x1509be55, 0x150c0a13 },
+       { 212, 0x15002ccc, 0x1500493e, 0x1509be55, 0x150c0a1b },
+       { 216, 0x15002ccc, 0x15004982, 0x1509be55, 0x150c0a23 },
+};
+
+/*
+ * RF value list for rt3070
+ * Supports: 2.4 GHz
+ */
+static const struct rf_channel rf_vals_3070[] = {
+       {1,  241, 2, 2 },
+       {2,  241, 2, 7 },
+       {3,  242, 2, 2 },
+       {4,  242, 2, 7 },
+       {5,  243, 2, 2 },
+       {6,  243, 2, 7 },
+       {7,  244, 2, 2 },
+       {8,  244, 2, 7 },
+       {9,  245, 2, 2 },
+       {10, 245, 2, 7 },
+       {11, 246, 2, 2 },
+       {12, 246, 2, 7 },
+       {13, 247, 2, 2 },
+       {14, 248, 2, 4 },
+};
+
+int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
+{
+       struct rt2x00_chip *chip = &rt2x00dev->chip;
+       struct hw_mode_spec *spec = &rt2x00dev->spec;
+       struct channel_info *info;
+       char *tx_power1;
+       char *tx_power2;
+       unsigned int i;
+       u16 eeprom;
+
+       /*
+        * Initialize all hw fields.
+        */
+       rt2x00dev->hw->flags =
+           IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
+           IEEE80211_HW_SIGNAL_DBM |
+           IEEE80211_HW_SUPPORTS_PS |
+           IEEE80211_HW_PS_NULLFUNC_STACK;
+
+       if (rt2x00_intf_is_usb(rt2x00dev))
+               rt2x00dev->hw->extra_tx_headroom =
+                       TXINFO_DESC_SIZE + TXWI_DESC_SIZE;
+       else if (rt2x00_intf_is_pci(rt2x00dev))
+               rt2x00dev->hw->extra_tx_headroom = TXWI_DESC_SIZE;
+
+       SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
+       SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
+                               rt2x00_eeprom_addr(rt2x00dev,
+                                                  EEPROM_MAC_ADDR_0));
+
+       rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
+
+       /*
+        * Initialize hw_mode information.
+        */
+       spec->supported_bands = SUPPORT_BAND_2GHZ;
+       spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
+
+       if (rt2x00_rf(chip, RF2820) ||
+           rt2x00_rf(chip, RF2720) ||
+           (rt2x00_intf_is_pci(rt2x00dev) &&
+            (rt2x00_rf(chip, RF3020) ||
+             rt2x00_rf(chip, RF3021) ||
+             rt2x00_rf(chip, RF3022) ||
+             rt2x00_rf(chip, RF2020) ||
+             rt2x00_rf(chip, RF3052)))) {
+               spec->num_channels = 14;
+               spec->channels = rf_vals;
+       } else if (rt2x00_rf(chip, RF2850) ||
+                  rt2x00_rf(chip, RF2750)) {
+               spec->supported_bands |= SUPPORT_BAND_5GHZ;
+               spec->num_channels = ARRAY_SIZE(rf_vals);
+               spec->channels = rf_vals;
+       } else if (rt2x00_intf_is_usb(rt2x00dev) &&
+                   (rt2x00_rf(chip, RF3020) ||
+                    rt2x00_rf(chip, RF2020))) {
+               spec->num_channels = ARRAY_SIZE(rf_vals_3070);
+               spec->channels = rf_vals_3070;
+       }
+
+       /*
+        * Initialize HT information.
+        */
+       spec->ht.ht_supported = true;
+       spec->ht.cap =
+           IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+           IEEE80211_HT_CAP_GRN_FLD |
+           IEEE80211_HT_CAP_SGI_20 |
+           IEEE80211_HT_CAP_SGI_40 |
+           IEEE80211_HT_CAP_TX_STBC |
+           IEEE80211_HT_CAP_RX_STBC |
+           IEEE80211_HT_CAP_PSMP_SUPPORT;
+       spec->ht.ampdu_factor = 3;
+       spec->ht.ampdu_density = 4;
+       spec->ht.mcs.tx_params =
+           IEEE80211_HT_MCS_TX_DEFINED |
+           IEEE80211_HT_MCS_TX_RX_DIFF |
+           ((rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) - 1) <<
+               IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
+
+       switch (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH)) {
+       case 3:
+               spec->ht.mcs.rx_mask[2] = 0xff;
+       case 2:
+               spec->ht.mcs.rx_mask[1] = 0xff;
+       case 1:
+               spec->ht.mcs.rx_mask[0] = 0xff;
+               spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */
+               break;
+       }
+
+       /*
+        * Create channel information array
+        */
+       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       spec->channels_info = info;
+
+       tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
+       tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
+
+       for (i = 0; i < 14; i++) {
+               info[i].tx_power1 = TXPOWER_G_FROM_DEV(tx_power1[i]);
+               info[i].tx_power2 = TXPOWER_G_FROM_DEV(tx_power2[i]);
+       }
+
+       if (spec->num_channels > 14) {
+               tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A1);
+               tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);
+
+               for (i = 14; i < spec->num_channels; i++) {
+                       info[i].tx_power1 = TXPOWER_A_FROM_DEV(tx_power1[i]);
+                       info[i].tx_power2 = TXPOWER_A_FROM_DEV(tx_power2[i]);
+               }
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(rt2800_probe_hw_mode);
+
 /*
  * IEEE80211 stack callback functions.
  */
index da447114c83b18366f7703b7a5f4c5539aaef01d..2aa15f2b2c5d461482c57dbb59962caa5b118a83 100644 (file)
@@ -131,6 +131,7 @@ int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev);
 
 int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev);
 int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev);
+int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev);
 
 extern const struct ieee80211_ops rt2800_mac80211_ops;
 
index c60779069508f76c9b4b9cbd17d1fff400b09e84..e8fe2eabebbdce42d2d7c9f4f9fe5e94b8297969 100644 (file)
@@ -1112,194 +1112,6 @@ static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
        return rt2800_validate_eeprom(rt2x00dev);
 }
 
-/*
- * RF value list for rt2860
- * Supports: 2.4 GHz (all) & 5.2 GHz (RF2850 & RF2750)
- */
-static const struct rf_channel rf_vals[] = {
-       { 1,  0x18402ecc, 0x184c0786, 0x1816b455, 0x1800510b },
-       { 2,  0x18402ecc, 0x184c0786, 0x18168a55, 0x1800519f },
-       { 3,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800518b },
-       { 4,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800519f },
-       { 5,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800518b },
-       { 6,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800519f },
-       { 7,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800518b },
-       { 8,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800519f },
-       { 9,  0x18402ecc, 0x184c0796, 0x18168a55, 0x1800518b },
-       { 10, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800519f },
-       { 11, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800518b },
-       { 12, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800519f },
-       { 13, 0x18402ecc, 0x184c079e, 0x18168a55, 0x1800518b },
-       { 14, 0x18402ecc, 0x184c07a2, 0x18168a55, 0x18005193 },
-
-       /* 802.11 UNI / HyperLan 2 */
-       { 36, 0x18402ecc, 0x184c099a, 0x18158a55, 0x180ed1a3 },
-       { 38, 0x18402ecc, 0x184c099e, 0x18158a55, 0x180ed193 },
-       { 40, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed183 },
-       { 44, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed1a3 },
-       { 46, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed18b },
-       { 48, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed19b },
-       { 52, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed193 },
-       { 54, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed1a3 },
-       { 56, 0x18402ec8, 0x184c068e, 0x18158a55, 0x180ed18b },
-       { 60, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed183 },
-       { 62, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed193 },
-       { 64, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed1a3 },
-
-       /* 802.11 HyperLan 2 */
-       { 100, 0x18402ec8, 0x184c06b2, 0x18178a55, 0x180ed783 },
-       { 102, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed793 },
-       { 104, 0x18402ec8, 0x185c06b2, 0x18578a55, 0x180ed1a3 },
-       { 108, 0x18402ecc, 0x185c0a32, 0x18578a55, 0x180ed193 },
-       { 110, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed183 },
-       { 112, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed19b },
-       { 116, 0x18402ecc, 0x184c0a3a, 0x18178a55, 0x180ed1a3 },
-       { 118, 0x18402ecc, 0x184c0a3e, 0x18178a55, 0x180ed193 },
-       { 120, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed183 },
-       { 124, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed193 },
-       { 126, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed15b },
-       { 128, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed1a3 },
-       { 132, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed18b },
-       { 134, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed193 },
-       { 136, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed19b },
-       { 140, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed183 },
-
-       /* 802.11 UNII */
-       { 149, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed1a7 },
-       { 151, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed187 },
-       { 153, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed18f },
-       { 157, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed19f },
-       { 159, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed1a7 },
-       { 161, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed187 },
-       { 165, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed197 },
-       { 167, 0x18402ec4, 0x184c03d2, 0x18179855, 0x1815531f },
-       { 169, 0x18402ec4, 0x184c03d2, 0x18179855, 0x18155327 },
-       { 171, 0x18402ec4, 0x184c03d6, 0x18179855, 0x18155307 },
-       { 173, 0x18402ec4, 0x184c03d6, 0x18179855, 0x1815530f },
-
-       /* 802.11 Japan */
-       { 184, 0x15002ccc, 0x1500491e, 0x1509be55, 0x150c0a0b },
-       { 188, 0x15002ccc, 0x15004922, 0x1509be55, 0x150c0a13 },
-       { 192, 0x15002ccc, 0x15004926, 0x1509be55, 0x150c0a1b },
-       { 196, 0x15002ccc, 0x1500492a, 0x1509be55, 0x150c0a23 },
-       { 208, 0x15002ccc, 0x1500493a, 0x1509be55, 0x150c0a13 },
-       { 212, 0x15002ccc, 0x1500493e, 0x1509be55, 0x150c0a1b },
-       { 216, 0x15002ccc, 0x15004982, 0x1509be55, 0x150c0a23 },
-};
-
-static int rt2800pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
-{
-       struct rt2x00_chip *chip = &rt2x00dev->chip;
-       struct hw_mode_spec *spec = &rt2x00dev->spec;
-       struct channel_info *info;
-       char *tx_power1;
-       char *tx_power2;
-       unsigned int i;
-       u16 eeprom;
-
-       /*
-        * Initialize all hw fields.
-        */
-       rt2x00dev->hw->flags =
-           IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-           IEEE80211_HW_SIGNAL_DBM |
-           IEEE80211_HW_SUPPORTS_PS |
-           IEEE80211_HW_PS_NULLFUNC_STACK;
-
-       if (rt2x00_intf_is_pci(rt2x00dev))
-               rt2x00dev->hw->extra_tx_headroom = TXWI_DESC_SIZE;
-
-       SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
-       SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
-                               rt2x00_eeprom_addr(rt2x00dev,
-                                                  EEPROM_MAC_ADDR_0));
-
-       rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
-
-       /*
-        * Initialize hw_mode information.
-        */
-       spec->supported_bands = SUPPORT_BAND_2GHZ;
-       spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
-
-       if (rt2x00_rf(chip, RF2820) ||
-           rt2x00_rf(chip, RF2720) ||
-           (rt2x00_intf_is_pci(rt2x00dev) &&
-            (rt2x00_rf(chip, RF3020) ||
-             rt2x00_rf(chip, RF3021) ||
-             rt2x00_rf(chip, RF3022) ||
-             rt2x00_rf(chip, RF2020) ||
-             rt2x00_rf(chip, RF3052)))) {
-               spec->num_channels = 14;
-               spec->channels = rf_vals;
-       } else if (rt2x00_rf(chip, RF2850) ||
-                  rt2x00_rf(chip, RF2750)) {
-               spec->supported_bands |= SUPPORT_BAND_5GHZ;
-               spec->num_channels = ARRAY_SIZE(rf_vals);
-               spec->channels = rf_vals;
-       }
-
-       /*
-        * Initialize HT information.
-        */
-       spec->ht.ht_supported = true;
-       spec->ht.cap =
-           IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
-           IEEE80211_HT_CAP_GRN_FLD |
-           IEEE80211_HT_CAP_SGI_20 |
-           IEEE80211_HT_CAP_SGI_40 |
-           IEEE80211_HT_CAP_TX_STBC |
-           IEEE80211_HT_CAP_RX_STBC |
-           IEEE80211_HT_CAP_PSMP_SUPPORT;
-       spec->ht.ampdu_factor = 3;
-       spec->ht.ampdu_density = 4;
-       spec->ht.mcs.tx_params =
-           IEEE80211_HT_MCS_TX_DEFINED |
-           IEEE80211_HT_MCS_TX_RX_DIFF |
-           ((rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) - 1) <<
-               IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
-
-       switch (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH)) {
-       case 3:
-               spec->ht.mcs.rx_mask[2] = 0xff;
-       case 2:
-               spec->ht.mcs.rx_mask[1] = 0xff;
-       case 1:
-               spec->ht.mcs.rx_mask[0] = 0xff;
-               spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */
-               break;
-       }
-
-       /*
-        * Create channel information array
-        */
-       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
-       if (!info)
-               return -ENOMEM;
-
-       spec->channels_info = info;
-
-       tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
-       tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
-
-       for (i = 0; i < 14; i++) {
-               info[i].tx_power1 = TXPOWER_G_FROM_DEV(tx_power1[i]);
-               info[i].tx_power2 = TXPOWER_G_FROM_DEV(tx_power2[i]);
-       }
-
-       if (spec->num_channels > 14) {
-               tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A1);
-               tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);
-
-               for (i = 14; i < spec->num_channels; i++) {
-                       info[i].tx_power1 = TXPOWER_A_FROM_DEV(tx_power1[i]);
-                       info[i].tx_power2 = TXPOWER_A_FROM_DEV(tx_power2[i]);
-               }
-       }
-
-       return 0;
-}
-
 static const struct rt2800_ops rt2800pci_rt2800_ops = {
        .register_read          = rt2x00pci_register_read,
        .register_write         = rt2x00pci_register_write,
@@ -1331,7 +1143,7 @@ static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev)
        /*
         * Initialize hw specifications.
         */
-       retval = rt2800pci_probe_hw_mode(rt2x00dev);
+       retval = rt2800_probe_hw_mode(rt2x00dev);
        if (retval)
                return retval;
 
index e86858a0e196722058a0091f9c1c471fa490457c..67bae36ecddf70d7a9d5fcc7cff61f96905ddf2b 100644 (file)
@@ -672,215 +672,6 @@ static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
        return rt2800_validate_eeprom(rt2x00dev);
 }
 
-/*
- * RF value list for rt2870
- * Supports: 2.4 GHz (all) & 5.2 GHz (RF2850 & RF2750)
- */
-static const struct rf_channel rf_vals[] = {
-       { 1,  0x18402ecc, 0x184c0786, 0x1816b455, 0x1800510b },
-       { 2,  0x18402ecc, 0x184c0786, 0x18168a55, 0x1800519f },
-       { 3,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800518b },
-       { 4,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800519f },
-       { 5,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800518b },
-       { 6,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800519f },
-       { 7,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800518b },
-       { 8,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800519f },
-       { 9,  0x18402ecc, 0x184c0796, 0x18168a55, 0x1800518b },
-       { 10, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800519f },
-       { 11, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800518b },
-       { 12, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800519f },
-       { 13, 0x18402ecc, 0x184c079e, 0x18168a55, 0x1800518b },
-       { 14, 0x18402ecc, 0x184c07a2, 0x18168a55, 0x18005193 },
-
-       /* 802.11 UNI / HyperLan 2 */
-       { 36, 0x18402ecc, 0x184c099a, 0x18158a55, 0x180ed1a3 },
-       { 38, 0x18402ecc, 0x184c099e, 0x18158a55, 0x180ed193 },
-       { 40, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed183 },
-       { 44, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed1a3 },
-       { 46, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed18b },
-       { 48, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed19b },
-       { 52, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed193 },
-       { 54, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed1a3 },
-       { 56, 0x18402ec8, 0x184c068e, 0x18158a55, 0x180ed18b },
-       { 60, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed183 },
-       { 62, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed193 },
-       { 64, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed1a3 },
-
-       /* 802.11 HyperLan 2 */
-       { 100, 0x18402ec8, 0x184c06b2, 0x18178a55, 0x180ed783 },
-       { 102, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed793 },
-       { 104, 0x18402ec8, 0x185c06b2, 0x18578a55, 0x180ed1a3 },
-       { 108, 0x18402ecc, 0x185c0a32, 0x18578a55, 0x180ed193 },
-       { 110, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed183 },
-       { 112, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed19b },
-       { 116, 0x18402ecc, 0x184c0a3a, 0x18178a55, 0x180ed1a3 },
-       { 118, 0x18402ecc, 0x184c0a3e, 0x18178a55, 0x180ed193 },
-       { 120, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed183 },
-       { 124, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed193 },
-       { 126, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed15b },
-       { 128, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed1a3 },
-       { 132, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed18b },
-       { 134, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed193 },
-       { 136, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed19b },
-       { 140, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed183 },
-
-       /* 802.11 UNII */
-       { 149, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed1a7 },
-       { 151, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed187 },
-       { 153, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed18f },
-       { 157, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed19f },
-       { 159, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed1a7 },
-       { 161, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed187 },
-       { 165, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed197 },
-       { 167, 0x18402ec4, 0x184c03d2, 0x18179855, 0x1815531f },
-       { 169, 0x18402ec4, 0x184c03d2, 0x18179855, 0x18155327 },
-       { 171, 0x18402ec4, 0x184c03d6, 0x18179855, 0x18155307 },
-       { 173, 0x18402ec4, 0x184c03d6, 0x18179855, 0x1815530f },
-
-       /* 802.11 Japan */
-       { 184, 0x15002ccc, 0x1500491e, 0x1509be55, 0x150c0a0b },
-       { 188, 0x15002ccc, 0x15004922, 0x1509be55, 0x150c0a13 },
-       { 192, 0x15002ccc, 0x15004926, 0x1509be55, 0x150c0a1b },
-       { 196, 0x15002ccc, 0x1500492a, 0x1509be55, 0x150c0a23 },
-       { 208, 0x15002ccc, 0x1500493a, 0x1509be55, 0x150c0a13 },
-       { 212, 0x15002ccc, 0x1500493e, 0x1509be55, 0x150c0a1b },
-       { 216, 0x15002ccc, 0x15004982, 0x1509be55, 0x150c0a23 },
-};
-
-/*
- * RF value list for rt3070
- * Supports: 2.4 GHz
- */
-static const struct rf_channel rf_vals_3070[] = {
-       {1,  241, 2, 2 },
-       {2,  241, 2, 7 },
-       {3,  242, 2, 2 },
-       {4,  242, 2, 7 },
-       {5,  243, 2, 2 },
-       {6,  243, 2, 7 },
-       {7,  244, 2, 2 },
-       {8,  244, 2, 7 },
-       {9,  245, 2, 2 },
-       {10, 245, 2, 7 },
-       {11, 246, 2, 2 },
-       {12, 246, 2, 7 },
-       {13, 247, 2, 2 },
-       {14, 248, 2, 4 },
-};
-
-static int rt2800usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
-{
-       struct rt2x00_chip *chip = &rt2x00dev->chip;
-       struct hw_mode_spec *spec = &rt2x00dev->spec;
-       struct channel_info *info;
-       char *tx_power1;
-       char *tx_power2;
-       unsigned int i;
-       u16 eeprom;
-
-       /*
-        * Initialize all hw fields.
-        */
-       rt2x00dev->hw->flags =
-           IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
-           IEEE80211_HW_SIGNAL_DBM |
-           IEEE80211_HW_SUPPORTS_PS |
-           IEEE80211_HW_PS_NULLFUNC_STACK;
-
-       if (rt2x00_intf_is_usb(rt2x00dev))
-               rt2x00dev->hw->extra_tx_headroom =
-                       TXINFO_DESC_SIZE + TXWI_DESC_SIZE;
-
-       SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
-       SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
-                               rt2x00_eeprom_addr(rt2x00dev,
-                                                  EEPROM_MAC_ADDR_0));
-
-       rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
-
-       /*
-        * Initialize hw_mode information.
-        */
-       spec->supported_bands = SUPPORT_BAND_2GHZ;
-       spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
-
-       if (rt2x00_rf(chip, RF2820) ||
-           rt2x00_rf(chip, RF2720)) {
-               spec->num_channels = 14;
-               spec->channels = rf_vals;
-       } else if (rt2x00_rf(chip, RF2850) ||
-                  rt2x00_rf(chip, RF2750)) {
-               spec->supported_bands |= SUPPORT_BAND_5GHZ;
-               spec->num_channels = ARRAY_SIZE(rf_vals);
-               spec->channels = rf_vals;
-       } else if (rt2x00_intf_is_usb(rt2x00dev) &&
-                   (rt2x00_rf(chip, RF3020) ||
-                    rt2x00_rf(chip, RF2020))) {
-               spec->num_channels = ARRAY_SIZE(rf_vals_3070);
-               spec->channels = rf_vals_3070;
-       }
-
-       /*
-        * Initialize HT information.
-        */
-       spec->ht.ht_supported = true;
-       spec->ht.cap =
-           IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
-           IEEE80211_HT_CAP_GRN_FLD |
-           IEEE80211_HT_CAP_SGI_20 |
-           IEEE80211_HT_CAP_SGI_40 |
-           IEEE80211_HT_CAP_TX_STBC |
-           IEEE80211_HT_CAP_RX_STBC |
-           IEEE80211_HT_CAP_PSMP_SUPPORT;
-       spec->ht.ampdu_factor = 3;
-       spec->ht.ampdu_density = 4;
-       spec->ht.mcs.tx_params =
-           IEEE80211_HT_MCS_TX_DEFINED |
-           IEEE80211_HT_MCS_TX_RX_DIFF |
-           ((rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TXPATH) - 1) <<
-               IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
-
-       switch (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RXPATH)) {
-       case 3:
-               spec->ht.mcs.rx_mask[2] = 0xff;
-       case 2:
-               spec->ht.mcs.rx_mask[1] = 0xff;
-       case 1:
-               spec->ht.mcs.rx_mask[0] = 0xff;
-               spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */
-               break;
-       }
-
-       /*
-        * Create channel information array
-        */
-       info = kzalloc(spec->num_channels * sizeof(*info), GFP_KERNEL);
-       if (!info)
-               return -ENOMEM;
-
-       spec->channels_info = info;
-
-       tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
-       tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
-
-       for (i = 0; i < 14; i++) {
-               info[i].tx_power1 = TXPOWER_G_FROM_DEV(tx_power1[i]);
-               info[i].tx_power2 = TXPOWER_G_FROM_DEV(tx_power2[i]);
-       }
-
-       if (spec->num_channels > 14) {
-               tx_power1 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A1);
-               tx_power2 = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A2);
-
-               for (i = 14; i < spec->num_channels; i++) {
-                       info[i].tx_power1 = TXPOWER_A_FROM_DEV(tx_power1[i]);
-                       info[i].tx_power2 = TXPOWER_A_FROM_DEV(tx_power2[i]);
-               }
-       }
-
-       return 0;
-}
-
 static const struct rt2800_ops rt2800usb_rt2800_ops = {
        .register_read          = rt2x00usb_register_read,
        .register_write         = rt2x00usb_register_write,
@@ -912,7 +703,7 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
        /*
         * Initialize hw specifications.
         */
-       retval = rt2800usb_probe_hw_mode(rt2x00dev);
+       retval = rt2800_probe_hw_mode(rt2x00dev);
        if (retval)
                return retval;