[PATCH] fix ifconfig oops for ibm ocp enet

John Tyner jtyner at cs.ucr.edu
Wed May 15 06:56:58 EST 2002


The priv structure is not initialized until the open for the ibm
ocp ethernet adapter. This causes ifconfig to cause a kernel oops if run
before the device is brought "up".

Please correct if necessary, but it is working for me. Patch was made from
a pull about 20 minutes ago.

--- drivers/net/ibm_ocp/ibm_ocp_enet.c.orig	Tue May 14 13:40:17 2002
+++ drivers/net/ibm_ocp/ibm_ocp_enet.c	Tue May 14 13:48:17 2002
@@ -226,12 +226,11 @@
 static int
 ppc405_enet_open(struct net_device *dev)
 {
-	int loop, i, emac_num;
+	int loop, i;
 	unsigned long mode_reg;
 	struct fec_enet_private *fep;
 	volatile emac_t *emacp;
 	unsigned long emac_ier;
-	struct ocp_driver *emac_driver;
 	int already_opened;

 	for (i = 0; i < ocp_dev_count(EMAC); i++)
@@ -240,35 +239,9 @@

 	already_opened = ((i < ocp_dev_count(EMAC))
 			  && (get_ocp_dev(EMAC, i) != NULL));
-	if (already_opened) {
-		fep = (struct fec_enet_private *) EMAC_DEV(ocpdev);
-		emacp = (emac_t *) EMAC_DEV(paddr);
-	} else {
-		if ((emac_driver =
-		     ocp_alloc_dev(sizeof (struct fec_enet_private))) == NULL)
-			return -ENOMEM;
-		strcpy(emac_driver->name, "emac");
-		emac_driver->type = EMAC;
-		/* this returns the next emac number */
-		if ((emac_num = ocp_register(emac_driver)) >= 0) {
-			dev->priv = (void *) emac_driver;
-			emac_driver->priv_index = dev->ifindex;
-			emacp =
-			    (emac_t *) ((struct ocp_driver *) dev->priv)->paddr;
-			fep = (struct fec_enet_private *) ((struct ocp_driver *)
-							   dev->priv)->ocpdev;
-			fep->emac_num = emac_num;
-			fep->mal = MBASE[0];
-			fep->irq_resource = irq_resource[emac_num];
-			fep->sequence_done = 0;
-			init_zmii(ZMII_AUTO, dev);
-			find_phy(dev);
-			fep->link = 1;
-		} else {
-			ocp_free_dev(emac_driver);
-			return -ENODEV;
-		}
-	}
+
+	fep = (struct fec_enet_private *) EMAC_DEV(ocpdev);
+	emacp = (emac_t *) EMAC_DEV(paddr);

 	if (!fep->phy) {
 		printk(KERN_NOTICE "%s: Cannot open interface without phy\n",
@@ -658,6 +631,11 @@
 	emac_max = ocp_get_max(EMAC);
 	printk("emac max %d\n", emac_max);
 	for (curr_emac = 0; curr_emac < emac_max; curr_emac++) {
+		int emac_num;
+		struct ocp_driver *emac_driver;
+		struct fec_enet_private *fep;
+		volatile emac_t *emacp;
+
 		dev = init_etherdev(NULL, sizeof (struct ocp_driver));
 		dev->irq = irq_resource[curr_emac][BL_MAC_WOL].irq;
 		/* read the MAC Address */
@@ -676,6 +654,31 @@
 		dev->set_multicast_list = &ppc405_enet_set_multicast_list;
 		dev->do_ioctl = &fec_enet_ioctl;
 		emac_dev[curr_emac] = dev;
+
+		if ((emac_driver =
+		     ocp_alloc_dev(sizeof (struct fec_enet_private))) == NULL)
+			return -ENOMEM;
+		strcpy(emac_driver->name, "emac");
+		emac_driver->type = EMAC;
+		/* this returns the next emac number */
+		if ((emac_num = ocp_register(emac_driver)) >= 0) {
+			dev->priv = (void *) emac_driver;
+			emac_driver->priv_index = dev->ifindex;
+			emacp =
+				(emac_t *) ((struct ocp_driver *) dev->priv)->paddr;
+			fep = (struct fec_enet_private *) ((struct ocp_driver *)
+							   dev->priv)->ocpdev;
+			fep->emac_num = emac_num;
+			fep->mal = MBASE[0];
+			fep->irq_resource = irq_resource[emac_num];
+			fep->sequence_done = 0;
+			init_zmii(ZMII_AUTO, dev);
+			find_phy(dev);
+			fep->link = 1;
+		} else {
+			ocp_free_dev(emac_driver);
+			break;
+		}
 	}

 	for (i = 0; i < NMII - 1; i++)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ibm_ocp_enet.c.patch.gz
Type: application/octet-stream
Size: 1094 bytes
Desc: 
Url : http://ozlabs.org/pipermail/linuxppc-embedded/attachments/20020514/c2d8e5e5/attachment.obj 


More information about the Linuxppc-embedded mailing list