|
@@ -672,215 +672,6 @@ static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
|
return rt2800_validate_eeprom(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 = {
|
|
static const struct rt2800_ops rt2800usb_rt2800_ops = {
|
|
.register_read = rt2x00usb_register_read,
|
|
.register_read = rt2x00usb_register_read,
|
|
.register_write = rt2x00usb_register_write,
|
|
.register_write = rt2x00usb_register_write,
|
|
@@ -912,7 +703,7 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
|
|
/*
|
|
/*
|
|
* Initialize hw specifications.
|
|
* Initialize hw specifications.
|
|
*/
|
|
*/
|
|
- retval = rt2800usb_probe_hw_mode(rt2x00dev);
|
|
|
|
|
|
+ retval = rt2800_probe_hw_mode(rt2x00dev);
|
|
if (retval)
|
|
if (retval)
|
|
return retval;
|
|
return retval;
|
|
|
|
|