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-12
12:51:28.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 +1963,50 @@
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;
+ struct ieee80211_hw *hw = &rt2x00pci->hw;
+
+ /*
+ * IEEE80211 Function callbacks.
+ */
+ hw->tx = rt2400pci_tx;
+ hw->reset = rt2400pci_reset;
+ hw->open = rt2400pci_open;
+ hw->stop = rt2400pci_stop;
+ hw->config = rt2400pci_config;
+ hw->passive_scan = rt2400pci_passive_scan;
+ hw->get_stats = rt2400pci_get_stats;
+ hw->set_mac_address = rt2400pci_set_mac_address;
+ hw->set_retry_limit = rt2400pci_set_retry_limit;
+ hw->conf_tx = rt2400pci_conf_tx;
+ hw->get_tx_stats = rt2400pci_get_tx_stats;
+ hw->get_tsf = rt2400pci_get_tsf;
+ hw->reset_tsf = rt2400pci_reset_tsf;
+ hw->beacon_update = rt2400pci_beacon_update;
+ hw->tx_last_beacon = rt2400pci_tx_last_beacon;
+
+ /*
+ * IEEE80211 Variables.
+ */
+ hw->version = IEEE80211_VERSION;
+ hw->name = DRV_NAME;
+ hw->host_gen_beacon = 1;
+ hw->device_hides_wep = 0;
+ hw->rx_includes_fcs = 0;
+ hw->host_broadcast_ps_buffering = 1;
+ hw->wep_include_iv = 1;
+ hw->data_nullfunc_ack = 1;
+ hw->no_tkip_wmm_hwaccel = 1;
+ hw->extra_hdr_room = 0;
+ hw->device_strips_mic = 0;
+ hw->fraglist = 0;
/*
* RF2420 is capable of faster channel switches.
*/
if(rt2x00_rf(&rt2x00pci->chip, RF2420))
- ieee80211_hw.channel_change_time = 100;
+ hw->channel_change_time = 100;
else
- ieee80211_hw.channel_change_time = 2500;
+ hw->channel_change_time = 2500;
/*
* We have 2 TX queues: TX and PRIO.
@@ -1984,52 +2015,52 @@
* we can increase performance since we
* will have support for high priority TX frames.
*/
- ieee80211_hw.queues = 2;
+ 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 =
+ hw->num_modes = 1;
+ hw->modes =
kzalloc(sizeof(struct ieee80211_hw_modes), GFP_KERNEL);
- if(!ieee80211_hw.modes)
+ if(!hw->modes)
goto exit;
- ieee80211_hw.modes->num_channels = 14;
- ieee80211_hw.modes->channels =
+ hw->modes->num_channels = 14;
+ hw->modes->channels =
kzalloc(sizeof(struct ieee80211_channel) * 14, GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_modes;
- ieee80211_hw.modes->num_rates = 4;
- ieee80211_hw.modes->rates =
+ hw->modes->num_rates = 4;
+ hw->modes->rates =
kzalloc(sizeof(struct ieee80211_rate) * 4, GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_channels;
/*
* Initialize modes.
*/
- ieee80211_hw.modes->mode = MODE_IEEE80211B;
+ 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, hw->modes->channels);
+ rt2400pci_init_hw_rates(rt2x00pci, hw->modes->rates);
/*
* xr_end is only used on Atheros cards.
*/
- ieee80211_hw.modes->xr_end = 0;
+ hw->modes->xr_end = 0;
return 0;
exit_free_channels:
- kfree(ieee80211_hw.modes->channels);
- ieee80211_hw.modes->channels = NULL;
+ kfree(hw->modes->channels);
+ hw->modes->channels = NULL;
exit_free_modes:
- kfree(ieee80211_hw.modes);
- ieee80211_hw.modes = NULL;
+ kfree(hw->modes);
+ hw->modes = NULL;
exit:
ERROR("Allocation ieee80211 modes failed.\n");
@@ -2131,13 +2162,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 +2179,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 +2224,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-12
12:51:37.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 +2157,43 @@
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;
+ struct ieee80211_hw *hw = &rt2x00pci->hw;
+
+ /*
+ * IEEE80211 Function callbacks.
+ */
+ hw->tx = rt2500pci_tx;
+ hw->reset = rt2500pci_reset;
+ hw->open = rt2500pci_open;
+ hw->stop = rt2500pci_stop;
+ hw->config = rt2500pci_config;
+ hw->passive_scan = rt2500pci_passive_scan;
+ hw->get_stats = rt2500pci_get_stats;
+ hw->set_mac_address = rt2500pci_set_mac_address;
+ hw->set_retry_limit = rt2500pci_set_retry_limit;
+ hw->conf_tx = rt2500pci_conf_tx;
+ hw->get_tx_stats = rt2500pci_get_tx_stats;
+ hw->get_tsf = rt2500pci_get_tsf;
+ hw->reset_tsf = rt2500pci_reset_tsf;
+ hw->beacon_update = rt2500pci_beacon_update;
+ hw->tx_last_beacon = rt2500pci_tx_last_beacon;
+
+ /*
+ * IEEE80211 Variables.
+ */
+ hw->version = IEEE80211_VERSION;
+ hw->name = DRV_NAME;
+ hw->host_gen_beacon = 1;
+ hw->device_hides_wep = 0;
+ hw->rx_includes_fcs = 0;
+ hw->host_broadcast_ps_buffering = 1;
+ hw->wep_include_iv = 1;
+ hw->data_nullfunc_ack = 1;
+ hw->no_tkip_wmm_hwaccel = 1;
+ hw->extra_hdr_room = 0;
+ hw->device_strips_mic = 0;
+ hw->fraglist = 0;
+ hw->channel_change_time = 2500;
/*
* We have 2 TX queues: TX and PRIO.
@@ -2206,7 +2202,7 @@
* we can increase performance since we
* will have support for high priority TX frames.
*/
- ieee80211_hw.queues = 2;
+ hw->queues = 2;
/*
* RT2500 only supports 802.11b & 802.11g,
@@ -2216,42 +2212,42 @@
* additional 23 5.2GHz channels.
*/
if(!rt2x00_rf(&rt2x00pci->chip, RF5222)){
- ieee80211_hw.num_modes = 2;
- ieee80211_hw.modes =
+ hw->num_modes = 2;
+ hw->modes =
kzalloc((sizeof(struct ieee80211_hw_modes) * 2),
GFP_KERNEL);
- if(!ieee80211_hw.modes)
+ if(!hw->modes)
goto exit;
- ieee80211_hw.modes->channels =
+ hw->modes->channels =
kzalloc((sizeof(struct ieee80211_channel) * 14),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_modes;
- ieee80211_hw.modes->rates =
+ hw->modes->rates =
kzalloc((sizeof(struct ieee80211_rate) * 12),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_channels;
}else{
- ieee80211_hw.num_modes = 3;
- ieee80211_hw.modes =
+ hw->num_modes = 3;
+ hw->modes =
kzalloc((sizeof(struct ieee80211_hw_modes) * 3),
GFP_KERNEL);
- if(!ieee80211_hw.modes)
+ if(!hw->modes)
goto exit;
- ieee80211_hw.modes->channels =
+ hw->modes->channels =
kzalloc((sizeof(struct ieee80211_channel) * 37),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_modes;
- ieee80211_hw.modes->rates =
+ hw->modes->rates =
kzalloc((sizeof(struct ieee80211_rate) * 12),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_channels;
}
@@ -2260,22 +2256,20 @@
* 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;
+ hw->modes[0].mode = MODE_IEEE80211B;
+ hw->modes[0].num_channels = 14;
+ 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;
+ hw->modes[1].mode = MODE_IEEE80211G;
+ hw->modes[1].num_channels = 14;
+ hw->modes[1].num_rates = 12;
+ hw->modes[1].channels = hw->modes[0].channels;
+ hw->modes[1].rates = hw->modes[0].rates;
/*
* Intitialize 802.11a
@@ -2283,32 +2277,30 @@
* 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];
+ hw->modes[2].mode = MODE_IEEE80211A;
+ hw->modes[2].num_channels = 37;
+ hw->modes[2].num_rates = 8;
+ hw->modes[2].channels = &hw->modes[0].channels[14];
+ hw->modes[2].rates = &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, hw->modes[0].channels);
+ rt2500pci_init_hw_rates(rt2x00pci, hw->modes[0].rates);
/*
* xr_end is only used on Atheros cards.
*/
- ieee80211_hw.modes->xr_end = 0;
+ hw->modes->xr_end = 0;
return 0;
exit_free_channels:
- kfree(ieee80211_hw.modes->channels);
- ieee80211_hw.modes->channels = NULL;
+ kfree(hw->modes->channels);
+ hw->modes->channels = NULL;
exit_free_modes:
- kfree(ieee80211_hw.modes);
- ieee80211_hw.modes = NULL;
+ kfree(hw->modes);
+ hw->modes = NULL;
exit:
ERROR("Allocation ieee80211 modes failed.\n");
@@ -2410,9 +2402,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 +2415,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 +2460,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-12
12:51:43.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 +1851,40 @@
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;
+ struct ieee80211_hw *hw = &rt2x00usb->hw;
+
+ /*
+ * IEEE80211 Function callbacks.
+ */
+ hw->tx = rt2500usb_tx;
+ hw->reset = rt2500usb_reset;
+ hw->open = rt2500usb_open;
+ hw->stop = rt2500usb_stop;
+ hw->config = rt2500usb_config;
+ hw->passive_scan = rt2500usb_passive_scan;
+ hw->get_stats = rt2500usb_get_stats;
+ hw->set_mac_address = rt2500usb_set_mac_address;
+ hw->conf_tx = rt2500usb_conf_tx;
+ hw->get_tx_stats = rt2500usb_get_tx_stats;
+ hw->reset_tsf = rt2500usb_reset_tsf;
+ hw->beacon_update = rt2500usb_beacon_update;
+
+ /*
+ * IEEE80211 Variables.
+ */
+ hw->version = IEEE80211_VERSION;
+ hw->name = DRV_NAME;
+ hw->host_gen_beacon = 1;
+ hw->device_hides_wep = 0;
+ hw->rx_includes_fcs = 0;
+ hw->host_broadcast_ps_buffering = 1;
+ hw->wep_include_iv = 1;
+ hw->data_nullfunc_ack = 1;
+ hw->no_tkip_wmm_hwaccel = 1;
+ hw->extra_hdr_room = 0;
+ hw->device_strips_mic = 0;
+ hw->fraglist = 0;
+ hw->channel_change_time = 500;
/*
* We have 2 TX queues: TX and PRIO.
@@ -1900,7 +1893,7 @@
* we can increase performance since we
* will have support for high priority TX frames.
*/
- ieee80211_hw.queues = 2;
+ hw->queues = 2;
/*
* RT2500 only supports 802.11b & 802.11g,
@@ -1910,42 +1903,42 @@
* additional 23 5.2GHz channels.
*/
if(!rt2x00_rf(&rt2x00usb->chip, RF5222)){
- ieee80211_hw.num_modes = 2;
- ieee80211_hw.modes =
+ hw->num_modes = 2;
+ hw->modes =
kzalloc((sizeof(struct ieee80211_hw_modes) * 2),
GFP_KERNEL);
- if(!ieee80211_hw.modes)
+ if(!hw->modes)
goto exit;
- ieee80211_hw.modes->channels =
+ hw->modes->channels =
kzalloc((sizeof(struct ieee80211_channel) * 14),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_modes;
- ieee80211_hw.modes->rates =
+ hw->modes->rates =
kzalloc((sizeof(struct ieee80211_rate) * 12),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_channels;
}else{
- ieee80211_hw.num_modes = 3;
- ieee80211_hw.modes =
+ hw->num_modes = 3;
+ hw->modes =
kzalloc((sizeof(struct ieee80211_hw_modes) * 3),
GFP_KERNEL);
- if(!ieee80211_hw.modes)
+ if(!hw->modes)
goto exit;
- ieee80211_hw.modes->channels =
+ hw->modes->channels =
kzalloc((sizeof(struct ieee80211_channel) * 37),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_modes;
- ieee80211_hw.modes->rates =
+ hw->modes->rates =
kzalloc((sizeof(struct ieee80211_rate) * 12),
GFP_KERNEL);
- if(!ieee80211_hw.modes->channels)
+ if(!hw->modes->channels)
goto exit_free_channels;
}
@@ -1954,22 +1947,20 @@
* 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;
+ hw->modes[0].mode = MODE_IEEE80211B;
+ hw->modes[0].num_channels = 14;
+ 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;
+ hw->modes[1].mode = MODE_IEEE80211G;
+ hw->modes[1].num_channels = 14;
+ hw->modes[1].num_rates = 12;
+ hw->modes[1].channels = hw->modes[0].channels;
+ hw->modes[1].rates = hw->modes[0].rates;
/*
* Intitialize 802.11a
@@ -1977,32 +1968,30 @@
* 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];
+ hw->modes[2].mode = MODE_IEEE80211A;
+ hw->modes[2].num_channels = 37;
+ hw->modes[2].num_rates = 8;
+ hw->modes[2].channels = &hw->modes[0].channels[14];
+ hw->modes[2].rates = &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, hw->modes[0].channels);
+ rt2500usb_init_hw_rates(rt2x00usb, hw->modes[0].rates);
/*
* xr_end is only used on Atheros cards.
*/
- ieee80211_hw.modes->xr_end = 0;
+ hw->modes->xr_end = 0;
return 0;
exit_free_channels:
- kfree(ieee80211_hw.modes->channels);
- ieee80211_hw.modes->channels = NULL;
+ kfree(hw->modes->channels);
+ hw->modes->channels = NULL;
exit_free_modes:
- kfree(ieee80211_hw.modes);
- ieee80211_hw.modes = NULL;
+ kfree(hw->modes);
+ hw->modes = NULL;
exit:
ERROR("Allocation ieee80211 modes failed.\n");
@@ -2058,9 +2047,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 +2061,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 +2085,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;
pgpsAlDNJ0qiQ.pgp
Description: PGP signature
