This fixes compilation for the d80211 hwmode API change.

Signed-off-by: Michael Buesch <[EMAIL PROTECTED]>


Index: jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
===================================================================
--- jbenc-dscape.orig/drivers/net/wireless/d80211/rt2x00/rt2400pci.c    
2006-12-15 19:43:14.000000000 +0100
+++ jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-12-15 
19:46:23.000000000 +0100
@@ -590,8 +590,8 @@ static void rt2400pci_config_phymode(str
        if (rt2x00dev->rx_params.phymode == phymode)
                return;
 
-       rate = &rt2x00dev->hw->modes[0].rates[
-               rt2x00dev->hw->modes[0].num_rates - 1];
+       rate = &rt2x00dev->hwmodes[0].rates[
+               rt2x00dev->hwmodes[0].num_rates - 1];
 
        rt2400pci_config_rate(rt2x00dev, rate->val2);
 
@@ -1140,9 +1140,9 @@ static int rt2400pci_init_channel_time(s
         */
        jiffies_start = jiffies;
        rt2400pci_config_channel(rt2x00dev,
-               rt2x00dev->hw->modes[0].channels[0].val,
-               rt2x00dev->hw->modes[0].channels[0].chan,
-               rt2x00dev->hw->modes[0].channels[0].freq);
+               rt2x00dev->hwmodes[0].channels[0].val,
+               rt2x00dev->hwmodes[0].channels[0].chan,
+               rt2x00dev->hwmodes[0].channels[0].freq);
        jiffies_end = jiffies;
 
        rt2x00dev->hw->channel_change_time =
@@ -1562,7 +1562,7 @@ static void rt2400pci_rxdone(void *data)
                                size);
 
                        rt2x00dev->rx_params.rate = device_signal_to_rate(
-                               &rt2x00dev->hw->modes[0],
+                               &rt2x00dev->hwmodes[0],
                                rt2x00_get_field32(word2, RXD_W2_SIGNAL),
                                0);
 
@@ -2579,47 +2579,43 @@ static void rt2400pci_init_hw_rates(stru
 
 static int rt2400pci_init_hw_modes(struct rt2x00_dev *rt2x00dev)
 {
-       struct ieee80211_hw *hw = rt2x00dev->hw;
-
        /*
         * RT2400 only supports 802.11b.
         * Allocate memory for 14 OFDM channels and 4 CCK rates.
         */
-       hw->num_modes = 1;
-       hw->modes =
-               kzalloc(sizeof(struct ieee80211_hw_modes), GFP_KERNEL);
-       if (!hw->modes)
+       rt2x00dev->hwmodes =
+               kzalloc(sizeof(struct ieee80211_hw_mode), GFP_KERNEL);
+       if (!rt2x00dev->hwmodes)
                goto exit;
 
-       hw->modes->num_channels = 14;
-       hw->modes->channels =
+       rt2x00dev->hwmodes[0].num_channels = 14;
+       rt2x00dev->hwmodes[0].channels =
                kzalloc(sizeof(struct ieee80211_channel) * 14, GFP_KERNEL);
-       if (!hw->modes->channels)
+       if (!rt2x00dev->hwmodes[0].channels)
                goto exit_free_modes;
 
-       hw->modes->num_rates = 4;
-       hw->modes->rates =
+       rt2x00dev->hwmodes[0].num_rates = 4;
+       rt2x00dev->hwmodes[0].rates =
                kzalloc(sizeof(struct ieee80211_rate) * 4, GFP_KERNEL);
-       if (!hw->modes->rates)
+       if (!rt2x00dev->hwmodes[0].rates)
                goto exit_free_channels;
 
        /*
         * Initialize modes.
         */
-       hw->modes->mode = MODE_IEEE80211B;
+       rt2x00dev->hwmodes[0].mode = MODE_IEEE80211B;
 
-       rt2400pci_init_hw_channels(rt2x00dev, hw->modes->channels);
-       rt2400pci_init_hw_rates(rt2x00dev, hw->modes->rates);
+       rt2400pci_init_hw_channels(rt2x00dev, rt2x00dev->hwmodes[0].channels);
+       rt2400pci_init_hw_rates(rt2x00dev, rt2x00dev->hwmodes[0].rates);
 
-       return ieee80211_update_hw(hw);
+       return 0;
 
 exit_free_channels:
-       kfree(hw->modes->channels);
-       hw->modes->channels = NULL;
+       kfree(rt2x00dev->hwmodes[0].channels);
+       rt2x00dev->hwmodes[0].channels = NULL;
 
 exit_free_modes:
-       kfree(hw->modes);
-       hw->modes = NULL;
+       kfree(rt2x00dev->hwmodes);
 
 exit:
        ERROR("Allocation ieee80211 modes failed.\n");
@@ -2628,6 +2624,7 @@ exit:
 
 static int rt2400pci_init_hw(struct rt2x00_dev *rt2x00dev)
 {
+       int err;
        int status;
 
        if (GET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW))
@@ -2661,6 +2658,11 @@ static int rt2400pci_init_hw(struct rt2x
 
        if (ieee80211_register_hw(rt2x00dev->hw))
                return -EIO;
+       err = ieee80211_register_hwmode(rt2x00dev->hw, &rt2x00dev->hwmodes[0]);
+       if (err) {
+               ieee80211_unregister_hw(rt2x00dev->hw);
+               return err;
+       }
 
        SET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW);
 
@@ -2699,11 +2701,10 @@ static void rt2400pci_free_dev(struct rt
        /*
         * Free ieee80211_hw memory.
         */
-       if (likely(rt2x00dev->hw->modes)) {
-               kfree(rt2x00dev->hw->modes->channels);
-               kfree(rt2x00dev->hw->modes->rates);
-               kfree(rt2x00dev->hw->modes);
-               rt2x00dev->hw->modes = NULL;
+       if (likely(rt2x00dev->hwmodes)) {
+               kfree(rt2x00dev->hwmodes[0].channels);
+               kfree(rt2x00dev->hwmodes[0].rates);
+               kfree(rt2x00dev->hwmodes);
        }
 }
 
Index: jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2x00.h
===================================================================
--- jbenc-dscape.orig/drivers/net/wireless/d80211/rt2x00/rt2x00.h       
2006-12-15 19:43:02.000000000 +0100
+++ jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2x00.h    2006-12-15 
19:46:23.000000000 +0100
@@ -903,6 +903,7 @@ struct rt2x00_dev {
         * IEEE80211 control structure.
         */
        struct ieee80211_hw *hw;
+       struct ieee80211_hw_mode *hwmodes;
 
        /*
         * Device flags.
@@ -1161,7 +1162,7 @@ static inline void device_rate_entry(str
        entry->min_rssi_ack_delta = 0;
 }
 
-static inline int device_signal_to_rate(struct ieee80211_hw_modes *mode,
+static inline int device_signal_to_rate(struct ieee80211_hw_mode *mode,
        u8 signal, u8 ofdm)
 {
        unsigned int i;
Index: jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
===================================================================
--- jbenc-dscape.orig/drivers/net/wireless/d80211/rt2x00/rt2500pci.c    
2006-12-15 19:43:14.000000000 +0100
+++ jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-12-15 
19:58:03.000000000 +0100
@@ -658,14 +658,14 @@ static void rt2500pci_config_phymode(str
 
        if (phymode == MODE_IEEE80211A &&
            rt2x00_rf(&rt2x00dev->chip, RF5222))
-               rate = &rt2x00dev->hw->modes[2].rates[
-                       rt2x00dev->hw->modes[2].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[2].rates[
+                       rt2x00dev->hwmodes[2].num_rates - 1];
        else if (phymode == MODE_IEEE80211B)
-               rate = &rt2x00dev->hw->modes[1].rates[
-                       rt2x00dev->hw->modes[1].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[1].rates[
+                       rt2x00dev->hwmodes[1].num_rates - 1];
        else
-               rate = &rt2x00dev->hw->modes[0].rates[
-                       rt2x00dev->hw->modes[0].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[0].rates[
+                       rt2x00dev->hwmodes[0].num_rates - 1];
 
        rt2500pci_config_rate(rt2x00dev, rate->val2);
 
@@ -1265,10 +1265,10 @@ static int rt2500pci_init_channel_time(s
         */
        jiffies_start = jiffies;
        rt2500pci_config_channel(rt2x00dev,
-               rt2x00dev->hw->modes[0].channels[0].val,
-               rt2x00dev->hw->modes[0].channels[0].chan,
-               rt2x00dev->hw->modes[0].channels[0].freq,
-               rt2x00dev->hw->modes[0].channels[0].power_level);
+               rt2x00dev->hwmodes[0].channels[0].val,
+               rt2x00dev->hwmodes[0].channels[0].chan,
+               rt2x00dev->hwmodes[0].channels[0].freq,
+               rt2x00dev->hwmodes[0].channels[0].power_level);
        jiffies_end = jiffies;
 
        rt2x00dev->hw->channel_change_time =
@@ -1720,7 +1720,7 @@ static void rt2500pci_rxdone(void *data)
                                size);
 
                        rt2x00dev->rx_params.rate = device_signal_to_rate(
-                               &rt2x00dev->hw->modes[0],
+                               &rt2x00dev->hwmodes[0],
                                rt2x00_get_field32(word2, RXD_W2_SIGNAL),
                                rt2x00_get_field32(word0, RXD_W0_OFDM));
 
@@ -2842,7 +2842,6 @@ static void rt2500pci_init_hw_rates(stru
 
 static int rt2500pci_init_hw_modes(struct rt2x00_dev *rt2x00dev)
 {
-       struct ieee80211_hw *hw = rt2x00dev->hw;
        int num_modes;
        int num_channels;
 
@@ -2860,23 +2859,22 @@ static int rt2500pci_init_hw_modes(struc
                num_channels = 37;
        }
 
-       hw->num_modes = num_modes;
-       hw->modes =
-               kzalloc((sizeof(struct ieee80211_hw_modes) * num_modes),
+       rt2x00dev->hwmodes =
+               kzalloc((sizeof(struct ieee80211_hw_mode) * num_modes),
                GFP_KERNEL);
-       if (!hw->modes)
+       if (!rt2x00dev->hwmodes)
                goto exit;
 
-       hw->modes->channels =
+       rt2x00dev->hwmodes[0].channels =
                kzalloc((sizeof(struct ieee80211_channel) * num_channels),
                GFP_KERNEL);
-       if (!hw->modes->channels)
+       if (!rt2x00dev->hwmodes[0].channels)
                goto exit_free_modes;
 
-       hw->modes->rates =
+       rt2x00dev->hwmodes[0].rates =
                kzalloc((sizeof(struct ieee80211_rate) * 12),
                GFP_KERNEL);
-       if (!hw->modes->rates)
+       if (!rt2x00dev->hwmodes[0].rates)
                goto exit_free_channels;
 
        /*
@@ -2884,20 +2882,20 @@ static int rt2500pci_init_hw_modes(struc
         * Rates: CCK, OFDM.
         * Channels: OFDM.
         */
-       hw->modes[0].mode = MODE_IEEE80211G;
-       hw->modes[0].num_channels = 14;
-       hw->modes[0].num_rates = 12;
+       rt2x00dev->hwmodes[0].mode = MODE_IEEE80211G;
+       rt2x00dev->hwmodes[0].num_channels = 14;
+       rt2x00dev->hwmodes[0].num_rates = 12;
 
        /*
         * Intitialize 802.11b
         * Rates: CCK.
         * Channels: OFDM.
         */
-       hw->modes[1].mode = MODE_IEEE80211B;
-       hw->modes[1].num_channels = 14;
-       hw->modes[1].num_rates = 4;
-       hw->modes[1].channels = hw->modes[0].channels;
-       hw->modes[1].rates = hw->modes[0].rates;
+       rt2x00dev->hwmodes[1].mode = MODE_IEEE80211B;
+       rt2x00dev->hwmodes[1].num_channels = 14;
+       rt2x00dev->hwmodes[1].num_rates = 4;
+       rt2x00dev->hwmodes[1].channels = rt2x00dev->hwmodes[0].channels;
+       rt2x00dev->hwmodes[1].rates = rt2x00dev->hwmodes[0].rates;
 
        /*
         * Intitialize 802.11a
@@ -2905,25 +2903,25 @@ static int rt2500pci_init_hw_modes(struc
         * Channels: OFDM, UNII, HiperLAN2.
         */
        if (rt2x00_rf(&rt2x00dev->chip, RF5222)) {
-               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];
+               rt2x00dev->hwmodes[2].mode = MODE_IEEE80211A;
+               rt2x00dev->hwmodes[2].num_channels = 37;
+               rt2x00dev->hwmodes[2].num_rates = 8;
+               rt2x00dev->hwmodes[2].channels = 
&rt2x00dev->hwmodes[0].channels[14];
+               rt2x00dev->hwmodes[2].rates = &rt2x00dev->hwmodes[0].rates[4];
        }
 
-       rt2500pci_init_hw_channels(rt2x00dev, hw->modes[0].channels);
-       rt2500pci_init_hw_rates(rt2x00dev, hw->modes[0].rates);
+       rt2500pci_init_hw_channels(rt2x00dev, rt2x00dev->hwmodes[0].channels);
+       rt2500pci_init_hw_rates(rt2x00dev, rt2x00dev->hwmodes[0].rates);
 
-       return ieee80211_update_hw(hw);
+       return num_modes;
 
 exit_free_channels:
-       kfree(hw->modes->channels);
-       hw->modes->channels = NULL;
+       kfree(rt2x00dev->hwmodes[0].channels);
+       rt2x00dev->hwmodes[0].channels = NULL;
 
 exit_free_modes:
-       kfree(hw->modes);
-       hw->modes = NULL;
+       kfree(rt2x00dev->hwmodes);
+       rt2x00dev->hwmodes = NULL;
 
 exit:
        ERROR("Allocation ieee80211 modes failed.\n");
@@ -2933,6 +2931,7 @@ exit:
 static int rt2500pci_init_hw(struct rt2x00_dev *rt2x00dev)
 {
        int status;
+       int i, num_modes;
 
        if (GET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW))
                return 0;
@@ -2959,12 +2958,20 @@ static int rt2500pci_init_hw(struct rt2x
        rt2x00dev->hw->maxssi = MAX_RX_SSI;
        rt2x00dev->hw->queues = RING_NUM_TX;
 
-       status = rt2500pci_init_hw_modes(rt2x00dev);
-       if (status)
-               return status;
+       num_modes = rt2500pci_init_hw_modes(rt2x00dev);
+       if (num_modes <= 0)
+               return num_modes;
 
        if (ieee80211_register_hw(rt2x00dev->hw))
                return -EIO;
+       for (i = 0; i < num_modes; i++) {
+               status = ieee80211_register_hwmode(rt2x00dev->hw,
+                                                  &rt2x00dev->hwmodes[i]);
+               if (status) {
+                       ieee80211_unregister_hw(rt2x00dev->hw);
+                       return status;
+               }
+       }
 
        SET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW);
 
@@ -3003,11 +3010,11 @@ static void rt2500pci_free_dev(struct rt
        /*
         * Free ieee80211_hw memory.
         */
-       if (likely(rt2x00dev->hw->modes)) {
-               kfree(rt2x00dev->hw->modes->channels);
-               kfree(rt2x00dev->hw->modes->rates);
-               kfree(rt2x00dev->hw->modes);
-               rt2x00dev->hw->modes = NULL;
+       if (likely(rt2x00dev->hwmodes)) {
+               kfree(rt2x00dev->hwmodes[0].channels);
+               kfree(rt2x00dev->hwmodes[0].rates);
+               kfree(rt2x00dev->hwmodes);
+               rt2x00dev->hwmodes = NULL;
        }
 }
 
Index: jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
===================================================================
--- jbenc-dscape.orig/drivers/net/wireless/d80211/rt2x00/rt2500usb.c    
2006-12-15 19:43:14.000000000 +0100
+++ jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-12-15 
20:16:12.000000000 +0100
@@ -690,14 +690,14 @@ static void rt2500usb_config_phymode(str
 
        if (phymode == MODE_IEEE80211A &&
            rt2x00_rf(&rt2x00dev->chip, RF5222))
-               rate = &rt2x00dev->hw->modes[2].rates[
-                       rt2x00dev->hw->modes[2].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[2].rates[
+                       rt2x00dev->hwmodes[2].num_rates - 1];
        else if (phymode == MODE_IEEE80211B)
-               rate = &rt2x00dev->hw->modes[1].rates[
-                       rt2x00dev->hw->modes[1].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[1].rates[
+                       rt2x00dev->hwmodes[1].num_rates - 1];
        else
-               rate = &rt2x00dev->hw->modes[0].rates[
-                       rt2x00dev->hw->modes[0].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[0].rates[
+                       rt2x00dev->hwmodes[0].num_rates - 1];
 
        rt2500usb_config_rate(rt2x00dev, rate->val2);
 
@@ -1237,10 +1237,10 @@ static int rt2500usb_init_channel_time(s
         */
        jiffies_start = jiffies;
        rt2500usb_config_channel(rt2x00dev,
-               rt2x00dev->hw->modes[0].channels[0].val,
-               rt2x00dev->hw->modes[0].channels[0].chan,
-               rt2x00dev->hw->modes[0].channels[0].freq,
-               rt2x00dev->hw->modes[0].channels[0].power_level);
+               rt2x00dev->hwmodes[0].channels[0].val,
+               rt2x00dev->hwmodes[0].channels[0].chan,
+               rt2x00dev->hwmodes[0].channels[0].freq,
+               rt2x00dev->hwmodes[0].channels[0].power_level);
        jiffies_end = jiffies;
 
        rt2x00dev->hw->channel_change_time =
@@ -1701,7 +1701,7 @@ static void rt2500usb_rxdone(void *data)
                                rt2x00_rxdata_addr(entry), size);
 
                        rt2x00dev->rx_params.rate = device_signal_to_rate(
-                               &rt2x00dev->hw->modes[0],
+                               &rt2x00dev->hwmodes[0],
                                rt2x00_get_field32(word1, RXD_W1_SIGNAL),
                                rt2x00_get_field32(word0, RXD_W0_OFDM));
 
@@ -2685,7 +2685,6 @@ static void rt2500usb_init_hw_rates(stru
 
 static int rt2500usb_init_hw_modes(struct rt2x00_dev *rt2x00dev)
 {
-       struct ieee80211_hw *hw = rt2x00dev->hw;
        int num_modes;
        int num_channels;
 
@@ -2703,23 +2702,22 @@ static int rt2500usb_init_hw_modes(struc
                num_channels = 37;
        }
 
-       hw->num_modes = num_modes;
-       hw->modes =
-               kzalloc((sizeof(struct ieee80211_hw_modes) * num_modes),
+       rt2x00dev->hwmodes =
+               kzalloc((sizeof(struct ieee80211_hw_mode) * num_modes),
                GFP_KERNEL);
-       if (!hw->modes)
+       if (!rt2x00dev->hwmodes)
                goto exit;
 
-       hw->modes->channels =
+       rt2x00dev->hwmodes[0].channels =
                kzalloc((sizeof(struct ieee80211_channel) * num_channels),
                GFP_KERNEL);
-       if (!hw->modes->channels)
+       if (!rt2x00dev->hwmodes[0].channels)
                goto exit_free_modes;
 
-       hw->modes->rates =
+       rt2x00dev->hwmodes[0].rates =
                kzalloc((sizeof(struct ieee80211_rate) * 12),
                GFP_KERNEL);
-       if (!hw->modes->rates)
+       if (!rt2x00dev->hwmodes[0].rates)
                goto exit_free_channels;
 
        /*
@@ -2727,20 +2725,20 @@ static int rt2500usb_init_hw_modes(struc
         * Rates: CCK, OFDM.
         * Channels: OFDM.
         */
-       hw->modes[0].mode = MODE_IEEE80211G;
-       hw->modes[0].num_channels = 14;
-       hw->modes[0].num_rates = 12;
+       rt2x00dev->hwmodes[0].mode = MODE_IEEE80211G;
+       rt2x00dev->hwmodes[0].num_channels = 14;
+       rt2x00dev->hwmodes[0].num_rates = 12;
 
        /*
         * Intitialize 802.11b
         * Rates: CCK.
         * Channels: OFDM.
         */
-       hw->modes[1].mode = MODE_IEEE80211B;
-       hw->modes[1].num_channels = 14;
-       hw->modes[1].num_rates = 4;
-       hw->modes[1].channels = hw->modes[0].channels;
-       hw->modes[1].rates = hw->modes[0].rates;
+       rt2x00dev->hwmodes[1].mode = MODE_IEEE80211B;
+       rt2x00dev->hwmodes[1].num_channels = 14;
+       rt2x00dev->hwmodes[1].num_rates = 4;
+       rt2x00dev->hwmodes[1].channels = rt2x00dev->hwmodes[0].channels;
+       rt2x00dev->hwmodes[1].rates = rt2x00dev->hwmodes[0].rates;
 
        /*
         * Intitialize 802.11a
@@ -2748,25 +2746,25 @@ static int rt2500usb_init_hw_modes(struc
         * Channels: OFDM, UNII, HiperLAN2.
         */
        if (rt2x00_rf(&rt2x00dev->chip, RF5222)) {
-               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];
+               rt2x00dev->hwmodes[2].mode = MODE_IEEE80211A;
+               rt2x00dev->hwmodes[2].num_channels = 37;
+               rt2x00dev->hwmodes[2].num_rates = 8;
+               rt2x00dev->hwmodes[2].channels = 
&rt2x00dev->hwmodes[0].channels[14];
+               rt2x00dev->hwmodes[2].rates = &rt2x00dev->hwmodes[0].rates[4];
        }
 
-       rt2500usb_init_hw_channels(rt2x00dev, hw->modes[0].channels);
-       rt2500usb_init_hw_rates(rt2x00dev, hw->modes[0].rates);
+       rt2500usb_init_hw_channels(rt2x00dev, rt2x00dev->hwmodes[0].channels);
+       rt2500usb_init_hw_rates(rt2x00dev, rt2x00dev->hwmodes[0].rates);
 
-       return ieee80211_update_hw(hw);
+       return num_modes;
 
 exit_free_channels:
-       kfree(hw->modes->channels);
-       hw->modes->channels = NULL;
+       kfree(rt2x00dev->hwmodes[0].channels);
+       rt2x00dev->hwmodes[0].channels = NULL;
 
 exit_free_modes:
-       kfree(hw->modes);
-       hw->modes = NULL;
+       kfree(rt2x00dev->hwmodes);
+       rt2x00dev->hwmodes = NULL;
 
 exit:
        ERROR("Allocation ieee80211 modes failed.\n");
@@ -2776,6 +2774,7 @@ exit:
 static int rt2500usb_init_hw(struct rt2x00_dev *rt2x00dev)
 {
        int status;
+       int i, num_modes;
 
        if (GET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW))
                return 0;
@@ -2802,12 +2801,20 @@ static int rt2500usb_init_hw(struct rt2x
        rt2x00dev->hw->maxssi = MAX_RX_SSI;
        rt2x00dev->hw->queues = RING_NUM_TX;
 
-       status = rt2500usb_init_hw_modes(rt2x00dev);
-       if (status)
-               return status;
+       num_modes = rt2500usb_init_hw_modes(rt2x00dev);
+       if (num_modes <= 0)
+               return num_modes;
 
        if (ieee80211_register_hw(rt2x00dev->hw))
                return -EIO;
+       for (i = 0; i < num_modes; i++) {
+               status = ieee80211_register_hwmode(rt2x00dev->hw,
+                                                  &rt2x00dev->hwmodes[i]);
+               if (status) {
+                       ieee80211_unregister_hw(rt2x00dev->hw);
+                       return status;
+               }
+       }
 
        SET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW);
 
@@ -2838,11 +2845,11 @@ static void rt2500usb_free_dev(struct rt
        /*
         * Free ieee80211_hw memory.
         */
-       if (likely(rt2x00dev->hw->modes)) {
-               kfree(rt2x00dev->hw->modes->channels);
-               kfree(rt2x00dev->hw->modes->rates);
-               kfree(rt2x00dev->hw->modes);
-               rt2x00dev->hw->modes = NULL;
+       if (likely(rt2x00dev->hwmodes)) {
+               kfree(rt2x00dev->hwmodes[0].channels);
+               kfree(rt2x00dev->hwmodes[0].rates);
+               kfree(rt2x00dev->hwmodes);
+               rt2x00dev->hwmodes = NULL;
        }
 }
 
Index: jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt61pci.c
===================================================================
--- jbenc-dscape.orig/drivers/net/wireless/d80211/rt2x00/rt61pci.c      
2006-12-15 19:44:13.000000000 +0100
+++ jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt61pci.c   2006-12-15 
20:08:17.000000000 +0100
@@ -890,14 +890,14 @@ static void rt61pci_config_phymode(struc
        if (phymode == MODE_IEEE80211A &&
            (rt2x00_rf(&rt2x00dev->chip, RF5225) ||
            rt2x00_rf(&rt2x00dev->chip, RF5325)))
-               rate = &rt2x00dev->hw->modes[2].rates[
-                       rt2x00dev->hw->modes[2].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[2].rates[
+                       rt2x00dev->hwmodes[2].num_rates - 1];
        else if (phymode == MODE_IEEE80211B)
-               rate = &rt2x00dev->hw->modes[1].rates[
-                       rt2x00dev->hw->modes[1].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[1].rates[
+                       rt2x00dev->hwmodes[1].num_rates - 1];
        else
-               rate = &rt2x00dev->hw->modes[0].rates[
-                       rt2x00dev->hw->modes[0].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[0].rates[
+                       rt2x00dev->hwmodes[0].num_rates - 1];
 
        rt61pci_config_rate(rt2x00dev, rate->val2);
 
@@ -1701,10 +1701,10 @@ static int rt61pci_init_channel_time(str
         */
        jiffies_start = jiffies;
        rt61pci_config_channel(rt2x00dev,
-               rt2x00dev->hw->modes[0].channels[0].val,
-               rt2x00dev->hw->modes[0].channels[0].chan,
-               rt2x00dev->hw->modes[0].channels[0].freq,
-               rt2x00dev->hw->modes[0].channels[0].power_level);
+               rt2x00dev->hwmodes[0].channels[0].val,
+               rt2x00dev->hwmodes[0].channels[0].chan,
+               rt2x00dev->hwmodes[0].channels[0].freq,
+               rt2x00dev->hwmodes[0].channels[0].power_level);
        jiffies_end = jiffies;
 
        rt2x00dev->hw->channel_change_time =
@@ -2190,7 +2190,7 @@ static void rt61pci_rxdone(void *data)
                                size);
 
                        rt2x00dev->rx_params.rate = device_signal_to_rate(
-                               &rt2x00dev->hw->modes[0],
+                               &rt2x00dev->hwmodes[0],
                                rt2x00_get_field32(word1, RXD_W1_SIGNAL),
                                rt2x00_get_field32(word0, RXD_W0_OFDM));
 
@@ -3369,7 +3369,6 @@ static void rt61pci_init_hw_rates(struct
 
 static int rt61pci_init_hw_modes(struct rt2x00_dev *rt2x00dev)
 {
-       struct ieee80211_hw *hw = rt2x00dev->hw;
        int num_modes;
        int num_channels;
 
@@ -3388,23 +3387,22 @@ static int rt61pci_init_hw_modes(struct 
                num_channels = 38;
        }
 
-       hw->num_modes = num_modes;
-       hw->modes =
-               kzalloc((sizeof(struct ieee80211_hw_modes) * num_modes),
+       rt2x00dev->hwmodes =
+               kzalloc((sizeof(struct ieee80211_hw_mode) * num_modes),
                GFP_KERNEL);
-       if (!hw->modes)
+       if (!rt2x00dev->hwmodes)
                goto exit;
 
-       hw->modes->channels =
+       rt2x00dev->hwmodes[0].channels =
                kzalloc((sizeof(struct ieee80211_channel) * num_channels),
                GFP_KERNEL);
-       if (!hw->modes->channels)
+       if (!rt2x00dev->hwmodes[0].channels)
                goto exit_free_modes;
 
-       hw->modes->rates =
+       rt2x00dev->hwmodes[0].rates =
                kzalloc((sizeof(struct ieee80211_rate) * 12),
                GFP_KERNEL);
-       if (!hw->modes->rates)
+       if (!rt2x00dev->hwmodes[0].rates)
                goto exit_free_channels;
 
        /*
@@ -3412,20 +3410,20 @@ static int rt61pci_init_hw_modes(struct 
         * Rates: CCK, OFDM.
         * Channels: OFDM.
         */
-       hw->modes[0].mode = MODE_IEEE80211G;
-       hw->modes[0].num_channels = 14;
-       hw->modes[0].num_rates = 12;
+       rt2x00dev->hwmodes[0].mode = MODE_IEEE80211G;
+       rt2x00dev->hwmodes[0].num_channels = 14;
+       rt2x00dev->hwmodes[0].num_rates = 12;
 
        /*
         * Intitialize 802.11b
         * Rates: CCK.
         * Channels: OFDM.
         */
-       hw->modes[1].mode = MODE_IEEE80211B;
-       hw->modes[1].num_channels = 14;
-       hw->modes[1].num_rates = 4;
-       hw->modes[1].channels = hw->modes[0].channels;
-       hw->modes[1].rates = hw->modes[0].rates;
+       rt2x00dev->hwmodes[1].mode = MODE_IEEE80211B;
+       rt2x00dev->hwmodes[1].num_channels = 14;
+       rt2x00dev->hwmodes[1].num_rates = 4;
+       rt2x00dev->hwmodes[1].channels = rt2x00dev->hwmodes[0].channels;
+       rt2x00dev->hwmodes[1].rates = rt2x00dev->hwmodes[0].rates;
 
        /*
         * Intitialize 802.11a
@@ -3434,25 +3432,25 @@ static int rt61pci_init_hw_modes(struct 
         */
        if (rt2x00_rf(&rt2x00dev->chip, RF5225) ||
            rt2x00_rf(&rt2x00dev->chip, RF5325)) {
-               hw->modes[2].mode = MODE_IEEE80211A;
-               hw->modes[2].num_channels = 38;
-               hw->modes[2].num_rates = 8;
-               hw->modes[2].channels = &hw->modes[0].channels[14];
-               hw->modes[2].rates = &hw->modes[0].rates[4];
+               rt2x00dev->hwmodes[2].mode = MODE_IEEE80211A;
+               rt2x00dev->hwmodes[2].num_channels = 38;
+               rt2x00dev->hwmodes[2].num_rates = 8;
+               rt2x00dev->hwmodes[2].channels = 
&rt2x00dev->hwmodes[0].channels[14];
+               rt2x00dev->hwmodes[2].rates = &rt2x00dev->hwmodes[0].rates[4];
        }
 
-       rt61pci_init_hw_channels(rt2x00dev, hw->modes[0].channels);
-       rt61pci_init_hw_rates(rt2x00dev, hw->modes[0].rates);
+       rt61pci_init_hw_channels(rt2x00dev, rt2x00dev->hwmodes[0].channels);
+       rt61pci_init_hw_rates(rt2x00dev, rt2x00dev->hwmodes[0].rates);
 
-       return ieee80211_update_hw(hw);
+       return num_modes;
 
 exit_free_channels:
-       kfree(hw->modes->channels);
-       hw->modes->channels = NULL;
+       kfree(rt2x00dev->hwmodes[0].channels);
+       rt2x00dev->hwmodes[0].channels = NULL;
 
 exit_free_modes:
-       kfree(hw->modes);
-       hw->modes = NULL;
+       kfree(rt2x00dev->hwmodes);
+       rt2x00dev->hwmodes = NULL;
 
 exit:
        ERROR("Allocation ieee80211 modes failed.\n");
@@ -3462,6 +3460,7 @@ exit:
 static int rt61pci_init_hw(struct rt2x00_dev *rt2x00dev)
 {
        int status;
+       int i, num_modes;
 
        if (GET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW))
                return 0;
@@ -3488,12 +3487,20 @@ static int rt61pci_init_hw(struct rt2x00
        rt2x00dev->hw->maxssi = MAX_RX_SSI;
        rt2x00dev->hw->queues = RING_NUM_TX;
 
-       status = rt61pci_init_hw_modes(rt2x00dev);
-       if (status)
-               return status;
+       num_modes = rt61pci_init_hw_modes(rt2x00dev);
+       if (num_modes <= 0)
+               return num_modes;
 
        if (ieee80211_register_hw(rt2x00dev->hw))
                return -EIO;
+       for (i = 0; i < num_modes; i++) {
+               status = ieee80211_register_hwmode(rt2x00dev->hw,
+                                                  &rt2x00dev->hwmodes[i]);
+               if (status) {
+                       ieee80211_unregister_hw(rt2x00dev->hw);
+                       return status;
+               }
+       }
 
        SET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW);
 
@@ -3532,11 +3539,11 @@ static void rt61pci_free_dev(struct rt2x
        /*
         * Free ieee80211_hw memory.
         */
-       if (likely(rt2x00dev->hw->modes)) {
-               kfree(rt2x00dev->hw->modes->channels);
-               kfree(rt2x00dev->hw->modes->rates);
-               kfree(rt2x00dev->hw->modes);
-               rt2x00dev->hw->modes = NULL;
+       if (likely(rt2x00dev->hwmodes)) {
+               kfree(rt2x00dev->hwmodes[0].channels);
+               kfree(rt2x00dev->hwmodes[0].rates);
+               kfree(rt2x00dev->hwmodes);
+               rt2x00dev->hwmodes = NULL;
        }
 }
 
Index: jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt73usb.c
===================================================================
--- jbenc-dscape.orig/drivers/net/wireless/d80211/rt2x00/rt73usb.c      
2006-12-15 19:46:11.000000000 +0100
+++ jbenc-dscape/drivers/net/wireless/d80211/rt2x00/rt73usb.c   2006-12-15 
20:25:07.000000000 +0100
@@ -788,14 +788,14 @@ static void rt73usb_config_phymode(struc
        if (phymode == MODE_IEEE80211A &&
            (rt2x00_rf(&rt2x00dev->chip, RF5225) ||
            rt2x00_rf(&rt2x00dev->chip, RF5226)))
-               rate = &rt2x00dev->hw->modes[2].rates[
-                       rt2x00dev->hw->modes[2].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[2].rates[
+                       rt2x00dev->hwmodes[2].num_rates - 1];
        else if (phymode == MODE_IEEE80211B)
-               rate = &rt2x00dev->hw->modes[1].rates[
-                       rt2x00dev->hw->modes[1].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[1].rates[
+                       rt2x00dev->hwmodes[1].num_rates - 1];
        else
-               rate = &rt2x00dev->hw->modes[0].rates[
-                       rt2x00dev->hw->modes[0].num_rates - 1];
+               rate = &rt2x00dev->hwmodes[0].rates[
+                       rt2x00dev->hwmodes[0].num_rates - 1];
 
        rt73usb_config_rate(rt2x00dev, rate->val2);
 
@@ -1485,10 +1485,10 @@ static int rt73usb_init_channel_time(str
         */
        jiffies_start = jiffies;
        rt73usb_config_channel(rt2x00dev,
-               rt2x00dev->hw->modes[0].channels[0].val,
-               rt2x00dev->hw->modes[0].channels[0].chan,
-               rt2x00dev->hw->modes[0].channels[0].freq,
-               rt2x00dev->hw->modes[0].channels[0].power_level);
+               rt2x00dev->hwmodes[0].channels[0].val,
+               rt2x00dev->hwmodes[0].channels[0].chan,
+               rt2x00dev->hwmodes[0].channels[0].freq,
+               rt2x00dev->hwmodes[0].channels[0].power_level);
        jiffies_end = jiffies;
 
        rt2x00dev->hw->channel_change_time =
@@ -1978,7 +1978,7 @@ static void rt73usb_rxdone(void *data)
                                rt2x00_data_addr(entry), size);
 
                        rt2x00dev->rx_params.rate = device_signal_to_rate(
-                               &rt2x00dev->hw->modes[0],
+                               &rt2x00dev->hwmodes[0],
                                rt2x00_get_field32(word1, RXD_W1_SIGNAL),
                                rt2x00_get_field32(word0, RXD_W0_OFDM));
 
@@ -3025,7 +3025,6 @@ static void rt73usb_init_hw_rates(struct
 
 static int rt73usb_init_hw_modes(struct rt2x00_dev *rt2x00dev)
 {
-       struct ieee80211_hw *hw = rt2x00dev->hw;
        int num_modes;
        int num_channels;
 
@@ -3044,23 +3043,22 @@ static int rt73usb_init_hw_modes(struct 
                num_channels = 38;
        }
 
-       hw->num_modes = num_modes;
-       hw->modes =
-               kzalloc((sizeof(struct ieee80211_hw_modes) * num_modes),
+       rt2x00dev->hwmodes =
+               kzalloc((sizeof(struct ieee80211_hw_mode) * num_modes),
                GFP_KERNEL);
-       if (!hw->modes)
+       if (!rt2x00dev->hwmodes)
                goto exit;
 
-       hw->modes->channels =
+       rt2x00dev->hwmodes[0].channels =
                kzalloc((sizeof(struct ieee80211_channel) * num_channels),
                GFP_KERNEL);
-       if (!hw->modes->channels)
+       if (!rt2x00dev->hwmodes[0].channels)
                goto exit_free_modes;
 
-       hw->modes->rates =
+       rt2x00dev->hwmodes[0].rates =
                kzalloc((sizeof(struct ieee80211_rate) * 12),
                GFP_KERNEL);
-       if (!hw->modes->rates)
+       if (!rt2x00dev->hwmodes[0].rates)
                goto exit_free_channels;
 
        /*
@@ -3068,20 +3066,20 @@ static int rt73usb_init_hw_modes(struct 
         * Rates: CCK, OFDM.
         * Channels: OFDM.
         */
-       hw->modes[0].mode = MODE_IEEE80211G;
-       hw->modes[0].num_channels = 14;
-       hw->modes[0].num_rates = 12;
+       rt2x00dev->hwmodes[0].mode = MODE_IEEE80211G;
+       rt2x00dev->hwmodes[0].num_channels = 14;
+       rt2x00dev->hwmodes[0].num_rates = 12;
 
        /*
         * Intitialize 802.11b
         * Rates: CCK.
         * Channels: OFDM.
         */
-       hw->modes[1].mode = MODE_IEEE80211B;
-       hw->modes[1].num_channels = 14;
-       hw->modes[1].num_rates = 4;
-       hw->modes[1].channels = hw->modes[0].channels;
-       hw->modes[1].rates = hw->modes[0].rates;
+       rt2x00dev->hwmodes[1].mode = MODE_IEEE80211B;
+       rt2x00dev->hwmodes[1].num_channels = 14;
+       rt2x00dev->hwmodes[1].num_rates = 4;
+       rt2x00dev->hwmodes[1].channels = rt2x00dev->hwmodes[0].channels;
+       rt2x00dev->hwmodes[1].rates = rt2x00dev->hwmodes[0].rates;
 
        /*
         * Intitialize 802.11a
@@ -3090,25 +3088,25 @@ static int rt73usb_init_hw_modes(struct 
         */
        if (rt2x00_rf(&rt2x00dev->chip, RF5225) ||
            rt2x00_rf(&rt2x00dev->chip, RF5226)) {
-               hw->modes[2].mode = MODE_IEEE80211A;
-               hw->modes[2].num_channels = 38;
-               hw->modes[2].num_rates = 8;
-               hw->modes[2].channels = &hw->modes[0].channels[14];
-               hw->modes[2].rates = &hw->modes[0].rates[4];
+               rt2x00dev->hwmodes[2].mode = MODE_IEEE80211A;
+               rt2x00dev->hwmodes[2].num_channels = 38;
+               rt2x00dev->hwmodes[2].num_rates = 8;
+               rt2x00dev->hwmodes[2].channels = 
&rt2x00dev->hwmodes[0].channels[14];
+               rt2x00dev->hwmodes[2].rates = &rt2x00dev->hwmodes[0].rates[4];
        }
 
-       rt73usb_init_hw_channels(rt2x00dev, hw->modes[0].channels);
-       rt73usb_init_hw_rates(rt2x00dev, hw->modes[0].rates);
+       rt73usb_init_hw_channels(rt2x00dev, rt2x00dev->hwmodes[0].channels);
+       rt73usb_init_hw_rates(rt2x00dev, rt2x00dev->hwmodes[0].rates);
 
-       return ieee80211_update_hw(hw);
+       return num_modes;
 
 exit_free_channels:
-       kfree(hw->modes->channels);
-       hw->modes->channels = NULL;
+       kfree(rt2x00dev->hwmodes[0].channels);
+       rt2x00dev->hwmodes[0].channels = NULL;
 
 exit_free_modes:
-       kfree(hw->modes);
-       hw->modes = NULL;
+       kfree(rt2x00dev->hwmodes);
+       rt2x00dev->hwmodes = NULL;
 
 exit:
        ERROR("Allocation ieee80211 modes failed.\n");
@@ -3118,6 +3116,7 @@ exit:
 static int rt73usb_init_hw(struct rt2x00_dev *rt2x00dev)
 {
        int status;
+       int i, num_modes;
 
        if (GET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW))
                return 0;
@@ -3144,12 +3143,20 @@ static int rt73usb_init_hw(struct rt2x00
        rt2x00dev->hw->maxssi = MAX_RX_SSI;
        rt2x00dev->hw->queues = RING_NUM_TX;
 
-       status = rt73usb_init_hw_modes(rt2x00dev);
-       if (status)
-               return status;
+       num_modes = rt73usb_init_hw_modes(rt2x00dev);
+       if (num_modes <= 0)
+               return num_modes;
 
        if (ieee80211_register_hw(rt2x00dev->hw))
                return -EIO;
+       for (i = 0; i < num_modes; i++) {
+               status = ieee80211_register_hwmode(rt2x00dev->hw,
+                                                  &rt2x00dev->hwmodes[i]);
+               if (status) {
+                       ieee80211_unregister_hw(rt2x00dev->hw);
+                       return status;
+               }
+       }
 
        SET_FLAG(rt2x00dev, DEVICE_INITIALIZED_HW);
 
@@ -3180,11 +3187,11 @@ static void rt73usb_free_dev(struct rt2x
        /*
         * Free ieee80211_hw memory.
         */
-       if (likely(rt2x00dev->hw->modes)) {
-               kfree(rt2x00dev->hw->modes->channels);
-               kfree(rt2x00dev->hw->modes->rates);
-               kfree(rt2x00dev->hw->modes);
-               rt2x00dev->hw->modes = NULL;
+       if (likely(rt2x00dev->hwmodes)) {
+               kfree(rt2x00dev->hwmodes[0].channels);
+               kfree(rt2x00dev->hwmodes[0].rates);
+               kfree(rt2x00dev->hwmodes);
+               rt2x00dev->hwmodes = NULL;
        }
 }
 

-- 
Greetings Michael.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to