static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev) { u32 reg; u16 value; u16 eeprom; /* * Read EEPROM word for configuration. */ rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom); /* * Identify RF chipset. */ value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE); rt2x00pci_register_read(rt2x00dev, CSR0, ®); rt2x00_set_chip(rt2x00dev, RT2460, value, reg); if (!rt2x00_rf(&rt2x00dev->chip, RF2420) && !rt2x00_rf(&rt2x00dev->chip, RF2421)) { ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); return -ENODEV; } /* * Identify default antenna configuration. */ rt2x00dev->hw->conf.antenna_sel_tx = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TX_DEFAULT); rt2x00dev->hw->conf.antenna_sel_rx = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_DEFAULT); /* * Store led mode, for correct led behaviour. */ rt2x00dev->led_mode = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE); /* * Detect if this device has an hardware controlled radio. */ #ifdef CONFIG_RT2400PCI_RFKILL if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); #endif /* CONFIG_RT2400PCI_RFKILL */ /* * Check if the BBP tuning should be enabled. */ if (!rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_AGCVGC_TUNING)) __set_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags); return 0; }
int rt2x00_dev_probe(struct _rt2x00_device * device, struct _rt2x00_config * config, void * priv) { struct pci_dev *pci_dev = (struct pci_dev*)priv; struct _rt2x00_pci *rt2x00pci = rt2x00_priv(device); memset(rt2x00pci, 0x00, sizeof(*rt2x00pci)); if(unlikely(!pci_dev)){ ERROR("invalid priv pointer.\n"); return -ENODEV; } rt2x00pci->pci_dev = pci_dev; rt2x00pci->rx.data_addr = NULL; rt2x00pci->tx.data_addr = NULL; rt2x00pci->csr_addr = ioremap(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); if(!rt2x00pci->csr_addr){ ERROR("ioremap failed.\n"); return -ENOMEM; } rt2x00_init_eeprom(rt2x00pci, config); rt2x00_dev_read_mac(rt2x00pci, device->rtnet_dev); set_bit(DEVICE_CAP_802_11B, &device->flags); set_bit(DEVICE_CAP_802_11G, &device->flags); if(rt2x00_rf(&rt2x00pci->chip, RF5222)) set_bit(DEVICE_CAP_802_11A, &device->flags); return 0; }
static void rt2400pci_config_channel(struct rt2x00_dev *rt2x00dev, struct rf_channel *rf) { rt2x00_set_field32(&rf->rf1, RF1_TUNER, 1); rt2x00_set_field32(&rf->rf3, RF3_TUNER, 1); rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 2, rf->rf2); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); if (rt2x00_rf(rt2x00dev, RF2420)) return; rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 2, 0x000c2a32); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); msleep(1); rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 2, rf->rf2); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); msleep(1); rt2x00_set_field32(&rf->rf1, RF1_TUNER, 0); rt2x00_set_field32(&rf->rf3, RF3_TUNER, 0); rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); rt2x00pci_register_read(rt2x00dev, CNT0, &rf->rf1); }
static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev) { u32 reg; u16 value; u16 eeprom; rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom); value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE); rt2x00pci_register_read(rt2x00dev, CSR0, ®); rt2x00_set_chip(rt2x00dev, RT2460, value, rt2x00_get_field32(reg, CSR0_REVISION)); if (!rt2x00_rf(rt2x00dev, RF2420) && !rt2x00_rf(rt2x00dev, RF2421)) { ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); return -ENODEV; } rt2x00dev->default_ant.tx = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TX_DEFAULT); rt2x00dev->default_ant.rx = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_DEFAULT); if (rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY) rt2x00dev->default_ant.tx = ANTENNA_HW_DIVERSITY; if (rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY) rt2x00dev->default_ant.rx = ANTENNA_HW_DIVERSITY; #ifdef CONFIG_RT2X00_LIB_LEDS value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE); rt2400pci_init_led(rt2x00dev, &rt2x00dev->led_radio, LED_TYPE_RADIO); if (value == LED_MODE_TXRX_ACTIVITY || value == LED_MODE_DEFAULT || value == LED_MODE_ASUS) rt2400pci_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_ACTIVITY); #endif if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) __set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags); if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_AGCVGC_TUNING)) __set_bit(CAPABILITY_LINK_TUNING, &rt2x00dev->cap_flags); return 0; }
static void rt2400pci_config_channel(struct rt2x00_dev *rt2x00dev, struct rf_channel *rf) { /* * Switch on tuning bits. */ rt2x00_set_field32(&rf->rf1, RF1_TUNER, 1); rt2x00_set_field32(&rf->rf3, RF3_TUNER, 1); rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 2, rf->rf2); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); /* * RF2420 chipset don't need any additional actions. */ if (rt2x00_rf(rt2x00dev, RF2420)) return; /* * For the RT2421 chipsets we need to write an invalid * reference clock rate to activate auto_tune. * After that we set the value back to the correct channel. */ rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 2, 0x000c2a32); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); msleep(1); rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 2, rf->rf2); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); msleep(1); /* * Switch off tuning bits. */ rt2x00_set_field32(&rf->rf1, RF1_TUNER, 0); rt2x00_set_field32(&rf->rf3, RF3_TUNER, 0); rt2400pci_rf_write(rt2x00dev, 1, rf->rf1); rt2400pci_rf_write(rt2x00dev, 3, rf->rf3); /* * Clear false CRC during channel switch. */ rt2x00pci_register_read(rt2x00dev, CNT0, &rf->rf1); }
static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev) { u32 reg; u16 value; u16 eeprom; /* * Read EEPROM word for configuration. */ rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom); /* * Identify RF chipset. */ value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE); rt2x00pci_register_read(rt2x00dev, CSR0, ®); rt2x00_set_chip(rt2x00dev, RT2460, value, rt2x00_get_field32(reg, CSR0_REVISION)); if (!rt2x00_rf(rt2x00dev, RF2420) && !rt2x00_rf(rt2x00dev, RF2421)) { ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); return -ENODEV; } /* * Identify default antenna configuration. */ rt2x00dev->default_ant.tx = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_TX_DEFAULT); rt2x00dev->default_ant.rx = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_DEFAULT); /* * When the eeprom indicates SW_DIVERSITY use HW_DIVERSITY instead. * I am not 100% sure about this, but the legacy drivers do not * indicate antenna swapping in software is required when * diversity is enabled. */ if (rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY) rt2x00dev->default_ant.tx = ANTENNA_HW_DIVERSITY; if (rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY) rt2x00dev->default_ant.rx = ANTENNA_HW_DIVERSITY; /* * Store led mode, for correct led behaviour. */ #ifdef CONFIG_RT2X00_LIB_LEDS value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_LED_MODE); rt2400pci_init_led(rt2x00dev, &rt2x00dev->led_radio, LED_TYPE_RADIO); if (value == LED_MODE_TXRX_ACTIVITY || value == LED_MODE_DEFAULT || value == LED_MODE_ASUS) rt2400pci_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_ACTIVITY); #endif /* CONFIG_RT2X00_LIB_LEDS */ /* * Detect if this device has an hardware controlled radio. */ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) __set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags); /* * Check if the BBP tuning should be enabled. */ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RX_AGCVGC_TUNING)) __set_bit(DRIVER_SUPPORT_LINK_TUNING, &rt2x00dev->flags); return 0; }
static void rt2x00_dev_update_channel(struct _rt2x00_pci *rt2x00pci, struct _rt2x00_config *config) { u8 txpower = rt2x00_get_txpower(&rt2x00pci->chip, config->txpower); u32 reg = 0x00000000; if(rt2x00_get_rf_value(&rt2x00pci->chip, config->channel, &rt2x00pci->channel)){ ERROR("RF values for chip %04x and channel %d not found.\n", rt2x00_get_rf(&rt2x00pci->chip), config->channel); return; } /* * Set TXpower. */ rt2x00_set_field32(&rt2x00pci->channel.rf3, RF3_TXPOWER, txpower); /* * For RT2525 we should first set the channel to half band higher. */ if(rt2x00_rf(&rt2x00pci->chip, RF2525)){ rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf1); rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf2 + cpu_to_le32(0x00000020)); rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf3); if(rt2x00pci->channel.rf4) rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf4); } rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf1); rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf2); rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf3); if(rt2x00pci->channel.rf4) rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf4); /* * Channel 14 requires the Japan filter bit to be set. */ rt2x00_bbp_regwrite(rt2x00pci, 70, (config->channel == 14) ? 0x4e : 0x46); msleep(1); /* * Switch off tuning bits. * For RT2523 devices we do not need to update the R1 register. */ /* rt2x00_set_field32(&rt2x00pci->channel.rf1, RF1_TUNER, 0); rt2x00_set_field32(&rt2x00pci->channel.rf3, RF3_TUNER, 0); */ if(!rt2x00_rf(&rt2x00pci->chip, RF2523)) rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf1); rt2x00_rf_regwrite(rt2x00pci, rt2x00pci->channel.rf3); /* * Clear false CRC during channel switch. */ rt2x00_register_read(rt2x00pci, CNT0, ®); INFO("Switching to channel %d. RF1: 0x%08x, RF2: 0x%08x, RF3: 0x%08x, RF4: 0x%08x.\n", config->channel, rt2x00pci->channel.rf1, rt2x00pci->channel.rf2, rt2x00pci->channel.rf3, rt2x00pci->channel.rf4); }