upgrade to fedora-2.6.12-1.1398.FC4 + vserver 2.0.rc7
[linux-2.6.git] / drivers / usb / host / ehci.h
index 2e2cb6e..4df4982 100644 (file)
@@ -36,7 +36,7 @@ struct ehci_stats {
 
 /* ehci_hcd->lock guards shared data against other CPUs:
  *   ehci_hcd: async, reclaim, periodic (and shadow), ...
- *   hcd_dev:  ep[]
+ *   usb_host_endpoint: hcpriv
  *   ehci_qh:  qh_next, qtd_list
  *   ehci_qtd: qtd_list
  *
@@ -47,13 +47,12 @@ struct ehci_stats {
 #define        EHCI_MAX_ROOT_PORTS     15              /* see HCS_N_PORTS */
 
 struct ehci_hcd {                      /* one per controller */
-
        /* glue to PCI and HCD framework */
-       struct usb_hcd          hcd;            /* must come first! */
        struct ehci_caps __iomem *caps;
        struct ehci_regs __iomem *regs;
-       __u32                   hcs_params;     /* cached register copy */
+       struct ehci_dbg_port __iomem *debug;
 
+       __u32                   hcs_params;     /* cached register copy */
        spinlock_t              lock;
 
        /* async schedule support */
@@ -89,7 +88,7 @@ struct ehci_hcd {                     /* one per controller */
        unsigned long           next_statechange;
        u32                     command;
 
-       unsigned                is_arc_rh_tt:1; /* ARC roothub with TT */
+       unsigned                is_tdi_rh_tt:1; /* TDI roothub with TT */
 
        /* irq statistics */
 #ifdef EHCI_STATS
@@ -100,8 +99,15 @@ struct ehci_hcd {                   /* one per controller */
 #endif
 };
 
-/* unwrap an HCD pointer to get an EHCI_HCD pointer */ 
-#define hcd_to_ehci(hcd_ptr) container_of(hcd_ptr, struct ehci_hcd, hcd)
+/* convert between an HCD pointer and the corresponding EHCI_HCD */ 
+static inline struct ehci_hcd *hcd_to_ehci (struct usb_hcd *hcd)
+{
+       return (struct ehci_hcd *) (hcd->hcd_priv);
+}
+static inline struct usb_hcd *ehci_to_hcd (struct ehci_hcd *ehci)
+{
+       return container_of ((void *) ehci, struct usb_hcd, hcd_priv);
+}
 
 
 enum ehci_timer_action {
@@ -160,7 +166,7 @@ struct ehci_caps {
        /* these fields are specified as 8 and 16 bit registers,
         * but some hosts can't perform 8 or 16 bit PCI accesses.
         */
-       u32     hc_capbase;
+       u32             hc_capbase;
 #define HC_LENGTH(p)           (((p)>>00)&0x00ff)      /* bits 7:0 */
 #define HC_VERSION(p)          (((p)>>16)&0xffff)      /* bits 31:16 */
        u32             hcs_params;     /* HCSPARAMS - offset 0x4 */
@@ -259,6 +265,30 @@ struct ehci_regs {
 #define PORT_CONNECT   (1<<0)          /* device connected */
 } __attribute__ ((packed));
 
+/* Appendix C, Debug port ... intended for use with special "debug devices"
+ * that can help if there's no serial console.  (nonstandard enumeration.)
+ */
+struct ehci_dbg_port {
+       u32     control;
+#define DBGP_OWNER     (1<<30)
+#define DBGP_ENABLED   (1<<28)
+#define DBGP_DONE      (1<<16)
+#define DBGP_INUSE     (1<<10)
+#define DBGP_ERRCODE(x)        (((x)>>7)&0x07)
+#      define DBGP_ERR_BAD     1
+#      define DBGP_ERR_SIGNAL  2
+#define DBGP_ERROR     (1<<6)
+#define DBGP_GO                (1<<5)
+#define DBGP_OUT       (1<<4)
+#define DBGP_LEN(x)    (((x)>>0)&0x0f)
+       u32     pids;
+#define DBGP_PID_GET(x)                (((x)>>16)&0xff)
+#define DBGP_PID_SET(data,tok) (((data)<<8)|(tok))
+       u32     data03;
+       u32     data47;
+       u32     address;
+#define DBGP_EPADDR(dev,ep)    (((dev)<<8)|(ep))
+} __attribute__ ((packed));
 
 /*-------------------------------------------------------------------------*/
 
@@ -335,7 +365,7 @@ union ehci_shadow {
        struct ehci_itd         *itd;           /* Q_TYPE_ITD */
        struct ehci_sitd        *sitd;          /* Q_TYPE_SITD */
        struct ehci_fstn        *fstn;          /* Q_TYPE_FSTN */
-       u32                     *hw_next;       /* (all types) */
+       __le32                  *hw_next;       /* (all types) */
        void                    *ptr;
 };
 
@@ -401,7 +431,7 @@ struct ehci_iso_packet {
        __le32                  transaction;    /* itd->hw_transaction[i] |= */
        u8                      cross;          /* buf crosses pages */
        /* for full speed OUT splits */
-       u16                     buf1;
+       u32                     buf1;
 };
 
 /* temporary schedule data for packets from iso urbs (both speeds)
@@ -430,6 +460,7 @@ struct ehci_iso_stream {
        struct list_head        td_list;        /* queued itds/sitds */
        struct list_head        free_list;      /* list of unused itds/sitds */
        struct usb_device       *udev;
+       struct usb_host_endpoint *ep;
 
        /* output of (re)scheduling */
        unsigned long           start;          /* jiffies */
@@ -569,13 +600,13 @@ struct ehci_fstn {
  * needed (mostly in root hub code).
  */
 
-#define        ehci_is_ARC(e)                  ((e)->is_arc_rh_tt)
+#define        ehci_is_TDI(e)                  ((e)->is_tdi_rh_tt)
 
 /* Returns the speed of a device attached to a port on the root hub. */
 static inline unsigned int
 ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc)
 {
-       if (ehci_is_ARC(ehci)) {
+       if (ehci_is_TDI(ehci)) {
                switch ((portsc>>26)&3) {
                case 0:
                        return 0;
@@ -591,7 +622,7 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc)
 
 #else
 
-#define        ehci_is_ARC(e)                  (0)
+#define        ehci_is_TDI(e)                  (0)
 
 #define        ehci_port_speed(ehci, portsc)   (1<<USB_PORT_FEAT_HIGHSPEED)
 #endif