]> git.karo-electronics.de Git - linux-beck.git/commitdiff
V4L/DVB (13224): pvrusb2: Improve diagnostic info on driver initialization failure
authorMike Isely <isely@pobox.com>
Mon, 12 Oct 2009 03:21:20 +0000 (00:21 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 5 Dec 2009 20:40:59 +0000 (18:40 -0200)
It used to be that the only real detectable reason for the driver to
fail during initialization would be that if the hardware is simply
jammed.  However with the advent of the sub-device mechanism in V4L it
is possible now to detect if a sub-device module fails to load
successfully.  The pvrusb2 driver does in fact react to this by also
(correctly) failing, however the original diagnostic message "hardware
is jammed" was still being reported.  This misleads the user because
in fact it might not actually be a hardware failure.  This change adds
logic to tell the difference and then report a more appropriate
message to the kernel log.

Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
drivers/media/video/pvrusb2/pvrusb2-hdw.c

index 5b152ff20bd0a3d94ad3dc9045538a2187db3422..9098494ae59cc7907c4f1f0c8fe2e869fb6e7b5d 100644 (file)
@@ -270,6 +270,7 @@ struct pvr2_hdw {
 
        int force_dirty;        /* consider all controls dirty if true */
        int flag_ok;            /* device in known good state */
+       int flag_modulefail;    /* true if at least one module failed to load */
        int flag_disconnected;  /* flag_ok == 0 due to disconnect */
        int flag_init_ok;       /* true if structure is fully initialized */
        int fw1_state;          /* current situation with fw1 */
index 13639b302700fcd4c2ac45fe5cae98913d42653c..33ea950abb4f0ed00ceb628000e1d6226b4eda9e 100644 (file)
@@ -2030,7 +2030,8 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
        fname = (mid < ARRAY_SIZE(module_names)) ? module_names[mid] : NULL;
        if (!fname) {
                pvr2_trace(PVR2_TRACE_ERROR_LEGS,
-                          "Module ID %u for device %s has no name",
+                          "Module ID %u for device %s has no name?"
+                          "  The driver might have a configuration problem.",
                           mid,
                           hdw->hdw_desc->description);
                return -EINVAL;
@@ -2058,7 +2059,8 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
        if (!i2ccnt) {
                pvr2_trace(PVR2_TRACE_ERROR_LEGS,
                           "Module ID %u (%s) for device %s:"
-                          " No i2c addresses",
+                          " No i2c addresses."
+                          "  The driver might have a configuration problem.",
                           mid, fname, hdw->hdw_desc->description);
                return -EINVAL;
        }
@@ -2090,7 +2092,9 @@ static int pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
 
        if (!sd) {
                pvr2_trace(PVR2_TRACE_ERROR_LEGS,
-                          "Module ID %u (%s) for device %s failed to load",
+                          "Module ID %u (%s) for device %s failed to load."
+                          "  Possible missing sub-device kernel module or"
+                          " initialization failure within module.",
                           mid, fname, hdw->hdw_desc->description);
                return -EIO;
        }
@@ -2132,7 +2136,10 @@ static void pvr2_hdw_load_modules(struct pvr2_hdw *hdw)
        for (idx = 0; idx < ct->cnt; idx++) {
                if (pvr2_hdw_load_subdev(hdw, &ct->lst[idx]) < 0) okFl = 0;
        }
-       if (!okFl) pvr2_hdw_render_useless(hdw);
+       if (!okFl) {
+               hdw->flag_modulefail = !0;
+               pvr2_hdw_render_useless(hdw);
+       }
 }
 
 
@@ -2334,6 +2341,19 @@ static void pvr2_hdw_setup(struct pvr2_hdw *hdw)
                                break;
                        }
                }
+               if (hdw->flag_modulefail) {
+                       pvr2_trace(
+                               PVR2_TRACE_ERROR_LEGS,
+                               "***WARNING*** pvrusb2 driver initialization"
+                               " failed due to the failure of one or more"
+                               " sub-device kernel modules.");
+                       pvr2_trace(
+                               PVR2_TRACE_ERROR_LEGS,
+                               "You need to resolve the failing condition"
+                               " before this driver can function.  There"
+                               " should be some earlier messages giving more"
+                               " information about the problem.");
+               }
                if (procreload) {
                        pvr2_trace(
                                PVR2_TRACE_ERROR_LEGS,