diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2006-12-05 16:29:55 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-12-20 13:14:26 -0500 |
commit | 5f8364b7d63acdc2216ca0f7d0a8557c318479ea (patch) | |
tree | 01f4c0bf84d46659772a623dd591bba7e1f2b635 /drivers/usb/host/uhci-hcd.c | |
parent | fe1ec341df1b510e5e614ccdad4a89273d6f6fe8 (diff) |
UHCI: module parameter to ignore overcurrent changes
Certain boards seem to like to issue false overcurrent notifications,
for example on ports that don't have anything connected to them. This
looks like a hardware error, at the level of noise to those ports'
overcurrent input signals (or non-debounced VBUS comparators). This
surfaces to users as truly massive amounts of syslog spam from khubd
(which is appropriate for real hardware problems, except for the
volume from multiple ports).
Using this new "ignore_oc" flag helps such systems work more sanely,
by preventing such indications from getting to khubd (and spamming
syslog). The downside is of course that true overcurrent errors will
be masked; they'll appear as spontaneous disconnects, without the
diagnostics that will let users troubleshoot issues like
short-circuited cables. In addition, controllers with no devices
attached will be forced to poll for new devices rather than relying on
interrupts, since each overcurrent event would generate a new
interrupt.
This patch (as826) is essentially a copy of David Brownell's ignore_oc
patch for ehci-hcd, ported to uhci-hcd.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/uhci-hcd.c')
-rw-r--r-- | drivers/usb/host/uhci-hcd.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index e87692c31be4..acd101caeeeb 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c | |||
@@ -60,6 +60,11 @@ Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber, \ | |||
60 | Alan Stern" | 60 | Alan Stern" |
61 | #define DRIVER_DESC "USB Universal Host Controller Interface driver" | 61 | #define DRIVER_DESC "USB Universal Host Controller Interface driver" |
62 | 62 | ||
63 | /* for flakey hardware, ignore overcurrent indicators */ | ||
64 | static int ignore_oc; | ||
65 | module_param(ignore_oc, bool, S_IRUGO); | ||
66 | MODULE_PARM_DESC(ignore_oc, "ignore hardware overcurrent indications"); | ||
67 | |||
63 | /* | 68 | /* |
64 | * debug = 0, no debugging messages | 69 | * debug = 0, no debugging messages |
65 | * debug = 1, dump failed URBs except for stalls | 70 | * debug = 1, dump failed URBs except for stalls |
@@ -169,6 +174,11 @@ static int resume_detect_interrupts_are_broken(struct uhci_hcd *uhci) | |||
169 | { | 174 | { |
170 | int port; | 175 | int port; |
171 | 176 | ||
177 | /* If we have to ignore overcurrent events then almost by definition | ||
178 | * we can't depend on resume-detect interrupts. */ | ||
179 | if (ignore_oc) | ||
180 | return 1; | ||
181 | |||
172 | switch (to_pci_dev(uhci_dev(uhci))->vendor) { | 182 | switch (to_pci_dev(uhci_dev(uhci))->vendor) { |
173 | default: | 183 | default: |
174 | break; | 184 | break; |
@@ -921,7 +931,8 @@ static int __init uhci_hcd_init(void) | |||
921 | { | 931 | { |
922 | int retval = -ENOMEM; | 932 | int retval = -ENOMEM; |
923 | 933 | ||
924 | printk(KERN_INFO DRIVER_DESC " " DRIVER_VERSION "\n"); | 934 | printk(KERN_INFO DRIVER_DESC " " DRIVER_VERSION "%s\n", |
935 | ignore_oc ? ", overcurrent ignored" : ""); | ||
925 | 936 | ||
926 | if (usb_disabled()) | 937 | if (usb_disabled()) |
927 | return -ENODEV; | 938 | return -ENODEV; |