summaryrefslogtreecommitdiff
path: root/sys/dev/usb/if_uathreg.h
diff options
context:
space:
mode:
authorDamien Bergamini <damien@cvs.openbsd.org>2006-09-16 13:21:25 +0000
committerDamien Bergamini <damien@cvs.openbsd.org>2006-09-16 13:21:25 +0000
commit4c340c4e5bf1063bdaa5876736af552068b9a7b4 (patch)
treef90bc61759b301c61453749ff13a0ad6afdf4c19 /sys/dev/usb/if_uathreg.h
parentb8c429aa2c4656bb7169f404c03edd73c8116958 (diff)
Initial import of uath(4), a driver for Atheros USB2.0 AR5005UG/AR5005UX
chipsets. Based on a black-box analysis of the Windows binary driver. Requires a firmware that is not freely redistributable (see man uath). The driver handles both pre- and post-firmware devices. Still a bit experimental but Tx/Rx works great in BSS mode (on i386). No 802.11a, IBSS, or HostAP modes yet but there's more to come. Great thanks to jsg@ for digging the USB IDs out of the Windows driver. Committed over a D-Link DWL-G132.
Diffstat (limited to 'sys/dev/usb/if_uathreg.h')
-rw-r--r--sys/dev/usb/if_uathreg.h248
1 files changed, 248 insertions, 0 deletions
diff --git a/sys/dev/usb/if_uathreg.h b/sys/dev/usb/if_uathreg.h
new file mode 100644
index 00000000000..1b46adaea45
--- /dev/null
+++ b/sys/dev/usb/if_uathreg.h
@@ -0,0 +1,248 @@
+/* $OpenBSD: if_uathreg.h,v 1.1 2006/09/16 13:21:24 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 magic2;
+ uint8_t nrates;
+ uint8_t rates[IEEE80211_RATE_MAXSIZE];
+} __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)