diff -urpN current.1/acx_func.h current.2/acx_func.h
--- current.1/acx_func.h	Mon Dec 12 09:11:22 2005
+++ current.2/acx_func.h	Mon Dec 12 08:53:01 2005
@@ -591,6 +591,8 @@ char* acxpci_s_proc_diag_output(char *p,
 int acxpci_proc_eeprom_output(char *p, wlandevice_t *priv);
 void acxpci_set_interrupt_mask(wlandevice_t *priv);
 int acx100pci_s_set_tx_level(wlandevice_t *priv, u8 level_dbm);
+//vda
+int acxpci_s_reset_dev(wlandevice_t *priv);
 
 void acx_s_msleep(int ms);
 int acx_s_init_mac(wlandevice_t *priv);
diff -urpN current.1/acx_struct.h current.2/acx_struct.h
--- current.1/acx_struct.h	Thu Dec  1 08:19:45 2005
+++ current.2/acx_struct.h	Mon Dec 12 08:52:21 2005
@@ -206,6 +206,7 @@ enum { acx_debug = 0 };
 #define ACX_AFTER_IRQ_TX_CLEANUP	0x10
 #define ACX_AFTER_IRQ_COMPLETE_SCAN	0x20
 #define ACX_AFTER_IRQ_RESTART_SCAN	0x40
+#define ACX_AFTER_IRQ_RESET_EVERYTHING	0x80
 
 /***********************************************************************
 ** Tx/Rx buffer sizes and watermarks
diff -urpN current.1/common.c current.2/common.c
--- current.1/common.c	Mon Dec 12 09:11:04 2005
+++ current.2/common.c	Mon Dec 12 09:06:10 2005
@@ -6631,6 +6631,10 @@ acx_s_after_interrupt_recalib(wlandevice
 		priv->recalib_time_last_success = jiffies;
 		priv->recalib_failure_count = 0;
 	} else {
+		/* Something is very wrong, taking drastic measures */
+		acx_schedule_task(priv, ACX_AFTER_IRQ_RESET_EVERYTHING);
+	}
+#if 0
 		/* failed: resubmit, but only limited
 		 * amount of times within some time range
 		 * to prevent endless loop */
@@ -6648,6 +6652,29 @@ acx_s_after_interrupt_recalib(wlandevice
 			acx_schedule_task(priv, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
 		}
 	}
+#endif
+}
+
+//vda
+static void
+acx_s_after_interrupt_reset_everything(wlandevice_t *priv)
+{
+	FN_ENTER;
+
+	printk("%s: resetting, please report\n", priv->netdev->name);
+
+	if (IS_PCI(priv)) {
+		if (OK != acxpci_s_reset_dev(priv))
+            		goto end;
+		/* Prevent leak. init_mac will alloc them again */
+		acxpci_free_desc_queues(priv);
+	}
+        if (OK != acx_s_init_mac(priv))
+                goto end;
+	priv->set_mask |= GETSET_ALL;
+	acx_s_update_card_settings(priv);
+end:
+	FN_EXIT0;
 }
 
 static void
@@ -6672,9 +6699,15 @@ acx_e_after_interrupt_task(void *data)
 		acx_unlock(priv, flags);
 	}
 #endif
+//vda
 	/* we see lotsa tx errors */
 	if (priv->after_interrupt_jobs & ACX_AFTER_IRQ_CMD_RADIO_RECALIB) {
 		acx_s_after_interrupt_recalib(priv);
+	}
+
+	if (priv->after_interrupt_jobs & ACX_AFTER_IRQ_RESET_EVERYTHING) {
+		acx_s_after_interrupt_reset_everything(priv);
+		CLEAR_BIT(priv->after_interrupt_jobs, ACX_AFTER_IRQ_RESET_EVERYTHING);
 	}
 
 	/* a poor interrupt code wanted to do update_card_settings() */
diff -urpN current.1/pci.c current.2/pci.c
--- current.1/pci.c	Mon Dec 12 09:11:34 2005
+++ current.2/pci.c	Mon Dec 12 08:52:21 2005
@@ -886,7 +886,7 @@ read_eeprom_area(wlandevice_t *priv)
 }
 
 
-static int
+int
 acxpci_s_reset_dev(wlandevice_t *priv)
 {
 	const char* msg = "";
