1*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 2*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 3*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Use is subject to license terms. 4*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 5*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 6*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 7*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2008 by Ben Taylor <bentaylor.solx86@gmail.com> 8*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2007 by Lukas Turek <turek@ksvi.mff.cuni.cz> 9*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2007 by Jiri Svoboda <jirik.svoboda@seznam.cz> 10*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2007 by Martin Krulis <martin.krulis@matfyz.cz> 11*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2006 by Damien Bergamini <damien.bergamini@free.fr> 12*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2006 by Florian Stoehr <ich@florian-stoehr.de> 13*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * 14*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Permission to use, copy, modify, and distribute this software for any 15*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * purpose with or without fee is hereby granted, provided that the above 16*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * copyright notice and this permission notice appear in all copies. 17*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * 18*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 19*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 20*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 21*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 22*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 23*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 24*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 25*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * 26*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 27*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 28*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifndef _ZYD_H 29*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define _ZYD_H 30*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 31*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef __cplusplus 32*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern "C" { 33*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif 34*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 35*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/sysmacros.h> 36*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/net80211.h> 37*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 38*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define USBDRV_MAJOR_VER 2 39*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define USBDRV_MINOR_VER 0 40*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/usb/usba.h> 41*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/usb/usba/usba_types.h> 42*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 43*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DRV_NAME "zyd" 44*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DRV_DESC "Zydas ZD1211(B)" 45*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DRV_REV "V1.1" 46*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 47*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Return the number of fields of an array */ 48*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_ARRAY_LENGTH(arr) (sizeof (arr) / sizeof ((arr)[0])) 49*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 50*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 51*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Result type: all functions beginning with zyd_ 52*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * should use this to indicate success or failure. 53*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * (except for public funcions, of course) 54*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * 55*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Detecting error: always use (value != ZYD_SUCCESS) 56*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Indicating error: return ZYD_FAILURE 57*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 58*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef enum { 59*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ZYD_SUCCESS, 60*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ZYD_FAILURE 61*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_res; 62*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 63*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 64*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Chip revision ID 65*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 66*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef enum { 67*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ZYD_UNKNOWN, 68*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ZYD_ZD1211, 69*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ZYD_ZD1211B 70*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_mac_rev_t; 71*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 72*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 73*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * USB-safe mutual exclusion object. 74*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 75*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef struct { 76*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China boolean_t initialized; /* B_TRUE if properly initialized */ 77*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China boolean_t held; /* B_TRUE if the object is held */ 78*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China kmutex_t lock; /* serialize access */ 79*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China kcondvar_t wait; /* for waiting on release */ 80*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_serial_t; 81*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 82*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 83*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Holds an ioread request status. 84*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 85*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_ioread { 86*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China volatile boolean_t pending; /* ioread is in progress */ 87*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China volatile boolean_t done; /* response has been received */ 88*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China volatile boolean_t exc; /* an exception has occured */ 89*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 90*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void *buffer; /* response buffer */ 91*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int buf_len; /* buffer size (bytes) */ 92*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 93*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 94*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 95*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * USB state. 96*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 97*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_usb { 98*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Copy of sc->dip */ 99*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China dev_info_t *dip; 100*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 101*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Device configuration information */ 102*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_client_dev_data_t *cdata; 103*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 104*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China boolean_t connected; 105*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 106*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Communication pipe handles */ 107*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_pipe_handle_t pipe_data_in; 108*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_pipe_handle_t pipe_data_out; 109*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_pipe_handle_t pipe_cmd_in; 110*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_pipe_handle_t pipe_cmd_out; 111*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 112*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Communication endpoint data (copied from descriptor tree) */ 113*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_ep_data_t ep_data_in; 114*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_ep_data_t ep_data_out; 115*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_ep_data_t ep_cmd_in; 116*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China usb_ep_data_t ep_cmd_out; 117*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 118*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Current ioread request (if any) */ 119*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_ioread io_read; 120*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 121*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 122*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_softc; /* forward declaration */ 123*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 124*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rf { 125*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* RF methods */ 126*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res (*init)(struct zyd_rf *); 127*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res (*switch_radio)(struct zyd_rf *, boolean_t); 128*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res (*set_channel)(struct zyd_rf *, uint8_t); 129*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 130*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* RF attributes */ 131*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *rf_sc; /* back-pointer */ 132*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int width; 133*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 134*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 135*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 136*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * per-instance soft-state structure 137*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 138*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_softc { 139*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Serialize access to the soft_state/device */ 140*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_serial_t serial; 141*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rf sc_rf; 142*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 143*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China dev_info_t *dip; 144*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 145*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* timeout for scanning */ 146*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China timeout_id_t timeout_id; 147*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 148*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* USB-specific data */ 149*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_usb usb; 150*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 151*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Chip revision ZYD1211/ZYD1211B */ 152*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_mac_rev_t mac_rev; 153*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 154*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* MAC address */ 155*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t macaddr[IEEE80211_ADDR_LEN]; 156*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 157*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* net80211 data */ 158*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct ieee80211com ic; 159*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 160*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China boolean_t running; 161*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China boolean_t suspended; 162*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China boolean_t resched; 163*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t tx_queued; 164*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 165*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Data from EEPROM */ 166*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t fwbase; 167*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t regdomain; 168*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t fw_rev; 169*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t rf_rev; 170*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t pa_rev; 171*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t fix_cr47; 172*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t fix_cr157; 173*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t pwr_cal[14]; 174*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t pwr_int[14]; 175*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t ofdm36_cal[14]; 176*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t ofdm48_cal[14]; 177*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t ofdm54_cal[14]; 178*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 179*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* kstats */ 180*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint32_t tx_nobuf; 181*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint32_t rx_nobuf; 182*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint32_t tx_err; 183*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint32_t rx_err; 184*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 185*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* net80211 original state change handler */ 186*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int (*newstate)(ieee80211com_t *, 187*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China enum ieee80211_state, int); 188*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 189*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 190*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* RF-config request */ 191*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rfwrite { 192*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t code; 193*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t width; 194*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t bit[32]; 195*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 196*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 197*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 16-bit I/O register write request */ 198*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_iowrite16 { 199*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t reg; 200*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t value; 201*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 202*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 203*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #pragma pack(1) 204*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 205*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Generic usb command to the ZD chip */ 206*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_cmd { 207*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t cmd_code; 208*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t data[64]; 209*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 210*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 211*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* ZD prepends this header to an incoming frame. */ 212*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_plcphdr { 213*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t signal; 214*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t reserved[2]; 215*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t service; /* unaligned! */ 216*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 217*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 218*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* ZD appends this footer to an incoming frame. */ 219*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rx_stat { 220*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t rssi; 221*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t signal_cck; 222*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t signal_ofdm; 223*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t cipher; 224*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t flags; 225*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 226*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 227*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* this structure may be unaligned */ 228*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rx_desc { 229*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_MAX_RXFRAMECNT 3 230*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t len[ZYD_MAX_RXFRAMECNT]; 231*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t tag; 232*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TAG_MULTIFRAME 0x697e 233*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 234*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 235*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 236*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Prepended to the 802.11 frame when sending to data_out. 237*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 238*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_tx_header { 239*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t rate_mod_flags; 240*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t frame_size; 241*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t type_flags; 242*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t packet_size; 243*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t frame_duration; 244*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint8_t service; 245*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t next_frame_duration; 246*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 247*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 248*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #pragma pack() 249*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 250*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 251*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Map USB id to 1211/1211B chip 252*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 253*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef struct zyd_usb_info { 254*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t vendor_id; 255*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China uint16_t product_id; 256*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_mac_rev_t mac_rev; 257*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_usb_info_t; 258*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 259*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 260*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Simple lock for callback-waiting. This lock should be used in situations when 261*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * one needs to wait for a callback function. It sipmply encapsulates one mutex 262*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * and one conditional variable. 263*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 264*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_cb_lock { 265*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China boolean_t done; 266*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China kmutex_t mutex; 267*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China kcondvar_t cv; 268*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }; 269*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 270*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Bits for rate_mod_flags */ 271*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_RMF_RATE(rmf) ((rmf) & 0x0f) 272*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_RMF_OFDM 0x10 273*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_RMF_SH_PREAMBLE 0x20 /* CCK */ 274*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_RMF_5GHZ 0x40 /* OFDM */ 275*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 276*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Bits for type_flags */ 277*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_FLAG_BACKOFF 0x01 278*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_FLAG_MULTICAST 0x02 279*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_FLAG_TYPE(t) (((t) & 0x3) << 2) 280*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_TYPE_DATA 0 281*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_TYPE_PS_POLL 1 282*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_TYPE_MGMT 2 283*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_TYPE_CTL 3 284*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 285*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_FLAG_WAKEUP 0x10 286*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_FLAG_RTS 0x20 287*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_FLAG_ENCRYPT 0x40 288*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_FLAG_CTS_TO_SELF 0x80 289*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 290*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_SERVICE_LENGTH_EXTENSION 0x80 291*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 292*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_TX_LIST_COUNT 0x8 293*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_RX_LIST_COUNT 0x8 294*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_USB_REQ_COUNT 0x8 295*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 296*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 297*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Time in miliseconds to stay on one channel during scan. 298*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 299*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DWELL_TIME 200000 300*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 301*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_SER_SIG B_TRUE 302*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_NO_SIG B_FALSE 303*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 304*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Location in the endpoint descriptor tree used by the device */ 305*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_USB_CONFIG_NUMBER 1 306*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_USB_IFACE_INDEX 0 307*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_USB_ALT_IF_INDEX 0 308*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 309*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_HW (1<<0) 310*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_FW (1<<1) 311*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_USB (1<<2) 312*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_TX (1<<3) 313*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_RX (1<<4) 314*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_SCAN (1<<5) 315*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_GLD (1<<6) 316*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_80211 (1<<7) 317*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DBG_RESUME (1<<8) 318*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 319*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_RX_BUF_SIZE (sizeof (struct zyd_rx_desc) + \ 320*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ((IEEE80211_MAX_LEN + 3) & ~3) * ZYD_MAX_RXFRAMECNT) 321*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 322*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* quickly determine if a given rate is CCK or OFDM */ 323*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22) 324*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 325*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 326*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Calculate the byte offset of a struct member 327*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 328*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_IC_TO_SOFTC(ic)\ 329*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (\ 330*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (struct zyd_softc *)(\ 331*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (uintptr_t)(ic) - offsetof(struct zyd_softc, ic)\ 332*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China )\ 333*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ) 334*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 335*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 336*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * The 'struct zyd_usb usb' is stored inside 'struct zyd_softc'. 337*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Using the knowledge of the usb member position, 338*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * convert a pointer to 'usb' to a pointer to the zyd_softc. 339*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 340*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_USB_TO_SOFTC(usbp)\ 341*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (\ 342*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (struct zyd_softc *)(\ 343*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (uintptr_t)(usbp) - offsetof(struct zyd_softc, usb)\ 344*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China )\ 345*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China ) 346*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 347*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Debugging macros */ 348*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef DEBUG 349*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DEBUG(x) zyd_dbg x 350*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #else 351*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_DEBUG(x) 352*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif 353*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define ZYD_WARN zyd_warn 354*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 355*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern void *zyd_ssp; 356*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 357*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef DEBUG 358*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern uint32_t zyd_dbg_flags; 359*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_dbg(uint32_t dbg_mask, const char *fmt, ...); 360*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif 361*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_warn(const char *fmt, ...); 362*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 363*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Functions needed for initializing radios and switching channels 364*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 365*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res zyd_read32(struct zyd_softc *, uint16_t, uint32_t *); 366*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res zyd_write32(struct zyd_softc *, uint16_t, uint32_t); 367*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res zyd_read16(struct zyd_softc *, uint16_t, uint16_t *); 368*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res zyd_write16a(struct zyd_softc *, const struct zyd_iowrite16 *, 369*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int); 370*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res zyd_write16(struct zyd_softc *, uint16_t, uint16_t); 371*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 372*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * Zydas's own USB-safe synchronization primitive. There are many USB API 373*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * functions which forbids that caller holds a mutex. So we're avoiding that 374*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China * by using out own primitive (it consist of ) 375*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China */ 376*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_serial_init(struct zyd_softc *sc); 377*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_serial_enter(struct zyd_softc *sc, boolean_t wait_sig); 378*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_serial_exit(struct zyd_softc *sc); 379*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_serial_deinit(struct zyd_softc *sc); 380*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 381*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_cb_lock_init(struct zyd_cb_lock *lock); 382*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_cb_lock_destroy(struct zyd_cb_lock *lock); 383*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_cb_lock_wait(struct zyd_cb_lock *lock, clock_t timeout); 384*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_cb_lock_signal(struct zyd_cb_lock *lock); 385*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 386*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* chipset specific routines */ 387*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_hw_set_channel(struct zyd_softc *sc, uint8_t chan); 388*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_hw_init(struct zyd_softc *sc); 389*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_hw_deinit(struct zyd_softc *sc); 390*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_hw_start(struct zyd_softc *sc); 391*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_hw_stop(struct zyd_softc *sc); 392*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 393*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* USB specific routines */ 394*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_init(struct zyd_softc *sc); 395*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_usb_deinit(struct zyd_softc *sc); 396*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_open_pipes(struct zyd_usb *uc); 397*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_usb_close_pipes(struct zyd_usb *uc); 398*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_cmd_in_start_polling(struct zyd_usb *uc); 399*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_usb_cmd_in_stop_polling(struct zyd_usb *uc); 400*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_data_in_enable(struct zyd_usb *uc); 401*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_usb_data_in_disable(struct zyd_usb *uc); 402*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_cmd_send(struct zyd_usb *uc, uint16_t code, 403*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China const void *data, size_t len); 404*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_ioread_req(struct zyd_usb *uc, const void *in_data, 405*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China size_t in_len, void *out_data, size_t out_len); 406*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_send_packet(struct zyd_usb *uc, mblk_t *mp); 407*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_mac_rev_t zyd_usb_mac_rev(uint16_t vendor, uint16_t product); 408*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res zyd_usb_loadfirmware(struct zyd_usb *uc, uint8_t *fw, 409*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China size_t size); 410*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 411*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void zyd_receive(struct zyd_softc *sc, const uint8_t *buf, uint16_t len); 412*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int zyd_resume(struct zyd_softc *sc); 413*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int zyd_suspend(struct zyd_softc *sc); 414*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 415*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern uint8_t zd1211_firmware[]; 416*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern size_t zd1211_firmware_size; 417*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern uint8_t zd1211b_firmware[]; 418*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern size_t zd1211b_firmware_size; 419*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 420*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef __cplusplus 421*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } 422*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif 423*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 424*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif /* _ZYD_H */ 425