linux/include/linux/usb/wusb-wa.h
<<
>>
Prefs
   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 */
  40enum {
  41        WA_EXEC_RC_CMD = 40,    /* Radio Control command Request */
  42};
  43
  44/* Wireless Adapter Requests ([WUSB] table 8-51) */
  45enum {
  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,
  54        WUSB_REQ_CHAN_STOP      = 28,
  55};
  56
  57
  58/* Wireless Adapter WUSB Channel Time types ([WUSB] table 8-52) */
  59enum {
  60        WUSB_TIME_ADJ   = 0,
  61        WUSB_TIME_BPST  = 1,
  62        WUSB_TIME_WUSB  = 2,
  63};
  64
  65enum {
  66        WA_ENABLE = 0x01,
  67        WA_RESET = 0x02,
  68        RPIPE_PAUSE = 0x1,
  69        RPIPE_STALL = 0x2,
  70};
  71
  72/* Responses from Get Status request ([WUSB] section 8.3.1.6) */
  73enum {
  74        WA_STATUS_ENABLED = 0x01,
  75        WA_STATUS_RESETTING = 0x02
  76};
  77
  78enum rpipe_crs {
  79        RPIPE_CRS_CTL = 0x01,
  80        RPIPE_CRS_ISO = 0x02,
  81        RPIPE_CRS_BULK = 0x04,
  82        RPIPE_CRS_INTR = 0x08
  83};
  84
  85/**
  86 * RPipe descriptor ([WUSB] section 8.5.2.11)
  87 *
  88 * FIXME: explain rpipes
  89 */
  90struct usb_rpipe_descriptor {
  91        u8      bLength;
  92        u8      bDescriptorType;
  93        __le16  wRPipeIndex;
  94        __le16  wRequests;
  95        __le16  wBlocks;                /* rw if 0 */
  96        __le16  wMaxPacketSize;         /* rw */
  97        union {
  98                u8      dwa_bHSHubAddress;              /* rw: DWA. */
  99                u8      hwa_bMaxBurst;                  /* rw: HWA. */
 100        };
 101        union {
 102                u8      dwa_bHSHubPort;         /*  rw: DWA. */
 103                u8      hwa_bDeviceInfoIndex;   /*  rw: HWA. */
 104        };
 105        u8      bSpeed;                 /* rw: xfer rate 'enum uwb_phy_rate' */
 106        union {
 107                u8 dwa_bDeviceAddress;  /* rw: DWA Target device address. */
 108                u8 hwa_reserved;                /* rw: HWA. */
 109        };
 110        u8      bEndpointAddress;       /* rw: Target EP address */
 111        u8      bDataSequence;          /* ro: Current Data sequence */
 112        __le32  dwCurrentWindow;        /* ro */
 113        u8      bMaxDataSequence;       /* ro?: max supported seq */
 114        u8      bInterval;              /* rw:  */
 115        u8      bOverTheAirInterval;    /* rw:  */
 116        u8      bmAttribute;            /* ro?  */
 117        u8      bmCharacteristics;      /* ro? enum rpipe_attr, supported xsactions */
 118        u8      bmRetryOptions;         /* rw? */
 119        __le16  wNumTransactionErrors;  /* rw */
 120} __attribute__ ((packed));
 121
 122/**
 123 * Wire Adapter Notification types ([WUSB] sections 8.4.5 & 8.5.4)
 124 *
 125 * These are the notifications coming on the notification endpoint of
 126 * an HWA and a DWA.
 127 */
 128enum wa_notif_type {
 129        DWA_NOTIF_RWAKE = 0x91,
 130        DWA_NOTIF_PORTSTATUS = 0x92,
 131        WA_NOTIF_TRANSFER = 0x93,
 132        HWA_NOTIF_BPST_ADJ = 0x94,
 133        HWA_NOTIF_DN = 0x95,
 134};
 135
 136/**
 137 * Wire Adapter notification header
 138 *
 139 * Notifications coming from a wire adapter use a common header
 140 * defined in [WUSB] sections 8.4.5 & 8.5.4.
 141 */
 142struct wa_notif_hdr {
 143        u8 bLength;
 144        u8 bNotifyType;                 /* enum wa_notif_type */
 145} __packed;
 146
 147/**
 148 * HWA DN Received notification [(WUSB] section 8.5.4.2)
 149 *
 150 * The DNData is specified in WUSB1.0[7.6]. For each device
 151 * notification we received, we just need to dispatch it.
 152 *
 153 * @dndata:  this is really an array of notifications, but all start
 154 *           with the same header.
 155 */
 156struct hwa_notif_dn {
 157        struct wa_notif_hdr hdr;
 158        u8 bSourceDeviceAddr;           /* from errata 2005/07 */
 159        u8 bmAttributes;
 160        struct wusb_dn_hdr dndata[];
 161} __packed;
 162
 163/* [WUSB] section 8.3.3 */
 164enum wa_xfer_type {
 165        WA_XFER_TYPE_CTL = 0x80,
 166        WA_XFER_TYPE_BI = 0x81,         /* bulk/interrupt */
 167        WA_XFER_TYPE_ISO = 0x82,
 168        WA_XFER_RESULT = 0x83,
 169        WA_XFER_ABORT = 0x84,
 170        WA_XFER_ISO_PACKET_INFO = 0xA0,
 171        WA_XFER_ISO_PACKET_STATUS = 0xA1,
 172};
 173
 174/* [WUSB] section 8.3.3 */
 175struct wa_xfer_hdr {
 176        u8 bLength;                     /* 0x18 */
 177        u8 bRequestType;                /* 0x80 WA_REQUEST_TYPE_CTL */
 178        __le16 wRPipe;                  /* RPipe index */
 179        __le32 dwTransferID;            /* Host-assigned ID */
 180        __le32 dwTransferLength;        /* Length of data to xfer */
 181        u8 bTransferSegment;
 182} __packed;
 183
 184struct wa_xfer_ctl {
 185        struct wa_xfer_hdr hdr;
 186        u8 bmAttribute;
 187        __le16 wReserved;
 188        struct usb_ctrlrequest baSetupData;
 189} __packed;
 190
 191struct wa_xfer_bi {
 192        struct wa_xfer_hdr hdr;
 193        u8 bReserved;
 194        __le16 wReserved;
 195} __packed;
 196
 197/* [WUSB] section 8.5.5 */
 198struct wa_xfer_hwaiso {
 199        struct wa_xfer_hdr hdr;
 200        u8 bReserved;
 201        __le16 wPresentationTime;
 202        __le32 dwNumOfPackets;
 203} __packed;
 204
 205struct wa_xfer_packet_info_hwaiso {
 206        __le16 wLength;
 207        u8 bPacketType;
 208        u8 bReserved;
 209        __le16 PacketLength[0];
 210} __packed;
 211
 212struct wa_xfer_packet_status_len_hwaiso {
 213        __le16 PacketLength;
 214        __le16 PacketStatus;
 215} __packed;
 216
 217struct wa_xfer_packet_status_hwaiso {
 218        __le16 wLength;
 219        u8 bPacketType;
 220        u8 bReserved;
 221        struct wa_xfer_packet_status_len_hwaiso PacketStatus[0];
 222} __packed;
 223
 224/* [WUSB] section 8.3.3.5 */
 225struct wa_xfer_abort {
 226        u8 bLength;
 227        u8 bRequestType;
 228        __le16 wRPipe;                  /* RPipe index */
 229        __le32 dwTransferID;            /* Host-assigned ID */
 230} __packed;
 231
 232/**
 233 * WA Transfer Complete notification ([WUSB] section 8.3.3.3)
 234 *
 235 */
 236struct wa_notif_xfer {
 237        struct wa_notif_hdr hdr;
 238        u8 bEndpoint;
 239        u8 Reserved;
 240} __packed;
 241
 242/** Transfer result basic codes [WUSB] table 8-15 */
 243enum {
 244        WA_XFER_STATUS_SUCCESS,
 245        WA_XFER_STATUS_HALTED,
 246        WA_XFER_STATUS_DATA_BUFFER_ERROR,
 247        WA_XFER_STATUS_BABBLE,
 248        WA_XFER_RESERVED,
 249        WA_XFER_STATUS_NOT_FOUND,
 250        WA_XFER_STATUS_INSUFFICIENT_RESOURCE,
 251        WA_XFER_STATUS_TRANSACTION_ERROR,
 252        WA_XFER_STATUS_ABORTED,
 253        WA_XFER_STATUS_RPIPE_NOT_READY,
 254        WA_XFER_INVALID_FORMAT,
 255        WA_XFER_UNEXPECTED_SEGMENT_NUMBER,
 256        WA_XFER_STATUS_RPIPE_TYPE_MISMATCH,
 257};
 258
 259/** [WUSB] section 8.3.3.4 */
 260struct wa_xfer_result {
 261        struct wa_notif_hdr hdr;
 262        __le32 dwTransferID;
 263        __le32 dwTransferLength;
 264        u8     bTransferSegment;
 265        u8     bTransferStatus;
 266        __le32 dwNumOfPackets;
 267} __packed;
 268
 269/**
 270 * Wire Adapter Class Descriptor ([WUSB] section 8.5.2.7).
 271 *
 272 * NOTE: u16 fields are read Little Endian from the hardware.
 273 *
 274 * @bNumPorts is the original max number of devices that the host can
 275 *            connect; we might chop this so the stack can handle
 276 *            it. In case you need to access it, use wusbhc->ports_max
 277 *            if it is a Wireless USB WA.
 278 */
 279struct usb_wa_descriptor {
 280        u8      bLength;
 281        u8      bDescriptorType;
 282        __le16  bcdWAVersion;
 283        u8      bNumPorts;              /* don't use!! */
 284        u8      bmAttributes;           /* Reserved == 0 */
 285        __le16  wNumRPipes;
 286        __le16  wRPipeMaxBlock;
 287        u8      bRPipeBlockSize;
 288        u8      bPwrOn2PwrGood;
 289        u8      bNumMMCIEs;
 290        u8      DeviceRemovable;        /* FIXME: in DWA this is up to 16 bytes */
 291} __packed;
 292
 293/**
 294 * HWA Device Information Buffer (WUSB1.0[T8.54])
 295 */
 296struct hwa_dev_info {
 297        u8      bmDeviceAvailability[32];       /* FIXME: ignored for now */
 298        u8      bDeviceAddress;
 299        __le16  wPHYRates;
 300        u8      bmDeviceAttribute;
 301} __packed;
 302
 303#endif /* #ifndef __LINUX_USB_WUSB_WA_H */
 304