Tulip driver overhaul (was Re: SMP deadlock in drivers/net/tulip.c kernel ver 2.3.47 -- here's a patch.)

From: Jeff Garzik (jgarzik@mandrakesoft.com)
Date: Thu Feb 24 2000 - 01:10:02 EST


As many of the PCI net drivers in the 2.3.x kernel are unmaintained, I
started hacking on the tulip driver. The driver in the 2.3.x kernel
(and eventually the 2.4.0 stable kernel) is getting a big overhaul.

Here's what has happened so far:

1) Take tulip from 2.2.15pre9, the most stable tulip according to most
2) Re-integrate PCI DMA and PCI driver interface updates from 2.3.x
kernels
3) Move driver into drivers/net/tulip, split up into multiple files for
easier maintenance (in 2.3.48-pre1)

You need the attached patch (see below) to get 2.3.48-pre1 working.

Here are the planned changes, in no particular order:

1) Death to magic numbers. Look up every damn bitmask and make it a
series of or'd constants.
2) Integrate tulip changes on vendor websites (linksys, netgear, ...)
3) Integrate tulip changes from Becker drivers
4) Re-integrate any changes lost when 2.3.x tulip was dropped in favor
of 2.2.x stable tulip.
5) Test test test, and get ready for 2.4.0.

Patches for any of these tasks are very welcome, _especially_ any help
on task #1.

        Jeff

-- 
Jeff Garzik              |
Building 1024            | Viva la open source!
MandrakeSoft, Inc.       |

diff -urN linux-2.3.48-pre1/drivers/net/Makefile linux/drivers/net/Makefile --- linux-2.3.48-pre1/drivers/net/Makefile Thu Feb 24 00:19:18 2000 +++ linux/drivers/net/Makefile Wed Feb 23 23:54:52 2000 @@ -18,7 +18,7 @@ MOD_SUB_DIRS := MOD_IN_SUB_DIRS := ALL_SUB_DIRS := $(SUB_DIRS) fc hamradio irda pcmcia tokenring wan sk98lin \ - arcnet skfp + arcnet skfp tulip O_TARGET := net.o MOD_LIST_NAME := NET_MODULES @@ -40,6 +40,7 @@ ifeq ($(CONFIG_TULIP),y) SUB_DIRS += tulip + obj-y += tulip/tulip.o else ifeq ($(CONFIG_TULIP),m) MOD_SUB_DIRS += tulip diff -urN linux-2.3.48-pre1/drivers/net/tulip/tulip_core.c linux/drivers/net/tulip/tulip_core.c --- linux-2.3.48-pre1/drivers/net/tulip/tulip_core.c Thu Feb 24 00:19:18 2000 +++ linux/drivers/net/tulip/tulip_core.c Thu Feb 24 00:00:49 2000 @@ -18,7 +18,7 @@ */ -static const char version[] = "Linux Tulip driver version 0.9.2 (Feb 15, 2000)\n"; +static const char version[] = "Linux Tulip driver version 0.9.3 (Feb 23, 2000)\n"; #include <linux/module.h> #include "tulip.h" @@ -237,7 +237,7 @@ /* now it is safe to change csr6 */ outl (newcsr6, ioaddr + CSR6); - spin_unlock_irqrestore (&tp->lock, flags); + spin_unlock_irqrestore (&tp->tx_lock, flags); } @@ -978,22 +978,24 @@ ioaddr = pci_resource_start (pdev, 0); irq = pdev->irq; - /* Make certain the data structures are quadword aligned. */ + /* init_etherdev ensures qword aligned structures */ dev = init_etherdev (NULL, sizeof (*tp)); if (!dev) { - printk (KERN_ERR PFX "unable to allocate ether device, aborting\n"); + printk (KERN_ERR PFX "ether device alloc failed, aborting\n"); return -ENOMEM; } /* We do a request_region() only to register /proc/ioports info. */ /* Note that proper size is tulip_tbl[chip_idx].chip_name, but... */ if (!request_region (ioaddr, tulip_tbl[chip_idx].io_size, dev->name)) { - printk (KERN_ERR PFX "unable to allocate ether device, aborting\n"); + printk (KERN_ERR PFX "I/O ports (0x%x@0x%lx) unavailable, " + "aborting\n", tulip_tbl[chip_idx].io_size, ioaddr); goto err_out_free_netdev; } if (pci_enable_device(pdev)) { - printk (KERN_ERR PFX "cannot enable PCI device (id %04x:%04x, bus %d, devfn %d), aborting\n", + printk (KERN_ERR PFX "cannot enable PCI device (id %04x:%04x, " + "bus %d, devfn %d), aborting\n", pdev->vendor, pdev->device, pdev->bus->number, pdev->devfn); goto err_out_free_netdev; @@ -1001,10 +1003,17 @@ pci_set_master(pdev); + pci_read_config_byte (pdev, PCI_REVISION_ID, &chip_rev); + + /* tp/dev->priv zeroed in init_etherdev */ tp = dev->priv; - memset(tp, 0, sizeof(*tp)); - pci_read_config_byte (pdev, PCI_REVISION_ID, &chip_rev); + tp->chip_id = chip_idx; + tp->flags = tulip_tbl[chip_idx].flags; + tp->pdev = pdev; + tp->base_addr = ioaddr; + tp->revision = chip_rev; + spin_lock_init(&tp->tx_lock); printk(KERN_INFO "%s: %s rev %d at %#3lx,", dev->name, tulip_tbl[chip_idx].chip_name, chip_rev, ioaddr); @@ -1106,13 +1115,7 @@ pdev->driver_data = dev; dev->base_addr = ioaddr; dev->irq = irq; - - tp->chip_id = chip_idx; - tp->revision = chip_rev; - tp->flags = tulip_tbl[chip_idx].flags; tp->csr0 = csr0; - tp->pdev = pdev; - tp->base_addr = dev->base_addr; /* BugFixes: The 21143-TD hangs with PCI Write-and-Invalidate cycles. And the ASIX must have a burst limit or horrible things happen. */

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Feb 29 2000 - 21:00:09 EST