I am nfs booting my edgerouter lite and didn't like to have to manually
enter 'cnmac0'
as my root device every boot.

This is what I came up with. I stole the idea from macppc and modified
it a little.

Am I way off here?

Index: sys/arch/octeon/octeon/autoconf.c
===================================================================
RCS file: /cvs/src/sys/arch/octeon/octeon/autoconf.c,v
retrieving revision 1.7
diff -u -p -r1.7 autoconf.c
--- sys/arch/octeon/octeon/autoconf.c   20 Jul 2015 19:44:32 -0000     
1.7
+++ sys/arch/octeon/octeon/autoconf.c   15 May 2016 23:28:33 -0000
@@ -44,11 +44,45 @@ cpu_configure(void)
        cold = 0;
 }

+struct devmap {
+       char *dev;
+       enum devclass class;
+};
+
+struct devmap *
+findtype(void)
+{
+       static struct devmap devmap[] = {
+               { "wd", DV_DISK },
+               { "sd", DV_DISK },
+               { "octcf", DV_DISK },
+               { "amdcf", DV_DISK },
+               { "cnmac", DV_IFNET },
+               { NULL, DV_DULL }
+       };
+       struct devmap *dp = &devmap[0];
+
+       if (strlen(bootdev) < 2)
+               return(dp);
+
+       while (dp->dev) {
+               if (strncmp(bootdev, dp->dev, strlen(dp->dev)) == 0)
+                       break;
+               dp++;
+       }
+
+       if (dp->dev == NULL)
+               printf("string [%s] not found\n", bootdev);
+
+       return(dp);
+}
+
 void
 parse_uboot_root(void)
 {
        char *p;
        size_t len;
+       struct devmap *dp;

         /*
          * Turn the U-Boot root device (rootdev=/dev/octcf0) into a
          boot device.
@@ -64,7 +98,9 @@ parse_uboot_root(void)

        memcpy(bootdev, p, len);
        bootdev[len] = '\0';
-       bootdev_class = DV_DISK;
+
+       dp = findtype();
+       bootdev_class = dp->class;
 }

 void
@@ -82,26 +118,16 @@ device_register(struct device *dev, void
 {
        if (bootdv != NULL)
                return;
-
-       const char *drvrname = dev->dv_cfdata->cf_driver->cd_name;
-       const char *name = dev->dv_xname;
-
+
        if (dev->dv_class != bootdev_class)
                return;
-
+
        switch (bootdev_class) {
        case DV_DISK:
-               if ((strcmp(drvrname, "wd") == 0 ||
-                   strcmp(drvrname, "sd") == 0 ||
-                   strcmp(drvrname, "octcf") == 0 ||
-                   strcmp(drvrname, "amdcf") == 0) &&
-                   strcmp(name, bootdev) == 0)
-                       bootdv = dev;
-               break;
        case DV_IFNET:
                /*
-                * This relies on the onboard Ethernet interface being
-                * attached before any other (usb) interface.
+                * DV_IFNET relies on the onboard Ethernet interface
+                * being attached before any other (usb) interface.
                 */
                bootdv = dev;
                break;
@@ -120,3 +146,4 @@ struct nam2blk nam2blk[] = {
        { "amdcf",      19 },
        { NULL,         -1 }
 };
+

Reply via email to