as of now, we are not checking if attach or parport_register_driver
has succeeded or failed. But attach can fail in the places where they
have been used. Lets check the return of attach, and if attach fails
then parport_register_driver should also fail. We can have multiple
parallel port so we only mark attach as failed only if it has never
returned a 0.

Signed-off-by: Sudip Mukherjee <su...@vectorindia.org>
---
 drivers/parport/share.c | 20 +++++++++++++++-----
 include/linux/parport.h |  2 +-
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/parport/share.c b/drivers/parport/share.c
index 3fa6624..640ce41 100644
--- a/drivers/parport/share.c
+++ b/drivers/parport/share.c
@@ -148,23 +148,33 @@ static void get_lowlevel_driver (void)
  *     callback, but if the driver wants to take a copy of the
  *     pointer it must call parport_get_port() to do so.
  *
- *     Returns 0 on success.  Currently it always succeeds.
+ *     Returns 0 on success.
  **/
 
 int parport_register_driver (struct parport_driver *drv)
 {
        struct parport *port;
+       int ret, err;
+       bool attached = false;
 
        if (list_empty(&portlist))
                get_lowlevel_driver ();
 
        mutex_lock(&registration_lock);
-       list_for_each_entry(port, &portlist, list)
-               drv->attach(port);
-       list_add(&drv->list, &drivers);
+       list_for_each_entry(port, &portlist, list) {
+               err = drv->attach(port);
+               if (err == 0)
+                       attached = true;
+               else
+                       ret = err;
+       }
+       if (attached) {
+               list_add(&drv->list, &drivers);
+               ret = 0;
+       }
        mutex_unlock(&registration_lock);
 
-       return 0;
+       return ret;
 }
 
 /**
diff --git a/include/linux/parport.h b/include/linux/parport.h
index c22f125..9411065 100644
--- a/include/linux/parport.h
+++ b/include/linux/parport.h
@@ -249,7 +249,7 @@ struct parport {
 
 struct parport_driver {
        const char *name;
-       void (*attach) (struct parport *);
+       int (*attach)(struct parport *);
        void (*detach) (struct parport *);
        struct list_head list;
 };
-- 
1.8.1.2

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to