Thread: [Madwifi-users] madwifi-20030702 ported to 2.6.0-test2
Status: Beta
Brought to you by:
otaku
From: Arnaldo C. de M. <ac...@co...> - 2003-07-31 01:46:16
|
Hi, During OLS Greg Kroah was kind and gave me a linksys WPC55AG card that has the atheros 5212 chipset, and while in Ottawa I ported it to 2.6.0-test2, tested it at OLS wireless net (802.11b linksys access points) and at Les Suites Hotel 802.11a access points at 54mbit/s, and here at DaveM's place with an Atheros access point, all working nicely, kudos to Sam for the solid driver! I have a bitkeeper tree at: bk://kernel.bkbits.net/acme/atheros-2.6 This tree has 2.6.0-test2 (latest bk from Linus at this point in time) it has this driver at drivers/net/wireless/atheros, with minor modifications in the tree structure (namely BSD compat stuff is at drivers/net/wireless/atheros/bsdcompat), and the first changeset has the original sources as of madwifi-20030702 snapshot in the sourceforge project site, while the next changeset has the port, that I put inline at the end of this message. For non-bitkeeper users the patch is available at: http://www.kernel.org/pub/linux/kernel/people/acme/v2.6/2.6.0-test2/atheros-2.6.patch.bz2 It should be hitting all the www.kernel.org mirrors shortly. Now I'm looking at consolidating the 802.11 stacks in most wireless drivers already in the tree, starting with the initial stack David Miller sent me. - Arnaldo =================================================================== ChangeSet@1.1597, 2003-07-30 16:56:40-07:00, ac...@rt... o atheros: port the driver to 2.6 . use workqueues . use irqreturn_t . use kbuild 2.6 . move static inits to 0 to bss . s/return EFOOBAR/return -EFOOBAR/g . use SET_MODULE_OWNER . use NEW_MODULE_CODE stuff . move the BSD compat cruft to bsdcompat subdirectory (will be killed) . use standard min/max macros in Linux Kconfig | 8 ++++ Makefile | 1 atheros/Makefile | 1 atheros/ath_hal/Makefile | 8 ++++ atheros/ath_hal/ah_osdep.c | 9 +---- atheros/driver/Makefile | 5 ++ atheros/driver/if_ath.c | 67 +++++++++++++++++++--------------------- atheros/driver/if_ath_pci.c | 2 - atheros/driver/if_athvar.h | 14 ++++---- atheros/wlan/Makefile | 5 ++ atheros/wlan/if_ieee80211.h | 3 + atheros/wlan/if_ieee80211subr.c | 2 - atheros/wlan/if_media.h | 2 - 13 files changed, 73 insertions(+), 54 deletions(-) diff -Nru a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig --- a/drivers/net/wireless/Kconfig Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/Kconfig Wed Jul 30 18:44:18 2003 @@ -167,6 +167,14 @@ The driver can be compiled as a module and will be named "airo". +config ATHEROS + tristate "Atheros MiniPCI and CardBus based cards" + depends on NET_RADIO && PCI + ---help--- + Atheros MiniPCI and CardBus based cards. + + The driver can be compiled as a module and will be named "ath_pci". + config HERMES tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)" depends on NET_RADIO && (PPC_PMAC || PCI || PCMCIA) diff -Nru a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile --- a/drivers/net/wireless/Makefile Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/Makefile Wed Jul 30 18:44:18 2003 @@ -17,6 +17,7 @@ obj-$(CONFIG_PCI_HERMES) += orinoco_pci.o obj-$(CONFIG_TMD_HERMES) += orinoco_tmd.o +obj-$(CONFIG_ATHEROS) += atheros/ obj-$(CONFIG_AIRO) += airo.o obj-$(CONFIG_AIRO_CS) += airo_cs.o airo.o diff -Nru a/drivers/net/wireless/atheros/Makefile b/drivers/net/wireless/atheros/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/atheros/Makefile Wed Jul 30 18:44:18 2003 @@ -0,0 +1 @@ +obj-$(CONFIG_ATHEROS) += wlan/ driver/ ath_hal/ diff -Nru a/drivers/net/wireless/atheros/ath_hal/Makefile b/drivers/net/wireless/atheros/ath_hal/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/atheros/ath_hal/Makefile Wed Jul 30 18:44:18 2003 @@ -0,0 +1,8 @@ +EXTRA_CFLAGS += -I$(obj)/.. + +obj-$(CONFIG_ATHEROS) += ath_hal.o + +ath_hal-objs := ah_osdep.o hal.o + +$(obj)/hal.o: $(src)/i386-elf.hal.o.uu + uudecode < $(src)/i386-elf.hal.o.uu diff -Nru a/drivers/net/wireless/atheros/ath_hal/ah_osdep.c b/drivers/net/wireless/atheros/ath_hal/ah_osdep.c --- a/drivers/net/wireless/atheros/ath_hal/ah_osdep.c Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/atheros/ath_hal/ah_osdep.c Wed Jul 30 18:44:18 2003 @@ -54,15 +54,12 @@ #include "ah.h" -#ifdef NEW_MODULE_CODE #define __MOD_INC_USE_COUNT(_m) \ if (!try_module_get(_m)) { \ - printk(KERN_WARNING "%s: try_module_get failed\n", \ - ic->ic_dev.name); \ - return (ENODEV); \ + printk(KERN_WARNING "try_module_get failed\n"); \ + return NULL; \ } #define __MOD_DEC_USE_COUNT(_m) module_put(_m) -#endif #define AH_TIMEOUT 1000 @@ -276,8 +273,6 @@ static OS_INLINE char *med3(char *, char *, char *, ath_hal_cmp_t *); static OS_INLINE void swapfunc(char *, char *, int, int); - -#define min(a, b) (a) < (b) ? (a) : (b) /* * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". diff -Nru a/drivers/net/wireless/atheros/driver/Makefile b/drivers/net/wireless/atheros/driver/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/atheros/driver/Makefile Wed Jul 30 18:44:18 2003 @@ -0,0 +1,5 @@ +EXTRA_CFLAGS += -I$(obj)/../ath_hal -I$(obj)/../wlan -I$(obj)/.. + +obj-$(CONFIG_ATHEROS) += ath_pci.o + +ath_pci-objs := if_ath.o if_ath_pci.o diff -Nru a/drivers/net/wireless/atheros/driver/if_ath.c b/drivers/net/wireless/atheros/driver/if_ath.c --- a/drivers/net/wireless/atheros/driver/if_ath.c Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/atheros/driver/if_ath.c Wed Jul 30 18:44:18 2003 @@ -113,11 +113,11 @@ static int ath_rateinterval = 1000; /* rate ctl interval (ms) */ static int ath_bmisshack = 1; /* XXX */ static int ath_countrycode = CTRY_DEFAULT; /* country code */ -static int ath_regdomain = 0; /* regulatory domain */ +static int ath_regdomain; /* regulatory domain */ static int ath_outdoor = AH_TRUE; /* enable outdoor use */ #ifdef AR_DEBUG -int ath_debug = 0; +int ath_debug; #define IFF_DUMPPKTS(_ic) (ath_debug || netif_msg_dumppkts(_ic)) static void ath_printrxbuf(struct ath_buf *bf, int); static void ath_printtxbuf(struct ath_buf *bf, int); @@ -148,18 +148,18 @@ spin_lock_init(&sc->sc_txbuflock); spin_lock_init(&sc->sc_txqlock); - INIT_TQUEUE(&sc->sc_rxtq, ath_rx_tasklet, dev); - INIT_TQUEUE(&sc->sc_txtq, ath_tx_tasklet, dev); - INIT_TQUEUE(&sc->sc_swbatq, ath_beacon_tasklet, dev); - INIT_TQUEUE(&sc->sc_bmisstq, ath_bmiss_tasklet, dev); - INIT_TQUEUE(&sc->sc_rxorntq, ath_rxorn_tasklet, dev); - INIT_TQUEUE(&sc->sc_fataltq, ath_fatal_tasklet, dev); + INIT_WORK(&sc->sc_rxwk, ath_rx_tasklet, dev); + INIT_WORK(&sc->sc_txwk, ath_tx_tasklet, dev); + INIT_WORK(&sc->sc_swbawk, ath_beacon_tasklet, dev); + INIT_WORK(&sc->sc_bmisswk, ath_bmiss_tasklet, dev); + INIT_WORK(&sc->sc_rxornwk, ath_rxorn_tasklet, dev); + INIT_WORK(&sc->sc_fatalwk, ath_fatal_tasklet, dev); ah = _ath_hal_attach(devid, sc, 0, (void *) dev->mem_start, &status); if (ah == NULL) { printk(KERN_ERR "%s: unable to attach hardware; HAL status %u\n", dev->name, status); - error = ENXIO; + error = -ENXIO; goto bad; } sc->sc_ah = ah; @@ -310,29 +310,26 @@ * Interrupt handler. All the actual processing is * deferred to tasklets. */ -void -ath_intr(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t ath_intr(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct ath_softc *sc = dev->priv; struct ath_hal *ah = sc->sc_ah; HAL_INT status; - int needmark; if (sc->sc_invalid) { /* * The hardware is gone, don't touch anything. * XXX can this happen? */ - return; + return IRQ_NONE; } if ((dev->flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP)) { DPRINTF(("ath_intr: flags 0x%x\n", dev->flags)); ath_hal_getisr(ah, &status); /* clear ISR */ ath_hal_intrset(ah, 0); /* disable further intr's */ - return; + return IRQ_HANDLED; } - needmark = 0; ath_hal_getisr(ah, &status); DPRINTF2(("%s: interrupt, status 0x%x\n", dev->name, status)); if (ath_bmisshack) status &= ~HAL_INT_BMISS; /*XXX*/ @@ -345,10 +342,10 @@ #endif /* AR_DEBUG */ if (status & HAL_INT_FATAL) { sc->sc_stats.ast_hardware++; - needmark |= queue_task(&sc->sc_fataltq, &tq_immediate); + schedule_work(&sc->sc_fatalwk); } else if (status & HAL_INT_RXORN) { sc->sc_stats.ast_rxorn++; - needmark |= queue_task(&sc->sc_rxorntq, &tq_immediate); + schedule_work(&sc->sc_rxornwk); } else { if (status & HAL_INT_RXEOL) { /* @@ -365,18 +362,18 @@ ath_hal_updatetxtriglevel(ah, AH_TRUE); } if (status & HAL_INT_RX) - needmark |= queue_task(&sc->sc_rxtq, &tq_immediate); + schedule_work(&sc->sc_rxwk); if (status & HAL_INT_TX) - needmark |= queue_task(&sc->sc_txtq, &tq_immediate); + schedule_work(&sc->sc_txwk); if (status & HAL_INT_SWBA) - needmark |= queue_task(&sc->sc_swbatq, &tq_immediate); + schedule_work(&sc->sc_swbawk); if (status & HAL_INT_BMISS) { sc->sc_stats.ast_bmiss++; - needmark |= queue_task(&sc->sc_bmisstq, &tq_immediate); + schedule_work(&sc->sc_bmisswk); } } - if (needmark) - mark_bh(IMMEDIATE_BH); + + return IRQ_HANDLED; } static void @@ -454,7 +451,7 @@ if (!ath_hal_reset(ah, ic->ic_opmode, &hchan, AH_FALSE, &status)) { printk("%s: unable to reset hardware; hal status %u\n", dev->name, status); - return EIO; + return -EIO; } /* @@ -468,7 +465,7 @@ ath_initkeytable(sc); if (ath_startrecv(dev) != 0) { printk("%s: unable to start recv logic\n", dev->name); - return EIO; + return -EIO; } /* @@ -917,7 +914,7 @@ DPRINTF(("ath_beacon_alloc: cannot allocate sk_buff; size %u\n", roundup(sizeof(struct ieee80211_frame)+pktlen, 4))); sc->sc_stats.ast_be_nobuf++; - return ENOMEM; + return -ENOMEM; } wh = (struct ieee80211_frame *) @@ -1174,7 +1171,7 @@ sc->sc_desc = pci_alloc_consistent(sc->sc_pdev, sc->sc_desc_len, &sc->sc_desc_daddr); if (sc->sc_desc == NULL) - return ENOMEM; + return -ENOMEM; ds = sc->sc_desc; DPRINTF(("ath_desc_alloc: DMA map: %p (%d) -> %p\n", ds, sc->sc_desc_len, (caddr_t) sc->sc_desc_daddr)); @@ -1213,7 +1210,7 @@ pci_free_consistent(sc->sc_pdev, sc->sc_desc_len, sc->sc_desc, sc->sc_desc_daddr); sc->sc_desc = NULL; - return ENOMEM; + return -ENOMEM; } static void @@ -1285,7 +1282,7 @@ DPRINTF(("ath_rxbuf_init: skbuff allocation failed; " "size %u\n", sc->sc_rxbufsize)); sc->sc_stats.ast_rx_nobuf++; - return ENOMEM; + return -ENOMEM; } skb->dev = &sc->sc_ic.ic_dev; bf->bf_skb = skb; @@ -1918,7 +1915,7 @@ printk("%s: %s: unable to reset channel %u (%uMhz)\n", dev->name, __func__, ieee80211_chan2ieee(ic, chan), chan->ic_freq); - return EIO; + return -EIO; } /* @@ -1927,7 +1924,7 @@ if (ath_startrecv(dev) != 0) { printk("%s: %s: unable to restart recv logic\n", dev->name, __func__); - return EIO; + return -EIO; } /* @@ -2126,14 +2123,14 @@ chans = kmalloc(IEEE80211_CHAN_MAX * sizeof(HAL_CHANNEL), GFP_KERNEL); if (chans == NULL) { printk("%s: unable to allocate channel table\n", dev->name); - return ENOMEM; + return -ENOMEM; } if (!ath_hal_init_channels(ah, chans, IEEE80211_CHAN_MAX, &nchan, cc, HAL_MODE_ALL, outdoor)) { printk("%s: unable to collect channel list from hal\n", dev->name); kfree(chans); - return EINVAL; + return -EINVAL; } /* @@ -2437,7 +2434,7 @@ } dev = dev_get_by_name("ath0"); /* XXX */ if (!dev) - return EINVAL; + return -EINVAL; sc = dev->priv; #define STAT(x) do { \ if (sc->sc_stats.ast_##x != 0) \ @@ -2534,7 +2531,7 @@ dev = dev_get_by_name("ath0"); /* XXX */ if (!dev) { printk("%s: no ath0 device\n", __func__); - return EINVAL; + return -EINVAL; } sc = dev->priv; if (*lenp >= 3 && strncmp(buffer, "hal", 3) == 0) diff -Nru a/drivers/net/wireless/atheros/driver/if_ath_pci.c b/drivers/net/wireless/atheros/driver/if_ath_pci.c --- a/drivers/net/wireless/atheros/driver/if_ath_pci.c Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/atheros/driver/if_ath_pci.c Wed Jul 30 18:44:18 2003 @@ -151,7 +151,7 @@ dev->mem_start = mem; dev->mem_end = mem + pci_resource_len(pdev, 0); dev->priv = sc; - dev->owner = THIS_MODULE; + SET_MODULE_OWNER(dev); sc->aps_sc.sc_pdev = pdev; diff -Nru a/drivers/net/wireless/atheros/driver/if_athvar.h b/drivers/net/wireless/atheros/driver/if_athvar.h --- a/drivers/net/wireless/atheros/driver/if_athvar.h Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/atheros/driver/if_athvar.h Wed Jul 30 18:44:18 2003 @@ -138,13 +138,13 @@ u_int16_t sc_cachelsz; /* cache line size */ dma_addr_t sc_desc_daddr; /* DMA (physical) address */ - struct tq_struct sc_fataltq; /* fatal error intr tasklet */ + struct work_struct sc_fatalwk; /* fatal error intr tasklet */ int sc_rxbufsize; /* rx size based on mtu */ TAILQ_HEAD(, ath_buf) sc_rxbuf; /* receive buffer */ u_int32_t *sc_rxlink; /* link ptr in last RX desc */ - struct tq_struct sc_rxtq; /* rx intr tasklet */ - struct tq_struct sc_rxorntq; /* rxorn intr tasklet */ + struct work_struct sc_rxwk; /* rx intr tasklet */ + struct work_struct sc_rxornwk; /* rxorn intr tasklet */ u_int sc_txhalq; /* HAL q for outgoing frames */ u_int32_t *sc_txlink; /* link ptr in last TX desc */ @@ -152,13 +152,13 @@ spinlock_t sc_txbuflock; /* txbuf lock */ TAILQ_HEAD(, ath_buf) sc_txq; /* transmit queue */ spinlock_t sc_txqlock; /* lock on txq and txlink */ - struct tq_struct sc_txtq; /* tx intr tasklet */ + struct work_struct sc_txwk; /* tx intr tasklet */ u_int sc_bhalq; /* HAL q for outgoing beacons */ struct ath_buf *sc_bcbuf; /* beacon buffer */ struct ath_buf *sc_bufptr; /* allocated buffer ptr */ - struct tq_struct sc_swbatq; /* swba intr tasklet */ - struct tq_struct sc_bmisstq; /* bmiss intr tasklet */ + struct work_struct sc_swbawk; /* swba intr tasklet */ + struct work_struct sc_bmisswk; /* bmiss intr tasklet */ struct timer_list sc_rate_ctl; /* tx rate control timer */ struct timer_list sc_cal_ch; /* calibration timer */ @@ -181,7 +181,7 @@ void ath_resume(struct net_device *); void ath_suspend(struct net_device *); void ath_shutdown(struct net_device *); -void ath_intr(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t ath_intr(int irq, void *dev_id, struct pt_regs *regs); #ifdef CONFIG_SYSCTL void ath_sysctl_register(void); void ath_sysctl_unregister(void); diff -Nru a/drivers/net/wireless/atheros/wlan/Makefile b/drivers/net/wireless/atheros/wlan/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/net/wireless/atheros/wlan/Makefile Wed Jul 30 18:44:18 2003 @@ -0,0 +1,5 @@ +EXTRA_CFLAGS += -I$(obj)/.. + +obj-$(CONFIG_ATHEROS) += wlan.o + +wlan-objs := if_ieee80211subr.o if_ieee80211wireless.o if_media.o rc4.o diff -Nru a/drivers/net/wireless/atheros/wlan/if_ieee80211.h b/drivers/net/wireless/atheros/wlan/if_ieee80211.h --- a/drivers/net/wireless/atheros/wlan/if_ieee80211.h Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/atheros/wlan/if_ieee80211.h Wed Jul 30 18:44:18 2003 @@ -80,7 +80,8 @@ #ifndef _NET_IF_IEEE80211_H_ #define _NET_IF_IEEE80211_H_ -#include <sys/queue.h> +#include <bsdcompat/compat.h> +#include <bsdcompat/queue.h> #include "if_media.h" #ifdef CONFIG_NET_WIRELESS #include <linux/wireless.h> diff -Nru a/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c b/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c --- a/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c Wed Jul 30 18:44:18 2003 @@ -100,7 +100,6 @@ #include "if_llc.h" #include "if_ethersubr.h" -#ifdef NEW_MODULE_CODE #define __MOD_INC_USE_COUNT(_m) \ if (!try_module_get(_m)) { \ printk(KERN_WARNING "%s: try_module_get failed\n", \ @@ -108,7 +107,6 @@ return (ENODEV); \ } #define __MOD_DEC_USE_COUNT(_m) module_put(_m) -#endif #define IEEE80211_DEBUG #ifdef IEEE80211_DEBUG diff -Nru a/drivers/net/wireless/atheros/wlan/if_media.h b/drivers/net/wireless/atheros/wlan/if_media.h --- a/drivers/net/wireless/atheros/wlan/if_media.h Wed Jul 30 18:44:18 2003 +++ b/drivers/net/wireless/atheros/wlan/if_media.h Wed Jul 30 18:44:18 2003 @@ -65,7 +65,7 @@ #ifdef __KERNEL__ -#include <sys/queue.h> +#include "bsdcompat/queue.h" /* * Driver callbacks for media status and change requests. =================================================================== |
From: Carl T. <ce...@ca...> - 2003-07-31 02:11:52
|
Did you check the archives? I've already ported this driver to 2.6 and my port may actually be in the next release. (I'm not sure. Greg or Sam, is it in there?) One difference, though, is that I just patched the driver to be built for 2.6. I don't attempt to put the driver actually in the kernel tree as you are doing. In my opinion that is a bad idea because the driver include proprietary binary code which is not GPLed and putting it in the kernel tree almost certainly violates the GPL. Carl Thompson Quoting Arnaldo Carvalho de Melo <ac...@co...>: > Hi, > > During OLS Greg Kroah was kind and gave me a linksys WPC55AG card > that has the atheros 5212 chipset, and while in Ottawa I ported it to > 2.6.0-test2, tested it at OLS wireless net (802.11b linksys access > points) and > at Les Suites Hotel 802.11a access points at 54mbit/s, and here at > DaveM's > place with an Atheros access point, all working nicely, kudos to Sam for > the > solid driver! > > I have a bitkeeper tree at: > > bk://kernel.bkbits.net/acme/atheros-2.6 > > This tree has 2.6.0-test2 (latest bk from Linus at this point in time) > it has this driver at drivers/net/wireless/atheros, with minor > modifications in > the tree structure (namely BSD compat stuff is at > drivers/net/wireless/atheros/bsdcompat), and the first changeset has the > original sources as of madwifi-20030702 snapshot in the sourceforge > project > site, while the next changeset has the port, that I put inline at the end > of > this message. > > For non-bitkeeper users the patch is available at: > > http://www.kernel.org/pub/linux/kernel/people/acme/v2.6/2.6.0-test2/atheros-2.6.patch.bz2 > > It should be hitting all the www.kernel.org mirrors shortly. > > Now I'm looking at consolidating the 802.11 stacks in most wireless > drivers already in the tree, starting with the initial stack David Miller > sent > me. > > - Arnaldo > > =================================================================== > > > ChangeSet@1.1597, 2003-07-30 16:56:40-07:00, ac...@rt... > o atheros: port the driver to 2.6 > > . use workqueues > . use irqreturn_t > . use kbuild 2.6 > . move static inits to 0 to bss > . s/return EFOOBAR/return -EFOOBAR/g > . use SET_MODULE_OWNER > . use NEW_MODULE_CODE stuff > . move the BSD compat cruft to bsdcompat subdirectory (will be killed) > . use standard min/max macros in Linux > > > Kconfig | 8 ++++ > Makefile | 1 > atheros/Makefile | 1 > atheros/ath_hal/Makefile | 8 ++++ > atheros/ath_hal/ah_osdep.c | 9 +---- > atheros/driver/Makefile | 5 ++ > atheros/driver/if_ath.c | 67 > +++++++++++++++++++--------------------- > atheros/driver/if_ath_pci.c | 2 - > atheros/driver/if_athvar.h | 14 ++++---- > atheros/wlan/Makefile | 5 ++ > atheros/wlan/if_ieee80211.h | 3 + > atheros/wlan/if_ieee80211subr.c | 2 - > atheros/wlan/if_media.h | 2 - > 13 files changed, 73 insertions(+), 54 deletions(-) > > > diff -Nru a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig > --- a/drivers/net/wireless/Kconfig Wed Jul 30 18:44:18 2003 > +++ b/drivers/net/wireless/Kconfig Wed Jul 30 18:44:18 2003 > @@ -167,6 +167,14 @@ > > The driver can be compiled as a module and will be named "airo". > > +config ATHEROS > + tristate "Atheros MiniPCI and CardBus based cards" > + depends on NET_RADIO && PCI > + ---help--- > + Atheros MiniPCI and CardBus based cards. > + > + The driver can be compiled as a module and will be named "ath_pci". > + > config HERMES > tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)" > depends on NET_RADIO && (PPC_PMAC || PCI || PCMCIA) > diff -Nru a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile > --- a/drivers/net/wireless/Makefile Wed Jul 30 18:44:18 2003 > +++ b/drivers/net/wireless/Makefile Wed Jul 30 18:44:18 2003 > @@ -17,6 +17,7 @@ > obj-$(CONFIG_PCI_HERMES) += orinoco_pci.o > obj-$(CONFIG_TMD_HERMES) += orinoco_tmd.o > > +obj-$(CONFIG_ATHEROS) += atheros/ > obj-$(CONFIG_AIRO) += airo.o > obj-$(CONFIG_AIRO_CS) += airo_cs.o airo.o > > diff -Nru a/drivers/net/wireless/atheros/Makefile > b/drivers/net/wireless/atheros/Makefile > --- /dev/null Wed Dec 31 16:00:00 1969 > +++ b/drivers/net/wireless/atheros/Makefile Wed Jul 30 18:44:18 2003 > @@ -0,0 +1 @@ > +obj-$(CONFIG_ATHEROS) += wlan/ driver/ ath_hal/ > diff -Nru a/drivers/net/wireless/atheros/ath_hal/Makefile > b/drivers/net/wireless/atheros/ath_hal/Makefile > --- /dev/null Wed Dec 31 16:00:00 1969 > +++ b/drivers/net/wireless/atheros/ath_hal/Makefile Wed Jul 30 18:44:18 > 2003 > @@ -0,0 +1,8 @@ > +EXTRA_CFLAGS += -I$(obj)/.. > + > +obj-$(CONFIG_ATHEROS) += ath_hal.o > + > +ath_hal-objs := ah_osdep.o hal.o > + > +$(obj)/hal.o: $(src)/i386-elf.hal.o.uu > + uudecode < $(src)/i386-elf.hal.o.uu > diff -Nru a/drivers/net/wireless/atheros/ath_hal/ah_osdep.c > b/drivers/net/wireless/atheros/ath_hal/ah_osdep.c > --- a/drivers/net/wireless/atheros/ath_hal/ah_osdep.c Wed Jul 30 18:44:18 > 2003 > +++ b/drivers/net/wireless/atheros/ath_hal/ah_osdep.c Wed Jul 30 18:44:18 > 2003 > @@ -54,15 +54,12 @@ > > #include "ah.h" > > -#ifdef NEW_MODULE_CODE > #define __MOD_INC_USE_COUNT(_m) \ > if (!try_module_get(_m)) { \ > - printk(KERN_WARNING "%s: try_module_get failed\n", \ > - ic->ic_dev.name); \ > - return (ENODEV); \ > + printk(KERN_WARNING "try_module_get failed\n"); \ > + return NULL; \ > } > #define __MOD_DEC_USE_COUNT(_m) module_put(_m) > -#endif > > #define AH_TIMEOUT 1000 > > @@ -276,8 +273,6 @@ > > static OS_INLINE char *med3(char *, char *, char *, ath_hal_cmp_t *); > static OS_INLINE void swapfunc(char *, char *, int, int); > - > -#define min(a, b) (a) < (b) ? (a) : (b) > > /* > * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". > diff -Nru a/drivers/net/wireless/atheros/driver/Makefile > b/drivers/net/wireless/atheros/driver/Makefile > --- /dev/null Wed Dec 31 16:00:00 1969 > +++ b/drivers/net/wireless/atheros/driver/Makefile Wed Jul 30 18:44:18 > 2003 > @@ -0,0 +1,5 @@ > +EXTRA_CFLAGS += -I$(obj)/../ath_hal -I$(obj)/../wlan -I$(obj)/.. > + > +obj-$(CONFIG_ATHEROS) += ath_pci.o > + > +ath_pci-objs := if_ath.o if_ath_pci.o > diff -Nru a/drivers/net/wireless/atheros/driver/if_ath.c > b/drivers/net/wireless/atheros/driver/if_ath.c > --- a/drivers/net/wireless/atheros/driver/if_ath.c Wed Jul 30 18:44:18 > 2003 > +++ b/drivers/net/wireless/atheros/driver/if_ath.c Wed Jul 30 18:44:18 > 2003 > @@ -113,11 +113,11 @@ > static int ath_rateinterval = 1000; /* rate ctl interval (ms) */ > static int ath_bmisshack = 1; /* XXX */ > static int ath_countrycode = CTRY_DEFAULT; /* country code */ > -static int ath_regdomain = 0; /* regulatory domain */ > +static int ath_regdomain; /* regulatory domain */ > static int ath_outdoor = AH_TRUE; /* enable outdoor use */ > > #ifdef AR_DEBUG > -int ath_debug = 0; > +int ath_debug; > #define IFF_DUMPPKTS(_ic) (ath_debug || netif_msg_dumppkts(_ic)) > static void ath_printrxbuf(struct ath_buf *bf, int); > static void ath_printtxbuf(struct ath_buf *bf, int); > @@ -148,18 +148,18 @@ > spin_lock_init(&sc->sc_txbuflock); > spin_lock_init(&sc->sc_txqlock); > > - INIT_TQUEUE(&sc->sc_rxtq, ath_rx_tasklet, dev); > - INIT_TQUEUE(&sc->sc_txtq, ath_tx_tasklet, dev); > - INIT_TQUEUE(&sc->sc_swbatq, ath_beacon_tasklet, dev); > - INIT_TQUEUE(&sc->sc_bmisstq, ath_bmiss_tasklet, dev); > - INIT_TQUEUE(&sc->sc_rxorntq, ath_rxorn_tasklet, dev); > - INIT_TQUEUE(&sc->sc_fataltq, ath_fatal_tasklet, dev); > + INIT_WORK(&sc->sc_rxwk, ath_rx_tasklet, dev); > + INIT_WORK(&sc->sc_txwk, ath_tx_tasklet, dev); > + INIT_WORK(&sc->sc_swbawk, ath_beacon_tasklet, dev); > + INIT_WORK(&sc->sc_bmisswk, ath_bmiss_tasklet, dev); > + INIT_WORK(&sc->sc_rxornwk, ath_rxorn_tasklet, dev); > + INIT_WORK(&sc->sc_fatalwk, ath_fatal_tasklet, dev); > > ah = _ath_hal_attach(devid, sc, 0, (void *) dev->mem_start, &status); > if (ah == NULL) { > printk(KERN_ERR "%s: unable to attach hardware; HAL status %u\n", > dev->name, status); > - error = ENXIO; > + error = -ENXIO; > goto bad; > } > sc->sc_ah = ah; > @@ -310,29 +310,26 @@ > * Interrupt handler. All the actual processing is > * deferred to tasklets. > */ > -void > -ath_intr(int irq, void *dev_id, struct pt_regs *regs) > +irqreturn_t ath_intr(int irq, void *dev_id, struct pt_regs *regs) > { > struct net_device *dev = dev_id; > struct ath_softc *sc = dev->priv; > struct ath_hal *ah = sc->sc_ah; > HAL_INT status; > - int needmark; > > if (sc->sc_invalid) { > /* > * The hardware is gone, don't touch anything. > * XXX can this happen? > */ > - return; > + return IRQ_NONE; > } > if ((dev->flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP)) { > DPRINTF(("ath_intr: flags 0x%x\n", dev->flags)); > ath_hal_getisr(ah, &status); /* clear ISR */ > ath_hal_intrset(ah, 0); /* disable further intr's */ > - return; > + return IRQ_HANDLED; > } > - needmark = 0; > ath_hal_getisr(ah, &status); > DPRINTF2(("%s: interrupt, status 0x%x\n", dev->name, status)); > if (ath_bmisshack) status &= ~HAL_INT_BMISS; /*XXX*/ > @@ -345,10 +342,10 @@ > #endif /* AR_DEBUG */ > if (status & HAL_INT_FATAL) { > sc->sc_stats.ast_hardware++; > - needmark |= queue_task(&sc->sc_fataltq, &tq_immediate); > + schedule_work(&sc->sc_fatalwk); > } else if (status & HAL_INT_RXORN) { > sc->sc_stats.ast_rxorn++; > - needmark |= queue_task(&sc->sc_rxorntq, &tq_immediate); > + schedule_work(&sc->sc_rxornwk); > } else { > if (status & HAL_INT_RXEOL) { > /* > @@ -365,18 +362,18 @@ > ath_hal_updatetxtriglevel(ah, AH_TRUE); > } > if (status & HAL_INT_RX) > - needmark |= queue_task(&sc->sc_rxtq, &tq_immediate); > + schedule_work(&sc->sc_rxwk); > if (status & HAL_INT_TX) > - needmark |= queue_task(&sc->sc_txtq, &tq_immediate); > + schedule_work(&sc->sc_txwk); > if (status & HAL_INT_SWBA) > - needmark |= queue_task(&sc->sc_swbatq, &tq_immediate); > + schedule_work(&sc->sc_swbawk); > if (status & HAL_INT_BMISS) { > sc->sc_stats.ast_bmiss++; > - needmark |= queue_task(&sc->sc_bmisstq, &tq_immediate); > + schedule_work(&sc->sc_bmisswk); > } > } > - if (needmark) > - mark_bh(IMMEDIATE_BH); > + > + return IRQ_HANDLED; > } > > static void > @@ -454,7 +451,7 @@ > if (!ath_hal_reset(ah, ic->ic_opmode, &hchan, AH_FALSE, &status)) { > printk("%s: unable to reset hardware; hal status %u\n", > dev->name, status); > - return EIO; > + return -EIO; > } > > /* > @@ -468,7 +465,7 @@ > ath_initkeytable(sc); > if (ath_startrecv(dev) != 0) { > printk("%s: unable to start recv logic\n", dev->name); > - return EIO; > + return -EIO; > } > > /* > @@ -917,7 +914,7 @@ > DPRINTF(("ath_beacon_alloc: cannot allocate sk_buff; size %u\n", > roundup(sizeof(struct ieee80211_frame)+pktlen, 4))); > sc->sc_stats.ast_be_nobuf++; > - return ENOMEM; > + return -ENOMEM; > } > > wh = (struct ieee80211_frame *) > @@ -1174,7 +1171,7 @@ > sc->sc_desc = pci_alloc_consistent(sc->sc_pdev, > sc->sc_desc_len, &sc->sc_desc_daddr); > if (sc->sc_desc == NULL) > - return ENOMEM; > + return -ENOMEM; > ds = sc->sc_desc; > DPRINTF(("ath_desc_alloc: DMA map: %p (%d) -> %p\n", > ds, sc->sc_desc_len, (caddr_t) sc->sc_desc_daddr)); > @@ -1213,7 +1210,7 @@ > pci_free_consistent(sc->sc_pdev, sc->sc_desc_len, > sc->sc_desc, sc->sc_desc_daddr); > sc->sc_desc = NULL; > - return ENOMEM; > + return -ENOMEM; > } > > static void > @@ -1285,7 +1282,7 @@ > DPRINTF(("ath_rxbuf_init: skbuff allocation failed; " > "size %u\n", sc->sc_rxbufsize)); > sc->sc_stats.ast_rx_nobuf++; > - return ENOMEM; > + return -ENOMEM; > } > skb->dev = &sc->sc_ic.ic_dev; > bf->bf_skb = skb; > @@ -1918,7 +1915,7 @@ > printk("%s: %s: unable to reset channel %u (%uMhz)\n", > dev->name, __func__, > ieee80211_chan2ieee(ic, chan), chan->ic_freq); > - return EIO; > + return -EIO; > } > > /* > @@ -1927,7 +1924,7 @@ > if (ath_startrecv(dev) != 0) { > printk("%s: %s: unable to restart recv logic\n", > dev->name, __func__); > - return EIO; > + return -EIO; > } > > /* > @@ -2126,14 +2123,14 @@ > chans = kmalloc(IEEE80211_CHAN_MAX * sizeof(HAL_CHANNEL), GFP_KERNEL); > if (chans == NULL) { > printk("%s: unable to allocate channel table\n", dev->name); > - return ENOMEM; > + return -ENOMEM; > } > if (!ath_hal_init_channels(ah, chans, IEEE80211_CHAN_MAX, &nchan, > cc, HAL_MODE_ALL, outdoor)) { > printk("%s: unable to collect channel list from hal\n", > dev->name); > kfree(chans); > - return EINVAL; > + return -EINVAL; > } > > /* > @@ -2437,7 +2434,7 @@ > } > dev = dev_get_by_name("ath0"); /* XXX */ > if (!dev) > - return EINVAL; > + return -EINVAL; > sc = dev->priv; > #define STAT(x) do { \ > if (sc->sc_stats.ast_##x != 0) \ > @@ -2534,7 +2531,7 @@ > dev = dev_get_by_name("ath0"); /* XXX */ > if (!dev) { > printk("%s: no ath0 device\n", __func__); > - return EINVAL; > + return -EINVAL; > } > sc = dev->priv; > if (*lenp >= 3 && strncmp(buffer, "hal", 3) == 0) > diff -Nru a/drivers/net/wireless/atheros/driver/if_ath_pci.c > b/drivers/net/wireless/atheros/driver/if_ath_pci.c > --- a/drivers/net/wireless/atheros/driver/if_ath_pci.c Wed Jul 30 > 18:44:18 2003 > +++ b/drivers/net/wireless/atheros/driver/if_ath_pci.c Wed Jul 30 > 18:44:18 2003 > @@ -151,7 +151,7 @@ > dev->mem_start = mem; > dev->mem_end = mem + pci_resource_len(pdev, 0); > dev->priv = sc; > - dev->owner = THIS_MODULE; > + SET_MODULE_OWNER(dev); > > sc->aps_sc.sc_pdev = pdev; > > diff -Nru a/drivers/net/wireless/atheros/driver/if_athvar.h > b/drivers/net/wireless/atheros/driver/if_athvar.h > --- a/drivers/net/wireless/atheros/driver/if_athvar.h Wed Jul 30 18:44:18 > 2003 > +++ b/drivers/net/wireless/atheros/driver/if_athvar.h Wed Jul 30 18:44:18 > 2003 > @@ -138,13 +138,13 @@ > u_int16_t sc_cachelsz; /* cache line size */ > dma_addr_t sc_desc_daddr; /* DMA (physical) address */ > > - struct tq_struct sc_fataltq; /* fatal error intr tasklet */ > + struct work_struct sc_fatalwk; /* fatal error intr tasklet */ > > int sc_rxbufsize; /* rx size based on mtu */ > TAILQ_HEAD(, ath_buf) sc_rxbuf; /* receive buffer */ > u_int32_t *sc_rxlink; /* link ptr in last RX desc */ > - struct tq_struct sc_rxtq; /* rx intr tasklet */ > - struct tq_struct sc_rxorntq; /* rxorn intr tasklet */ > + struct work_struct sc_rxwk; /* rx intr tasklet */ > + struct work_struct sc_rxornwk; /* rxorn intr tasklet */ > > u_int sc_txhalq; /* HAL q for outgoing frames */ > u_int32_t *sc_txlink; /* link ptr in last TX desc */ > @@ -152,13 +152,13 @@ > spinlock_t sc_txbuflock; /* txbuf lock */ > TAILQ_HEAD(, ath_buf) sc_txq; /* transmit queue */ > spinlock_t sc_txqlock; /* lock on txq and txlink */ > - struct tq_struct sc_txtq; /* tx intr tasklet */ > + struct work_struct sc_txwk; /* tx intr tasklet */ > > u_int sc_bhalq; /* HAL q for outgoing beacons */ > struct ath_buf *sc_bcbuf; /* beacon buffer */ > struct ath_buf *sc_bufptr; /* allocated buffer ptr */ > - struct tq_struct sc_swbatq; /* swba intr tasklet */ > - struct tq_struct sc_bmisstq; /* bmiss intr tasklet */ > + struct work_struct sc_swbawk; /* swba intr tasklet */ > + struct work_struct sc_bmisswk; /* bmiss intr tasklet */ > > struct timer_list sc_rate_ctl; /* tx rate control timer */ > struct timer_list sc_cal_ch; /* calibration timer */ > @@ -181,7 +181,7 @@ > void ath_resume(struct net_device *); > void ath_suspend(struct net_device *); > void ath_shutdown(struct net_device *); > -void ath_intr(int irq, void *dev_id, struct pt_regs *regs); > +irqreturn_t ath_intr(int irq, void *dev_id, struct pt_regs *regs); > #ifdef CONFIG_SYSCTL > void ath_sysctl_register(void); > void ath_sysctl_unregister(void); > diff -Nru a/drivers/net/wireless/atheros/wlan/Makefile > b/drivers/net/wireless/atheros/wlan/Makefile > --- /dev/null Wed Dec 31 16:00:00 1969 > +++ b/drivers/net/wireless/atheros/wlan/Makefile Wed Jul 30 18:44:18 2003 > @@ -0,0 +1,5 @@ > +EXTRA_CFLAGS += -I$(obj)/.. > + > +obj-$(CONFIG_ATHEROS) += wlan.o > + > +wlan-objs := if_ieee80211subr.o if_ieee80211wireless.o if_media.o rc4.o > diff -Nru a/drivers/net/wireless/atheros/wlan/if_ieee80211.h > b/drivers/net/wireless/atheros/wlan/if_ieee80211.h > --- a/drivers/net/wireless/atheros/wlan/if_ieee80211.h Wed Jul 30 > 18:44:18 2003 > +++ b/drivers/net/wireless/atheros/wlan/if_ieee80211.h Wed Jul 30 > 18:44:18 2003 > @@ -80,7 +80,8 @@ > #ifndef _NET_IF_IEEE80211_H_ > #define _NET_IF_IEEE80211_H_ > > -#include <sys/queue.h> > +#include <bsdcompat/compat.h> > +#include <bsdcompat/queue.h> > #include "if_media.h" > #ifdef CONFIG_NET_WIRELESS > #include <linux/wireless.h> > diff -Nru a/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c > b/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c > --- a/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c Wed Jul 30 > 18:44:18 2003 > +++ b/drivers/net/wireless/atheros/wlan/if_ieee80211subr.c Wed Jul 30 > 18:44:18 2003 > @@ -100,7 +100,6 @@ > #include "if_llc.h" > #include "if_ethersubr.h" > > -#ifdef NEW_MODULE_CODE > #define __MOD_INC_USE_COUNT(_m) \ > if (!try_module_get(_m)) { \ > printk(KERN_WARNING "%s: try_module_get failed\n", \ > @@ -108,7 +107,6 @@ > return (ENODEV); \ > } > #define __MOD_DEC_USE_COUNT(_m) module_put(_m) > -#endif > > #define IEEE80211_DEBUG > #ifdef IEEE80211_DEBUG > diff -Nru a/drivers/net/wireless/atheros/wlan/if_media.h > b/drivers/net/wireless/atheros/wlan/if_media.h > --- a/drivers/net/wireless/atheros/wlan/if_media.h Wed Jul 30 18:44:18 > 2003 > +++ b/drivers/net/wireless/atheros/wlan/if_media.h Wed Jul 30 18:44:18 > 2003 > @@ -65,7 +65,7 @@ > > #ifdef __KERNEL__ > > -#include <sys/queue.h> > +#include "bsdcompat/queue.h" > > /* > * Driver callbacks for media status and change requests. > > =================================================================== > > > ------------------------------------------------------- > This SF.Net email sponsored by: Free pre-built ASP.NET sites including > Data Reports, E-commerce, Portals, and Forums are available now. > Download today and enter to win an XBOX or Visual Studio .NET. > http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01 > _______________________________________________ > Madwifi-users mailing list > Mad...@li... > https://lists.sourceforge.net/lists/listinfo/madwifi-users > > |
From: Sam L. <sa...@er...> - 2003-07-31 02:24:54
|
> Did you check the archives? I've already ported this driver to 2.6 and my > port may actually be in the next release. (I'm not sure. Greg or Sam, is > it in there?) One difference, though, is that I just patched the driver > to be built for 2.6. I don't attempt to put the driver actually in the > kernel tree as you are doing. In my opinion that is a bad idea because > the driver include proprietary binary code which is not GPLed and putting > it in the kernel tree almost certainly violates the GPL. > I for one am happy to see Arnaldo interested and involved and could care less how or where the code resides so long as everyone has good access to it. My only concern is creating a 2.6-only version that diverges from code used on older systems. Regardless, we can surely work out how best to deal with this and how best to push the code forward. Sam |
From: Carl T. <ce...@ca...> - 2003-07-31 02:39:52
|
So my patch is not already in there? (My patch allows compilation for both 2.4 and 2.6 so the code wouldn't diverge.) Carl Quoting Sam Leffler <sa...@er...>: > > Did you check the archives? I've already ported this driver to 2.6 and > my > > port may actually be in the next release. (I'm not sure. Greg or Sam, > is > > it in there?) One difference, though, is that I just patched the > driver > > to be built for 2.6. I don't attempt to put the driver actually in the > > kernel tree as you are doing. In my opinion that is a bad idea because > > the driver include proprietary binary code which is not GPLed and > putting > > it in the kernel tree almost certainly violates the GPL. > > > > I for one am happy to see Arnaldo interested and involved and could care > less how or where the code resides so long as everyone has good access to > it. My only concern is creating a 2.6-only version that diverges from > code > used on older systems. Regardless, we can surely work out how best to > deal > with this and how best to push the code forward. > > Sam > > > > |
From: Jean T. <jt...@bo...> - 2003-07-31 02:29:58
|
On Wed, Jul 30, 2003 at 07:24:24PM -0700, Sam Leffler wrote: > >Did you check the archives? I've already ported this driver to 2.6 and my > >port may actually be in the next release. (I'm not sure. Greg or Sam, is > >it in there?) One difference, though, is that I just patched the driver > >to be built for 2.6. I don't attempt to put the driver actually in the > >kernel tree as you are doing. In my opinion that is a bad idea because > >the driver include proprietary binary code which is not GPLed and putting > >it in the kernel tree almost certainly violates the GPL. > > > > I for one am happy to see Arnaldo interested and involved and could care > less how or where the code resides so long as everyone has good access to > it. My only concern is creating a 2.6-only version that diverges from code > used on older systems. Regardless, we can surely work out how best to deal > with this and how best to push the code forward. > > Sam That's the hard life of beeing a maintainer, you are supposed to integrate patch faster than they arrive ! Good luck ! Jean |
From: Greg KH <gr...@kr...> - 2003-07-31 04:41:05
|
On Wed, Jul 30, 2003 at 10:49:23PM -0300, Arnaldo Carvalho de Melo wrote: > Hi, > > During OLS Greg Kroah was kind and gave me a linksys WPC55AG card > that has the atheros 5212 chipset, and while in Ottawa I ported it to > 2.6.0-test2, tested it at OLS wireless net (802.11b linksys access points) and > at Les Suites Hotel 802.11a access points at 54mbit/s, and here at DaveM's > place with an Atheros access point, all working nicely, kudos to Sam for the > solid driver! Very nice. I'd like to thank Jerritt Collord of linuxfund.org for providing the device to me in the first place. Glad to see that you have this all working well. As for the 2.4 vs. 2.6 split, a lot of times it's easier just to maintain two different versions of the driver. It makes for cleaner code, and you have a better chance of getting it into the main kernel tree that way. thanks, greg k-h |
From: Jean T. <jt...@bo...> - 2003-07-31 19:08:19
|
On Wed, Jul 30, 2003 at 09:15:13PM -0700, Greg KH wrote: > On Wed, Jul 30, 2003 at 10:49:23PM -0300, Arnaldo Carvalho de Melo wrote: > > Hi, > > > > During OLS Greg Kroah was kind and gave me a linksys WPC55AG card > > that has the atheros 5212 chipset, and while in Ottawa I ported it to > > 2.6.0-test2, tested it at OLS wireless net (802.11b linksys access points) and > > at Les Suites Hotel 802.11a access points at 54mbit/s, and here at DaveM's > > place with an Atheros access point, all working nicely, kudos to Sam for the > > solid driver! > > Very nice. I'd like to thank Jerritt Collord of linuxfund.org for > providing the device to me in the first place. > > Glad to see that you have this all working well. > > As for the 2.4 vs. 2.6 split, a lot of times it's easier just to > maintain two different versions of the driver. It makes for cleaner > code, and you have a better chance of getting it into the main kernel > tree that way. That's only true for USB drivers. For network and wireless drivers, the API difference between 2.4.X and 2.6.X are fairly trivial (thanks Jeff !). Anyway, because of the binary part, we are not talking at all about pushing this driver into the kernel. > thanks, > > greg k-h Have fun... Jean |