wpivar.h revision faceed938d6ba7344a332694084d213905e93375
2N/A/*
2N/A * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
2N/A * Use is subject to license terms.
2N/A */
2N/A/*
2N/A * Copyright (c) 2006
2N/A * Damien Bergamini <damien.bergamini@free.fr>
2N/A *
2N/A * Permission to use, copy, modify, and distribute this software for any
2N/A * purpose with or without fee is hereby granted, provided that the above
2N/A * copyright notice and this permission notice appear in all copies.
2N/A *
2N/A * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
2N/A * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
2N/A * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
2N/A * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
2N/A * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
2N/A * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
2N/A * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2N/A */
2N/A#ifndef _WPIVAR_H
2N/A#define _WPIVAR_H
2N/A
2N/A#ifdef __cplusplus
2N/Aextern "C" {
2N/A#endif
2N/A
2N/A#ifdef WPI_BPF
2N/Atypedef struct wpi_rx_radiotap_header {
2N/A struct ieee80211_radiotap_header wr_ihdr;
2N/A uint64_t wr_tsft;
2N/A uint8_t wr_flags;
2N/A uint8_t wr_rate;
2N/A uint16_t wr_chan_freq;
2N/A uint16_t wr_chan_flags;
2N/A int8_t wr_dbm_antsignal;
2N/A int8_t wr_dbm_antnoise;
2N/A uint8_t wr_antenna;
2N/A} wpi_rx_radiotap_header_t;
2N/A
2N/A#define WPI_RX_RADIOTAP_PRESENT \
2N/A ((1 << IEEE80211_RADIOTAP_TSFT) | \
2N/A (1 << IEEE80211_RADIOTAP_FLAGS) | \
2N/A (1 << IEEE80211_RADIOTAP_RATE) | \
2N/A (1 << IEEE80211_RADIOTAP_CHANNEL) | \
2N/A (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
2N/A (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \
2N/A (1 << IEEE80211_RADIOTAP_ANTENNA))
2N/A
2N/Atypedef struct wpi_tx_radiotap_header {
2N/A struct ieee80211_radiotap_header wt_ihdr;
2N/A uint8_t wt_flags;
2N/A uint8_t wt_rate;
2N/A uint16_t wt_chan_freq;
2N/A uint16_t wt_chan_flags;
2N/A} wpi_tx_radiotap_header_t;
2N/A
2N/A#define WPI_TX_RADIOTAP_PRESENT \
2N/A ((1 << IEEE80211_RADIOTAP_FLAGS) | \
2N/A (1 << IEEE80211_RADIOTAP_RATE) | \
2N/A (1 << IEEE80211_RADIOTAP_CHANNEL))
2N/A#endif
2N/A
2N/A#define WPI_DMA_SYNC(area, flag) \
2N/A (void) ddi_dma_sync((area).dma_hdl, (area).offset, \
2N/A (area).alength, (flag))
2N/A
2N/Atypedef struct wpi_dma_area {
2N/A ddi_acc_handle_t acc_hdl; /* handle for memory */
2N/A caddr_t mem_va; /* CPU VA of memory */
2N/A uint32_t nslots; /* number of slots */
2N/A uint32_t size; /* size per slot */
2N/A size_t alength; /* allocated size */
2N/A /* >= product of above */
2N/A ddi_dma_handle_t dma_hdl; /* DMA handle */
2N/A offset_t offset; /* relative to handle */
2N/A ddi_dma_cookie_t cookie; /* associated cookie */
2N/A uint32_t ncookies;
2N/A uint32_t token; /* arbitrary identifier */
2N/A} wpi_dma_t;
2N/A
2N/Atypedef struct wpi_tx_data {
2N/A wpi_dma_t dma_data;
2N/A wpi_tx_desc_t *desc;
2N/A uint32_t paddr_desc;
2N/A wpi_tx_cmd_t *cmd;
2N/A uint32_t paddr_cmd;
2N/A} wpi_tx_data_t;
2N/A
2N/Atypedef struct wpi_tx_ring {
2N/A wpi_dma_t dma_desc;
2N/A wpi_dma_t dma_cmd;
2N/A wpi_tx_data_t *data;
2N/A int qid;
2N/A int count;
2N/A int queued;
2N/A int cur;
2N/A} wpi_tx_ring_t;
2N/A
2N/Atypedef struct wpi_rx_data {
2N/A wpi_dma_t dma_data;
2N/A} wpi_rx_data_t;
2N/A
2N/Atypedef struct wpi_rx_ring {
2N/A wpi_dma_t dma_desc;
2N/A uint32_t *desc;
2N/A wpi_rx_data_t data[WPI_RX_RING_COUNT];
2N/A int cur;
2N/A} wpi_rx_ring_t;
2N/A
2N/Atypedef struct wpi_amrr {
2N/A ieee80211_node_t in; /* must be the first */
2N/A int txcnt;
2N/A int retrycnt;
2N/A int success;
2N/A int success_threshold;
2N/A int recovery;
2N/A} wpi_amrr_t;
2N/A
2N/Atypedef struct wpi_softc {
2N/A struct ieee80211com sc_ic;
2N/A dev_info_t *sc_dip;
2N/A int (*sc_newstate)(struct ieee80211com *,
2N/A enum ieee80211_state, int);
2N/A enum ieee80211_state sc_ostate;
2N/A kmutex_t sc_glock;
2N/A kmutex_t sc_mt_lock;
2N/A kmutex_t sc_tx_lock;
2N/A kcondvar_t sc_mt_cv;
2N/A kcondvar_t sc_tx_cv;
2N/A kcondvar_t sc_cmd_cv;
2N/A kcondvar_t sc_fw_cv;
kthread_t *sc_mf_thread;
uint32_t sc_mf_thread_switch;
uint32_t sc_flags;
uint32_t sc_dmabuf_sz;
uint16_t sc_clsz;
uint8_t sc_rev;
uint8_t sc_resv;
/* shared area */
wpi_dma_t sc_dma_sh;
wpi_shared_t *sc_shared;
wpi_tx_ring_t sc_txq[4];
wpi_tx_ring_t sc_cmdq;
wpi_tx_ring_t sc_svcq;
wpi_rx_ring_t sc_rxq;
/* dma */
const wpi_firmware_hdr_t *sc_hdr;
const char *sc_boot;
const char *sc_text;
const char *sc_data;
wpi_dma_t sc_dma_fw_text;
ddi_dma_cookie_t sc_fw_text_cookie[4];
wpi_dma_t sc_dma_fw_data;
ddi_dma_cookie_t sc_fw_data_cookie[4];
ddi_acc_handle_t sc_handle;
caddr_t sc_base;
ddi_iblock_cookie_t sc_iblk;
wpi_config_t sc_config;
uint16_t sc_pwr1[14];
uint16_t sc_pwr2[14];
uint32_t sc_tx_timer;
uint32_t sc_scan_next;
uint32_t sc_scan_pending;
uint8_t *sc_fw_bin;
ddi_softintr_t sc_notif_softint_id;
uint32_t sc_notif_softint_pending;
uint32_t sc_need_reschedule;
clock_t sc_clk;
/* kstats */
uint32_t sc_tx_nobuf;
uint32_t sc_rx_nobuf;
uint32_t sc_tx_err;
uint32_t sc_rx_err;
uint32_t sc_tx_retries;
#ifdef WPI_BPF
struct bpf_if *sc_drvbpf;
union {
struct wpi_rx_radiotap_header th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
int sc_rxtap_len;
union {
struct wpi_tx_radiotap_header th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
int sc_txtap_len;
#endif
} wpi_sc_t;
#define WPI_F_ATTACHED (1 << 0)
#define WPI_F_CMD_DONE (1 << 1)
#define WPI_F_FW_INIT (1 << 2)
#define WPI_F_HW_ERR_RECOVER (1 << 3)
#define WPI_F_RATE_AUTO_CTL (1 << 4)
#define WPI_F_RUNNING (1 << 5)
#define WPI_F_SUSPEND (1 << 6)
#define WPI_F_RADIO_OFF (1 << 7)
#define WPI_F_SCANNING (1 << 8)
#define WPI_F_QUIESCED (1 << 9)
#define WPI_SUCCESS 0
#define WPI_FAIL (EIO)
#ifdef __cplusplus
}
#endif
#endif /* _WPIVAR_H */