usb: ehci: Make periodic_schedules a per controller variable
authorHans de Goede <hdegoede@redhat.com>
Sat, 20 Sep 2014 14:51:25 +0000 (16:51 +0200)
committerMarek Vasut <marex@denx.de>
Mon, 6 Oct 2014 12:50:42 +0000 (14:50 +0200)
Periodic schedules tracks how many int_queue-s are active, and decides whether
or not to en/disable the periodic schedule based on this. This is clearly
a per controller thing.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci.h

index 635a3b45110ceb604659045f1b5fdc307c4b7db5..6323c508375af8ce3b98009a85bfbc2f5e8a5564 100644 (file)
@@ -996,6 +996,7 @@ int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
         * Set up periodic list
         * Step 1: Parent QH for all periodic transfers.
         */
+       ehcic[index].periodic_schedules = 0;
        periodic = &ehcic[index].periodic_queue;
        memset(periodic, 0, sizeof(*periodic));
        periodic->qh_link = cpu_to_hc32(QH_LINK_TERMINATE);
@@ -1154,8 +1155,6 @@ disable_periodic(struct ehci_ctrl *ctrl)
        return 0;
 }
 
-static int periodic_schedules;
-
 struct int_queue *
 create_int_queue(struct usb_device *dev, unsigned long pipe, int queuesize,
                 int elementsize, void *buffer)
@@ -1278,7 +1277,7 @@ create_int_queue(struct usb_device *dev, unsigned long pipe, int queuesize,
                debug("FATAL: periodic should never fail, but did");
                goto fail3;
        }
-       periodic_schedules++;
+       ctrl->periodic_schedules++;
 
        debug("Exit create_int_queue\n");
        return result;
@@ -1335,7 +1334,7 @@ destroy_int_queue(struct usb_device *dev, struct int_queue *queue)
                debug("FATAL: periodic should never fail, but did");
                goto out;
        }
-       periodic_schedules--;
+       ctrl->periodic_schedules--;
 
        struct QH *cur = &ctrl->periodic_queue;
        timeout = get_timer(0) + 500; /* abort after 500ms */
@@ -1357,7 +1356,7 @@ destroy_int_queue(struct usb_device *dev, struct int_queue *queue)
                }
        }
 
-       if (periodic_schedules > 0) {
+       if (ctrl->periodic_schedules > 0) {
                result = enable_periodic(ctrl);
                if (result < 0)
                        debug("FATAL: periodic should never fail, but did");
index 093eb4b83235629d27191ef982e7509c1a7496e2..433e703da82b16bdb3d9334e0286ffc4e5275654 100644 (file)
@@ -246,6 +246,7 @@ struct ehci_ctrl {
        struct QH qh_list __aligned(USB_DMA_MINALIGN);
        struct QH periodic_queue __aligned(USB_DMA_MINALIGN);
        uint32_t *periodic_list;
+       int periodic_schedules;
        int ntds;
 };