Home | History | Annotate | Download | only in pcan
      1 /*
      2  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 
      6 /*
      7  * Copyright (c) 1997, 1998, 1999
      8  *      Bill Paul <wpaul (at) ctr.columbia.edu>.  All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *      This product includes software developed by Bill Paul.
     21  * 4. Neither the name of the author nor the names of any co-contributors
     22  *    may be used to endorse or promote products derived from this software
     23  *    without specific prior written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
     26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
     29  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     35  * THE POSSIBILITY OF SUCH DAMAGE.
     36  */
     37 
     38 
     39 #ifndef _SYS_PCAN_H
     40 #define	_SYS_PCAN_H
     41 
     42 #ifdef	__cplusplus
     43 extern "C" {
     44 #endif
     45 
     46 #define	AN_TIMEOUT	600000
     47 
     48 /*
     49  * Size of Aironet I/O space.
     50  */
     51 #define	AN_IOSIZ		0x40
     52 
     53 #define	PCAN_DEVICE_PCI		0x100
     54 #define	PCAN_DEVICE_PCCARD	0x200
     55 
     56 /*
     57  * Hermes register definitions and what little I know about them.
     58  */
     59 
     60 /*
     61  * Hermes command/status registers.
     62  */
     63 #define	AN_COMMAND(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x00 : 0x00)
     64 #define	AN_PARAM0(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x04 : 0x02)
     65 #define	AN_PARAM1(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x08 : 0x04)
     66 #define	AN_PARAM2(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x0c : 0x06)
     67 #define	AN_STATUS(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x10 : 0x08)
     68 #define	AN_RESP0(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x14 : 0x0A)
     69 #define	AN_RESP1(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x18 : 0x0C)
     70 #define	AN_RESP2(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x1c : 0x0E)
     71 #define	AN_LINKSTAT(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x20 : 0x10)
     72 
     73 /*
     74  * Command register
     75  */
     76 #define	AN_CMD_BUSY		0x8000 /* busy bit */
     77 #define	AN_CMD_NO_ACK		0x0080 /* don't acknowledge command */
     78 #define	AN_CMD_CODE_MASK	0x003F
     79 #define	AN_CMD_QUAL_MASK	0x7F00
     80 
     81 /*
     82  * Command codes
     83  */
     84 #define	AN_CMD_NOOP		0x0000 /* no-op */
     85 #define	AN_CMD_ENABLE		0x0001 /* enable */
     86 #define	AN_CMD_DISABLE		0x0002 /* disable */
     87 #define	AN_CMD_FORCE_SYNCLOSS	0x0003 /* force loss of sync */
     88 #define	AN_CMD_FW_RESTART	0x0004 /* firmware resrart */
     89 #define	AN_CMD_HOST_SLEEP	0x0005
     90 #define	AN_CMD_MAGIC_PKT	0x0006
     91 #define	AN_CMD_READCFG		0x0008
     92 #define	AN_CMD_ALLOC_MEM	0x000A /* allocate NIC memory */
     93 #define	AN_CMD_TX		0x000B /* transmit */
     94 #define	AN_CMD_DEALLOC_MEM	0x000C
     95 #define	AN_CMD_NOOP2		0x0010
     96 #define	AN_CMD_ALLOC_DESC	0x0020
     97 #define	AN_CMD_ACCESS		0x0021
     98 #define	AN_CMD_ALLOC_BUF	0x0028
     99 #define	AN_CMD_PSP_NODES	0x0030
    100 #define	AN_CMD_SET_PHYREG	0x003E
    101 #define	AN_CMD_TX_TEST		0x003F
    102 #define	AN_CMD_SLEEP		0x0085
    103 #define	AN_CMD_SCAN		0x0103
    104 #define	AN_CMD_SAVECFG		0x0108
    105 
    106 /*
    107  * Reclaim qualifier bit, applicable to the
    108  * TX command.
    109  */
    110 #define	AN_RECLAIM		0x0100 /* reclaim NIC memory */
    111 
    112 /*
    113  * MPI 350 DMA descriptor information
    114  */
    115 #define	AN_DESCRIPTOR_TX	0x01
    116 #define	AN_DESCRIPTOR_RX	0x02
    117 #define	AN_DESCRIPTOR_TXCMP	0x04
    118 #define	AN_DESCRIPTOR_HOSTWRITE 0x08
    119 #define	AN_DESCRIPTOR_HOSTREAD  0x10
    120 #define	AN_DESCRIPTOR_HOSTRW    0x20
    121 
    122 #define	AN_MAX_RX_DESC 1
    123 #define	AN_MAX_TX_DESC 1
    124 #define	AN_HOSTBUFSIZ 1840
    125 
    126 /*
    127  * dma descriptor definition for miniPci card.
    128  * the miniPci card only works on x86.
    129  */
    130 struct an_card_rid_desc
    131 {
    132 	uint32_t	an_rid:16;
    133 	uint32_t	an_len:15;
    134 	uint32_t	an_valid:1;
    135 	uint64_t	an_phys;
    136 };
    137 
    138 struct an_card_rx_desc
    139 {
    140 	uint32_t	an_ctrl:15;
    141 	uint32_t	an_done:1;
    142 	uint32_t	an_len:15;
    143 	uint32_t	an_valid:1;
    144 	uint64_t	an_phys;
    145 };
    146 
    147 struct an_card_tx_desc
    148 {
    149 	uint32_t	an_offset:15;
    150 	uint32_t	an_eoc:1;
    151 	uint32_t	an_len:15;
    152 	uint32_t	an_valid:1;
    153 	uint64_t	an_phys;
    154 };
    155 
    156 #define	AN_MAX_DATALEN	4096
    157 #define	AN_RID_BUFFER_SIZE	AN_MAX_DATALEN
    158 #define	AN_RX_BUFFER_SIZE	AN_HOSTBUFSIZ
    159 #define	AN_TX_BUFFER_SIZE	AN_HOSTBUFSIZ
    160 #define	AN_HOST_DESC_OFFSET	0x800
    161 #define	AN_RX_DESC_OFFSET  (AN_HOST_DESC_OFFSET + \
    162     sizeof (struct an_card_rid_desc))
    163 #define	AN_TX_DESC_OFFSET (AN_RX_DESC_OFFSET + \
    164 	(AN_MAX_RX_DESC * sizeof (struct an_card_rx_desc)))
    165 
    166 /*
    167  * ACCESS command qualifier bits.
    168  */
    169 #define	AN_ACCESS_READ		0x0000
    170 #define	AN_ACCESS_WRITE		0x0100
    171 
    172 /*
    173  * PROGRAM command qualifier bits.
    174  */
    175 #define	AN_PROGRAM_DISABLE	0x0000
    176 #define	AN_PROGRAM_ENABLE_RAM	0x0100
    177 #define	AN_PROGRAM_ENABLE_NVRAM	0x0200
    178 #define	AN_PROGRAM_NVRAM	0x0300
    179 
    180 /*
    181  * Status register values
    182  */
    183 #define	AN_STAT_CMD_CODE	0x003F
    184 #define	AN_STAT_CMD_RESULT	0x7F00
    185 
    186 /*
    187  * Linkstat register
    188  */
    189 #define	AN_LINKSTAT_ASSOCIATED		0x0400
    190 #define	AN_LINKSTAT_AUTHFAIL		0x0300
    191 #define	AN_LINKSTAT_ASSOC_FAIL		0x8400	/* (low byte is reason code) */
    192 #define	AN_LINKSTAT_DISASSOC		0x8200	/* (low byte is reason code) */
    193 #define	AN_LINKSTAT_DEAUTH		0x8100	/* (low byte is reason code) */
    194 #define	AN_LINKSTAT_SYNCLOST_TSF	0x8004
    195 #define	AN_LINKSTAT_SYNCLOST_HOSTREQ	0x8003
    196 #define	AN_LINKSTAT_SYNCLOST_AVGRETRY	0x8002
    197 #define	AN_LINKSTAT_SYNCLOST_MAXRETRY	0x8001
    198 #define	AN_LINKSTAT_SYNCLOST_MISSBEACON	0x8000
    199 
    200 /*
    201  * Link stat low byte reason code
    202  */
    203 #define	AN_LINKSTAT_RC_RESERVED		0 /* Reserved return code */
    204 #define	AN_LINKSTAT_RC_NOREASON		1 /* Unspecified reason */
    205 #define	AN_LINKSTAT_RC_AUTHINV		2 /* Prev auth invalid */
    206 #define	AN_LINKSTAT_RC_DEAUTH		3 /* Deauth due sender leaving */
    207 #define	AN_LINKSTAT_RC_NOACT		4 /* Disassociated due inactivity */
    208 #define	AN_LINKSTAT_RC_MAXLOAD		5 /* Disassociated due 2many stations */
    209 /*
    210  * Class 2 frame received from non-Authenticated station
    211  */
    212 #define	AN_LINKSTAT_RC_BADCLASS2	6
    213 /*
    214  * Class 3 frame received from non-Associated station
    215  */
    216 #define	AN_LINKSTAT_RC_BADCLASS3	7
    217 /*
    218  * Disassociated because sending station is leaving BSS
    219  */
    220 #define	AN_LINKSTAT_RC_STATLEAVE	8
    221 /*
    222  * Station requesting (Re)Association not Authenticated w/responding station
    223  */
    224 #define	AN_LINKSTAT_RC_NOAUTH		9
    225 
    226 /*
    227  * memory handle management registers
    228  */
    229 #define	AN_RX_FID		0x20
    230 #define	AN_ALLOC_FID		0x22
    231 #define	AN_TX_CMP_FID(p) \
    232 	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x1a : 0x24)
    233 
    234 #define	AN_INVALID_FID		0xffff  /* invalid fid value */
    235 
    236 /*
    237  * Buffer Access Path (BAP) registers.
    238  * These are I/O channels. I believe you can use each one for
    239  * any desired purpose independently of the other. In general
    240  * though, we use BAP1 for reading and writing LTV records and
    241  * reading received data frames, and BAP0 for writing transmit
    242  * frames. This is a convention though, not a rule.
    243  */
    244 #define	AN_SEL0			0x18
    245 #define	AN_SEL1			0x1A
    246 #define	AN_OFF0			0x1C
    247 #define	AN_OFF1			0x1E
    248 #define	AN_DATA0		0x36
    249 #define	AN_DATA1		0x38
    250 #define	AN_BAP0			AN_DATA0
    251 #define	AN_BAP1			AN_DATA1
    252 
    253 #define	AN_OFF_BUSY		0x8000
    254 #define	AN_OFF_ERR		0x4000
    255 #define	AN_OFF_DONE		0x2000
    256 #define	AN_OFF_DATAOFF		0x0FFF
    257 
    258 /*
    259  * Event registers
    260  */
    261 #define	AN_EVENT_STAT(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x60 : 0x30)
    262 /*
    263  * Interrupt enable/disable
    264  */
    265 #define	AN_INT_EN(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x64 : 0x32)
    266 #define	AN_EVENT_ACK(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x68 : 0x34)
    267 
    268 /*
    269  * Events - AN_EVENT_ACK register only
    270  */
    271 #define	AN_EV_CLR_STUCK_BUSY	0x4000	/* clear stuck busy bit */
    272 #define	AN_EV_WAKEREQUEST	0x2000	/* awaken from PSP mode */
    273 					/* Events shared by all 3 event regs: */
    274 #define	AN_EV_MIC		0x1000	/* Message Integrity Check */
    275 #define	AN_EV_AWAKE		0x0100	/* station woke up from PSP mode */
    276 #define	AN_EV_LINKSTAT		0x0080	/* link status available */
    277 #define	AN_EV_CMD		0x0010	/* command completed */
    278 #define	AN_EV_ALLOC		0x0008	/* async alloc/reclaim completed */
    279 #define	AN_EV_TX_EXC		0x0004	/* async xmit completed with failure */
    280 #define	AN_EV_TX		0x0002	/* async xmit completed succesfully */
    281 #define	AN_EV_RX		0x0001	/* async rx completed */
    282 #define	AN_EV_TX_CPY		0x0400
    283 
    284 #define	AN_EV_ALL		0xffff	/* all events */
    285 #define	AN_INTRS(p) \
    286 	(p->pcan_device_type == PCAN_DEVICE_PCI ? \
    287 	(AN_EV_RX|AN_EV_TX|AN_EV_TX_EXC|AN_EV_ALLOC|AN_EV_LINKSTAT|AN_EV_MIC \
    288 	|AN_EV_TX_CPY) : \
    289 	(AN_EV_RX|AN_EV_TX|AN_EV_TX_EXC|AN_EV_ALLOC|AN_EV_LINKSTAT|AN_EV_MIC))
    290 
    291 /*
    292  * Host software registers
    293  */
    294 #define	AN_SW0(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x50 : 0x28)
    295 #define	AN_SW1(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x54 : 0x2A)
    296 #define	AN_SW2(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x58 : 0x2C)
    297 #define	AN_SW3(p)	(p->pcan_device_type == PCAN_DEVICE_PCI ? 0x5c : 0x2E)
    298 
    299 #define	AN_CNTL			0x14
    300 
    301 #define	AN_CNTL_AUX_ENA		0xC000
    302 #define	AN_CNTL_AUX_ENA_STAT	0xC000
    303 #define	AN_CNTL_AUX_DIS_STAT	0x0000
    304 #define	AN_CNTL_AUX_ENA_CNTL	0x8000
    305 #define	AN_CNTL_AUX_DIS_CNTL	0x4000
    306 
    307 #define	AN_AUX_PAGE		0x3A
    308 #define	AN_AUX_OFFSET		0x3C
    309 #define	AN_AUX_DATA		0x3E
    310 
    311 struct an_ltv_gen {
    312 	uint16_t	an_len;
    313 	uint16_t	an_type;
    314 	uint16_t	an_val;
    315 };
    316 
    317 /*
    318  * General configuration information.
    319  */
    320 #define	AN_RID_GENCONFIG	0xFF10
    321 struct an_ltv_genconfig {
    322 	uint16_t	an_len;			/* 0x00 */
    323 	uint16_t	an_opmode;		/* 0x02 */
    324 	uint16_t	an_rxmode;		/* 0x04 */
    325 	uint16_t	an_fragthresh;		/* 0x06 */
    326 	uint16_t	an_rtsthresh;		/* 0x08 */
    327 	uint8_t		an_macaddr[6];		/* 0x0A */
    328 	uint8_t		an_rates[8];		/* 0x10 */
    329 	uint16_t	an_shortretry_limit;	/* 0x18 */
    330 	uint16_t	an_longretry_limit;	/* 0x1A */
    331 	uint16_t	an_tx_msdu_lifetime;	/* 0x1C */
    332 	uint16_t	an_rx_msdu_lifetime;	/* 0x1E */
    333 	uint16_t	an_stationary;		/* 0x20 */
    334 	uint16_t	an_ordering;		/* 0x22 */
    335 	uint16_t	an_devtype;		/* 0x24 */
    336 	uint16_t	an_rsvd0[5];		/* 0x26 */
    337 	/*
    338 	 * Scanning associating.
    339 	 */
    340 	uint16_t	an_scanmode;		/* 0x30 */
    341 	uint16_t	an_probedelay;		/* 0x32 */
    342 	uint16_t	an_probe_energy_timeout; /* 0x34 */
    343 	uint16_t	an_probe_response_timeout; /* 0x36 */
    344 	uint16_t	an_beacon_listen_timeout; /* 0x38 */
    345 	uint16_t	an_ibss_join_net_timeout; /* 0x3A */
    346 	uint16_t	an_auth_timeout;	/* 0x3C */
    347 	uint16_t	an_authtype;		/* 0x3E */
    348 	uint16_t	an_assoc_timeout;	/* 0x40 */
    349 	uint16_t	an_specified_ap_timeout; /* 0x42 */
    350 	uint16_t	an_offline_scan_interval; /* 0x44 */
    351 	uint16_t	an_offline_scan_duration; /* 0x46 */
    352 	uint16_t	an_link_loss_delay;	/* 0x48 */
    353 	uint16_t	an_max_beacon_lost_time; /* 0x4A */
    354 	uint16_t	an_refresh_interval;	/* 0x4C */
    355 	uint16_t	an_rsvd1;		/* 0x4E */
    356 	/*
    357 	 * Power save operation
    358 	 */
    359 	uint16_t	an_psave_mode;		/* 0x50 */
    360 	uint16_t	an_sleep_for_dtims;	/* 0x52 */
    361 	uint16_t	an_listen_interval;	/* 0x54 */
    362 	uint16_t	an_fast_listen_interval; /* 0x56 */
    363 	uint16_t	an_listen_decay;	/* 0x58 */
    364 	uint16_t	an_fast_listen_decay;	/* 0x5A */
    365 	uint16_t	an_rsvd2[2];		/* 0x5C */
    366 	/*
    367 	 * Ad-hoc (or AP) operation.
    368 	 */
    369 	uint16_t	an_beacon_period;	/* 0x60 */
    370 	uint16_t	an_atim_duration;	/* 0x62 */
    371 	uint16_t	an_rsvd3;		/* 0x64 */
    372 	uint16_t	an_ds_channel;		/* 0x66 */
    373 	uint16_t	an_rsvd4;		/* 0x68 */
    374 	uint16_t	an_dtim_period;		/* 0x6A */
    375 	uint16_t	an_rsvd5[2];		/* 0x6C */
    376 	/*
    377 	 * Radio operation.
    378 	 */
    379 	uint16_t	an_radiotype;		/* 0x70 */
    380 	uint16_t	an_diversity;		/* 0x72 */
    381 	uint16_t	an_tx_power;		/* 0x74 */
    382 	uint16_t	an_rss_thresh;		/* 0x76 */
    383 	uint16_t	an_rsvd6[4];		/* 0x78 */
    384 	/*
    385 	 * Aironet extensions.
    386 	 */
    387 	uint8_t		an_nodename[16];	/* 0x80 */
    388 	uint16_t	an_arl_thresh;		/* 0x90 */
    389 	uint16_t	an_arl_decay;		/* 0x92 */
    390 	uint16_t	an_arl_delay;		/* 0x94 */
    391 	uint8_t		an_rsvd7;		/* 0x96 */
    392 	uint8_t		an_rsvd8;		/* 0x97 */
    393 	uint8_t		an_magic_packet_action;	/* 0x98 */
    394 	uint8_t		an_magic_packet_ctl;	/* 0x99 */
    395 	uint16_t	an_auto_wake;		/* 0x9A */
    396 	uint16_t	an_pad[20];
    397 };
    398 
    399 #define	AN_OPMODE_IBSS_ADHOC			0x0000
    400 #define	AN_OPMODE_INFR_STATION			0x0001
    401 #define	AN_OPMODE_AP				0x0002
    402 #define	AN_OPMODE_AP_REPEATER			0x0003
    403 #define	AN_OPMODE_UNMODIFIED_PAYLOAD		0x0100
    404 #define	AN_OPMODE_AIRONET_EXTENSIONS		0x0200
    405 #define	AN_OPMODE_AP_EXTENSIONS			0x0400
    406 
    407 #define	AN_RXMODE_BC_MC_ADDR			0x0000
    408 #define	AN_RXMODE_BC_ADDR			0x0001
    409 #define	AN_RXMODE_ADDR				0x0002
    410 #define	AN_RXMODE_80211_MONITOR_CURBSS		0x0003
    411 #define	AN_RXMODE_80211_MONITOR_ANYBSS		0x0004
    412 #define	AN_RXMODE_LAN_MONITOR_CURBSS		0x0005
    413 #define	AN_RXMODE_NO_8023_HEADER		0x0100
    414 #define	AN_RXMODE_USE_8023_HEADER		0x0000
    415 
    416 #define	AN_RATE_1MBPS				0x0002
    417 #define	AN_RATE_2MBPS				0x0004
    418 #define	AN_RATE_5_5MBPS				0x000B
    419 #define	AN_RATE_11MBPS				0x0016
    420 
    421 #define	AN_DEVTYPE_PC4500			0x0065
    422 #define	AN_DEVTYPE_PC4800			0x006D
    423 
    424 #define	AN_SCANMODE_ACTIVE			0x0000
    425 #define	AN_SCANMODE_PASSIVE			0x0001
    426 #define	AN_SCANMODE_AIRONET_ACTIVE		0x0002
    427 
    428 #define	AN_AUTHTYPE_NONE			0x0000
    429 #define	AN_AUTHTYPE_OPEN			0x0001
    430 #define	AN_AUTHTYPE_SHAREDKEY			0x0002
    431 #define	AN_AUTHTYPE_EXCLUDE_UNENCRYPTED		0x0004
    432 #define	AN_AUTHTYPE_ENABLEWEP			0x0100
    433 #define	AN_AUTHTYPE_ALLOW_UNENCRYPTED		0x0200
    434 
    435 #define	AN_PSAVE_NONE				0x0000
    436 #define	AN_PSAVE_CAM				0x0001
    437 #define	AN_PSAVE_PSP				0x0002
    438 #define	AN_PSAVE_PSP_CAM			0x0003
    439 
    440 #define	AN_RADIOTYPE_80211_FH			0x0001
    441 #define	AN_RADIOTYPE_80211_DS			0x0002
    442 #define	AN_RADIOTYPE_LM2000_DS			0x0004
    443 
    444 #define	AN_DIVERSITY_FACTORY_DEFAULT		0x0000
    445 #define	AN_DIVERSITY_ANTENNA_1_ONLY		0x0001
    446 #define	AN_DIVERSITY_ANTENNA_2_ONLY		0x0002
    447 #define	AN_DIVERSITY_ANTENNA_1_AND_2		0x0003
    448 
    449 #define	AN_TXPOWER_FACTORY_DEFAULT		0x0000
    450 #define	AN_TXPOWER_50MW				50
    451 #define	AN_TXPOWER_100MW			100
    452 #define	AN_TXPOWER_250MW			250
    453 
    454 /*
    455  * Valid SSID list. You can specify up to three SSIDs denoting
    456  * the service sets that you want to join. The first SSID always
    457  * defaults to "tsunami" which is a handy way to detect the
    458  * card.
    459  */
    460 #define	AN_RID_SSIDLIST		0xFF11
    461 struct an_ltv_ssidlist {
    462 	uint16_t		an_len;
    463 	uint16_t		an_ssid1_len;
    464 	char			an_ssid1[32];
    465 	uint16_t		an_ssid2_len;
    466 	char			an_ssid2[32];
    467 	uint16_t		an_ssid3_len;
    468 	char			an_ssid3[32];
    469 	uint8_t			an_pad[748];
    470 };
    471 
    472 #define	AN_DEF_SSID_LEN		7
    473 #define	AN_DEF_SSID		"tsunami"
    474 
    475 /*
    476  * Valid AP list.
    477  */
    478 #define	AN_RID_APLIST		0xFF12
    479 struct an_ltv_aplist {
    480 	uint16_t	an_len;
    481 	uint8_t		an_ap1[6];
    482 	uint8_t		an_ap2[6];
    483 	uint8_t		an_ap3[6];
    484 	uint8_t		an_ap4[6];
    485 };
    486 
    487 /*
    488  * Driver name.
    489  */
    490 #define	AN_RID_DRVNAME		0xFF13
    491 struct an_ltv_drvname {
    492 	uint16_t	an_len;
    493 	uint8_t		an_drvname[16];
    494 };
    495 
    496 /*
    497  * Frame encapsulation.
    498  */
    499 #define	AN_RID_ENCAP		0xFF14
    500 struct an_rid_encap {
    501 	uint16_t		an_len;
    502 	uint16_t		an_ethertype_default;
    503 	uint16_t		an_action_default;
    504 	uint16_t		an_ethertype0;
    505 	uint16_t		an_action0;
    506 	uint16_t		an_ethertype1;
    507 	uint16_t		an_action1;
    508 	uint16_t		an_ethertype2;
    509 	uint16_t		an_action2;
    510 	uint16_t		an_ethertype3;
    511 	uint16_t		an_action3;
    512 	uint16_t		an_ethertype4;
    513 	uint16_t		an_action4;
    514 	uint16_t		an_ethertype5;
    515 	uint16_t		an_action5;
    516 	uint16_t		an_ethertype6;
    517 	uint16_t		an_action6;
    518 };
    519 
    520 #define	AN_ENCAP_ACTION_RX	0x0001
    521 #define	AN_ENCAP_ACTION_TX	0x0002
    522 
    523 #define	AN_RXENCAP_NONE		0x0000
    524 #define	AN_RXENCAP_RFC1024	0x0001
    525 
    526 #define	AN_TXENCAP_RFC1024	0x0000
    527 #define	AN_TXENCAP_80211	0x0002
    528 
    529 #define	AN_RID_WEPKEY		0xFF15
    530 #define	AN_RID_WEPKEY2		0xFF16
    531 struct an_ltv_wepkey {
    532 	uint16_t	an_len;
    533 	uint16_t	an_index;
    534 	uint8_t		an_macaddr[6];
    535 	uint16_t	an_keylen;	/* WEP40: 5, WEP128: 13 bytes */
    536 	uint8_t		an_key[16];	/* key value */
    537 };
    538 
    539 #define	AN_RID_CRYPT		0xFF18
    540 struct an_ltv_crypt {
    541 	uint16_t	an_operation;		/* 0: enable  1: disable */
    542 	uint8_t		an_optionmask[2];	/* 1: WEP40   2: WEP128 */
    543 	uint8_t		an_filler[8];		/* put struct 6 bytes longer */
    544 };
    545 
    546 /*
    547  * Actual config, same structure as general config (read only).
    548  */
    549 #define	AN_RID_ACTUALCFG	0xFF20
    550 
    551 /*
    552  * Card capabilities (read only).
    553  */
    554 #define	AN_RID_CAPABILITIES	0xFF00
    555 struct an_ltv_caps {
    556 	uint16_t	an_len;
    557 	uint8_t		an_oui[3];		/* 0x02 */
    558 	uint8_t		an_pad0;		/* 0x05 */
    559 	uint16_t	an_prodnum;		/* 0x06 */
    560 	uint8_t		an_manufname[32];	/* 0x08 */
    561 	uint8_t		an_prodname[16];	/* 0x28 */
    562 	uint8_t		an_prodvers[8];		/* 0x38 */
    563 	uint8_t		an_oemaddr[6];		/* 0x40 */
    564 	uint8_t		an_aironetaddr[6];	/* 0x46 */
    565 	uint16_t	an_radiotype;		/* 0x4C */
    566 	uint16_t	an_country;		/* 0x4E */
    567 	uint8_t		an_callid[6];		/* 0x50 */
    568 	uint8_t		an_supported_rates[8];	/* 0x56 */
    569 	uint8_t		an_rx_diversity;	/* 0x5E */
    570 	uint8_t		an_tx_diversity;	/* 0x5F */
    571 	uint16_t	an_tx_powerlevels[8];	/* 0x60 */
    572 	uint16_t	an_hwver;		/* 0x70 */
    573 	uint16_t	an_hwcaps;		/* 0x72 */
    574 	uint16_t	an_temprange;		/* 0x74 */
    575 	uint16_t	an_fwrev;		/* 0x76 */
    576 	uint16_t	an_fwsubrev;		/* 0x78 */
    577 	uint16_t	an_interfacerev;	/* 0x7A */
    578 	uint16_t	an_softcap;		/* 0x7C */
    579 	uint16_t	an_bootblockrev;	/* 0x7E */
    580 	uint16_t	an_requiredhw;		/* 0x80 */
    581 	uint16_t	an_pad;
    582 };
    583 
    584 /*
    585  * Access point (read only)
    586  */
    587 #define	AN_RID_APINFO		0xFF01
    588 struct an_ltv_apinfo {
    589 	uint16_t		an_len;
    590 	uint16_t		an_tim_addr;
    591 	uint16_t		an_airo_addr;
    592 };
    593 
    594 /*
    595  * Radio info (read only).
    596  */
    597 #define	AN_RID_RADIOINFO	0xFF02
    598 struct an_ltv_radioinfo {
    599 	uint16_t		an_len;
    600 	/*
    601 	 * some more fields here, waiting for freebsd code update.
    602 	 */
    603 };
    604 
    605 /*
    606  * Status (read only). Note: the manual claims this RID is 108 bytes
    607  * long (0x6A is the last datum, which is 2 bytes long) however when
    608  * this RID is read from the NIC, it returns a length of 110. To be
    609  * on the safe side, this structure is padded with an extra 16-bit
    610  * word. (There is a misprint in the manual which says the macaddr
    611  * field is 8 bytes long.)
    612  *
    613  * Also, the channel_set and current_channel fields appear to be
    614  * reversed. Either that, or the hop_period field is unused.
    615  */
    616 #define	AN_RID_STATUS		0xFF50
    617 struct an_ltv_status {
    618 	uint16_t	an_len;
    619 	uint8_t		an_macaddr[6];		/* 0x02 */
    620 	uint16_t	an_opmode;		/* 0x08 */
    621 	uint16_t	an_errcode;		/* 0x0A */
    622 	uint16_t	an_cur_signal_quality;	/* 0x0C */
    623 	uint16_t	an_ssidlen;		/* 0x0E */
    624 	uint8_t		an_ssid[32];		/* 0x10 */
    625 	uint8_t		an_ap_name[16];		/* 0x30 */
    626 	uint8_t		an_cur_bssid[6];	/* 0x40 */
    627 	uint8_t		an_prev_bssid1[6];	/* 0x46 */
    628 	uint8_t		an_prev_bssid2[6];	/* 0x4C */
    629 	uint8_t		an_prev_bssid3[6];	/* 0x52 */
    630 	uint16_t	an_beacon_period;	/* 0x58 */
    631 	uint16_t	an_dtim_period;		/* 0x5A */
    632 	uint16_t	an_atim_duration;	/* 0x5C */
    633 	uint16_t	an_hop_period;		/* 0x5E */
    634 	uint16_t	an_channel_set;		/* 0x60 */
    635 	uint16_t	an_cur_channel;		/* 0x62 */
    636 	uint16_t	an_hops_to_backbone;	/* 0x64 */
    637 	uint16_t	an_ap_total_load;	/* 0x66 */
    638 	uint16_t	an_our_generated_load;	/* 0x68 */
    639 	uint16_t	an_accumulated_arl;	/* 0x6A */
    640 	uint16_t	an_signale_quality;	/* 0x6C */
    641 	uint16_t	an_cur_tx_rate;		/* 0x6E */
    642 	uint16_t	an_ap_device;		/* 0x70 */
    643 	uint16_t	an_normallized_rssi;	/* 0x72 */
    644 	uint16_t	an_short_preamble;	/* 0x74 */
    645 	uint8_t		an_ap_ip_address[4];	/* 0x76 */
    646 	uint8_t		an_noise_pct;		/* 0x7A */
    647 	uint8_t		an_noise_dbm;		/* 0x7B */
    648 	uint8_t		an_noise_average_pct;	/* 0x7C */
    649 	uint8_t		an_noise_average_dbm;	/* 0x7D */
    650 	uint8_t		an_noise_max_pct;	/* 0x7E */
    651 	uint8_t		an_noise_max_dbm;	/* 0x7F */
    652 	uint16_t	an_load;		/* 0x80 */
    653 	uint8_t		an_carrier[4];		/* 0x82 */
    654 	uint16_t	an_assoc_status;	/* 0x86 */
    655 	uint16_t	an_pad;
    656 };
    657 
    658 #define	AN_STATUS_OPMODE_CONFIGURED		0x0001
    659 #define	AN_STATUS_OPMODE_MAC_ENABLED		0x0002
    660 #define	AN_STATUS_OPMODE_RX_ENABLED		0x0004
    661 #define	AN_STATUS_OPMODE_IN_SYNC		0x0010
    662 #define	AN_STATUS_OPMODE_ASSOCIATED		0x0020
    663 #define	AN_STATUS_OPMODE_ERROR			0x8000
    664 
    665 
    666 /*
    667  * Statistics
    668  */
    669 #define	AN_RID_16BITS_CUM	0xFF60	/* Cumulative 16-bit stats counters */
    670 #define	AN_RID_16BITS_DELTA	0xFF61	/* 16-bit stats (since last clear) */
    671 #define	AN_RID_16BITS_DELTACLR	0xFF62	/* 16-bit stats, clear on read */
    672 #define	AN_RID_32BITS_CUM	0xFF68	/* Cumulative 32-bit stats counters */
    673 #define	AN_RID_32BITS_DELTA	0xFF69	/* 32-bit stats (since last clear) */
    674 #define	AN_RID_32BITS_DELTACLR	0xFF6A	/* 32-bit stats, clear on read */
    675 
    676 /*
    677  * Grrr. The manual says the statistics record is 384 bytes in length,
    678  * but the card says the record is 404 bytes. There's some padding left
    679  * at the end of this structure to account for any discrepancies.
    680  */
    681 struct an_ltv_stats {
    682 	uint16_t		an_len;
    683 	uint16_t		an_rx_overruns;		/* 0x02 */
    684 	uint16_t		an_rx_plcp_csum_errs;	/* 0x04 */
    685 	uint16_t		an_rx_plcp_format_errs;	/* 0x06 */
    686 	uint16_t		an_rx_plcp_len_errs;	/* 0x08 */
    687 	uint16_t		an_rx_mac_crc_errs;	/* 0x0A */
    688 	uint16_t		an_rx_mac_crc_ok;	/* 0x0C */
    689 	uint16_t		an_rx_wep_errs;		/* 0x0E */
    690 	uint16_t		an_rx_wep_ok;		/* 0x10 */
    691 	uint16_t		an_retry_long;		/* 0x12 */
    692 	uint16_t		an_retry_short;		/* 0x14 */
    693 	uint16_t		an_retry_max;		/* 0x16 */
    694 	uint16_t		an_no_ack;		/* 0x18 */
    695 	uint16_t		an_no_cts;		/* 0x1A */
    696 	uint16_t		an_rx_ack_ok;		/* 0x1C */
    697 	uint16_t		an_rx_cts_ok;		/* 0x1E */
    698 	uint16_t		an_tx_ack_ok;		/* 0x20 */
    699 	uint16_t		an_tx_rts_ok;		/* 0x22 */
    700 	uint16_t		an_tx_cts_ok;		/* 0x24 */
    701 	uint16_t		an_tx_lmac_mcasts;	/* 0x26 */
    702 	uint16_t		an_tx_lmac_bcasts;	/* 0x28 */
    703 	uint16_t		an_tx_lmac_ucast_frags;	/* 0x2A */
    704 	uint16_t		an_tx_lmac_ucasts;	/* 0x2C */
    705 	uint16_t		an_tx_beacons;		/* 0x2E */
    706 	uint16_t		an_rx_beacons;		/* 0x30 */
    707 	uint16_t		an_tx_single_cols;	/* 0x32 */
    708 	uint16_t		an_tx_multi_cols;	/* 0x34 */
    709 	uint16_t		an_tx_defers_no;	/* 0x36 */
    710 	uint16_t		an_tx_defers_prot;	/* 0x38 */
    711 	uint16_t		an_tx_defers_energy;	/* 0x3A */
    712 	uint16_t		an_rx_dups;		/* 0x3C */
    713 	uint16_t		an_rx_partial;		/* 0x3E */
    714 	uint16_t		an_tx_too_old;		/* 0x40 */
    715 	uint16_t		an_rx_too_old;		/* 0x42 */
    716 	uint16_t		an_lostsync_max_retries; /* 0x44 */
    717 	uint16_t		an_lostsync_missed_beacons; /* 0x46 */
    718 	uint16_t		an_lostsync_arl_exceeded; /* 0x48 */
    719 	uint16_t		an_lostsync_deauthed;	/* 0x4A */
    720 	uint16_t		an_lostsync_disassociated; /* 0x4C */
    721 	uint16_t		an_lostsync_tsf_timing;	/* 0x4E */
    722 	uint16_t		an_tx_host_mcasts;	/* 0x50 */
    723 	uint16_t		an_tx_host_bcasts;	/* 0x52 */
    724 	uint16_t		an_tx_host_ucasts;	/* 0x54 */
    725 	uint16_t		an_tx_host_failed;	/* 0x56 */
    726 	uint16_t		an_rx_host_mcasts;	/* 0x58 */
    727 	uint16_t		an_rx_host_bcasts;	/* 0x5A */
    728 	uint16_t		an_rx_host_ucasts;	/* 0x5C */
    729 	uint16_t		an_rx_host_discarded;	/* 0x5E */
    730 	uint16_t		an_tx_hmac_mcasts;	/* 0x60 */
    731 	uint16_t		an_tx_hmac_bcasts;	/* 0x62 */
    732 	uint16_t		an_tx_hmac_ucasts;	/* 0x64 */
    733 	uint16_t		an_tx_hmac_failed;	/* 0x66 */
    734 	uint16_t		an_rx_hmac_mcasts;	/* 0x68 */
    735 	uint16_t		an_rx_hmac_bcasts;	/* 0x6A */
    736 	uint16_t		an_rx_hmac_ucasts;	/* 0x6C */
    737 	uint16_t		an_rx_hmac_discarded;	/* 0x6E */
    738 	uint16_t		an_tx_hmac_accepted;	/* 0x70 */
    739 	uint16_t		an_ssid_mismatches;	/* 0x72 */
    740 	uint16_t		an_ap_mismatches;	/* 0x74 */
    741 	uint16_t		an_rates_mismatches;	/* 0x76 */
    742 	uint16_t		an_auth_rejects;	/* 0x78 */
    743 	uint16_t		an_auth_timeouts;	/* 0x7A */
    744 	uint16_t		an_assoc_rejects;	/* 0x7C */
    745 	uint16_t		an_assoc_timeouts;	/* 0x7E */
    746 	uint16_t		an_reason_outside_table; /* 0x80 */
    747 	uint16_t		an_reason1;		/* 0x82 */
    748 	uint16_t		an_reason2;		/* 0x84 */
    749 	uint16_t		an_reason3;		/* 0x86 */
    750 	uint16_t		an_reason4;		/* 0x88 */
    751 	uint16_t		an_reason5;		/* 0x8A */
    752 	uint16_t		an_reason6;		/* 0x8C */
    753 	uint16_t		an_reason7;		/* 0x8E */
    754 	uint16_t		an_reason8;		/* 0x90 */
    755 	uint16_t		an_reason9;		/* 0x92 */
    756 	uint16_t		an_reason10;		/* 0x94 */
    757 	uint16_t		an_reason11;		/* 0x96 */
    758 	uint16_t		an_reason12;		/* 0x98 */
    759 	uint16_t		an_reason13;		/* 0x9A */
    760 	uint16_t		an_reason14;		/* 0x9C */
    761 	uint16_t		an_reason15;		/* 0x9E */
    762 	uint16_t		an_reason16;		/* 0xA0 */
    763 	uint16_t		an_reason17;		/* 0xA2 */
    764 	uint16_t		an_reason18;		/* 0xA4 */
    765 	uint16_t		an_reason19;		/* 0xA6 */
    766 	uint16_t		an_rx_mgmt_pkts;	/* 0xA8 */
    767 	uint16_t		an_tx_mgmt_pkts;	/* 0xAA */
    768 	uint16_t		an_rx_refresh_pkts;	/* 0xAC */
    769 	uint16_t		an_tx_refresh_pkts;	/* 0xAE */
    770 	uint16_t		an_rx_poll_pkts;	/* 0xB0 */
    771 	uint16_t		an_tx_poll_pkts;	/* 0xB2 */
    772 	uint16_t		an_host_retries;	/* 0xB4 */
    773 	uint16_t		an_lostsync_hostreq;	/* 0xB6 */
    774 	uint16_t		an_host_tx_bytes;	/* 0xB8 */
    775 	uint16_t		an_host_rx_bytes;	/* 0xBA */
    776 	uint16_t		an_uptime_usecs;	/* 0xBC */
    777 	uint16_t		an_uptime_secs;		/* 0xBE */
    778 	uint16_t		an_lostsync_better_ap;	/* 0xC0 */
    779 	uint16_t		an_privacy_mismatch;	/* 0xC2 */
    780 	uint16_t		an_jammed;		/* 0xC4 */
    781 	uint16_t		an_rx_disc_wep_off;	/* 0xC6 */
    782 	uint16_t		an_phy_ele_mismatch;	/* 0xC8 */
    783 	uint16_t		an_leap_success;	/* 0xCA */
    784 	uint16_t		an_leap_failure;	/* 0xCC */
    785 	uint16_t		an_leap_timeouts;	/* 0xCE */
    786 	uint16_t		an_leap_keylen_fail;	/* 0xD0 */
    787 };
    788 
    789 #define	AN_RID_ESSIDLIST_FIRST	0xFF72
    790 #define	AN_RID_ESSIDLIST_NEXT	0xFF73
    791 
    792 struct an_ltv_scanresult {
    793 	uint16_t	an_len;
    794 	uint16_t	an_index;
    795 	uint16_t	an_radiotype;
    796 	uint8_t		an_bssid[6];
    797 #ifdef	_BIG_ENDIAN
    798 	uint8_t		an_ssidlen;
    799 	uint8_t		an_zero;
    800 #else
    801 	uint8_t		an_zero;
    802 	uint8_t		an_ssidlen;
    803 #endif
    804 	char		an_ssid[32];
    805 	uint16_t	an_rssi;
    806 	uint16_t	an_cap;
    807 	uint16_t	an_beaconinterval;
    808 	uint8_t		an_rates[8];
    809 	struct {
    810 		uint16_t	dwell;
    811 		uint8_t		hopset;
    812 		uint8_t		hoppattern;
    813 		uint8_t		hopindex;
    814 		uint8_t		pad;
    815 	} an_fh;
    816 	uint16_t	an_dschannel;
    817 	uint16_t	an_atimwindow;
    818 };
    819 
    820 /*
    821  * seconds after which the scan item ages
    822  */
    823 #define	AN_SCAN_TIMEOUT_MAX	30
    824 
    825 /*
    826  * threshold of scan result items below which scan will run again.
    827  */
    828 #define	AN_SCAN_AGAIN_THRESHOLD	5
    829 
    830 typedef struct an_scan_list {
    831 	struct an_ltv_scanresult	an_val;
    832 	uint32_t			an_timeout;
    833 	list_node_t			an_scan_node;
    834 } an_scan_list_t;
    835 
    836 /*
    837  * Receive frame structure.
    838  */
    839 typedef struct an_rxframe {
    840 	uint32_t	an_rx_time;		/* 0x00 */
    841 	uint16_t	an_rx_status;		/* 0x04 */
    842 	uint16_t	an_rx_payload_len;	/* 0x06 */
    843 	uint8_t		an_rsvd0;		/* 0x08 */
    844 	uint8_t		an_rx_signal_strength;	/* 0x09 */
    845 	uint8_t		an_rx_rate;		/* 0x0A */
    846 	uint8_t		an_rx_chan;		/* 0x0B */
    847 	uint8_t		an_rx_assoc_cnt;	/* 0x0C */
    848 	uint8_t		an_rsvd1[3];		/* 0x0D */
    849 	uint8_t		an_plcp_hdr[4];		/* 0x10 */
    850 	uint16_t	an_frame_ctl;		/* 0x14 */
    851 	uint16_t	an_duration;		/* 0x16 */
    852 	uint8_t		an_addr1[6];		/* 0x18 */
    853 	uint8_t		an_addr2[6];		/* 0x1E */
    854 	uint8_t		an_addr3[6];		/* 0x24 */
    855 	uint16_t	an_seq_ctl;		/* 0x2A */
    856 	uint8_t		an_addr4[6];		/* 0x2C */
    857 	uint16_t	an_gaplen;		/* 0x32 */
    858 } an_rxfrm_t;
    859 
    860 #define	AN_RXGAP_MAX	8
    861 
    862 /*
    863  * Transmit frame structure.
    864  */
    865 typedef struct an_txframe {
    866 	uint32_t	an_tx_sw;		/* 0x00 */
    867 	uint16_t	an_tx_status;		/* 0x04 */
    868 	uint16_t	an_tx_payload_len;	/* 0x06 */
    869 	uint16_t	an_tx_ctl;		/* 0x08 */
    870 	uint16_t	an_tx_assoc_id;		/* 0x0A */
    871 	uint16_t	an_tx_retry;		/* 0x0C */
    872 	uint8_t		an_tx_assoc_cnt;	/* 0x0E */
    873 	uint8_t		an_tx_rate;		/* 0x0F */
    874 	uint8_t		an_tx_max_long_retries;	/* 0x10 */
    875 	uint8_t		an_tx_max_short_retries; /* 0x11 */
    876 	uint8_t		an_rsvd0[2];		/* 0x12 */
    877 	uint16_t	an_frame_ctl;		/* 0x14 */
    878 	uint16_t	an_duration;		/* 0x16 */
    879 	uint8_t		an_addr1[6];		/* 0x18 */
    880 	uint8_t		an_addr2[6];		/* 0x1E */
    881 	uint8_t		an_addr3[6];		/* 0x24 */
    882 	uint16_t	an_seq_ctl;		/* 0x2A */
    883 	uint8_t		an_addr4[6];		/* 0x2C */
    884 	uint16_t	an_gaplen;		/* 0x32 */
    885 } an_txfrm_t;
    886 
    887 typedef struct an_frame {
    888 	union {
    889 		an_rxfrm_t rxfrm;
    890 		an_txfrm_t txfrm;
    891 	} frm;
    892 } an_frm_t;
    893 
    894 #define	AN_TXSTAT_EXCESS_RETRY	0x0002
    895 #define	AN_TXSTAT_LIFE_EXCEEDED	0x0004
    896 #define	AN_TXSTAT_AID_FAIL	0x0008
    897 #define	AN_TXSTAT_MAC_DISABLED	0x0010
    898 #define	AN_TXSTAT_ASSOC_LOST	0x0020
    899 
    900 #define	AN_TXCTL_RSVD		0x0001
    901 #define	AN_TXCTL_TXOK_INTR	0x0002
    902 #define	AN_TXCTL_TXERR_INTR	0x0004
    903 #define	AN_TXCTL_HEADER_TYPE	0x0008
    904 #define	AN_TXCTL_PAYLOAD_TYPE	0x0010
    905 #define	AN_TXCTL_NORELEASE	0x0020
    906 #define	AN_TXCTL_NORETRIES	0x0040
    907 #define	AN_TXCTL_CLEAR_AID	0x0080
    908 #define	AN_TXCTL_STRICT_ORDER	0x0100
    909 #define	AN_TXCTL_USE_RTS	0x0200
    910 
    911 #define	AN_HEADERTYPE_8023	0x0000
    912 #define	AN_HEADERTYPE_80211	0x0008
    913 
    914 #define	AN_PAYLOADTYPE_ETHER	0x0000
    915 #define	AN_PAYLOADTYPE_LLC	0x0010
    916 
    917 typedef enum {
    918 	ANC_RX_OVERRUNS,		/* 0x04 */
    919 	ANC_RX_PLCP_CSUM_ERRS,		/* 0x08 */
    920 	ANC_RX_PLCP_FORMAT_ERRS,	/* 0x0c */
    921 	ANC_RX_PLCP_LEN_ERRS,		/* 0x10 */
    922 	ANC_RX_MAC_CRC_ERRS,		/* 0x14 */
    923 	ANC_RX_MAC_CRC_OK,		/* 0x18 */
    924 	ANC_RX_WEP_ERRS,		/* 0x1c */
    925 	ANC_RX_WEP_OK,			/* 0x20 */
    926 	ANC_RETRY_LONG,			/* 0x24 */
    927 	ANC_RETRY_SHORT,		/* 0x28 */
    928 	ANC_RETRY_MAX,			/* 0x2c */
    929 	ANC_NO_ACK,			/* 0x30 */
    930 	ANC_NO_CTS,			/* 0x34 */
    931 	ANC_RX_ACK_OK,			/* 0x38 */
    932 	ANC_RX_CTS_OK,			/* 0x3c */
    933 	ANC_TX_ACK_OK,			/* 0x40 */
    934 	ANC_TX_RTS_OK,			/* 0x44 */
    935 	ANC_TX_CTS_OK,			/* 0x48 */
    936 	ANC_TX_LMAC_MCASTS,		/* 0x4c */
    937 	ANC_TX_LMAC_BCASTS,		/* 0x50 */
    938 	ANC_TX_LMAC_UCAST_FRAGS,	/* 0x54 */
    939 	ANC_TX_LMAC_UCASTS,		/* 0x58 */
    940 	ANC_TX_BEACONS,			/* 0x5c */
    941 	ANC_RX_BEACONS,			/* 0x60 */
    942 	ANC_TX_SINGLE_COLS,		/* 0x64 */
    943 	ANC_TX_MULTI_COLS,		/* 0x68 */
    944 	ANC_TX_DEFERS_NO,		/* 0x6c */
    945 	ANC_TX_DEFERS_PROT,		/* 0x70 */
    946 	ANC_TX_DEFERS_ENERGY,		/* 0x74 */
    947 	ANC_RX_DUPS,			/* 0x78 */
    948 	ANC_RX_PARTIAL,			/* 0x7c */
    949 	ANC_TX_TOO_OLD,			/* 0x80 */
    950 	ANC_RX_TOO_OLD,			/* 0x84 */
    951 	ANC_LOSTSYNC_MAX_RETRIES,	/* 0x88 */
    952 	ANC_LOSTSYNC_MISSED_BEACONS,	/* 0x8c */
    953 	ANC_LOSTSYNC_ARL_EXCEEDED,	/* 0x90 */
    954 	ANC_LOSTSYNC_DEAUTHED,		/* 0x94 */
    955 	ANC_LOSTSYNC_DISASSOCIATED,	/* 0x98 */
    956 	ANC_LOSTSYNC_TSF_TIMING,	/* 0x9c */
    957 	ANC_TX_HOST_MCASTS,		/* 0xa0 */
    958 	ANC_TX_HOST_BCASTS,		/* 0xa4 */
    959 	ANC_TX_HOST_UCASTS,		/* 0xa8 */
    960 	ANC_TX_HOST_FAILED,		/* 0xac */
    961 	ANC_RX_HOST_MCASTS,		/* 0xb0 */
    962 	ANC_RX_HOST_BCASTS,		/* 0xb4 */
    963 	ANC_RX_HOST_UCASTS,		/* 0xb8 */
    964 	ANC_RX_HOST_DISCARDED,		/* 0xbc */
    965 	ANC_TX_HMAC_MCASTS,		/* 0xc0 */
    966 	ANC_TX_HMAC_BCASTS,		/* 0xc4 */
    967 	ANC_TX_HMAC_UCASTS,		/* 0xc8 */
    968 	ANC_TX_HMAC_FAILED,		/* 0xcc */
    969 	ANC_RX_HMAC_MCASTS,		/* 0xd0 */
    970 	ANC_RX_HMAC_BCASTS,		/* 0xd4 */
    971 	ANC_RX_HMAC_UCASTS,		/* 0xd8 */
    972 	ANC_RX_HMAC_DISCARDED,		/* 0xdc */
    973 	ANC_TX_HMAC_ACCEPTED,		/* 0xe0 */
    974 	ANC_SSID_MISMATCHES,		/* 0xe4 */
    975 	ANC_AP_MISMATCHES,		/* 0xe8 */
    976 	ANC_RATES_MISMATCHES,		/* 0xec */
    977 	ANC_AUTH_REJECTS,		/* 0xf0 */
    978 	ANC_AUTH_TIMEOUTS,		/* 0xf4 */
    979 	ANC_ASSOC_REJECTS,		/* 0xf8 */
    980 	ANC_ASSOC_TIMEOUTS,		/* 0xfc */
    981 	ANC_REASON_OUTSIDE_TABLE,	/* 0x100 */
    982 	ANC_REASON1,			/* 0x104 */
    983 	ANC_REASON2,			/* 0x108 */
    984 	ANC_REASON3,			/* 0x10c */
    985 	ANC_REASON4,			/* 0x110 */
    986 	ANC_REASON5,			/* 0x114 */
    987 	ANC_REASON6,			/* 0x118 */
    988 	ANC_REASON7,			/* 0x11c */
    989 	ANC_REASON8,			/* 0x120 */
    990 	ANC_REASON9,			/* 0x124 */
    991 	ANC_REASON10,			/* 0x128 */
    992 	ANC_REASON11,			/* 0x12c */
    993 	ANC_REASON12,			/* 0x130 */
    994 	ANC_REASON13,			/* 0x134 */
    995 	ANC_REASON14,			/* 0x138 */
    996 	ANC_REASON15,			/* 0x13c */
    997 	ANC_REASON16,			/* 0x140 */
    998 	ANC_REASON17,			/* 0x144 */
    999 	ANC_REASON18,			/* 0x148 */
   1000 	ANC_REASON19,			/* 0x14c */
   1001 	ANC_RX_MGMT_PKTS,		/* 0x150 */
   1002 	ANC_TX_MGMT_PKTS,		/* 0x154 */
   1003 	ANC_RX_REFRESH_PKTS,		/* 0x158 */
   1004 	ANC_TX_REFRESH_PKTS,		/* 0x15c */
   1005 	ANC_RX_POLL_PKTS,		/* 0x160 */
   1006 	ANC_TX_POLL_PKTS,		/* 0x164 */
   1007 	ANC_HOST_RETRIES,		/* 0x168 */
   1008 	ANC_LOSTSYNC_HOSTREQ,		/* 0x16c */
   1009 	ANC_HOST_TX_BYTES,		/* 0x170 */
   1010 	ANC_HOST_RX_BYTES,		/* 0x174 */
   1011 	ANC_UPTIME_USECS,		/* 0x178 */
   1012 	ANC_UPTIME_SECS,		/* 0x17c */
   1013 	ANC_LOSTSYNC_BETTER_AP,		/* 0x180 */
   1014 	ANC_PRIVACY_MISMATCH,		/* 0x184 */
   1015 	ANC_JAMMED,			/* 0x188 */
   1016 	ANC_RX_DISC_WEP_OFF,		/* 0x18c */
   1017 	ANC_PHY_ELE_MISMATCH,		/* 0x190 */
   1018 	ANC_LEAP_SUCCESS,		/* 0x194 */
   1019 	ANC_LEAP_FAILURE,		/* 0x198 */
   1020 	ANC_LEAP_TIMEOUTS,		/* 0x19c */
   1021 	ANC_LEAP_KEYLEN_FAIL,		/* 0x1a0 */
   1022 	ANC_STAT_CNT			/* - keep it as the last entry */
   1023 } pcan_cntr_offset;
   1024 
   1025 #define	AN_TXCTL_80211	(AN_TXCTL_TXOK_INTR | AN_TXCTL_TXERR_INTR | \
   1026 		AN_HEADERTYPE_80211 | AN_PAYLOADTYPE_LLC | AN_TXCTL_NORELEASE)
   1027 
   1028 #define	AN_TXCTL_8023	(AN_TXCTL_TXOK_INTR | AN_TXCTL_TXERR_INTR |\
   1029 		AN_HEADERTYPE_8023 | AN_PAYLOADTYPE_ETHER | AN_TXCTL_NORELEASE)
   1030 
   1031 #define	AN_TXGAP_80211		6
   1032 #define	AN_TXGAP_8023		0
   1033 
   1034 #define	AN_NORMAL_RXMODE	(AN_RXMODE_BC_MC_ADDR | \
   1035 					AN_RXMODE_USE_8023_HEADER)
   1036 #define	AN_MONITOR_RXMODE	(AN_RXMODE_LAN_MONITOR_CURBSS | \
   1037 					AN_RXMODE_USE_8023_HEADER)
   1038 struct an_802_3_hdr {
   1039 	uint16_t		an_8023_status;
   1040 	uint16_t		an_8023_payload_len;
   1041 	uint8_t			an_8023_dst_addr[6];
   1042 	uint8_t			an_8023_src_addr[6];
   1043 	uint16_t		an_8023_dat[3];	/* SNAP header */
   1044 	uint16_t		an_8023_type;
   1045 };
   1046 
   1047 typedef struct an_snap_hdr {
   1048 	uint16_t		an_snap_dat[3];	/* SNAP header */
   1049 	uint16_t		an_snap_type;
   1050 } pcan_snaphdr_t;
   1051 
   1052 #define	AN_TX_RING_CNT		4
   1053 #define	AN_TX_RING_MASK		(4 - 1)
   1054 #define	AN_INC(x, y)		(x) = (x + 1) % (y)
   1055 
   1056 typedef struct an_tx_ring_data {
   1057 	uint16_t		an_tx_fids[AN_TX_RING_CNT];
   1058 	uint16_t		an_tx_ring[AN_TX_RING_CNT];
   1059 	int			an_tx_prod;
   1060 	int			an_tx_cons;
   1061 	kmutex_t		an_tx_lock;	/* for send only */
   1062 } pcan_txring_t;
   1063 
   1064 #define	AN_802_3_OFFSET		0x2E
   1065 #define	AN_802_11_OFFSET	0x44
   1066 #define	AN_802_11_OFFSET_RAW	0x3C
   1067 
   1068 #define	AN_STAT_BADCRC		0x0001
   1069 #define	AN_STAT_UNDECRYPTABLE	0x0002
   1070 #define	AN_STAT_ERRSTAT		0x0003
   1071 #define	AN_STAT_MAC_PORT	0x0700
   1072 #define	AN_STAT_1042		0x2000	/* RFC1042 encoded */
   1073 #define	AN_STAT_TUNNEL		0x4000	/* Bridge-tunnel encoded */
   1074 #define	AN_STAT_WMP_MSG		0x6000	/* WaveLAN-II management protocol */
   1075 #define	AN_RXSTAT_MSG_TYPE	0xE000
   1076 
   1077 #define	AN_ENC_TX_802_3		0x00
   1078 #define	AN_ENC_TX_802_11	0x11
   1079 #define	AN_ENC_TX_E_II		0x0E
   1080 
   1081 #define	AN_ENC_TX_1042		0x00
   1082 #define	AN_ENC_TX_TUNNEL	0xF8
   1083 
   1084 #define	AN_TXCNTL_MACPORT	0x00FF
   1085 #define	AN_TXCNTL_STRUCTTYPE	0xFF00
   1086 
   1087 /*
   1088  * SNAP (sub-network access protocol) constants for transmission
   1089  * of IP datagrams over IEEE 802 networks, taken from RFC1042.
   1090  * We need these for the LLC/SNAP header fields in the TX/RX frame
   1091  * structure.
   1092  */
   1093 #define	AN_SNAP_K1		0xaa	/* assigned global SAP for SNAP */
   1094 #define	AN_SNAP_K2		0x00
   1095 #define	AN_SNAP_CONTROL		0x03	/* unnumbered information format */
   1096 #define	AN_SNAP_WORD0		(AN_SNAP_K1 | (AN_SNAP_K1 << 8))
   1097 #define	AN_SNAP_WORD1		(AN_SNAP_K2 | (AN_SNAP_CONTROL << 8))
   1098 #define	AN_SNAPHDR_LEN		0x6
   1099 
   1100 #define	AN_FTYPE_DATA		0x8
   1101 #define	ETH_HDRLEN		(sizeof (struct ether_header))	/* 14 bytes */
   1102 #define	MLEN(mp)		((mp)->b_wptr - (mp)->b_rptr)
   1103 
   1104 typedef struct pcan_dma_info {
   1105 	ddi_dma_handle_t	dma_handle;
   1106 	ddi_acc_handle_t	dma_acc_handle;
   1107 	uint32_t		dma_physaddr;
   1108 	caddr_t			dma_virtaddr;
   1109 	uint_t			ncookies;
   1110 } pcan_dma_info_t;
   1111 
   1112 #define	PCAN_DMA_SYNC(hdl, len, flag) ((void) ddi_dma_sync(hdl, 0, len, (flag)))
   1113 
   1114 /*
   1115  * The macinfo is really used as the softstate structure.
   1116  *
   1117  * pcan_mh	 - mac_handle_t structure
   1118  * pcan_cslock	 - lock for card services request. Used with pcan_cscv
   1119  * pcan_cscv	 - condition variable to wait for card events
   1120  * pcan_chdl	 - client handle, an uint32_t bit mask encoding for socket,
   1121  *			function, and client info.
   1122  *			See cs_priv.h MAKE_CLIENT_HANDLE.
   1123  * pcan_log_sock - holds the logical to physical translation for this card.
   1124  *			Specifically has physical adapter and socket #.
   1125  *			Socket # is the same as part of the pcan_chdl encoding.
   1126  *			Physical adapter # is from card service socket impl.
   1127  */
   1128 typedef struct pcan_macinfo {
   1129 	mac_handle_t		pcan_mh;
   1130 	dev_info_t		*pcan_dip;
   1131 
   1132 	kmutex_t		pcan_cslock;	/* for card services */
   1133 	kcondvar_t		pcan_cscv;	/* for card services */
   1134 	client_handle_t		pcan_chdl;	/* s,f,c encoding, cs_priv.h */
   1135 	map_log_socket_t	pcan_log_sock;	/* logical/phys socket map */
   1136 	int			pcan_socket;	/* socket number */
   1137 	int			pcan_config_hi;	/* cfttbl index */
   1138 	int			pcan_config;	/* default config index */
   1139 	int			pcan_vcc;	/* vcc level */
   1140 	int			pcan_iodecode;	/* # of address lines */
   1141 	int			pcan_usewep;
   1142 	int			pcan_reset_delay;
   1143 
   1144 	caddr_t			pcan_cfg_base;
   1145 	ddi_acc_handle_t	pcan_cfg_handle;
   1146 	caddr_t			pcan_bar0;
   1147 	ddi_acc_handle_t	pcan_handle0;
   1148 	caddr_t			pcan_bar1;
   1149 	ddi_acc_handle_t	pcan_handle1;
   1150 	caddr_t			pcan_bar2;
   1151 	ddi_acc_handle_t	pcan_handle2;
   1152 	int			pcan_device_type; /* pci or pcmcia card */
   1153 
   1154 	uint8_t 		pcan_mac_addr[ETHERADDRL];
   1155 	uint32_t		pcan_flag;
   1156 	uint32_t		pcan_reschedule_need;
   1157 	uint32_t		glds_nocarrier;
   1158 	uint32_t		glds_noxmtbuf;
   1159 	uint32_t		glds_norcvbuf;
   1160 	uint32_t		glds_intr;
   1161 
   1162 	pcan_dma_info_t	pcan_cmd;
   1163 	pcan_dma_info_t	pcan_rx[AN_MAX_RX_DESC];
   1164 	pcan_dma_info_t	pcan_tx[AN_MAX_TX_DESC];
   1165 
   1166 	kmutex_t		pcan_glock;	/* generic lock */
   1167 	kmutex_t		pcan_scanlist_lock;	/* scanlist lock */
   1168 	pcan_txring_t		pcan_txring;
   1169 
   1170 	struct an_ltv_ssidlist	an_ssidlist;
   1171 	struct an_ltv_aplist	an_aplist;
   1172 	struct an_ltv_caps	an_caps;
   1173 	struct an_ltv_crypt	an_crypt;
   1174 	struct an_ltv_wepkey	an_wepkey[4];
   1175 	struct an_ltv_scanresult an_scanresult[32];
   1176 	uint16_t		an_cur_wepkey;
   1177 	uint16_t		an_scan_num;
   1178 	timeout_id_t		an_scanlist_timeout_id;
   1179 	list_t			an_scan_list;
   1180 	struct an_ltv_status	an_status;
   1181 	struct an_ltv_genconfig	an_config;
   1182 	struct an_ltv_genconfig	an_actual_config;
   1183 	struct an_ltv_stats	an_stats;
   1184 	uint64_t pcan_cntrs_s[ANC_STAT_CNT];
   1185 
   1186 	ddi_acc_handle_t	pcan_port;
   1187 	ddi_iblock_cookie_t	pcan_ib_cookie;
   1188 	ddi_softintr_t		pcan_softint_id;
   1189 
   1190 	ddi_softintr_t		pcan_info_softint_id;
   1191 	uint32_t		pcan_info_softint_pending;
   1192 
   1193 	timeout_id_t		pcan_connect_timeout_id;
   1194 	timeout_id_t		pcan_linkdown_timeout_id;
   1195 	int			pcan_badrids_len;
   1196 	prop_1275_cell_t	*pcan_badrids;
   1197 } pcan_maci_t;
   1198 
   1199 #define	PCAN_IDENT_STRING	modldrv.drv_linkinfo
   1200 
   1201 #define	HDL(pcan_p)		((pcan_p)->pcan_port)
   1202 #define	GLD3(pcan_p)		((pcan_p)->pcan_mh)
   1203 #define	DIP(pcan_p)		((pcan_p)->pcan_dip)
   1204 
   1205 #define	PCAN_CARD_INTREN	0x1
   1206 #define	PCAN_CARD_LINKUP	0x2
   1207 #define	PCAN_ATTACHED		0x4
   1208 #define	PCAN_CS_REGISTERED	0x8
   1209 #define	PCAN_ENABLED		0x10
   1210 #define	PCAN_CARD_SEND		0x20
   1211 #define	PCAN_CARD_READY		0x40
   1212 #define	PCAN_CARD_FAILED	0x80
   1213 #define	PCAN_PLUMBED		0x100
   1214 #define	PCAN_SUSPENDED		0x200
   1215 
   1216 #define	PCAN_STATE_IDLE		0x1
   1217 
   1218 #define	PCAN_NICMEM_SZ		(2048) /* 80211MTU set as 1500, so 2k here */
   1219 
   1220 static int	pcan_probe(dev_info_t *dip);
   1221 static int	pcan_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
   1222 static int	pcan_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
   1223 
   1224 static int	pcan_register_cs(dev_info_t *dip, pcan_maci_t *pcan_p);
   1225 static void	pcan_unregister_cs(pcan_maci_t *pcan_p);
   1226 static void	pcan_destroy_locks(pcan_maci_t *pcan_p);
   1227 static void	pcan_reset_backend(pcan_maci_t *pcan_p, int timeout);
   1228 static uint32_t	pcan_get_cap(pcan_maci_t *pcan_p);
   1229 static int	pcan_card_insert(pcan_maci_t *pcan_p);
   1230 static int	pcan_ev_hdlr(event_t ev, int pri, event_callback_args_t *arg);
   1231 static void	pcan_card_remove(pcan_maci_t *pcan_p);
   1232 static int	pcan_init_nicmem(pcan_maci_t *pcan_p);
   1233 static void	pcan_do_suspend(pcan_maci_t *pcan_p);
   1234 
   1235 /*
   1236  * high level device access primitives, glock must held before calling
   1237  */
   1238 static uint16_t	pcan_set_cmd0(pcan_maci_t *pcan_p, uint16_t cmd, uint16_t p0,
   1239     uint16_t p1, uint16_t p2);
   1240 static uint16_t	pcan_set_cmd(pcan_maci_t *pcan_p, uint16_t cmd, uint16_t param);
   1241 static uint16_t pcan_set_ch(pcan_maci_t *, uint16_t, uint16_t, uint16_t);
   1242 static int pcan_init_dma_desc(pcan_maci_t *pcan_p);
   1243 static int pcan_init_dma(dev_info_t *dip, pcan_maci_t *pcan_p);
   1244 static void pcan_free_dma(pcan_maci_t *pcan_p);
   1245 static uint16_t pcan_put_ltv(pcan_maci_t *pcan_p, uint16_t len, uint16_t type,
   1246     uint16_t *val_p);
   1247 static uint16_t	pcan_get_ltv(pcan_maci_t *pcan_p, uint16_t len, uint16_t type,
   1248     uint16_t *val_p);
   1249 #define	PCAN_READ_LTV	0
   1250 #define	PCAN_WRITE_LTV	1
   1251 static uint16_t pcan_status_ltv(int rw, pcan_maci_t *pcan_p,
   1252     struct an_ltv_status *status_p);
   1253 static uint16_t pcan_cfg_ltv(int rw, pcan_maci_t *pcan_p,
   1254     struct an_ltv_genconfig *cfg_p);
   1255 static uint16_t pcan_cap_ltv(int rw, pcan_maci_t *pcan_p);
   1256 static uint16_t pcan_ssid_ltv(int rw, pcan_maci_t *pcan_p);
   1257 static uint16_t pcan_aplist_ltv(int rw, pcan_maci_t *pcan_p);
   1258 static uint16_t pcan_scanresult_ltv(int rw, pcan_maci_t *pcan_p, uint16_t type,
   1259     struct an_ltv_scanresult *scanresult_p);
   1260 static uint16_t pcan_wepkey_ltv(int rw, pcan_maci_t *pcan_p);
   1261 static uint16_t pcan_rdch0(pcan_maci_t *pcan_p, uint16_t type, uint16_t off,
   1262     uint16_t *buf_p, int len, int order);
   1263 static uint16_t pcan_wrch1(pcan_maci_t *pcan_p, uint16_t type, uint16_t off,
   1264     uint16_t *buf_p, int len, int order);
   1265 static int	pcan_config_mac(pcan_maci_t *pcan_p);
   1266 static void	pcan_start_locked(pcan_maci_t *pcan_p);
   1267 static void	pcan_stop_locked(pcan_maci_t *pcan_p);
   1268 static uint16_t	pcan_alloc_nicmem(pcan_maci_t *pcan_p, uint16_t len,
   1269     uint16_t *id_p);
   1270 
   1271 /*
   1272  * Required driver entry points for gld
   1273  */
   1274 static int	pcan_start(void *);
   1275 static void	pcan_stop(void *);
   1276 static int	pcan_saddr(void *, const uint8_t *);
   1277 static mblk_t	*pcan_tx(void *, mblk_t *);
   1278 static int	pcan_send(pcan_maci_t *, mblk_t *);
   1279 static int	pcian_send(pcan_maci_t *, mblk_t *);
   1280 static int	pcan_prom(void *, boolean_t);
   1281 static int	pcan_gstat(void *, uint_t, uint64_t *);
   1282 static int	pcan_sdmulti(void *, boolean_t, const uint8_t *);
   1283 static void	pcan_ioctl(void *, queue_t *, mblk_t *);
   1284 
   1285 static uint_t	pcan_intr(caddr_t arg);
   1286 static uint_t	pcan_intr_hi(caddr_t arg);
   1287 static void	pcan_rcv(pcan_maci_t *pcan_p);
   1288 static void	pcian_rcv(pcan_maci_t *pcan_p);
   1289 static uint_t	pcan_info_softint(caddr_t arg);
   1290 static uint32_t	pcan_txdone(pcan_maci_t *pcan_p, uint16_t err);
   1291 static int	pcan_getset(mblk_t *mp, pcan_maci_t *pcan_p, uint32_t cmd);
   1292 static void	pcan_wlan_ioctl(pcan_maci_t *pcan_p, queue_t *wq,
   1293     mblk_t *mp, uint32_t cmd);
   1294 static int	pcan_loaddef(pcan_maci_t *pcan_p);
   1295 
   1296 static void	pcan_scanlist_timeout(void *);
   1297 static void	pcan_delete_scan_item(pcan_maci_t *, an_scan_list_t *);
   1298 static int	pcan_add_scan_item(pcan_maci_t *, struct an_ltv_scanresult);
   1299 static void	pcan_connect_timeout(void *arg);
   1300 
   1301 #define	RDCH0(h, t, o, bufp, l)		pcan_rdch0(h, t, o, bufp, l, 1)
   1302 #define	WRCH1(h, t, o, bufp, l)		pcan_wrch1(h, t, o, bufp, l, 1)
   1303 #define	RDPKT(h, t, o, bufp, l)		pcan_rdch0(h, t, o, bufp, l, 0)
   1304 #define	WRPKT(h, t, o, bufp, l)		pcan_wrch1(h, t, o, bufp, l, 0)
   1305 
   1306 #define	PCAN_READ(p, o, v)	{ \
   1307 	if (p->pcan_device_type == PCAN_DEVICE_PCI) { \
   1308 		uint16_t t = ddi_get16(p->pcan_handle0, \
   1309 		    (uint16_t *)(p->pcan_bar0 + o)); \
   1310 		v = LE_16(t); \
   1311 	} else { \
   1312 		uint16_t t = csx_Get16(HDL(p), o); \
   1313 		v = LE_16(t); \
   1314 	}\
   1315 }
   1316 #define	PCAN_WRITE(p, o, v)	{ \
   1317 	if (p->pcan_device_type == PCAN_DEVICE_PCI) { \
   1318 		ddi_put16(p->pcan_handle0, \
   1319 		    (uint16_t *)(p->pcan_bar0 + o), LE_16(v)); \
   1320 	} else { \
   1321 		csx_Put16(HDL(p), o, LE_16(v)); \
   1322 	}\
   1323 }
   1324 #define	PCAN_READ_P(p, o, v, h)	{ \
   1325 	if (p->pcan_device_type == PCAN_DEVICE_PCI) { \
   1326 		uint16_t t = ddi_get16(p->pcan_handle0, \
   1327 		    (uint16_t *)(p->pcan_bar0 + o)); \
   1328 		*(v) = h ? LE_16(t) : t; \
   1329 	} else { \
   1330 		uint16_t t = csx_Get16(HDL(p), o); \
   1331 		*(v) = h ? LE_16(t) : t; \
   1332 	}\
   1333 }
   1334 #define	PCAN_WRITE_P(p, o, v, h)	{ \
   1335 	if (p->pcan_device_type == PCAN_DEVICE_PCI) { \
   1336 		ddi_put16(p->pcan_handle0, (uint16_t *)(p->pcan_bar0 + o), \
   1337 		    h ? LE_16(*(v)) : (*(v))); \
   1338 	} else {\
   1339 		csx_Put16(HDL(p), o, h ? LE_16(*(v)) : (*(v))); \
   1340 	}\
   1341 }
   1342 
   1343 #ifdef _BIG_ENDIAN
   1344 #define	PCAN_SWAP16(buf_p, len) { \
   1345 	uint16_t pcan_swap_len = len; \
   1346 	for (pcan_swap_len = (pcan_swap_len + 1) >> 1; pcan_swap_len; ) { \
   1347 		uint16_t val; \
   1348 		pcan_swap_len--; \
   1349 		val = *((uint16_t *)(buf_p) + pcan_swap_len); \
   1350 		*((uint16_t *)(buf_p) + pcan_swap_len) = LE_16(val); \
   1351 	} \
   1352 }
   1353 #define	PCAN_SWAP16_BUF(buf_p) PCAN_SWAP16(buf_p, sizeof (buf_p))
   1354 #else /* _BIG_ENDIAN */
   1355 #define	PCAN_SWAP16(buf_p, len)
   1356 #define	PCAN_SWAP16_BUF(buf_p)
   1357 #endif /* _BIG_ENDIAN */
   1358 
   1359 #define	PCAN_ENABLE_INTR(pcan_p)	{\
   1360 	PCAN_WRITE(pcan_p, AN_INT_EN(pcan_p), AN_INTRS(pcan_p));\
   1361 }
   1362 #define	PCAN_DISABLE_INTR(pcan_p)	{ \
   1363 	PCAN_WRITE(pcan_p, AN_INT_EN(pcan_p), 0); \
   1364 }
   1365 #define	PCAN_DISABLE_INTR_CLEAR(pcan_p)	{ \
   1366 	PCAN_WRITE(pcan_p, AN_INT_EN(pcan_p), 0); \
   1367 	PCAN_WRITE(pcan_p, AN_EVENT_ACK(pcan_p), 0xffff);\
   1368 }
   1369 
   1370 #define	PCAN_AUX_PUT32(p, o, v)\
   1371 	ddi_put32(p->pcan_handle2, (uint32_t *)(p->pcan_bar2 + o), v)
   1372 #define	PCAN_AUX_GET32(p, o, v) {\
   1373 	v = ddi_get32(p->pcan_handle2, (uint32_t *)(p->pcan_bar2 + o));\
   1374 }
   1375 
   1376 /*
   1377  * 16-bit driver private status code
   1378  */
   1379 #define	PCAN_SUCCESS		0
   1380 #define	PCAN_FAIL		1
   1381 #define	PCAN_TIMEDOUT_CMD	0x10
   1382 #define	PCAN_TIMEDOUT_ACCESS	0x11
   1383 #define	PCAN_TIMEDOUT_TARGET	0x12
   1384 #define	PCAN_BADLEN		0x13
   1385 #define	PCAN_BADTYPE		0x14
   1386 #define	PCAN_TIMEDOUT_ALLOC	0x15
   1387 
   1388 #define	PCAN_STATUS_MAX		0xffff
   1389 
   1390 #ifdef	__cplusplus
   1391 }
   1392 #endif
   1393 
   1394 #endif	/* _SYS_PCAN_H */
   1395