aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@infradead.org>2007-05-22 15:42:56 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-07-12 19:29:48 -0400
commit01cd08192040eab30f837f061ca07f43cf15f4a1 (patch)
tree599d6c0cc09ede54e149894fe01c0411309161f6 /drivers/usb
parentfc4cbd755b75c7687b923da5b75ba4a64652582e (diff)
USB: Patch to align the various USB timers to fire at the same time
This patch modifies the USB regular 250ms timer to be "perfectly aligned" to the second and quarters thereof. This change is there to make sure that if you have multiple USB ports, the timers for all these ports will fire at the same time rather than all spread out. All spread out wakes the CPU up from power saving idle a lot more than needed... Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/hcd.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 8969e42434b9..c5a2f83991dc 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -582,10 +582,12 @@ void usb_hcd_poll_rh_status(struct usb_hcd *hcd)
582 } 582 }
583 583
584 /* The USB 2.0 spec says 256 ms. This is close enough and won't 584 /* The USB 2.0 spec says 256 ms. This is close enough and won't
585 * exceed that limit if HZ is 100. */ 585 * exceed that limit if HZ is 100. The math is more clunky than
586 * maybe expected, this is to make sure that all timers for USB devices
587 * fire at the same time to give the CPU a break inbetween */
586 if (hcd->uses_new_polling ? hcd->poll_rh : 588 if (hcd->uses_new_polling ? hcd->poll_rh :
587 (length == 0 && hcd->status_urb != NULL)) 589 (length == 0 && hcd->status_urb != NULL))
588 mod_timer (&hcd->rh_timer, jiffies + msecs_to_jiffies(250)); 590 mod_timer (&hcd->rh_timer, (jiffies/(HZ/4) + 1) * (HZ/4));
589} 591}
590EXPORT_SYMBOL_GPL(usb_hcd_poll_rh_status); 592EXPORT_SYMBOL_GPL(usb_hcd_poll_rh_status);
591 593
@@ -614,8 +616,8 @@ static int rh_queue_status (struct usb_hcd *hcd, struct urb *urb)
614 urb->hcpriv = hcd; /* indicate it's queued */ 616 urb->hcpriv = hcd; /* indicate it's queued */
615 617
616 if (!hcd->uses_new_polling) 618 if (!hcd->uses_new_polling)
617 mod_timer (&hcd->rh_timer, jiffies + 619 mod_timer (&hcd->rh_timer,
618 msecs_to_jiffies(250)); 620 (jiffies/(HZ/4) + 1) * (HZ/4));
619 621
620 /* If a status change has already occurred, report it ASAP */ 622 /* If a status change has already occurred, report it ASAP */
621 else if (hcd->poll_pending) 623 else if (hcd->poll_pending)