| Inaky Perez-Gonzalez | c7f7364 | 2008-09-17 16:34:22 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * Wireless USB Wire Adapter constants and structures. | 
|  | 3 | * | 
|  | 4 | * Copyright (C) 2005-2006 Intel Corporation. | 
|  | 5 | * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | 
|  | 6 | * | 
|  | 7 | * This program is free software; you can redistribute it and/or | 
|  | 8 | * modify it under the terms of the GNU General Public License version | 
|  | 9 | * 2 as published by the Free Software Foundation. | 
|  | 10 | * | 
|  | 11 | * This program is distributed in the hope that it will be useful, | 
|  | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 14 | * GNU General Public License for more details. | 
|  | 15 | * | 
|  | 16 | * You should have received a copy of the GNU General Public License | 
|  | 17 | * along with this program; if not, write to the Free Software | 
|  | 18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | 
|  | 19 | * 02110-1301, USA. | 
|  | 20 | * | 
|  | 21 | * | 
|  | 22 | * FIXME: docs | 
|  | 23 | * FIXME: organize properly, group logically | 
|  | 24 | * | 
|  | 25 | * All the event structures are defined in uwb/spec.h, as they are | 
|  | 26 | * common to the WHCI and WUSB radio control interfaces. | 
|  | 27 | * | 
|  | 28 | * References: | 
|  | 29 | *   [WUSB] Wireless Universal Serial Bus Specification, revision 1.0, ch8 | 
|  | 30 | */ | 
|  | 31 | #ifndef __LINUX_USB_WUSB_WA_H | 
|  | 32 | #define __LINUX_USB_WUSB_WA_H | 
|  | 33 |  | 
|  | 34 | /** | 
|  | 35 | * Radio Command Request for the Radio Control Interface | 
|  | 36 | * | 
|  | 37 | * Radio Control Interface command and event codes are the same as | 
|  | 38 | * WHCI, and listed in include/linux/uwb.h:UWB_RC_{CMD,EVT}_* | 
|  | 39 | */ | 
|  | 40 | enum { | 
|  | 41 | WA_EXEC_RC_CMD = 40,	/* Radio Control command Request */ | 
|  | 42 | }; | 
|  | 43 |  | 
|  | 44 | /* Wireless Adapter Requests ([WUSB] table 8-51) */ | 
|  | 45 | enum { | 
|  | 46 | WUSB_REQ_ADD_MMC_IE     = 20, | 
|  | 47 | WUSB_REQ_REMOVE_MMC_IE  = 21, | 
|  | 48 | WUSB_REQ_SET_NUM_DNTS   = 22, | 
|  | 49 | WUSB_REQ_SET_CLUSTER_ID = 23, | 
|  | 50 | WUSB_REQ_SET_DEV_INFO   = 24, | 
|  | 51 | WUSB_REQ_GET_TIME       = 25, | 
|  | 52 | WUSB_REQ_SET_STREAM_IDX = 26, | 
|  | 53 | WUSB_REQ_SET_WUSB_MAS   = 27, | 
| David Vrabel | 4d2bea4 | 2008-10-27 15:42:31 +0000 | [diff] [blame] | 54 | WUSB_REQ_CHAN_STOP      = 28, | 
| Inaky Perez-Gonzalez | c7f7364 | 2008-09-17 16:34:22 +0100 | [diff] [blame] | 55 | }; | 
|  | 56 |  | 
|  | 57 |  | 
|  | 58 | /* Wireless Adapter WUSB Channel Time types ([WUSB] table 8-52) */ | 
|  | 59 | enum { | 
|  | 60 | WUSB_TIME_ADJ   = 0, | 
|  | 61 | WUSB_TIME_BPST  = 1, | 
|  | 62 | WUSB_TIME_WUSB  = 2, | 
|  | 63 | }; | 
|  | 64 |  | 
|  | 65 | enum { | 
|  | 66 | WA_ENABLE = 0x01, | 
|  | 67 | WA_RESET = 0x02, | 
|  | 68 | RPIPE_PAUSE = 0x1, | 
|  | 69 | }; | 
|  | 70 |  | 
|  | 71 | /* Responses from Get Status request ([WUSB] section 8.3.1.6) */ | 
|  | 72 | enum { | 
|  | 73 | WA_STATUS_ENABLED = 0x01, | 
|  | 74 | WA_STATUS_RESETTING = 0x02 | 
|  | 75 | }; | 
|  | 76 |  | 
|  | 77 | enum rpipe_crs { | 
|  | 78 | RPIPE_CRS_CTL = 0x01, | 
|  | 79 | RPIPE_CRS_ISO = 0x02, | 
|  | 80 | RPIPE_CRS_BULK = 0x04, | 
|  | 81 | RPIPE_CRS_INTR = 0x08 | 
|  | 82 | }; | 
|  | 83 |  | 
|  | 84 | /** | 
|  | 85 | * RPipe descriptor ([WUSB] section 8.5.2.11) | 
|  | 86 | * | 
|  | 87 | * FIXME: explain rpipes | 
|  | 88 | */ | 
|  | 89 | struct usb_rpipe_descriptor { | 
| Greg Kroah-Hartman | 0858a3a | 2010-05-17 10:58:12 -0700 | [diff] [blame] | 90 | u8	bLength; | 
| Inaky Perez-Gonzalez | c7f7364 | 2008-09-17 16:34:22 +0100 | [diff] [blame] | 91 | u8	bDescriptorType; | 
|  | 92 | __le16  wRPipeIndex; | 
|  | 93 | __le16	wRequests; | 
|  | 94 | __le16	wBlocks;		/* rw if 0 */ | 
|  | 95 | __le16	wMaxPacketSize;		/* rw? */ | 
|  | 96 | u8	bHSHubAddress;		/* reserved: 0 */ | 
|  | 97 | u8	bHSHubPort;		/* ??? FIXME ??? */ | 
|  | 98 | u8	bSpeed;			/* rw: xfer rate 'enum uwb_phy_rate' */ | 
|  | 99 | u8	bDeviceAddress;		/* rw: Target device address */ | 
|  | 100 | u8	bEndpointAddress;	/* rw: Target EP address */ | 
|  | 101 | u8	bDataSequence;		/* ro: Current Data sequence */ | 
|  | 102 | __le32	dwCurrentWindow;	/* ro */ | 
|  | 103 | u8	bMaxDataSequence;	/* ro?: max supported seq */ | 
|  | 104 | u8	bInterval;		/* rw:  */ | 
|  | 105 | u8	bOverTheAirInterval;	/* rw:  */ | 
|  | 106 | u8	bmAttribute;		/* ro?  */ | 
|  | 107 | u8	bmCharacteristics;	/* ro? enum rpipe_attr, supported xsactions */ | 
|  | 108 | u8	bmRetryOptions;		/* rw? */ | 
|  | 109 | __le16	wNumTransactionErrors;	/* rw */ | 
|  | 110 | } __attribute__ ((packed)); | 
|  | 111 |  | 
|  | 112 | /** | 
|  | 113 | * Wire Adapter Notification types ([WUSB] sections 8.4.5 & 8.5.4) | 
|  | 114 | * | 
|  | 115 | * These are the notifications coming on the notification endpoint of | 
|  | 116 | * an HWA and a DWA. | 
|  | 117 | */ | 
|  | 118 | enum wa_notif_type { | 
|  | 119 | DWA_NOTIF_RWAKE = 0x91, | 
|  | 120 | DWA_NOTIF_PORTSTATUS = 0x92, | 
|  | 121 | WA_NOTIF_TRANSFER = 0x93, | 
|  | 122 | HWA_NOTIF_BPST_ADJ = 0x94, | 
|  | 123 | HWA_NOTIF_DN = 0x95, | 
|  | 124 | }; | 
|  | 125 |  | 
|  | 126 | /** | 
|  | 127 | * Wire Adapter notification header | 
|  | 128 | * | 
|  | 129 | * Notifications coming from a wire adapter use a common header | 
|  | 130 | * defined in [WUSB] sections 8.4.5 & 8.5.4. | 
|  | 131 | */ | 
|  | 132 | struct wa_notif_hdr { | 
|  | 133 | u8 bLength; | 
|  | 134 | u8 bNotifyType;			/* enum wa_notif_type */ | 
|  | 135 | } __attribute__((packed)); | 
|  | 136 |  | 
|  | 137 | /** | 
|  | 138 | * HWA DN Received notification [(WUSB] section 8.5.4.2) | 
|  | 139 | * | 
|  | 140 | * The DNData is specified in WUSB1.0[7.6]. For each device | 
|  | 141 | * notification we received, we just need to dispatch it. | 
|  | 142 | * | 
|  | 143 | * @dndata:  this is really an array of notifications, but all start | 
|  | 144 | *           with the same header. | 
|  | 145 | */ | 
|  | 146 | struct hwa_notif_dn { | 
|  | 147 | struct wa_notif_hdr hdr; | 
|  | 148 | u8 bSourceDeviceAddr;		/* from errata 2005/07 */ | 
|  | 149 | u8 bmAttributes; | 
|  | 150 | struct wusb_dn_hdr dndata[]; | 
|  | 151 | } __attribute__((packed)); | 
|  | 152 |  | 
|  | 153 | /* [WUSB] section 8.3.3 */ | 
|  | 154 | enum wa_xfer_type { | 
|  | 155 | WA_XFER_TYPE_CTL = 0x80, | 
|  | 156 | WA_XFER_TYPE_BI = 0x81,		/* bulk/interrupt */ | 
|  | 157 | WA_XFER_TYPE_ISO = 0x82, | 
|  | 158 | WA_XFER_RESULT = 0x83, | 
|  | 159 | WA_XFER_ABORT = 0x84, | 
|  | 160 | }; | 
|  | 161 |  | 
|  | 162 | /* [WUSB] section 8.3.3 */ | 
|  | 163 | struct wa_xfer_hdr { | 
|  | 164 | u8 bLength;			/* 0x18 */ | 
|  | 165 | u8 bRequestType;		/* 0x80 WA_REQUEST_TYPE_CTL */ | 
|  | 166 | __le16 wRPipe;			/* RPipe index */ | 
|  | 167 | __le32 dwTransferID;		/* Host-assigned ID */ | 
|  | 168 | __le32 dwTransferLength;	/* Length of data to xfer */ | 
|  | 169 | u8 bTransferSegment; | 
|  | 170 | } __attribute__((packed)); | 
|  | 171 |  | 
|  | 172 | struct wa_xfer_ctl { | 
|  | 173 | struct wa_xfer_hdr hdr; | 
|  | 174 | u8 bmAttribute; | 
|  | 175 | __le16 wReserved; | 
|  | 176 | struct usb_ctrlrequest baSetupData; | 
|  | 177 | } __attribute__((packed)); | 
|  | 178 |  | 
|  | 179 | struct wa_xfer_bi { | 
|  | 180 | struct wa_xfer_hdr hdr; | 
|  | 181 | u8 bReserved; | 
|  | 182 | __le16 wReserved; | 
|  | 183 | } __attribute__((packed)); | 
|  | 184 |  | 
|  | 185 | struct wa_xfer_hwaiso { | 
|  | 186 | struct wa_xfer_hdr hdr; | 
|  | 187 | u8 bReserved; | 
|  | 188 | __le16 wPresentationTime; | 
|  | 189 | __le32 dwNumOfPackets; | 
|  | 190 | /* FIXME: u8 pktdata[]? */ | 
|  | 191 | } __attribute__((packed)); | 
|  | 192 |  | 
|  | 193 | /* [WUSB] section 8.3.3.5 */ | 
|  | 194 | struct wa_xfer_abort { | 
|  | 195 | u8 bLength; | 
|  | 196 | u8 bRequestType; | 
|  | 197 | __le16 wRPipe;			/* RPipe index */ | 
|  | 198 | __le32 dwTransferID;		/* Host-assigned ID */ | 
|  | 199 | } __attribute__((packed)); | 
|  | 200 |  | 
|  | 201 | /** | 
|  | 202 | * WA Transfer Complete notification ([WUSB] section 8.3.3.3) | 
|  | 203 | * | 
|  | 204 | */ | 
|  | 205 | struct wa_notif_xfer { | 
|  | 206 | struct wa_notif_hdr hdr; | 
|  | 207 | u8 bEndpoint; | 
|  | 208 | u8 Reserved; | 
|  | 209 | } __attribute__((packed)); | 
|  | 210 |  | 
|  | 211 | /** Transfer result basic codes [WUSB] table 8-15 */ | 
|  | 212 | enum { | 
|  | 213 | WA_XFER_STATUS_SUCCESS, | 
|  | 214 | WA_XFER_STATUS_HALTED, | 
|  | 215 | WA_XFER_STATUS_DATA_BUFFER_ERROR, | 
|  | 216 | WA_XFER_STATUS_BABBLE, | 
|  | 217 | WA_XFER_RESERVED, | 
|  | 218 | WA_XFER_STATUS_NOT_FOUND, | 
|  | 219 | WA_XFER_STATUS_INSUFFICIENT_RESOURCE, | 
|  | 220 | WA_XFER_STATUS_TRANSACTION_ERROR, | 
|  | 221 | WA_XFER_STATUS_ABORTED, | 
|  | 222 | WA_XFER_STATUS_RPIPE_NOT_READY, | 
|  | 223 | WA_XFER_INVALID_FORMAT, | 
|  | 224 | WA_XFER_UNEXPECTED_SEGMENT_NUMBER, | 
|  | 225 | WA_XFER_STATUS_RPIPE_TYPE_MISMATCH, | 
|  | 226 | }; | 
|  | 227 |  | 
|  | 228 | /** [WUSB] section 8.3.3.4 */ | 
|  | 229 | struct wa_xfer_result { | 
|  | 230 | struct wa_notif_hdr hdr; | 
|  | 231 | __le32 dwTransferID; | 
|  | 232 | __le32 dwTransferLength; | 
|  | 233 | u8     bTransferSegment; | 
|  | 234 | u8     bTransferStatus; | 
|  | 235 | __le32 dwNumOfPackets; | 
|  | 236 | } __attribute__((packed)); | 
|  | 237 |  | 
|  | 238 | /** | 
|  | 239 | * Wire Adapter Class Descriptor ([WUSB] section 8.5.2.7). | 
|  | 240 | * | 
|  | 241 | * NOTE: u16 fields are read Little Endian from the hardware. | 
|  | 242 | * | 
|  | 243 | * @bNumPorts is the original max number of devices that the host can | 
|  | 244 | *            connect; we might chop this so the stack can handle | 
|  | 245 | *            it. In case you need to access it, use wusbhc->ports_max | 
|  | 246 | *            if it is a Wireless USB WA. | 
|  | 247 | */ | 
|  | 248 | struct usb_wa_descriptor { | 
|  | 249 | u8	bLength; | 
|  | 250 | u8	bDescriptorType; | 
|  | 251 | u16	bcdWAVersion; | 
|  | 252 | u8	bNumPorts;		/* don't use!! */ | 
|  | 253 | u8	bmAttributes;		/* Reserved == 0 */ | 
|  | 254 | u16	wNumRPipes; | 
|  | 255 | u16	wRPipeMaxBlock; | 
|  | 256 | u8	bRPipeBlockSize; | 
|  | 257 | u8	bPwrOn2PwrGood; | 
|  | 258 | u8	bNumMMCIEs; | 
|  | 259 | u8	DeviceRemovable;	/* FIXME: in DWA this is up to 16 bytes */ | 
|  | 260 | } __attribute__((packed)); | 
|  | 261 |  | 
|  | 262 | /** | 
|  | 263 | * HWA Device Information Buffer (WUSB1.0[T8.54]) | 
|  | 264 | */ | 
|  | 265 | struct hwa_dev_info { | 
|  | 266 | u8	bmDeviceAvailability[32];       /* FIXME: ignored for now */ | 
|  | 267 | u8	bDeviceAddress; | 
|  | 268 | __le16	wPHYRates; | 
|  | 269 | u8	bmDeviceAttribute; | 
|  | 270 | } __attribute__((packed)); | 
|  | 271 |  | 
|  | 272 | #endif /* #ifndef __LINUX_USB_WUSB_WA_H */ |