1*9430SRaymond.Chen@Sun.COM /* 2*9430SRaymond.Chen@Sun.COM * CDDL HEADER START 3*9430SRaymond.Chen@Sun.COM * 4*9430SRaymond.Chen@Sun.COM * The contents of this file are subject to the terms of the 5*9430SRaymond.Chen@Sun.COM * Common Development and Distribution License (the "License"). 6*9430SRaymond.Chen@Sun.COM * You may not use this file except in compliance with the License. 7*9430SRaymond.Chen@Sun.COM * 8*9430SRaymond.Chen@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*9430SRaymond.Chen@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*9430SRaymond.Chen@Sun.COM * See the License for the specific language governing permissions 11*9430SRaymond.Chen@Sun.COM * and limitations under the License. 12*9430SRaymond.Chen@Sun.COM * 13*9430SRaymond.Chen@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*9430SRaymond.Chen@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*9430SRaymond.Chen@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*9430SRaymond.Chen@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*9430SRaymond.Chen@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*9430SRaymond.Chen@Sun.COM * 19*9430SRaymond.Chen@Sun.COM * CDDL HEADER END 20*9430SRaymond.Chen@Sun.COM */ 21*9430SRaymond.Chen@Sun.COM /* 22*9430SRaymond.Chen@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*9430SRaymond.Chen@Sun.COM * Use is subject to license terms. 24*9430SRaymond.Chen@Sun.COM */ 25*9430SRaymond.Chen@Sun.COM 26*9430SRaymond.Chen@Sun.COM #ifndef _SYS_UWB_UWBA_H 27*9430SRaymond.Chen@Sun.COM #define _SYS_UWB_UWBA_H 28*9430SRaymond.Chen@Sun.COM 29*9430SRaymond.Chen@Sun.COM #ifdef __cplusplus 30*9430SRaymond.Chen@Sun.COM extern "C" { 31*9430SRaymond.Chen@Sun.COM #endif 32*9430SRaymond.Chen@Sun.COM 33*9430SRaymond.Chen@Sun.COM 34*9430SRaymond.Chen@Sun.COM /* 35*9430SRaymond.Chen@Sun.COM * UWBA private header file. 36*9430SRaymond.Chen@Sun.COM */ 37*9430SRaymond.Chen@Sun.COM 38*9430SRaymond.Chen@Sun.COM #include <sys/note.h> 39*9430SRaymond.Chen@Sun.COM #include <sys/sunddi.h> 40*9430SRaymond.Chen@Sun.COM #include <sys/types.h> 41*9430SRaymond.Chen@Sun.COM #include <sys/list.h> 42*9430SRaymond.Chen@Sun.COM #include <sys/bitset.h> 43*9430SRaymond.Chen@Sun.COM #include <sys/bitmap.h> 44*9430SRaymond.Chen@Sun.COM 45*9430SRaymond.Chen@Sun.COM #include <sys/uwb/uwb.h> 46*9430SRaymond.Chen@Sun.COM #include <sys/uwb/uwbai.h> 47*9430SRaymond.Chen@Sun.COM 48*9430SRaymond.Chen@Sun.COM /* For logging. */ 49*9430SRaymond.Chen@Sun.COM #define UWBA_LOG_DEBUG 2 50*9430SRaymond.Chen@Sun.COM #define UWBA_LOG_LOG 1 51*9430SRaymond.Chen@Sun.COM #define UWBA_LOG_CONSOLE 0 52*9430SRaymond.Chen@Sun.COM 53*9430SRaymond.Chen@Sun.COM #define offsetof(s, m) ((size_t)(&(((s *)0)->m))) 54*9430SRaymond.Chen@Sun.COM #define isdigit(ch) ((ch >= '0') && (ch <= '9')) 55*9430SRaymond.Chen@Sun.COM 56*9430SRaymond.Chen@Sun.COM #define UWB_RAW_RESULT_CODE_SIZE 5 /* size of RCEB + bResultCode */ 57*9430SRaymond.Chen@Sun.COM #define UWB_RAW_RCCB_HEAD_SIZE 4 /* size of RCCB */ 58*9430SRaymond.Chen@Sun.COM 59*9430SRaymond.Chen@Sun.COM #define UWB_RAW_BEVENTTYPE_OFFSET 0 /* offset of bEventType */ 60*9430SRaymond.Chen@Sun.COM #define UWB_RAW_WEVENT_OFFSET 1 /* offset of wEvent */ 61*9430SRaymond.Chen@Sun.COM #define UWB_RAW_BEVENTCONTEXT_OFFSET 3 /* offset of bEventContext */ 62*9430SRaymond.Chen@Sun.COM #define UWB_RAW_BRESULTCODE_OFFSET 4 /* offset of bResultCode */ 63*9430SRaymond.Chen@Sun.COM 64*9430SRaymond.Chen@Sun.COM 65*9430SRaymond.Chen@Sun.COM 66*9430SRaymond.Chen@Sun.COM #define UWB_CTXT_ID_TOP 0xfe /* top context id */ 67*9430SRaymond.Chen@Sun.COM #define UWB_CTXT_ID_BOTTOM 0x1 /* bottom context id */ 68*9430SRaymond.Chen@Sun.COM #define UWB_CTXT_ID_NOTIF 0x0 /* notification context id */ 69*9430SRaymond.Chen@Sun.COM #define UWB_CTXT_ID_UNVALID 0xff /* invalid context id */ 70*9430SRaymond.Chen@Sun.COM 71*9430SRaymond.Chen@Sun.COM 72*9430SRaymond.Chen@Sun.COM #define UWB_INVALID_EVT_CODE 0x7ffe /* invalid evt/notif code */ 73*9430SRaymond.Chen@Sun.COM #define UWB_INVALID_EVT_SIZE 0x7fff /* invalid evt length */ 74*9430SRaymond.Chen@Sun.COM 75*9430SRaymond.Chen@Sun.COM #define UWB_MAX_NOTIF_NUMBER 10 /* Max notifications in a notif_list */ 76*9430SRaymond.Chen@Sun.COM 77*9430SRaymond.Chen@Sun.COM #define UWB_MAX_CDEV_NUMBER 32 /* Max client radio device */ 78*9430SRaymond.Chen@Sun.COM 79*9430SRaymond.Chen@Sun.COM /* 80*9430SRaymond.Chen@Sun.COM * Offset of data rates Bits in PHY Capability Bitmap. 81*9430SRaymond.Chen@Sun.COM * [ECMA, 16.8.16, table 112] 82*9430SRaymond.Chen@Sun.COM */ 83*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_BASE 16 84*9430SRaymond.Chen@Sun.COM /* the offset of data rate 53.3Mbps in PHY capability bitmap */ 85*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_53 UWB_RATE_OFFSET_BASE 86*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_80 (UWB_RATE_OFFSET_BASE + 1) /* 80Mbps */ 87*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_106 (UWB_RATE_OFFSET_BASE + 2) 88*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_160 (UWB_RATE_OFFSET_BASE + 3) 89*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_200 (UWB_RATE_OFFSET_BASE + 4) 90*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_320 (UWB_RATE_OFFSET_BASE + 5) 91*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_400 (UWB_RATE_OFFSET_BASE + 6) 92*9430SRaymond.Chen@Sun.COM #define UWB_RATE_OFFSET_480 (UWB_RATE_OFFSET_BASE + 7) 93*9430SRaymond.Chen@Sun.COM 94*9430SRaymond.Chen@Sun.COM typedef int (*uwb_rccb_handler_t)(uwb_dev_handle_t, uwb_rccb_cmd_t *); 95*9430SRaymond.Chen@Sun.COM #define UWB_RCCB_NULL_HANDLER ((uwb_rccb_handler_t)0) 96*9430SRaymond.Chen@Sun.COM 97*9430SRaymond.Chen@Sun.COM #define UWB_STATE_IDLE 0 98*9430SRaymond.Chen@Sun.COM #define UWB_STATE_BEACON 1 99*9430SRaymond.Chen@Sun.COM #define UWB_STATE_SCAN 2 100*9430SRaymond.Chen@Sun.COM 101*9430SRaymond.Chen@Sun.COM /* radio client device */ 102*9430SRaymond.Chen@Sun.COM typedef struct uwba_client_dev { 103*9430SRaymond.Chen@Sun.COM uint8_t bChannelNumber; 104*9430SRaymond.Chen@Sun.COM uint8_t bBeaconType; 105*9430SRaymond.Chen@Sun.COM uint16_t wBPSTOffset; 106*9430SRaymond.Chen@Sun.COM uwb_beacon_frame_t beacon_frame; 107*9430SRaymond.Chen@Sun.COM list_node_t dev_node; 108*9430SRaymond.Chen@Sun.COM } uwba_client_dev_t; 109*9430SRaymond.Chen@Sun.COM 110*9430SRaymond.Chen@Sun.COM /* Command result from the radio controller */ 111*9430SRaymond.Chen@Sun.COM typedef struct uwb_cmd_result { 112*9430SRaymond.Chen@Sun.COM uwb_rceb_head_t rceb; 113*9430SRaymond.Chen@Sun.COM 114*9430SRaymond.Chen@Sun.COM /* Cmd result data from device when cmd is finished. */ 115*9430SRaymond.Chen@Sun.COM uint8_t buf[1]; 116*9430SRaymond.Chen@Sun.COM } uwb_cmd_result_t; 117*9430SRaymond.Chen@Sun.COM 118*9430SRaymond.Chen@Sun.COM 119*9430SRaymond.Chen@Sun.COM typedef struct uwb_cmd_result_wrapper { 120*9430SRaymond.Chen@Sun.COM /* Length of a uwb cmd_result */ 121*9430SRaymond.Chen@Sun.COM int length; 122*9430SRaymond.Chen@Sun.COM 123*9430SRaymond.Chen@Sun.COM uwb_cmd_result_t *cmd_result; 124*9430SRaymond.Chen@Sun.COM } uwb_cmd_result_wrapper_t; 125*9430SRaymond.Chen@Sun.COM 126*9430SRaymond.Chen@Sun.COM typedef struct uwb_notif_wrapper { 127*9430SRaymond.Chen@Sun.COM /* Length of uwb notifcation */ 128*9430SRaymond.Chen@Sun.COM int length; 129*9430SRaymond.Chen@Sun.COM uwb_rceb_notif_t *notif; 130*9430SRaymond.Chen@Sun.COM 131*9430SRaymond.Chen@Sun.COM list_node_t notif_node; 132*9430SRaymond.Chen@Sun.COM } uwb_notif_wrapper_t; 133*9430SRaymond.Chen@Sun.COM 134*9430SRaymond.Chen@Sun.COM 135*9430SRaymond.Chen@Sun.COM 136*9430SRaymond.Chen@Sun.COM typedef struct uwba_dev { 137*9430SRaymond.Chen@Sun.COM /* dip of the uwb radio controller device */ 138*9430SRaymond.Chen@Sun.COM dev_info_t *dip; 139*9430SRaymond.Chen@Sun.COM 140*9430SRaymond.Chen@Sun.COM /* Dev and instance */ 141*9430SRaymond.Chen@Sun.COM char *devinst; 142*9430SRaymond.Chen@Sun.COM 143*9430SRaymond.Chen@Sun.COM kmutex_t dev_mutex; 144*9430SRaymond.Chen@Sun.COM 145*9430SRaymond.Chen@Sun.COM /* send cmd to the device */ 146*9430SRaymond.Chen@Sun.COM int (*send_cmd)(uwb_dev_handle_t, mblk_t *, uint16_t); 147*9430SRaymond.Chen@Sun.COM 148*9430SRaymond.Chen@Sun.COM /* current command block */ 149*9430SRaymond.Chen@Sun.COM uwb_rccb_cmd_t curr_rccb; 150*9430SRaymond.Chen@Sun.COM 151*9430SRaymond.Chen@Sun.COM /* wait for cmd complete and the cmd result available */ 152*9430SRaymond.Chen@Sun.COM kcondvar_t cmd_result_cv; 153*9430SRaymond.Chen@Sun.COM kcondvar_t cmd_handler_cv; 154*9430SRaymond.Chen@Sun.COM 155*9430SRaymond.Chen@Sun.COM /* filled by uwb_fill_cmd_result in rc driver's cmd call back */ 156*9430SRaymond.Chen@Sun.COM uwb_cmd_result_wrapper_t cmd_result_wrap; 157*9430SRaymond.Chen@Sun.COM 158*9430SRaymond.Chen@Sun.COM /* 159*9430SRaymond.Chen@Sun.COM * set to TRUE when start to do cmd ioctl; 160*9430SRaymond.Chen@Sun.COM * set to FALSE when put_cmd and exit cmd ioctl 161*9430SRaymond.Chen@Sun.COM */ 162*9430SRaymond.Chen@Sun.COM boolean_t cmd_busy; 163*9430SRaymond.Chen@Sun.COM 164*9430SRaymond.Chen@Sun.COM /* Device state */ 165*9430SRaymond.Chen@Sun.COM uint8_t dev_state; 166*9430SRaymond.Chen@Sun.COM 167*9430SRaymond.Chen@Sun.COM /* Beacon or scan channel */ 168*9430SRaymond.Chen@Sun.COM uint8_t channel; 169*9430SRaymond.Chen@Sun.COM 170*9430SRaymond.Chen@Sun.COM /* Device address */ 171*9430SRaymond.Chen@Sun.COM uint16_t dev_addr; 172*9430SRaymond.Chen@Sun.COM 173*9430SRaymond.Chen@Sun.COM /* notifications from radio controller device */ 174*9430SRaymond.Chen@Sun.COM list_t notif_list; 175*9430SRaymond.Chen@Sun.COM 176*9430SRaymond.Chen@Sun.COM /* the current number of notifications in the notif_list */ 177*9430SRaymond.Chen@Sun.COM int notif_cnt; 178*9430SRaymond.Chen@Sun.COM 179*9430SRaymond.Chen@Sun.COM /* client radio devices found through beacons by this radio host */ 180*9430SRaymond.Chen@Sun.COM list_t client_dev_list; 181*9430SRaymond.Chen@Sun.COM 182*9430SRaymond.Chen@Sun.COM /* the current number of devices in dev_list */ 183*9430SRaymond.Chen@Sun.COM int client_dev_cnt; 184*9430SRaymond.Chen@Sun.COM 185*9430SRaymond.Chen@Sun.COM /* context id is maintained by uwba */ 186*9430SRaymond.Chen@Sun.COM uint8_t ctxt_id; /* current command context id */ 187*9430SRaymond.Chen@Sun.COM bitset_t ctxt_bits; /* command context bit map */ 188*9430SRaymond.Chen@Sun.COM 189*9430SRaymond.Chen@Sun.COM /* PHY capability bitmap, saved from PHY capability IE */ 190*9430SRaymond.Chen@Sun.COM ulong_t phy_cap_bm; 191*9430SRaymond.Chen@Sun.COM 192*9430SRaymond.Chen@Sun.COM /* list node of a uwb radio host device */ 193*9430SRaymond.Chen@Sun.COM list_node_t uwba_dev_node; 194*9430SRaymond.Chen@Sun.COM } uwba_dev_t; 195*9430SRaymond.Chen@Sun.COM 196*9430SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(uwba_dev_t::dev_mutex, uwba_dev_t)) 197*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(uwba_dev_t::{ 198*9430SRaymond.Chen@Sun.COM dip 199*9430SRaymond.Chen@Sun.COM devinst 200*9430SRaymond.Chen@Sun.COM send_cmd 201*9430SRaymond.Chen@Sun.COM phy_cap_bm 202*9430SRaymond.Chen@Sun.COM notif_cnt 203*9430SRaymond.Chen@Sun.COM dev_state 204*9430SRaymond.Chen@Sun.COM dip 205*9430SRaymond.Chen@Sun.COM ctxt_id 206*9430SRaymond.Chen@Sun.COM ctxt_bits 207*9430SRaymond.Chen@Sun.COM notif_list 208*9430SRaymond.Chen@Sun.COM cmd_result_wrap 209*9430SRaymond.Chen@Sun.COM client_dev_cnt 210*9430SRaymond.Chen@Sun.COM channel 211*9430SRaymond.Chen@Sun.COM dev_addr 212*9430SRaymond.Chen@Sun.COM })) 213*9430SRaymond.Chen@Sun.COM 214*9430SRaymond.Chen@Sun.COM 215*9430SRaymond.Chen@Sun.COM typedef struct uwba_evt_size { 216*9430SRaymond.Chen@Sun.COM /* length of a evt/notif structure, impact by alignment */ 217*9430SRaymond.Chen@Sun.COM uint8_t struct_len; 218*9430SRaymond.Chen@Sun.COM 219*9430SRaymond.Chen@Sun.COM /* 220*9430SRaymond.Chen@Sun.COM * offset of the length member of an event/notif struct. 221*9430SRaymond.Chen@Sun.COM * if zero, means there is no variable buf length member 222*9430SRaymond.Chen@Sun.COM * in this struct 223*9430SRaymond.Chen@Sun.COM */ 224*9430SRaymond.Chen@Sun.COM uint16_t buf_len_offset; 225*9430SRaymond.Chen@Sun.COM } uwba_evt_size_t; 226*9430SRaymond.Chen@Sun.COM typedef struct uwba_channel_range { 227*9430SRaymond.Chen@Sun.COM /* First channel in the specific bandgroup */ 228*9430SRaymond.Chen@Sun.COM uint8_t base; 229*9430SRaymond.Chen@Sun.COM 230*9430SRaymond.Chen@Sun.COM /* Length since this first channel in the bandgroup */ 231*9430SRaymond.Chen@Sun.COM uint8_t offset; 232*9430SRaymond.Chen@Sun.COM } uwba_channel_range_t; 233*9430SRaymond.Chen@Sun.COM 234*9430SRaymond.Chen@Sun.COM #define UWB_RESULT_CODE_SIZE (sizeof (uwb_rceb_result_code_t)) 235*9430SRaymond.Chen@Sun.COM 236*9430SRaymond.Chen@Sun.COM /* str_t is the struct type of the notif/evt */ 237*9430SRaymond.Chen@Sun.COM #define UWB_EVT_RCEB_SZ (sizeof (uwb_rceb_t)) 238*9430SRaymond.Chen@Sun.COM 239*9430SRaymond.Chen@Sun.COM /* the size after excluded the rceb head */ 240*9430SRaymond.Chen@Sun.COM #define UWB_EVT_END_SZ(stru_t) (sizeof (stru_t) - sizeof (uwb_rceb_t)) 241*9430SRaymond.Chen@Sun.COM 242*9430SRaymond.Chen@Sun.COM #define UWB_EVT_NO_BUF_LEN_OFFSET 0 243*9430SRaymond.Chen@Sun.COM 244*9430SRaymond.Chen@Sun.COM /* Offset of wBeaconInfoLength in uwb_rceb_beacon_t */ 245*9430SRaymond.Chen@Sun.COM #define UWB_BEACONINFOLEN_OFFSET 10 246*9430SRaymond.Chen@Sun.COM 247*9430SRaymond.Chen@Sun.COM /* Offset of BeaconInfo from bChannelNumber in uwb_rceb_beacon_t */ 248*9430SRaymond.Chen@Sun.COM #define UWB_BEACONINFO_OFFSET 8 249*9430SRaymond.Chen@Sun.COM 250*9430SRaymond.Chen@Sun.COM /* 251*9430SRaymond.Chen@Sun.COM * UWB radio controller device list 252*9430SRaymond.Chen@Sun.COM */ 253*9430SRaymond.Chen@Sun.COM void uwba_dev_add_to_list(uwba_dev_t *); 254*9430SRaymond.Chen@Sun.COM void uwba_dev_rm_from_list(uwba_dev_t *); 255*9430SRaymond.Chen@Sun.COM void uwba_alloc_uwb_dev(dev_info_t *, uwba_dev_t **, uint_t); 256*9430SRaymond.Chen@Sun.COM void uwba_free_uwb_dev(uwba_dev_t *); 257*9430SRaymond.Chen@Sun.COM uwb_dev_handle_t uwba_dev_search(dev_info_t *); 258*9430SRaymond.Chen@Sun.COM 259*9430SRaymond.Chen@Sun.COM /* 260*9430SRaymond.Chen@Sun.COM * Context ID operations 261*9430SRaymond.Chen@Sun.COM */ 262*9430SRaymond.Chen@Sun.COM void uwba_init_ctxt_id(uwba_dev_t *); 263*9430SRaymond.Chen@Sun.COM void uwba_fini_ctxt_id(uwba_dev_t *); 264*9430SRaymond.Chen@Sun.COM uint8_t uwba_get_ctxt_id(uwba_dev_t *); 265*9430SRaymond.Chen@Sun.COM void uwba_free_ctxt_id(uwba_dev_t *, uint8_t); 266*9430SRaymond.Chen@Sun.COM 267*9430SRaymond.Chen@Sun.COM void uwba_fill_rccb_head(uwba_dev_t *, uint16_t, mblk_t *); 268*9430SRaymond.Chen@Sun.COM uint16_t uwba_get_evt_code(uint8_t *, int); 269*9430SRaymond.Chen@Sun.COM uint16_t uwba_get_evt_size(uint8_t *, int, uint16_t); 270*9430SRaymond.Chen@Sun.COM 271*9430SRaymond.Chen@Sun.COM void uwba_put_cmd_result(uwba_dev_t *, void *, uint16_t); 272*9430SRaymond.Chen@Sun.COM int uwba_add_notif_to_list(uwba_dev_t *, void *, uint16_t); 273*9430SRaymond.Chen@Sun.COM 274*9430SRaymond.Chen@Sun.COM /* 275*9430SRaymond.Chen@Sun.COM * Parse events/notifications from radio controller device 276*9430SRaymond.Chen@Sun.COM */ 277*9430SRaymond.Chen@Sun.COM int uwba_parse_data(char *, uchar_t *, size_t, void *, size_t); 278*9430SRaymond.Chen@Sun.COM int uwba_parse_rceb(uint8_t *, size_t, void *, size_t); 279*9430SRaymond.Chen@Sun.COM int uwba_parse_dev_addr_mgmt(uint8_t *, int, uwb_rceb_dev_addr_mgmt_t *); 280*9430SRaymond.Chen@Sun.COM int uwba_parse_get_ie(uwb_dev_handle_t, uint8_t *, 281*9430SRaymond.Chen@Sun.COM int, uwb_rceb_get_ie_t *); 282*9430SRaymond.Chen@Sun.COM int uwba_parse_beacon_rcv(uwb_dev_handle_t, uint8_t *, 283*9430SRaymond.Chen@Sun.COM int, uwb_rceb_beacon_t *); 284*9430SRaymond.Chen@Sun.COM int uwba_parse_bpoie_chg(uwb_dev_handle_t, uint8_t *, 285*9430SRaymond.Chen@Sun.COM int, uwb_rceb_bpoie_change_t *); 286*9430SRaymond.Chen@Sun.COM uint8_t uwba_allocate_channel(uwb_dev_handle_t); 287*9430SRaymond.Chen@Sun.COM uint8_t *uwba_find_ie(uwb_dev_handle_t, uint_t, uint8_t *, uint16_t); 288*9430SRaymond.Chen@Sun.COM 289*9430SRaymond.Chen@Sun.COM void uwba_copy_rccb(uwb_rccb_cmd_t *, uwb_rccb_cmd_t *); 290*9430SRaymond.Chen@Sun.COM 291*9430SRaymond.Chen@Sun.COM uwba_client_dev_t *uwba_find_cdev_by_channel(uwba_dev_t *, uint8_t); 292*9430SRaymond.Chen@Sun.COM 293*9430SRaymond.Chen@Sun.COM /* Debug/message log */ 294*9430SRaymond.Chen@Sun.COM void uwba_log(uwba_dev_t *, uint_t, char *, ...); 295*9430SRaymond.Chen@Sun.COM const char *uwba_event_msg(uint16_t); 296*9430SRaymond.Chen@Sun.COM 297*9430SRaymond.Chen@Sun.COM /* Turn a little endian byte array to a uint32_t */ 298*9430SRaymond.Chen@Sun.COM #define LE_TO_UINT32(src, off, des) \ 299*9430SRaymond.Chen@Sun.COM { \ 300*9430SRaymond.Chen@Sun.COM uint32_t tmp; \ 301*9430SRaymond.Chen@Sun.COM des = src[off + 3]; \ 302*9430SRaymond.Chen@Sun.COM des = des << 24; \ 303*9430SRaymond.Chen@Sun.COM tmp = src[off + 2]; \ 304*9430SRaymond.Chen@Sun.COM des |= tmp << 16; \ 305*9430SRaymond.Chen@Sun.COM tmp = src[off + 1]; \ 306*9430SRaymond.Chen@Sun.COM des |= tmp << 8; \ 307*9430SRaymond.Chen@Sun.COM des |= src[off]; \ 308*9430SRaymond.Chen@Sun.COM } 309*9430SRaymond.Chen@Sun.COM 310*9430SRaymond.Chen@Sun.COM /* Turn a uint32_t to a little endian byte array */ 311*9430SRaymond.Chen@Sun.COM #define UINT32_TO_LE(src, off, des) \ 312*9430SRaymond.Chen@Sun.COM { \ 313*9430SRaymond.Chen@Sun.COM des[off + 0] = 0xff & src; \ 314*9430SRaymond.Chen@Sun.COM des[off + 1] = 0xff & (src >> 8); \ 315*9430SRaymond.Chen@Sun.COM des[off + 2] = 0xff & (src >> 16); \ 316*9430SRaymond.Chen@Sun.COM des[off + 3] = 0xff & (src >> 24); \ 317*9430SRaymond.Chen@Sun.COM } 318*9430SRaymond.Chen@Sun.COM 319*9430SRaymond.Chen@Sun.COM /* Turn a little endian byte array to a uint16_t */ 320*9430SRaymond.Chen@Sun.COM #define LE_TO_UINT16(src, off, des) \ 321*9430SRaymond.Chen@Sun.COM { \ 322*9430SRaymond.Chen@Sun.COM des = src[off + 1]; \ 323*9430SRaymond.Chen@Sun.COM des = des << 8; \ 324*9430SRaymond.Chen@Sun.COM des |= src[off]; \ 325*9430SRaymond.Chen@Sun.COM } 326*9430SRaymond.Chen@Sun.COM 327*9430SRaymond.Chen@Sun.COM /* Turn a uint16_t to alittle endian byte array */ 328*9430SRaymond.Chen@Sun.COM #define UINT16_TO_LE(src, off, des) \ 329*9430SRaymond.Chen@Sun.COM { \ 330*9430SRaymond.Chen@Sun.COM des[off + 0] = 0xff & src; \ 331*9430SRaymond.Chen@Sun.COM des[off + 1] = 0xff & (src >> 8); \ 332*9430SRaymond.Chen@Sun.COM } 333*9430SRaymond.Chen@Sun.COM 334*9430SRaymond.Chen@Sun.COM 335*9430SRaymond.Chen@Sun.COM /* Max string length for the driver name and instance number. */ 336*9430SRaymond.Chen@Sun.COM #define UWB_MAXSTRINGLEN 255 337*9430SRaymond.Chen@Sun.COM 338*9430SRaymond.Chen@Sun.COM 339*9430SRaymond.Chen@Sun.COM #ifdef __cplusplus 340*9430SRaymond.Chen@Sun.COM } 341*9430SRaymond.Chen@Sun.COM #endif 342*9430SRaymond.Chen@Sun.COM 343*9430SRaymond.Chen@Sun.COM #endif /* _SYS_UWB_UWBA_H */ 344