Package: acx100
Version: 20060521-3
Severity: normal
Tags: patch

Hi,

Attached is the diff for my acx100 20070101-1 NMU.

-- 
                                        With best regards,
                        Stanislav Kogut <[EMAIL PROTECTED]>
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/acx_config.h /tmp/DfExYlGbnH/acx100-20070101/acx_config.h
--- /tmp/wYqKdCn6l2/acx100-20060521/acx_config.h	2006-05-20 21:27:57.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/acx_config.h	2007-01-05 13:05:20.000000000 +0200
@@ -2,7 +2,7 @@
 #define CONFIG_ACX_PCI 1
 #define CONFIG_ACX_USB 1
 
-#define ACX_RELEASE "v0.3.35"
+#define ACX_RELEASE "v0.3.36"
 
 /* set to 0 if you don't want any debugging code to be compiled in */
 /* set to 1 if you want some debugging */
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/acx_func.h /tmp/DfExYlGbnH/acx100-20070101/acx_func.h
--- /tmp/wYqKdCn6l2/acx100-20060521/acx_func.h	2006-05-20 21:27:56.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/acx_func.h	2006-06-03 18:46:59.000000000 +0300
@@ -241,6 +241,13 @@
 }
 
 
+static inline int
+is_hidden_essid(char *essid)
+{
+	return (('\0' == essid[0]) ||
+		((' ' == essid[0]) && ('\0' == essid[1])));
+}
+
 /***********************************************************************
 ** LOCKING
 ** We have adev->sem and adev->lock.
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/acx_struct.h /tmp/DfExYlGbnH/acx100-20070101/acx_struct.h
--- /tmp/wYqKdCn6l2/acx100-20060521/acx_struct.h	2006-05-20 21:27:59.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/acx_struct.h	2006-08-13 23:49:57.000000000 +0300
@@ -298,12 +298,12 @@
 DEF_IE(1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME	,0x1008, 0x04);
 DEF_IE(1xx_IE_DOT11_GROUP_ADDR		,0x1009, -1);
 DEF_IE(1xx_IE_DOT11_CURRENT_REG_DOMAIN	,0x100a, 0x02);
-//It's harmless to have larger struct. Use USB case always.
+/* It's harmless to have larger struct. Use USB case always. */
 DEF_IE(1xx_IE_DOT11_CURRENT_ANTENNA	,0x100b, 0x02);	/* in fact len=1 for PCI */
 DEF_IE(1xx_IE_DOT11_UNKNOWN_100C	,0x100c, -1);	/* mapped to cfgInvalid in FW150 */
 DEF_IE(1xx_IE_DOT11_TX_POWER_LEVEL	,0x100d, 0x01); /* TNETW1450 has length 2!! */
 DEF_IE(1xx_IE_DOT11_CURRENT_CCA_MODE	,0x100e, 0x02);	/* in fact len=1 for PCI */
-//USB doesn't return anything - len==0?!
+/* USB doesn't return anything - len==0?! */
 DEF_IE(100_IE_DOT11_ED_THRESHOLD	,0x100f, 0x04);
 DEF_IE(1xx_IE_DOT11_WEP_DEFAULT_KEY_SET	,0x1010, 0x01);	/* set default key ID; TNETW1450: length 2 */
 DEF_IE(100_IE_DOT11_UNKNOWN_1011	,0x1011, -1);	/* mapped to cfgInvalid in FW150 */
@@ -495,7 +495,7 @@
 
 /* I've hoped it's a 802.11 PHY header, but no...
  * so far, I've seen on acx111:
- * 0000 3a00 0000 0000 IBBS Beacons
+ * 0000 3a00 0000 0000 IBSS Beacons
  * 0000 3c00 0000 0000 ESS Beacons
  * 0000 2700 0000 0000 Probe requests
  * --vda
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/Changelog /tmp/DfExYlGbnH/acx100-20070101/Changelog
--- /tmp/wYqKdCn6l2/acx100-20060521/Changelog	2006-05-20 21:27:59.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/Changelog	2007-01-11 00:03:44.000000000 +0200
@@ -104,6 +104,31 @@
 13:14:13 wlan0: tx error 0x20, buf 07!
 13:14:13 wlan0: tx error 0x20, buf 08!
 
+[20070101] 0.3.36
+* Andreas Mohr <[EMAIL PROTECTED]>
+  - cope with *tons* of Linux kernel API changes (via added version checks):
+    - linux/utsrelease.h required in 2.6.18
+    - linux/config.h include removal in 2.6.19
+    - pt_regs interrupt handler arg removal in 2.6.19
+    - INIT_WORK() change in 2.6.20-rc1-git1
+    - "ESSID last char missing" API change in WE-21
+    If anything fails to work for a real non-prerelease mainline kernel version
+    (supported ones, that is: >= 2.6.10), then please yell immediately!
+    Those people *REALLY* want me to concentrate on getting this stuff ready for
+    mainline, it seems...
+  - MAC address change fix (contributed by Carlos MartМn Nieto/Luis Padilla)
+  - fix iwlist wlan0 scan output (updated wrong pointer variable --> only one single rate value listed, doh!)
+  - fix buggy hidden ESSID handling (didn't cover all variants in all places)
+  - corrected(?) duration/sequence values in assoc steps handling
+  - use ioremap_nocache() instead of ioremap() (safer)
+  - add another TNETW1450 USB ID
+  - FIX buggy "correction" of medium busy percentage log message
+  - small /proc/driver/acx_wlan0_diag addition
+  - much more verbose firmware image query log message
+  - updated format of main hardware status log message
+  - slightly enhanced Reason Code log messages
+  - minor cleanup
+
 [20060518]
 * Fix warnings about packed structs and printf format mismatches.
   Fix "implicit declaration of function dma_free_coherent" warning.
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/common.c /tmp/DfExYlGbnH/acx100-20070101/common.c
--- /tmp/wYqKdCn6l2/acx100-20060521/common.c	2006-05-20 21:27:58.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/common.c	2007-08-25 09:08:44.000000000 +0300
@@ -30,8 +30,10 @@
 ** ---------------------------------------------------------------------
 */
 
-#include <linux/config.h>
 #include <linux/version.h>
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
+#include <linux/config.h>
+#endif
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -501,8 +503,8 @@
 	/* 9 */	"reserved",
 	/*10 */	"Cannot support all requested capabilities in Capability Information field",
 	/*11 */	"Reassoc denied (reason outside of 802.11b scope)",
-	/*12 */	"Assoc denied (reason outside of 802.11b scope), maybe MAC filtering by peer?",
-	/*13 */	"Responding station doesnt support specified auth algorithm",
+	/*12 */	"Assoc denied (reason outside of 802.11b scope) -- maybe MAC filtering by peer?",
+	/*13 */	"Responding station doesnt support specified auth algorithm -- maybe WEP auth Open vs. Restricted?",
 	/*14 */	"Auth rejected: wrong transaction sequence number",
 	/*15 */	"Auth rejected: challenge failure",
 	/*16 */	"Auth rejected: timeout for next frame in sequence",
@@ -619,8 +621,8 @@
 		}
 
 		adev->firmware_numver = (u32)(
-				(hexarr[0] << 24) + (hexarr[1] << 16)
-				+ (hexarr[2] << 8) + hexarr[3]);
+				(hexarr[0] << 24) | (hexarr[1] << 16)
+				| (hexarr[2] << 8) | hexarr[3]);
 		log(L_DEBUG, "firmware_numver 0x%08X\n", adev->firmware_numver);
 	}
 	if (IS_ACX111(adev)) {
@@ -718,12 +720,12 @@
 		break;
 	}
 
-	printk("acx: form factor 0x%02X (%s), "
-		"radio type 0x%02X (%s), EEPROM version 0x%02X, "
-		"uploaded firmware '%s' (0x%08X)\n",
-		adev->form_factor, form_str, adev->radio_type, radio_str,
-		adev->eeprom_version, adev->firmware_version,
-		adev->firmware_id);
+	printk("acx: === chipset %s, radio type 0x%02X (%s), "
+		"form factor 0x%02X (%s), EEPROM version 0x%02X: "
+		"uploaded firmware '%s' ===\n",
+		adev->chip_name, adev->radio_type, radio_str,
+		adev->form_factor, form_str, adev->eeprom_version,
+		adev->firmware_version);
 
 	FN_EXIT0;
 }
@@ -1203,10 +1205,12 @@
 		"** PHY status **\n"
 		"tx_disabled %d, tx_level_dbm %d\n" /* "tx_level_val %d, tx_level_auto %d\n" */
 		"sensitivity %d, antenna 0x%02X, ed_threshold %d, cca %d, preamble_mode %d\n"
+		"rate_basic 0x%04X, rate_oper 0x%04X\n"
 		"rts_threshold %d, frag_threshold %d, short_retry %d, long_retry %d\n"
 		"msdu_lifetime %d, listen_interval %d, beacon_interval %d\n",
 		adev->tx_disabled, adev->tx_level_dbm, /* adev->tx_level_val, adev->tx_level_auto, */
 		adev->sensitivity, adev->antenna, adev->ed_threshold, adev->cca, adev->preamble_mode,
+		adev->rate_basic, adev->rate_oper,
 		adev->rts_threshold, adev->frag_threshold, adev->short_retry, adev->long_retry,
 		adev->msdu_lifetime, adev->listen_interval, adev->beacon_interval);
 
@@ -2749,8 +2753,11 @@
 
 	skb->dev = adev->ndev;
 	skb->dev->last_rx = jiffies;
-
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
+	skb_reset_mac_header(skb);
+#else
 	skb->mac.raw = skb->data;
+#endif
 	skb->ip_summed = CHECKSUM_NONE;
 	skb->pkt_type = PACKET_OTHERHOST;
 	skb->protocol = htons(ETH_P_80211_RAW);
@@ -4581,7 +4588,7 @@
 
 	/* People moan about this being too noisy at L_ASSOC */
 	log(L_DEBUG,
-		"found %s: ESSID='%s' ch=%d "
+		"found %s: ESSID=\"%s\" ch=%d "
 		"BSSID="MACSTR" caps=0x%04X SIR=%d SNR=%d\n",
 		(bss->cap_info & WF_MGMT_CAP_IBSS) ? "Ad-Hoc peer" : "AP",
 		bss->essid, bss->channel, MAC(bss->bssid), bss->cap_info,
@@ -4619,7 +4626,7 @@
 			** other candidates... */
 
 			printk("%s: association FAILED: peer sent "
-				"response code %d (%s)\n",
+				"Status Code %d (%s)\n",
 				adev->ndev->name, st, get_status_string(st));
 			res = NOT_OK;
 		}
@@ -4698,6 +4705,8 @@
 	seq = ieee2host16(*(req->auth_seq));
 	status = ieee2host16(*(req->status));
 
+	log(L_ASSOC, "auth algorithm %d, auth sequence %d, status %d\n", alg, seq, status);
+
 	ap = (adev->mode == ACX_MODE_3_AP);
 
 	if (adev->auth_alg <= 1) {
@@ -4708,8 +4717,6 @@
 			goto end;
 		}
 	}
-	log(L_ASSOC, "algorithm is ok\n");
-
 	if (ap) {
 		clt = acx_l_sta_list_get_or_add(adev, hdr->a2);
 		if (STA_LIST_ADD_CAN_FAIL && !clt) {
@@ -4729,7 +4736,6 @@
 
 	/* now check which step in the authentication sequence we are
 	 * currently in, and act accordingly */
-	log(L_ASSOC, "acx_process_authen auth seq step %d\n", seq);
 	switch (seq) {
 	case 1:
 		if (!ap)
@@ -4786,7 +4792,7 @@
 		acx_l_transmit_assoc_req(adev);
 		break;
 	}
-	result = NOT_OK;
+	result = OK;
 end:
 	FN_EXIT1(result);
 	return result;
@@ -4866,8 +4872,8 @@
 
 	FN_ENTER;
 
-	log(L_ASSOC, "sending authentication1 request, "
-		"awaiting response\n");
+	log(L_ASSOC, "sending authentication1 request (auth algo %d), "
+		"awaiting response\n", adev->auth_alg);
 
 	tx = acx_l_alloc_tx(adev);
 	if (!tx)
@@ -4880,7 +4886,9 @@
 	body = (void*)(head + 1);
 
 	head->fc = WF_FSTYPE_AUTHENi;
-	head->dur = host2ieee16(0x8000);
+	/* duration should be 0 instead of 0x8000 to have
+	 * the firmware calculate the value, right? */
+	head->dur = 0;
 	MAC_COPY(head->da, adev->bssid);
 	MAC_COPY(head->sa, adev->dev_addr);
 	MAC_COPY(head->bssid, adev->bssid);
@@ -4936,11 +4944,11 @@
 	body = (void*)(head + 1);
 
 	head->fc = WF_FSTYPE_AUTHENi;
-	head->dur = req->hdr->dur;
+	head->dur = 0 /* req->hdr->dur */;
 	MAC_COPY(head->da, req->hdr->a2);
 	MAC_COPY(head->sa, adev->dev_addr);
 	MAC_COPY(head->bssid, req->hdr->a3);
-	head->seq = req->hdr->seq;
+	head->seq = 0 /* req->hdr->seq */;
 
 	/* already in IEEE format, no endianness conversion */
 	body->auth_alg = *(req->auth_alg);
@@ -4992,8 +5000,11 @@
 	}
 	body = (void*)(head + 1);
 
+	/* add WF_FC_ISWEPi: auth step 3 needs to be encrypted */
 	head->fc = WF_FC_ISWEPi + WF_FSTYPE_AUTHENi;
 	/* FIXME: is this needed?? authen4 does it...
+	 * I think it's even wrong since we shouldn't re-use old
+	 * values but instead let the firmware calculate proper ones
 	head->dur = req->hdr->dur;
 	head->seq = req->hdr->seq;
 	*/
@@ -5040,11 +5051,11 @@
 	body = (void*)(head + 1);
 
 	head->fc = WF_FSTYPE_AUTHENi; /* 0xb0 */
-	head->dur = req->hdr->dur;
+	head->dur = 0 /* req->hdr->dur */;
 	MAC_COPY(head->da, req->hdr->a2);
 	MAC_COPY(head->sa, adev->dev_addr);
 	MAC_COPY(head->bssid, req->hdr->a3);
-	head->seq = req->hdr->seq;
+	head->seq = 0 /* req->hdr->seq  */;
 
 	/* already in IEEE format, no endianness conversion */
 	body->auth_alg = *(req->auth_alg);
@@ -5157,7 +5168,7 @@
 	/* calculate lengths */
 	packet_len = WLAN_HDR_A3_LEN + (p - body);
 
-	log(L_ASSOC, "association: requesting caps 0x%04X, ESSID '%s'\n",
+	log(L_ASSOC, "association: requesting caps 0x%04X, ESSID \"%s\"\n",
 		cap, adev->essid_for_assoc);
 
 	acx_l_tx_data(adev, tx, packet_len);
@@ -5274,7 +5285,7 @@
 		bss = &adev->sta_list[i];
 		if (!bss->used) continue;
 
-		log(L_ASSOC, "scan table: SSID='%s' CH=%d SIR=%d SNR=%d\n",
+		log(L_ASSOC, "scan table: SSID=\"%s\" CH=%d SIR=%d SNR=%d\n",
 			bss->essid, bss->channel, bss->sir, bss->snr);
 
 		if (!mac_is_bcast(adev->ap))
@@ -5351,9 +5362,7 @@
 			if (bss->channel == adev->channel)
 				break;
 		} else
-		if (!bss->essid[0]
-		 || ((' ' == bss->essid[0]) && !bss->essid[1])
-		) {
+		if (is_hidden_essid(bss->essid)) {
 			/* hmm, station with empty or single-space SSID:
 			 * using hidden SSID broadcast?
 			 */
@@ -5385,7 +5394,7 @@
 		bss = &adev->sta_list[idx_found];
 		adev->ap_client = bss;
 
-		if (bss->essid[0] == '\0') {
+		if (is_hidden_essid(bss->essid)) {
 			/* if the ESSID of the station we found is empty
 			 * (no broadcast), then use user-configured ESSID
 			 * instead */
@@ -6377,6 +6386,7 @@
 		u8 *paddr;
 
 		paddr = &stationID[4];
+		memcpy(adev->dev_addr, adev->ndev->dev_addr, ETH_ALEN);
 		for (i = 0; i < ETH_ALEN; i++) {
 			/* copy the MAC address we obtained when we noticed
 			 * that the ethernet iface's MAC changed
@@ -6784,7 +6794,7 @@
 				adev->ndev->name);
 			adev->recalib_msg_ratelimit++;
 			if (adev->recalib_msg_ratelimit == 5)
-				printk("disabling above message\n");
+				printk("disabling above message until next recalib\n");
 		}
 		return;
 	}
@@ -6821,11 +6831,18 @@
 	}
 }
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
+static void
+acx_e_after_interrupt_task(struct work_struct *work)
+{
+	acx_device_t *adev = container_of(work, acx_device_t, after_interrupt_task);
+#else
 static void
 acx_e_after_interrupt_task(void *data)
 {
 	struct net_device *ndev = (struct net_device*)data;
 	acx_device_t *adev = ndev2adev(ndev);
+#endif
 
 	FN_ENTER;
 
@@ -6940,8 +6957,12 @@
 acx_init_task_scheduler(acx_device_t *adev)
 {
 	/* configure task scheduler */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
+	INIT_WORK(&adev->after_interrupt_task, acx_e_after_interrupt_task);
+#else
 	INIT_WORK(&adev->after_interrupt_task, acx_e_after_interrupt_task,
 			adev->ndev);
+#endif
 }
 
 
@@ -6962,7 +6983,7 @@
 	SET_BIT(adev->set_mask, SET_TEMPLATES|SET_STA_LIST|GETSET_WEP
 		|GETSET_TXPOWER|GETSET_ANTENNA|GETSET_ED_THRESH|GETSET_CCA
 		|GETSET_REG_DOMAIN|GETSET_MODE|GETSET_CHANNEL
-		|GETSET_TX|GETSET_RX);
+		|GETSET_TX|GETSET_RX|GETSET_STATION_ID);
 
 	log(L_INIT, "updating initial settings on iface activation\n");
 	acx_s_update_card_settings(adev);
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/conv.c /tmp/DfExYlGbnH/acx100-20070101/conv.c
--- /tmp/wYqKdCn6l2/acx100-20060521/conv.c	2006-05-20 21:27:57.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/conv.c	2007-01-09 23:27:43.000000000 +0200
@@ -30,8 +30,10 @@
 ** ---------------------------------------------------------------------
 */
 
-#include <linux/config.h>
 #include <linux/version.h>
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
+#include <linux/config.h>
+#endif
 #include <linux/skbuff.h>
 #include <linux/if_arp.h>
 #include <linux/etherdevice.h>
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/debian/changelog /tmp/DfExYlGbnH/acx100-20070101/debian/changelog
--- /tmp/wYqKdCn6l2/acx100-20060521/debian/changelog	2007-08-25 09:08:44.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/debian/changelog	2007-08-25 09:08:44.000000000 +0300
@@ -1,3 +1,9 @@
+acx100 (20070101-1) unstable; urgency=low
+
+  * closes #405795
+
+ -- Stanislav V. Kogut <[EMAIL PROTECTED]>  Sat, 25 Aug 2007 08:35:17 +0300
+
 acx100 (20060521-3) unstable; urgency=low
 
   * Modified pci.h to enable building in 2.6.18. 
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/ioctl.c /tmp/DfExYlGbnH/acx100-20070101/ioctl.c
--- /tmp/wYqKdCn6l2/acx100-20060521/ioctl.c	2006-05-20 21:27:59.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/ioctl.c	2007-01-09 23:27:58.000000000 +0200
@@ -30,12 +30,14 @@
 ** ---------------------------------------------------------------------
 */
 
-#include <linux/config.h>
 #include <linux/version.h>
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
+#include <linux/config.h>
+#endif
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <asm/io.h>
-//#include <asm/uaccess.h> /* required for 2.4.x kernels; verify_write() */
+/* #include <asm/uaccess.h> */ /* required for 2.4.x kernels; verify_write() */
 #include <linux/if_arp.h>
 #include <linux/wireless.h>
 #include <net/iw_handler.h>
@@ -568,7 +570,7 @@
 		if (rate & 1) {
 			iwe.u.bitrate.value = *p * 500000; /* units of 500kb/s */
 			log(L_IOCTL, "scan, rate: %d\n", iwe.u.bitrate.value);
-			ptr = iwe_stream_add_value(ptr, ptr_rate, end_buf,
+			ptr_rate = iwe_stream_add_value(ptr, ptr_rate, end_buf,
 						&iwe, IW_EV_PARAM_LEN);
 		}
 		rate >>= 1;
@@ -662,6 +664,12 @@
 	log(L_IOCTL, "set ESSID '%*s', length %d, flags 0x%04X\n",
 					len, extra, len, dwrq->flags);
 
+#if WIRELESS_EXT >= 21
+	/* WE 21 gives real ESSID strlen, not +1 (trailing zero):
+	 * see LKML "[patch] drivers/net/wireless: correct reported ssid lengths" */
+	len += 1;
+#endif
+
 	acx_sem_lock(adev);
 
 	/* ESSID disabled? */
@@ -2232,7 +2240,10 @@
 
 	usage.busytime = le32_to_cpu(usage.busytime);
 	usage.totaltime = le32_to_cpu(usage.totaltime);
-	printk("%s: average busy percentage since last invocation: %d%% "
+	
+	/* yes, this is supposed to be "Medium" (singular of media),
+	   not "average"! OK, reword the message to make it obvious... */
+	printk("%s: busy percentage of medium (since last invocation): %d%% "
 		"(%u of %u microseconds)\n",
 		ndev->name,
 		usage.busytime / ((usage.totaltime / 100) + 1),
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/patch.diff /tmp/DfExYlGbnH/acx100-20070101/patch.diff
--- /tmp/wYqKdCn6l2/acx100-20060521/patch.diff	1970-01-01 03:00:00.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/patch.diff	2007-08-25 09:08:44.000000000 +0300
@@ -0,0 +1,29 @@
+--- acx-20070101/pci.c.orig	2007-07-24 03:57:41.000000000 -0700
++++ acx-20070101/pci.c	2007-07-24 03:59:20.000000000 -0700
+@@ -2104,7 +2104,11 @@
+ /* TODO: pci_set_power_state(pdev, PCI_D0); ? */
+
+ 	/* request shared IRQ handler */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)	
++	if (request_irq(ndev->irq, acxpci_i_interrupt, IRQF_SHARED, ndev->name, ndev)) {
++#else
+ 	if (request_irq(ndev->irq, acxpci_i_interrupt, SA_SHIRQ, ndev->name, ndev)) {
++#endif		
+ 		printk("%s: request_irq FAILED\n", ndev->name);
+ 		result = -EAGAIN;
+ 		goto done;
+--- acx-20070101/common.c.orig	2007-07-24 03:59:40.000000000 -0700
++++ acx-20070101/common.c	2007-07-24 04:01:23.000000000 -0700
+@@ -2753,8 +2753,11 @@
+ 
+ 	skb->dev = adev->ndev;
+ 	skb->dev->last_rx = jiffies;
+-
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
++	skb_reset_mac_header(skb);
++#else
+ 	skb->mac.raw = skb->data;
++#endif
+ 	skb->ip_summed = CHECKSUM_NONE;
+ 	skb->pkt_type = PACKET_OTHERHOST;
+ 	skb->protocol = htons(ETH_P_80211_RAW);
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/pci.c /tmp/DfExYlGbnH/acx100-20070101/pci.c
--- /tmp/wYqKdCn6l2/acx100-20060521/pci.c	2007-08-25 09:08:44.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/pci.c	2007-08-25 09:08:44.000000000 +0300
@@ -31,8 +31,16 @@
 */
 #define ACX_PCI 1
 
-#include <linux/config.h>
 #include <linux/version.h>
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
+#include <linux/config.h>
+#endif
+
+/* Linux 2.6.18+ uses <linux/utsrelease.h> */
+#ifndef UTS_RELEASE
+#include <linux/utsrelease.h>
+#endif
+
 #include <linux/compiler.h> /* required for Lx 2.6.8 ?? */
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -51,9 +59,6 @@
 #include <linux/pm.h>
 #include <linux/vmalloc.h>
 #include <linux/dma-mapping.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)
-#include <linux/utsrelease.h>
-#endif 
 
 #include "acx.h"
 
@@ -101,7 +106,11 @@
 /***********************************************************************
 */
 static void acxpci_i_tx_timeout(struct net_device *ndev);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
+static irqreturn_t acxpci_i_interrupt(int irq, void *dev_id);
+#else
 static irqreturn_t acxpci_i_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+#endif
 static void acxpci_i_set_multicast_list(struct net_device *ndev);
 
 static int acxpci_e_open(struct net_device *ndev);
@@ -626,6 +635,13 @@
 
 	FN_ENTER;
 
+	/* print exact chipset and radio ID to make sure people really get a clue on which files exactly they are supposed to provide,
+	 * since firmware loading is the biggest enduser PITA with these chipsets.
+	 * Not printing radio ID in 0xHEX in order to not confuse them into wrong file naming */
+	printk(	"acx: need to load firmware for acx1%02d chipset with radio ID %02x, please provide via firmware hotplug:\n"
+		"acx: either one file only (<c>ombined firmware image file, radio-specific) or two files (radio-less base image file *plus* separate <r>adio-specific extension file)\n",
+		IS_ACX111(adev)*11, adev->radio_type);
+
 	/* Try combined, then main image */
 	adev->need_radio_fw = 0;
 	snprintf(filename, sizeof(filename), "tiacx1%02dc%02X",
@@ -644,11 +660,11 @@
 
 	for (try = 1; try <= 5; try++) {
 		res = acxpci_s_write_fw(adev, fw_image, 0);
-		log(L_DEBUG|L_INIT, "acx_write_fw (main/combined):%d\n", res);
+		log(L_DEBUG|L_INIT, "acx_write_fw (main/combined): %d\n", res);
 		if (OK == res) {
 			res = acxpci_s_validate_fw(adev, fw_image, 0);
 			log(L_DEBUG|L_INIT, "acx_validate_fw "
-					"(main/combined):%d\n", res);
+					"(main/combined): %d\n", res);
 		}
 
 		if (OK == res) {
@@ -1517,12 +1533,21 @@
 		printk("acx: cannot reserve PCI memory region 2\n");
 		goto fail_request_mem_region2;
 	}
-	mem1 = ioremap(phymem1, mem_region1_size);
+	
+	/* this used to be ioremap(), but ioremap_nocache()
+	 * is much less risky, right? (and slower?)
+	 * FIXME: we may want to go back to cached variant if it's
+	 * certain that our code really properly handles
+	 * cached operation (memory barriers, volatile?, ...)
+	 * (but always keep this comment here regardless!)
+	 * Possibly make this a driver config setting? */
+	
+	mem1 = ioremap_nocache(phymem1, mem_region1_size);
 	if (!mem1) {
 		printk("acx: ioremap() FAILED\n");
 		goto fail_ioremap1;
 	}
-	mem2 = ioremap(phymem2, mem_region2_size);
+	mem2 = ioremap_nocache(phymem2, mem_region2_size);
 	if (!mem2) {
 		printk("acx: ioremap() #2 FAILED\n");
 		goto fail_ioremap2;
@@ -1544,7 +1569,7 @@
 	ndev = alloc_netdev(sizeof(*adev), "wlan%d", dummy_netdev_init);
 	/* (NB: memsets to 0 entire area) */
 	if (!ndev) {
-		printk("acx: no memory for netdevice structure\n");
+		printk("acx: no memory for netdevice struct\n");
 		goto fail_alloc_netdev;
 	}
 
@@ -1622,7 +1647,7 @@
 		acx_s_interrogate(adev, &co, ACX111_IE_CONFIG_OPTIONS);
 	}
 
-//TODO: merge them into one function, they are called just once and are the same for pci & usb
+/* TODO: merge them into one function, they are called just once and are the same for pci & usb */
 	if (OK != acxpci_read_eeprom_byte(adev, 0x05, &adev->eeprom_version))
 		goto fail_read_eeprom_version;
 
@@ -2076,10 +2101,14 @@
 
 	acx_init_task_scheduler(adev);
 
-//TODO: pci_set_power_state(pdev, PCI_D0); ?
+/* TODO: pci_set_power_state(pdev, PCI_D0); ? */
 
 	/* request shared IRQ handler */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)	
+	if (request_irq(ndev->irq, acxpci_i_interrupt, IRQF_SHARED, ndev->name, ndev)) {
+#else
 	if (request_irq(ndev->irq, acxpci_i_interrupt, SA_SHIRQ, ndev->name, ndev)) {
+#endif		
 		printk("%s: request_irq FAILED\n", ndev->name);
 		result = -EAGAIN;
 		goto done;
@@ -2135,7 +2164,7 @@
 	write_reg16(adev, IO_ACX_FEMR, 0x0);
 	free_irq(ndev->irq, ndev);
 
-//TODO: pci_set_power_state(pdev, PCI_D3hot); ?
+/* TODO: pci_set_power_state(pdev, PCI_D3hot); ? */
 
 	/* We currently don't have to do anything else.
 	 * Higher layers know we're not ready from dev->start==0 and
@@ -2436,7 +2465,7 @@
 		printk(" Key_Not_Found");
 	}
 	if (irqtype & HOST_INT_IV_ICV_FAILURE) {
-		printk(" IV_ICV_Failure");
+		printk(" IV_ICV_Failure (crypto)");
 	}
 		/* HOST_INT_CMD_COMPLETE  */
 		/* HOST_INT_INFO          */
@@ -2478,7 +2507,11 @@
 #define MAX_IRQLOOPS_PER_JIFFY  (20000/HZ) /* a la orinoco.c */
 
 static irqreturn_t
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
+acxpci_i_interrupt(int irq, void *dev_id)
+#else
 acxpci_i_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+#endif
 {
 	acx_device_t *adev;
 	unsigned long flags;
@@ -3344,6 +3377,15 @@
 		adev->stats.tx_fifo_errors++;
 		break;
 	case 0x80:
+		/* possibly ACPI C-state powersaving related!!!
+		 * (DMA timeout due to excessively high wakeup
+		 * latency after C-state activation!?)
+		 * Disable C-State powersaving and try again,
+		 * then PLEASE REPORT, I'm VERY interested in
+		 * whether my theory is correct that this is
+		 * actually the problem here.
+		 * In that case, use new Linux idle wakeup latency
+		 * requirements kernel API to prevent this issue. */
 		err = "DMA error";
 		adev->wstats.discard.misc++;
 		break;
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/usb.c /tmp/DfExYlGbnH/acx100-20070101/usb.c
--- /tmp/wYqKdCn6l2/acx100-20060521/usb.c	2006-05-20 21:27:57.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/usb.c	2007-01-10 00:11:52.000000000 +0200
@@ -45,7 +45,9 @@
 #define ACX_USB 1
 
 #include <linux/version.h>
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
 #include <linux/config.h>
+#endif
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -88,6 +90,7 @@
 #define PRODUCT_ID_WUG2400	0xb21a /* AboCom WUG2400 or SafeCom SWLUT-54125 */
 #define VENDOR_ID_AVM_GMBH	0x057c
 #define PRODUCT_ID_AVM_WLAN_USB	0x5601
+#define PRODUCT_ID_AVM_WLAN_USB_si	0x6201 /* "self install" named Version: driver kills kernel on inbound scans from fritz box ???  */
 #define VENDOR_ID_ZCOM		0x0cde
 #define PRODUCT_ID_ZCOM_XG750	0x0017 /* not tested yet */
 #define VENDOR_ID_TI		0x0451
@@ -112,8 +115,13 @@
 */
 static int acxusb_e_probe(struct usb_interface *, const struct usb_device_id *);
 static void acxusb_e_disconnect(struct usb_interface *);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
+static void acxusb_i_complete_tx(struct urb *);
+static void acxusb_i_complete_rx(struct urb *);
+#else
 static void acxusb_i_complete_tx(struct urb *, struct pt_regs *);
 static void acxusb_i_complete_rx(struct urb *, struct pt_regs *);
+#endif
 static int acxusb_e_open(struct net_device *);
 static int acxusb_e_close(struct net_device *);
 static void acxusb_i_set_rx_mode(struct net_device *);
@@ -145,6 +153,7 @@
 	{ USB_DEVICE(ACX100_VENDOR_ID, ACX100_PRODUCT_ID_UNBOOTED) },
 	{ USB_DEVICE(VENDOR_ID_DLINK, PRODUCT_ID_WUG2400) },
 	{ USB_DEVICE(VENDOR_ID_AVM_GMBH, PRODUCT_ID_AVM_WLAN_USB) },
+	{ USB_DEVICE(VENDOR_ID_AVM_GMBH, PRODUCT_ID_AVM_WLAN_USB_si) },
 	{ USB_DEVICE(VENDOR_ID_ZCOM, PRODUCT_ID_ZCOM_XG750) },
 	{ USB_DEVICE(VENDOR_ID_TI, PRODUCT_ID_TI_UNKNOWN) },
 	{}
@@ -1283,7 +1292,11 @@
 ** USB receive is triggered.
 */
 static void
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
+acxusb_i_complete_rx(struct urb *urb)
+#else
 acxusb_i_complete_rx(struct urb *urb, struct pt_regs *regs)
+#endif
 {
 	acx_device_t *adev;
 	rxbuffer_t *ptr;
@@ -1503,7 +1516,11 @@
 ** This function is invoked upon termination of a USB transfer.
 */
 static void
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
+acxusb_i_complete_tx(struct urb *urb)
+#else
 acxusb_i_complete_tx(struct urb *urb, struct pt_regs *regs)
+#endif
 {
 	acx_device_t *adev;
 	usb_tx_t *tx;
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/wlan.c /tmp/DfExYlGbnH/acx100-20070101/wlan.c
--- /tmp/wYqKdCn6l2/acx100-20060521/wlan.c	2006-05-20 21:27:59.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/wlan.c	2007-01-09 23:27:29.000000000 +0200
@@ -37,8 +37,10 @@
 ** http://www.linux-wlan.com
 */
 
-#include <linux/config.h>
 #include <linux/version.h>
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
+#include <linux/config.h>
+#endif
 #include <linux/types.h>
 #include <linux/if_arp.h>
 #include <linux/wireless.h>
diff -Nru /tmp/wYqKdCn6l2/acx100-20060521/wlan_hdr.h /tmp/DfExYlGbnH/acx100-20070101/wlan_hdr.h
--- /tmp/wYqKdCn6l2/acx100-20060521/wlan_hdr.h	2006-05-20 21:27:56.000000000 +0300
+++ /tmp/DfExYlGbnH/acx100-20070101/wlan_hdr.h	2006-08-14 00:10:56.000000000 +0300
@@ -307,7 +307,7 @@
 /* Macros to get/set the bitfields of the Duration Field      */
 /*  - the duration value is only valid when bit15 is zero     */
 /*  - the firmware handles these values, so I'm not going     */
-/*    these macros right now.                                 */
+/*    to use these macros right now.                          */
 /*------------------------------------------------------------*/
 
 /*--- Sequence Control  Macros -------------------------------*/

Reply via email to