xHCI: set USB2 hardware LPM
[deliverable/linux.git] / include / linux / usb / hcd.h
index a854fe89484e4404ed14086fc441498fdfe85e7d..a4cd6c58870ae75e62d91daf9bad91da2df7ce83 100644 (file)
@@ -76,6 +76,10 @@ struct usb_hcd {
        struct kref             kref;           /* reference counter */
 
        const char              *product_desc;  /* product/vendor string */
+       int                     speed;          /* Speed for this roothub.
+                                                * May be different from
+                                                * hcd->driver->flags & HCD_MASK
+                                                */
        char                    irq_descr[24];  /* driver + bus # */
 
        struct timer_list       rh_timer;       /* drives root-hub polling */
@@ -99,6 +103,8 @@ struct usb_hcd {
 #define HCD_FLAG_POLL_RH               2       /* poll for rh status? */
 #define HCD_FLAG_POLL_PENDING          3       /* status has changed? */
 #define HCD_FLAG_WAKEUP_PENDING                4       /* root hub is resuming? */
+#define HCD_FLAG_RH_RUNNING            5       /* root hub is running? */
+#define HCD_FLAG_DEAD                  6       /* controller has died? */
 
        /* The flags can be tested using these macros; they are likely to
         * be slightly faster than test_bit().
@@ -108,6 +114,8 @@ struct usb_hcd {
 #define HCD_POLL_RH(hcd)       ((hcd)->flags & (1U << HCD_FLAG_POLL_RH))
 #define HCD_POLL_PENDING(hcd)  ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING))
 #define HCD_WAKEUP_PENDING(hcd)        ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING))
+#define HCD_RH_RUNNING(hcd)    ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING))
+#define HCD_DEAD(hcd)          ((hcd)->flags & (1U << HCD_FLAG_DEAD))
 
        /* Flags that get set only during HCD registration or removal. */
        unsigned                rh_registered:1;/* is root hub registered? */
@@ -138,7 +146,9 @@ struct usb_hcd {
         * bandwidth_mutex should be dropped after a successful control message
         * to the device, or resetting the bandwidth after a failed attempt.
         */
-       struct mutex            bandwidth_mutex;
+       struct mutex            *bandwidth_mutex;
+       struct usb_hcd          *shared_hcd;
+       struct usb_hcd          *primary_hcd;
 
 
 #define HCD_BUFFER_POOLS       4
@@ -201,6 +211,7 @@ struct hc_driver {
        int     flags;
 #define        HCD_MEMORY      0x0001          /* HC regs use memory (else I/O) */
 #define        HCD_LOCAL_MEM   0x0002          /* HC needs local memory */
+#define        HCD_SHARED      0x0004          /* Two (or more) usb_hcds share HW */
 #define        HCD_USB11       0x0010          /* USB 1.1 */
 #define        HCD_USB2        0x0020          /* USB 2.0 */
 #define        HCD_USB3        0x0040          /* USB 3.0 */
@@ -234,6 +245,19 @@ struct hc_driver {
        int     (*urb_dequeue)(struct usb_hcd *hcd,
                                struct urb *urb, int status);
 
+       /*
+        * (optional) these hooks allow an HCD to override the default DMA
+        * mapping and unmapping routines.  In general, they shouldn't be
+        * necessary unless the host controller has special DMA requirements,
+        * such as alignment contraints.  If these are not specified, the
+        * general usb_hcd_(un)?map_urb_for_dma functions will be used instead
+        * (and it may be a good idea to call these functions in your HCD
+        * implementation)
+        */
+       int     (*map_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb,
+                                  gfp_t mem_flags);
+       void    (*unmap_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb);
+
        /* hw synch, freeing endpoint resources that urb_dequeue can't */
        void    (*endpoint_disable)(struct usb_hcd *hcd,
                        struct usb_host_endpoint *ep);
@@ -319,6 +343,7 @@ struct hc_driver {
                 * address is set
                 */
        int     (*update_device)(struct usb_hcd *, struct usb_device *);
+       int     (*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int);
 };
 
 extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb);
@@ -330,8 +355,10 @@ extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags);
 extern int usb_hcd_unlink_urb(struct urb *urb, int status);
 extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb,
                int status);
-extern void unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *);
-extern void unmap_urb_for_dma(struct usb_hcd *, struct urb *);
+extern int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
+               gfp_t mem_flags);
+extern void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *);
+extern void usb_hcd_unmap_urb_for_dma(struct usb_hcd *, struct urb *);
 extern void usb_hcd_flush_endpoint(struct usb_device *udev,
                struct usb_host_endpoint *ep);
 extern void usb_hcd_disable_endpoint(struct usb_device *udev,
@@ -347,8 +374,12 @@ extern int usb_hcd_get_frame_number(struct usb_device *udev);
 
 extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
                struct device *dev, const char *bus_name);
+extern struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
+               struct device *dev, const char *bus_name,
+               struct usb_hcd *shared_hcd);
 extern struct usb_hcd *usb_get_hcd(struct usb_hcd *hcd);
 extern void usb_put_hcd(struct usb_hcd *hcd);
+extern int usb_hcd_is_primary_hcd(struct usb_hcd *hcd);
 extern int usb_add_hcd(struct usb_hcd *hcd,
                unsigned int irqnum, unsigned long irqflags);
 extern void usb_remove_hcd(struct usb_hcd *hcd);
@@ -620,13 +651,6 @@ static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb,
 
 #endif /* CONFIG_USB_MON || CONFIG_USB_MON_MODULE */
 
-/*-------------------------------------------------------------------------*/
-
-/* hub.h ... DeviceRemovable in 2.4.2-ac11, gone in 2.4.10 */
-/* bleech -- resurfaced in 2.4.11 or 2.4.12 */
-#define bitmap DeviceRemovable
-
-
 /*-------------------------------------------------------------------------*/
 
 /* random stuff */
This page took 0.060439 seconds and 5 git commands to generate.