root/sys/dev/usb/if_uathreg.h
/*      $OpenBSD: if_uathreg.h,v 1.2 2006/09/18 16:34:23 damien Exp $   */

/*-
 * Copyright (c) 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.
 */

#define UATH_CONFIG_NO          1
#define UATH_IFACE_INDEX        0

/* all fields are big endian */
struct uath_fwblock {
        uint32_t        flags;
#define UATH_WRITE_BLOCK        (1 << 4)

        uint32_t        len;
#define UATH_MAX_FWBLOCK_SIZE   2048

        uint32_t        total;
        uint32_t        remain;
        uint32_t        rxtotal;
        uint32_t        pad[123];
} __packed;

#define UATH_MAX_RXCMDSZ        512
#define UATH_MAX_TXCMDSZ        512

struct uath_cmd_hdr {
        uint32_t        len;
        uint32_t        code;
#define UATH_CMD_SETUP          0x01
#define UATH_CMD_02             0x02
#define UATH_CMD_READ_MAC       0x03
#define UATH_CMD_WRITE_MAC      0x04
#define UATH_CMD_READ_EEPROM    0x05
#define UATH_CMD_STATS          0x06
#define UATH_CMD_07             0x07
#define UATH_CMD_SHUTDOWN       0x08
#define UATH_CMD_0B             0x0b
#define UATH_CMD_0C             0x0c
#define UATH_CMD_0F             0x0f
#define UATH_NOTIF_STATS        0x10
#define UATH_NOTIF_READY        0x12
#define UATH_NOTIF_TX           0x13
#define UATH_CMD_15             0x15
#define UATH_CMD_SET_LED        0x17
#define UATH_CMD_SET_XLED       0x18
#define UATH_CMD_1B             0x1b
#define UATH_CMD_1E             0x1e
#define UATH_CMD_CRYPTO         0x1d
#define UATH_CMD_SET_STATE      0x20
#define UATH_CMD_SET_BSSID      0x21
#define UATH_CMD_24             0x24
#define UATH_CMD_SET_RATES      0x26
#define UATH_CMD_27             0x27
#define UATH_CMD_2E             0x2e
#define UATH_CMD_31             0x31
#define UATH_CMD_SET_FILTER     0x32
#define UATH_CMD_SET_CHAN       0x34
#define UATH_CMD_RESET          0x35
#define UATH_CMD_SET_QUEUE      0x3a
#define UATH_CMD_RESET_QUEUE    0x3b

        uint32_t        priv;   /* driver private data */
        uint32_t        magic;
        uint32_t        reserved2[4];
} __packed;

struct uath_rx_desc {
        uint32_t        len;
        uint32_t        reserved1[8];
        uint32_t        rssi;
        uint32_t        freq;
        uint32_t        reserved2[5];
} __packed;

#define UATH_MAKECTL(qid, len)  htobe32((qid) << 16 | (len))

struct uath_tx_desc {
        uint32_t        len;
        uint32_t        priv;   /* driver private data */
        uint32_t        type;
#define UATH_TX_DATA    0xe
#define UATH_TX_NULL    0xf

        uint32_t        magic;
        uint32_t        dest;
#define UATH_ID_BSS             2
#define UATH_ID_BROADCAST       0xffffffff

        uint32_t        flags;
#define UATH_TX_NOTIFY  (1 << 24)       /* f/w will send a UATH_NOTIF_TX */

        uint32_t        paylen;
} __packed;

/* structure for command UATH_CMD_SETUP */
struct uath_cmd_setup {
        uint32_t        magic1;
        uint32_t        magic2;
        uint32_t        magic3;
        uint32_t        magic4;
} __packed;

/* structure for commands UATH_CMD_READ_MAC and UATH_CMD_READ_EEPROM */
struct uath_read_mac {
        uint32_t        len;
        uint8_t         data[32];
} __packed;

/* structure for command UATH_CMD_WRITE_MAC */
struct uath_write_mac {
        uint32_t        reg;
        uint32_t        len;
        uint8_t         data[32];
} __packed;

/* structure for command UATH_CMD_0B */
struct uath_cmd_0b {
        uint32_t        code;
        uint32_t        reserved;
        uint32_t        size;
        uint8_t         data[44];
} __packed;

/* structure for command UATH_CMD_0C */
struct uath_cmd_0c {
        uint32_t        magic1;
        uint32_t        magic2;
        uint32_t        magic3;
} __packed;

/* structure for command UATH_CMD_SET_LED */
struct uath_cmd_led {
        uint32_t        which;
#define UATH_LED_LINK           0
#define UATH_LED_ACTIVITY       1

        uint32_t        state;
#define UATH_LED_OFF    0
#define UATH_LED_ON     1
} __packed;

/* structure for command UATH_CMD_SET_XLED */
struct uath_cmd_xled {
        uint32_t        which;
        uint32_t        rate;
        uint32_t        mode;
} __packed;

/* structure for command UATH_CMD_CRYPTO */
struct uath_cmd_crypto {
        uint32_t        keyidx;
#define UATH_DEFAULT_KEY        6

        uint32_t        magic1;
        uint32_t        size;
        uint32_t        reserved1;
        uint32_t        mask;
        uint8_t         addr[IEEE80211_ADDR_LEN];
        uint16_t        reserved2;
        uint32_t        flags;
        uint32_t        reserved3[2];
        uint8_t         key[68];
        uint8_t         magic2[136];
        uint8_t         magic3[136];
} __packed;

/* structure for command UATH_CMD_SET_RATES */
struct uath_cmd_rates {
        uint32_t        magic1;
        uint32_t        reserved;
        uint32_t        size;
        uint8_t         nrates;
#define UATH_MAX_NRATES 30
        uint8_t         rates[UATH_MAX_NRATES];
} __packed;

/* structure for command UATH_CMD_SET_CHAN */
struct uath_set_chan {
        uint32_t        flags;
        uint32_t        freq;
        uint32_t        magic1;
        uint32_t        magic2;
        uint32_t        reserved1;
        uint32_t        magic3;
        uint32_t        reserved2;
} __packed;

/* structure for command UATH_CMD_SET_QUEUE */
struct uath_qinfo {
        uint32_t        qid;
#define UATH_AC_TO_QID(ac)      (ac)    /* id function */

        uint32_t        size;
        uint32_t        ac;
        uint32_t        aifsn;
        uint32_t        logcwmin;
        uint32_t        logcwmax;
        uint32_t        txop;
        uint32_t        acm;
        uint32_t        magic1;
        uint32_t        magic2;
} __packed;

/* structure for command UATH_CMD_31 */
struct uath_cmd_31 {
        uint32_t        magic1;
        uint32_t        magic2;
} __packed;

/* structure for command UATH_CMD_SET_FILTER */
struct uath_cmd_filter {
        uint32_t        filter;
        uint32_t        flags;
} __packed;

/* structure for command UATH_CMD_SET_BSSID */
struct uath_cmd_bssid {
        uint32_t        reserved1;
        uint32_t        flags1;
        uint32_t        flags2;
        uint32_t        reserved2;
        uint32_t        len;
        uint8_t         bssid[IEEE80211_ADDR_LEN];
} __packed;


#define UATH_EEPROM_MACADDR     0x0b
#define UATH_EEPROM_RXBUFSZ     0x0f

#define UATH_MAX_TXBUFSZ        \
        (sizeof (uint32_t) + sizeof (struct uath_tx_desc) + IEEE80211_MAX_LEN)

#define UATH_MIN_RXBUFSZ                                                \
        (((sizeof (uint32_t) + sizeof (struct ieee80211_frame_min) +    \
           sizeof (struct uath_rx_desc)) + 3) & ~3)