| /* |
| * Copyright 2008 Sun Microsystems, Inc. All rights reserved. |
| * Use is subject to license terms. |
| */ |
| |
| /* |
| * Copyright (c) 2004, 2005 |
| * Damien Bergamini <damien.bergamini@free.fr>. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice unmodified, this list of conditions, and the following |
| * disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
| * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| */ |
| |
| #ifndef _SYS_IPW2200_IMPL_H |
| #define _SYS_IPW2200_IMPL_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* |
| * Intel Wireless PRO/2200 mini-pci adapter driver |
| * ipw2200_impl.h includes: |
| * . implementation of ipw2200 |
| * . hardware operations and interface definations for ipw2200 |
| * . firmware operations and interface definations for ipw2200 |
| */ |
| #include <sys/ddi.h> |
| #include <sys/sunddi.h> |
| #include <sys/mac.h> |
| #include <sys/mac_wifi.h> |
| #include <sys/net80211.h> |
| |
| /* |
| * Implementation of ipw2200 |
| */ |
| #define IPW2200_PCI_CFG_RNUM (0) /* pci config space */ |
| #define IPW2200_PCI_CSR_RNUM (1) /* device CSR space */ |
| #define IPW2200_PCI_INTR_NUM (0) /* interrupt number */ |
| |
| #define IPW2200_TX_RING_SIZE (64) |
| #define IPW2200_CMD_RING_SIZE (16) |
| #define IPW2200_RX_RING_SIZE (32) |
| |
| struct dma_region { |
| ddi_dma_handle_t dr_hnd; |
| ddi_acc_handle_t dr_acc; |
| ddi_dma_cookie_t dr_cookie; |
| uint_t dr_ccnt; |
| uint32_t dr_pbase; |
| caddr_t dr_base; |
| size_t dr_size; |
| const char *dr_name; |
| }; |
| |
| struct ipw2200_firmware { |
| uint8_t *boot_base; /* boot code */ |
| size_t boot_size; |
| uint8_t *uc_base; /* u-controller code */ |
| size_t uc_size; |
| uint8_t *fw_base; /* firmware code */ |
| size_t fw_size; |
| }; |
| |
| /* |
| * besides the statistic counted by net80211, driver can also record |
| * statistic data while process |
| */ |
| struct ipw2200_stats { |
| uint32_t sc_rx_len_err; |
| uint32_t sc_tx_discard; |
| uint32_t sc_tx_alloc_fail; |
| uint32_t sc_tx_encap_fail; |
| uint32_t sc_tx_crypto_fail; |
| }; |
| |
| /* |
| * per-instance soft-state structure |
| */ |
| struct ipw2200_softc { |
| struct ieee80211com sc_ic; |
| dev_info_t *sc_dip; |
| int (*sc_newstate)(struct ieee80211com *, |
| enum ieee80211_state, int); |
| void (*sc_node_free)(struct ieee80211com *); |
| int sc_authmode; |
| |
| /* CSR */ |
| ddi_acc_handle_t sc_ioh; |
| caddr_t sc_regs; |
| /* mutex to protect interrupt handler */ |
| kmutex_t sc_ilock; |
| /* interrupt iblock cookie */ |
| ddi_iblock_cookie_t sc_iblk; |
| /* soft interrupt */ |
| ddi_softintr_t sc_link_softint; |
| /* link status */ |
| int32_t sc_linkstate; |
| /* flags */ |
| uint32_t sc_flags; |
| #define IPW2200_FLAG_FW_CACHED (1 << 0) |
| #define IPW2200_FLAG_FW_INITED (1 << 1) |
| #define IPW2200_FLAG_RUNNING (1 << 2) |
| #define IPW2200_FLAG_LINK_CHANGE (1 << 3) |
| #define IPW2200_FLAG_TX_SCHED (1 << 4) |
| #define IPW2200_FLAG_SCANNING (1 << 5) |
| #define IPW2200_FLAG_HW_ERR_RECOVER (1 << 6) |
| #define IPW2200_FLAG_ASSOCIATED (1 << 7) |
| #define IPW2200_FLAG_SUSPEND (1 << 8) |
| #define IPW2200_FLAG_QUIESCED (1 << 9) |
| #define IPW2200_FLAG_HAS_RADIO_SWITCH (1 << 16) |
| /* firmware download */ |
| int sc_fw_ok; |
| kcondvar_t sc_fw_cond; |
| |
| /* command desc ring */ |
| kmutex_t sc_cmd_lock; |
| kcondvar_t sc_cmd_cond; |
| uint32_t sc_cmd_cur; |
| uint32_t sc_cmd_free; |
| struct ipw2200_cmd_desc *sc_cmdsc; |
| |
| /* command status */ |
| int sc_done[IPW2200_CMD_RING_SIZE]; |
| kcondvar_t sc_cmd_status_cond; |
| |
| /* tx ring, bd->hdr&buf */ |
| kmutex_t sc_tx_lock; |
| uint32_t sc_tx_cur; |
| uint32_t sc_tx_free; |
| struct ipw2200_tx_desc *sc_txdsc; |
| uint8_t *sc_txbufs[IPW2200_TX_RING_SIZE]; |
| |
| /* rx ring */ |
| uint32_t sc_rx_cur; |
| uint32_t sc_rx_free; |
| uint8_t *sc_rxbufs[IPW2200_RX_RING_SIZE]; |
| |
| /* tx-desc & tx-buffer array */ |
| struct dma_region sc_dma_txdsc; |
| struct dma_region sc_dma_txbufs[IPW2200_TX_RING_SIZE]; |
| struct dma_region sc_dma_cmdsc; |
| /* rx-buffer array */ |
| struct dma_region sc_dma_rxbufs[IPW2200_RX_RING_SIZE]; |
| |
| /* hw configuration values */ |
| uint8_t sc_macaddr[IEEE80211_ADDR_LEN]; |
| /* MAC address string */ |
| char sc_macstr[32]; |
| |
| /* firmware */ |
| struct ipw2200_firmware sc_fw; |
| |
| /* reschedule lock */ |
| kmutex_t sc_resched_lock; |
| |
| /* pci information */ |
| uint16_t sc_vendor, sc_device, sc_subven, sc_subdev; |
| |
| /* statistic counting by driver */ |
| struct ipw2200_stats sc_stats; |
| |
| /* mfthread related, mfthread is used to handle asynchronous task */ |
| kthread_t *sc_mf_thread; |
| kmutex_t sc_mflock; |
| int sc_mfthread_switch; |
| kcondvar_t sc_mfthread_req; |
| kcondvar_t sc_mfthread_cv; |
| |
| }; |
| |
| /* |
| * RING_BACKWARD - move 'x' backward 's' steps in a 'b'- sized ring |
| * RING_FORWARD - move 'x' forward 's' steps in a 'b'- sized ring |
| * |
| * note that there must be 0 <= 'x' < 'b' && 0 <= 's' < 'b' |
| */ |
| #define RING_FLEN(x, y, b) ((((x) > (y)) ? ((b)+(y)-(x)) : ((y)-(x)))) |
| #define RING_FORWARD(x, s, b) (((x)+(s))%(b)) |
| #define RING_BACKWARD(x, s, b) RING_FORWARD((x), (b)-(s), (b)) |
| |
| extern int ipw2200_init(struct ipw2200_softc *sc); |
| extern void ipw2200_wifi_ioctl(struct ipw2200_softc *, queue_t *, |
| mblk_t *, uint32_t); |
| extern int ipw2200_dma_region_alloc(struct ipw2200_softc *sc, |
| struct dma_region *dr, size_t size, uint_t dir, uint_t flags); |
| extern void ipw2200_dma_region_free(struct dma_region *dr); |
| extern int ipw2200_disable(struct ipw2200_softc *sc); |
| extern int ipw2200_start_scan(struct ipw2200_softc *sc); |
| |
| /* |
| * get radio off/on status |
| */ |
| extern int ipw2200_radio_status(struct ipw2200_softc *sc); |
| |
| /* |
| * Below structure and functions will be used for statistic, which will be |
| * displayed when the wificonfig running... |
| */ |
| struct statistic { |
| int index; |
| const char *desc; |
| }; |
| extern void ipw2200_get_statistics(struct ipw2200_softc *sc); |
| |
| /* |
| * Hardware related definations and interfaces. |
| */ |
| #define IPW2200_CSR_INTR (0x0008) |
| #define IPW2200_CSR_INTR_MASK (0x000c) |
| #define IPW2200_CSR_INDIRECT_ADDR (0x0010) |
| #define IPW2200_CSR_INDIRECT_DATA (0x0014) |
| #define IPW2200_CSR_AUTOINC_ADDR (0x0018) |
| #define IPW2200_CSR_AUTOINC_DATA (0x001c) |
| #define IPW2200_CSR_RST (0x0020) |
| #define IPW2200_CSR_CTL (0x0024) |
| #define IPW2200_CSR_IO (0x0030) |
| #define IPW2200_CSR_CMD_BASE (0x0200) |
| #define IPW2200_CSR_CMD_SIZE (0x0204) |
| #define IPW2200_CSR_TX1_BASE (0x0208) |
| #define IPW2200_CSR_TX1_SIZE (0x020c) |
| #define IPW2200_CSR_TX2_BASE (0x0210) |
| #define IPW2200_CSR_TX2_SIZE (0x0214) |
| #define IPW2200_CSR_TX3_BASE (0x0218) |
| #define IPW2200_CSR_TX3_SIZE (0x021c) |
| #define IPW2200_CSR_TX4_BASE (0x0220) |
| #define IPW2200_CSR_TX4_SIZE (0x0224) |
| #define IPW2200_CSR_CMD_READ_INDEX (0x0280) |
| #define IPW2200_CSR_TX1_READ_INDEX (0x0284) |
| #define IPW2200_CSR_TX2_READ_INDEX (0x0288) |
| #define IPW2200_CSR_TX3_READ_INDEX (0x028c) |
| #define IPW2200_CSR_TX4_READ_INDEX (0x0290) |
| #define IPW2200_CSR_RX_READ_INDEX (0x02a0) |
| #define IPW2200_CSR_RX_BASE (0x0500) |
| #define IPW2200_CSR_TABLE0_SIZE (0x0700) |
| #define IPW2200_CSR_TABLE0_BASE (0x0704) |
| #define IPW2200_CSR_NODE_BASE (0x0c0c) |
| #define IPW2200_CSR_CMD_WRITE_INDEX (0x0f80) |
| #define IPW2200_CSR_TX1_WRITE_INDEX (0x0f84) |
| #define IPW2200_CSR_TX2_WRITE_INDEX (0x0f88) |
| #define IPW2200_CSR_TX3_WRITE_INDEX (0x0f8c) |
| #define IPW2200_CSR_TX4_WRITE_INDEX (0x0f90) |
| #define IPW2200_CSR_RX_WRITE_INDEX (0x0fa0) |
| #define IPW2200_CSR_READ_INT (0x0ff4) |
| |
| #define IPW2200_CSR_CURRENTT_TX_RATE IPW2200_CSR_TABLE0_BASE |
| |
| /* |
| * CSR flags: IPW2200_CSR_INTR |
| */ |
| #define IPW2200_INTR_RX_TRANSFER (0x00000002) |
| #define IPW2200_INTR_CMD_TRANSFER (0x00000800) |
| #define IPW2200_INTR_TX1_TRANSFER (0x00001000) |
| #define IPW2200_INTR_TX2_TRANSFER (0x00002000) |
| #define IPW2200_INTR_TX3_TRANSFER (0x00004000) |
| #define IPW2200_INTR_TX4_TRANSFER (0x00008000) |
| #define IPW2200_INTR_FW_INITED (0x01000000) |
| #define IPW2200_INTR_RADIO_OFF (0x04000000) |
| #define IPW2200_INTR_FATAL_ERROR (0x40000000) |
| #define IPW2200_INTR_PARITY_ERROR (0x80000000) |
| |
| #define IPW2200_INTR_MASK_ALL (IPW2200_INTR_RX_TRANSFER | \ |
| IPW2200_INTR_CMD_TRANSFER | \ |
| IPW2200_INTR_TX1_TRANSFER | \ |
| IPW2200_INTR_TX2_TRANSFER | \ |
| IPW2200_INTR_TX3_TRANSFER | \ |
| IPW2200_INTR_TX4_TRANSFER | \ |
| IPW2200_INTR_FW_INITED | \ |
| IPW2200_INTR_RADIO_OFF | \ |
| IPW2200_INTR_FATAL_ERROR | \ |
| IPW2200_INTR_PARITY_ERROR) |
| |
| #define IPW2200_INTR_MASK_ERR (IPW2200_INTR_FATAL_ERROR | \ |
| IPW2200_INTR_PARITY_ERROR) |
| |
| /* |
| * CSR flags for register: IPW2200_CSR_RST, which is used to reset h/w |
| */ |
| #define IPW2200_RST_PRINCETON_RESET (0x00000001) |
| #define IPW2200_RST_STANDBY (0x00000004) |
| #define IPW2200_RST_LED_ACTIVITY (0x00000010) |
| #define IPW2200_RST_LED_ASSOCIATED (0x00000020) |
| #define IPW2200_RST_LED_OFDM (0x00000040) |
| #define IPW2200_RST_SW_RESET (0x00000080) |
| #define IPW2200_RST_MASTER_DISABLED (0x00000100) |
| #define IPW2200_RST_STOP_MASTER (0x00000200) |
| #define IPW2200_RST_GATE_ODMA (0x02000000) |
| #define IPW2200_RST_GATE_IDMA (0x04000000) |
| #define IPW2200_RST_GATE_ADMA (0x20000000) |
| |
| /* |
| * CSR flags for register: IPW2200_CSR_CTL |
| */ |
| #define IPW2200_CTL_CLOCK_READY (0x00000001) |
| #define IPW2200_CTL_ALLOW_STANDBY (0x00000002) |
| #define IPW2200_CTL_INIT (0x00000004) |
| |
| /* |
| * CSR flags for register: IPW2200_CSR_IO |
| */ |
| #define IPW2200_IO_RADIO_ENABLED (0x00010000) |
| |
| /* |
| * CSR flags for register: IPW2200_CSR_READ_INT |
| */ |
| #define IPW2200_READ_INT_INIT_HOST (0x20000000) |
| |
| /* table2 offsets */ |
| #define IPW2200_INFO_ADAPTER_MAC (40) |
| |
| /* constants for command blocks */ |
| #define IPW2200_CB_DEFAULT_CTL (0x8cea0000) |
| #define IPW2200_CB_MAXDATALEN (8191) |
| |
| /* supported rates */ |
| #define IPW2200_RATE_DS1 (10) |
| #define IPW2200_RATE_DS2 (20) |
| #define IPW2200_RATE_DS5 (55) |
| #define IPW2200_RATE_DS11 (110) |
| #define IPW2200_RATE_OFDM6 (13) |
| #define IPW2200_RATE_OFDM9 (15) |
| #define IPW2200_RATE_OFDM12 (5) |
| #define IPW2200_RATE_OFDM18 (7) |
| #define IPW2200_RATE_OFDM24 (9) |
| #define IPW2200_RATE_OFDM36 (11) |
| #define IPW2200_RATE_OFDM48 (1) |
| #define IPW2200_RATE_OFDM54 (3) |
| |
| #pragma pack(1) |
| /* HW structures, packed */ |
| |
| struct ipw2200_hdr { |
| uint8_t type; |
| #define IPW2200_HDR_TYPE_DATA (0) |
| #define IPW2200_HDR_TYPE_COMMAND (1) |
| #define IPW2200_HDR_TYPE_NOTIF (3) |
| #define IPW2200_HDR_TYPE_FRAME (9) |
| uint8_t seq; |
| uint8_t flags; |
| #define IPW2200_HDR_FLAG_IRQ (0x04) |
| uint8_t reserved; |
| }; |
| |
| struct ipw2200_notif { |
| uint32_t reserved[2]; |
| uint8_t type; |
| #define IPW2200_NOTIF_TYPE_SUCCESS (0) |
| #define IPW2200_NOTIF_TYPE_UNSPECIFIED (1) |
| #define IPW2200_NOTIF_TYPE_ASSOCIATION (10) |
| #define IPW2200_NOTIF_TYPE_AUTHENTICATION (11) |
| #define IPW2200_NOTIF_TYPE_SCAN_CHANNEL (12) |
| #define IPW2200_NOTIF_TYPE_SCAN_COMPLETE (13) |
| #define IPW2200_NOTIF_TYPE_FRAG_LENGTH (14) |
| #define IPW2200_NOTIF_TYPE_LINK_QUALITY (15) |
| #define IPW2200_NOTIF_TYPE_BEACON (17) |
| #define IPW2200_NOTIF_TYPE_TGI_TX_KEY (18) |
| #define IPW2200_NOTIF_TYPE_CALIBRATION (20) |
| #define IPW2200_NOTIF_TYPE_NOISE (25) |
| uint8_t flags; |
| uint16_t len; |
| }; |
| |
| /* |
| * structure for notification IPW2200_NOTIF_TYPE_AUTHENTICATION |
| */ |
| struct ipw2200_notif_authentication { |
| uint8_t state; |
| #define IPW2200_AUTH_FAIL (0) |
| #define IPW2200_AUTH_SENT_1 (1) |
| #define IPW2200_AUTH_RECV_2 (2) |
| #define IPW2200_AUTH_SEQ1_PASS (3) |
| #define IPW2200_AUTH_SEQ1_FAIL (4) |
| #define IPW2200_AUTH_SUCCESS (9) |
| }; |
| |
| /* |
| * structure for notification IPW2200_NOTIF_TYPE_ASSOCIATION |
| */ |
| struct ipw2200_notif_association { |
| uint8_t state; |
| #define IPW2200_ASSOC_FAIL (0) |
| #define IPW2200_ASSOC_SUCCESS (12) |
| struct ieee80211_frame frame; |
| uint16_t capinfo; |
| uint16_t status; |
| uint16_t associd; |
| }; |
| |
| /* |
| * structure for notification BACAON |
| */ |
| struct ipw2200_notif_beacon_state { |
| uint32_t state; |
| #define IPW2200_BEACON_MISS (1) |
| uint32_t number; |
| }; |
| |
| /* |
| * structure for notification IPW2200_NOTIF_TYPE_SCAN_CHANNEL |
| */ |
| struct ipw2200_notif_scan_channel { |
| uint8_t nchan; |
| uint8_t reserved[47]; |
| }; |
| |
| /* |
| * structure for notification IPW2200_NOTIF_TYPE_SCAN_COMPLETE |
| */ |
| struct ipw2200_notif_scan_complete { |
| uint8_t type; |
| uint8_t nchan; |
| uint8_t status; |
| uint8_t reserved; |
| }; |
| |
| /* |
| * received frame header |
| */ |
| struct ipw2200_frame { |
| uint32_t reserved1[2]; |
| uint8_t chan; |
| uint8_t status; |
| uint8_t rate; |
| uint8_t rssi; /* receiver signal strength indicator */ |
| uint8_t agc; /* automatic gain control */ |
| uint8_t rssi_dbm; |
| uint16_t signal; |
| uint16_t noise; |
| uint8_t antenna; |
| uint8_t control; |
| uint8_t reserved3[2]; |
| uint16_t len; |
| }; |
| |
| /* |
| * header for transmission |
| */ |
| struct ipw2200_tx_desc { |
| struct ipw2200_hdr hdr; |
| uint32_t reserved1; |
| uint8_t station; |
| uint8_t reserved2[3]; |
| uint8_t cmd; |
| #define IPW2200_DATA_CMD_TX (0x0b) |
| uint8_t seq; |
| uint16_t len; |
| uint8_t priority; |
| uint8_t flags; |
| #define IPW2200_DATA_FLAG_SHPREAMBLE (0x04) |
| #define IPW2200_DATA_FLAG_NO_WEP (0x20) |
| #define IPW2200_DATA_FLAG_NEED_ACK (0x80) |
| uint8_t xflags; |
| #define IPW2200_DATA_XFLAG_QOS (0x10) |
| uint8_t wep_txkey; |
| uint8_t wepkey[IEEE80211_KEYBUF_SIZE]; |
| uint8_t rate; |
| uint8_t antenna; |
| uint8_t reserved3[10]; |
| |
| struct ieee80211_frame_addr4 wh; |
| uint8_t reserved4[2]; |
| uint32_t iv; |
| uint32_t eiv; |
| |
| uint32_t nseg; |
| #define IPW2200_MAX_NSEG (6) |
| uint32_t seg_addr[IPW2200_MAX_NSEG]; |
| uint16_t seg_len[IPW2200_MAX_NSEG]; |
| }; |
| |
| /* |
| * command |
| */ |
| struct ipw2200_cmd_desc { |
| struct ipw2200_hdr hdr; |
| uint8_t type; |
| #define IPW2200_CMD_ENABLE (2) |
| #define IPW2200_CMD_SET_CONFIG (6) |
| #define IPW2200_CMD_SET_ESSID (8) |
| #define IPW2200_CMD_SET_MAC_ADDRESS (11) |
| #define IPW2200_CMD_SET_RTS_THRESHOLD (15) |
| #define IPW2200_CMD_SET_FRAG_THRESHOLD (16) |
| #define IPW2200_CMD_SET_POWER_MODE (17) |
| #define IPW2200_CMD_SET_WEP_KEY (18) |
| #define IPW2200_CMD_SCAN (20) |
| #define IPW2200_CMD_ASSOCIATE (21) |
| #define IPW2200_CMD_SET_RATES (22) |
| #define IPW2200_CMD_ABORT_SCAN (23) |
| #define IPW2200_CMD_SET_WME_PARAMS (25) |
| #define IPW2200_CMD_SCAN_EXT (26) |
| #define IPW2200_CMD_SET_OPTIE (31) |
| #define IPW2200_CMD_DISABLE (33) |
| #define IPW2200_CMD_SET_IV (34) |
| #define IPW2200_CMD_SET_TX_POWER (35) |
| #define IPW2200_CMD_SET_SENSITIVITY (42) |
| #define IPW2200_CMD_SET_WMEIE (84) |
| uint8_t len; |
| uint16_t reserved; |
| uint8_t data[120]; |
| }; |
| |
| /* |
| * node information (IBSS) |
| */ |
| struct ipw2200_ibssnode { |
| uint8_t bssid[IEEE80211_ADDR_LEN]; |
| uint8_t reserved[2]; |
| }; |
| |
| /* |
| * constants for 'mode' fields |
| */ |
| #define IPW2200_MODE_11A (0) |
| #define IPW2200_MODE_11B (1) |
| #define IPW2200_MODE_11G (2) |
| |
| /* |
| * macro for command IPW2200_CMD_SET_SENSITIVITY |
| */ |
| #define IPW2200_RSSIDBM2RAW(rssi)((rssi) - 112) |
| |
| /* |
| * possible values for command IPW2200_CMD_SET_POWER_MODE |
| */ |
| #define IPW2200_POWER_MODE_CAM (0) |
| #define IPW2200_POWER_MODE_PSP (3) |
| #define IPW2200_POWER_MODE_MAX (5) |
| |
| /* |
| * structure for command IPW2200_CMD_SET_RATES |
| */ |
| struct ipw2200_rateset { |
| uint8_t mode; |
| uint8_t nrates; |
| uint8_t type; |
| #define IPW2200_RATESET_TYPE_NEGOCIATED (0) |
| #define IPW2200_RATESET_TYPE_SUPPORTED (1) |
| uint8_t reserved; |
| uint8_t rates[12]; |
| }; |
| |
| /* |
| * structure for command IPW2200_CMD_SET_TX_POWER |
| */ |
| struct ipw2200_txpower { |
| uint8_t nchan; |
| uint8_t mode; |
| struct { |
| uint8_t chan; |
| uint8_t power; |
| #define IPW2200_TXPOWER_MAX (20) |
| #define IPW2200_TXPOWER_RATIO (IEEE80211_TXPOWER_MAX / IPW2200_TXPOWER_MAX) |
| } chan[37]; |
| }; |
| |
| /* |
| * structure for command IPW2200_CMD_ASSOCIATE |
| */ |
| struct ipw2200_associate { |
| uint8_t chan; |
| uint8_t auth; |
| #define IPW2200_AUTH_OPEN (0) |
| #define IPW2200_AUTH_SHARED (1) |
| #define IPW2200_AUTH_NONE (3) |
| uint8_t type; |
| #define IPW2200_HC_ASSOC (0) |
| #define IPW2200_HC_REASSOC (1) |
| #define IPW2200_HC_DISASSOC (2) |
| #define IPW2200_HC_IBSS_START (3) |
| #define IPW2200_HC_IBSS_RECONF (4) |
| #define IPW2200_HC_DISASSOC_QUIET (5) |
| uint8_t reserved1; |
| uint16_t policy; |
| #define IPW2200_POLICY_WME (1) |
| #define IPW2200_POLICY_WPA (2) |
| uint8_t plen; |
| uint8_t mode; |
| uint8_t bssid[IEEE80211_ADDR_LEN]; |
| uint8_t tstamp[8]; |
| |
| uint16_t capinfo; |
| uint16_t lintval; |
| uint16_t intval; |
| uint8_t dst[IEEE80211_ADDR_LEN]; |
| uint32_t reserved3; |
| uint16_t reserved4; |
| }; |
| |
| #define IPW2200_SCAN_CHANNELS (54) |
| |
| /* |
| * structure for command IPW2200_CMD_SCAN |
| */ |
| struct ipw2200_scan { |
| uint8_t type; |
| #define IPW2200_SCAN_TYPE_PASSIVE_STOP (0) /* passive, stop on first beacon */ |
| #define IPW2200_SCAN_TYPE_PASSIVE (1) /* passive, full dwell on channel */ |
| #define IPW2200_SCAN_TYPE_DIRECTED (2) /* active, directed probe seq */ |
| #define IPW2200_SCAN_TYPE_BROADCAST (3) /* active, bcast probe seq */ |
| #define IPW2200_SCAN_TYPE_BDIRECTED (4) /* active, directed+bcast probe */ |
| #define IPW2200_SCAN_TYPES (5) |
| uint16_t dwelltime; |
| uint8_t channels[IPW2200_SCAN_CHANNELS]; |
| #define IPW2200_CHAN_5GHZ (0 << 6) |
| #define IPW2200_CHAN_2GHZ (1 << 6) |
| uint8_t reserved[3]; |
| }; |
| |
| /* |
| * structure for command IPW2200_CMD_SCAN_EXT |
| */ |
| struct ipw2200_scan_ext { |
| uint32_t full_scan_index; |
| uint8_t channels[IPW2200_SCAN_CHANNELS]; |
| uint8_t scan_type[IPW2200_SCAN_CHANNELS/2]; |
| uint8_t reserved; |
| uint16_t dwell_time[IPW2200_SCAN_TYPES]; |
| }; |
| |
| /* |
| * structure for command IPW2200_CMD_SET_CONFIGURATION |
| */ |
| struct ipw2200_configuration { |
| uint8_t bluetooth_coexistence; |
| uint8_t reserved1; |
| uint8_t answer_pbreq; |
| uint8_t allow_invalid_frames; |
| uint8_t multicast_enabled; |
| uint8_t drop_unicast_unencrypted; |
| uint8_t disable_unicast_decryption; |
| uint8_t drop_multicast_unencrypted; |
| uint8_t disable_multicast_decryption; |
| uint8_t antenna; |
| #define IPW2200_ANTENNA_AUTO (0) /* firmware selects best antenna */ |
| #define IPW2200_ANTENNA_A (1) /* use antenna A only */ |
| #define IPW2200_ANTENNA_B (3) /* use antenna B only */ |
| #define IPW2200_ANTENNA_SLOWDIV (2) /* slow diversity algorithm */ |
| uint8_t include_crc; |
| uint8_t use_protection; |
| uint8_t protection_ctsonly; |
| uint8_t enable_multicast_filtering; |
| uint8_t bluetooth_threshold; |
| uint8_t reserved4; |
| uint8_t allow_beacon_and_probe_resp; |
| uint8_t allow_mgt; |
| uint8_t noise_reported; |
| uint8_t reserved5; |
| }; |
| |
| /* |
| * structure for command IPW2200_CMD_SET_WEP_KEY |
| */ |
| struct ipw2200_wep_key { |
| uint8_t cmd; |
| #define IPW2200_WEP_KEY_CMD_SETKEY (0x08) |
| uint8_t seq; |
| uint8_t idx; |
| uint8_t len; |
| uint8_t key[IEEE80211_KEYBUF_SIZE]; |
| }; |
| |
| /* |
| * the following two structures are for future WME support |
| */ |
| struct ipw2200_wme_params { |
| uint16_t cwmin[WME_NUM_AC]; |
| uint16_t cwmax[WME_NUM_AC]; |
| uint8_t aifsn[WME_NUM_AC]; |
| uint8_t acm[WME_NUM_AC]; |
| uint16_t burst[WME_NUM_AC]; |
| }; |
| |
| struct ipw2200_sensitivity { |
| uint16_t rssi; |
| #define IPW2200_RSSI_TO_DBM (112) |
| uint16_t reserved; |
| }; |
| |
| #pragma pack() |
| |
| /* |
| * ROM entries |
| */ |
| #define IPW2200_EEPROM_MAC (0x21) |
| #define IPW2200_EEPROM_NIC (0x25) /* nic type (lsb) */ |
| #define IPW2200_EEPROM_SKU (0x25) /* nic type (msb) */ |
| |
| /* |
| * EVENT controls |
| */ |
| #define IPW2200_IMEM_EVENT_CTL (0x00300004) |
| /* |
| * EEPROM controls |
| */ |
| #define IPW2200_IMEM_EEPROM_CTL (0x00300040) |
| |
| #define IPW2200_EEPROM_DELAY (1) /* minimum hold time(microsecond) */ |
| |
| /* |
| * possible flags for register IWI_MEM_EVENT |
| */ |
| #define IPW2200_LED_ASSOC (1 << 5) |
| #define IPW2200_LED_MASK (0xd9fffffb) |
| |
| /* |
| * control and status registers access macros |
| */ |
| extern uint8_t ipw2200_csr_get8(struct ipw2200_softc *sc, uint32_t off); |
| extern uint16_t ipw2200_csr_get16(struct ipw2200_softc *sc, uint32_t off); |
| extern uint32_t ipw2200_csr_get32(struct ipw2200_softc *sc, uint32_t off); |
| extern void ipw2200_csr_getbuf32(struct ipw2200_softc *sc, uint32_t off, |
| uint32_t *buf, size_t cnt); |
| extern void ipw2200_csr_put8(struct ipw2200_softc *sc, uint32_t off, |
| uint8_t val); |
| extern void ipw2200_csr_put16(struct ipw2200_softc *sc, uint32_t off, |
| uint16_t val); |
| extern void ipw2200_csr_put32(struct ipw2200_softc *sc, uint32_t off, |
| uint32_t val); |
| /* |
| * indirect memory space access macros |
| */ |
| extern uint8_t ipw2200_imem_get8(struct ipw2200_softc *sc, uint32_t addr); |
| extern uint16_t ipw2200_imem_get16(struct ipw2200_softc *sc, |
| uint32_t addr); |
| extern uint32_t ipw2200_imem_get32(struct ipw2200_softc *sc, |
| uint32_t addr); |
| extern void ipw2200_imem_put8(struct ipw2200_softc *sc, uint32_t addr, |
| uint8_t val); |
| extern void ipw2200_imem_put16(struct ipw2200_softc *sc, uint32_t addr, |
| uint16_t val); |
| extern void ipw2200_imem_put32(struct ipw2200_softc *sc, uint32_t addr, |
| uint32_t val); |
| /* |
| * EEPROM access macro |
| */ |
| extern void ipw2200_rom_control(struct ipw2200_softc *sc, uint32_t val); |
| extern uint16_t ipw2200_rom_get16(struct ipw2200_softc *sc, uint8_t addr); |
| |
| /* |
| * Firmware related definations and interfaces. |
| */ |
| extern int ipw2200_cache_firmware(struct ipw2200_softc *sc); |
| extern int ipw2200_free_firmware(struct ipw2200_softc *sc); |
| extern int ipw2200_load_uc(struct ipw2200_softc *sc, uint8_t *buf, size_t size); |
| extern int ipw2200_load_fw(struct ipw2200_softc *sc, uint8_t *buf, size_t size); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _SYS_IPW2200_IMPL_H */ |