📄 rt2500usb.c
字号:
rt2500usb_register_write(rt2x00dev, PHY_CSR5, csr5); rt2500usb_register_write(rt2x00dev, PHY_CSR6, csr6);}static void rt2500usb_config_duration(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_conf *libconf){ u16 reg; rt2500usb_register_write(rt2x00dev, MAC_CSR10, libconf->slot_time); rt2500usb_register_read(rt2x00dev, TXRX_CSR18, ®); rt2x00_set_field16(®, TXRX_CSR18_INTERVAL, libconf->conf->beacon_int * 4); rt2500usb_register_write(rt2x00dev, TXRX_CSR18, reg);}static void rt2500usb_config(struct rt2x00_dev *rt2x00dev, const unsigned int flags, struct rt2x00lib_conf *libconf){ if (flags & CONFIG_UPDATE_PHYMODE) rt2500usb_config_phymode(rt2x00dev, libconf->phymode, libconf->basic_rates); if (flags & CONFIG_UPDATE_CHANNEL) rt2500usb_config_channel(rt2x00dev, &libconf->rf, libconf->conf->power_level); if ((flags & CONFIG_UPDATE_TXPOWER) && !(flags & CONFIG_UPDATE_CHANNEL)) rt2500usb_config_txpower(rt2x00dev, libconf->conf->power_level); if (flags & CONFIG_UPDATE_ANTENNA) rt2500usb_config_antenna(rt2x00dev, libconf->conf->antenna_sel_tx, libconf->conf->antenna_sel_rx); if (flags & (CONFIG_UPDATE_SLOT_TIME | CONFIG_UPDATE_BEACON_INT)) rt2500usb_config_duration(rt2x00dev, libconf);}/* * LED functions. */static void rt2500usb_enable_led(struct rt2x00_dev *rt2x00dev){ u16 reg; rt2500usb_register_read(rt2x00dev, MAC_CSR21, ®); rt2x00_set_field16(®, MAC_CSR21_ON_PERIOD, 70); rt2x00_set_field16(®, MAC_CSR21_OFF_PERIOD, 30); rt2500usb_register_write(rt2x00dev, MAC_CSR21, reg); rt2500usb_register_read(rt2x00dev, MAC_CSR20, ®); if (rt2x00dev->led_mode == LED_MODE_TXRX_ACTIVITY) { rt2x00_set_field16(®, MAC_CSR20_LINK, 1); rt2x00_set_field16(®, MAC_CSR20_ACTIVITY, 0); } else if (rt2x00dev->led_mode == LED_MODE_ASUS) { rt2x00_set_field16(®, MAC_CSR20_LINK, 0); rt2x00_set_field16(®, MAC_CSR20_ACTIVITY, 1); } else { rt2x00_set_field16(®, MAC_CSR20_LINK, 1); rt2x00_set_field16(®, MAC_CSR20_ACTIVITY, 1); } rt2500usb_register_write(rt2x00dev, MAC_CSR20, reg);}static void rt2500usb_disable_led(struct rt2x00_dev *rt2x00dev){ u16 reg; rt2500usb_register_read(rt2x00dev, MAC_CSR20, ®); rt2x00_set_field16(®, MAC_CSR20_LINK, 0); rt2x00_set_field16(®, MAC_CSR20_ACTIVITY, 0); rt2500usb_register_write(rt2x00dev, MAC_CSR20, reg);}/* * Link tuning */static void rt2500usb_link_stats(struct rt2x00_dev *rt2x00dev){ u16 reg; /* * Update FCS error count from register. */ rt2500usb_register_read(rt2x00dev, STA_CSR0, ®); rt2x00dev->link.rx_failed = rt2x00_get_field16(reg, STA_CSR0_FCS_ERROR); /* * Update False CCA count from register. */ rt2500usb_register_read(rt2x00dev, STA_CSR3, ®); rt2x00dev->link.false_cca = rt2x00_get_field16(reg, STA_CSR3_FALSE_CCA_ERROR);}static void rt2500usb_reset_tuner(struct rt2x00_dev *rt2x00dev){ u16 eeprom; u16 value; rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &eeprom); value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R24_LOW); rt2500usb_bbp_write(rt2x00dev, 24, value); rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R25, &eeprom); value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R25_LOW); rt2500usb_bbp_write(rt2x00dev, 25, value); rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R61, &eeprom); value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_R61_LOW); rt2500usb_bbp_write(rt2x00dev, 61, value); rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_VGC, &eeprom); value = rt2x00_get_field16(eeprom, EEPROM_BBPTUNE_VGCUPPER); rt2500usb_bbp_write(rt2x00dev, 17, value); rt2x00dev->link.vgc_level = value;}static void rt2500usb_link_tuner(struct rt2x00_dev *rt2x00dev){ int rssi = rt2x00_get_link_rssi(&rt2x00dev->link); u16 bbp_thresh; u16 vgc_bound; u16 sens; u16 r24; u16 r25; u16 r61; u16 r17_sens; u8 r17; u8 up_bound; u8 low_bound; /* * Determine the BBP tuning threshold and correctly * set BBP 24, 25 and 61. */ rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE, &bbp_thresh); bbp_thresh = rt2x00_get_field16(bbp_thresh, EEPROM_BBPTUNE_THRESHOLD); rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R24, &r24); rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R25, &r25); rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R61, &r61); if ((rssi + bbp_thresh) > 0) { r24 = rt2x00_get_field16(r24, EEPROM_BBPTUNE_R24_HIGH); r25 = rt2x00_get_field16(r25, EEPROM_BBPTUNE_R25_HIGH); r61 = rt2x00_get_field16(r61, EEPROM_BBPTUNE_R61_HIGH); } else { r24 = rt2x00_get_field16(r24, EEPROM_BBPTUNE_R24_LOW); r25 = rt2x00_get_field16(r25, EEPROM_BBPTUNE_R25_LOW); r61 = rt2x00_get_field16(r61, EEPROM_BBPTUNE_R61_LOW); } rt2500usb_bbp_write(rt2x00dev, 24, r24); rt2500usb_bbp_write(rt2x00dev, 25, r25); rt2500usb_bbp_write(rt2x00dev, 61, r61); /* * Read current r17 value, as well as the sensitivity values * for the r17 register. */ rt2500usb_bbp_read(rt2x00dev, 17, &r17); rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_R17, &r17_sens); /* * A too low RSSI will cause too much false CCA which will * then corrupt the R17 tuning. To remidy this the tuning should * be stopped (While making sure the R17 value will not exceed limits) */ if (rssi >= -40) { if (r17 != 0x60) rt2500usb_bbp_write(rt2x00dev, 17, 0x60); return; } /* * Special big-R17 for short distance */ if (rssi >= -58) { sens = rt2x00_get_field16(r17_sens, EEPROM_BBPTUNE_R17_LOW); if (r17 != sens) rt2500usb_bbp_write(rt2x00dev, 17, sens); return; } /* * Special mid-R17 for middle distance */ if (rssi >= -74) { sens = rt2x00_get_field16(r17_sens, EEPROM_BBPTUNE_R17_HIGH); if (r17 != sens) rt2500usb_bbp_write(rt2x00dev, 17, sens); return; } /* * Leave short or middle distance condition, restore r17 * to the dynamic tuning range. */ rt2x00_eeprom_read(rt2x00dev, EEPROM_BBPTUNE_VGC, &vgc_bound); vgc_bound = rt2x00_get_field16(vgc_bound, EEPROM_BBPTUNE_VGCUPPER); low_bound = 0x32; if (rssi >= -77) up_bound = vgc_bound; else up_bound = vgc_bound - (-77 - rssi); if (up_bound < low_bound) up_bound = low_bound; if (r17 > up_bound) { rt2500usb_bbp_write(rt2x00dev, 17, up_bound); rt2x00dev->link.vgc_level = up_bound; } else if (rt2x00dev->link.false_cca > 512 && r17 < up_bound) { rt2500usb_bbp_write(rt2x00dev, 17, ++r17); rt2x00dev->link.vgc_level = r17; } else if (rt2x00dev->link.false_cca < 100 && r17 > low_bound) { rt2500usb_bbp_write(rt2x00dev, 17, --r17); rt2x00dev->link.vgc_level = r17; }}/* * Initialization functions. */static int rt2500usb_init_registers(struct rt2x00_dev *rt2x00dev){ u16 reg; rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0x0001, USB_MODE_TEST, REGISTER_TIMEOUT); rt2x00usb_vendor_request_sw(rt2x00dev, USB_SINGLE_WRITE, 0x0308, 0x00f0, REGISTER_TIMEOUT); rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); rt2x00_set_field16(®, TXRX_CSR2_DISABLE_RX, 1); rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); rt2500usb_register_write(rt2x00dev, MAC_CSR13, 0x1111); rt2500usb_register_write(rt2x00dev, MAC_CSR14, 0x1e11); rt2500usb_register_read(rt2x00dev, MAC_CSR1, ®); rt2x00_set_field16(®, MAC_CSR1_SOFT_RESET, 1); rt2x00_set_field16(®, MAC_CSR1_BBP_RESET, 1); rt2x00_set_field16(®, MAC_CSR1_HOST_READY, 0); rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg); rt2500usb_register_read(rt2x00dev, MAC_CSR1, ®); rt2x00_set_field16(®, MAC_CSR1_SOFT_RESET, 0); rt2x00_set_field16(®, MAC_CSR1_BBP_RESET, 0); rt2x00_set_field16(®, MAC_CSR1_HOST_READY, 0); rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg); rt2500usb_register_read(rt2x00dev, TXRX_CSR5, ®); rt2x00_set_field16(®, TXRX_CSR5_BBP_ID0, 13); rt2x00_set_field16(®, TXRX_CSR5_BBP_ID0_VALID, 1); rt2x00_set_field16(®, TXRX_CSR5_BBP_ID1, 12); rt2x00_set_field16(®, TXRX_CSR5_BBP_ID1_VALID, 1); rt2500usb_register_write(rt2x00dev, TXRX_CSR5, reg); rt2500usb_register_read(rt2x00dev, TXRX_CSR6, ®); rt2x00_set_field16(®, TXRX_CSR6_BBP_ID0, 10); rt2x00_set_field16(®, TXRX_CSR6_BBP_ID0_VALID, 1); rt2x00_set_field16(®, TXRX_CSR6_BBP_ID1, 11); rt2x00_set_field16(®, TXRX_CSR6_BBP_ID1_VALID, 1); rt2500usb_register_write(rt2x00dev, TXRX_CSR6, reg); rt2500usb_register_read(rt2x00dev, TXRX_CSR7, ®); rt2x00_set_field16(®, TXRX_CSR7_BBP_ID0, 7); rt2x00_set_field16(®, TXRX_CSR7_BBP_ID0_VALID, 1); rt2x00_set_field16(®, TXRX_CSR7_BBP_ID1, 6); rt2x00_set_field16(®, TXRX_CSR7_BBP_ID1_VALID, 1); rt2500usb_register_write(rt2x00dev, TXRX_CSR7, reg); rt2500usb_register_read(rt2x00dev, TXRX_CSR8, ®); rt2x00_set_field16(®, TXRX_CSR8_BBP_ID0, 5); rt2x00_set_field16(®, TXRX_CSR8_BBP_ID0_VALID, 1); rt2x00_set_field16(®, TXRX_CSR8_BBP_ID1, 0); rt2x00_set_field16(®, TXRX_CSR8_BBP_ID1_VALID, 0); rt2500usb_register_write(rt2x00dev, TXRX_CSR8, reg); rt2500usb_register_write(rt2x00dev, TXRX_CSR21, 0xe78f); rt2500usb_register_write(rt2x00dev, MAC_CSR9, 0xff1d); if (rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_AWAKE)) return -EBUSY; rt2500usb_register_read(rt2x00dev, MAC_CSR1, ®); rt2x00_set_field16(®, MAC_CSR1_SOFT_RESET, 0); rt2x00_set_field16(®, MAC_CSR1_BBP_RESET, 0); rt2x00_set_field16(®, MAC_CSR1_HOST_READY, 1); rt2500usb_register_write(rt2x00dev, MAC_CSR1, reg); if (rt2x00_rev(&rt2x00dev->chip) >= RT2570_VERSION_C) { rt2500usb_register_read(rt2x00dev, PHY_CSR2, ®); reg &= ~0x0002; } else { reg = 0x3002; } rt2500usb_register_write(rt2x00dev, PHY_CSR2, reg); rt2500usb_register_write(rt2x00dev, MAC_CSR11, 0x0002); rt2500usb_register_write(rt2x00dev, MAC_CSR22, 0x0053); rt2500usb_register_write(rt2x00dev, MAC_CSR15, 0x01ee); rt2500usb_register_write(rt2x00dev, MAC_CSR16, 0x0000); rt2500usb_register_read(rt2x00dev, MAC_CSR8, ®); rt2x00_set_field16(®, MAC_CSR8_MAX_FRAME_UNIT, rt2x00dev->rx->data_size); rt2500usb_register_write(rt2x00dev, MAC_CSR8, reg); rt2500usb_register_read(rt2x00dev, TXRX_CSR0, ®); rt2x00_set_field16(®, TXRX_CSR0_IV_OFFSET, IEEE80211_HEADER); rt2x00_set_field16(®, TXRX_CSR0_KEY_ID, 0xff); rt2500usb_register_write(rt2x00dev, TXRX_CSR0, reg); rt2500usb_register_read(rt2x00dev, MAC_CSR18, ®); rt2x00_set_field16(®, MAC_CSR18_DELAY_AFTER_BEACON, 90); rt2500usb_register_write(rt2x00dev, MAC_CSR18, reg); rt2500usb_register_read(rt2x00dev, PHY_CSR4, ®); rt2x00_set_field16(®, PHY_CSR4_LOW_RF_LE, 1); rt2500usb_register_write(rt2x00dev, PHY_CSR4, reg); rt2500usb_register_read(rt2x00dev, TXRX_CSR1, ®); rt2x00_set_field16(®, TXRX_CSR1_AUTO_SEQUENCE, 1); rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg); return 0;}static int rt2500usb_init_bbp(struct rt2x00_dev *rt2x00dev){ unsigned int i; u16 eeprom; u8 value; u8 reg_id; for (i = 0; i < REGISTER_BUSY_COUNT; i++) { rt2500usb_bbp_read(rt2x00dev, 0, &value); if ((value != 0xff) && (value != 0x00)) goto continue_csr_init; NOTICE(rt2x00dev, "Waiting for BBP register.\n"); udelay(REGISTER_BUSY_DELAY); } ERROR(rt2x00dev, "BBP register access failed, aborting.\n"); return -EACCES;continue_csr_init: rt2500usb_bbp_write(rt2x00dev, 3, 0x02); rt2500usb_bbp_write(rt2x00dev, 4, 0x19); rt2500usb_bbp_write(rt2x00dev, 14, 0x1c); rt2500usb_bbp_write(rt2x00dev, 15, 0x30); rt2500usb_bbp_write(rt2x00dev, 16, 0xac); rt2500usb_bbp_write(rt2x00dev, 18, 0x18); rt2500usb_bbp_write(rt2x00dev, 19, 0xff); rt2500usb_bbp_write(rt2x00dev, 20, 0x1e); rt2500usb_bbp_write(rt2x00dev, 21, 0x08); rt2500usb_bbp_write(rt2x00dev, 22, 0x08); rt2500usb_bbp_write(rt2x00dev, 23, 0x08); rt2500usb_bbp_write(rt2x00dev, 24, 0x80); rt2500usb_bbp_write(rt2x00dev, 25, 0x50); rt2500usb_bbp_write(rt2x00dev, 26, 0x08); rt2500usb_bbp_write(rt2x00dev, 27, 0x23); rt2500usb_bbp_write(rt2x00dev, 30, 0x10); rt2500usb_bbp_write(rt2x00dev, 31, 0x2b); rt2500usb_bbp_write(rt2x00dev, 32, 0xb9); rt2500usb_bbp_write(rt2x00dev, 34, 0x12); rt2500usb_bbp_write(rt2x00dev, 35, 0x50); rt2500usb_bbp_write(rt2x00dev, 39, 0xc4); rt2500usb_bbp_write(rt2x00dev, 40, 0x02); rt2500usb_bbp_write(rt2x00dev, 41, 0x60); rt2500usb_bbp_write(rt2x00dev, 53, 0x10); rt2500usb_bbp_write(rt2x00dev, 54, 0x18); rt2500usb_bbp_write(rt2x00dev, 56, 0x08); rt2500usb_bbp_write(rt2x00dev, 57, 0x10); rt2500usb_bbp_write(rt2x00dev, 58, 0x08); rt2500usb_bbp_write(rt2x00dev, 61, 0x60); rt2500usb_bbp_write(rt2x00dev, 62, 0x10); rt2500usb_bbp_write(rt2x00dev, 75, 0xff); DEBUG(rt2x00dev, "Start initialization from EEPROM...\n"); for (i = 0; i < EEPROM_BBP_SIZE; i++) { rt2x00_eeprom_read(rt2x00dev, EEPROM_BBP_START + i, &eeprom); if (eeprom != 0xffff && eeprom != 0x0000) { reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID); value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE); DEBUG(rt2x00dev, "BBP: 0x%02x, value: 0x%02x.\n", reg_id, value); rt2500usb_bbp_write(rt2x00dev, reg_id, value); } } DEBUG(rt2x00dev, "...End initialization from EEPROM.\n"); return 0;}/* * Device state switch handlers. */static void rt2500usb_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state){ u16 reg; rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); rt2x00_set_field16(®, TXRX_CSR2_DISABLE_RX, state == STATE_RADIO_RX_OFF); rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg);}static int rt2500usb_enable_radio(struct rt2x00_dev *rt2x00dev){ /* * Initialize all registers. */ if (rt2500usb_init_registers(rt2x00dev) || rt2500usb_init_bbp(rt2x00dev)) { ERROR(rt2x00dev, "Register initialization failed.\n"); return -EIO; } rt2x00usb_enable_radio(rt2x00dev); /* * Enable LED */ rt2500usb_enable_led(rt2x00dev); return 0;}static void rt2500usb_disable_radio(struct rt2x00_dev *rt2x00dev){ /* * Disable LED */ rt2500usb_disable_led(rt2x00dev); rt2500usb_register_write(rt2x00dev, MAC_CSR13, 0x2121); rt2500usb_register_write(rt2x00dev, MAC_CSR14, 0x2121); /* * Disable synchronisation. */ rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0); rt2x00usb_disable_radio(rt2x00dev);}static int rt2500usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -