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;

Attachment: pgpL0RIky5I5p.pgp
Description: PGP signature

Reply via email to