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 -------------------------------*/