diff -urN -X /home/jgarzik/dontdiff linux-2.4.11-pre2/drivers/net/wireless/hermes.c linux.to-linus/drivers/net/wireless/hermes.c --- linux-2.4.11-pre2/drivers/net/wireless/hermes.c Tue Sep 18 01:52:35 2001 +++ linux.to-linus/drivers/net/wireless/hermes.c Wed Oct 3 04:28:31 2001 @@ -14,8 +14,31 @@ * particular order). * * Copyright (C) 2000, David Gibson, Linuxcare Australia + * Copyright (C) 2001, David Gibson, IBM * - * This file distributed under the GPL, version 2. */ + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License + * at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and + * limitations under the License. + * + * Alternatively, the contents of this file may be used under the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the + * above. If you wish to allow the use of your version of this file + * only under the terms of the GPL and not to allow others to use your + * version of this file under the MPL, indicate your decision by + * deleting the provisions above and replace them with the notice and + * other provisions required by the GPL. If you do not delete the + * provisions above, a recipient may use your version of this file + * under either the MPL or the GPL. + */ + +#include #include #include @@ -30,10 +53,10 @@ #include "hermes.h" -static char version[] __initdata = "hermes.c: 1 Aug 2001 David Gibson "; +static char version[] __initdata = "hermes.c: 3 Oct 2001 David Gibson "; MODULE_DESCRIPTION("Low-level driver helper for Lucent Hermes chipset and Prism II HFA384x wireless MAC controller"); MODULE_AUTHOR("David Gibson "); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("Dual MPL/GPL"); /* These are maximum timeouts. Most often, card wil react much faster */ #define CMD_BUSY_TIMEOUT (100) /* In iterations of ~1us */ @@ -42,9 +65,6 @@ #define ALLOC_COMPL_TIMEOUT (1000) /* in iterations of ~10us */ #define BAP_BUSY_TIMEOUT (500) /* In iterations of ~1us */ -#define MAX(a, b) ( (a) > (b) ? (a) : (b) ) -#define MIN(a, b) ( (a) < (b) ? (a) : (b) ) - /* * Debugging helpers */ @@ -292,7 +312,7 @@ * from firmware * * Callable from any context */ -static int hermes_bap_seek(hermes_t *hw, int bap, uint16_t id, uint16_t offset) +int hermes_bap_seek(hermes_t *hw, int bap, uint16_t id, uint16_t offset) { int sreg = bap ? HERMES_SELECT1 : HERMES_SELECT0; int oreg = bap ? HERMES_OFFSET1 : HERMES_OFFSET0; @@ -305,9 +325,14 @@ k = BAP_BUSY_TIMEOUT; reg = hermes_read_reg(hw, oreg); + while ((reg & HERMES_OFFSET_BUSY) & k) { + k--; + udelay(1); + reg = hermes_read_reg(hw, oreg); + } if (reg & HERMES_OFFSET_BUSY) - return -EBUSY; + return -ETIMEDOUT; /* Now we actually set up the transfer */ hermes_write_reg(hw, sreg, id); @@ -342,7 +367,7 @@ * * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware */ -int hermes_bap_pread(hermes_t *hw, int bap, void *buf, uint16_t len, +int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len, uint16_t id, uint16_t offset) { int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; @@ -356,7 +381,7 @@ goto out; /* Actually do the transfer */ - hermes_read_data(hw, dreg, buf, len/2); + hermes_read_words(hw, dreg, buf, len/2); out: return err; @@ -368,7 +393,7 @@ * * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware */ -int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, uint16_t len, +int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, uint16_t id, uint16_t offset) { int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; @@ -382,7 +407,7 @@ goto out; /* Actually do the transfer */ - hermes_write_data(hw, dreg, buf, len/2); + hermes_write_words(hw, dreg, buf, len/2); out: return err; @@ -434,17 +459,7 @@ lengths in the records seem to be wrong, frequently */ count = buflen / 2; -#if 0 - if (length) - count = (MIN(buflen, rlength) + 1) / 2; - else { - count = buflen / 2; - if (rlength != buflen) - printk(KERN_WARNING "hermes_read_ltv(): Incorrect \ -record length %d instead of %d on RID 0x%04x\n", rlength, buflen, rid); - } -#endif - hermes_read_data(hw, dreg, buf, count); + hermes_read_words(hw, dreg, buf, count); out: return err; @@ -470,7 +485,7 @@ count = length - 1; - hermes_write_data(hw, dreg, value, count); + hermes_write_words(hw, dreg, value, count); err = hermes_docmd_wait(hw, HERMES_CMD_ACCESS | HERMES_CMD_WRITE, rid, &resp); diff -urN -X /home/jgarzik/dontdiff linux-2.4.11-pre2/drivers/net/wireless/hermes.h linux.to-linus/drivers/net/wireless/hermes.h --- linux-2.4.11-pre2/drivers/net/wireless/hermes.h Tue Sep 18 01:52:35 2001 +++ linux.to-linus/drivers/net/wireless/hermes.h Wed Oct 3 04:28:31 2001 @@ -50,6 +50,7 @@ #define HERMES_FRAME_LEN_MAX (2304) #define HERMES_MAX_MULTICAST (16) #define HERMES_MAGIC (0x7d1f) +#define HERMES_SYMBOL_MAX_VER (14) /* * Hermes register offsets @@ -202,24 +203,21 @@ #define HERMES_RID_WEP_AVAIL (0xfd4f) #define HERMES_RID_CURRENT_CHANNEL (0xfdc1) #define HERMES_RID_DATARATES (0xfdc6) -#define HERMES_RID_SYMBOL_PRIMARY_VER (0xfd03) -#define HERMES_RID_SYMBOL_SECONDARY_VER (0xfd21) +#define HERMES_RID_SYMBOL_SECONDARY_VER (0xfd24) #define HERMES_RID_SYMBOL_KEY_LENGTH (0xfc2B) /* * Frame structures and constants */ -#define __PACKED__ __attribute__ ((packed)) - typedef struct hermes_frame_desc { /* Hermes - i.e. little-endian byte-order */ - uint16_t status __PACKED__; - uint16_t res1, res2 __PACKED__; - uint16_t q_info __PACKED__; - uint16_t res3, res4 __PACKED__; - uint16_t tx_ctl __PACKED__; -} hermes_frame_desc_t; + uint16_t status; + uint16_t res1, res2; + uint16_t q_info; + uint16_t res3, res4; + uint16_t tx_ctl; +} __attribute__ ((packed)) hermes_frame_desc_t; #define HERMES_RXSTAT_ERR (0x0003) #define HERMES_RXSTAT_MACPORT (0x0700) @@ -265,20 +263,16 @@ #define hermes_read_regn(hw, name) (hermes_read_reg((hw), HERMES_##name)) #define hermes_write_regn(hw, name, val) (hermes_write_reg((hw), HERMES_##name, (val))) -/* Note that for the next two, the count is in 16-bit words, not bytes */ -#define hermes_read_data(hw, off, buf, count) (insw((hw)->iobase + (off), (buf), (count))) -#define hermes_write_data(hw, off, buf, count) (outsw((hw)->iobase + (off), (buf), (count))) - /* Function prototypes */ void hermes_struct_init(hermes_t *hw, uint io); int hermes_reset(hermes_t *hw); int hermes_docmd_wait(hermes_t *hw, uint16_t cmd, uint16_t parm0, hermes_response_t *resp); int hermes_allocate(hermes_t *hw, uint16_t size, uint16_t *fid); - -int hermes_bap_pread(hermes_t *hw, int bap, void *buf, uint16_t len, +int hermes_bap_seek(hermes_t *hw, int bap, uint16_t id, uint16_t offset); +int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len, uint16_t id, uint16_t offset); -int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, uint16_t len, +int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, uint16_t id, uint16_t offset); int hermes_read_ltv(hermes_t *hw, int bap, uint16_t rid, int buflen, uint16_t *length, void *buf); @@ -322,6 +316,10 @@ #define HERMES_BYTES_TO_RECLEN(n) ( ((n) % 2) ? (((n)+1)/2)+1 : ((n)/2)+1 ) #define HERMES_RECLEN_TO_BYTES(n) ( ((n)-1) * 2 ) + +/* Note that for the next two, the count is in 16-bit words, not bytes */ +#define hermes_read_words(hw, off, buf, count) (insw((hw)->iobase + (off), (buf), (count))) +#define hermes_write_words(hw, off, buf, count) (outsw((hw)->iobase + (off), (buf), (count))) #define HERMES_READ_RECORD(hw, bap, rid, buf) \ (hermes_read_ltv((hw),(bap),(rid), sizeof(*buf), NULL, (buf))) diff -urN -X /home/jgarzik/dontdiff linux-2.4.11-pre2/drivers/net/wireless/orinoco.c linux.to-linus/drivers/net/wireless/orinoco.c --- linux-2.4.11-pre2/drivers/net/wireless/orinoco.c Tue Sep 18 01:52:35 2001 +++ linux.to-linus/drivers/net/wireless/orinoco.c Wed Oct 3 04:28:31 2001 @@ -1,4 +1,4 @@ -/* orinoco.c 0.07 - (formerly known as dldwd_cs.c and orinoco_cs.c) +/* orinoco.c 0.08 - (formerly known as dldwd_cs.c and orinoco_cs.c) * * A driver for "Hermes" chipset based PCMCIA wireless adaptors, such * as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/ @@ -190,13 +190,35 @@ * Rx path, but don't make as much noise about it. * o Firmware detection cleanups. * + * v0.07 -> v0.08 - 3/10/2001 - David Gibson + * o Fixed a possible buffer overrun found by the Stanford checker (in + * dldwd_ioctl_setiwencode()). Can only be called by root anyway, so not + * a big problem. + * o Turned has_big_wep on for Intersil cards. That's not true for all of them + * but we should at least let the capable ones try. + * o Wait for BUSY to clear at the beginning of hermes_bap_seek(). I + * realised that my assumption that the driver's serialization + * would prevent the BAP being busy on entry was possibly false, because + * things other than seeks may make the BAP busy. + * o Use "alternate" (oui 00:00:00) encapsulation by default. + * Setting use_old_encaps will mimic the old behaviour, but I + * think we will be able to eliminate this. + * o Don't try to make __initdata const (the version string). + * This can't work because of the way the __initdata sectioning + * works. + * o Added MODULE_LICENSE tags. + * o Support for PLX (transparent PCMCIA->PCI brdge) cards. + * o Improved support for Symbol firmware - we can actually tell + * the version now. * * TODO - Jean II - * o inline functions (lot's of candidate, need to reorder code) + * o inline functions (lots of candidate, need to reorder code) * o Test PrismII/Symbol cards & firmware versions * o Mini-PCI support (some people have reported success - JII) */ +#include + #include #include #include @@ -227,7 +249,7 @@ #include "hermes.h" #include "orinoco.h" -static char version[] __initdata = "orinoco.c 0.07 (David Gibson and others)"; +static char version[] __initdata = "orinoco.c 0.08 (David Gibson and others)"; MODULE_AUTHOR("David Gibson "); MODULE_DESCRIPTION("Driver for Lucent Orinoco, Prism II based and similar wireless cards"); MODULE_LICENSE("Dual MPL/GPL"); @@ -238,10 +260,8 @@ MODULE_PARM(dldwd_debug, "i"); #endif -/* FIXME: We need a better way of handling this */ -/* Set this flag to use 00:00:00 for the encapsulation oui instead of 00:00:F8 */ -static int use_alternate_encaps; /* =0 */ -MODULE_PARM(use_alternate_encaps, "i"); +int use_old_encaps = 0; +MODULE_PARM(use_old_encaps, "i"); const long channel_frequency[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, @@ -307,12 +327,13 @@ /* 802.2 LLL header SNAP used for SNAP encapsulation over 802.11 */ struct p8022_hdr encaps_hdr = { - 0xaa, 0xaa, 0x03, {0x00, 0x00, 0xf8} -}; -struct p8022_hdr alternate_encaps_hdr = { 0xaa, 0xaa, 0x03, {0x00, 0x00, 0x00} }; +struct p8022_hdr old_encaps_hdr = { + 0xaa, 0xaa, 0x03, {0x00, 0x00, 0xf8} +}; + /* How many times to retry if we get an EIO reading the BAP in the Rx path */ #define RX_EIO_RETRY 10 @@ -881,7 +902,7 @@ num = le16_to_cpu(list.len); *numrates = num; - num = MIN(num, max); + num = min(num, max); for (i = 0; i < num; i++) { rates[i] = (p[i] & 0x7f) * 500000; /* convert to bps */ @@ -1286,7 +1307,7 @@ if (sta_id.vendor == 1) { /* Lucent Wavelan IEEE, Lucent Orinoco, Cabletron RoamAbout, - ELSE, Meloc, HP, IBM, Dell 1150 */ + ELSA, Melco, HP, IBM, Dell 1150, Compaq 110/210 */ printk(KERN_DEBUG "%s: Looks like a Lucent/Agere firmware " "version %d.%02d\n", dev->name, sta_id.major, sta_id.minor); @@ -1303,7 +1324,7 @@ priv->has_big_wep = 1; /* FIXME: this is wrong - how do we tell Gold cards from the others? */ priv->has_mwo = (firmver >= 0x60000); - priv->has_pm = (firmver >= 0x40020); + priv->has_pm = (firmver >= 0x40020); /* Don't work in 7.52 ? */ priv->has_preamble = 0; priv->ibss_port = 1; /* Tested with Lucent firmware : @@ -1314,27 +1335,59 @@ /* Symbol , 3Com AirConnect, Intel, Ericsson WLAN */ /* Intel MAC : 00:02:B3:* */ /* 3Com MAC : 00:50:DA:* */ + union symbol_sta_id { + char raw[HERMES_SYMBOL_MAX_VER]; + char string[HERMES_SYMBOL_MAX_VER + 1]; + } symbol_sta_id; + + /* Get the Symbol firmware version */ + err = HERMES_READ_RECORD(hw, USER_BAP, + HERMES_RID_SYMBOL_SECONDARY_VER, + &(symbol_sta_id.raw)); + if (err) { + printk(KERN_WARNING "%s: Error %d reading Symbol firmware info. Wildly guessing capabilities...\n", + dev->name, err); + firmver = 0; + symbol_sta_id.string[0] = '\0'; + } else { + /* The firmware revision is a string, the format is + * something like : "V2.20-01". + * Quick and dirty parsing... - Jean II + */ + firmver = ((symbol_sta_id.raw[1] - '0') << 16) + | ((symbol_sta_id.raw[3] - '0') << 12) + | ((symbol_sta_id.raw[4] - '0') << 8) + | ((symbol_sta_id.raw[6] - '0') << 4) + | (symbol_sta_id.raw[7] - '0'); + + symbol_sta_id.string[HERMES_SYMBOL_MAX_VER] = '\0'; + } + printk(KERN_DEBUG "%s: Looks like a Symbol firmware " - "(unknown version)\n", dev->name); + "version [%s] (parsing to %X)\n", dev->name, + symbol_sta_id.string, firmver); - /* FIXME : we need to get Symbol firmware revision. - * I tried to use SYMBOL_***ARY_VER, but it didn't - * returned anything proper... */ priv->firmware_type = FIRMWARE_TYPE_SYMBOL; priv->tx_rate_ctrl = 0xF; /* 11 Mb/s auto */ priv->need_card_reset = 1; priv->broken_reset = 0; priv->broken_allocate = 1; priv->has_port3 = 1; - priv->has_ibss = 1; /* FIXME */ - priv->has_wep = 1; /* FIXME */ - priv->has_big_wep = 1; /* RID_SYMBOL_KEY_LENGTH */ + priv->has_ibss = (firmver >= 0x20000); + priv->has_wep = (firmver >= 0x15012); + priv->has_big_wep = (firmver >= 0x20000); priv->has_mwo = 0; - priv->has_pm = 1; /* FIXME */ - priv->has_preamble = 0; /* FIXME */ + priv->has_pm = (firmver >= 0x20000) && (firmver < 0x22000); + priv->has_preamble = (firmver >= 0x20000); priv->ibss_port = 4; - /* Tested with Intel firmware : v15 => Jean II */ + /* Tested with Intel firmware : 0x20015 => Jean II */ + /* Tested with 3Com firmware : 0x15012 & 0x22001 => Jean II */ } else { + /* D-Link, Linksys, Adtron, ZoomAir, and many others... + * Samsung, Compaq 100/200 and Proxim are slightly + * different and less well tested */ + /* D-Link MAC : 00:40:05:* */ + /* Addtron MAC : 00:90:D1:* */ printk(KERN_DEBUG "%s: Looks like an Intersil firmware " "version %d.%02d\n", dev->name, sta_id.major, sta_id.minor); @@ -1347,7 +1400,7 @@ priv->has_port3 = 1; priv->has_ibss = (firmver >= 0x00007); /* FIXME */ priv->has_wep = (firmver >= 0x00008); - priv->has_big_wep = 0; + priv->has_big_wep = priv->has_wep; priv->has_mwo = 0; priv->has_pm = (firmver >= 0x00007); priv->has_preamble = 0; @@ -1427,9 +1480,9 @@ goto out; } if ( nickbuf.len ) - len = MIN(IW_ESSID_MAX_SIZE, le16_to_cpu(nickbuf.len)); + len = min(IW_ESSID_MAX_SIZE, le16_to_cpu(nickbuf.len)); else - len = MIN(IW_ESSID_MAX_SIZE, 2 * reclen); + len = min(IW_ESSID_MAX_SIZE, 2 * reclen); memcpy(priv->nick, &nickbuf.val, len); priv->nick[len] = '\0'; @@ -1556,20 +1609,12 @@ err = HERMES_READ_RECORD(hw, USER_BAP, HERMES_RID_COMMSQUALITY, &cq); - le16_to_cpus(&cq.qual); - le16_to_cpus(&cq.signal); - le16_to_cpus(&cq.noise); - DEBUG(3, "%s: Global stats = %X-%X-%X\n", dev->name, cq.qual, cq.signal, cq.noise); - /* Why are we using MIN/MAX ? We don't really care - * if the value goes above max, because we export the - * raw dBm values anyway. The normalisation should be done - * in user space - Jean II */ - wstats->qual.qual = MAX(MIN(cq.qual, 0x8b-0x2f), 0); - wstats->qual.level = MAX(MIN(cq.signal, 0x8a), 0x2f) - 0x95; - wstats->qual.noise = MAX(MIN(cq.noise, 0x8a), 0x2f) - 0x95; + wstats->qual.qual = le16_to_cpu(cq.qual); + wstats->qual.level = le16_to_cpu(cq.signal); + wstats->qual.noise = le16_to_cpu(cq.noise); wstats->qual.updated = 7; } @@ -1593,9 +1638,9 @@ * source address with out list, and if match, get the stats... */ for (i = 0; i < priv->spy_number; i++) if (!memcmp(mac, priv->spy_address[i], ETH_ALEN)) { - priv->spy_stat[i].qual = MAX(MIN(cq->qual, 0x8b-0x2f), 0); - priv->spy_stat[i].level = MAX(MIN(cq->signal, 0x8a), 0x2f) - 0x95; - priv->spy_stat[i].noise = MAX(MIN(cq->noise, 0x8a), 0x2f) - 0x95; + priv->spy_stat[i].qual = cq->qual; + priv->spy_stat[i].level = cq->signal; + priv->spy_stat[i].noise = cq->noise; priv->spy_stat[i].updated = 7; } } @@ -1674,7 +1719,7 @@ dldwd_lock(priv); /* Length of the packet body */ - len = MAX(skb->len - ETH_HLEN, ETH_ZLEN); + len = max_t(int,skb->len - ETH_HLEN, ETH_ZLEN); eh = (struct ethhdr *)skb->data; @@ -1699,12 +1744,13 @@ hdr.p8023.h_proto = htons(data_len + ENCAPS_OVERHEAD); /* 802.2 header */ - /* FIXME: ugh, what a hack for the 00:00:00 APs. Need to find a better way */ - if (use_alternate_encaps) - memcpy(&hdr.p8022, &alternate_encaps_hdr, sizeof(alternate_encaps_hdr)); + if (! use_old_encaps) + memcpy(&hdr.p8022, &encaps_hdr, + sizeof(encaps_hdr)); else - memcpy(&hdr.p8022, &encaps_hdr, sizeof(encaps_hdr)); - + memcpy(&hdr.p8022, &encaps_hdr, + sizeof(old_encaps_hdr)); + hdr.ethertype = eh->h_proto; err = hermes_bap_pwrite(hw, USER_BAP, &hdr, sizeof(hdr), txfid, 0); @@ -1933,12 +1979,12 @@ uint16_t xlen = 0; int err = 0; char keybuf[MAX_KEY_SIZE]; - + if (erq->pointer) { /* We actually have a key to set */ - if(erq->length > MAX_KEY_SIZE) + if ( (erq->length < SMALL_KEY_SIZE) || (erq->length > MAX_KEY_SIZE) ) return -EINVAL; - + if (copy_from_user(keybuf, erq->pointer, erq->length)) return -EFAULT; } @@ -3512,7 +3558,7 @@ buf += sprintf(buf, "%-15s (0x%04x): length=%d (%d bytes)\tvalue=", record_table[i].name, rid, length, (length-1)*2); - len = MIN( MAX(minlen, (length-1)*2), maxlen); + len = min( (int)max(minlen, ((int)length-1)*2), maxlen); switch (record_table[i].displaytype) { case DISPLAY_WORDS: @@ -3531,7 +3577,7 @@ break; case DISPLAY_STRING: - len = MIN(len, le16_to_cpu(val16[0])+2); + len = min(len, le16_to_cpu(val16[0])+2); val8[len] = '\0'; buf += sprintf(buf, "\"%s\"", (char *)&val16[1]); break; diff -urN -X /home/jgarzik/dontdiff linux-2.4.11-pre2/drivers/net/wireless/orinoco.h linux.to-linus/drivers/net/wireless/orinoco.h --- linux-2.4.11-pre2/drivers/net/wireless/orinoco.h Tue Sep 18 01:52:35 2001 +++ linux.to-linus/drivers/net/wireless/orinoco.h Wed Oct 3 04:28:31 2001 @@ -25,7 +25,7 @@ #define DLDWD_MACPORT 0 #define IRQ_LOOP_MAX 10 #define TX_NICBUF_SIZE 2048 -#define TX_NICBUF_SIZE_BUG 1585 /* Bug in Intel firmware */ +#define TX_NICBUF_SIZE_BUG 1585 /* Bug in Symbol firmware */ #define MAX_KEYS 4 #define MAX_KEY_SIZE 14 #define LARGE_KEY_SIZE 13 @@ -110,7 +110,7 @@ #ifdef ORINOCO_DEBUG extern int dldwd_debug; -#define DEBUG(n, args...) if (dldwd_debug>(n)) printk(KERN_DEBUG args) +#define DEBUG(n, args...) do { if (dldwd_debug>(n)) printk(KERN_DEBUG args); } while(0) #define DEBUGMORE(n, args...) do { if (dldwd_debug>(n)) printk(args); } while (0) #else #define DEBUG(n, args...) do { } while (0) @@ -119,9 +119,6 @@ #define TRACE_ENTER(devname) DEBUG(2, "%s: -> " __FUNCTION__ "()\n", devname); #define TRACE_EXIT(devname) DEBUG(2, "%s: <- " __FUNCTION__ "()\n", devname); - -#define MAX(a, b) ( (a) > (b) ? (a) : (b) ) -#define MIN(a, b) ( (a) < (b) ? (a) : (b) ) #define RUP_EVEN(a) ( (a) % 2 ? (a) + 1 : (a) ) diff -urN -X /home/jgarzik/dontdiff linux-2.4.11-pre2/drivers/net/wireless/orinoco_cs.c linux.to-linus/drivers/net/wireless/orinoco_cs.c --- linux-2.4.11-pre2/drivers/net/wireless/orinoco_cs.c Tue Sep 18 01:52:35 2001 +++ linux.to-linus/drivers/net/wireless/orinoco_cs.c Wed Oct 3 04:28:31 2001 @@ -1,4 +1,4 @@ -/* orinoco_cs.c 0.07 - (formerly known as dldwd_cs.c) +/* orinoco_cs.c 0.08 - (formerly known as dldwd_cs.c) * * A driver for "Hermes" chipset based PCMCIA wireless adaptors, such * as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/ @@ -10,6 +10,8 @@ * Copyright notice & release notes in file orinoco.c */ +#include + #include #include #include @@ -42,7 +44,7 @@ /*====================================================================*/ -static char version[] __initdata = "orinoco_cs.c 0.07 (David Gibson and others)"; +static char version[] __initdata = "orinoco_cs.c 0.08 (David Gibson and others)"; MODULE_AUTHOR("David Gibson "); MODULE_DESCRIPTION("Driver for PCMCIA Lucent Orinoco, Prism II based and similar wireless cards");