--- src/p80211/p80211wext.c	(revision 1865)
+++ src/p80211/p80211wext.c	(working copy)
@@ -81,6 +81,12 @@
 /* compatibility to wireless extensions */
 #ifdef WIRELESS_EXT
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 27) && \
+    !defined(IW_REQUEST_FLAG_COMPAT)
+#define iwe_stream_add_event(a, b, c, d, e) iwe_stream_add_event(b, c, d, e)
+#define iwe_stream_add_point(a, b, c, d, e) iwe_stream_add_point(b, c, d, e)
+#endif
+
 static UINT8 p80211_mhz_to_channel(UINT16 mhz)
 {
 	if (mhz >= 5000) {
@@ -1520,7 +1526,8 @@
  * airo driver code.
  */
 static char *
-wext_translate_bss(char *current_ev, char *end_buf, p80211msg_dot11req_scan_results_t *bss)
+wext_translate_bss(struct iw_request_info *info, char *current_ev,
+		   char *end_buf, p80211msg_dot11req_scan_results_t *bss)
 {
 	struct iw_event iwe;	/* Temporary buffer */
 
@@ -1528,7 +1535,8 @@
 	memcpy(iwe.u.ap_addr.sa_data, bss->bssid.data.data, WLAN_BSSID_LEN);
 	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
 	iwe.cmd = SIOCGIWAP;
-	current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_ADDR_LEN);
+	current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,
+					  IW_EV_ADDR_LEN);
 
 	/* The following entries will be displayed in the same order we give them */
 
@@ -1544,7 +1552,8 @@
 		iwe.u.data.length = size;
 		iwe.u.data.flags = 1;
 		iwe.cmd = SIOCGIWESSID;
-		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, &essid[0]);
+		current_ev = iwe_stream_add_point(info, current_ev, end_buf,
+						  &iwe, &essid[0]);
 		WLAN_LOG_DEBUG(1, " essid size OK.\n");
 	}
 
@@ -1563,7 +1572,8 @@
 	}
 	iwe.cmd = SIOCGIWMODE;
 	if (iwe.u.mode)
-		current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_UINT_LEN);
+		current_ev = iwe_stream_add_event(info, current_ev, end_buf,
+						  &iwe, IW_EV_UINT_LEN);
 
 	/* Encryption capability */
 	if (bss->privacy.data == P80211ENUM_truth_true)
@@ -1572,13 +1582,15 @@
 		iwe.u.data.flags = IW_ENCODE_DISABLED;
 	iwe.u.data.length = 0;
 	iwe.cmd = SIOCGIWENCODE;
-	current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, NULL);
+	current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe,
+					  NULL);
 
 	/* Add frequency. (short) bss->channel is the frequency in MHz */
 	iwe.u.freq.m = bss->dschannel.data;
 	iwe.u.freq.e = 0;
 	iwe.cmd = SIOCGIWFREQ;
-	current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
+	current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,
+					  IW_EV_FREQ_LEN);
 
 	/* Add quality statistics */
 	iwe.u.qual.level = bss->signal.data;
@@ -1586,7 +1598,8 @@
 	/* do a simple SNR for quality */
 	iwe.u.qual.qual = qual_as_percent(bss->signal.data - bss->noise.data);
 	iwe.cmd = IWEVQUAL;
-	current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
+	current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,
+					  IW_EV_QUAL_LEN);
 
 	return current_ev;
 }
@@ -1627,7 +1640,8 @@
 			break;
 		}
 		  
-		current_ev = wext_translate_bss(current_ev, extra + IW_SCAN_MAX_DATA, &msg);
+		current_ev = wext_translate_bss(info, current_ev,
+						extra + IW_SCAN_MAX_DATA, &msg);
 		scan_good = 1;
 		i++;
 	} while (i < IW_MAX_AP);
--- src/p80211/p80211netdev.c
+++ src/p80211/p80211netdev.c
@@ -869,6 +869,30 @@ static int wlan_change_mtu(netdevice_t *dev, int new_mtu)
         return 0;
 }
 
+/*---------------------------------------------------------
+ * wlan_alloc_netdev
+ *
+ * create a netdev properly over different kernel versions
+ * this should work with kernels earlier than 2.6.26, and if
+ * anyone cares they can change it
+----------------------------------------------------------*/   
+
+static inline netdevice_t * wlan_alloc_netdev() {
+	netdevice_t *dev;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) )
+	dev = alloc_netdev(0,"wlan%d",ether_setup);
+#else
+	dev = kmalloc(sizeof(netdevice_t), GFP_ATOMIC);
+	if ( dev ) {
+		memset( dev, 0, sizeof(netdevice_t));
+		ether_setup(dev);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) )
+		dev->nd_net = &init_net;
+#endif
+	}
+#endif
+	return dev;
+}
 
 
 /*----------------------------------------------------------------
@@ -911,14 +935,12 @@ int wlan_setup(wlandevice_t *wlandev)
 		     p80211netdev_rx_bh, 
 		     (unsigned long)wlandev);
 
-	/* Allocate and initialize the struct device */
-	dev = kmalloc(sizeof(netdevice_t), GFP_ATOMIC);
+	/* Allocate and initialize the struct net device */
+	dev = wlan_alloc_netdev();
 	if ( dev == NULL ) {
 		WLAN_LOG_ERROR("Failed to alloc netdev.\n");
 		result = 1;
 	} else {
-		memset( dev, 0, sizeof(netdevice_t));
-		ether_setup(dev);
 		wlandev->netdev = dev;
 		dev->priv = wlandev;
 		dev->hard_start_xmit =	p80211knetdev_hard_start_xmit;
@@ -946,10 +968,8 @@ int wlan_setup(wlandevice_t *wlandev)
 		dev->wireless_handlers = &p80211wext_handler_def;
 #endif
 #endif
-	
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) )
-		dev_net_set(dev, &init_net);
-#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) )
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
 		dev->nd_net = &init_net;
 #endif
 		
@@ -1044,7 +1064,12 @@ int register_wlandev(wlandevice_t *wlandev)
 	netdevice_t	*dev = wlandev->netdev;
 
 	DBFENTER;
-
+/* alloc_netdev already sets up the name */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) )
+	i = register_netdev(dev);
+	if (i) 
+		return i;
+#else
 	i = dev_alloc_name(wlandev->netdev, "wlan%d");
 	if (i >= 0) {
 		i = register_netdev(wlandev->netdev);
@@ -1058,6 +1083,8 @@ int register_wlandev(wlandevice_t *wlandev)
 #else
 	strcpy(wlandev->name, dev->name);
 #endif
+#endif
+
 
 #ifdef CONFIG_PROC_FS
 	if (proc_p80211) {