Allocate the ieee80211_hw structure for each device individually to allow the driver to support multiple devices at the same time.
Signed-off-by Ivo van Doorn <[EMAIL PROTECTED]> diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2400pci.c wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2400pci.c --- wireless-2.6/drivers/net/wireless/rt2x00/rt2400pci.c 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2400pci.c 2006-02-11 22:56:08.000000000 +0100 @@ -1772,29 +1769,6 @@ } /* - * IEEE80211 configuration block. - */ -static struct ieee80211_hw ieee80211_hw = { - .version = IEEE80211_VERSION, - .name = "rt2400pci", - .tx = rt2400pci_tx, - .reset = rt2400pci_reset, - .open = rt2400pci_open, - .stop = rt2400pci_stop, - .config = rt2400pci_config, - .passive_scan = rt2400pci_passive_scan, - .get_stats = rt2400pci_get_stats, - .set_mac_address = rt2400pci_set_mac_address, - .set_retry_limit = rt2400pci_set_retry_limit, - .conf_tx = rt2400pci_conf_tx, - .get_tx_stats = rt2400pci_get_tx_stats, - .get_tsf = rt2400pci_get_tsf, - .reset_tsf = rt2400pci_reset_tsf, - .beacon_update = rt2400pci_beacon_update, - .tx_last_beacon = rt2400pci_tx_last_beacon, -}; - -/* * Device initialization functions. */ static int @@ -1958,24 +1973,48 @@ static int rt2400pci_init_hw(struct rt2x00_pci *rt2x00pci) { - ieee80211_hw.host_gen_beacon = 1; - ieee80211_hw.device_hides_wep = 0; - ieee80211_hw.rx_includes_fcs = 0; - ieee80211_hw.host_broadcast_ps_buffering = 1; - ieee80211_hw.wep_include_iv = 1; - ieee80211_hw.data_nullfunc_ack = 1; - ieee80211_hw.no_tkip_wmm_hwaccel = 1; - ieee80211_hw.extra_hdr_room = 0; - ieee80211_hw.device_strips_mic = 0; - ieee80211_hw.fraglist = 0; + /* + * IEEE80211 Function callbacks. + */ + rt2x00pci->hw.tx = rt2400pci_tx; + rt2x00pci->hw.reset = rt2400pci_reset; + rt2x00pci->hw.open = rt2400pci_open; + rt2x00pci->hw.stop = rt2400pci_stop; + rt2x00pci->hw.config = rt2400pci_config; + rt2x00pci->hw.passive_scan = rt2400pci_passive_scan; + rt2x00pci->hw.get_stats = rt2400pci_get_stats; + rt2x00pci->hw.set_mac_address = rt2400pci_set_mac_address; + rt2x00pci->hw.set_retry_limit = rt2400pci_set_retry_limit; + rt2x00pci->hw.conf_tx = rt2400pci_conf_tx; + rt2x00pci->hw.get_tx_stats = rt2400pci_get_tx_stats; + rt2x00pci->hw.get_tsf = rt2400pci_get_tsf; + rt2x00pci->hw.reset_tsf = rt2400pci_reset_tsf; + rt2x00pci->hw.beacon_update = rt2400pci_beacon_update; + rt2x00pci->hw.tx_last_beacon = rt2400pci_tx_last_beacon; + + /* + * IEEE80211 Variables. + */ + rt2x00pci->hw.version = IEEE80211_VERSION; + rt2x00pci->hw.name = DRV_NAME; + rt2x00pci->hw.host_gen_beacon = 1; + rt2x00pci->hw.device_hides_wep = 0; + rt2x00pci->hw.rx_includes_fcs = 0; + rt2x00pci->hw.host_broadcast_ps_buffering = 1; + rt2x00pci->hw.wep_include_iv = 1; + rt2x00pci->hw.data_nullfunc_ack = 1; + rt2x00pci->hw.no_tkip_wmm_hwaccel = 1; + rt2x00pci->hw.extra_hdr_room = 0; + rt2x00pci->hw.device_strips_mic = 0; + rt2x00pci->hw.fraglist = 0; /* * RF2420 is capable of faster channel switches. */ if(rt2x00_rf(&rt2x00pci->chip, RF2420)) - ieee80211_hw.channel_change_time = 100; + rt2x00pci->hw.channel_change_time = 100; else - ieee80211_hw.channel_change_time = 2500; + rt2x00pci->hw.channel_change_time = 2500; /* * We have 2 TX queues: TX and PRIO. @@ -1984,52 +2023,52 @@ * we can increase performance since we * will have support for high priority TX frames. */ - ieee80211_hw.queues = 2; + rt2x00pci->hw.queues = 2; /* * RT2400 only supports 802.11b. * Allocate memory for 14 OFDM channels and 4 CCK rates. */ - ieee80211_hw.num_modes = 1; - ieee80211_hw.modes = + rt2x00pci->hw.num_modes = 1; + rt2x00pci->hw.modes = kzalloc(sizeof(struct ieee80211_hw_modes), GFP_KERNEL); - if(!ieee80211_hw.modes) + if(!rt2x00pci->hw.modes) goto exit; - ieee80211_hw.modes->num_channels = 14; - ieee80211_hw.modes->channels = + rt2x00pci->hw.modes->num_channels = 14; + rt2x00pci->hw.modes->channels = kzalloc(sizeof(struct ieee80211_channel) * 14, GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00pci->hw.modes->channels) goto exit_free_modes; - ieee80211_hw.modes->num_rates = 4; - ieee80211_hw.modes->rates = + rt2x00pci->hw.modes->num_rates = 4; + rt2x00pci->hw.modes->rates = kzalloc(sizeof(struct ieee80211_rate) * 4, GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00pci->hw.modes->channels) goto exit_free_channels; /* * Initialize modes. */ - ieee80211_hw.modes->mode = MODE_IEEE80211B; + rt2x00pci->hw.modes->mode = MODE_IEEE80211B; - rt2400pci_init_hw_channels(rt2x00pci, ieee80211_hw.modes->channels); - rt2400pci_init_hw_rates(rt2x00pci, ieee80211_hw.modes->rates); + rt2400pci_init_hw_channels(rt2x00pci, rt2x00pci->hw.modes->channels); + rt2400pci_init_hw_rates(rt2x00pci, rt2x00pci->hw.modes->rates); /* * xr_end is only used on Atheros cards. */ - ieee80211_hw.modes->xr_end = 0; + rt2x00pci->hw.modes->xr_end = 0; return 0; exit_free_channels: - kfree(ieee80211_hw.modes->channels); - ieee80211_hw.modes->channels = NULL; + kfree(rt2x00pci->hw.modes->channels); + rt2x00pci->hw.modes->channels = NULL; exit_free_modes: - kfree(ieee80211_hw.modes); - ieee80211_hw.modes = NULL; + kfree(rt2x00pci->hw.modes); + rt2x00pci->hw.modes = NULL; exit: ERROR("Allocation ieee80211 modes failed.\n"); @@ -2131,13 +2170,13 @@ rt2x00pci->workqueue = NULL; } - if(likely(ieee80211_hw.modes)){ - if(likely(ieee80211_hw.modes->channels)) - kfree(ieee80211_hw.modes->channels); - if(likely(ieee80211_hw.modes->rates)) - kfree(ieee80211_hw.modes->rates); - kfree(ieee80211_hw.modes); - ieee80211_hw.modes = NULL; + if(likely(rt2x00pci->hw.modes)){ + if(likely(rt2x00pci->hw.modes->channels)) + kfree(rt2x00pci->hw.modes->channels); + if(likely(rt2x00pci->hw.modes->rates)) + kfree(rt2x00pci->hw.modes->rates); + kfree(rt2x00pci->hw.modes); + rt2x00pci->hw.modes = NULL; } } @@ -2148,6 +2187,7 @@ rt2400pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) { struct net_device *net_dev = NULL; + struct rt2x00_pci *rt2x00pci = NULL; int status = 0; if(unlikely(id->driver_data != RT2460)){ @@ -2192,8 +2232,9 @@ ERROR("Failed to initialize device.\n"); goto exit_free_device; } + rt2x00pci = ieee80211_dev_hw_data(net_dev); - status = ieee80211_register_hw(net_dev, &ieee80211_hw); + status = ieee80211_register_hw(net_dev, &rt2x00pci->hw); if(status){ ERROR("Failed to register device.\n"); goto exit_uninitialize_device; diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2400pci.h wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2400pci.h --- wireless-2.6/drivers/net/wireless/rt2x00/rt2400pci.h 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2400pci.h 2006-02-11 12:34:11.000000000 +0100 @@ -732,6 +732,14 @@ #define EEPROM_BBP_REG_ID FIELD16(0xff00) /* + * EEPROM TXPOWER + */ +#define EEPROM_TXPOWER_START 0x13 +#define EEPROM_TXPOWER_SIZE 7 +#define EEPROM_TXPOWER_1 FIELD16(0x00ff) +#define EEPROM_TXPOWER_2 FIELD16(0xff00) + +/* * DMA ring defines and data structures. */ @@ -891,11 +899,22 @@ struct pci_dev *pci_dev; /* + * IEEE80211 Configuration block. + */ + struct ieee80211_hw hw; + + /* * Chipset identification. */ struct _rt2x00_chip chip; /* + * RF values for channel switching. + */ + u32 rf1; + u32 rf3; + + /* * csr_addr * Base address of device registers. */ diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2500pci.c wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500pci.c --- wireless-2.6/drivers/net/wireless/rt2x00/rt2500pci.c 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500pci.c 2006-02-11 22:56:28.000000000 +0100 @@ -1837,29 +1820,6 @@ } /* - * IEEE80211 configuration block. - */ -static struct ieee80211_hw ieee80211_hw = { - .version = IEEE80211_VERSION, - .name = "rt2500pci", - .tx = rt2500pci_tx, - .reset = rt2500pci_reset, - .open = rt2500pci_open, - .stop = rt2500pci_stop, - .config = rt2500pci_config, - .passive_scan = rt2500pci_passive_scan, - .get_stats = rt2500pci_get_stats, - .set_mac_address = rt2500pci_set_mac_address, - .set_retry_limit = rt2500pci_set_retry_limit, - .conf_tx = rt2500pci_conf_tx, - .get_tx_stats = rt2500pci_get_tx_stats, - .get_tsf = rt2500pci_get_tsf, - .reset_tsf = rt2500pci_reset_tsf, - .beacon_update = rt2500pci_beacon_update, - .tx_last_beacon = rt2500pci_tx_last_beacon, -}; - -/* * Device initialization functions. */ static int @@ -2187,17 +2189,41 @@ static int rt2500pci_init_hw(struct rt2x00_pci *rt2x00pci) { - ieee80211_hw.host_gen_beacon = 1; - ieee80211_hw.device_hides_wep = 0; - ieee80211_hw.rx_includes_fcs = 0; - ieee80211_hw.host_broadcast_ps_buffering = 1; - ieee80211_hw.wep_include_iv = 1; - ieee80211_hw.data_nullfunc_ack = 1; - ieee80211_hw.no_tkip_wmm_hwaccel = 1; - ieee80211_hw.extra_hdr_room = 0; - ieee80211_hw.device_strips_mic = 0; - ieee80211_hw.fraglist = 0; - ieee80211_hw.channel_change_time = 2500; + /* + * IEEE80211 Function callbacks. + */ + rt2x00pci->hw.tx = rt2500pci_tx; + rt2x00pci->hw.reset = rt2500pci_reset; + rt2x00pci->hw.open = rt2500pci_open; + rt2x00pci->hw.stop = rt2500pci_stop; + rt2x00pci->hw.config = rt2500pci_config; + rt2x00pci->hw.passive_scan = rt2500pci_passive_scan; + rt2x00pci->hw.get_stats = rt2500pci_get_stats; + rt2x00pci->hw.set_mac_address = rt2500pci_set_mac_address; + rt2x00pci->hw.set_retry_limit = rt2500pci_set_retry_limit; + rt2x00pci->hw.conf_tx = rt2500pci_conf_tx; + rt2x00pci->hw.get_tx_stats = rt2500pci_get_tx_stats; + rt2x00pci->hw.get_tsf = rt2500pci_get_tsf; + rt2x00pci->hw.reset_tsf = rt2500pci_reset_tsf; + rt2x00pci->hw.beacon_update = rt2500pci_beacon_update; + rt2x00pci->hw.tx_last_beacon = rt2500pci_tx_last_beacon; + + /* + * IEEE80211 Variables. + */ + rt2x00pci->hw.version = IEEE80211_VERSION; + rt2x00pci->hw.name = DRV_NAME; + rt2x00pci->hw.host_gen_beacon = 1; + rt2x00pci->hw.device_hides_wep = 0; + rt2x00pci->hw.rx_includes_fcs = 0; + rt2x00pci->hw.host_broadcast_ps_buffering = 1; + rt2x00pci->hw.wep_include_iv = 1; + rt2x00pci->hw.data_nullfunc_ack = 1; + rt2x00pci->hw.no_tkip_wmm_hwaccel = 1; + rt2x00pci->hw.extra_hdr_room = 0; + rt2x00pci->hw.device_strips_mic = 0; + rt2x00pci->hw.fraglist = 0; + rt2x00pci->hw.channel_change_time = 2500; /* * We have 2 TX queues: TX and PRIO. @@ -2206,7 +2232,7 @@ * we can increase performance since we * will have support for high priority TX frames. */ - ieee80211_hw.queues = 2; + rt2x00pci->hw.queues = 2; /* * RT2500 only supports 802.11b & 802.11g, @@ -2216,42 +2242,42 @@ * additional 23 5.2GHz channels. */ if(!rt2x00_rf(&rt2x00pci->chip, RF5222)){ - ieee80211_hw.num_modes = 2; - ieee80211_hw.modes = + rt2x00pci->hw.num_modes = 2; + rt2x00pci->hw.modes = kzalloc((sizeof(struct ieee80211_hw_modes) * 2), GFP_KERNEL); - if(!ieee80211_hw.modes) + if(!rt2x00pci->hw.modes) goto exit; - ieee80211_hw.modes->channels = + rt2x00pci->hw.modes->channels = kzalloc((sizeof(struct ieee80211_channel) * 14), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00pci->hw.modes->channels) goto exit_free_modes; - ieee80211_hw.modes->rates = + rt2x00pci->hw.modes->rates = kzalloc((sizeof(struct ieee80211_rate) * 12), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00pci->hw.modes->channels) goto exit_free_channels; }else{ - ieee80211_hw.num_modes = 3; - ieee80211_hw.modes = + rt2x00pci->hw.num_modes = 3; + rt2x00pci->hw.modes = kzalloc((sizeof(struct ieee80211_hw_modes) * 3), GFP_KERNEL); - if(!ieee80211_hw.modes) + if(!rt2x00pci->hw.modes) goto exit; - ieee80211_hw.modes->channels = + rt2x00pci->hw.modes->channels = kzalloc((sizeof(struct ieee80211_channel) * 37), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00pci->hw.modes->channels) goto exit_free_modes; - ieee80211_hw.modes->rates = + rt2x00pci->hw.modes->rates = kzalloc((sizeof(struct ieee80211_rate) * 12), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00pci->hw.modes->channels) goto exit_free_channels; } @@ -2260,22 +2286,22 @@ * Rates: CCK. * Channels: OFDM. */ - ieee80211_hw.modes[0].mode = MODE_IEEE80211B; - ieee80211_hw.modes[0].num_channels = 14; - ieee80211_hw.modes[0].num_rates = 4; + rt2x00pci->hw.modes[0].mode = MODE_IEEE80211B; + rt2x00pci->hw.modes[0].num_channels = 14; + rt2x00pci->hw.modes[0].num_rates = 4; /* * Intitialize 802.11g * Rates: CCK, OFDM. * Channels: OFDM. */ - ieee80211_hw.modes[1].mode = MODE_IEEE80211G; - ieee80211_hw.modes[1].num_channels = 14; - ieee80211_hw.modes[1].num_rates = 12; - ieee80211_hw.modes[1].channels = - ieee80211_hw.modes[0].channels; - ieee80211_hw.modes[1].rates = - ieee80211_hw.modes[0].rates; + rt2x00pci->hw.modes[1].mode = MODE_IEEE80211G; + rt2x00pci->hw.modes[1].num_channels = 14; + rt2x00pci->hw.modes[1].num_rates = 12; + rt2x00pci->hw.modes[1].channels = + rt2x00pci->hw.modes[0].channels; + rt2x00pci->hw.modes[1].rates = + rt2x00pci->hw.modes[0].rates; /* * Intitialize 802.11a @@ -2283,32 +2309,32 @@ * Channels: OFDM, UNII, HiperLAN2. */ if(rt2x00_rf(&rt2x00pci->chip, RF5222)){ - ieee80211_hw.modes[2].mode = MODE_IEEE80211A; - ieee80211_hw.modes[2].num_channels = 37; - ieee80211_hw.modes[2].num_rates = 8; - ieee80211_hw.modes[2].channels = - &ieee80211_hw.modes[0].channels[14]; - ieee80211_hw.modes[2].rates = - &ieee80211_hw.modes[0].rates[4]; + rt2x00pci->hw.modes[2].mode = MODE_IEEE80211A; + rt2x00pci->hw.modes[2].num_channels = 37; + rt2x00pci->hw.modes[2].num_rates = 8; + rt2x00pci->hw.modes[2].channels = + &rt2x00pci->hw.modes[0].channels[14]; + rt2x00pci->hw.modes[2].rates = + &rt2x00pci->hw.modes[0].rates[4]; } - rt2500pci_init_hw_channels(rt2x00pci, ieee80211_hw.modes[0].channels); - rt2500pci_init_hw_rates(rt2x00pci, ieee80211_hw.modes[0].rates); + rt2500pci_init_hw_channels(rt2x00pci, rt2x00pci->hw.modes[0].channels); + rt2500pci_init_hw_rates(rt2x00pci, rt2x00pci->hw.modes[0].rates); /* * xr_end is only used on Atheros cards. */ - ieee80211_hw.modes->xr_end = 0; + rt2x00pci->hw.modes->xr_end = 0; return 0; exit_free_channels: - kfree(ieee80211_hw.modes->channels); - ieee80211_hw.modes->channels = NULL; + kfree(rt2x00pci->hw.modes->channels); + rt2x00pci->hw.modes->channels = NULL; exit_free_modes: - kfree(ieee80211_hw.modes); - ieee80211_hw.modes = NULL; + kfree(rt2x00pci->hw.modes); + rt2x00pci->hw.modes = NULL; exit: ERROR("Allocation ieee80211 modes failed.\n"); @@ -2410,9 +2436,9 @@ rt2x00pci->workqueue = NULL; } - if(likely(ieee80211_hw.modes)){ - kfree(ieee80211_hw.modes); - ieee80211_hw.modes = NULL; + if(likely(rt2x00pci->hw.modes)){ + kfree(rt2x00pci->hw.modes); + rt2x00pci->hw.modes = NULL; } } @@ -2423,6 +2449,7 @@ rt2500pci_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) { struct net_device *net_dev = NULL; + struct rt2x00_pci *rt2x00pci = NULL; int status = 0; if(unlikely(id->driver_data != RT2560)){ @@ -2467,8 +2494,9 @@ ERROR("Failed to initialize device.\n"); goto exit_free_device; } + rt2x00pci = ieee80211_dev_hw_data(net_dev); - status = ieee80211_register_hw(net_dev, &ieee80211_hw); + status = ieee80211_register_hw(net_dev, &rt2x00pci->hw); if(status){ ERROR("Failed to register device.\n"); goto exit_uninitialize_device; diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2500pci.h wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500pci.h --- wireless-2.6/drivers/net/wireless/rt2x00/rt2500pci.h 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500pci.h 2006-02-11 12:33:52.000000000 +0100 @@ -961,6 +961,14 @@ #define EEPROM_BBP_REG_ID FIELD16(0xff00) /* + * EEPROM TXPOWER + */ +#define EEPROM_TXPOWER_START 0x23 +#define EEPROM_TXPOWER_SIZE 7 +#define EEPROM_TXPOWER_1 FIELD16(0x00ff) +#define EEPROM_TXPOWER_2 FIELD16(0xff00) + +/* * DMA ring defines and data structures. */ @@ -1141,11 +1149,23 @@ struct pci_dev *pci_dev; /* + * IEEE80211 Configuration block. + */ + struct ieee80211_hw hw; + + /* * Chipset identification. */ struct _rt2x00_chip chip; /* + * RF values for channel switching. + */ + u32 rf1; + u32 rf3; + u32 rf4; + + /* * csr_addr * Base address of device registers. */ diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2500usb.c wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500usb.c --- wireless-2.6/drivers/net/wireless/rt2x00/rt2500usb.c 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500usb.c 2006-02-11 22:56:01.000000000 +0100 @@ -1552,26 +1539,6 @@ } /* - * IEEE80211 configuration block. - */ -static struct ieee80211_hw ieee80211_hw = { - .version = IEEE80211_VERSION, - .name = "rt2x00usb", - .tx = rt2500usb_tx, - .reset = rt2500usb_reset, - .open = rt2500usb_open, - .stop = rt2500usb_stop, - .config = rt2500usb_config, - .passive_scan = rt2500usb_passive_scan, - .get_stats = rt2500usb_get_stats, - .set_mac_address = rt2500usb_set_mac_address, - .conf_tx = rt2500usb_conf_tx, - .get_tx_stats = rt2500usb_get_tx_stats, - .reset_tsf = rt2500usb_reset_tsf, - .beacon_update = rt2500usb_beacon_update, -}; - -/* * Device initialization functions. */ static int @@ -1881,17 +1897,38 @@ static int rt2500usb_init_hw(struct rt2x00_usb *rt2x00usb) { - ieee80211_hw.host_gen_beacon = 1; - ieee80211_hw.device_hides_wep = 0; - ieee80211_hw.rx_includes_fcs = 0; - ieee80211_hw.host_broadcast_ps_buffering = 1; - ieee80211_hw.wep_include_iv = 1; - ieee80211_hw.data_nullfunc_ack = 1; - ieee80211_hw.no_tkip_wmm_hwaccel = 1; - ieee80211_hw.extra_hdr_room = 0; - ieee80211_hw.device_strips_mic = 0; - ieee80211_hw.fraglist = 0; - ieee80211_hw.channel_change_time = 500; + /* + * IEEE80211 Function callbacks. + */ + rt2x00usb->hw.tx = rt2500usb_tx; + rt2x00usb->hw.reset = rt2500usb_reset; + rt2x00usb->hw.open = rt2500usb_open; + rt2x00usb->hw.stop = rt2500usb_stop; + rt2x00usb->hw.config = rt2500usb_config; + rt2x00usb->hw.passive_scan = rt2500usb_passive_scan; + rt2x00usb->hw.get_stats = rt2500usb_get_stats; + rt2x00usb->hw.set_mac_address = rt2500usb_set_mac_address; + rt2x00usb->hw.conf_tx = rt2500usb_conf_tx; + rt2x00usb->hw.get_tx_stats = rt2500usb_get_tx_stats; + rt2x00usb->hw.reset_tsf = rt2500usb_reset_tsf; + rt2x00usb->hw.beacon_update = rt2500usb_beacon_update; + + /* + * IEEE80211 Variables. + */ + rt2x00usb->hw.version = IEEE80211_VERSION; + rt2x00usb->hw.name = DRV_NAME; + rt2x00usb->hw.host_gen_beacon = 1; + rt2x00usb->hw.device_hides_wep = 0; + rt2x00usb->hw.rx_includes_fcs = 0; + rt2x00usb->hw.host_broadcast_ps_buffering = 1; + rt2x00usb->hw.wep_include_iv = 1; + rt2x00usb->hw.data_nullfunc_ack = 1; + rt2x00usb->hw.no_tkip_wmm_hwaccel = 1; + rt2x00usb->hw.extra_hdr_room = 0; + rt2x00usb->hw.device_strips_mic = 0; + rt2x00usb->hw.fraglist = 0; + rt2x00usb->hw.channel_change_time = 500; /* * We have 2 TX queues: TX and PRIO. @@ -1900,7 +1937,7 @@ * we can increase performance since we * will have support for high priority TX frames. */ - ieee80211_hw.queues = 2; + rt2x00usb->hw.queues = 2; /* * RT2500 only supports 802.11b & 802.11g, @@ -1910,42 +1947,42 @@ * additional 23 5.2GHz channels. */ if(!rt2x00_rf(&rt2x00usb->chip, RF5222)){ - ieee80211_hw.num_modes = 2; - ieee80211_hw.modes = + rt2x00usb->hw.num_modes = 2; + rt2x00usb->hw.modes = kzalloc((sizeof(struct ieee80211_hw_modes) * 2), GFP_KERNEL); - if(!ieee80211_hw.modes) + if(!rt2x00usb->hw.modes) goto exit; - ieee80211_hw.modes->channels = + rt2x00usb->hw.modes->channels = kzalloc((sizeof(struct ieee80211_channel) * 14), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00usb->hw.modes->channels) goto exit_free_modes; - ieee80211_hw.modes->rates = + rt2x00usb->hw.modes->rates = kzalloc((sizeof(struct ieee80211_rate) * 12), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00usb->hw.modes->channels) goto exit_free_channels; }else{ - ieee80211_hw.num_modes = 3; - ieee80211_hw.modes = + rt2x00usb->hw.num_modes = 3; + rt2x00usb->hw.modes = kzalloc((sizeof(struct ieee80211_hw_modes) * 3), GFP_KERNEL); - if(!ieee80211_hw.modes) + if(!rt2x00usb->hw.modes) goto exit; - ieee80211_hw.modes->channels = + rt2x00usb->hw.modes->channels = kzalloc((sizeof(struct ieee80211_channel) * 37), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00usb->hw.modes->channels) goto exit_free_modes; - ieee80211_hw.modes->rates = + rt2x00usb->hw.modes->rates = kzalloc((sizeof(struct ieee80211_rate) * 12), GFP_KERNEL); - if(!ieee80211_hw.modes->channels) + if(!rt2x00usb->hw.modes->channels) goto exit_free_channels; } @@ -1954,22 +1991,22 @@ * Rates: CCK. * Channels: OFDM. */ - ieee80211_hw.modes[0].mode = MODE_IEEE80211B; - ieee80211_hw.modes[0].num_channels = 14; - ieee80211_hw.modes[0].num_rates = 4; + rt2x00usb->hw.modes[0].mode = MODE_IEEE80211B; + rt2x00usb->hw.modes[0].num_channels = 14; + rt2x00usb->hw.modes[0].num_rates = 4; /* * Intitialize 802.11g * Rates: CCK, OFDM. * Channels: OFDM. */ - ieee80211_hw.modes[1].mode = MODE_IEEE80211G; - ieee80211_hw.modes[1].num_channels = 14; - ieee80211_hw.modes[1].num_rates = 12; - ieee80211_hw.modes[1].channels = - ieee80211_hw.modes[0].channels; - ieee80211_hw.modes[1].rates = - ieee80211_hw.modes[0].rates; + rt2x00usb->hw.modes[1].mode = MODE_IEEE80211G; + rt2x00usb->hw.modes[1].num_channels = 14; + rt2x00usb->hw.modes[1].num_rates = 12; + rt2x00usb->hw.modes[1].channels = + rt2x00usb->hw.modes[0].channels; + rt2x00usb->hw.modes[1].rates = + rt2x00usb->hw.modes[0].rates; /* * Intitialize 802.11a @@ -1977,32 +2014,32 @@ * Channels: OFDM, UNII, HiperLAN2. */ if(rt2x00_rf(&rt2x00usb->chip, RF5222)){ - ieee80211_hw.modes[2].mode = MODE_IEEE80211A; - ieee80211_hw.modes[2].num_channels = 37; - ieee80211_hw.modes[2].num_rates = 8; - ieee80211_hw.modes[2].channels = - &ieee80211_hw.modes[0].channels[14]; - ieee80211_hw.modes[2].rates = - &ieee80211_hw.modes[0].rates[4]; + rt2x00usb->hw.modes[2].mode = MODE_IEEE80211A; + rt2x00usb->hw.modes[2].num_channels = 37; + rt2x00usb->hw.modes[2].num_rates = 8; + rt2x00usb->hw.modes[2].channels = + &rt2x00usb->hw.modes[0].channels[14]; + rt2x00usb->hw.modes[2].rates = + &rt2x00usb->hw.modes[0].rates[4]; } - rt2500usb_init_hw_channels(rt2x00usb, ieee80211_hw.modes[0].channels); - rt2500usb_init_hw_rates(rt2x00usb, ieee80211_hw.modes[0].rates); + rt2500usb_init_hw_channels(rt2x00usb, rt2x00usb->hw.modes[0].channels); + rt2500usb_init_hw_rates(rt2x00usb, rt2x00usb->hw.modes[0].rates); /* * xr_end is only used on Atheros cards. */ - ieee80211_hw.modes->xr_end = 0; + rt2x00usb->hw.modes->xr_end = 0; return 0; exit_free_channels: - kfree(ieee80211_hw.modes->channels); - ieee80211_hw.modes->channels = NULL; + kfree(rt2x00usb->hw.modes->channels); + rt2x00usb->hw.modes->channels = NULL; exit_free_modes: - kfree(ieee80211_hw.modes); - ieee80211_hw.modes = NULL; + kfree(rt2x00usb->hw.modes); + rt2x00usb->hw.modes = NULL; exit: ERROR("Allocation ieee80211 modes failed.\n"); @@ -2058,9 +2095,9 @@ rt2x00usb->workqueue = NULL; } - if(likely(ieee80211_hw.modes)){ - kfree(ieee80211_hw.modes); - ieee80211_hw.modes = NULL; + if(likely(rt2x00usb->hw.modes)){ + kfree(rt2x00usb->hw.modes); + rt2x00usb->hw.modes = NULL; } } @@ -2072,6 +2109,7 @@ { struct usb_device *usb_dev = interface_to_usbdev(usb_intf); struct net_device *net_dev = NULL; + struct rt2x00_usb *rt2x00usb = NULL; int status = 0; if(unlikely(id->driver_info != RT2570)){ @@ -2095,8 +2133,9 @@ ERROR("Failed to initialize device.\n"); goto exit_free_device; } + rt2x00usb = ieee80211_dev_hw_data(net_dev); - status = ieee80211_register_hw(net_dev, &ieee80211_hw); + status = ieee80211_register_hw(net_dev, &rt2x00usb->hw); if(status){ ERROR("Failed to register device.\n"); goto exit_uninitialize_device; diff -U 3 -H -w -E -d -r -N -- wireless-2.6/drivers/net/wireless/rt2x00/rt2500usb.h wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500usb.h --- wireless-2.6/drivers/net/wireless/rt2x00/rt2500usb.h 2006-02-09 20:35:21.000000000 +0100 +++ wireless-2.6-rt2x00/drivers/net/wireless/rt2x00/rt2500usb.h 2006-02-11 12:20:07.000000000 +0100 @@ -139,8 +139,8 @@ #define MAC_CSR17_SET_STATE FIELD16(0x0001) #define MAC_CSR17_BBP_DESIRE_STATE FIELD16(0x0006) #define MAC_CSR17_RF_DESIRE_STATE FIELD16(0x0018) -#define MAC_CSR17_BBP_CURRENT_STATE FIELD16(0x0060) -#define MAC_CSR17_RF_CURRENT_STATE FIELD16(0x0180) +#define MAC_CSR17_BBP_CURR_STATE FIELD16(0x0060) +#define MAC_CSR17_RF_CURR_STATE FIELD16(0x0180) #define MAC_CSR17_PUT_TO_SLEEP FIELD16(0x0200) /* @@ -506,6 +506,14 @@ #define EEPROM_BBP_REG_ID FIELD16(0xff00) /* + * EEPROM TXPOWER + */ +#define EEPROM_TXPOWER_START 0x3c +#define EEPROM_TXPOWER_SIZE 7 +#define EEPROM_TXPOWER_1 FIELD16(0x00ff) +#define EEPROM_TXPOWER_2 FIELD16(0xff00) + +/* * USB request types. */ #define USB_VENDOR_REQUEST ( USB_TYPE_VENDOR | USB_RECIP_DEVICE ) @@ -652,11 +660,23 @@ struct usb_interface *usb_intf; /* + * IEEE80211 Configuration block. + */ + struct ieee80211_hw hw; + + /* * Chipset identification. */ struct _rt2x00_chip chip; /* + * RF values for channel switching. + */ + u32 rf1; + u32 rf3; + u32 rf4; + + /* * Queue for deferred interrupt work. */ struct workqueue_struct *workqueue;
pgpL0RIky5I5p.pgp
Description: PGP signature