|  | /* | 
|  | * Wireless USB Wire Adapter constants and structures. | 
|  | * | 
|  | * Copyright (C) 2005-2006 Intel Corporation. | 
|  | * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU General Public License version | 
|  | * 2 as published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License | 
|  | * along with this program; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | 
|  | * 02110-1301, USA. | 
|  | * | 
|  | * | 
|  | * FIXME: docs | 
|  | * FIXME: organize properly, group logically | 
|  | * | 
|  | * All the event structures are defined in uwb/spec.h, as they are | 
|  | * common to the WHCI and WUSB radio control interfaces. | 
|  | * | 
|  | * References: | 
|  | *   [WUSB] Wireless Universal Serial Bus Specification, revision 1.0, ch8 | 
|  | */ | 
|  | #ifndef __LINUX_USB_WUSB_WA_H | 
|  | #define __LINUX_USB_WUSB_WA_H | 
|  |  | 
|  | /** | 
|  | * Radio Command Request for the Radio Control Interface | 
|  | * | 
|  | * Radio Control Interface command and event codes are the same as | 
|  | * WHCI, and listed in include/linux/uwb.h:UWB_RC_{CMD,EVT}_* | 
|  | */ | 
|  | enum { | 
|  | WA_EXEC_RC_CMD = 40,	/* Radio Control command Request */ | 
|  | }; | 
|  |  | 
|  | /* Wireless Adapter Requests ([WUSB] table 8-51) */ | 
|  | enum { | 
|  | WUSB_REQ_ADD_MMC_IE     = 20, | 
|  | WUSB_REQ_REMOVE_MMC_IE  = 21, | 
|  | WUSB_REQ_SET_NUM_DNTS   = 22, | 
|  | WUSB_REQ_SET_CLUSTER_ID = 23, | 
|  | WUSB_REQ_SET_DEV_INFO   = 24, | 
|  | WUSB_REQ_GET_TIME       = 25, | 
|  | WUSB_REQ_SET_STREAM_IDX = 26, | 
|  | WUSB_REQ_SET_WUSB_MAS   = 27, | 
|  | WUSB_REQ_CHAN_STOP      = 28, | 
|  | }; | 
|  |  | 
|  |  | 
|  | /* Wireless Adapter WUSB Channel Time types ([WUSB] table 8-52) */ | 
|  | enum { | 
|  | WUSB_TIME_ADJ   = 0, | 
|  | WUSB_TIME_BPST  = 1, | 
|  | WUSB_TIME_WUSB  = 2, | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | WA_ENABLE = 0x01, | 
|  | WA_RESET = 0x02, | 
|  | RPIPE_PAUSE = 0x1, | 
|  | }; | 
|  |  | 
|  | /* Responses from Get Status request ([WUSB] section 8.3.1.6) */ | 
|  | enum { | 
|  | WA_STATUS_ENABLED = 0x01, | 
|  | WA_STATUS_RESETTING = 0x02 | 
|  | }; | 
|  |  | 
|  | enum rpipe_crs { | 
|  | RPIPE_CRS_CTL = 0x01, | 
|  | RPIPE_CRS_ISO = 0x02, | 
|  | RPIPE_CRS_BULK = 0x04, | 
|  | RPIPE_CRS_INTR = 0x08 | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * RPipe descriptor ([WUSB] section 8.5.2.11) | 
|  | * | 
|  | * FIXME: explain rpipes | 
|  | */ | 
|  | struct usb_rpipe_descriptor { | 
|  | u8 	bLength; | 
|  | u8	bDescriptorType; | 
|  | __le16  wRPipeIndex; | 
|  | __le16	wRequests; | 
|  | __le16	wBlocks;		/* rw if 0 */ | 
|  | __le16	wMaxPacketSize;		/* rw? */ | 
|  | u8	bHSHubAddress;		/* reserved: 0 */ | 
|  | u8	bHSHubPort;		/* ??? FIXME ??? */ | 
|  | u8	bSpeed;			/* rw: xfer rate 'enum uwb_phy_rate' */ | 
|  | u8	bDeviceAddress;		/* rw: Target device address */ | 
|  | u8	bEndpointAddress;	/* rw: Target EP address */ | 
|  | u8	bDataSequence;		/* ro: Current Data sequence */ | 
|  | __le32	dwCurrentWindow;	/* ro */ | 
|  | u8	bMaxDataSequence;	/* ro?: max supported seq */ | 
|  | u8	bInterval;		/* rw:  */ | 
|  | u8	bOverTheAirInterval;	/* rw:  */ | 
|  | u8	bmAttribute;		/* ro?  */ | 
|  | u8	bmCharacteristics;	/* ro? enum rpipe_attr, supported xsactions */ | 
|  | u8	bmRetryOptions;		/* rw? */ | 
|  | __le16	wNumTransactionErrors;	/* rw */ | 
|  | } __attribute__ ((packed)); | 
|  |  | 
|  | /** | 
|  | * Wire Adapter Notification types ([WUSB] sections 8.4.5 & 8.5.4) | 
|  | * | 
|  | * These are the notifications coming on the notification endpoint of | 
|  | * an HWA and a DWA. | 
|  | */ | 
|  | enum wa_notif_type { | 
|  | DWA_NOTIF_RWAKE = 0x91, | 
|  | DWA_NOTIF_PORTSTATUS = 0x92, | 
|  | WA_NOTIF_TRANSFER = 0x93, | 
|  | HWA_NOTIF_BPST_ADJ = 0x94, | 
|  | HWA_NOTIF_DN = 0x95, | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Wire Adapter notification header | 
|  | * | 
|  | * Notifications coming from a wire adapter use a common header | 
|  | * defined in [WUSB] sections 8.4.5 & 8.5.4. | 
|  | */ | 
|  | struct wa_notif_hdr { | 
|  | u8 bLength; | 
|  | u8 bNotifyType;			/* enum wa_notif_type */ | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /** | 
|  | * HWA DN Received notification [(WUSB] section 8.5.4.2) | 
|  | * | 
|  | * The DNData is specified in WUSB1.0[7.6]. For each device | 
|  | * notification we received, we just need to dispatch it. | 
|  | * | 
|  | * @dndata:  this is really an array of notifications, but all start | 
|  | *           with the same header. | 
|  | */ | 
|  | struct hwa_notif_dn { | 
|  | struct wa_notif_hdr hdr; | 
|  | u8 bSourceDeviceAddr;		/* from errata 2005/07 */ | 
|  | u8 bmAttributes; | 
|  | struct wusb_dn_hdr dndata[]; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /* [WUSB] section 8.3.3 */ | 
|  | enum wa_xfer_type { | 
|  | WA_XFER_TYPE_CTL = 0x80, | 
|  | WA_XFER_TYPE_BI = 0x81,		/* bulk/interrupt */ | 
|  | WA_XFER_TYPE_ISO = 0x82, | 
|  | WA_XFER_RESULT = 0x83, | 
|  | WA_XFER_ABORT = 0x84, | 
|  | }; | 
|  |  | 
|  | /* [WUSB] section 8.3.3 */ | 
|  | struct wa_xfer_hdr { | 
|  | u8 bLength;			/* 0x18 */ | 
|  | u8 bRequestType;		/* 0x80 WA_REQUEST_TYPE_CTL */ | 
|  | __le16 wRPipe;			/* RPipe index */ | 
|  | __le32 dwTransferID;		/* Host-assigned ID */ | 
|  | __le32 dwTransferLength;	/* Length of data to xfer */ | 
|  | u8 bTransferSegment; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | struct wa_xfer_ctl { | 
|  | struct wa_xfer_hdr hdr; | 
|  | u8 bmAttribute; | 
|  | __le16 wReserved; | 
|  | struct usb_ctrlrequest baSetupData; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | struct wa_xfer_bi { | 
|  | struct wa_xfer_hdr hdr; | 
|  | u8 bReserved; | 
|  | __le16 wReserved; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | struct wa_xfer_hwaiso { | 
|  | struct wa_xfer_hdr hdr; | 
|  | u8 bReserved; | 
|  | __le16 wPresentationTime; | 
|  | __le32 dwNumOfPackets; | 
|  | /* FIXME: u8 pktdata[]? */ | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /* [WUSB] section 8.3.3.5 */ | 
|  | struct wa_xfer_abort { | 
|  | u8 bLength; | 
|  | u8 bRequestType; | 
|  | __le16 wRPipe;			/* RPipe index */ | 
|  | __le32 dwTransferID;		/* Host-assigned ID */ | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /** | 
|  | * WA Transfer Complete notification ([WUSB] section 8.3.3.3) | 
|  | * | 
|  | */ | 
|  | struct wa_notif_xfer { | 
|  | struct wa_notif_hdr hdr; | 
|  | u8 bEndpoint; | 
|  | u8 Reserved; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /** Transfer result basic codes [WUSB] table 8-15 */ | 
|  | enum { | 
|  | WA_XFER_STATUS_SUCCESS, | 
|  | WA_XFER_STATUS_HALTED, | 
|  | WA_XFER_STATUS_DATA_BUFFER_ERROR, | 
|  | WA_XFER_STATUS_BABBLE, | 
|  | WA_XFER_RESERVED, | 
|  | WA_XFER_STATUS_NOT_FOUND, | 
|  | WA_XFER_STATUS_INSUFFICIENT_RESOURCE, | 
|  | WA_XFER_STATUS_TRANSACTION_ERROR, | 
|  | WA_XFER_STATUS_ABORTED, | 
|  | WA_XFER_STATUS_RPIPE_NOT_READY, | 
|  | WA_XFER_INVALID_FORMAT, | 
|  | WA_XFER_UNEXPECTED_SEGMENT_NUMBER, | 
|  | WA_XFER_STATUS_RPIPE_TYPE_MISMATCH, | 
|  | }; | 
|  |  | 
|  | /** [WUSB] section 8.3.3.4 */ | 
|  | struct wa_xfer_result { | 
|  | struct wa_notif_hdr hdr; | 
|  | __le32 dwTransferID; | 
|  | __le32 dwTransferLength; | 
|  | u8     bTransferSegment; | 
|  | u8     bTransferStatus; | 
|  | __le32 dwNumOfPackets; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /** | 
|  | * Wire Adapter Class Descriptor ([WUSB] section 8.5.2.7). | 
|  | * | 
|  | * NOTE: u16 fields are read Little Endian from the hardware. | 
|  | * | 
|  | * @bNumPorts is the original max number of devices that the host can | 
|  | *            connect; we might chop this so the stack can handle | 
|  | *            it. In case you need to access it, use wusbhc->ports_max | 
|  | *            if it is a Wireless USB WA. | 
|  | */ | 
|  | struct usb_wa_descriptor { | 
|  | u8	bLength; | 
|  | u8	bDescriptorType; | 
|  | u16	bcdWAVersion; | 
|  | u8	bNumPorts;		/* don't use!! */ | 
|  | u8	bmAttributes;		/* Reserved == 0 */ | 
|  | u16	wNumRPipes; | 
|  | u16	wRPipeMaxBlock; | 
|  | u8	bRPipeBlockSize; | 
|  | u8	bPwrOn2PwrGood; | 
|  | u8	bNumMMCIEs; | 
|  | u8	DeviceRemovable;	/* FIXME: in DWA this is up to 16 bytes */ | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | /** | 
|  | * HWA Device Information Buffer (WUSB1.0[T8.54]) | 
|  | */ | 
|  | struct hwa_dev_info { | 
|  | u8	bmDeviceAvailability[32];       /* FIXME: ignored for now */ | 
|  | u8	bDeviceAddress; | 
|  | __le16	wPHYRates; | 
|  | u8	bmDeviceAttribute; | 
|  | } __attribute__((packed)); | 
|  |  | 
|  | #endif /* #ifndef __LINUX_USB_WUSB_WA_H */ |