--- Begin Message ---
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 -------------------------------*/
--- End Message ---