On Sun, 15 Jul 2007, Dave Jones wrote: > Hi folks, > Given the potential power savings USB_SUSPEND offers, we'd > like to turn this on in Fedora kernels, however there still > seems to be quite a few devices out there that seem to have issues. > (Notably printers it seems).
Scanners too. Plus a smorgasbord of other random devices. > For our development kernels, we're > just shipping stuff as-is, so that we can find out about these > devices, but for our release kernels (ie, updates for Fedora 6 & 7), > we came up with the idea of eanbling CONFIG_USB_SUSPEND=y, but > change it so that it defaults to disabled by means of the following > patch.. > > --- linux-2.6.22.noarch/drivers/usb/core/usb.c~ 2007-07-10 > 12:18:12.000000000 -0400 > +++ linux-2.6.22.noarch/drivers/usb/core/usb.c 2007-07-10 > 12:18:20.000000000 -0400 > @@ -52,7 +52,7 @@ static int nousb; /* Disable USB when bu > struct workqueue_struct *ksuspend_usb_wq; > > #ifdef CONFIG_USB_SUSPEND > -static int usb_autosuspend_delay = 2; /* Default delay value, > +static int usb_autosuspend_delay = 0; /* Default delay value, > * in seconds */ > module_param_named(autosuspend, usb_autosuspend_delay, int, 0644); > MODULE_PARM_DESC(autosuspend, "default autosuspend delay"); Ooh! Don't do that. Starting in 2.6.22, setting the delay to 0 means "autosuspend as soon as possible". (It was different in 2.6.21.) The variable now needs to be set to -1 to prevent autosuspending. This is explained in Documentation/ABI/testing/sysfs-bus-usb and Documentation/kernel-parameters.txt. > It seemed to have the desired effect of not enabling this feature, but > making it available for those who want to try changing it, but there > seems to be a side-effect that would also appear if someone were > to insmod usb-core with usb_autosuspend_delay=0 > > During boot I now see several of these traces.. > usb 5-1.4: new high speed USB device using ehci_hcd and address 6 > usb 5-1.4: configuration #1 chosen from 1 choice > WARNING: at drivers/usb/core/driver.c:1192 usb_autopm_do_device() (Not > tainted) > > Call Trace: > [<ffffffff811acf2c>] usb_autopm_do_device+0x6e/0xf1 > [<ffffffff811ad339>] usb_suspend_both+0x212/0x229 > [<ffffffff811acf97>] usb_autopm_do_device+0xd9/0xf1 > [<ffffffff811ac1a6>] usb_set_configuration+0x3fb/0x42e > [<ffffffff811b359b>] generic_probe+0x1a6/0x1f3 > [<ffffffff81194147>] driver_probe_device+0xff/0x17c > [<ffffffff811941c4>] __device_attach+0x0/0x5 > [<ffffffff81193386>] bus_for_each_drv+0x40/0x72 > [<ffffffff81194265>] device_attach+0x79/0x90 > [<ffffffff811932f2>] bus_attach_device+0x2a/0x7e > [<ffffffff81192019>] device_add+0x3cb/0x611 > [<ffffffff811a776e>] usb_new_device+0xab/0xf6 > [<ffffffff811a8462>] hub_thread+0x7f1/0xc0a > [<ffffffff81050169>] trace_hardirqs_on+0x12f/0x153 > [<ffffffff81257d90>] thread_return+0x88/0x117 > [<ffffffff810465da>] autoremove_wake_function+0x0/0x2e > [<ffffffff811a7c71>] hub_thread+0x0/0xc0a > [<ffffffff81046498>] kthread+0x47/0x73 > [<ffffffff8125a14b>] trace_hardirqs_on_thunk+0x35/0x37 > [<ffffffff8100aa28>] child_rip+0xa/0x12 > [<ffffffff8100a13c>] restore_args+0x0/0x30 > [<ffffffff81046321>] kthreadd+0x117/0x13c > [<ffffffff81046321>] kthreadd+0x117/0x13c > [<ffffffff81046451>] kthread+0x0/0x73 > [<ffffffff8100aa1e>] child_rip+0x0/0x12 > > which corresponds to the > > WARN_ON(udev->pm_usage_cnt < 0); > > in usb_autopm_do_device() > I'm suspecting logic is underflowing here causing this. Yes, that's what it means. I'm puzzled as to how this could occur; let me try some tests. What types of devices give rise to these warnings? > Before I dig deeper, are there other side-effects of changing > this default ? The differences between setting usb_autosuspend_delay to -1 and turning off CONFIG_USB_SUSPEND: Setting the default delay to -1 allows users to enable autosuspend on a per-device basis. For that matter, you might want to add a line to the hub driver, to enable autosuspend for hubs by default. It adds more code to the kernel (obviously). It changes the way suspend-to-RAM behaves: individual USB devices get suspended as opposed to suspending an entire bus all at once. In theory this shouldn't matter. I can't think of anything else at the moment. Alan Stern ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel