11ccea77eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
26948300cSKalle Valo /* ZD1211 USB-WLAN driver for Linux
36948300cSKalle Valo *
46948300cSKalle Valo * Copyright (C) 2005-2007 Ulrich Kunitz <kune@deine-taler.de>
56948300cSKalle Valo * Copyright (C) 2006-2007 Daniel Drake <dsd@gentoo.org>
66948300cSKalle Valo */
76948300cSKalle Valo
86948300cSKalle Valo #ifndef _ZD_USB_H
96948300cSKalle Valo #define _ZD_USB_H
106948300cSKalle Valo
116948300cSKalle Valo #include <linux/completion.h>
126948300cSKalle Valo #include <linux/netdevice.h>
136948300cSKalle Valo #include <linux/spinlock.h>
146948300cSKalle Valo #include <linux/skbuff.h>
156948300cSKalle Valo #include <linux/usb.h>
166948300cSKalle Valo
176948300cSKalle Valo #include "zd_def.h"
186948300cSKalle Valo
196948300cSKalle Valo #define ZD_USB_TX_HIGH 5
206948300cSKalle Valo #define ZD_USB_TX_LOW 2
216948300cSKalle Valo
226948300cSKalle Valo #define ZD_TX_TIMEOUT (HZ * 5)
236948300cSKalle Valo #define ZD_TX_WATCHDOG_INTERVAL round_jiffies_relative(HZ)
246948300cSKalle Valo #define ZD_RX_IDLE_INTERVAL round_jiffies_relative(30 * HZ)
256948300cSKalle Valo
266948300cSKalle Valo enum devicetype {
276948300cSKalle Valo DEVICE_ZD1211 = 0,
286948300cSKalle Valo DEVICE_ZD1211B = 1,
296948300cSKalle Valo DEVICE_INSTALLER = 2,
306948300cSKalle Valo };
316948300cSKalle Valo
326948300cSKalle Valo enum endpoints {
336948300cSKalle Valo EP_CTRL = 0,
346948300cSKalle Valo EP_DATA_OUT = 1,
356948300cSKalle Valo EP_DATA_IN = 2,
366948300cSKalle Valo EP_INT_IN = 3,
376948300cSKalle Valo EP_REGS_OUT = 4,
386948300cSKalle Valo };
396948300cSKalle Valo
406948300cSKalle Valo enum {
416948300cSKalle Valo USB_MAX_TRANSFER_SIZE = 4096, /* bytes */
426948300cSKalle Valo /* FIXME: The original driver uses this value. We have to check,
436948300cSKalle Valo * whether the MAX_TRANSFER_SIZE is sufficient and this needs only be
446948300cSKalle Valo * used if one combined frame is split over two USB transactions.
456948300cSKalle Valo */
466948300cSKalle Valo USB_MAX_RX_SIZE = 4800, /* bytes */
476948300cSKalle Valo USB_MAX_IOWRITE16_COUNT = 15,
486948300cSKalle Valo USB_MAX_IOWRITE32_COUNT = USB_MAX_IOWRITE16_COUNT/2,
496948300cSKalle Valo USB_MAX_IOREAD16_COUNT = 15,
506948300cSKalle Valo USB_MAX_IOREAD32_COUNT = USB_MAX_IOREAD16_COUNT/2,
516948300cSKalle Valo USB_MIN_RFWRITE_BIT_COUNT = 16,
526948300cSKalle Valo USB_MAX_RFWRITE_BIT_COUNT = 28,
536948300cSKalle Valo USB_MAX_EP_INT_BUFFER = 64,
546948300cSKalle Valo USB_ZD1211B_BCD_DEVICE = 0x4810,
556948300cSKalle Valo };
566948300cSKalle Valo
576948300cSKalle Valo enum control_requests {
586948300cSKalle Valo USB_REQ_WRITE_REGS = 0x21,
596948300cSKalle Valo USB_REQ_READ_REGS = 0x22,
606948300cSKalle Valo USB_REQ_WRITE_RF = 0x23,
616948300cSKalle Valo USB_REQ_PROG_FLASH = 0x24,
626948300cSKalle Valo USB_REQ_EEPROM_START = 0x0128, /* ? request is a byte */
636948300cSKalle Valo USB_REQ_EEPROM_MID = 0x28,
646948300cSKalle Valo USB_REQ_EEPROM_END = 0x0228, /* ? request is a byte */
656948300cSKalle Valo USB_REQ_FIRMWARE_DOWNLOAD = 0x30,
666948300cSKalle Valo USB_REQ_FIRMWARE_CONFIRM = 0x31,
676948300cSKalle Valo USB_REQ_FIRMWARE_READ_DATA = 0x32,
686948300cSKalle Valo };
696948300cSKalle Valo
706948300cSKalle Valo struct usb_req_read_regs {
716948300cSKalle Valo __le16 id;
72*8622a0e5SGustavo A. R. Silva __le16 addr[];
736948300cSKalle Valo } __packed;
746948300cSKalle Valo
756948300cSKalle Valo struct reg_data {
766948300cSKalle Valo __le16 addr;
776948300cSKalle Valo __le16 value;
786948300cSKalle Valo } __packed;
796948300cSKalle Valo
806948300cSKalle Valo struct usb_req_write_regs {
816948300cSKalle Valo __le16 id;
82*8622a0e5SGustavo A. R. Silva struct reg_data reg_writes[];
836948300cSKalle Valo } __packed;
846948300cSKalle Valo
856948300cSKalle Valo enum {
866948300cSKalle Valo RF_IF_LE = 0x02,
876948300cSKalle Valo RF_CLK = 0x04,
886948300cSKalle Valo RF_DATA = 0x08,
896948300cSKalle Valo };
906948300cSKalle Valo
916948300cSKalle Valo struct usb_req_rfwrite {
926948300cSKalle Valo __le16 id;
936948300cSKalle Valo __le16 value;
946948300cSKalle Valo /* 1: 3683a */
956948300cSKalle Valo /* 2: other (default) */
966948300cSKalle Valo __le16 bits;
976948300cSKalle Valo /* RF2595: 24 */
98*8622a0e5SGustavo A. R. Silva __le16 bit_values[];
996948300cSKalle Valo /* (ZD_CR203 & ~(RF_IF_LE | RF_CLK | RF_DATA)) | (bit ? RF_DATA : 0) */
1006948300cSKalle Valo } __packed;
1016948300cSKalle Valo
1026948300cSKalle Valo /* USB interrupt */
1036948300cSKalle Valo
1046948300cSKalle Valo enum usb_int_id {
1056948300cSKalle Valo USB_INT_TYPE = 0x01,
1066948300cSKalle Valo USB_INT_ID_REGS = 0x90,
1076948300cSKalle Valo USB_INT_ID_RETRY_FAILED = 0xa0,
1086948300cSKalle Valo };
1096948300cSKalle Valo
1106948300cSKalle Valo enum usb_int_flags {
1116948300cSKalle Valo USB_INT_READ_REGS_EN = 0x01,
1126948300cSKalle Valo };
1136948300cSKalle Valo
1146948300cSKalle Valo struct usb_int_header {
1156948300cSKalle Valo u8 type; /* must always be 1 */
1166948300cSKalle Valo u8 id;
1176948300cSKalle Valo } __packed;
1186948300cSKalle Valo
1196948300cSKalle Valo struct usb_int_regs {
1206948300cSKalle Valo struct usb_int_header hdr;
121*8622a0e5SGustavo A. R. Silva struct reg_data regs[];
1226948300cSKalle Valo } __packed;
1236948300cSKalle Valo
1246948300cSKalle Valo struct usb_int_retry_fail {
1256948300cSKalle Valo struct usb_int_header hdr;
1266948300cSKalle Valo u8 new_rate;
1276948300cSKalle Valo u8 _dummy;
1286948300cSKalle Valo u8 addr[ETH_ALEN];
1296948300cSKalle Valo u8 ibss_wakeup_dest;
1306948300cSKalle Valo } __packed;
1316948300cSKalle Valo
1326948300cSKalle Valo struct read_regs_int {
1336948300cSKalle Valo struct completion completion;
1346948300cSKalle Valo struct usb_req_read_regs *req;
1356948300cSKalle Valo unsigned int req_count;
1366948300cSKalle Valo /* Stores the USB int structure and contains the USB address of the
1376948300cSKalle Valo * first requested register before request.
1386948300cSKalle Valo */
1396948300cSKalle Valo u8 buffer[USB_MAX_EP_INT_BUFFER];
1406948300cSKalle Valo int length;
1416948300cSKalle Valo __le16 cr_int_addr;
1426948300cSKalle Valo };
1436948300cSKalle Valo
1446948300cSKalle Valo struct zd_ioreq16 {
1456948300cSKalle Valo zd_addr_t addr;
1466948300cSKalle Valo u16 value;
1476948300cSKalle Valo };
1486948300cSKalle Valo
1496948300cSKalle Valo struct zd_ioreq32 {
1506948300cSKalle Valo zd_addr_t addr;
1516948300cSKalle Valo u32 value;
1526948300cSKalle Valo };
1536948300cSKalle Valo
1546948300cSKalle Valo struct zd_usb_interrupt {
1556948300cSKalle Valo struct read_regs_int read_regs;
1566948300cSKalle Valo spinlock_t lock;
1576948300cSKalle Valo struct urb *urb;
1586948300cSKalle Valo void *buffer;
1596948300cSKalle Valo dma_addr_t buffer_dma;
1606948300cSKalle Valo int interval;
1616948300cSKalle Valo atomic_t read_regs_enabled;
1626948300cSKalle Valo u8 read_regs_int_overridden:1;
1636948300cSKalle Valo };
1646948300cSKalle Valo
get_read_regs(struct zd_usb_interrupt * intr)1656948300cSKalle Valo static inline struct usb_int_regs *get_read_regs(struct zd_usb_interrupt *intr)
1666948300cSKalle Valo {
1676948300cSKalle Valo return (struct usb_int_regs *)intr->read_regs.buffer;
1686948300cSKalle Valo }
1696948300cSKalle Valo
1706948300cSKalle Valo #define RX_URBS_COUNT 5
1716948300cSKalle Valo
1726948300cSKalle Valo struct zd_usb_rx {
1736948300cSKalle Valo spinlock_t lock;
1746948300cSKalle Valo struct mutex setup_mutex;
1756948300cSKalle Valo struct delayed_work idle_work;
1766948300cSKalle Valo struct tasklet_struct reset_timer_tasklet;
1776948300cSKalle Valo u8 fragment[2 * USB_MAX_RX_SIZE];
1786948300cSKalle Valo unsigned int fragment_length;
1796948300cSKalle Valo unsigned int usb_packet_size;
1806948300cSKalle Valo struct urb **urbs;
1816948300cSKalle Valo int urbs_count;
1826948300cSKalle Valo };
1836948300cSKalle Valo
1846948300cSKalle Valo /**
1856948300cSKalle Valo * struct zd_usb_tx - structure used for transmitting frames
1866948300cSKalle Valo * @enabled: atomic enabled flag, indicates whether tx is enabled
1876948300cSKalle Valo * @lock: lock for transmission
1886948300cSKalle Valo * @submitted: anchor for URBs sent to device
1896948300cSKalle Valo * @submitted_urbs: atomic integer that counts the URBs having sent to the
1906948300cSKalle Valo * device, which haven't been completed
1916948300cSKalle Valo * @stopped: indicates whether higher level tx queues are stopped
1926948300cSKalle Valo */
1936948300cSKalle Valo struct zd_usb_tx {
1946948300cSKalle Valo atomic_t enabled;
1956948300cSKalle Valo spinlock_t lock;
1966948300cSKalle Valo struct delayed_work watchdog_work;
1976948300cSKalle Valo struct sk_buff_head submitted_skbs;
1986948300cSKalle Valo struct usb_anchor submitted;
1996948300cSKalle Valo int submitted_urbs;
2006948300cSKalle Valo u8 stopped:1, watchdog_enabled:1;
2016948300cSKalle Valo };
2026948300cSKalle Valo
2036948300cSKalle Valo /* Contains the usb parts. The structure doesn't require a lock because intf
2046948300cSKalle Valo * will not be changed after initialization.
2056948300cSKalle Valo */
2066948300cSKalle Valo struct zd_usb {
2076948300cSKalle Valo struct zd_usb_interrupt intr;
2086948300cSKalle Valo struct zd_usb_rx rx;
2096948300cSKalle Valo struct zd_usb_tx tx;
2106948300cSKalle Valo struct usb_interface *intf;
2116948300cSKalle Valo struct usb_anchor submitted_cmds;
2126948300cSKalle Valo struct urb *urb_async_waiting;
2136948300cSKalle Valo int cmd_error;
2146948300cSKalle Valo u8 req_buf[64]; /* zd_usb_iowrite16v needs 62 bytes */
2156948300cSKalle Valo u8 is_zd1211b:1, initialized:1, was_running:1, in_async:1;
2166948300cSKalle Valo };
2176948300cSKalle Valo
2186948300cSKalle Valo #define zd_usb_dev(usb) (&usb->intf->dev)
2196948300cSKalle Valo
zd_usb_to_usbdev(struct zd_usb * usb)2206948300cSKalle Valo static inline struct usb_device *zd_usb_to_usbdev(struct zd_usb *usb)
2216948300cSKalle Valo {
2226948300cSKalle Valo return interface_to_usbdev(usb->intf);
2236948300cSKalle Valo }
2246948300cSKalle Valo
zd_intf_to_hw(struct usb_interface * intf)2256948300cSKalle Valo static inline struct ieee80211_hw *zd_intf_to_hw(struct usb_interface *intf)
2266948300cSKalle Valo {
2276948300cSKalle Valo return usb_get_intfdata(intf);
2286948300cSKalle Valo }
2296948300cSKalle Valo
zd_usb_to_hw(struct zd_usb * usb)2306948300cSKalle Valo static inline struct ieee80211_hw *zd_usb_to_hw(struct zd_usb *usb)
2316948300cSKalle Valo {
2326948300cSKalle Valo return zd_intf_to_hw(usb->intf);
2336948300cSKalle Valo }
2346948300cSKalle Valo
2356948300cSKalle Valo void zd_usb_init(struct zd_usb *usb, struct ieee80211_hw *hw,
2366948300cSKalle Valo struct usb_interface *intf);
2376948300cSKalle Valo int zd_usb_init_hw(struct zd_usb *usb);
2386948300cSKalle Valo void zd_usb_clear(struct zd_usb *usb);
2396948300cSKalle Valo
2406948300cSKalle Valo int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size);
2416948300cSKalle Valo
2426948300cSKalle Valo void zd_tx_watchdog_enable(struct zd_usb *usb);
2436948300cSKalle Valo void zd_tx_watchdog_disable(struct zd_usb *usb);
2446948300cSKalle Valo
2456948300cSKalle Valo int zd_usb_enable_int(struct zd_usb *usb);
2466948300cSKalle Valo void zd_usb_disable_int(struct zd_usb *usb);
2476948300cSKalle Valo
2486948300cSKalle Valo int zd_usb_enable_rx(struct zd_usb *usb);
2496948300cSKalle Valo void zd_usb_disable_rx(struct zd_usb *usb);
2506948300cSKalle Valo
2516948300cSKalle Valo void zd_usb_reset_rx_idle_timer(struct zd_usb *usb);
2526948300cSKalle Valo
2536948300cSKalle Valo void zd_usb_enable_tx(struct zd_usb *usb);
2546948300cSKalle Valo void zd_usb_disable_tx(struct zd_usb *usb);
2556948300cSKalle Valo
2566948300cSKalle Valo int zd_usb_tx(struct zd_usb *usb, struct sk_buff *skb);
2576948300cSKalle Valo
2586948300cSKalle Valo int zd_usb_ioread16v(struct zd_usb *usb, u16 *values,
2596948300cSKalle Valo const zd_addr_t *addresses, unsigned int count);
2606948300cSKalle Valo
zd_usb_ioread16(struct zd_usb * usb,u16 * value,const zd_addr_t addr)2616948300cSKalle Valo static inline int zd_usb_ioread16(struct zd_usb *usb, u16 *value,
2626948300cSKalle Valo const zd_addr_t addr)
2636948300cSKalle Valo {
2646948300cSKalle Valo return zd_usb_ioread16v(usb, value, &addr, 1);
2656948300cSKalle Valo }
2666948300cSKalle Valo
2676948300cSKalle Valo void zd_usb_iowrite16v_async_start(struct zd_usb *usb);
2686948300cSKalle Valo int zd_usb_iowrite16v_async_end(struct zd_usb *usb, unsigned int timeout);
2696948300cSKalle Valo int zd_usb_iowrite16v_async(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs,
2706948300cSKalle Valo unsigned int count);
2716948300cSKalle Valo int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs,
2726948300cSKalle Valo unsigned int count);
2736948300cSKalle Valo
2746948300cSKalle Valo int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits);
2756948300cSKalle Valo
2766948300cSKalle Valo int zd_usb_read_fw(struct zd_usb *usb, zd_addr_t addr, u8 *data, u16 len);
2776948300cSKalle Valo
2786948300cSKalle Valo extern struct workqueue_struct *zd_workqueue;
2796948300cSKalle Valo
2806948300cSKalle Valo #endif /* _ZD_USB_H */
281