--- ref-2.3.99-pre6-atm-0.77/drivers/atm/fore200e.c +++ linux-2.3.99-pre6-atm-0.77-fore200e-0.2f/drivers/atm/fore200e.c Sun May 21 15:21:38 2000 @@ -65,7 +65,7 @@ #define FORE200E_52BYTE_AAL0_SDU #endif -#define FORE200E_VERSION "0.2d" +#define FORE200E_VERSION "0.2f" #define FORE200E "fore200e: " @@ -1215,8 +1215,8 @@ fore200e_push_rpd(fore200e, entry->rpd); } else { - printk(FORE200E "damaged PDU on %d.%d.%d\n", - fore200e->atm_dev->number, entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci); + DPRINTK(1, "damaged PDU on %d.%d.%d\n", + fore200e->atm_dev->number, entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci); } fore200e_collect_rpd(fore200e, entry->rpd); @@ -1543,7 +1543,7 @@ retry_here: - tasklet_disable(&fore200e->tasklet); + spin_lock_bh(&fore200e->tx_lock); entry = &txq->host_entry[ txq->head ]; @@ -1553,8 +1553,8 @@ fore200e_irq_tx(fore200e); if (*entry->status != STATUS_FREE) { - - tasklet_enable(&fore200e->tasklet); + + spin_unlock_bh(&fore200e->tx_lock); /* retry once again? */ if(--retry > 0) @@ -1593,8 +1593,9 @@ entry->data = kmalloc(tx_len, GFP_ATOMIC | GFP_DMA); if (entry->data == NULL) { - - tasklet_enable(&fore200e->tasklet); + + spin_unlock_bh(&fore200e->tx_lock); + if (vcc->pop) vcc->pop(vcc, skb); else @@ -1618,7 +1619,7 @@ FORE200E_NEXT_ENTRY(txq->head, QUEUE_SIZE_TX); txq->txing++; - tasklet_enable(&fore200e->tasklet); + spin_unlock_bh(&fore200e->tx_lock); /* ensure DMA synchronisation */ fore200e->bus->dma_sync(fore200e, tpd->tsd[ 0 ].buffer, tpd->tsd[ 0 ].length, FORE200E_DMA_TODEVICE); @@ -2355,6 +2356,7 @@ DPRINTK(2, "device %s being initialized\n", fore200e->name); + spin_lock_init(&fore200e->tx_lock); init_MUTEX(&fore200e->rate_sf); cpq = fore200e->cp_queues = (struct cp_queues*) (fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET); --- ref-2.3.99-pre6-atm-0.77/drivers/atm/fore200e.h +++ linux-2.3.99-pre6-atm-0.77-fore200e-0.2f/drivers/atm/fore200e.h Mon May 8 13:34:33 2000 @@ -879,6 +879,7 @@ struct stats* stats; /* last snapshot of the stats */ struct semaphore rate_sf; /* protects rate reservation ops */ + spinlock_t tx_lock; /* protects tx ops */ struct tasklet_struct tasklet; /* performs interrupt work */ } fore200e_t; --- /dev/null Thu Jan 1 01:00:00 1970 +++ linux-2.4.20/drivers/atm/fore200e.CHANGES Mon Dec 4 14:34:31 2000 @@ -0,0 +1,167 @@ +Version 0.2f (May, 21, 2000) +---------------------------- + + this is just the 'official' release of the preceding version. + It also fixes a buglet spotted by Mitchell Blank Jr. + + - the driver no longer mess with vcc->timestamp. + + +Version 0.2e (May, 8, 2000) +--------------------------- + + this is an experimental version, intended as a first attempt + to fix the lockup problems encountered by a few users + under heavy loads/SMP (probably introduced with the tasklet + code). + + - use the spin_lock_bh() machinery to guard the + critical section of the tx code. + - minor fix to the Makefile test that tells the target + endianess from . + + +Version 0.2d (Mar, 28, 2000) +---------------------------- + + - fix fatal bug in fore200e_open(): the ATM_VF_READY flag + should be set, not cleared! + - fix SBUS DMA direction flags. + - move interrupt handler work to tasklet. + - the compile no longer fails when the driver is compiled + without any hardware support (i.e. with both PCA and SBA + support disabled) (spotted by Arjan van de Ven). Also display + a message to warn the user. + + +Version 0.2c (Mar, 23, 2000) +---------------------------- + + this is a minor interim release. It does not provide significant + improvement to the driver code. + + - initiate transition to the new-style PCI driver support. + - minor cosmetic changes. + - fix typos in Documentation/networking/fore200e.txt. + + +Version 0.2b (Feb, 23, 2000) +---------------------------- + + - update of PCI and SBUS DVMA code to 2.3.47-7 (DVMA functions + now have a 'direction' argument). + + +Version 0.2a (Feb, 11, 2000) +---------------------------- + + this release completes the transition of the driver to the new + DVMA interface. Many thanks to Marconi Networks (formerly FORE + Systems) for having placed their binary firmware images under GPL. + + - switch to the new PCI interface (requires 2.3.42+). + - minor code cleanup. + - add FORE firmware copyright notice. + + +Version 0.2 (Jan, 22, 2000) +--------------------------- + + as the driver is now shipped with the regular linux-atm + distributions, it is now released as a diff against the latest + linux-atm code. + + - drop support of 2.2.x and pre-2.3.36 kernels. + - switch to the new SBUS interface. + + +Version 0.1f (Jan, 22, 2000) +---------------------------- + + this is an interim release that makes the driver ready for the + important 2.3.35+ transition. Significant parts of the driver + have been rewritten to comply to the principles of the new SBUS + interface introduced by the latest 2.3 kernels. + + - clean code. + - rewrite memory management routines. + - rewrite DMA/DVMA management routines. + - rewrite I/O management routines (and fix design weakness). + - fix a bug in the initialization of the buffer supply queue. + - cmd polling now gives up immediately if an error condition + is detected. + + note that the driver remains useable with 2.2 and earlier 2.3 kernels, + but future releases will drop support of pre-2.3.36 kernels. + + +Version 0.1e (Dec, 23, 1999) +---------------------------- + + - support of S/UNI hardware loopback modes via SUNI_GETLOOP/SUNI_SETLOOP + ioctls. + - add the related ioctl entries in arch/sparc64/kernel/ioctl32.c. + - add a simple 'sunimode' utility to get/set the S/UNI loopback mode + (should also work with all the drivers that use suni.c/suni.h). + - fix handling of 52-byte AAL0 SDUs used by atmdump-like applications: + * if qos.txtp.max_sdu == 52, the following tx SDU format is expected + by the driver: + <4-byte cell header><48-byte AAL0 payload>[<48-byte AAL0 payload>...] + i.e. + <--- 52-byte AAL0 SDU used by atmdump --->[<- opt. extra payloads ->] + otherwise, the following tx SDU format is assumed: + <48-byte AAL0 payload>[<48-byte AAL0 payload>...] + * if qos.txtp.max_sdu == 52, the rx SDUs are delivered as follows: + <4-byte cell header><48-byte AAL0 payload> + i.e. + <- 52-byte AAL0 SDU expected by atmdump -> + otherwise, the SDUs are delivered as: <48-byte AAL0 payload> + + +Version 0.1d (Dec, 16, 1999) +---------------------------- + + - add a retry mechanism so that the driver does not immediately give up + if the tx queue is saturated. Saturation of the transmit queue may occur + under extreme conditions, when a fast host continuously submits very + small frames or raw AAL0 cells. + - add a new config option to tune the retry mecanism. + - improve AAL0 support. Attempting to transmit incomplete cell payloads + over an AAL0 VC simply used to nuke the PCA board. + + +Version 0.1c (Nov, 22, 1999) +---------------------------- + + - endian-dependent code no longer depends on arch-specific definitions + (e.g. __powerpc__ or __sparc_v9__) but on __BIG_ENDIAN/__LITTLE_ENDIAN + - the right PCA-200E firmware is no longer selected according to + a list of well-known archs in Config.in, but is guessed from + in Makefile. + - rbd/rsd handles now use the FORE200E_BUF2HDL() and FORE200E_HDL2BUF() + macros. + - minor cosmetic changes. + - spend some time playing with AAL0. Seems to work with MTU = 48 bytes. + + +Version 0.1b (Nov, 16, 1999) +---------------------------- + + - improve the configuration process in order to avoid confusion + caused by the firmware stuff. + - update accordingly the build process and the help file. + + (note that the driver code is unchanged) + + +Version 0.1a (Nov, 2, 1999) +--------------------------- + + - use new mutex initializer in 2.3.1+ kernels. + - add CHANGES file. + + +Version 0.1 (Oct, 25, 1999) +--------------------------- + + - first public release --- /dev/null Thu Jan 1 01:00:00 1970 +++ linux-2.4.20/drivers/atm/fore200e.README Mon Dec 4 14:34:31 2000 @@ -0,0 +1,79 @@ + +linux-2.4.0-test9-fore200e-0.3.tar +---------------------------------- + +This package updates the support of the FORE Systems 200E-series ATM +adapters by the Linux operating system. Note that the driver itself is +now distributed with the regular Linux kernel distribution. + +It is based on the earlier PCA-200E driver written by Uwe Dannowski. + +This device driver simultaneously supports PCA-200E and SBA-200E adapters on +i386, alpha (untested), powerpc, sparc and sparc64 hosts. + +The intent is to enable the use of different models of FORE adapters at the +same time, by servers that have several bus interfaces (such as PCI+SBUS, +PCI+MCA or PCI+EISA). +Only PCI and SBUS devices are currently supported by the driver, but support +for other bus interfaces such as EISA should not be too hard to add (this may +be more tricky for the MCA bus, though, as FORE made some MCA-specific +modifications to the adapter's AALI interface). + +The driver is shipped with firmware data being uploaded to the ATM adapters +at system boot time or at module loading time. The supplied firmware images +should work with all adapters. + +However, if you encounter problems (the firmware doesn't start or the driver +is unable to read the PROM data), you may consider trying another firmware +version. Alternative binary firmware images can be found somewhere on the +ForeThough CD-ROM supplied with your adapter by FORE Systems. + +You can also get the latest firmware images from FORE Systems at +http://www.fore.com. Register TACTics Online and go to +the 'software updates' pages. The firmware binaries are part of +the various ForeThough software distributions. + +Notice that different versions of the PCA-200E firmware exist, depending +on the endianess of the host architecture. The driver is shipped with +both little and big endian PCA firmware images. + +Name and location of the alternative firmware images can be set at kernel +configuration time. See the INSTALL file for details. + +Also note that the firmware binaries are the intellectual property +of FORE Systems, Inc. Please read the fore200e_firmware_copyright file. + + + +Driver features summary +----------------------- + + - simultaneously supports PCA-200E and SBA-200E adapters; + - works on i386, powerpc, SBUS-based sparc and + SBUS or PCI-based sparc64 architectures; + - now targeted to 2.4.0-test9 kernels; + - uses new DVMA PCI and SBUS interfaces; + - useable as a removable kernel module; + - supports FORE pseudo-CBR rate control; + - the reserved CBR rate can be changed after VC setup; + - supports AAL0, AAL3/4 and AAL5; + - supports S/UNI hardware loopback modes; + - internal design focuses on portability and extensibility. + + +Restrictions / Known bugs +------------------------- + + - only VP=0 is supported; + - 'insmod' coredumps when attempting to load the driver on sparc64 + hosts (at least using the old Ultrapenguin 1.1.9 distribution); + - some memory resources cannot be freed on sparc, sparc64 and powerpc, + because the required support is still missing in 2.2 and 2.3 kernels. + You shouldn't try to unload the module driver on these platforms. + + +Feedback +-------- + +Feedback is welcome. Please send success stories/bug reports/ +patches/improvement/comments/flames to .