|
@@ -11,22 +11,22 @@
|
|
|
static int cc_to_error[16] = {
|
|
|
|
|
|
/* mapping of the OHCI CC status to error codes */
|
|
|
- /* No Error */ 0,
|
|
|
- /* CRC Error */ USB_ST_CRC_ERR,
|
|
|
- /* Bit Stuff */ USB_ST_BIT_ERR,
|
|
|
- /* Data Togg */ USB_ST_CRC_ERR,
|
|
|
- /* Stall */ USB_ST_STALLED,
|
|
|
- /* DevNotResp */ -1,
|
|
|
- /* PIDCheck */ USB_ST_BIT_ERR,
|
|
|
- /* UnExpPID */ USB_ST_BIT_ERR,
|
|
|
- /* DataOver */ USB_ST_BUF_ERR,
|
|
|
- /* DataUnder */ USB_ST_BUF_ERR,
|
|
|
- /* reservd */ -1,
|
|
|
- /* reservd */ -1,
|
|
|
- /* BufferOver */ USB_ST_BUF_ERR,
|
|
|
- /* BuffUnder */ USB_ST_BUF_ERR,
|
|
|
- /* Not Access */ -1,
|
|
|
- /* Not Access */ -1
|
|
|
+ /* No Error */ 0,
|
|
|
+ /* CRC Error */ USB_ST_CRC_ERR,
|
|
|
+ /* Bit Stuff */ USB_ST_BIT_ERR,
|
|
|
+ /* Data Togg */ USB_ST_CRC_ERR,
|
|
|
+ /* Stall */ USB_ST_STALLED,
|
|
|
+ /* DevNotResp */ -1,
|
|
|
+ /* PIDCheck */ USB_ST_BIT_ERR,
|
|
|
+ /* UnExpPID */ USB_ST_BIT_ERR,
|
|
|
+ /* DataOver */ USB_ST_BUF_ERR,
|
|
|
+ /* DataUnder */ USB_ST_BUF_ERR,
|
|
|
+ /* reservd */ -1,
|
|
|
+ /* reservd */ -1,
|
|
|
+ /* BufferOver */ USB_ST_BUF_ERR,
|
|
|
+ /* BuffUnder */ USB_ST_BUF_ERR,
|
|
|
+ /* Not Access */ -1,
|
|
|
+ /* Not Access */ -1
|
|
|
};
|
|
|
|
|
|
/* ED States */
|
|
@@ -55,14 +55,13 @@ struct ed {
|
|
|
|
|
|
struct usb_device *usb_dev;
|
|
|
__u32 unused[3];
|
|
|
-} __attribute__((aligned(16)));
|
|
|
-typedef struct ed ed_t;
|
|
|
-
|
|
|
+} __attribute__ ((aligned(16)));
|
|
|
|
|
|
/* TD info field */
|
|
|
#define TD_CC 0xf0000000
|
|
|
-#define TD_CC_GET(td_p) ((td_p >>28) & 0x0f)
|
|
|
-#define TD_CC_SET(td_p, cc) (td_p) = ((td_p) & 0x0fffffff) | (((cc) & 0x0f) << 28)
|
|
|
+#define TD_CC_GET(td_p) (((td_p) >> 28) & 0x0f)
|
|
|
+#define TD_CC_SET(td_p, cc) \
|
|
|
+ {(td_p) = ((td_p) & 0x0fffffff) | (((cc) & 0x0f) << 28)}
|
|
|
#define TD_EC 0x0C000000
|
|
|
#define TD_T 0x03000000
|
|
|
#define TD_T_DATA0 0x02000000
|
|
@@ -112,8 +111,7 @@ struct td {
|
|
|
__u32 data;
|
|
|
|
|
|
__u32 unused2[2];
|
|
|
-} __attribute__((aligned(32)));
|
|
|
-typedef struct td td_t;
|
|
|
+} __attribute__ ((aligned(32)));
|
|
|
|
|
|
#define OHCI_ED_SKIP (1 << 14)
|
|
|
|
|
@@ -123,15 +121,14 @@ typedef struct td td_t;
|
|
|
* told the base address of. It must be 256-byte aligned.
|
|
|
*/
|
|
|
|
|
|
-#define NUM_INTS 32 /* part of the OHCI standard */
|
|
|
+#define NUM_INTS 32 /* part of the OHCI standard */
|
|
|
struct ohci_hcca {
|
|
|
- __u32 int_table[NUM_INTS]; /* Interrupt ED table */
|
|
|
- __u16 frame_no; /* current frame number */
|
|
|
- __u16 pad1; /* set to 0 on each frame_no change */
|
|
|
- __u32 done_head; /* info returned for an interrupt */
|
|
|
- u8 reserved_for_hc[116];
|
|
|
-} __attribute__((aligned(256)));
|
|
|
-
|
|
|
+ __u32 int_table[NUM_INTS]; /* Interrupt ED table */
|
|
|
+ __u16 frame_no; /* current frame number */
|
|
|
+ __u16 pad1; /* set to 0 on each frame_no change */
|
|
|
+ __u32 done_head; /* info returned for an interrupt */
|
|
|
+ u8 reserved_for_hc[116];
|
|
|
+} __attribute__ ((aligned(256)));
|
|
|
|
|
|
/*
|
|
|
* Maximum number of root hub ports.
|
|
@@ -145,35 +142,34 @@ struct ohci_hcca {
|
|
|
*/
|
|
|
struct ohci_regs {
|
|
|
/* control and status registers */
|
|
|
- __u32 revision;
|
|
|
- __u32 control;
|
|
|
- __u32 cmdstatus;
|
|
|
- __u32 intrstatus;
|
|
|
- __u32 intrenable;
|
|
|
- __u32 intrdisable;
|
|
|
+ __u32 revision;
|
|
|
+ __u32 control;
|
|
|
+ __u32 cmdstatus;
|
|
|
+ __u32 intrstatus;
|
|
|
+ __u32 intrenable;
|
|
|
+ __u32 intrdisable;
|
|
|
/* memory pointers */
|
|
|
- __u32 hcca;
|
|
|
- __u32 ed_periodcurrent;
|
|
|
- __u32 ed_controlhead;
|
|
|
- __u32 ed_controlcurrent;
|
|
|
- __u32 ed_bulkhead;
|
|
|
- __u32 ed_bulkcurrent;
|
|
|
- __u32 donehead;
|
|
|
+ __u32 hcca;
|
|
|
+ __u32 ed_periodcurrent;
|
|
|
+ __u32 ed_controlhead;
|
|
|
+ __u32 ed_controlcurrent;
|
|
|
+ __u32 ed_bulkhead;
|
|
|
+ __u32 ed_bulkcurrent;
|
|
|
+ __u32 donehead;
|
|
|
/* frame counters */
|
|
|
- __u32 fminterval;
|
|
|
- __u32 fmremaining;
|
|
|
- __u32 fmnumber;
|
|
|
- __u32 periodicstart;
|
|
|
- __u32 lsthresh;
|
|
|
+ __u32 fminterval;
|
|
|
+ __u32 fmremaining;
|
|
|
+ __u32 fmnumber;
|
|
|
+ __u32 periodicstart;
|
|
|
+ __u32 lsthresh;
|
|
|
/* Root hub ports */
|
|
|
- struct ohci_roothub_regs {
|
|
|
- __u32 a;
|
|
|
- __u32 b;
|
|
|
- __u32 status;
|
|
|
- __u32 portstatus[MAX_ROOT_PORTS];
|
|
|
+ struct ohci_roothub_regs {
|
|
|
+ __u32 a;
|
|
|
+ __u32 b;
|
|
|
+ __u32 status;
|
|
|
+ __u32 portstatus[MAX_ROOT_PORTS];
|
|
|
} roothub;
|
|
|
-} __attribute__((aligned(32)));
|
|
|
-
|
|
|
+} __attribute__ ((aligned(32)));
|
|
|
|
|
|
/* OHCI CONTROL AND STATUS REGISTER MASKS */
|
|
|
|
|
@@ -221,11 +217,10 @@ struct ohci_regs {
|
|
|
#define OHCI_INTR_OC (1 << 30) /* ownership change */
|
|
|
#define OHCI_INTR_MIE (1 << 31) /* master interrupt enable */
|
|
|
|
|
|
-
|
|
|
/* Virtual Root HUB */
|
|
|
struct virt_root_hub {
|
|
|
- int devnum; /* Address of Root Hub endpoint */
|
|
|
- void *dev; /* was urb */
|
|
|
+ int devnum; /* Address of Root Hub endpoint */
|
|
|
+ void *dev; /* was urb */
|
|
|
void *int_addr;
|
|
|
int send;
|
|
|
int interval;
|
|
@@ -288,52 +283,52 @@ struct virt_root_hub {
|
|
|
/* OHCI ROOT HUB REGISTER MASKS */
|
|
|
|
|
|
/* roothub.portstatus [i] bits */
|
|
|
-#define RH_PS_CCS 0x00000001 /* current connect status */
|
|
|
-#define RH_PS_PES 0x00000002 /* port enable status*/
|
|
|
-#define RH_PS_PSS 0x00000004 /* port suspend status */
|
|
|
-#define RH_PS_POCI 0x00000008 /* port over current indicator */
|
|
|
-#define RH_PS_PRS 0x00000010 /* port reset status */
|
|
|
-#define RH_PS_PPS 0x00000100 /* port power status */
|
|
|
-#define RH_PS_LSDA 0x00000200 /* low speed device attached */
|
|
|
-#define RH_PS_CSC 0x00010000 /* connect status change */
|
|
|
-#define RH_PS_PESC 0x00020000 /* port enable status change */
|
|
|
-#define RH_PS_PSSC 0x00040000 /* port suspend status change */
|
|
|
-#define RH_PS_OCIC 0x00080000 /* over current indicator change */
|
|
|
-#define RH_PS_PRSC 0x00100000 /* port reset status change */
|
|
|
+#define RH_PS_CCS 0x00000001 /* current connect status */
|
|
|
+#define RH_PS_PES 0x00000002 /* port enable status */
|
|
|
+#define RH_PS_PSS 0x00000004 /* port suspend status */
|
|
|
+#define RH_PS_POCI 0x00000008 /* port over current indicator */
|
|
|
+#define RH_PS_PRS 0x00000010 /* port reset status */
|
|
|
+#define RH_PS_PPS 0x00000100 /* port power status */
|
|
|
+#define RH_PS_LSDA 0x00000200 /* low speed device attached */
|
|
|
+#define RH_PS_CSC 0x00010000 /* connect status change */
|
|
|
+#define RH_PS_PESC 0x00020000 /* port enable status change */
|
|
|
+#define RH_PS_PSSC 0x00040000 /* port suspend status change */
|
|
|
+#define RH_PS_OCIC 0x00080000 /* over current indicator change */
|
|
|
+#define RH_PS_PRSC 0x00100000 /* port reset status change */
|
|
|
|
|
|
/* roothub.status bits */
|
|
|
-#define RH_HS_LPS 0x00000001 /* local power status */
|
|
|
-#define RH_HS_OCI 0x00000002 /* over current indicator */
|
|
|
-#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */
|
|
|
-#define RH_HS_LPSC 0x00010000 /* local power status change */
|
|
|
-#define RH_HS_OCIC 0x00020000 /* over current indicator change */
|
|
|
-#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable */
|
|
|
+#define RH_HS_LPS 0x00000001 /* local power status */
|
|
|
+#define RH_HS_OCI 0x00000002 /* over current indicator */
|
|
|
+#define RH_HS_DRWE 0x00008000 /* device remote wakeup enable */
|
|
|
+#define RH_HS_LPSC 0x00010000 /* local power status change */
|
|
|
+#define RH_HS_OCIC 0x00020000 /* over current indicator change */
|
|
|
+#define RH_HS_CRWE 0x80000000 /* clear remote wakeup enable */
|
|
|
|
|
|
/* roothub.b masks */
|
|
|
-#define RH_B_DR 0x0000ffff /* device removable flags */
|
|
|
-#define RH_B_PPCM 0xffff0000 /* port power control mask */
|
|
|
+#define RH_B_DR 0x0000ffff /* device removable flags */
|
|
|
+#define RH_B_PPCM 0xffff0000 /* port power control mask */
|
|
|
|
|
|
/* roothub.a masks */
|
|
|
-#define RH_A_NDP (0xff << 0) /* number of downstream ports */
|
|
|
-#define RH_A_PSM (1 << 8) /* power switching mode */
|
|
|
-#define RH_A_NPS (1 << 9) /* no power switching */
|
|
|
-#define RH_A_DT (1 << 10) /* device type (mbz) */
|
|
|
-#define RH_A_OCPM (1 << 11) /* over current protection mode */
|
|
|
-#define RH_A_NOCP (1 << 12) /* no over current protection */
|
|
|
-#define RH_A_POTPGT (0xff << 24) /* power on to power good time */
|
|
|
+#define RH_A_NDP (0xff << 0) /* number of downstream ports */
|
|
|
+#define RH_A_PSM (1 << 8) /* power switching mode */
|
|
|
+#define RH_A_NPS (1 << 9) /* no power switching */
|
|
|
+#define RH_A_DT (1 << 10) /* device type (mbz) */
|
|
|
+#define RH_A_OCPM (1 << 11) /* over current protection mode */
|
|
|
+#define RH_A_NOCP (1 << 12) /* no over current protection */
|
|
|
+#define RH_A_POTPGT (0xff << 24) /* power on to power good time */
|
|
|
|
|
|
/* urb */
|
|
|
#define N_URB_TD 48
|
|
|
-typedef struct
|
|
|
-{
|
|
|
- ed_t *ed;
|
|
|
- __u16 length; /* number of tds associated with this request */
|
|
|
- __u16 td_cnt; /* number of tds already serviced */
|
|
|
- int state;
|
|
|
+struct urb_priv {
|
|
|
+ struct ed *ed;
|
|
|
+ __u16 length; /* number of tds associated with this request */
|
|
|
+ __u16 td_cnt; /* number of tds already serviced */
|
|
|
+ int state;
|
|
|
unsigned long pipe;
|
|
|
int actual_length;
|
|
|
- td_t *td[N_URB_TD]; /* list pointer to all corresponding TDs associated with this request */
|
|
|
-} urb_priv_t;
|
|
|
+ struct td *td[N_URB_TD]; /* list pointer to all corresponding TDs
|
|
|
+ associated with this request */
|
|
|
+};
|
|
|
#define URB_DEL 1
|
|
|
|
|
|
/*
|
|
@@ -344,7 +339,7 @@ typedef struct
|
|
|
*/
|
|
|
|
|
|
|
|
|
-typedef struct ohci {
|
|
|
+struct ohci {
|
|
|
struct ohci_hcca *hcca; /* hcca */
|
|
|
/*dma_addr_t hcca_dma; */
|
|
|
|
|
@@ -355,29 +350,29 @@ typedef struct ohci {
|
|
|
|
|
|
struct ohci_regs *regs; /* OHCI controller's memory */
|
|
|
|
|
|
- ed_t *ed_rm_list[2]; /* lists of all endpoints to be removed */
|
|
|
- ed_t *ed_bulktail; /* last endpoint of bulk list */
|
|
|
- ed_t *ed_controltail; /* last endpoint of control list */
|
|
|
+ struct ed *ed_rm_list[2]; /* lists of all endpoints to be removed */
|
|
|
+ struct ed *ed_bulktail; /* last endpoint of bulk list */
|
|
|
+ struct ed *ed_controltail; /* last endpoint of control list */
|
|
|
int intrstatus;
|
|
|
__u32 hc_control; /* copy of the hc control reg */
|
|
|
struct usb_device *dev[32];
|
|
|
struct virt_root_hub rh;
|
|
|
|
|
|
const char *slot_name;
|
|
|
-} ohci_t;
|
|
|
+};
|
|
|
|
|
|
#define NUM_EDS 8 /* num of preallocated endpoint descriptors */
|
|
|
|
|
|
struct ohci_device {
|
|
|
- ed_t ed[NUM_EDS];
|
|
|
+ struct ed ed[NUM_EDS];
|
|
|
int ed_cnt;
|
|
|
};
|
|
|
|
|
|
/* hcd */
|
|
|
/* endpoint */
|
|
|
-static int ep_link (ohci_t * ohci, ed_t * ed);
|
|
|
-static int ep_unlink (ohci_t * ohci, ed_t * ed);
|
|
|
-static ed_t *ep_add_ed (struct usb_device *usb_dev, unsigned long pipe);
|
|
|
+static int ep_link(struct ohci *ohci, struct ed *ed);
|
|
|
+static int ep_unlink(struct ohci *ohci, struct ed *ed);
|
|
|
+static struct ed *ep_add_ed(struct usb_device *usb_dev, unsigned long pipe);
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
|
|
@@ -385,13 +380,13 @@ static ed_t *ep_add_ed (struct usb_device *usb_dev, unsigned long pipe);
|
|
|
#define NUM_TD 64
|
|
|
|
|
|
/* +1 so we can align the storage */
|
|
|
-td_t gtd[NUM_TD + 1];
|
|
|
+struct td gtd[NUM_TD + 1];
|
|
|
|
|
|
/* pointers to aligned storage */
|
|
|
-td_t *ptd;
|
|
|
+struct td *ptd;
|
|
|
|
|
|
/* TDs ... */
|
|
|
-static inline struct td *td_alloc (struct usb_device *usb_dev)
|
|
|
+static inline struct td *td_alloc(struct usb_device *usb_dev)
|
|
|
{
|
|
|
int i;
|
|
|
struct td *td;
|
|
@@ -408,7 +403,7 @@ static inline struct td *td_alloc (struct usb_device *usb_dev)
|
|
|
return td;
|
|
|
}
|
|
|
|
|
|
-static inline void ed_free (struct ed *ed)
|
|
|
+static inline void ed_free(struct ed *ed)
|
|
|
{
|
|
|
ed->usb_dev = NULL;
|
|
|
}
|