struct ohci_soft_ed {
struct ohci_ed ed;
struct ohci_soft_ed *next;
ohci_physaddr_t physaddr;
};
#define OHCI_SED_SIZE ((sizeof (struct ohci_soft_ed) + OHCI_ED_ALIGN - 1) / OHCI_ED_ALIGN * OHCI_ED_ALIGN)
#define OHCI_SED_CHUNK 128
struct ohci_soft_td {
struct ohci_td td;
struct ohci_soft_td *nexttd;
struct ohci_soft_td *dnext;
ohci_physaddr_t physaddr;
LIST_ENTRY(ohci_soft_td) hnext;
struct usbd_xfer *xfer;
u_int16_t len;
u_int16_t flags;
#define OHCI_CALL_DONE 0x0001
#define OHCI_ADD_LEN 0x0002
};
#define OHCI_STD_SIZE ((sizeof (struct ohci_soft_td) + OHCI_TD_ALIGN - 1) / OHCI_TD_ALIGN * OHCI_TD_ALIGN)
#define OHCI_STD_CHUNK 128
struct ohci_soft_itd {
struct ohci_itd itd;
struct ohci_soft_itd *nextitd;
struct ohci_soft_itd *dnext;
ohci_physaddr_t physaddr;
LIST_ENTRY(ohci_soft_itd) hnext;
struct usbd_xfer *xfer;
u_int16_t flags;
#ifdef DIAGNOSTIC
char isdone;
#endif
};
#define OHCI_SITD_SIZE ((sizeof (struct ohci_soft_itd) + OHCI_ITD_ALIGN - 1) / OHCI_ITD_ALIGN * OHCI_ITD_ALIGN)
#define OHCI_SITD_CHUNK 64
#define OHCI_NO_EDS (2*OHCI_NO_INTRS-1)
#define OHCI_HASH_SIZE 128
struct ohci_softc {
struct usbd_bus sc_bus;
bus_space_tag_t iot;
bus_space_handle_t ioh;
bus_size_t sc_size;
struct usb_dma sc_hccadma;
struct ohci_hcca *sc_hcca;
struct ohci_soft_ed *sc_eds[OHCI_NO_EDS];
u_int sc_bws[OHCI_NO_INTRS];
u_int32_t sc_eintrs;
struct ohci_soft_ed *sc_isoc_head;
struct ohci_soft_ed *sc_ctrl_head;
struct ohci_soft_ed *sc_bulk_head;
LIST_HEAD(, ohci_soft_td) sc_hash_tds[OHCI_HASH_SIZE];
LIST_HEAD(, ohci_soft_itd) sc_hash_itds[OHCI_HASH_SIZE];
int sc_noport;
u_int8_t sc_conf;
char sc_softwake;
struct ohci_soft_ed *sc_freeeds;
struct ohci_soft_td *sc_freetds;
struct ohci_soft_itd *sc_freeitds;
struct usbd_xfer *sc_intrxfer;
struct ohci_soft_itd *sc_sidone;
struct ohci_soft_td *sc_sdone;
char sc_vendor[16];
int sc_id_vendor;
u_int32_t sc_control;
u_int32_t sc_intre;
u_int32_t sc_ival;
u_int sc_overrun_cnt;
struct timeval sc_overrun_ntc;
struct timeout sc_tmo_rhsc;
};
struct ohci_xfer {
struct usbd_xfer xfer;
};
usbd_status ohci_checkrev(struct ohci_softc *);
usbd_status ohci_handover(struct ohci_softc *);
usbd_status ohci_init(struct ohci_softc *);
int ohci_intr(void *);
int ohci_detach(struct device *, int);
int ohci_activate(struct device *, int);