root/usr/src/uts/common/io/ral/rt2560_var.h
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright (c) 2005, 2006
 *      Damien Bergamini <damien.bergamini@free.fr>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
#ifndef _RT2560_VAR_H
#define _RT2560_VAR_H

#ifdef __cplusplus
extern "C" {
#endif

#define RAL_FLAG_RUNNING        (1<<0)
#define RAL_FLAG_SUSPENDING     (1<<1)

#define RAL_RCR_PROMISC         (1<<0)
#define RAL_RCR_MULTI           (2<<0)

#ifndef DDI_NT_NET_WIFI
#define DDI_NT_NET_WIFI         "ddi_network:wifi"
#endif

/*
 * Bit flags in the ral_dbg_flags
 */
#define RAL_DBG_MSG             0x000001
#define RAL_DBG_HW              0x000002
#define RAL_DBG_DMA             0x000004
#define RAL_DBG_INTR            0x000008
#define RAL_DBG_TX              0x000010
#define RAL_DBG_RX              0x000020
#define RAL_DBG_CHAN            0x000040
#define RAL_DBG_IOCTL           0x000080
#define RAL_DBG_MGMT            0x000100
#define RAL_DBG_STAT            0x000200
#define RAL_DBG_GLD             0x000400
#define RAL_DBG_80211           0x000800
#define RAL_DBG_STATE           0x001000
#define RAL_DBG_RXPACKET        0x002000
#define RAL_DBG_TXPACKET        0x004000
#define RAL_DBG_SUSPEND         0x008000
#define RAL_DBG_ALL             0x00ffff

#define RT2560_RX_RADIOTAP_PRESENT                                      \
        ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
        (1 << IEEE80211_RADIOTAP_FLAGS) |                               \
        (1 << IEEE80211_RADIOTAP_RATE) |                                \
        (1 << IEEE80211_RADIOTAP_CHANNEL) |                             \
        (1 << IEEE80211_RADIOTAP_ANTENNA) |                             \
        (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))

#define RT2560_TX_RADIOTAP_PRESENT                                      \
        ((1 << IEEE80211_RADIOTAP_FLAGS) |                              \
        (1 << IEEE80211_RADIOTAP_RATE) |                                \
        (1 << IEEE80211_RADIOTAP_CHANNEL) |                             \
        (1 << IEEE80211_RADIOTAP_ANTENNA))

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;
};

struct rt2560_tx_data {
        caddr_t                 buf;
        struct ieee80211_node   *ni;
        struct ral_rssdesc      id;
};

/*
 * physaddr = dr_desc.dr_pbase
 * desc = dr_desc.dr_base, desc[i].physaddr = dr_txbuf[i].dr_pbase
 * data[i]->buf = dr_txbuf[i].dr_bas
 */
struct rt2560_tx_ring {
        uint32_t                physaddr;
        struct rt2560_tx_desc   *desc;
        struct rt2560_tx_data   *data;

        struct dma_region       dr_desc;
        struct dma_region       *dr_txbuf;

        int                     count;
        int                     queued;
        int                     cur;
        int                     next;
        int                     cur_encrypt;
        int                     next_encrypt;
        kmutex_t                tx_lock;
};

struct rt2560_rx_data {
        caddr_t                 buf;
        int                     drop;
};

struct rt2560_rx_ring {
        uint32_t                physaddr;
        struct rt2560_rx_desc   *desc;
        struct rt2560_rx_data   *data;

        struct dma_region       dr_desc;
        struct dma_region       *dr_rxbuf;

        int                     count;
        int                     cur;
        int                     next;
        int                     cur_decrypt;
        kmutex_t                rx_lock;
};

struct rt2560_node {
        struct ieee80211_node   ni;
        struct ral_rssadapt     rssadapt;
};

struct rt2560_softc {
        struct ieee80211com     sc_ic;
        dev_info_t              *sc_dev;

        /* ddi i/o handler */
        ddi_acc_handle_t        sc_ioh;
        caddr_t                 sc_rbase;

        /* interrupt */
        ddi_iblock_cookie_t     sc_iblock;

        kmutex_t                sc_genlock;

        timeout_id_t            sc_scan_id;
        timeout_id_t            sc_rssadapt_id;

        enum ieee80211_state    sc_ostate;
        timeout_id_t            sc_state_id;

        int                     sc_tx_timer;

        uint32_t                asic_rev;
        uint32_t                eeprom_rev;
        uint8_t                 rf_rev;

        struct rt2560_tx_ring   txq;
        struct rt2560_tx_ring   prioq;
        struct rt2560_rx_ring   rxq;

        uint32_t                sc_need_sched;
        uint32_t                sc_flags;
        uint32_t                sc_rcr;         /* RAL RCR */

        uint16_t                sc_cachelsz;
        ddi_softintr_t          sc_softint_id;

        uint32_t                sc_rx_pend;

        uint32_t                rf_regs[4];
        uint8_t                 txpow[14];

        struct {
                uint8_t reg;
                uint8_t val;
        }                       bbp_prom[16];

        int                     led_mode;
        int                     hw_radio;
        int                     rx_ant;
        int                     tx_ant;
        int                     nb_ant;

        int                     dwelltime;

        /* 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;

        int                     (*sc_newstate)(struct ieee80211com *,
                                    enum ieee80211_state, int);
};

#define RAL_IS_RUNNING(_sc)     (((_sc)->sc_flags & RAL_FLAG_RUNNING) && \
        !((_sc)->sc_flags & RAL_FLAG_SUSPENDING))
#define RAL_IS_INITED(_sc)      ((_sc)->sc_flags & RAL_FLAG_RUNNING)
#define RAL_LOCK(sc)            mutex_enter(&(sc)->sc_genlock)
#define RAL_UNLOCK(sc)          mutex_exit(&(sc)->sc_genlock)

#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"

#ifdef __cplusplus
}
#endif

#endif /* _RT2560_VAR_H */