While discussing recent config_detach(9) vs close(2) race I figured
out that the 'indirect' flag (`cd_indirect') is never set.

Time to kill this feature?

This survived build on x86, armv7, sgi, hppa, luna88k, alpha, landisk,
sparc64.

Ok?

Index: sys/sys/device.h
===================================================================
RCS file: /cvs/src/sys/sys/device.h,v
retrieving revision 1.55
diff -u -p -r1.55 device.h
--- sys/sys/device.h    10 Sep 2018 16:18:34 -0000      1.55
+++ sys/sys/device.h    16 Jan 2020 08:07:23 -0000
@@ -140,7 +140,6 @@ struct cfdriver {
        void    **cd_devs;              /* devices found */
        char    *cd_name;               /* device name */
        enum    devclass cd_class;      /* device classification */
-       int     cd_indirect;            /* indirectly configure subdevices */
        int     cd_ndevs;               /* size of cd_devs array */
 };
 
Index: sys/kern/subr_autoconf.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_autoconf.c,v
retrieving revision 1.94
diff -u -p -r1.94 subr_autoconf.c
--- sys/kern/subr_autoconf.c    30 Dec 2019 23:56:26 -0000      1.94
+++ sys/kern/subr_autoconf.c    16 Jan 2020 09:43:17 -0000
@@ -71,7 +71,7 @@ struct matchinfo {
        cfmatch_t fn;
        struct  device *parent;
        void    *match, *aux;
-       int     indirect, pri;
+       int     pri;
 };
 
 #ifndef AUTOCONF_VERBOSE
@@ -128,10 +128,7 @@ mapply(struct matchinfo *m, struct cfdat
        int pri;
        void *match;
 
-       if (m->indirect)
-               match = config_make_softc(m->parent, cf);
-       else
-               match = cf;
+       match = cf;
 
        if (autoconf_verbose) {
                printf(">>> probing for %s", cf->cf_driver->cd_name);
@@ -154,15 +151,8 @@ mapply(struct matchinfo *m, struct cfdat
                    pri);
 
        if (pri > m->pri) {
-               if (m->indirect && m->match) {
-                       cf = ((struct device *)m->match)->dv_cfdata;
-                       free(m->match, M_DEVBUF, cf->cf_attach->ca_devsize);
-               }
                m->match = match;
                m->pri = pri;
-       } else {
-               if (m->indirect)
-                       free(match, M_DEVBUF, cf->cf_attach->ca_devsize);
        }
 }
 
@@ -188,7 +178,6 @@ config_search(cfmatch_t fn, struct devic
        m.parent = parent;
        m.match = NULL;
        m.aux = aux;
-       m.indirect = parent && parent->dv_cfdata->cf_driver->cd_indirect;
        m.pri = 0;
 
        for (cf = cfdata; cf->cf_driver; cf++) {
@@ -209,10 +198,7 @@ config_search(cfmatch_t fn, struct devic
 
        if (autoconf_verbose) {
                if (m.match) {
-                       if (m.indirect)
-                               cf = ((struct device *)m.match)->dv_cfdata;
-                       else
-                               cf = (struct cfdata *)m.match;
+                       cf = (struct cfdata *)m.match;
                        printf(">>> %s probe won\n",
                            cf->cf_driver->cd_name);
                } else
@@ -235,9 +221,6 @@ config_scan(cfscan_t fn, struct device *
        struct cfdata *cf;
        short *p;
        void *match;
-       int indirect;
-
-       indirect = parent && parent->dv_cfdata->cf_driver->cd_indirect;
 
        for (cf = cfdata; cf->cf_driver; cf++) {
                /*
@@ -252,9 +235,7 @@ config_scan(cfscan_t fn, struct device *
                        continue;
                for (p = cf->cf_parents; *p >= 0; p++)
                        if (parent->dv_cfdata == &cfdata[*p]) {
-                               match = indirect?
-                                   config_make_softc(parent, cf) :
-                                   (void *)cf;
+                               match = cf;
                                (*fn)(parent, match);
                        }
        }
@@ -275,7 +256,6 @@ config_rootsearch(cfmatch_t fn, char *ro
        m.parent = ROOT;
        m.match = NULL;
        m.aux = aux;
-       m.indirect = 0;
        m.pri = 0;
        /*
         * Look at root entries for matching name.  We do not bother
@@ -348,13 +328,8 @@ config_attach(struct device *parent, voi
        autoconf_attdet++;
        mtx_leave(&autoconf_attdet_mtx);
 
-       if (parent && parent->dv_cfdata->cf_driver->cd_indirect) {
-               dev = match;
-               cf = dev->dv_cfdata;
-       } else {
-               cf = match;
-               dev = config_make_softc(parent, cf);
-       }
+       cf = match;
+       dev = config_make_softc(parent, cf);
 
        cd = cf->cf_driver;
        ca = cf->cf_attach;
Index: share/man/man9/autoconf.9
===================================================================
RCS file: /cvs/src/share/man/man9/autoconf.9,v
retrieving revision 1.17
diff -u -p -r1.17 autoconf.9
--- share/man/man9/autoconf.9   18 Apr 2018 22:33:18 -0000      1.17
+++ share/man/man9/autoconf.9   16 Jan 2020 09:46:06 -0000
@@ -66,12 +66,6 @@ The autoconfiguration framework supports
 .Em direct configuration
 where the bus driver can determine the devices present.
 .Pp
-The autoconfiguration framework also supports
-.Em indirect configuration
-where the drivers must probe the bus looking for the presence of a device.
-Direct configuration is preferred since it can find hardware regardless of
-the presence of proper drivers.
-.Pp
 The autoconfiguration process occurs at system bootstrap and is driven by a
 table generated from a
 .Do
@@ -92,64 +86,6 @@ ends with a unit number.
 The unit number identifies an instance of the driver.
 Device data structures are allocated dynamically during autoconfiguration,
 giving a unique address for each instance.
-.Ss Indirect Configuration
-The
-.Fn config_search
-function performs indirect configuration of physical devices by iterating
-over all potential children, calling the given function
-.Fa func
-for each one.
-.Pp
-The
-.Fn config_rootsearch
-function finds the root device identified by the string
-.Fa rootname ,
-in a manner similar to
-.Fn config_search ,
-except that there is no parent device.
-If
-.Fa func
-is
-.Dv NULL ,
-.Fn config_search
-applies each child's match function instead.
-The argument
-.Fa parent
-is the pointer to the parent's device structure.
-The given
-.Fa aux
-argument describes the device that has been found and is simply passed
-on through
-.Fa func
-to the child.
-.Fn config_search
-returns a pointer to the best-matched child or
-.Dv NULL
-otherwise.
-.Pp
-The role of
-.Fa func
-is to call
-the match function for each device and call
-.Fn config_attach
-for any positive matches.
-.Bd -literal
-typedef int (*cfmatch_t)(struct device *parent, void *child, void *aux);
-.Ed
-.Pp
-If
-.Fa func
-is
-.Dv NULL ,
-then the parent should record the return value from
-.Fn config_search
-and call
-.Fn config_attach
-itself.
-.Pp
-Note that this function is designed so that it can be used to apply an
-arbitrary function to all potential children.
-In this case callers may choose to ignore the return value.
 .Ss Direct Configuration
 The
 .Fn config_found_sm

Reply via email to