| 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 */ |