1906943f9SDavid du Colombier typedef struct Hub Hub; 2906943f9SDavid du Colombier typedef struct Port Port; 3906943f9SDavid du Colombier typedef struct DHub DHub; 4906943f9SDavid du Colombier typedef struct Devtab Devtab; 5906943f9SDavid du Colombier typedef struct Usbfs Usbfs; 6906943f9SDavid du Colombier 7906943f9SDavid du Colombier enum 8906943f9SDavid du Colombier { 9906943f9SDavid du Colombier Stack = 32*1024, 10906943f9SDavid du Colombier 11906943f9SDavid du Colombier Dhub = 0x29, /* hub descriptor type */ 12906943f9SDavid du Colombier Dhublen = 9, /* hub descriptor length */ 13906943f9SDavid du Colombier 14906943f9SDavid du Colombier /* hub class feature selectors */ 15906943f9SDavid du Colombier Fhublocalpower = 0, 16906943f9SDavid du Colombier Fhubovercurrent = 1, 17906943f9SDavid du Colombier 18906943f9SDavid du Colombier Fportconnection = 0, 19906943f9SDavid du Colombier Fportenable = 1, 20906943f9SDavid du Colombier Fportsuspend = 2, 21906943f9SDavid du Colombier Fportovercurrent = 3, 22906943f9SDavid du Colombier Fportreset = 4, 23906943f9SDavid du Colombier Fportpower = 8, 24906943f9SDavid du Colombier Fportlowspeed = 9, 25906943f9SDavid du Colombier Fcportconnection = 16, 26906943f9SDavid du Colombier Fcportenable = 17, 27906943f9SDavid du Colombier Fcportsuspend = 18, 28906943f9SDavid du Colombier Fcportovercurrent= 19, 29906943f9SDavid du Colombier Fcportreset = 20, 30906943f9SDavid du Colombier Fportindicator = 22, 31906943f9SDavid du Colombier 32906943f9SDavid du Colombier /* Port status and status change bits 33906943f9SDavid du Colombier * Constants at /sys/src/9/pc/usb.h starting with HP- 34906943f9SDavid du Colombier * must have the same values or root hubs won't work. 35906943f9SDavid du Colombier */ 36906943f9SDavid du Colombier PSpresent = 0x0001, 37906943f9SDavid du Colombier PSenable = 0x0002, 38906943f9SDavid du Colombier PSsuspend = 0x0004, 39906943f9SDavid du Colombier PSovercurrent = 0x0008, 40906943f9SDavid du Colombier PSreset = 0x0010, 41906943f9SDavid du Colombier PSpower = 0x0100, 42906943f9SDavid du Colombier PSslow = 0x0200, 43906943f9SDavid du Colombier PShigh = 0x0400, 44906943f9SDavid du Colombier 45906943f9SDavid du Colombier PSstatuschg = 0x10000, /* PSpresent changed */ 46906943f9SDavid du Colombier PSchange = 0x20000, /* PSenable changed */ 47906943f9SDavid du Colombier 48906943f9SDavid du Colombier 49906943f9SDavid du Colombier /* port/device state */ 50906943f9SDavid du Colombier Pdisabled = 0, /* must be 0 */ 51906943f9SDavid du Colombier Pattached, 52906943f9SDavid du Colombier Pconfiged, 53906943f9SDavid du Colombier 54906943f9SDavid du Colombier /* Delays, timeouts (ms) */ 55*6083aa43SDavid du Colombier Spawndelay = 100, /* how often may we re-spawn a driver */ 56cb8c047aSDavid du Colombier Connectdelay = 500, /* how much to wait after a connect */ 57906943f9SDavid du Colombier Resetdelay = 20, /* how much to wait after a reset */ 58906943f9SDavid du Colombier Enabledelay = 20, /* how much to wait after an enable */ 59906943f9SDavid du Colombier Powerdelay = 100, /* after powering up ports */ 60906943f9SDavid du Colombier Pollms = 250, /* port poll interval */ 61906943f9SDavid du Colombier Chgdelay = 100, /* waiting for port become stable */ 62906943f9SDavid du Colombier Chgtmout = 1000, /* ...but at most this much */ 63906943f9SDavid du Colombier 64906943f9SDavid du Colombier /* 65906943f9SDavid du Colombier * device tab for embedded usb drivers. 66906943f9SDavid du Colombier */ 67906943f9SDavid du Colombier DCL = 0x01000000, /* csp identifies just class */ 68906943f9SDavid du Colombier DSC = 0x02000000, /* csp identifies just subclass */ 69906943f9SDavid du Colombier DPT = 0x04000000, /* csp identifies just proto */ 70906943f9SDavid du Colombier 71906943f9SDavid du Colombier }; 72906943f9SDavid du Colombier 73906943f9SDavid du Colombier struct Hub 74906943f9SDavid du Colombier { 75906943f9SDavid du Colombier uchar pwrmode; 76906943f9SDavid du Colombier uchar compound; 77906943f9SDavid du Colombier uchar pwrms; /* time to wait in ms */ 78906943f9SDavid du Colombier uchar maxcurrent; /* after powering port*/ 79906943f9SDavid du Colombier int leds; /* has port indicators? */ 80906943f9SDavid du Colombier int maxpkt; 81906943f9SDavid du Colombier uchar nport; 82906943f9SDavid du Colombier Port *port; 83906943f9SDavid du Colombier int failed; /* I/O error while enumerating */ 84906943f9SDavid du Colombier int isroot; /* set if root hub */ 85906943f9SDavid du Colombier Dev *dev; /* for this hub */ 86906943f9SDavid du Colombier Hub *next; /* in list of hubs */ 87906943f9SDavid du Colombier }; 88906943f9SDavid du Colombier 89906943f9SDavid du Colombier struct Port 90906943f9SDavid du Colombier { 91906943f9SDavid du Colombier int state; /* state of the device */ 92906943f9SDavid du Colombier int sts; /* old port status */ 93906943f9SDavid du Colombier uchar removable; 94906943f9SDavid du Colombier uchar pwrctl; 95906943f9SDavid du Colombier Dev *dev; /* attached device (if non-nil) */ 96906943f9SDavid du Colombier Hub *hub; /* non-nil if hub attached */ 97ed868a7cSDavid du Colombier int devnb; /* device number */ 98ed868a7cSDavid du Colombier uvlong *devmaskp; /* ptr to dev mask */ 99906943f9SDavid du Colombier }; 100906943f9SDavid du Colombier 101906943f9SDavid du Colombier 102906943f9SDavid du Colombier /* USB HUB descriptor */ 103906943f9SDavid du Colombier struct DHub 104906943f9SDavid du Colombier { 105906943f9SDavid du Colombier uchar bLength; 106906943f9SDavid du Colombier uchar bDescriptorType; 107906943f9SDavid du Colombier uchar bNbrPorts; 108906943f9SDavid du Colombier uchar wHubCharacteristics[2]; 109906943f9SDavid du Colombier uchar bPwrOn2PwrGood; 110906943f9SDavid du Colombier uchar bHubContrCurrent; 111906943f9SDavid du Colombier uchar DeviceRemovable[1]; /* variable length */ 112906943f9SDavid du Colombier }; 113906943f9SDavid du Colombier 114906943f9SDavid du Colombier struct Devtab 115906943f9SDavid du Colombier { 116906943f9SDavid du Colombier char *name; 117906943f9SDavid du Colombier int (*init)(Dev*, int, char**); /* nil if external */ 118906943f9SDavid du Colombier int csps[4]; 119906943f9SDavid du Colombier int vid; 120906943f9SDavid du Colombier int did; 121906943f9SDavid du Colombier char *args; 122ed868a7cSDavid du Colombier uvlong devmask; 123a650be7dSDavid du Colombier int noauto; 124906943f9SDavid du Colombier }; 125906943f9SDavid du Colombier 126906943f9SDavid du Colombier 127906943f9SDavid du Colombier Hub* newhub(char *fn, Dev *d); 128906943f9SDavid du Colombier int startdev(Port *pp); 129ed868a7cSDavid du Colombier int getdevnb(uvlong *maskp); 130ed868a7cSDavid du Colombier void putdevnb(uvlong *maskp, int nb); 131906943f9SDavid du Colombier void threadmain(int argc, char **argv); 132906943f9SDavid du Colombier 133906943f9SDavid du Colombier extern Usbfs usbdfsops; 134