return 0;
 }
 
+/* interrupt moderation interval imod_interval in nanoseconds */
+static int xhci_set_interrupter_moderation(struct xhci_interrupter *ir,
+                                          u32 imod_interval)
+{
+       u32 imod;
+
+       if (!ir || !ir->ir_set || imod_interval > U16_MAX * 250)
+               return -EINVAL;
+
+       imod = readl(&ir->ir_set->irq_control);
+       imod &= ~ER_IRQ_INTERVAL_MASK;
+       imod |= (imod_interval / 250) & ER_IRQ_INTERVAL_MASK;
+       writel(imod, &ir->ir_set->irq_control);
+
+       return 0;
+}
+
 static void compliance_mode_recovery(struct timer_list *t)
 {
        struct xhci_hcd *xhci;
  */
 int xhci_run(struct usb_hcd *hcd)
 {
-       u32 temp;
        u64 temp_64;
        int ret;
        struct xhci_hcd *xhci = hcd_to_xhci(hcd);
        xhci_dbg_trace(xhci, trace_xhci_dbg_init,
                        "ERST deq = 64'h%0lx", (long unsigned int) temp_64);
 
-       xhci_dbg_trace(xhci, trace_xhci_dbg_init,
-                       "// Set the interrupt modulation register");
-       temp = readl(&ir->ir_set->irq_control);
-       temp &= ~ER_IRQ_INTERVAL_MASK;
-       temp |= (xhci->imod_interval / 250) & ER_IRQ_INTERVAL_MASK;
-       writel(temp, &ir->ir_set->irq_control);
+       xhci_set_interrupter_moderation(ir, xhci->imod_interval);
 
        if (xhci->quirks & XHCI_NEC_HOST) {
                struct xhci_command *command;