// SPDX-License-Identifier: GPL-2.0 /* * Wireless USB Wire Adapter constants and structures. * * Copyright (C) 2005-2006 Intel Corporation. * Inaky Perez-Gonzalez * * 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, RPIPE_STALL = 0x2, }; /* 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 */ union { u8 dwa_bHSHubAddress; /* rw: DWA. */ u8 hwa_bMaxBurst; /* rw: HWA. */ }; union { u8 dwa_bHSHubPort; /* rw: DWA. */ u8 hwa_bDeviceInfoIndex; /* rw: HWA. */ }; u8 bSpeed; /* rw: xfer rate 'enum uwb_phy_rate' */ union { u8 dwa_bDeviceAddress; /* rw: DWA Target device address. */ u8 hwa_reserved; /* rw: HWA. */ }; 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 */ } __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[]; } __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, WA_XFER_ISO_PACKET_INFO = 0xA0, WA_XFER_ISO_PACKET_STATUS = 0xA1, }; /* [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; } __packed; struct wa_xfer_ctl { struct wa_xfer_hdr hdr; u8 bmAttribute; __le16 wReserved; struct usb_ctrlrequest baSetupData; } __packed; struct wa_xfer_bi { struct wa_xfer_hdr hdr; u8 bReserved; __le16 wReserved; } __packed; /* [WUSB] section 8.5.5 */ struct wa_xfer_hwaiso { struct wa_xfer_hdr hdr; u8 bReserved; __le16 wPresentationTime; __le32 dwNumOfPackets; } __packed; struct wa_xfer_packet_info_hwaiso { __le16 wLength; u8 bPacketType; u8 bReserved; __le16 PacketLength[0]; } __packed; struct wa_xfer_packet_status_len_hwaiso { __le16 PacketLength; __le16 PacketStatus; } __packed; struct wa_xfer_packet_status_hwaiso { __le16 wLength; u8 bPacketType; u8 bReserved; struct wa_xfer_packet_status_len_hwaiso PacketStatus[0]; } __packed; /* [WUSB] section 8.3.3.5 */ struct wa_xfer_abort { u8 bLength; u8 bRequestType; __le16 wRPipe; /* RPipe index */ __le32 dwTransferID; /* Host-assigned ID */ } __packed; /** * WA Transfer Complete notification ([WUSB] section 8.3.3.3) * */ struct wa_notif_xfer { struct wa_notif_hdr hdr; u8 bEndpoint; u8 Reserved; } __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; } __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; __le16 bcdWAVersion; u8 bNumPorts; /* don't use!! */ u8 bmAttributes; /* Reserved == 0 */ __le16 wNumRPipes; __le16 wRPipeMaxBlock; u8 bRPipeBlockSize; u8 bPwrOn2PwrGood; u8 bNumMMCIEs; u8 DeviceRemovable; /* FIXME: in DWA this is up to 16 bytes */ } __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; } __packed; #endif /* #ifndef __LINUX_USB_WUSB_WA_H */