GNU Linux-libre 4.19.268-gnu1
[releases.git] / drivers / staging / wilc1000 / wilc_wfi_netdevice.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
4  * All rights reserved.
5  */
6
7 #ifndef WILC_WFI_NETDEVICE
8 #define WILC_WFI_NETDEVICE
9
10 #include <linux/tcp.h>
11 #include <linux/ieee80211.h>
12 #include <net/cfg80211.h>
13 #include <net/ieee80211_radiotap.h>
14 #include <linux/if_arp.h>
15 #include <linux/gpio/consumer.h>
16
17 #include "host_interface.h"
18 #include "wilc_wlan.h"
19
20 #define FLOW_CONTROL_LOWER_THRESHOLD            128
21 #define FLOW_CONTROL_UPPER_THRESHOLD            256
22
23 #define WILC_MAX_NUM_PMKIDS                     16
24 #define PMKID_LEN                               16
25 #define PMKID_FOUND                             1
26 #define NUM_STA_ASSOCIATED                      8
27
28 #define NUM_REG_FRAME                           2
29
30 #define TCP_ACK_FILTER_LINK_SPEED_THRESH        54
31 #define DEFAULT_LINK_SPEED                      72
32
33 #define GET_PKT_OFFSET(a) (((a) >> 22) & 0x1ff)
34
35 struct wilc_wfi_stats {
36         unsigned long rx_packets;
37         unsigned long tx_packets;
38         unsigned long rx_bytes;
39         unsigned long tx_bytes;
40         u64 rx_time;
41         u64 tx_time;
42
43 };
44
45 struct wilc_wfi_key {
46         u8 *key;
47         u8 *seq;
48         int key_len;
49         int seq_len;
50         u32 cipher;
51 };
52
53 struct wilc_wfi_wep_key {
54         u8 *key;
55         u8 key_len;
56         u8 key_idx;
57 };
58
59 struct sta_info {
60         u8 sta_associated_bss[MAX_NUM_STA][ETH_ALEN];
61 };
62
63 /*Parameters needed for host interface for  remaining on channel*/
64 struct wilc_wfi_p2p_listen_params {
65         struct ieee80211_channel *listen_ch;
66         u32 listen_duration;
67         u64 listen_cookie;
68         u32 listen_session_id;
69 };
70
71 struct wilc_priv {
72         struct wireless_dev *wdev;
73         struct cfg80211_scan_request *scan_req;
74
75         struct wilc_wfi_p2p_listen_params remain_on_ch_params;
76         u64 tx_cookie;
77
78         bool cfg_scanning;
79         u32 rcvd_ch_cnt;
80
81         u8 associated_bss[ETH_ALEN];
82         struct sta_info assoc_stainfo;
83         struct sk_buff *skb;
84         struct net_device *dev;
85         struct host_if_drv *hif_drv;
86         struct host_if_pmkid_attr pmkid_list;
87         u8 wep_key[4][WLAN_KEY_LEN_WEP104];
88         u8 wep_key_len[4];
89         /* The real interface that the monitor is on */
90         struct net_device *real_ndev;
91         struct wilc_wfi_key *wilc_gtk[MAX_NUM_STA];
92         struct wilc_wfi_key *wilc_ptk[MAX_NUM_STA];
93         u8 wilc_groupkey;
94         /* mutexes */
95         struct mutex scan_req_lock;
96         bool p2p_listen_state;
97
98 };
99
100 struct frame_reg {
101         u16 type;
102         bool reg;
103 };
104
105 struct wilc_vif {
106         u8 idx;
107         u8 iftype;
108         int monitor_flag;
109         int mac_opened;
110         struct frame_reg frame_reg[NUM_REG_FRAME];
111         struct net_device_stats netstats;
112         struct wilc *wilc;
113         u8 src_addr[ETH_ALEN];
114         u8 bssid[ETH_ALEN];
115         struct host_if_drv *hif_drv;
116         struct net_device *ndev;
117         u8 mode;
118         u8 ifc_id;
119 };
120
121 struct wilc {
122         const struct wilc_hif_func *hif_func;
123         int io_type;
124         int mac_status;
125         struct gpio_desc *gpio_irq;
126         bool initialized;
127         int dev_irq_num;
128         int close;
129         u8 vif_num;
130         struct wilc_vif *vif[NUM_CONCURRENT_IFC];
131         u8 open_ifcs;
132         /*protect head of transmit queue*/
133         struct mutex txq_add_to_head_cs;
134         /*protect txq_entry_t transmit queue*/
135         spinlock_t txq_spinlock;
136         /*protect rxq_entry_t receiver queue*/
137         struct mutex rxq_cs;
138         /* lock to protect hif access */
139         struct mutex hif_cs;
140
141         struct completion cfg_event;
142         struct completion sync_event;
143         struct completion txq_event;
144         struct completion txq_thread_started;
145
146         struct task_struct *txq_thread;
147
148         int quit;
149         int cfg_frame_in_use;
150         struct wilc_cfg_frame cfg_frame;
151         u32 cfg_frame_offset;
152         int cfg_seq_no;
153
154         u8 *rx_buffer;
155         u32 rx_buffer_offset;
156         u8 *tx_buffer;
157
158         struct txq_entry_t txq_head;
159         int txq_entries;
160
161         struct rxq_entry_t rxq_head;
162
163         const struct firmware *firmware;
164
165         struct device *dev;
166         bool suspend_event;
167
168         struct rf_info dummy_statistics;
169 };
170
171 struct wilc_wfi_mon_priv {
172         struct net_device *real_ndev;
173 };
174
175 void wilc_frmw_to_linux(struct wilc *wilc, u8 *buff, u32 size, u32 pkt_offset);
176 void wilc_mac_indicate(struct wilc *wilc);
177 void wilc_netdev_cleanup(struct wilc *wilc);
178 int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type,
179                      const struct wilc_hif_func *ops);
180 void wilc_wfi_mgmt_rx(struct wilc *wilc, u8 *buff, u32 size);
181 int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *bssid, u8 mode);
182
183 #endif