]> Pileus Git - ~andy/linux/blobdiff - drivers/net/wireless/rndis_wlan.c
rndis_wlan: enable infrastructure before setting random essid
[~andy/linux] / drivers / net / wireless / rndis_wlan.c
index c28fde59c32bf05c73e8a7e40963445f7e9a8b5d..c5a674d8d1fbc37b85b671bcda0e0f8b62f15048 100644 (file)
@@ -921,6 +921,7 @@ static int freq_to_dsconfig(struct iw_freq *freq, unsigned int *dsconfig)
 /*
  * common functions
  */
+static int set_infra_mode(struct usbnet *usbdev, int mode);
 static void restore_keys(struct usbnet *usbdev);
 static int rndis_check_bssid_list(struct usbnet *usbdev);
 
@@ -1014,6 +1015,11 @@ static int disassociate(struct usbnet *usbdev, int reset_ssid)
        /* disassociate causes radio to be turned off; if reset_ssid
         * is given, set random ssid to enable radio */
        if (reset_ssid) {
+               /* Set device to infrastructure mode so we don't get ad-hoc
+                * 'media connect' indications with the random ssid.
+                */
+               set_infra_mode(usbdev, NDIS_80211_INFRA_INFRA);
+
                ssid.length = cpu_to_le32(sizeof(ssid.essid));
                get_random_bytes(&ssid.essid[2], sizeof(ssid.essid)-2);
                ssid.essid[0] = 0x1;
@@ -1526,7 +1532,8 @@ static int rndis_change_virtual_intf(struct wiphy *wiphy,
                                        enum nl80211_iftype type, u32 *flags,
                                        struct vif_params *params)
 {
-       struct usbnet *usbdev = netdev_priv(dev);
+       struct rndis_wlan_private *priv = wiphy_priv(wiphy);
+       struct usbnet *usbdev = priv->usbdev;
        int mode;
 
        switch (type) {
@@ -1540,6 +1547,8 @@ static int rndis_change_virtual_intf(struct wiphy *wiphy,
                return -EINVAL;
        }
 
+       priv->wdev.iftype = type;
+
        return set_infra_mode(usbdev, mode);
 }