xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/marvell/libertas/dev.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * This file contains definitions and data structures specific
4*4882a593Smuzhiyun  * to Marvell 802.11 NIC. It contains the Device Information
5*4882a593Smuzhiyun  * structure struct lbs_private..
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #ifndef _LBS_DEV_H_
8*4882a593Smuzhiyun #define _LBS_DEV_H_
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include "defs.h"
11*4882a593Smuzhiyun #include "decl.h"
12*4882a593Smuzhiyun #include "host.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/kfifo.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* sleep_params */
17*4882a593Smuzhiyun struct sleep_params {
18*4882a593Smuzhiyun 	uint16_t sp_error;
19*4882a593Smuzhiyun 	uint16_t sp_offset;
20*4882a593Smuzhiyun 	uint16_t sp_stabletime;
21*4882a593Smuzhiyun 	uint8_t  sp_calcontrol;
22*4882a593Smuzhiyun 	uint8_t  sp_extsleepclk;
23*4882a593Smuzhiyun 	uint16_t sp_reserved;
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* Mesh statistics */
27*4882a593Smuzhiyun struct lbs_mesh_stats {
28*4882a593Smuzhiyun 	u32	fwd_bcast_cnt;		/* Fwd: Broadcast counter */
29*4882a593Smuzhiyun 	u32	fwd_unicast_cnt;	/* Fwd: Unicast counter */
30*4882a593Smuzhiyun 	u32	fwd_drop_ttl;		/* Fwd: TTL zero */
31*4882a593Smuzhiyun 	u32	fwd_drop_rbt;		/* Fwd: Recently Broadcasted */
32*4882a593Smuzhiyun 	u32	fwd_drop_noroute; 	/* Fwd: No route to Destination */
33*4882a593Smuzhiyun 	u32	fwd_drop_nobuf;		/* Fwd: Run out of internal buffers */
34*4882a593Smuzhiyun 	u32	drop_blind;		/* Rx:  Dropped by blinding table */
35*4882a593Smuzhiyun 	u32	tx_failed_cnt;		/* Tx:  Failed transmissions */
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* Private structure for the MV device */
39*4882a593Smuzhiyun struct lbs_private {
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	/* Basic networking */
42*4882a593Smuzhiyun 	struct net_device *dev;
43*4882a593Smuzhiyun 	u32 connect_status;
44*4882a593Smuzhiyun 	struct work_struct mcast_work;
45*4882a593Smuzhiyun 	u32 nr_of_multicastmacaddr;
46*4882a593Smuzhiyun 	u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN];
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	/* CFG80211 */
49*4882a593Smuzhiyun 	struct wireless_dev *wdev;
50*4882a593Smuzhiyun 	bool wiphy_registered;
51*4882a593Smuzhiyun 	struct cfg80211_scan_request *scan_req;
52*4882a593Smuzhiyun 	u8 assoc_bss[ETH_ALEN];
53*4882a593Smuzhiyun 	u8 country_code[IEEE80211_COUNTRY_STRING_LEN];
54*4882a593Smuzhiyun 	u8 disassoc_reason;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	/* Mesh */
57*4882a593Smuzhiyun 	struct net_device *mesh_dev; /* Virtual device */
58*4882a593Smuzhiyun #ifdef CONFIG_LIBERTAS_MESH
59*4882a593Smuzhiyun 	struct lbs_mesh_stats mstats;
60*4882a593Smuzhiyun 	uint16_t mesh_tlv;
61*4882a593Smuzhiyun 	u8 mesh_channel;
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	/* Debugfs */
65*4882a593Smuzhiyun 	struct dentry *debugfs_dir;
66*4882a593Smuzhiyun 	struct dentry *debugfs_debug;
67*4882a593Smuzhiyun 	struct dentry *debugfs_files[6];
68*4882a593Smuzhiyun 	struct dentry *events_dir;
69*4882a593Smuzhiyun 	struct dentry *debugfs_events_files[6];
70*4882a593Smuzhiyun 	struct dentry *regs_dir;
71*4882a593Smuzhiyun 	struct dentry *debugfs_regs_files[6];
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	/* Hardware debugging */
74*4882a593Smuzhiyun 	u32 mac_offset;
75*4882a593Smuzhiyun 	u32 bbp_offset;
76*4882a593Smuzhiyun 	u32 rf_offset;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	/* Power management */
79*4882a593Smuzhiyun 	u16 psmode;
80*4882a593Smuzhiyun 	u32 psstate;
81*4882a593Smuzhiyun 	u8 needtowakeup;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	/* Deep sleep */
84*4882a593Smuzhiyun 	int is_deep_sleep;
85*4882a593Smuzhiyun 	int deep_sleep_required;
86*4882a593Smuzhiyun 	int is_auto_deep_sleep_enabled;
87*4882a593Smuzhiyun 	int wakeup_dev_required;
88*4882a593Smuzhiyun 	int is_activity_detected;
89*4882a593Smuzhiyun 	int auto_deep_sleep_timeout; /* in ms */
90*4882a593Smuzhiyun 	wait_queue_head_t ds_awake_q;
91*4882a593Smuzhiyun 	struct timer_list auto_deepsleep_timer;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	/* Host sleep*/
94*4882a593Smuzhiyun 	int is_host_sleep_configured;
95*4882a593Smuzhiyun 	int is_host_sleep_activated;
96*4882a593Smuzhiyun 	wait_queue_head_t host_sleep_q;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	/* Hardware access */
99*4882a593Smuzhiyun 	void *card;
100*4882a593Smuzhiyun 	bool iface_running;
101*4882a593Smuzhiyun 	u8 is_polling; /* host has to poll the card irq */
102*4882a593Smuzhiyun 	u8 fw_ready;
103*4882a593Smuzhiyun 	u8 surpriseremoved;
104*4882a593Smuzhiyun 	u8 setup_fw_on_resume;
105*4882a593Smuzhiyun 	u8 power_up_on_resume;
106*4882a593Smuzhiyun 	int (*hw_host_to_card) (struct lbs_private *priv, u8 type, u8 *payload, u16 nb);
107*4882a593Smuzhiyun 	void (*reset_card) (struct lbs_private *priv);
108*4882a593Smuzhiyun 	int (*power_save) (struct lbs_private *priv);
109*4882a593Smuzhiyun 	int (*power_restore) (struct lbs_private *priv);
110*4882a593Smuzhiyun 	int (*enter_deep_sleep) (struct lbs_private *priv);
111*4882a593Smuzhiyun 	int (*exit_deep_sleep) (struct lbs_private *priv);
112*4882a593Smuzhiyun 	int (*reset_deep_sleep_wakeup) (struct lbs_private *priv);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	/* Adapter info (from EEPROM) */
115*4882a593Smuzhiyun 	u32 fwrelease;
116*4882a593Smuzhiyun 	u32 fwcapinfo;
117*4882a593Smuzhiyun 	u16 regioncode;
118*4882a593Smuzhiyun 	u8 current_addr[ETH_ALEN];
119*4882a593Smuzhiyun 	u8 copied_hwaddr;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	/* Command download */
122*4882a593Smuzhiyun 	u8 dnld_sent;
123*4882a593Smuzhiyun 	/* bit0 1/0=data_sent/data_tx_done,
124*4882a593Smuzhiyun 	   bit1 1/0=cmd_sent/cmd_tx_done,
125*4882a593Smuzhiyun 	   all other bits reserved 0 */
126*4882a593Smuzhiyun 	u16 seqnum;
127*4882a593Smuzhiyun 	struct cmd_ctrl_node *cmd_array;
128*4882a593Smuzhiyun 	struct cmd_ctrl_node *cur_cmd;
129*4882a593Smuzhiyun 	struct list_head cmdfreeq;    /* free command buffers */
130*4882a593Smuzhiyun 	struct list_head cmdpendingq; /* pending command buffers */
131*4882a593Smuzhiyun 	struct timer_list command_timer;
132*4882a593Smuzhiyun 	int cmd_timed_out;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	/* Command responses sent from the hardware to the driver */
135*4882a593Smuzhiyun 	u8 resp_idx;
136*4882a593Smuzhiyun 	u8 resp_buf[2][LBS_UPLD_SIZE];
137*4882a593Smuzhiyun 	u32 resp_len[2];
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	/* Events sent from hardware to driver */
140*4882a593Smuzhiyun 	struct kfifo event_fifo;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	/* thread to service interrupts */
143*4882a593Smuzhiyun 	struct task_struct *main_thread;
144*4882a593Smuzhiyun 	wait_queue_head_t waitq;
145*4882a593Smuzhiyun 	struct workqueue_struct *work_thread;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	/* Encryption stuff */
148*4882a593Smuzhiyun 	u8 authtype_auto;
149*4882a593Smuzhiyun 	u8 wep_tx_key;
150*4882a593Smuzhiyun 	u8 wep_key[4][WLAN_KEY_LEN_WEP104];
151*4882a593Smuzhiyun 	u8 wep_key_len[4];
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	/* Wake On LAN */
154*4882a593Smuzhiyun 	uint32_t wol_criteria;
155*4882a593Smuzhiyun 	uint8_t wol_gpio;
156*4882a593Smuzhiyun 	uint8_t wol_gap;
157*4882a593Smuzhiyun 	bool ehs_remove_supported;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	/* Transmitting */
160*4882a593Smuzhiyun 	int tx_pending_len;		/* -1 while building packet */
161*4882a593Smuzhiyun 	u8 tx_pending_buf[LBS_UPLD_SIZE];
162*4882a593Smuzhiyun 	/* protected by hard_start_xmit serialization */
163*4882a593Smuzhiyun 	u8 txretrycount;
164*4882a593Smuzhiyun 	struct sk_buff *currenttxskb;
165*4882a593Smuzhiyun 	struct timer_list tx_lockup_timer;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	/* Locks */
168*4882a593Smuzhiyun 	struct mutex lock;
169*4882a593Smuzhiyun 	spinlock_t driver_lock;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	/* NIC/link operation characteristics */
172*4882a593Smuzhiyun 	u16 mac_control;
173*4882a593Smuzhiyun 	u8 radio_on;
174*4882a593Smuzhiyun 	u8 cur_rate;
175*4882a593Smuzhiyun 	u8 channel;
176*4882a593Smuzhiyun 	s16 txpower_cur;
177*4882a593Smuzhiyun 	s16 txpower_min;
178*4882a593Smuzhiyun 	s16 txpower_max;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	/* Scanning */
181*4882a593Smuzhiyun 	struct delayed_work scan_work;
182*4882a593Smuzhiyun 	int scan_channel;
183*4882a593Smuzhiyun 	/* Queue of things waiting for scan completion */
184*4882a593Smuzhiyun 	wait_queue_head_t scan_q;
185*4882a593Smuzhiyun 	/* Whether the scan was initiated internally and not by cfg80211 */
186*4882a593Smuzhiyun 	bool internal_scan;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	/* Firmware load */
189*4882a593Smuzhiyun 	u32 fw_model;
190*4882a593Smuzhiyun 	wait_queue_head_t fw_waitq;
191*4882a593Smuzhiyun 	struct device *fw_device;
192*4882a593Smuzhiyun 	const struct firmware *helper_fw;
193*4882a593Smuzhiyun 	const struct lbs_fw_table *fw_table;
194*4882a593Smuzhiyun 	const struct lbs_fw_table *fw_iter;
195*4882a593Smuzhiyun 	lbs_fw_cb fw_callback;
196*4882a593Smuzhiyun };
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun extern struct cmd_confirm_sleep confirm_sleep;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun /* Check if there is an interface active. */
lbs_iface_active(struct lbs_private * priv)201*4882a593Smuzhiyun static inline int lbs_iface_active(struct lbs_private *priv)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun 	int r;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	r = netif_running(priv->dev);
206*4882a593Smuzhiyun 	if (priv->mesh_dev)
207*4882a593Smuzhiyun 		r |= netif_running(priv->mesh_dev);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	return r;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun #endif
213