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

📄 rt73usb.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	/* MMAC(Japan)J52 ch 34,38,42,46 */	{ 34, 0x00002ccc, 0x0000499a, 0x0009be55, 0x000ffa0b },	{ 38, 0x00002ccc, 0x0000499e, 0x0009be55, 0x000ffa13 },	{ 42, 0x00002ccc, 0x000049a2, 0x0009be55, 0x000ffa1b },	{ 46, 0x00002ccc, 0x000049a6, 0x0009be55, 0x000ffa23 },};static void rt73usb_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_GEN_BEACON_TEMPLATE |	    IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;	rt2x00dev->hw->extra_tx_headroom = TXD_DESC_SIZE;	rt2x00dev->hw->max_signal = MAX_SIGNAL;	rt2x00dev->hw->max_rssi = MAX_RX_SSI;	rt2x00dev->hw->queues = 5;	SET_IEEE80211_DEV(rt2x00dev->hw, &rt2x00dev_usb(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_G_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, RF2528)) {		spec->num_channels = ARRAY_SIZE(rf_vals_bg_2528);		spec->channels = rf_vals_bg_2528;	} else if (rt2x00_rf(&rt2x00dev->chip, RF5226)) {		spec->num_channels = ARRAY_SIZE(rf_vals_5226);		spec->channels = rf_vals_5226;	} else if (rt2x00_rf(&rt2x00dev->chip, RF2527)) {		spec->num_channels = 14;		spec->channels = rf_vals_5225_2527;	} else if (rt2x00_rf(&rt2x00dev->chip, RF5225)) {		spec->num_channels = ARRAY_SIZE(rf_vals_5225_2527);		spec->channels = rf_vals_5225_2527;	}	if (rt2x00_rf(&rt2x00dev->chip, RF5225) ||	    rt2x00_rf(&rt2x00dev->chip, RF5226)) {		spec->num_modes = 3;		txpower = rt2x00_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_A_START);		for (i = 0; i < 14; i++)			txpower[i] = TXPOWER_FROM_DEV(txpower[i]);		spec->tx_power_a = txpower;	}}static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev){	int retval;	/*	 * Allocate eeprom data.	 */	retval = rt73usb_validate_eeprom(rt2x00dev);	if (retval)		return retval;	retval = rt73usb_init_eeprom(rt2x00dev);	if (retval)		return retval;	/*	 * Initialize hw specifications.	 */	rt73usb_probe_hw_mode(rt2x00dev);	/*	 * This device requires firmware	 */	__set_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags);	/*	 * Set the rssi offset.	 */	rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET;	return 0;}/* * IEEE80211 stack callback functions. */static void rt73usb_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;	/*	 * When in atomic context, reschedule and let rt2x00lib	 * call this function again.	 */	if (in_atomic()) {		queue_work(rt2x00dev->hw->workqueue, &rt2x00dev->filter_work);		return;	}	/*	 * 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.	 */	rt73usb_register_read(rt2x00dev, TXRX_CSR0, &reg);	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CRC,			   !(*total_flags & FIF_FCSFAIL));	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_PHYSICAL,			   !(*total_flags & FIF_PLCPFAIL));	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_CONTROL,			   !(*total_flags & FIF_CONTROL));	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_NOT_TO_ME,			   !(*total_flags & FIF_PROMISC_IN_BSS));	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_TO_DS,			   !(*total_flags & FIF_PROMISC_IN_BSS));	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_VERSION_ERROR, 1);	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_MULTICAST,			   !(*total_flags & FIF_ALLMULTI));	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_BROADCAST, 0);	rt2x00_set_field32(&reg, TXRX_CSR0_DROP_ACK_CTS, 1);	rt73usb_register_write(rt2x00dev, TXRX_CSR0, reg);}static int rt73usb_set_retry_limit(struct ieee80211_hw *hw,				   u32 short_retry, u32 long_retry){	struct rt2x00_dev *rt2x00dev = hw->priv;	u32 reg;	rt73usb_register_read(rt2x00dev, TXRX_CSR4, &reg);	rt2x00_set_field32(&reg, TXRX_CSR4_LONG_RETRY_LIMIT, long_retry);	rt2x00_set_field32(&reg, TXRX_CSR4_SHORT_RETRY_LIMIT, short_retry);	rt73usb_register_write(rt2x00dev, TXRX_CSR4, reg);	return 0;}#if 0/* * Mac80211 demands get_tsf must be atomic. * This is not possible for rt73usb since all register access * functions require sleeping. Untill mac80211 no longer needs * get_tsf to be atomic, this function should be disabled. */static u64 rt73usb_get_tsf(struct ieee80211_hw *hw){	struct rt2x00_dev *rt2x00dev = hw->priv;	u64 tsf;	u32 reg;	rt73usb_register_read(rt2x00dev, TXRX_CSR13, &reg);	tsf = (u64) rt2x00_get_field32(reg, TXRX_CSR13_HIGH_TSFTIMER) << 32;	rt73usb_register_read(rt2x00dev, TXRX_CSR12, &reg);	tsf |= rt2x00_get_field32(reg, TXRX_CSR12_LOW_TSFTIMER);	return tsf;}#else#define rt73usb_get_tsf	NULL#endifstatic void rt73usb_reset_tsf(struct ieee80211_hw *hw){	struct rt2x00_dev *rt2x00dev = hw->priv;	rt73usb_register_write(rt2x00dev, TXRX_CSR12, 0);	rt73usb_register_write(rt2x00dev, TXRX_CSR13, 0);}static int rt73usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,			  struct ieee80211_tx_control *control){	struct rt2x00_dev *rt2x00dev = hw->priv;	int timeout;	/*	 * Just in case the ieee80211 doesn't set this,	 * but we need this queue set for the descriptor	 * initialization.	 */	control->queue = IEEE80211_TX_QUEUE_BEACON;	/*	 * First we create the beacon.	 */	skb_push(skb, TXD_DESC_SIZE);	memset(skb->data, 0, TXD_DESC_SIZE);	rt2x00lib_write_tx_desc(rt2x00dev, (struct data_desc *)skb->data,				(struct ieee80211_hdr *)(skb->data +							 TXD_DESC_SIZE),				skb->len - TXD_DESC_SIZE, control);	/*	 * Write entire beacon with descriptor to register,	 * and kick the beacon generator.	 */	timeout = REGISTER_TIMEOUT * (skb->len / sizeof(u32));	rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE,				 USB_VENDOR_REQUEST_OUT,				 HW_BEACON_BASE0, 0x0000,				 skb->data, skb->len, timeout);	rt73usb_kick_tx_queue(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);	return 0;}static const struct ieee80211_ops rt73usb_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	= rt73usb_configure_filter,	.get_stats		= rt2x00mac_get_stats,	.set_retry_limit	= rt73usb_set_retry_limit,	.erp_ie_changed		= rt2x00mac_erp_ie_changed,	.conf_tx		= rt2x00mac_conf_tx,	.get_tx_stats		= rt2x00mac_get_tx_stats,	.get_tsf		= rt73usb_get_tsf,	.reset_tsf		= rt73usb_reset_tsf,	.beacon_update		= rt73usb_beacon_update,};static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {	.probe_hw		= rt73usb_probe_hw,	.get_firmware_name	= rt73usb_get_firmware_name,	.load_firmware		= rt73usb_load_firmware,	.initialize		= rt2x00usb_initialize,	.uninitialize		= rt2x00usb_uninitialize,	.set_device_state	= rt73usb_set_device_state,	.link_stats		= rt73usb_link_stats,	.reset_tuner		= rt73usb_reset_tuner,	.link_tuner		= rt73usb_link_tuner,	.write_tx_desc		= rt73usb_write_tx_desc,	.write_tx_data		= rt2x00usb_write_tx_data,	.get_tx_data_len	= rt73usb_get_tx_data_len,	.kick_tx_queue		= rt73usb_kick_tx_queue,	.fill_rxdone		= rt73usb_fill_rxdone,	.config_mac_addr	= rt73usb_config_mac_addr,	.config_bssid		= rt73usb_config_bssid,	.config_type		= rt73usb_config_type,	.config_preamble	= rt73usb_config_preamble,	.config			= rt73usb_config,};static const struct rt2x00_ops rt73usb_ops = {	.name		= DRV_NAME,	.rxd_size	= RXD_DESC_SIZE,	.txd_size	= TXD_DESC_SIZE,	.eeprom_size	= EEPROM_SIZE,	.rf_size	= RF_SIZE,	.lib		= &rt73usb_rt2x00_ops,	.hw		= &rt73usb_mac80211_ops,#ifdef CONFIG_RT2X00_LIB_DEBUGFS	.debugfs	= &rt73usb_rt2x00debug,#endif /* CONFIG_RT2X00_LIB_DEBUGFS */};/* * rt73usb module information. */static struct usb_device_id rt73usb_device_table[] = {	/* AboCom */	{ USB_DEVICE(0x07b8, 0xb21d), USB_DEVICE_DATA(&rt73usb_ops) },	/* Askey */	{ USB_DEVICE(0x1690, 0x0722), USB_DEVICE_DATA(&rt73usb_ops) },	/* ASUS */	{ USB_DEVICE(0x0b05, 0x1723), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x0b05, 0x1724), USB_DEVICE_DATA(&rt73usb_ops) },	/* Belkin */	{ USB_DEVICE(0x050d, 0x7050), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x050d, 0x705a), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x050d, 0x905b), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x050d, 0x905c), USB_DEVICE_DATA(&rt73usb_ops) },	/* Billionton */	{ USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) },	/* Buffalo */	{ USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },	/* CNet */	{ USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) },	/* Conceptronic */	{ USB_DEVICE(0x14b2, 0x3c22), USB_DEVICE_DATA(&rt73usb_ops) },	/* D-Link */	{ USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) },	/* Gemtek */	{ USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) },	/* Gigabyte */	{ USB_DEVICE(0x1044, 0x8008), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x1044, 0x800a), USB_DEVICE_DATA(&rt73usb_ops) },	/* Huawei-3Com */	{ USB_DEVICE(0x1472, 0x0009), USB_DEVICE_DATA(&rt73usb_ops) },	/* Hercules */	{ USB_DEVICE(0x06f8, 0xe010), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x06f8, 0xe020), USB_DEVICE_DATA(&rt73usb_ops) },	/* Linksys */	{ USB_DEVICE(0x13b1, 0x0020), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) },	/* MSI */	{ USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },	/* Ralink */	{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) },	/* Qcom */	{ USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x18e8, 0x6238), USB_DEVICE_DATA(&rt73usb_ops) },	/* Senao */	{ USB_DEVICE(0x1740, 0x7100), USB_DEVICE_DATA(&rt73usb_ops) },	/* Sitecom */	{ USB_DEVICE(0x0df6, 0x9712), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x0df6, 0x90ac), USB_DEVICE_DATA(&rt73usb_ops) },	/* Surecom */	{ USB_DEVICE(0x0769, 0x31f3), USB_DEVICE_DATA(&rt73usb_ops) },	/* Planex */	{ USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },	{ USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) },	{ 0, }};MODULE_AUTHOR(DRV_PROJECT);MODULE_VERSION(DRV_VERSION);MODULE_DESCRIPTION("Ralink RT73 USB Wireless LAN driver.");MODULE_SUPPORTED_DEVICE("Ralink RT2571W & RT2671 USB chipset based cards");MODULE_DEVICE_TABLE(usb, rt73usb_device_table);MODULE_FIRMWARE(FIRMWARE_RT2571);MODULE_LICENSE("GPL");static struct usb_driver rt73usb_driver = {	.name		= DRV_NAME,	.id_table	= rt73usb_device_table,	.probe		= rt2x00usb_probe,	.disconnect	= rt2x00usb_disconnect,	.suspend	= rt2x00usb_suspend,	.resume		= rt2x00usb_resume,};static int __init rt73usb_init(void){	return usb_register(&rt73usb_driver);}static void __exit rt73usb_exit(void){	usb_deregister(&rt73usb_driver);}module_init(rt73usb_init);module_exit(rt73usb_exit);

⌨️ 快捷键说明

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