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_MAC_H
96948300cSKalle Valo #define _ZD_MAC_H
106948300cSKalle Valo
116948300cSKalle Valo #include <linux/kernel.h>
126948300cSKalle Valo #include <net/mac80211.h>
136948300cSKalle Valo
146948300cSKalle Valo #include "zd_chip.h"
156948300cSKalle Valo
166948300cSKalle Valo struct zd_ctrlset {
176948300cSKalle Valo u8 modulation;
186948300cSKalle Valo __le16 tx_length;
196948300cSKalle Valo u8 control;
206948300cSKalle Valo /* stores only the difference to tx_length on ZD1211B */
216948300cSKalle Valo __le16 packet_length;
226948300cSKalle Valo __le16 current_length;
236948300cSKalle Valo u8 service;
246948300cSKalle Valo __le16 next_frame_length;
256948300cSKalle Valo } __packed;
266948300cSKalle Valo
276948300cSKalle Valo #define ZD_CS_RESERVED_SIZE 25
286948300cSKalle Valo
296948300cSKalle Valo /* The field modulation of struct zd_ctrlset controls the bit rate, the use
306948300cSKalle Valo * of short or long preambles in 802.11b (CCK mode) or the use of 802.11a or
316948300cSKalle Valo * 802.11g in OFDM mode.
326948300cSKalle Valo *
336948300cSKalle Valo * The term zd-rate is used for the combination of the modulation type flag
346948300cSKalle Valo * and the "pure" rate value.
356948300cSKalle Valo */
366948300cSKalle Valo #define ZD_PURE_RATE_MASK 0x0f
376948300cSKalle Valo #define ZD_MODULATION_TYPE_MASK 0x10
386948300cSKalle Valo #define ZD_RATE_MASK (ZD_PURE_RATE_MASK|ZD_MODULATION_TYPE_MASK)
396948300cSKalle Valo #define ZD_PURE_RATE(modulation) ((modulation) & ZD_PURE_RATE_MASK)
406948300cSKalle Valo #define ZD_MODULATION_TYPE(modulation) ((modulation) & ZD_MODULATION_TYPE_MASK)
416948300cSKalle Valo #define ZD_RATE(modulation) ((modulation) & ZD_RATE_MASK)
426948300cSKalle Valo
436948300cSKalle Valo /* The two possible modulation types. Notify that 802.11b doesn't use the CCK
446948300cSKalle Valo * codeing for the 1 and 2 MBit/s rate. We stay with the term here to remain
456948300cSKalle Valo * consistent with uses the term at other places.
466948300cSKalle Valo */
476948300cSKalle Valo #define ZD_CCK 0x00
486948300cSKalle Valo #define ZD_OFDM 0x10
496948300cSKalle Valo
506948300cSKalle Valo /* The ZD1211 firmware uses proprietary encodings of the 802.11b (CCK) rates.
516948300cSKalle Valo * For OFDM the PLCP rate encodings are used. We combine these "pure" rates
526948300cSKalle Valo * with the modulation type flag and call the resulting values zd-rates.
536948300cSKalle Valo */
546948300cSKalle Valo #define ZD_CCK_RATE_1M (ZD_CCK|0x00)
556948300cSKalle Valo #define ZD_CCK_RATE_2M (ZD_CCK|0x01)
566948300cSKalle Valo #define ZD_CCK_RATE_5_5M (ZD_CCK|0x02)
576948300cSKalle Valo #define ZD_CCK_RATE_11M (ZD_CCK|0x03)
586948300cSKalle Valo #define ZD_OFDM_RATE_6M (ZD_OFDM|ZD_OFDM_PLCP_RATE_6M)
596948300cSKalle Valo #define ZD_OFDM_RATE_9M (ZD_OFDM|ZD_OFDM_PLCP_RATE_9M)
606948300cSKalle Valo #define ZD_OFDM_RATE_12M (ZD_OFDM|ZD_OFDM_PLCP_RATE_12M)
616948300cSKalle Valo #define ZD_OFDM_RATE_18M (ZD_OFDM|ZD_OFDM_PLCP_RATE_18M)
626948300cSKalle Valo #define ZD_OFDM_RATE_24M (ZD_OFDM|ZD_OFDM_PLCP_RATE_24M)
636948300cSKalle Valo #define ZD_OFDM_RATE_36M (ZD_OFDM|ZD_OFDM_PLCP_RATE_36M)
646948300cSKalle Valo #define ZD_OFDM_RATE_48M (ZD_OFDM|ZD_OFDM_PLCP_RATE_48M)
656948300cSKalle Valo #define ZD_OFDM_RATE_54M (ZD_OFDM|ZD_OFDM_PLCP_RATE_54M)
666948300cSKalle Valo
676948300cSKalle Valo /* The bit 5 of the zd_ctrlset modulation field controls the preamble in CCK
686948300cSKalle Valo * mode or the 802.11a/802.11g selection in OFDM mode.
696948300cSKalle Valo */
706948300cSKalle Valo #define ZD_CCK_PREA_LONG 0x00
716948300cSKalle Valo #define ZD_CCK_PREA_SHORT 0x20
726948300cSKalle Valo #define ZD_OFDM_MODE_11G 0x00
736948300cSKalle Valo #define ZD_OFDM_MODE_11A 0x20
746948300cSKalle Valo
756948300cSKalle Valo /* zd_ctrlset control field */
766948300cSKalle Valo #define ZD_CS_NEED_RANDOM_BACKOFF 0x01
776948300cSKalle Valo #define ZD_CS_NO_ACK 0x02
786948300cSKalle Valo
796948300cSKalle Valo #define ZD_CS_FRAME_TYPE_MASK 0x0c
806948300cSKalle Valo #define ZD_CS_DATA_FRAME 0x00
816948300cSKalle Valo #define ZD_CS_PS_POLL_FRAME 0x04
826948300cSKalle Valo #define ZD_CS_MANAGEMENT_FRAME 0x08
836948300cSKalle Valo #define ZD_CS_NO_SEQUENCE_CTL_FRAME 0x0c
846948300cSKalle Valo
856948300cSKalle Valo #define ZD_CS_WAKE_DESTINATION 0x10
866948300cSKalle Valo #define ZD_CS_RTS 0x20
876948300cSKalle Valo #define ZD_CS_ENCRYPT 0x40
886948300cSKalle Valo #define ZD_CS_SELF_CTS 0x80
896948300cSKalle Valo
906948300cSKalle Valo /* Incoming frames are prepended by a PLCP header */
916948300cSKalle Valo #define ZD_PLCP_HEADER_SIZE 5
926948300cSKalle Valo
936948300cSKalle Valo struct rx_length_info {
946948300cSKalle Valo __le16 length[3];
956948300cSKalle Valo __le16 tag;
966948300cSKalle Valo } __packed;
976948300cSKalle Valo
986948300cSKalle Valo #define RX_LENGTH_INFO_TAG 0x697e
996948300cSKalle Valo
1006948300cSKalle Valo struct rx_status {
1016948300cSKalle Valo u8 signal_quality_cck;
1026948300cSKalle Valo /* rssi */
1036948300cSKalle Valo u8 signal_strength;
1046948300cSKalle Valo u8 signal_quality_ofdm;
1056948300cSKalle Valo u8 decryption_type;
1066948300cSKalle Valo u8 frame_status;
1076948300cSKalle Valo } __packed;
1086948300cSKalle Valo
1096948300cSKalle Valo /* rx_status field decryption_type */
1106948300cSKalle Valo #define ZD_RX_NO_WEP 0
1116948300cSKalle Valo #define ZD_RX_WEP64 1
1126948300cSKalle Valo #define ZD_RX_TKIP 2
1136948300cSKalle Valo #define ZD_RX_AES 4
1146948300cSKalle Valo #define ZD_RX_WEP128 5
1156948300cSKalle Valo #define ZD_RX_WEP256 6
1166948300cSKalle Valo
1176948300cSKalle Valo /* rx_status field frame_status */
1186948300cSKalle Valo #define ZD_RX_FRAME_MODULATION_MASK 0x01
1196948300cSKalle Valo #define ZD_RX_CCK 0x00
1206948300cSKalle Valo #define ZD_RX_OFDM 0x01
1216948300cSKalle Valo
1226948300cSKalle Valo #define ZD_RX_TIMEOUT_ERROR 0x02
1236948300cSKalle Valo #define ZD_RX_FIFO_OVERRUN_ERROR 0x04
1246948300cSKalle Valo #define ZD_RX_DECRYPTION_ERROR 0x08
1256948300cSKalle Valo #define ZD_RX_CRC32_ERROR 0x10
1266948300cSKalle Valo #define ZD_RX_NO_ADDR1_MATCH_ERROR 0x20
1276948300cSKalle Valo #define ZD_RX_CRC16_ERROR 0x40
1286948300cSKalle Valo #define ZD_RX_ERROR 0x80
1296948300cSKalle Valo
1306948300cSKalle Valo struct tx_retry_rate {
1316948300cSKalle Valo int count; /* number of valid element in rate[] array */
1326948300cSKalle Valo int rate[10]; /* retry rates, described by an index in zd_rates[] */
1336948300cSKalle Valo };
1346948300cSKalle Valo
1356948300cSKalle Valo struct tx_status {
1366948300cSKalle Valo u8 type; /* must always be 0x01 : USB_INT_TYPE */
1376948300cSKalle Valo u8 id; /* must always be 0xa0 : USB_INT_ID_RETRY_FAILED */
1386948300cSKalle Valo u8 rate;
1396948300cSKalle Valo u8 pad;
1406948300cSKalle Valo u8 mac[ETH_ALEN];
1416948300cSKalle Valo u8 retry;
1426948300cSKalle Valo u8 failure;
1436948300cSKalle Valo } __packed;
1446948300cSKalle Valo
1456948300cSKalle Valo enum mac_flags {
1466948300cSKalle Valo MAC_FIXED_CHANNEL = 0x01,
1476948300cSKalle Valo };
1486948300cSKalle Valo
1496948300cSKalle Valo struct housekeeping {
1506948300cSKalle Valo struct delayed_work link_led_work;
1516948300cSKalle Valo };
1526948300cSKalle Valo
1536948300cSKalle Valo struct beacon {
1546948300cSKalle Valo struct delayed_work watchdog_work;
1556948300cSKalle Valo struct sk_buff *cur_beacon;
1566948300cSKalle Valo unsigned long last_update;
1576948300cSKalle Valo u16 interval;
1586948300cSKalle Valo u8 period;
1596948300cSKalle Valo };
1606948300cSKalle Valo
1616948300cSKalle Valo enum zd_device_flags {
1626948300cSKalle Valo ZD_DEVICE_RUNNING,
1636948300cSKalle Valo };
1646948300cSKalle Valo
1656948300cSKalle Valo #define ZD_MAC_STATS_BUFFER_SIZE 16
1666948300cSKalle Valo
1676948300cSKalle Valo #define ZD_MAC_MAX_ACK_WAITERS 50
1686948300cSKalle Valo
1696948300cSKalle Valo struct zd_mac {
1706948300cSKalle Valo struct zd_chip chip;
1716948300cSKalle Valo spinlock_t lock;
1726948300cSKalle Valo spinlock_t intr_lock;
1736948300cSKalle Valo struct ieee80211_hw *hw;
1746948300cSKalle Valo struct ieee80211_vif *vif;
1756948300cSKalle Valo struct housekeeping housekeeping;
1766948300cSKalle Valo struct beacon beacon;
1776948300cSKalle Valo struct work_struct set_rts_cts_work;
1786948300cSKalle Valo struct work_struct process_intr;
1796948300cSKalle Valo struct zd_mc_hash multicast_hash;
1806948300cSKalle Valo u8 intr_buffer[USB_MAX_EP_INT_BUFFER];
1816948300cSKalle Valo u8 regdomain;
1826948300cSKalle Valo u8 default_regdomain;
1836948300cSKalle Valo u8 channel;
1846948300cSKalle Valo int type;
1856948300cSKalle Valo int associated;
1866948300cSKalle Valo unsigned long flags;
1876948300cSKalle Valo struct sk_buff_head ack_wait_queue;
1886948300cSKalle Valo struct ieee80211_channel channels[14];
1896948300cSKalle Valo struct ieee80211_rate rates[12];
1906948300cSKalle Valo struct ieee80211_supported_band band;
1916948300cSKalle Valo
1926948300cSKalle Valo /* Short preamble (used for RTS/CTS) */
1936948300cSKalle Valo unsigned int short_preamble:1;
1946948300cSKalle Valo
1956948300cSKalle Valo /* whether to pass frames with CRC errors to stack */
1966948300cSKalle Valo unsigned int pass_failed_fcs:1;
1976948300cSKalle Valo
1986948300cSKalle Valo /* whether to pass control frames to stack */
1996948300cSKalle Valo unsigned int pass_ctrl:1;
2006948300cSKalle Valo
2016948300cSKalle Valo /* whether we have received a 802.11 ACK that is pending */
2026948300cSKalle Valo unsigned int ack_pending:1;
2036948300cSKalle Valo
2046948300cSKalle Valo /* signal strength of the last 802.11 ACK received */
2056948300cSKalle Valo int ack_signal;
2066948300cSKalle Valo };
2076948300cSKalle Valo
2086948300cSKalle Valo #define ZD_REGDOMAIN_FCC 0x10
2096948300cSKalle Valo #define ZD_REGDOMAIN_IC 0x20
2106948300cSKalle Valo #define ZD_REGDOMAIN_ETSI 0x30
2116948300cSKalle Valo #define ZD_REGDOMAIN_SPAIN 0x31
2126948300cSKalle Valo #define ZD_REGDOMAIN_FRANCE 0x32
2136948300cSKalle Valo #define ZD_REGDOMAIN_JAPAN_2 0x40
2146948300cSKalle Valo #define ZD_REGDOMAIN_JAPAN 0x41
2156948300cSKalle Valo #define ZD_REGDOMAIN_JAPAN_3 0x49
2166948300cSKalle Valo
2176948300cSKalle Valo enum {
2186948300cSKalle Valo MIN_CHANNEL24 = 1,
2196948300cSKalle Valo MAX_CHANNEL24 = 14,
2206948300cSKalle Valo };
2216948300cSKalle Valo
2226948300cSKalle Valo #define ZD_PLCP_SERVICE_LENGTH_EXTENSION 0x80
2236948300cSKalle Valo
2246948300cSKalle Valo struct ofdm_plcp_header {
2256948300cSKalle Valo u8 prefix[3];
2266948300cSKalle Valo __le16 service;
2276948300cSKalle Valo } __packed;
2286948300cSKalle Valo
zd_ofdm_plcp_header_rate(const struct ofdm_plcp_header * header)2296948300cSKalle Valo static inline u8 zd_ofdm_plcp_header_rate(const struct ofdm_plcp_header *header)
2306948300cSKalle Valo {
2316948300cSKalle Valo return header->prefix[0] & 0xf;
2326948300cSKalle Valo }
2336948300cSKalle Valo
2346948300cSKalle Valo /* The following defines give the encoding of the 4-bit rate field in the
2356948300cSKalle Valo * OFDM (802.11a/802.11g) PLCP header. Notify that these values are used to
2366948300cSKalle Valo * define the zd-rate values for OFDM.
2376948300cSKalle Valo *
2386948300cSKalle Valo * See the struct zd_ctrlset definition in zd_mac.h.
2396948300cSKalle Valo */
2406948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_6M 0xb
2416948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_9M 0xf
2426948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_12M 0xa
2436948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_18M 0xe
2446948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_24M 0x9
2456948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_36M 0xd
2466948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_48M 0x8
2476948300cSKalle Valo #define ZD_OFDM_PLCP_RATE_54M 0xc
2486948300cSKalle Valo
2496948300cSKalle Valo struct cck_plcp_header {
2506948300cSKalle Valo u8 signal;
2516948300cSKalle Valo u8 service;
2526948300cSKalle Valo __le16 length;
2536948300cSKalle Valo __le16 crc16;
2546948300cSKalle Valo } __packed;
2556948300cSKalle Valo
zd_cck_plcp_header_signal(const struct cck_plcp_header * header)2566948300cSKalle Valo static inline u8 zd_cck_plcp_header_signal(const struct cck_plcp_header *header)
2576948300cSKalle Valo {
2586948300cSKalle Valo return header->signal;
2596948300cSKalle Valo }
2606948300cSKalle Valo
2616948300cSKalle Valo /* These defines give the encodings of the signal field in the 802.11b PLCP
2626948300cSKalle Valo * header. The signal field gives the bit rate of the following packet. Even
2636948300cSKalle Valo * if technically wrong we use CCK here also for the 1 MBit/s and 2 MBit/s
2646948300cSKalle Valo * rate to stay consistent with Zydas and our use of the term.
2656948300cSKalle Valo *
2666948300cSKalle Valo * Notify that these values are *not* used in the zd-rates.
2676948300cSKalle Valo */
2686948300cSKalle Valo #define ZD_CCK_PLCP_SIGNAL_1M 0x0a
2696948300cSKalle Valo #define ZD_CCK_PLCP_SIGNAL_2M 0x14
2706948300cSKalle Valo #define ZD_CCK_PLCP_SIGNAL_5M5 0x37
2716948300cSKalle Valo #define ZD_CCK_PLCP_SIGNAL_11M 0x6e
2726948300cSKalle Valo
zd_hw_mac(struct ieee80211_hw * hw)2736948300cSKalle Valo static inline struct zd_mac *zd_hw_mac(struct ieee80211_hw *hw)
2746948300cSKalle Valo {
2756948300cSKalle Valo return hw->priv;
2766948300cSKalle Valo }
2776948300cSKalle Valo
zd_chip_to_mac(struct zd_chip * chip)2786948300cSKalle Valo static inline struct zd_mac *zd_chip_to_mac(struct zd_chip *chip)
2796948300cSKalle Valo {
2806948300cSKalle Valo return container_of(chip, struct zd_mac, chip);
2816948300cSKalle Valo }
2826948300cSKalle Valo
zd_usb_to_mac(struct zd_usb * usb)2836948300cSKalle Valo static inline struct zd_mac *zd_usb_to_mac(struct zd_usb *usb)
2846948300cSKalle Valo {
2856948300cSKalle Valo return zd_chip_to_mac(zd_usb_to_chip(usb));
2866948300cSKalle Valo }
2876948300cSKalle Valo
zd_mac_get_perm_addr(struct zd_mac * mac)2886948300cSKalle Valo static inline u8 *zd_mac_get_perm_addr(struct zd_mac *mac)
2896948300cSKalle Valo {
2906948300cSKalle Valo return mac->hw->wiphy->perm_addr;
2916948300cSKalle Valo }
2926948300cSKalle Valo
2936948300cSKalle Valo #define zd_mac_dev(mac) (zd_chip_dev(&(mac)->chip))
2946948300cSKalle Valo
2956948300cSKalle Valo struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf);
2966948300cSKalle Valo void zd_mac_clear(struct zd_mac *mac);
2976948300cSKalle Valo
2986948300cSKalle Valo int zd_mac_preinit_hw(struct ieee80211_hw *hw);
2996948300cSKalle Valo int zd_mac_init_hw(struct ieee80211_hw *hw);
3006948300cSKalle Valo
3016948300cSKalle Valo int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length);
3026948300cSKalle Valo void zd_mac_tx_failed(struct urb *urb);
3036948300cSKalle Valo void zd_mac_tx_to_dev(struct sk_buff *skb, int error);
3046948300cSKalle Valo
3056948300cSKalle Valo int zd_op_start(struct ieee80211_hw *hw);
3066948300cSKalle Valo void zd_op_stop(struct ieee80211_hw *hw);
3076948300cSKalle Valo int zd_restore_settings(struct zd_mac *mac);
3086948300cSKalle Valo
3096948300cSKalle Valo #ifdef DEBUG
3106948300cSKalle Valo void zd_dump_rx_status(const struct rx_status *status);
3116948300cSKalle Valo #else
3126948300cSKalle Valo #define zd_dump_rx_status(status)
3136948300cSKalle Valo #endif /* DEBUG */
3146948300cSKalle Valo
3156948300cSKalle Valo #endif /* _ZD_MAC_H */
316