162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2021 pureLiFi
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef PLFXLC_MAC_H
762306a36Sopenharmony_ci#define PLFXLC_MAC_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/kernel.h>
1062306a36Sopenharmony_ci#include <net/mac80211.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "chip.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define PURELIFI_CCK                  0x00
1562306a36Sopenharmony_ci#define PURELIFI_OFDM                 0x10
1662306a36Sopenharmony_ci#define PURELIFI_CCK_PREA_SHORT       0x20
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_6M	0xb
1962306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_9M	0xf
2062306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_12M	0xa
2162306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_18M	0xe
2262306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_24M	0x9
2362306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_36M	0xd
2462306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_48M	0x8
2562306a36Sopenharmony_ci#define PURELIFI_OFDM_PLCP_RATE_54M	0xc
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define PURELIFI_CCK_RATE_1M	(PURELIFI_CCK | 0x00)
2862306a36Sopenharmony_ci#define PURELIFI_CCK_RATE_2M	(PURELIFI_CCK | 0x01)
2962306a36Sopenharmony_ci#define PURELIFI_CCK_RATE_5_5M	(PURELIFI_CCK | 0x02)
3062306a36Sopenharmony_ci#define PURELIFI_CCK_RATE_11M	(PURELIFI_CCK | 0x03)
3162306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_6M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_6M)
3262306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_9M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_9M)
3362306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_12M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_12M)
3462306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_18M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_18M)
3562306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_24M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_24M)
3662306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_36M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_36M)
3762306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_48M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_48M)
3862306a36Sopenharmony_ci#define PURELIFI_OFDM_RATE_54M	(PURELIFI_OFDM | PURELIFI_OFDM_PLCP_RATE_54M)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define PURELIFI_RX_ERROR		0x80
4162306a36Sopenharmony_ci#define PURELIFI_RX_CRC32_ERROR		0x10
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define PLF_REGDOMAIN_FCC	0x10
4462306a36Sopenharmony_ci#define PLF_REGDOMAIN_IC	0x20
4562306a36Sopenharmony_ci#define PLF_REGDOMAIN_ETSI	0x30
4662306a36Sopenharmony_ci#define PLF_REGDOMAIN_SPAIN	0x31
4762306a36Sopenharmony_ci#define PLF_REGDOMAIN_FRANCE	0x32
4862306a36Sopenharmony_ci#define PLF_REGDOMAIN_JAPAN_2	0x40
4962306a36Sopenharmony_ci#define PLF_REGDOMAIN_JAPAN	0x41
5062306a36Sopenharmony_ci#define PLF_REGDOMAIN_JAPAN_3	0x49
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define PLF_RX_ERROR		0x80
5362306a36Sopenharmony_ci#define PLF_RX_CRC32_ERROR	0x10
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cienum {
5662306a36Sopenharmony_ci	MODULATION_RATE_BPSK_1_2 = 0,
5762306a36Sopenharmony_ci	MODULATION_RATE_BPSK_3_4,
5862306a36Sopenharmony_ci	MODULATION_RATE_QPSK_1_2,
5962306a36Sopenharmony_ci	MODULATION_RATE_QPSK_3_4,
6062306a36Sopenharmony_ci	MODULATION_RATE_QAM16_1_2,
6162306a36Sopenharmony_ci	MODULATION_RATE_QAM16_3_4,
6262306a36Sopenharmony_ci	MODULATION_RATE_QAM64_1_2,
6362306a36Sopenharmony_ci	MODULATION_RATE_QAM64_3_4,
6462306a36Sopenharmony_ci	MODULATION_RATE_AUTO,
6562306a36Sopenharmony_ci	MODULATION_RATE_NUM
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#define plfxlc_mac_dev(mac) plfxlc_chip_dev(&(mac)->chip)
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#define PURELIFI_MAC_STATS_BUFFER_SIZE 16
7162306a36Sopenharmony_ci#define PURELIFI_MAC_MAX_ACK_WAITERS 50
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistruct plfxlc_ctrlset {
7462306a36Sopenharmony_ci	/* id should be plf_usb_req_enum */
7562306a36Sopenharmony_ci	__be32		id;
7662306a36Sopenharmony_ci	__be32		len;
7762306a36Sopenharmony_ci	u8		modulation;
7862306a36Sopenharmony_ci	u8		control;
7962306a36Sopenharmony_ci	u8		service;
8062306a36Sopenharmony_ci	u8		pad;
8162306a36Sopenharmony_ci	__le16		packet_length;
8262306a36Sopenharmony_ci	__le16		current_length;
8362306a36Sopenharmony_ci	__le16		next_frame_length;
8462306a36Sopenharmony_ci	__le16		tx_length;
8562306a36Sopenharmony_ci	__be32		payload_len_nw;
8662306a36Sopenharmony_ci} __packed;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* overlay */
8962306a36Sopenharmony_cistruct plfxlc_header {
9062306a36Sopenharmony_ci	struct plfxlc_ctrlset plf_ctrl;
9162306a36Sopenharmony_ci	u32    frametype;
9262306a36Sopenharmony_ci	u8    *dmac;
9362306a36Sopenharmony_ci} __packed;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistruct tx_status {
9662306a36Sopenharmony_ci	u8 type;
9762306a36Sopenharmony_ci	u8 id;
9862306a36Sopenharmony_ci	u8 rate;
9962306a36Sopenharmony_ci	u8 pad;
10062306a36Sopenharmony_ci	u8 mac[ETH_ALEN];
10162306a36Sopenharmony_ci	u8 retry;
10262306a36Sopenharmony_ci	u8 failure;
10362306a36Sopenharmony_ci} __packed;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistruct beacon {
10662306a36Sopenharmony_ci	struct delayed_work watchdog_work;
10762306a36Sopenharmony_ci	struct sk_buff *cur_beacon;
10862306a36Sopenharmony_ci	unsigned long last_update;
10962306a36Sopenharmony_ci	u16 interval;
11062306a36Sopenharmony_ci	u8 period;
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cienum plfxlc_device_flags {
11462306a36Sopenharmony_ci	PURELIFI_DEVICE_RUNNING,
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistruct plfxlc_mac {
11862306a36Sopenharmony_ci	struct ieee80211_hw *hw;
11962306a36Sopenharmony_ci	struct ieee80211_vif *vif;
12062306a36Sopenharmony_ci	struct beacon beacon;
12162306a36Sopenharmony_ci	struct work_struct set_rts_cts_work;
12262306a36Sopenharmony_ci	struct work_struct process_intr;
12362306a36Sopenharmony_ci	struct plfxlc_mc_hash multicast_hash;
12462306a36Sopenharmony_ci	struct sk_buff_head ack_wait_queue;
12562306a36Sopenharmony_ci	struct ieee80211_channel channels[14];
12662306a36Sopenharmony_ci	struct ieee80211_rate rates[12];
12762306a36Sopenharmony_ci	struct ieee80211_supported_band band;
12862306a36Sopenharmony_ci	struct plfxlc_chip chip;
12962306a36Sopenharmony_ci	spinlock_t lock; /* lock for mac data */
13062306a36Sopenharmony_ci	u8 intr_buffer[USB_MAX_EP_INT_BUFFER];
13162306a36Sopenharmony_ci	char serial_number[PURELIFI_SERIAL_LEN];
13262306a36Sopenharmony_ci	unsigned char hw_address[ETH_ALEN];
13362306a36Sopenharmony_ci	u8 default_regdomain;
13462306a36Sopenharmony_ci	unsigned long flags;
13562306a36Sopenharmony_ci	bool pass_failed_fcs;
13662306a36Sopenharmony_ci	bool pass_ctrl;
13762306a36Sopenharmony_ci	bool ack_pending;
13862306a36Sopenharmony_ci	int ack_signal;
13962306a36Sopenharmony_ci	int associated;
14062306a36Sopenharmony_ci	u8 regdomain;
14162306a36Sopenharmony_ci	u8 channel;
14262306a36Sopenharmony_ci	int type;
14362306a36Sopenharmony_ci	u64 crc_errors;
14462306a36Sopenharmony_ci	u64 rssi;
14562306a36Sopenharmony_ci};
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_cistatic inline struct plfxlc_mac *
14862306a36Sopenharmony_ciplfxlc_hw_mac(struct ieee80211_hw *hw)
14962306a36Sopenharmony_ci{
15062306a36Sopenharmony_ci	return hw->priv;
15162306a36Sopenharmony_ci}
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistatic inline struct plfxlc_mac *
15462306a36Sopenharmony_ciplfxlc_chip_to_mac(struct plfxlc_chip *chip)
15562306a36Sopenharmony_ci{
15662306a36Sopenharmony_ci	return container_of(chip, struct plfxlc_mac, chip);
15762306a36Sopenharmony_ci}
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cistatic inline struct plfxlc_mac *
16062306a36Sopenharmony_ciplfxlc_usb_to_mac(struct plfxlc_usb *usb)
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	return plfxlc_chip_to_mac(plfxlc_usb_to_chip(usb));
16362306a36Sopenharmony_ci}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_cistatic inline u8 *plfxlc_mac_get_perm_addr(struct plfxlc_mac *mac)
16662306a36Sopenharmony_ci{
16762306a36Sopenharmony_ci	return mac->hw->wiphy->perm_addr;
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_cistruct ieee80211_hw *plfxlc_mac_alloc_hw(struct usb_interface *intf);
17162306a36Sopenharmony_civoid plfxlc_mac_release(struct plfxlc_mac *mac);
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ciint plfxlc_mac_preinit_hw(struct ieee80211_hw *hw, const u8 *hw_address);
17462306a36Sopenharmony_ciint plfxlc_mac_init_hw(struct ieee80211_hw *hw);
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ciint plfxlc_mac_rx(struct ieee80211_hw *hw, const u8 *buffer,
17762306a36Sopenharmony_ci		  unsigned int length);
17862306a36Sopenharmony_civoid plfxlc_mac_tx_failed(struct urb *urb);
17962306a36Sopenharmony_civoid plfxlc_mac_tx_to_dev(struct sk_buff *skb, int error);
18062306a36Sopenharmony_ciint plfxlc_op_start(struct ieee80211_hw *hw);
18162306a36Sopenharmony_civoid plfxlc_op_stop(struct ieee80211_hw *hw);
18262306a36Sopenharmony_ciint plfxlc_restore_settings(struct plfxlc_mac *mac);
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci#endif /* PLFXLC_MAC_H */
185