b43: fix backport of 860-b43_restart_config.patch
[openwrt-10.03/.git] / package / mac80211 / patches / 860-b43_restart_config.patch
1 --- a/drivers/net/wireless/b43/main.c
2 +++ b/drivers/net/wireless/b43/main.c
3 @@ -325,6 +325,10 @@ static void b43_wireless_core_exit(struc
4  static int b43_wireless_core_init(struct b43_wldev *dev);
5  static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev);
6  static int b43_wireless_core_start(struct b43_wldev *dev);
7 +static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
8 +                                   struct ieee80211_vif *vif,
9 +                                   struct ieee80211_bss_conf *conf,
10 +                                   u32 changed);
11  
12  static int b43_ratelimit(struct b43_wl *wl)
13  {
14 @@ -3602,14 +3606,24 @@ static int b43_op_config(struct ieee8021
15         struct ieee80211_conf *conf = &hw->conf;
16         int antenna;
17         int err = 0;
18 +       bool reload_bss = false;
19  
20         mutex_lock(&wl->mutex);
21  
22 +       dev = wl->current_dev;
23 +
24         /* Switch the band (if necessary). This might change the active core. */
25         err = b43_switch_band(wl, conf->channel);
26         if (err)
27                 goto out_unlock_mutex;
28 -       dev = wl->current_dev;
29 +
30 +       /* Need to reload all settings if the core changed */
31 +       if (dev != wl->current_dev) {
32 +               dev = wl->current_dev;
33 +               changed = ~0;
34 +               reload_bss = true;
35 +       }
36 +
37         phy = &dev->phy;
38  
39         if (conf_is_ht(conf))
40 @@ -3670,6 +3684,9 @@ out_mac_enable:
41  out_unlock_mutex:
42         mutex_unlock(&wl->mutex);
43  
44 +       if (wl->vif && reload_bss)
45 +               b43_op_bss_info_changed(hw, wl->vif, &wl->vif->bss_conf, ~0);
46 +
47         return err;
48  }
49  
50 @@ -3758,7 +3775,8 @@ static void b43_op_bss_info_changed(stru
51         if (changed & BSS_CHANGED_BEACON_INT &&
52             (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
53              b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
54 -            b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
55 +            b43_is_mode(wl, NL80211_IFTYPE_ADHOC)) &&
56 +           conf->beacon_int)
57                 b43_set_beacon_int(dev, conf->beacon_int);
58  
59         if (changed & BSS_CHANGED_BASIC_RATES)
60 @@ -4496,6 +4514,9 @@ static int b43_op_add_interface(struct i
61   out_mutex_unlock:
62         mutex_unlock(&wl->mutex);
63  
64 +       if (err == 0)
65 +               b43_op_bss_info_changed(hw, vif, &vif->bss_conf, ~0);
66 +
67         return err;
68  }
69  
70 @@ -4566,6 +4587,9 @@ static int b43_op_start(struct ieee80211
71   out_mutex_unlock:
72         mutex_unlock(&wl->mutex);
73  
74 +       /* reload configuration */
75 +       b43_op_config(hw, ~0);
76 +
77         return err;
78  }
79  
80 @@ -4722,10 +4746,18 @@ out:
81         if (err)
82                 wl->current_dev = NULL; /* Failed to init the dev. */
83         mutex_unlock(&wl->mutex);
84 -       if (err)
85 +
86 +       if (err) {
87                 b43err(wl, "Controller restart FAILED\n");
88 -       else
89 -               b43info(wl, "Controller restarted\n");
90 +               return;
91 +       }
92 +
93 +       /* reload configuration */
94 +       b43_op_config(wl->hw, ~0);
95 +       if (wl->vif)
96 +               b43_op_bss_info_changed(wl->hw, wl->vif, &wl->vif->bss_conf, ~0);
97 +
98 +       b43info(wl, "Controller restarted\n");
99  }
100  
101  static int b43_setup_bands(struct b43_wldev *dev,