#ifndef __PGTVAR_H__
#define __PGTVAR_H__
#define PGT_RX_RADIOTAP_PRESENT \
((1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_CHANNEL) | \
(1 << IEEE80211_RADIOTAP_RSSI))
struct pgt_rx_radiotap_hdr {
struct ieee80211_radiotap_header wr_ihdr;
uint8_t wr_flags;
uint16_t wr_chan_freq;
uint16_t wr_chan_flags;
uint8_t wr_rssi;
uint8_t wr_max_rssi;
} __packed;
#define PGT_TX_RADIOTAP_PRESENT \
((1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_RATE) | \
(1 << IEEE80211_RADIOTAP_CHANNEL))
struct pgt_tx_radiotap_hdr {
struct ieee80211_radiotap_header wt_ihdr;
uint8_t wt_flags;
uint8_t wt_rate;
uint16_t wt_chan_freq;
uint16_t wt_chan_flags;
} __packed;
struct pgt_desc {
TAILQ_ENTRY(pgt_desc) pd_link;
caddr_t pd_mem;
bus_addr_t pd_dmaaddr;
bus_dmamap_t pd_dmam;
bus_dma_segment_t pd_dmas;
struct pgt_frag *pd_fragp;
unsigned int pd_fragnum;
};
TAILQ_HEAD(pgt_descq, pgt_desc);
struct pgt_mgmt_desc {
TAILQ_ENTRY(pgt_mgmt_desc) pmd_link;
const void *pmd_sendbuf;
void *pmd_recvbuf;
size_t pmd_len;
uint32_t pmd_oid;
int pmd_error;
};
TAILQ_HEAD(pgt_mgmt_descq, pgt_mgmt_desc);
struct pgt_async_trap {
TAILQ_ENTRY(pgt_async_trap) pa_link;
struct mbuf *pa_mbuf;
};
struct pgt_ieee80211_node {
struct ieee80211_node pin_node;
enum pin_dot1x_authorization {
PIN_DOT1X_UNAUTHORIZED,
PIN_DOT1X_AUTHORIZED
} pin_dot1x_auth_desired, pin_dot1x_auth;
uint16_t pin_mlme_state;
};
struct pgt_softc {
struct device sc_dev;
struct ieee80211com sc_ic;
unsigned int sc_flags;
#define SC_NEEDS_FIRMWARE 0x00000001
#define SC_UNINITIALIZED 0x00000002
#define SC_DYING 0x00000004
#define SC_NEEDS_RESET 0x00000008
#define SC_INTR_RESET 0x00000020
#define SC_POWERSAVE 0x00000040
#define SC_NOFREE_ALLNODES 0x00000100
#define SC_START_DESIRED 0x00000200
#define SC_KTHREAD 0x00000400
#define SC_ISL3877 0x00000800
struct timeout sc_chanscan_timer;
int sc_dot1x;
int sc_wds;
int sc_if_flags;
int16_t sc_80211_ioc_wep;
int16_t sc_80211_ioc_auth;
uint32_t sc_noise;
unsigned int sc_debug;
#define SC_DEBUG_QUEUES 0x00000001
#define SC_DEBUG_MGMT 0x00000002
#define SC_DEBUG_UNEXPECTED 0x00000004
#define SC_DEBUG_TRIGGER 0x00000008
#define SC_DEBUG_EVENTS 0x00000010
#define SC_DEBUG_POWER 0x00000020
#define SC_DEBUG_TRAP 0x00000040
#define SC_DEBUG_LINK 0x00000080
#define SC_DEBUG_RXANNEX 0x00000100
#define SC_DEBUG_RXFRAG 0x00000200
#define SC_DEBUG_RXETHER 0x00000400
bus_space_tag_t sc_iotag;
bus_space_handle_t sc_iohandle;
bus_dma_tag_t sc_dmat;
bus_dmamap_t sc_cbdmam;
bus_dma_segment_t sc_cbdmas;
struct pgt_control_block *sc_cb;
bus_dmamap_t sc_psmdmam;
bus_dma_segment_t sc_psmdmas;
void *sc_psmbuf;
int (*sc_newstate)
(struct ieee80211com *,
enum ieee80211_state, int);
int (*sc_enable)(struct pgt_softc *);
void (*sc_disable)(struct pgt_softc *);
void (*sc_power)(struct pgt_softc *, int);
struct pgt_mgmt_descq sc_mgmtinprog;
struct pgt_descq sc_freeq[PGT_QUEUE_COUNT];
size_t sc_freeq_count[PGT_QUEUE_COUNT];
struct pgt_descq sc_dirtyq[PGT_QUEUE_COUNT];
size_t sc_dirtyq_count[PGT_QUEUE_COUNT];
int sc_txtimer;
struct pgt_softc_kthread {
struct proc *sck_proc;
int sck_exit, sck_reset, sck_update;
TAILQ_HEAD(, pgt_async_trap) sck_traps;
} sc_kthread;
#if NBPFILTER > 0
caddr_t sc_drvbpf;
union {
struct pgt_rx_radiotap_hdr th;
uint8_t pad[64];
} sc_rxtapu;
#define sc_rxtap sc_rxtapu.th
int sc_rxtap_len;
union {
struct pgt_tx_radiotap_hdr th;
uint8_t pad[64];
} sc_txtapu;
#define sc_txtap sc_txtapu.th
int sc_txtap_len;
#endif
};
int pgt_intr(void *);
void pgt_attach(struct device *);
int pgt_detach(struct pgt_softc *);
int pgt_activate(struct device *, int);
static __inline int
pgt_queue_is_rx(enum pgt_queue pq)
{
return (pq == PGT_QUEUE_DATA_LOW_RX ||
pq == PGT_QUEUE_DATA_HIGH_RX ||
pq == PGT_QUEUE_MGMT_RX);
}
static __inline int
pgt_queue_is_tx(enum pgt_queue pq)
{
return (pq == PGT_QUEUE_DATA_LOW_TX ||
pq == PGT_QUEUE_DATA_HIGH_TX ||
pq == PGT_QUEUE_MGMT_TX);
}
static __inline int
pgt_queue_is_data(enum pgt_queue pq)
{
return (pq == PGT_QUEUE_DATA_LOW_RX ||
pq == PGT_QUEUE_DATA_HIGH_RX ||
pq == PGT_QUEUE_DATA_LOW_TX ||
pq == PGT_QUEUE_DATA_HIGH_TX);
}
static __inline int
pgt_queue_is_mgmt(enum pgt_queue pq)
{
return (pq == PGT_QUEUE_MGMT_RX ||
pq == PGT_QUEUE_MGMT_TX);
}
#endif