diff -Naur rtl8180-0.21_orig/ieee80211_crypt.c rtl8180-0.21_patched/ieee80211_crypt.c
--- rtl8180-0.21_orig/ieee80211_crypt.c	2004-11-27 20:33:23.000000000 +0100
+++ rtl8180-0.21_patched/ieee80211_crypt.c	2007-02-18 17:35:03.000000000 +0100
@@ -11,8 +11,10 @@
  *
  */
 #ifndef CONFIG_IEEE80211_NOWEP
-#include <linux/config.h>
 #include <linux/version.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
+#include <linux/config.h>
+#endif
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
diff -Naur rtl8180-0.21_orig/ieee80211_crypt_wep.c rtl8180-0.21_patched/ieee80211_crypt_wep.c
--- rtl8180-0.21_orig/ieee80211_crypt_wep.c	2005-04-12 14:25:42.000000000 +0200
+++ rtl8180-0.21_patched/ieee80211_crypt_wep.c	2007-02-18 17:35:03.000000000 +0100
@@ -9,8 +9,10 @@
  * more details.
  */
 #ifndef CONFIG_IEEE80211_NOWEP
-#include <linux/config.h>
 #include <linux/version.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
+#include <linux/config.h>
+#endif
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
@@ -28,7 +30,11 @@
 #endif	
 
 #include <linux/crypto.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) 
 #include <asm/scatterlist.h>
+#else
+#include <linux/scatterlist.h>
+#endif
 #include <linux/crc32.h>
 
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,47))
diff -Naur rtl8180-0.21_orig/ieee80211_module.c rtl8180-0.21_patched/ieee80211_module.c
--- rtl8180-0.21_orig/ieee80211_module.c	2005-04-15 00:29:23.000000000 +0200
+++ rtl8180-0.21_patched/ieee80211_module.c	2007-02-18 17:35:03.000000000 +0100
@@ -37,8 +37,11 @@
   
 *******************************************************************************/
 #include <linux/init.h>
+#include <linux/version.h>
 #include <linux/compiler.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
 #include <linux/config.h>
+#endif
 #include <linux/errno.h>
 #include <linux/if_arp.h>
 #include <linux/in6.h>
@@ -53,7 +56,6 @@
 #include <linux/slab.h>
 #include <linux/tcp.h>
 #include <linux/types.h>
-#include <linux/version.h>
 #include <linux/wireless.h>
 #include <linux/etherdevice.h>
 #include <asm/uaccess.h>
diff -Naur rtl8180-0.21_orig/ieee80211_rx.c rtl8180-0.21_patched/ieee80211_rx.c
--- rtl8180-0.21_orig/ieee80211_rx.c	2005-04-12 14:13:18.000000000 +0200
+++ rtl8180-0.21_patched/ieee80211_rx.c	2007-02-18 17:35:03.000000000 +0100
@@ -16,8 +16,11 @@
  * more details.
  */
 
+#include <linux/version.h>
 #include <linux/compiler.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
 #include <linux/config.h>
+#endif
 #include <linux/errno.h>
 #include <linux/if_arp.h>
 #include <linux/in6.h>
@@ -32,7 +35,6 @@
 #include <linux/slab.h>
 #include <linux/tcp.h>
 #include <linux/types.h>
-#include <linux/version.h>
 #include <linux/wireless.h>
 #include <linux/etherdevice.h>
 #include <asm/uaccess.h>
diff -Naur rtl8180-0.21_orig/ieee80211_tx.c rtl8180-0.21_patched/ieee80211_tx.c
--- rtl8180-0.21_orig/ieee80211_tx.c	2005-04-12 23:02:17.000000000 +0200
+++ rtl8180-0.21_patched/ieee80211_tx.c	2007-02-18 17:35:03.000000000 +0100
@@ -31,7 +31,10 @@
 
 ******************************************************************************/
 #include <linux/compiler.h>
+#include <linux/version.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
 #include <linux/config.h>
+#endif
 #include <linux/errno.h>
 #include <linux/if_arp.h>
 #include <linux/in6.h>
@@ -46,7 +49,6 @@
 #include <linux/slab.h>
 #include <linux/tcp.h>
 #include <linux/types.h>
-#include <linux/version.h>
 #include <linux/wireless.h>
 #include <linux/etherdevice.h>
 #include <asm/uaccess.h>
@@ -577,6 +579,14 @@
 	
 	spin_lock_irqsave(&ieee->lock,flags);
 	
+	if (ieee->iw_mode == IW_MODE_MONITOR) {
+		ieee->func->hard_data_xmit(ieee->dev,skb,0);
+		dev_kfree_skb_any(skb);
+		ieee->stats.tx_packets++;
+		ieee->dev->trans_start = jiffies;
+		goto exit;
+	}
+	
 	if(ieee->queue_stop){
 		IEEE80211DMESG("EE: IEEE hard_start_xmit invoked when kernel queue should be stopped");
 		netif_stop_queue(ieee->dev);
diff -Naur rtl8180-0.21_orig/ieee80211_wx.c rtl8180-0.21_patched/ieee80211_wx.c
--- rtl8180-0.21_orig/ieee80211_wx.c	2005-04-10 19:54:20.000000000 +0200
+++ rtl8180-0.21_patched/ieee80211_wx.c	2007-02-18 17:35:03.000000000 +0100
@@ -34,6 +34,9 @@
 ******************************************************************************/
 #include <linux/wireless.h>
 #include <linux/version.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
+#include <linux/config.h>
+#endif
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
 #include <linux/kmod.h> /* request_module */
 #include <linux/kernel.h>
diff -Naur rtl8180-0.21_orig/Makefile rtl8180-0.21_patched/Makefile
--- rtl8180-0.21_orig/Makefile	2005-02-27 19:48:47.000000000 +0100
+++ rtl8180-0.21_patched/Makefile	2007-02-18 17:34:21.000000000 +0100
@@ -59,7 +59,7 @@
 	make -C $(KSRC) SUBDIRS=$(PWD) modules
 
 2.6:
-	$(MAKE) -C $(KSRC) SUBDIRS=$(PWD) MODVERDIR=$(PWD) modules
+	$(MAKE) -C $(KSRC) SUBDIRS=$(PWD) modules
 
 clean:
 	rm -f *.mod.c *.mod *.o .*.cmd *.ko .*.flags
diff -Naur rtl8180-0.21_orig/Makefile26 rtl8180-0.21_patched/Makefile26
--- rtl8180-0.21_orig/Makefile26	2005-02-27 19:48:48.000000000 +0100
+++ rtl8180-0.21_patched/Makefile26	2007-02-18 17:34:21.000000000 +0100
@@ -26,7 +26,7 @@
 	rm -f *.mod.c *.mod *.o .*.cmd *.ko 
 	rm -rf $(PWD)/tmp
 modules:
-	$(MAKE) -C $(KSRC) SUBDIRS=$(PWD) MODVERDIR=$(PWD) modules
+	$(MAKE) -C $(KSRC) SUBDIRS=$(PWD) modules
 
 MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless
 MOD_ALGDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/alg
diff -Naur rtl8180-0.21_orig/r8180_core.c rtl8180-0.21_patched/r8180_core.c
--- rtl8180-0.21_orig/r8180_core.c	2005-04-12 14:39:56.000000000 +0200
+++ rtl8180-0.21_patched/r8180_core.c	2007-02-18 17:35:03.000000000 +0100
@@ -121,6 +121,7 @@
 MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>");
 MODULE_DESCRIPTION("Linux driver for Realtek RTL8180 WiFi cards");
 
+#if 0
 MODULE_PARM(ifname,"s");
 MODULE_PARM_DESC(devname," Net interface name, wlan%d=default");
 
@@ -132,7 +133,7 @@
 
 MODULE_PARM(channels,"i");
 MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
-
+#endif
 
 static int __devinit rtl8180_pci_probe(struct pci_dev *pdev, 
 				       const struct pci_device_id *id);
@@ -452,13 +453,14 @@
 }		
 
 
-
+#if WIRELESS_EXT < 17
 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev)
 {
        struct r8180_priv *priv = dev->priv;
 
        return &priv->wstats;
 }
+#endif
 
 void rtl8180_proc_module_init(void)
 {	
@@ -2204,11 +2206,12 @@
 void rtl8180_hard_data_xmit(struct net_device *dev,struct sk_buff *skb,short morefrag)
 {
 	struct r8180_priv *priv = (struct r8180_priv *)dev->priv;
-	int mode;
+	int mode, priority = LOW_PRIORITY;
 	//unsigned long flags;
 	
 	mode = priv->ieee80211->iw_mode;
-	
+	if( mode == IW_MODE_MONITOR )
+		priority = HI_PRIORITY;
 	
 	/*
 	* This function doesn't require lock because we make
@@ -2220,13 +2223,13 @@
 	//spin_lock_irqsave(&priv->tx_lock,flags);	
 			
 	
-	if (!check_nic_enought_desc(dev, LOW_PRIORITY)){
+	if (!check_nic_enought_desc(dev, priority)){
 		DMESG("Error: no descriptor left by previous TX (avail %d) ",
-			get_curr_tx_free_desc(dev, LOW_PRIORITY));
+			get_curr_tx_free_desc(dev, priority));
 		ieee80211_r8180_stop_queue(priv->ieee80211);
 	}
-	rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag,0);
-	if (!check_nic_enought_desc(dev, LOW_PRIORITY))
+	rtl8180_tx(dev, (u32*)skb->data, skb->len, priority, morefrag,0);
+	if (!check_nic_enought_desc(dev, priority))
 		ieee80211_r8180_stop_queue(priv->ieee80211);
 		
 	//spin_unlock_irqrestore(&priv->tx_lock,flags);	
@@ -2634,7 +2637,11 @@
 	spin_lock_init(&priv->tx_lock);
 	sema_init(&priv->wx_sem,1);
 	priv->workqueue = create_workqueue(DRV_NAME);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
 	INIT_WORK(&priv->IBSS_work,(void(*)(void*)) rtl8180_IBSS_create_wq,dev);
+#else
+	INIT_WORK(&priv->IBSS_work,(void(*)(void*)) rtl8180_IBSS_create_wq);
+#endif
 	
 	tasklet_init(&priv->irq_rx_tasklet,
 		     (void(*)(unsigned long)) rtl8180_irq_rx_tasklet,
@@ -3411,10 +3418,18 @@
 	if (priv->ieee80211->iw_mode == IW_MODE_ADHOC) 
 		rtl8180_IBSS_create(dev);
 		
-/*	if (priv->ieee80211->iw_mode == IW_MODE_MONITOR){ 
+	if (priv->ieee80211->iw_mode == IW_MODE_MONITOR) {
+		priv->retry_rts = 0;
+		priv->retry_data = 0;
+		rtl8180_tx_enable(dev);
+
 		netif_carrier_on(dev);
+		if(netif_queue_stopped(dev))
+			netif_wake_queue(dev);
+		else
+			netif_start_queue(dev);
 	}
-*/
+
 	if (priv->ieee80211->iw_mode == IW_MODE_INFRA) {
 		
 	//	rtl8180_tx_enable(dev);
@@ -3608,8 +3623,7 @@
 	pio_flags = (unsigned long)pci_resource_flags (pdev, 0);
 	
 	if (!(pio_flags & IORESOURCE_IO)) {
-		DMESG("%s: region #0 not a PIO resource, aborting", 
-		      pdev->slot_name);
+		DMESG("r8180: region #0 not a PIO resource, aborting");
 		goto fail;
 	}
 	
@@ -3629,8 +3643,7 @@
 	pmem_flags = pci_resource_flags (pdev, 1);
 	
 	if (!(pmem_flags & IORESOURCE_MEM)) {
-		DMESG("%s: region #1 not a MMIO resource, aborting", 
-		      pdev->slot_name);
+		DMESG("r8180: region #1 not a MMIO resource, aborting");
 		goto fail;
 	}
 	
@@ -3664,7 +3677,12 @@
 	dev->do_ioctl = do_ioctl;
 	dev->set_multicast_list = r8180_set_multicast;
 	dev->set_mac_address = r8180_set_mac_adr;
+#if WIRELESS_EXT >= 12
+#if WIRELESS_EXT < 17
 	dev->get_wireless_stats = r8180_get_wireless_stats;
+#endif
+	dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def;
+#endif
 	dev->type=ARPHRD_ETHER;
 	
 	if (dev_alloc_name(dev, ifname) < 0){
diff -Naur rtl8180-0.21_orig/r8180.h rtl8180-0.21_patched/r8180.h
--- rtl8180-0.21_orig/r8180.h	2005-04-11 18:36:26.000000000 +0200
+++ rtl8180-0.21_patched/r8180.h	2007-02-18 17:35:09.000000000 +0100
@@ -25,7 +25,10 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/version.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19))
 #include <linux/config.h>
+#endif
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/sched.h>
