return 0;
 }
 
-static int
-css_probe (struct device *dev)
+static int css_probe(struct device *dev)
 {
        struct subchannel *sch;
+       int ret;
 
        sch = to_subchannel(dev);
        sch->driver = to_cssdriver(dev->driver);
-       return (sch->driver->probe ? sch->driver->probe(sch) : 0);
+       ret = sch->driver->probe ? sch->driver->probe(sch) : 0;
+       if (ret)
+               sch->driver = NULL;
+       return ret;
 }
 
-static int
-css_remove (struct device *dev)
+static int css_remove(struct device *dev)
 {
        struct subchannel *sch;
+       int ret;
 
        sch = to_subchannel(dev);
-       return (sch->driver->remove ? sch->driver->remove(sch) : 0);
+       ret = sch->driver->remove ? sch->driver->remove(sch) : 0;
+       sch->driver = NULL;
+       return ret;
 }
 
-static void
-css_shutdown (struct device *dev)
+static void css_shutdown(struct device *dev)
 {
        struct subchannel *sch;
 
        sch = to_subchannel(dev);
-       if (sch->driver->shutdown)
+       if (sch->driver && sch->driver->shutdown)
                sch->driver->shutdown(sch);
 }