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