1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #ifndef _SYS_UWB_UWB_H
  27 #define _SYS_UWB_UWB_H
  28 
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 /*
  35  * IOCTLs and related data structures for UWB Radio Controller drivers.
  36  */
  37 
  38 /* IOCTLs */
  39 #define UWB_IOCTL_BASE                  0x1000
  40 #define UWB_COMMAND                     (UWB_IOCTL_BASE + 0x1)
  41 #define UWB_GET_NOTIFICATION            (UWB_IOCTL_BASE + 0x2)
  42 
  43 #define UWB_CE_TYPE_GENERAL 0           /* General Command/Event type */
  44 
  45 /*
  46  * UWB Radio Controller Commands and Events:
  47  *
  48  * See WUSB spec 1.0 [Table 8-68]
  49  * See WHCI 0.95 [Table 3-2],[Table 3-5]
  50  */
  51 /* Commands */
  52 #define UWB_CE_CHANNEL_CHANGE                   16
  53 #define UWB_CE_DEV_ADDR_MGMT                    17
  54 #define UWB_CE_GET_IE                           18
  55 #define UWB_CE_RESET                            19
  56 #define UWB_CE_SCAN                             20
  57 #define UWB_CE_SET_BEACON_FILTER                21
  58 #define UWB_CE_SET_DRP_IE                       22
  59 #define UWB_CE_SET_IE                           23
  60 #define UWB_CE_SET_NOTIFICATION_FILTER          24
  61 #define UWB_CE_SET_TX_POWER                     25
  62 #define UWB_CE_SLEEP                            26
  63 #define UWB_CE_START_BEACON                     27
  64 #define UWB_CE_STOP_BEACON                      28
  65 #define UWB_CE_BP_MERGE                         29
  66 #define UWB_CE_SEND_COMMAND_FRAME               30
  67 #define UWB_CE_SET_ASIE_NOTIFICATION            31
  68 
  69 /* Notifications */
  70 #define UWB_NOTIF_IE_RECEIVED                   0
  71 #define UWB_NOTIF_BEACON_RECEIVED               1
  72 #define UWB_NOTIF_BEACON_SIZE_CHANGE            2
  73 #define UWB_NOTIF_BPOIE_CHANGE                  3
  74 #define UWB_NOTIF_BP_SLOT_CHANGE                4
  75 #define UWB_NOTIF_BP_SWITCH_IE_RECEIVED         5
  76 #define UWB_NOTIF_DEV_ADDR_CONFLICT             6
  77 #define UWB_NOTIF_DRP_AVAILABILITY_CHANGE       7
  78 #define UWB_NOTIF_DRP                           8
  79 #define UWB_NOTIF_BP_SWITCH_STATUS              9
  80 #define UWB_NOTIF_CMD_FRAME_RCV                 10
  81 #define UWB_NOTIF_CHANNEL_CHANGE_IE_RCV         11
  82 #define UWB_NOTIF_RESERVED                      12
  83 
  84 /*
  85  * Scan types.
  86  * WUSB spec 1.0 [Table 8-78. Scan RCCB]
  87  * WHCI 0.95 [Table 3-14. Scan RCCB Format]
  88  */
  89 #define UWB_RC_SCAN_ONLY                        0
  90 #define UWB_RC_SCAN_OUTSIDE_BP                  1
  91 #define UWB_RC_SCAN_WHILE_INACTIVE              2
  92 #define UWB_RC_SCAN_DISABLED                    3
  93 #define UWB_RC_SCAN_ONLY_STARTTIME              4
  94 
  95 /*
  96  * See ECMA-368 [7.2.2 Device address]
  97  * Individual MAC sublayers are addressed via an EUI-48 [I3]
  98  * DevAddrs are 16-bit values
  99  */
 100 typedef struct uwb_mac_addr {
 101         uint8_t addr[6];
 102 } uwb_mac_addr_t;
 103 
 104 typedef struct uwb_dev_addr {
 105         uint8_t addr[2];
 106 } uwb_dev_addr_t;
 107 
 108 /*
 109  * See ECMA-368 [16.8.6]
 110  * One superframe has 256 Medium Access Slots.
 111  * One superframe has 16 zones.
 112  */
 113 #define UWB_MAS_NUM 256
 114 #define UWB_ZONE_NUM 16
 115 
 116 /* Type of DRP reservation. ECMA-368 [table 106] */
 117 #define UWB_DRP_TP_ALIEN        0
 118 #define UWB_DRP_TP_HARD         1
 119 #define UWB_DRP_TP_SOFT         2
 120 #define UWB_DRP_TP_PRVT         3
 121 #define UWB_DRP_TP_PCA          4
 122 #define UWB_DRP_TP_RESVD        5
 123 
 124 /* DRP Reasons. ECMA-368 [table 107] */
 125 #define UWB_DRP_RS_ACCEP        0
 126 #define UWB_DRP_RS_CNFLCT       1
 127 #define UWB_DRP_RS_PNDNG        2
 128 #define UWB_DRP_RS_DENI         3
 129 #define UWB_DRP_RS_MODIF        4
 130 #define UWB_DRP_RS_RSEVD        5
 131 
 132 /* Allocation of MAS slots in a DRP request. ECMA-368 */
 133 typedef struct uwb_drp_bm_alloc {
 134         uint16_t zone;
 135         uint16_t mas;
 136 } uwb_drp_bm_alloc_t;
 137 
 138 /*  Information elements. ECMA-368 [Table 104] */
 139 #define UWB_IE_TIM              0
 140 #define UWB_IE_BPO              1
 141 #define UWB_IE_PCA_AVAIL        2
 142 #define UWB_IE_DRP_AVAIL        8
 143 #define UWB_IE_DRP              9
 144 #define UWB_IE_HIB_MODE         10
 145 #define UWB_IE_BP_SWITCH        11
 146 #define UWB_IE_MAC_CAP          12
 147 #define UWB_IE_PHY_CAP          13
 148 #define UWB_IE_PROBE            14
 149 #define UWB_IE_APPSPEC_PROBE    15
 150 #define UWB_IE_LINK_FB          16
 151 #define UWB_IE_HIB_ANCHOR       17
 152 #define UWB_IE_CHNL_CHG         18
 153 #define UWB_IE_IDENT            19
 154 #define UWB_IE_MASTER_KEY_ID    20
 155 #define UWB_IE_RELQ_REQ         21
 156 #define UWB_IE_MAB              22
 157 #define UWB_IE_APP_SPEC         255
 158 
 159 /* UWB Information Element header. ECMA-368 [16.8] */
 160 typedef struct uwb_ie_head {
 161         uint8_t         id;     /* Element ID */
 162         uint8_t         len;    /* Length */
 163 } uwb_ie_head_t;
 164 
 165 /* Dynamic Reservation Protocol IE. ECMA-368 [16.8.6] */
 166 typedef struct uwb_drp_ie {
 167         uwb_ie_head_t           head;
 168         uint16_t                drp_ctrl;
 169         uwb_dev_addr_t          dev_addr;
 170         uwb_drp_bm_alloc_t      allocs[1];
 171 } uwb_drp_ie_t;
 172 
 173 /* Dynamic Reservation Protocol IE. ECMA-368 [16.8.7] */
 174 typedef struct uwb_drp_avail_ie {
 175         uwb_ie_head_t   head;
 176         ulong_t         bitmap[8];
 177 } uwb_drp_avail_ie_t;
 178 
 179 
 180 /* Data structures for UWB commands */
 181 
 182 /* WUSB spec 1.0 [Table 8-65] Radio Control Command Block (RCCB) */
 183 typedef struct uwb_rccb_head {
 184         uint8_t bCommandType;           /* Command Type */
 185         uint16_t wCommand;              /* Command code */
 186         uint8_t bCommandContext;        /* Context ID */
 187 } uwb_rccb_head_t;
 188 
 189 /* Generic RCCB Command */
 190 typedef struct uwb_rccb_cmd {
 191         uwb_rccb_head_t rccb;
 192         uint8_t buf[1];
 193 } uwb_rccb_cmd_t;
 194 
 195 /* WUSB spec 1.0. Table 8-78. Scan RCCB */
 196 typedef struct uwb_rccb_scan {
 197         uwb_rccb_head_t rccb;
 198         uint8_t bChannelNumber;
 199         uint8_t bScanState;
 200         uint16_t wStartTime;
 201 } uwb_rccb_scan_t;
 202 
 203 /* WUSB spec 1.0 Table 8-93. Start Beaconing RCCB */
 204 typedef struct uwb_rccb_start_beacon {
 205         uwb_rccb_head_t rccb;
 206         uint16_t        wBPSTOffset;
 207         uint8_t         bChannelNumber;
 208 } uwb_rccb_start_beacon_t;
 209 
 210 /* WUSB spec 1.0 Table 8-82. Set DRP IE RCCB */
 211 typedef struct uwb_rccb_set_drp_ie {
 212         uwb_rccb_head_t rccb;
 213         uint16_t        wIELength;
 214         uint8_t         IEData[1];
 215 } uwb_rccb_set_drp_ie_t;
 216 
 217 /* WUSB spec 1.0 Table 8-84. Set IE RCCB */
 218 typedef struct uwb_rccb_set_ie {
 219         uwb_rccb_head_t rccb;
 220         uint16_t        wIELength;
 221         uint8_t         IEData[1];
 222 }uwb_rccb_set_ie_t;
 223 
 224 /* WUSB spec 1.0 Table 8-72. Device Address Management RCCB */
 225 typedef struct uwb_rccb_dev_addr_mgmt {
 226         uwb_rccb_head_t rccb;
 227         uint8_t         bmOperationType;
 228         uint8_t         baAddr[6];
 229 } uwb_rccb_dev_addr_mgmt_t;
 230 
 231 /* Data structures for UWB Command results (Events) */
 232 
 233 /*  WUSB spec 1.0 Table 8-66. Radio Control Event Block (RCEB) */
 234 typedef struct uwb_rceb_head {
 235         uint8_t         bEventType;
 236         uint16_t        wEvent;
 237         uint8_t         bEventContext;
 238 } uwb_rceb_head_t;
 239 
 240 /*
 241  * Generic RCEB for commands that returns result code only.
 242  * Including channel change, scan, reset, etc.
 243  */
 244 typedef struct uwb_rceb_result_code {
 245         uwb_rceb_head_t rceb;
 246         uint8_t         bResultCode;
 247 } uwb_rceb_result_code_t;
 248 
 249 /*
 250  * WUSB 1.0 Table 8-73. Device Address Management RCEB
 251  * baAddr should be ignored if the Set bit in the associated
 252  * RCCB is set to 1. The spec is fixed in Errata.
 253  */
 254 typedef struct uwb_rceb_dev_addr_mgmt {
 255         uwb_rceb_head_t rceb;
 256         uint8_t         baAddr[6];
 257         uint8_t         bResultCode;
 258 } uwb_rceb_dev_addr_mgmt_t;
 259 
 260 /* WUSB 1.0 Table 8-75. Get IE RCEB */
 261 typedef struct uwb_rceb_get_ie {
 262         uwb_rceb_head_t rceb;
 263         uint16_t        wIELength;
 264         uint8_t         IEData[1];
 265 } uwb_rceb_get_ie_t;
 266 
 267 /* WUSB 1.0 Table 8-86. Set IE RCEB */
 268 typedef struct uwb_rceb_set_ie {
 269         uwb_rceb_head_t rceb;
 270         uint16_t        RemainingSpace;
 271         uint8_t         bResultCode;
 272 } uwb_rceb_set_ie_t;
 273 
 274 /* WUSB 1.0 Table 8-83. Set DRP IE RCEB */
 275 typedef struct uwb_rceb_set_drp_ie {
 276         uwb_rceb_head_t rceb;
 277         uint16_t        wRemainingSpace;
 278         uint8_t         bResultCode;
 279 } uwb_rceb_set_drp_ie_t;
 280 
 281 
 282 /* Data structures for UWB Notifications */
 283 
 284 /* Notification from device */
 285 typedef struct uwb_rceb_notif {
 286         uwb_rceb_head_t rceb;
 287         uint8_t         buf[1];
 288 } uwb_rceb_notif_t;
 289 
 290 typedef struct uwb_notif_get {
 291         /* wait for milliseconds untile get a notification */
 292         uint_t          timeout;
 293         uwb_rceb_notif_t notif;
 294 } uwb_notif_get_t;
 295 
 296 /*
 297  * UWB_NOTIF_BEACON_RECEIVED, Beacon received notification
 298  * WHCI [3.1.4.2].
 299  * NOTICE:In WUSB Spec, Table 8-98. No bBeaconType. Below follow
 300  * WHCI spec
 301  */
 302 typedef struct uwb_rceb_beacon {
 303         uwb_rceb_head_t rceb;
 304         uint8_t         bChannelNumber;
 305         uint8_t         bBeaconType;
 306         uint16_t        wBPSTOffset;
 307         uint8_t         bLQI;
 308         uint8_t         bRSSI;
 309         uint16_t        wBeaconInfoLength;
 310         uint8_t         BeaconInfo[1];
 311 } uwb_rceb_beacon_t;
 312 
 313 /* MAC Header field values for beacon frames. ECMA 368 [table 96] */
 314 typedef struct uwb_bcfrm_mac_hdr {
 315         uint16_t        Frame_Control;
 316         uwb_dev_addr_t  DestAddr;
 317         uwb_dev_addr_t  SrcAddr;
 318         uint16_t        Sequence_Control;
 319         uint16_t        Access_Information;
 320 } uwb_bcfrm_mac_hdr_t;
 321 
 322 /* Beacon Frame [ECMA-368] page 151 */
 323 typedef struct uwb_beacon_frame {
 324         uwb_bcfrm_mac_hdr_t     hdr;
 325         uwb_mac_addr_t          Device_Identifier;
 326         uint8_t                 Beacon_Slot_Number;
 327         uint8_t                 Device_Control;
 328         uint8_t                 IEData[1];
 329 } uwb_beacon_frame_t;
 330 
 331 /* WUSB 1.0. Table 8-99. Beacon Size Change Notification RCEB */
 332 typedef struct uwb_rceb_beacon_size_change {
 333         uwb_rceb_head_t         rceb;
 334         uint16_t                wNewBeaconSize;
 335 } uwb_rceb_beacon_size_change_t;
 336 
 337 /* WUSB 1.0. Table 8-100. BPOIE Change Notification RCEB */
 338 typedef struct uwb_rceb_bpoie_change {
 339         uwb_rceb_head_t         rceb;
 340         uint16_t                wBPOIELength;
 341         uint8_t                 BPOIE[1];
 342 } uwb_rceb_bpoie_change_t;
 343 
 344 /* WHCI 0.95  Table 3-42. BP Slot Change Notification RCEB Format */
 345 typedef struct uwb_rceb_bp_slot_change {
 346         uwb_rceb_head_t         rceb;
 347         uint8_t                 bNewSlotNumber;
 348 } uwb_rceb_bp_slot_change_t;
 349 
 350 /* WHCI 0.95 Table 3-45. DRP Availability Changed Notification RCEB Format */
 351 typedef struct uwb_rceb_drp_availability {
 352         uwb_rceb_head_t         rceb;
 353         uint8_t                 DRPAvailability[32]; /* 256 bit bitmap */
 354 } uwb_rceb_drp_availability_t;
 355 
 356 /* WHCI 0.95 [3.1.4.9] * Table 3-46. DRP Notification RCEB Format */
 357 typedef struct uwb_rceb_drp {
 358         uwb_rceb_head_t         rceb;
 359         uint16_t                wSrcAddr;
 360         uint8_t                 bReason;
 361         uint8_t                 bBeaconSlotNumber;
 362         uint16_t                wIELength;
 363         uint8_t                 IEData[1];
 364 } uwb_rceb_drp_t;
 365 
 366 
 367 #ifdef __cplusplus
 368 }
 369 #endif
 370 
 371 #endif  /* _SYS_UWB_UWB_H */