PATCH: ncr885e PPC patch look ok to you?

Jeff Garzik jgarzik at mandrakesoft.com
Sun Jun 11 13:25:23 EST 2000


Does this patch, against 2.4.0-test1-ac13, look ok to you guys?

It includes the following changes for 2.3/2.4:

* Use init_etherdev's second argument to allocate automatically a
private structure for each board instance.  This eliminates some code
during board init

* do not loop on pci_find_device and then break out of the loop, because
we only support finding and initializing a single board

* use pci_enable_device to wake up device, and turn on PIO and MMIO
areas as necessary

* do not read base address registers and IRQ line directly from
hardware.  Read from struct pci_dev instead.  Use pci_resource_xxx where
appropriate to wrap direct pci-dev struct access.

* use pci_set_master to set busmastering and raise min latency, removing
code which did it "the manual way"

NOTE:  Maybe a PPC kernel expert can tell me whether pci_enable_device
on PPC actually enabled PIO/MMIO regions correctly?  If so, this patch
can, in addition to the change above, also remove the "manual" setting
of the PIO bit in PCI_COMMAND.

Regards,

	Jeff






--
Jeff Garzik              | Liberty is always dangerous, but
Building 1024            | it is the safest thing we have.
MandrakeSoft, Inc.       |      -- Harry Emerson Fosdick
-------------- next part --------------
Index: drivers/net/ncr885e.c
===================================================================
RCS file: /g/cvslan/linux_2_3/drivers/net/ncr885e.c,v
retrieving revision 1.1.1.9
diff -u -r1.1.1.9 ncr885e.c
--- drivers/net/ncr885e.c	2000/05/21 10:52:34	1.1.1.9
+++ drivers/net/ncr885e.c	2000/06/11 03:19:15
@@ -1144,18 +1144,11 @@
 	unsigned char *p;
 	int  i;

-	dev = init_etherdev(NULL, 0 );
-
-	/* construct private data for the 885 ethernet */
-	dev->priv = kmalloc( sizeof( struct ncr885e_private ), GFP_KERNEL );
-
-	if ( dev->priv == NULL ) {
-		release_region( ioaddr, NCR885E_TOTAL_SIZE );
+	dev = init_etherdev( NULL, sizeof( struct ncr885e_private ) );
+	if (!dev)
 		return -ENOMEM;
-	}

-	sp = (struct ncr885e_private *) dev->priv;
-	memset( sp, 0, sizeof( struct ncr885e_private ));
+	sp = dev->priv;

 	/* snag the station address and display it */
 	for( i = 0; i < 3; i++ ) {
@@ -1210,7 +1203,8 @@
 	unsigned short cmd;
 	unsigned char irq, latency;

-	while(( pdev = pci_find_device( PCI_VENDOR_ID_NCR,
+	/* use 'if' not 'while' where because driver only supports one device */
+	if (( pdev = pci_find_device( PCI_VENDOR_ID_NCR,
 					PCI_DEVICE_ID_NCR_53C885_ETHERNET,
 					pdev )) != NULL ) {

@@ -1219,11 +1213,13 @@
 			printk( KERN_INFO "%s", version );
 		}

+		if (pci_enable_device(pdev))
+			continue;
+
 		/* Use I/O space */
-		pci_read_config_dword( pdev, PCI_BASE_ADDRESS_0, &ioaddr );
-		pci_read_config_byte( pdev, PCI_INTERRUPT_LINE, &irq );
+		ioaddr = pci_resource_start (pdev, 0);
+		irq = pdev->irq;

-		ioaddr &= ~3;
 		/* Adjust around the Grackle... */
 #ifdef CONFIG_GEMINI
 		ioaddr |= 0xfe000000;
@@ -1237,28 +1233,16 @@

 			chips++;

+			pci_set_master (pdev);
+
 			/* Access is via I/O space, bus master enabled... */
 			pci_read_config_word( pdev, PCI_COMMAND, &cmd );

-			if ( !(cmd & PCI_COMMAND_MASTER) ) {
-				printk( KERN_INFO "  PCI master bit not set! Now setting.\n");
-				cmd |= PCI_COMMAND_MASTER;
-				pci_write_config_word( pdev, PCI_COMMAND, cmd );
-			}
-
 			if ( !(cmd & PCI_COMMAND_IO) ) {
 				printk( KERN_INFO "  Enabling I/O space.\n" );
 				cmd |= PCI_COMMAND_IO;
 				pci_write_config_word( pdev, PCI_COMMAND, cmd );
 			}
-
-			pci_read_config_byte( pdev, PCI_LATENCY_TIMER, &latency );
-
-			if ( latency < 10 ) {
-				printk( KERN_INFO "  PCI latency timer (CFLT) is unreasonably"
-					" low at %d.  Setting to 255.\n", latency );
-				pci_write_config_byte( pdev, PCI_LATENCY_TIMER, 255 );
-			}
 		}
 	}

@@ -1401,14 +1385,10 @@

 static void __exit cleanup_module(void)
 {
-	struct ncr885e_private *np;
-
 	if ( root_dev ) {
-
 		unregister_netdev( root_dev );
-		np = (struct ncr885e_private *) root_dev->priv;
 		release_region( root_dev->base_addr, NCR885E_TOTAL_SIZE );
-		kfree( root_dev->priv );
+		kfree( root_dev );
 		root_dev = NULL;
 	}
 }


More information about the Linuxppc-dev mailing list