⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rt2500pci.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	/*	 * 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_RT2500PCI_RFKILL	if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))		__set_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags);#endif /* CONFIG_RT2500PCI_RFKILL */	/*	 * Check if the BBP tuning should be enabled.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_NIC, &eeprom);	if (rt2x00_get_field16(eeprom, EEPROM_NIC_DYN_BBP_TUNE))		__set_bit(CONFIG_DISABLE_LINK_TUNING, &rt2x00dev->flags);	/*	 * Read the RSSI <-> dBm offset information.	 */	rt2x00_eeprom_read(rt2x00dev, EEPROM_CALIBRATE_OFFSET, &eeprom);	rt2x00dev->rssi_offset =	    rt2x00_get_field16(eeprom, EEPROM_CALIBRATE_OFFSET_RSSI);	return 0;}/* * RF value list for RF2522 * Supports: 2.4 GHz */static const struct rf_channel rf_vals_bg_2522[] = {	{ 1,  0x00002050, 0x000c1fda, 0x00000101, 0 },	{ 2,  0x00002050, 0x000c1fee, 0x00000101, 0 },	{ 3,  0x00002050, 0x000c2002, 0x00000101, 0 },	{ 4,  0x00002050, 0x000c2016, 0x00000101, 0 },	{ 5,  0x00002050, 0x000c202a, 0x00000101, 0 },	{ 6,  0x00002050, 0x000c203e, 0x00000101, 0 },	{ 7,  0x00002050, 0x000c2052, 0x00000101, 0 },	{ 8,  0x00002050, 0x000c2066, 0x00000101, 0 },	{ 9,  0x00002050, 0x000c207a, 0x00000101, 0 },	{ 10, 0x00002050, 0x000c208e, 0x00000101, 0 },	{ 11, 0x00002050, 0x000c20a2, 0x00000101, 0 },	{ 12, 0x00002050, 0x000c20b6, 0x00000101, 0 },	{ 13, 0x00002050, 0x000c20ca, 0x00000101, 0 },	{ 14, 0x00002050, 0x000c20fa, 0x00000101, 0 },};/* * RF value list for RF2523 * Supports: 2.4 GHz */static const struct rf_channel rf_vals_bg_2523[] = {	{ 1,  0x00022010, 0x00000c9e, 0x000e0111, 0x00000a1b },	{ 2,  0x00022010, 0x00000ca2, 0x000e0111, 0x00000a1b },	{ 3,  0x00022010, 0x00000ca6, 0x000e0111, 0x00000a1b },	{ 4,  0x00022010, 0x00000caa, 0x000e0111, 0x00000a1b },	{ 5,  0x00022010, 0x00000cae, 0x000e0111, 0x00000a1b },	{ 6,  0x00022010, 0x00000cb2, 0x000e0111, 0x00000a1b },	{ 7,  0x00022010, 0x00000cb6, 0x000e0111, 0x00000a1b },	{ 8,  0x00022010, 0x00000cba, 0x000e0111, 0x00000a1b },	{ 9,  0x00022010, 0x00000cbe, 0x000e0111, 0x00000a1b },	{ 10, 0x00022010, 0x00000d02, 0x000e0111, 0x00000a1b },	{ 11, 0x00022010, 0x00000d06, 0x000e0111, 0x00000a1b },	{ 12, 0x00022010, 0x00000d0a, 0x000e0111, 0x00000a1b },	{ 13, 0x00022010, 0x00000d0e, 0x000e0111, 0x00000a1b },	{ 14, 0x00022010, 0x00000d1a, 0x000e0111, 0x00000a03 },};/* * RF value list for RF2524 * Supports: 2.4 GHz */static const struct rf_channel rf_vals_bg_2524[] = {	{ 1,  0x00032020, 0x00000c9e, 0x00000101, 0x00000a1b },	{ 2,  0x00032020, 0x00000ca2, 0x00000101, 0x00000a1b },	{ 3,  0x00032020, 0x00000ca6, 0x00000101, 0x00000a1b },	{ 4,  0x00032020, 0x00000caa, 0x00000101, 0x00000a1b },	{ 5,  0x00032020, 0x00000cae, 0x00000101, 0x00000a1b },	{ 6,  0x00032020, 0x00000cb2, 0x00000101, 0x00000a1b },	{ 7,  0x00032020, 0x00000cb6, 0x00000101, 0x00000a1b },	{ 8,  0x00032020, 0x00000cba, 0x00000101, 0x00000a1b },	{ 9,  0x00032020, 0x00000cbe, 0x00000101, 0x00000a1b },	{ 10, 0x00032020, 0x00000d02, 0x00000101, 0x00000a1b },	{ 11, 0x00032020, 0x00000d06, 0x00000101, 0x00000a1b },	{ 12, 0x00032020, 0x00000d0a, 0x00000101, 0x00000a1b },	{ 13, 0x00032020, 0x00000d0e, 0x00000101, 0x00000a1b },	{ 14, 0x00032020, 0x00000d1a, 0x00000101, 0x00000a03 },};/* * RF value list for RF2525 * Supports: 2.4 GHz */static const struct rf_channel rf_vals_bg_2525[] = {	{ 1,  0x00022020, 0x00080c9e, 0x00060111, 0x00000a1b },	{ 2,  0x00022020, 0x00080ca2, 0x00060111, 0x00000a1b },	{ 3,  0x00022020, 0x00080ca6, 0x00060111, 0x00000a1b },	{ 4,  0x00022020, 0x00080caa, 0x00060111, 0x00000a1b },	{ 5,  0x00022020, 0x00080cae, 0x00060111, 0x00000a1b },	{ 6,  0x00022020, 0x00080cb2, 0x00060111, 0x00000a1b },	{ 7,  0x00022020, 0x00080cb6, 0x00060111, 0x00000a1b },	{ 8,  0x00022020, 0x00080cba, 0x00060111, 0x00000a1b },	{ 9,  0x00022020, 0x00080cbe, 0x00060111, 0x00000a1b },	{ 10, 0x00022020, 0x00080d02, 0x00060111, 0x00000a1b },	{ 11, 0x00022020, 0x00080d06, 0x00060111, 0x00000a1b },	{ 12, 0x00022020, 0x00080d0a, 0x00060111, 0x00000a1b },	{ 13, 0x00022020, 0x00080d0e, 0x00060111, 0x00000a1b },	{ 14, 0x00022020, 0x00080d1a, 0x00060111, 0x00000a03 },};/* * RF value list for RF2525e * Supports: 2.4 GHz */static const struct rf_channel rf_vals_bg_2525e[] = {	{ 1,  0x00022020, 0x00081136, 0x00060111, 0x00000a0b },	{ 2,  0x00022020, 0x0008113a, 0x00060111, 0x00000a0b },	{ 3,  0x00022020, 0x0008113e, 0x00060111, 0x00000a0b },	{ 4,  0x00022020, 0x00081182, 0x00060111, 0x00000a0b },	{ 5,  0x00022020, 0x00081186, 0x00060111, 0x00000a0b },	{ 6,  0x00022020, 0x0008118a, 0x00060111, 0x00000a0b },	{ 7,  0x00022020, 0x0008118e, 0x00060111, 0x00000a0b },	{ 8,  0x00022020, 0x00081192, 0x00060111, 0x00000a0b },	{ 9,  0x00022020, 0x00081196, 0x00060111, 0x00000a0b },	{ 10, 0x00022020, 0x0008119a, 0x00060111, 0x00000a0b },	{ 11, 0x00022020, 0x0008119e, 0x00060111, 0x00000a0b },	{ 12, 0x00022020, 0x000811a2, 0x00060111, 0x00000a0b },	{ 13, 0x00022020, 0x000811a6, 0x00060111, 0x00000a0b },	{ 14, 0x00022020, 0x000811ae, 0x00060111, 0x00000a1b },};/* * RF value list for RF5222 * Supports: 2.4 GHz & 5.2 GHz */static const struct rf_channel rf_vals_5222[] = {	{ 1,  0x00022020, 0x00001136, 0x00000101, 0x00000a0b },	{ 2,  0x00022020, 0x0000113a, 0x00000101, 0x00000a0b },	{ 3,  0x00022020, 0x0000113e, 0x00000101, 0x00000a0b },	{ 4,  0x00022020, 0x00001182, 0x00000101, 0x00000a0b },	{ 5,  0x00022020, 0x00001186, 0x00000101, 0x00000a0b },	{ 6,  0x00022020, 0x0000118a, 0x00000101, 0x00000a0b },	{ 7,  0x00022020, 0x0000118e, 0x00000101, 0x00000a0b },	{ 8,  0x00022020, 0x00001192, 0x00000101, 0x00000a0b },	{ 9,  0x00022020, 0x00001196, 0x00000101, 0x00000a0b },	{ 10, 0x00022020, 0x0000119a, 0x00000101, 0x00000a0b },	{ 11, 0x00022020, 0x0000119e, 0x00000101, 0x00000a0b },	{ 12, 0x00022020, 0x000011a2, 0x00000101, 0x00000a0b },	{ 13, 0x00022020, 0x000011a6, 0x00000101, 0x00000a0b },	{ 14, 0x00022020, 0x000011ae, 0x00000101, 0x00000a1b },	/* 802.11 UNI / HyperLan 2 */	{ 36, 0x00022010, 0x00018896, 0x00000101, 0x00000a1f },	{ 40, 0x00022010, 0x0001889a, 0x00000101, 0x00000a1f },	{ 44, 0x00022010, 0x0001889e, 0x00000101, 0x00000a1f },	{ 48, 0x00022010, 0x000188a2, 0x00000101, 0x00000a1f },	{ 52, 0x00022010, 0x000188a6, 0x00000101, 0x00000a1f },	{ 66, 0x00022010, 0x000188aa, 0x00000101, 0x00000a1f },	{ 60, 0x00022010, 0x000188ae, 0x00000101, 0x00000a1f },	{ 64, 0x00022010, 0x000188b2, 0x00000101, 0x00000a1f },	/* 802.11 HyperLan 2 */	{ 100, 0x00022010, 0x00008802, 0x00000101, 0x00000a0f },	{ 104, 0x00022010, 0x00008806, 0x00000101, 0x00000a0f },	{ 108, 0x00022010, 0x0000880a, 0x00000101, 0x00000a0f },	{ 112, 0x00022010, 0x0000880e, 0x00000101, 0x00000a0f },	{ 116, 0x00022010, 0x00008812, 0x00000101, 0x00000a0f },	{ 120, 0x00022010, 0x00008816, 0x00000101, 0x00000a0f },	{ 124, 0x00022010, 0x0000881a, 0x00000101, 0x00000a0f },	{ 128, 0x00022010, 0x0000881e, 0x00000101, 0x00000a0f },	{ 132, 0x00022010, 0x00008822, 0x00000101, 0x00000a0f },	{ 136, 0x00022010, 0x00008826, 0x00000101, 0x00000a0f },	/* 802.11 UNII */	{ 140, 0x00022010, 0x0000882a, 0x00000101, 0x00000a0f },	{ 149, 0x00022020, 0x000090a6, 0x00000101, 0x00000a07 },	{ 153, 0x00022020, 0x000090ae, 0x00000101, 0x00000a07 },	{ 157, 0x00022020, 0x000090b6, 0x00000101, 0x00000a07 },	{ 161, 0x00022020, 0x000090be, 0x00000101, 0x00000a07 },};static void rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev){	struct hw_mode_spec *spec = &rt2x00dev->spec;	u8 *txpower;	unsigned int i;	/*	 * Initialize all hw fields.	 */	rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;	rt2x00dev->hw->extra_tx_headroom = 0;	rt2x00dev->hw->max_signal = MAX_SIGNAL;	rt2x00dev->hw->max_rssi = MAX_RX_SSI;	rt2x00dev->hw->queues = 2;	SET_IEEE80211_DEV(rt2x00dev->hw, &rt2x00dev_pci(rt2x00dev)->dev);	SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,				rt2x00_eeprom_addr(rt2x00dev,						   EEPROM_MAC_ADDR_0));	/*	 * Convert tx_power array in eeprom.	 */	txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_START);	for (i = 0; i < 14; i++)		txpower[i] = TXPOWER_FROM_DEV(txpower[i]);	/*	 * Initialize hw_mode information.	 */	spec->num_modes = 2;	spec->num_rates = 12;	spec->tx_power_a = NULL;	spec->tx_power_bg = txpower;	spec->tx_power_default = DEFAULT_TXPOWER;	if (rt2x00_rf(&rt2x00dev->chip, RF2522)) {		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2522);		spec->channels = rf_vals_bg_2522;	} else if (rt2x00_rf(&rt2x00dev->chip, RF2523)) {		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2523);		spec->channels = rf_vals_bg_2523;	} else if (rt2x00_rf(&rt2x00dev->chip, RF2524)) {		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2524);		spec->channels = rf_vals_bg_2524;	} else if (rt2x00_rf(&rt2x00dev->chip, RF2525)) {		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525);		spec->channels = rf_vals_bg_2525;	} else if (rt2x00_rf(&rt2x00dev->chip, RF2525E)) {		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2525e);		spec->channels = rf_vals_bg_2525e;	} else if (rt2x00_rf(&rt2x00dev->chip, RF5222)) {		spec->num_channels = ARRAY_SIZE(rf_vals_5222);		spec->channels = rf_vals_5222;		spec->num_modes = 3;	}}static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev){	int retval;	/*	 * Allocate eeprom data.	 */	retval = rt2500pci_validate_eeprom(rt2x00dev);	if (retval)		return retval;	retval = rt2500pci_init_eeprom(rt2x00dev);	if (retval)		return retval;	/*	 * Initialize hw specifications.	 */	rt2500pci_probe_hw_mode(rt2x00dev);	/*	 * This device requires the beacon ring	 */	__set_bit(DRIVER_REQUIRE_BEACON_RING, &rt2x00dev->flags);	/*	 * Set the rssi offset.	 */	rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET;	return 0;}/* * IEEE80211 stack callback functions. */static void rt2500pci_configure_filter(struct ieee80211_hw *hw,				       unsigned int changed_flags,				       unsigned int *total_flags,				       int mc_count,				       struct dev_addr_list *mc_list){	struct rt2x00_dev *rt2x00dev = hw->priv;	struct interface *intf = &rt2x00dev->interface;	u32 reg;	/*	 * Mask off any flags we are going to ignore from	 * the total_flags field.	 */	*total_flags &=	    FIF_ALLMULTI |	    FIF_FCSFAIL |	    FIF_PLCPFAIL |	    FIF_CONTROL |	    FIF_OTHER_BSS |	    FIF_PROMISC_IN_BSS;	/*	 * Apply some rules to the filters:	 * - Some filters imply different filters to be set.	 * - Some things we can't filter out at all.	 * - Some filters are set based on interface type.	 */	if (mc_count)		*total_flags |= FIF_ALLMULTI;	if (*total_flags & FIF_OTHER_BSS ||	    *total_flags & FIF_PROMISC_IN_BSS)		*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;	if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))		*total_flags |= FIF_PROMISC_IN_BSS;	/*	 * Check if there is any work left for us.	 */	if (intf->filter == *total_flags)		return;	intf->filter = *total_flags;	/*	 * Start configuration steps.	 * Note that the version error will always be dropped	 * and broadcast frames will always be accepted since	 * there is no filter for it at this time.	 */	rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);	rt2x00_set_field32(&reg, RXCSR0_DROP_CRC,			   !(*total_flags & FIF_FCSFAIL));	rt2x00_set_field32(&reg, RXCSR0_DROP_PHYSICAL,			   !(*total_flags & FIF_PLCPFAIL));	rt2x00_set_field32(&reg, RXCSR0_DROP_CONTROL,			   !(*total_flags & FIF_CONTROL));	rt2x00_set_field32(&reg, RXCSR0_DROP_NOT_TO_ME,			   !(*total_flags & FIF_PROMISC_IN_BSS));	rt2x00_set_field32(&reg, RXCSR0_DROP_TODS,			   !(*total_flags & FIF_PROMISC_IN_BSS));	rt2x00_set_field32(&reg, RXCSR0_DROP_VERSION_ERROR, 1);	rt2x00_set_field32(&reg, RXCSR0_DROP_MCAST,			   !(*total_flags & FIF_ALLMULTI));	rt2x00_set_field32(&reg, RXCSR0_DROP_BCAST, 0);	rt2x00pci_register_write(rt2x00dev, RXCSR0, reg);}static int rt2500pci_set_retry_limit(struct ieee80211_hw *hw,				     u32 short_retry, u32 long_retry){	struct rt2x00_dev *rt2x00dev = hw->priv;	u32 reg;	rt2x00pci_register_read(rt2x00dev, CSR11, &reg);	rt2x00_set_field32(&reg, CSR11_LONG_RETRY, long_retry);	rt2x00_set_field32(&reg, CSR11_SHORT_RETRY, short_retry);	rt2x00pci_register_write(rt2x00dev, CSR11, reg);	return 0;}static u64 rt2500pci_get_tsf(struct ieee80211_hw *hw){	struct rt2x00_dev *rt2x00dev = hw->priv;	u64 tsf;	u32 reg;	rt2x00pci_register_read(rt2x00dev, CSR17, &reg);	tsf = (u64) rt2x00_get_field32(reg, CSR17_HIGH_TSFTIMER) << 32;	rt2x00pci_register_read(rt2x00dev, CSR16, &reg);	tsf |= rt2x00_get_field32(reg, CSR16_LOW_TSFTIMER);	return tsf;}static void rt2500pci_reset_tsf(struct ieee80211_hw *hw){	struct rt2x00_dev *rt2x00dev = hw->priv;	rt2x00pci_register_write(rt2x00dev, CSR16, 0);	rt2x00pci_register_write(rt2x00dev, CSR17, 0);}static int rt2500pci_tx_last_beacon(struct ieee80211_hw *hw){	struct rt2x00_dev *rt2x00dev = hw->priv;	u32 reg;	rt2x00pci_register_read(rt2x00dev, CSR15, &reg);	return rt2x00_get_field32(reg, CSR15_BEACON_SENT);}static const struct ieee80211_ops rt2500pci_mac80211_ops = {	.tx			= rt2x00mac_tx,	.start			= rt2x00mac_start,	.stop			= rt2x00mac_stop,	.add_interface		= rt2x00mac_add_interface,	.remove_interface	= rt2x00mac_remove_interface,	.config			= rt2x00mac_config,	.config_interface	= rt2x00mac_config_interface,	.configure_filter	= rt2500pci_configure_filter,	.get_stats		= rt2x00mac_get_stats,	.set_retry_limit	= rt2500pci_set_retry_limit,	.erp_ie_changed		= rt2x00mac_erp_ie_changed,	.conf_tx		= rt2x00mac_conf_tx,	.get_tx_stats		= rt2x00mac_get_tx_stats,	.get_tsf		= rt2500pci_get_tsf,	.reset_tsf		= rt2500pci_reset_tsf,	.beacon_update		= rt2x00pci_beacon_update,	.tx_last_beacon		= rt2500pci_tx_last_beacon,};static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {	.irq_handler		= rt2500pci_interrupt,	.probe_hw		= rt2500pci_probe_hw,	.initialize		= rt2x00pci_initialize,	.uninitialize		= rt2x00pci_uninitialize,	.set_device_state	= rt2500pci_set_device_state,	.rfkill_poll		= rt2500pci_rfkill_poll,	.link_stats		= rt2500pci_link_stats,	.reset_tuner		= rt2500pci_reset_tuner,	.link_tuner		= rt2500pci_link_tuner,	.write_tx_desc		= rt2500pci_write_tx_desc,	.write_tx_data		= rt2x00pci_write_tx_data,	.kick_tx_queue		= rt2500pci_kick_tx_queue,	.fill_rxdone		= rt2500pci_fill_rxdone,	.config_mac_addr	= rt2500pci_config_mac_addr,	.config_bssid		= rt2500pci_config_bssid,	.config_type		= rt2500pci_config_type,	.config_preamble	= rt2500pci_config_preamble,	.config			= rt2500pci_config,};static const struct rt2x00_ops rt2500pci_ops = {	.name		= DRV_NAME,	.rxd_size	= RXD_DESC_SIZE,	.txd_size	= TXD_DESC_SIZE,	.eeprom_size	= EEPROM_SIZE,	.rf_size	= RF_SIZE,	.lib		= &rt2500pci_rt2x00_ops,	.hw		= &rt2500pci_mac80211_ops,#ifdef CONFIG_RT2X00_LIB_DEBUGFS	.debugfs	= &rt2500pci_rt2x00debug,#endif /* CONFIG_RT2X00_LIB_DEBUGFS */};/* * RT2500pci module information. */static struct pci_device_id rt2500pci_device_table[] = {	{ PCI_DEVICE(0x1814, 0x0201), PCI_DEVICE_DATA(&rt2500pci_ops) },	{ 0, }};MODULE_AUTHOR(DRV_PROJECT);MODULE_VERSION(DRV_VERSION);MODULE_DESCRIPTION("Ralink RT2500 PCI & PCMCIA Wireless LAN driver.");MODULE_SUPPORTED_DEVICE("Ralink RT2560 PCI & PCMCIA chipset based cards");MODULE_DEVICE_TABLE(pci, rt2500pci_device_table);MODULE_LICENSE("GPL");static struct pci_driver rt2500pci_driver = {	.name		= DRV_NAME,	.id_table	= rt2500pci_device_table,	.probe		= rt2x00pci_probe,	.remove		= __devexit_p(rt2x00pci_remove),	.suspend	= rt2x00pci_suspend,	.resume		= rt2x00pci_resume,};static int __init rt2500pci_init(void){	return pci_register_driver(&rt2500pci_driver);}static void __exit rt2500pci_exit(void){	pci_unregister_driver(&rt2500pci_driver);}module_init(rt2500pci_init);module_exit(rt2500pci_exit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -