The patch "wext: refactor" by Johannes Berg refactored wext code so that new kernels no longer get the wext handlers through struct netdevice, instead they get it through the struct wiphy which is cfg80211 specific. For old kernels this means you get not wext handlers anymore when backporting code, this adds the wext handler back to the netdevice wireless_handlers to let compat users use wext again. We do this for every kernel version because the struct wiphy is changing from kernel version to version. At least the struct from kernel 2.6.33 and 2.6.34 are incompatible and the kernel would dereference some wrong type in the struct and oops. The old interface is not affected by this. This will cause that CONFIG_CFG80211_WEXT still depends on CONFIG_WIRELESS_EXT in compat-wireless. --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -385,10 +385,6 @@ struct wiphy *wiphy_new(const struct cfg INIT_LIST_HEAD(&rdev->bss_list); INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done); INIT_WORK(&rdev->sched_scan_results_wk, __cfg80211_sched_scan_results); -#ifdef CONFIG_CFG80211_WEXT - rdev->wiphy.wext = &cfg80211_wext_handler; -#endif - device_initialize(&rdev->wiphy.dev); rdev->wiphy.dev.class = &ieee80211_class; rdev->wiphy.dev.platform_data = rdev; @@ -841,6 +837,15 @@ static int cfg80211_netdev_notifier_call wdev->sme_state = CFG80211_SME_IDLE; mutex_unlock(&rdev->devlist_mtx); #ifdef CONFIG_CFG80211_WEXT +#ifdef CONFIG_WIRELESS_EXT + if (!dev->wireless_handlers) + dev->wireless_handlers = &cfg80211_wext_handler; +#else + printk_once(KERN_WARNING "cfg80211: wext will not work because " + "kernel was compiled with CONFIG_WIRELESS_EXT=n. " + "Tools using wext interface, like iwconfig will " + "not work.\n"); +#endif wdev->wext.default_key = -1; wdev->wext.default_mgmt_key = -1; wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;