Allow for certain device APIs to be NULL
authorDavide Libenzi <dlibenzi@google.com>
Tue, 15 Dec 2015 22:42:17 +0000 (14:42 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 21 Dec 2015 17:38:54 +0000 (12:38 -0500)
Allow for certain device APIs to be NULL, to avoid simple devices to
have to declare them empty, and populate the devtab with them.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/ns/chan.c
kern/src/ns/devtab.c

index 918f289..ca2c965 100644 (file)
@@ -116,16 +116,20 @@ void chandevreset(void)
 {
        int i;
 
-       for (i = 0; &devtab[i] < __devtabend; i++)
-               devtab[i].reset();
+       for (i = 0; &devtab[i] < __devtabend; i++) {
+               if (devtab[i].reset)
+                       devtab[i].reset();
+       }
 }
 
 void chandevinit(void)
 {
        int i;
 
-       for (i = 0; &devtab[i] < __devtabend; i++)
-               devtab[i].init();
+       for (i = 0; &devtab[i] < __devtabend; i++) {
+               if (devtab[i].init)
+                       devtab[i].init();
+       }
 }
 
 void chandevshutdown(void)
@@ -134,8 +138,10 @@ void chandevshutdown(void)
 
        /* shutdown in reverse order */
        for (i = 0; &devtab[i] < __devtabend; i++) ;
-       for (i--; i >= 0; i--)
-               devtab[i].shutdown();
+       for (i--; i >= 0; i--) {
+               if (devtab[i].shutdown)
+                       devtab[i].shutdown();
+       }
 }
 
 static void chan_release(struct kref *kref)
index 40ef1e3..7f1c5ab 100644 (file)
@@ -20,8 +20,10 @@ void devtabreset()
 {
        int i;
 
-       for (i = 0; &devtab[i] < __devtabend; i++)
-               devtab[i].reset();
+       for (i = 0; &devtab[i] < __devtabend; i++) {
+               if (devtab[i].reset)
+                       devtab[i].reset();
+       }
 }
 
 void devtabinit()
@@ -32,7 +34,8 @@ void devtabinit()
                /* if we have errors, check the align of struct dev and objdump */
                printd("i %d, '%s', dev %p, init %p\n", i, devtab[i].name,
                                &devtab[i], devtab[i].init);
-               devtab[i].init();
+               if (devtab[i].init)
+                       devtab[i].init();
        }
 }
 
@@ -44,8 +47,10 @@ void devtabshutdown()
         * Shutdown in reverse order.
         */
        for (i = 0; &devtab[i] < __devtabend; i++) ;
-       for (i--; i >= 0; i--)
-               devtab[i].shutdown();
+       for (i--; i >= 0; i--) {
+               if (devtab[i].shutdown)
+                       devtab[i].shutdown();
+       }
 }
 
 struct dev *devtabget(const char *name, int user)