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
 

Reply via email to