linux/drivers/net/wireless/microchip/wilc1000/netdev.h
<<
>>
Prefs
   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_NETDEV_H
   8#define WILC_NETDEV_H
   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 "hif.h"
  18#include "wlan.h"
  19#include "wlan_cfg.h"
  20
  21#define FLOW_CONTROL_LOWER_THRESHOLD            128
  22#define FLOW_CONTROL_UPPER_THRESHOLD            256
  23
  24#define PMKID_FOUND                             1
  25#define NUM_STA_ASSOCIATED                      8
  26
  27#define TCP_ACK_FILTER_LINK_SPEED_THRESH        54
  28#define DEFAULT_LINK_SPEED                      72
  29
  30struct wilc_wfi_stats {
  31        unsigned long rx_packets;
  32        unsigned long tx_packets;
  33        unsigned long rx_bytes;
  34        unsigned long tx_bytes;
  35        u64 rx_time;
  36        u64 tx_time;
  37
  38};
  39
  40struct wilc_wfi_key {
  41        u8 *key;
  42        u8 *seq;
  43        int key_len;
  44        int seq_len;
  45        u32 cipher;
  46};
  47
  48struct wilc_wfi_wep_key {
  49        u8 *key;
  50        u8 key_len;
  51        u8 key_idx;
  52};
  53
  54struct sta_info {
  55        u8 sta_associated_bss[WILC_MAX_NUM_STA][ETH_ALEN];
  56};
  57
  58/* Parameters needed for host interface for remaining on channel */
  59struct wilc_wfi_p2p_listen_params {
  60        struct ieee80211_channel *listen_ch;
  61        u32 listen_duration;
  62        u64 listen_cookie;
  63};
  64
  65static const u32 wilc_cipher_suites[] = {
  66        WLAN_CIPHER_SUITE_WEP40,
  67        WLAN_CIPHER_SUITE_WEP104,
  68        WLAN_CIPHER_SUITE_TKIP,
  69        WLAN_CIPHER_SUITE_CCMP,
  70        WLAN_CIPHER_SUITE_AES_CMAC
  71};
  72
  73#define CHAN2G(_channel, _freq, _flags) {        \
  74        .band             = NL80211_BAND_2GHZ, \
  75        .center_freq      = (_freq),             \
  76        .hw_value         = (_channel),          \
  77        .flags            = (_flags),            \
  78        .max_antenna_gain = 0,                   \
  79        .max_power        = 30,                  \
  80}
  81
  82static const struct ieee80211_channel wilc_2ghz_channels[] = {
  83        CHAN2G(1,  2412, 0),
  84        CHAN2G(2,  2417, 0),
  85        CHAN2G(3,  2422, 0),
  86        CHAN2G(4,  2427, 0),
  87        CHAN2G(5,  2432, 0),
  88        CHAN2G(6,  2437, 0),
  89        CHAN2G(7,  2442, 0),
  90        CHAN2G(8,  2447, 0),
  91        CHAN2G(9,  2452, 0),
  92        CHAN2G(10, 2457, 0),
  93        CHAN2G(11, 2462, 0),
  94        CHAN2G(12, 2467, 0),
  95        CHAN2G(13, 2472, 0),
  96        CHAN2G(14, 2484, 0)
  97};
  98
  99#define RATETAB_ENT(_rate, _hw_value, _flags) { \
 100        .bitrate  = (_rate),                    \
 101        .hw_value = (_hw_value),                \
 102        .flags    = (_flags),                   \
 103}
 104
 105static struct ieee80211_rate wilc_bitrates[] = {
 106        RATETAB_ENT(10,  0,  0),
 107        RATETAB_ENT(20,  1,  0),
 108        RATETAB_ENT(55,  2,  0),
 109        RATETAB_ENT(110, 3,  0),
 110        RATETAB_ENT(60,  9,  0),
 111        RATETAB_ENT(90,  6,  0),
 112        RATETAB_ENT(120, 7,  0),
 113        RATETAB_ENT(180, 8,  0),
 114        RATETAB_ENT(240, 9,  0),
 115        RATETAB_ENT(360, 10, 0),
 116        RATETAB_ENT(480, 11, 0),
 117        RATETAB_ENT(540, 12, 0)
 118};
 119
 120struct wilc_priv {
 121        struct wireless_dev wdev;
 122        struct cfg80211_scan_request *scan_req;
 123
 124        struct wilc_wfi_p2p_listen_params remain_on_ch_params;
 125        u64 tx_cookie;
 126
 127        bool cfg_scanning;
 128
 129        u8 associated_bss[ETH_ALEN];
 130        struct sta_info assoc_stainfo;
 131        struct sk_buff *skb;
 132        struct net_device *dev;
 133        struct host_if_drv *hif_drv;
 134        struct wilc_pmkid_attr pmkid_list;
 135        u8 wep_key[4][WLAN_KEY_LEN_WEP104];
 136        u8 wep_key_len[4];
 137
 138        /* The real interface that the monitor is on */
 139        struct net_device *real_ndev;
 140        struct wilc_wfi_key *wilc_gtk[WILC_MAX_NUM_STA];
 141        struct wilc_wfi_key *wilc_ptk[WILC_MAX_NUM_STA];
 142        u8 wilc_groupkey;
 143
 144        /* mutexes */
 145        struct mutex scan_req_lock;
 146        bool p2p_listen_state;
 147        int scanned_cnt;
 148
 149        u64 inc_roc_cookie;
 150};
 151
 152#define MAX_TCP_SESSION                25
 153#define MAX_PENDING_ACKS               256
 154
 155struct ack_session_info {
 156        u32 seq_num;
 157        u32 bigger_ack_num;
 158        u16 src_port;
 159        u16 dst_port;
 160        u16 status;
 161};
 162
 163struct pending_acks {
 164        u32 ack_num;
 165        u32 session_index;
 166        struct txq_entry_t  *txqe;
 167};
 168
 169struct tcp_ack_filter {
 170        struct ack_session_info ack_session_info[2 * MAX_TCP_SESSION];
 171        struct pending_acks pending_acks[MAX_PENDING_ACKS];
 172        u32 pending_base;
 173        u32 tcp_session;
 174        u32 pending_acks_idx;
 175        bool enabled;
 176};
 177
 178struct wilc_vif {
 179        u8 idx;
 180        u8 iftype;
 181        int monitor_flag;
 182        int mac_opened;
 183        u32 mgmt_reg_stypes;
 184        struct net_device_stats netstats;
 185        struct wilc *wilc;
 186        u8 bssid[ETH_ALEN];
 187        struct host_if_drv *hif_drv;
 188        struct net_device *ndev;
 189        u8 mode;
 190        struct timer_list during_ip_timer;
 191        struct timer_list periodic_rssi;
 192        struct rf_info periodic_stat;
 193        struct tcp_ack_filter ack_filter;
 194        bool connecting;
 195        struct wilc_priv priv;
 196        struct list_head list;
 197        struct cfg80211_bss *bss;
 198};
 199
 200struct wilc_tx_queue_status {
 201        u8 buffer[AC_BUFFER_SIZE];
 202        u16 end_index;
 203        u16 cnt[NQUEUES];
 204        u16 sum;
 205        bool initialized;
 206};
 207
 208struct wilc {
 209        struct wiphy *wiphy;
 210        const struct wilc_hif_func *hif_func;
 211        int io_type;
 212        s8 mac_status;
 213        struct clk *rtc_clk;
 214        bool initialized;
 215        int dev_irq_num;
 216        int close;
 217        u8 vif_num;
 218        struct list_head vif_list;
 219
 220        /* protect vif list */
 221        struct mutex vif_mutex;
 222        struct srcu_struct srcu;
 223        u8 open_ifcs;
 224
 225        /* protect head of transmit queue */
 226        struct mutex txq_add_to_head_cs;
 227
 228        /* protect txq_entry_t transmit queue */
 229        spinlock_t txq_spinlock;
 230
 231        /* protect rxq_entry_t receiver queue */
 232        struct mutex rxq_cs;
 233
 234        /* lock to protect hif access */
 235        struct mutex hif_cs;
 236
 237        struct completion cfg_event;
 238        struct completion sync_event;
 239        struct completion txq_event;
 240        struct completion txq_thread_started;
 241
 242        struct task_struct *txq_thread;
 243
 244        int quit;
 245
 246        /* lock to protect issue of wid command to firmware */
 247        struct mutex cfg_cmd_lock;
 248        struct wilc_cfg_frame cfg_frame;
 249        u32 cfg_frame_offset;
 250        u8 cfg_seq_no;
 251
 252        u8 *rx_buffer;
 253        u32 rx_buffer_offset;
 254        u8 *tx_buffer;
 255
 256        struct txq_handle txq[NQUEUES];
 257        int txq_entries;
 258
 259        struct wilc_tx_queue_status tx_q_limit;
 260        struct rxq_entry_t rxq_head;
 261
 262        const struct firmware *firmware;
 263
 264        struct device *dev;
 265        bool suspend_event;
 266
 267        struct workqueue_struct *hif_workqueue;
 268        struct wilc_cfg cfg;
 269        void *bus_data;
 270        struct net_device *monitor_dev;
 271
 272        /* deinit lock */
 273        struct mutex deinit_lock;
 274        u8 sta_ch;
 275        u8 op_ch;
 276        struct ieee80211_channel channels[ARRAY_SIZE(wilc_2ghz_channels)];
 277        struct ieee80211_rate bitrates[ARRAY_SIZE(wilc_bitrates)];
 278        struct ieee80211_supported_band band;
 279        u32 cipher_suites[ARRAY_SIZE(wilc_cipher_suites)];
 280};
 281
 282struct wilc_wfi_mon_priv {
 283        struct net_device *real_ndev;
 284};
 285
 286void wilc_frmw_to_host(struct wilc *wilc, u8 *buff, u32 size, u32 pkt_offset);
 287void wilc_mac_indicate(struct wilc *wilc);
 288void wilc_netdev_cleanup(struct wilc *wilc);
 289void wilc_wfi_mgmt_rx(struct wilc *wilc, u8 *buff, u32 size);
 290void wilc_wlan_set_bssid(struct net_device *wilc_netdev, const u8 *bssid,
 291                         u8 mode);
 292struct wilc_vif *wilc_netdev_ifc_init(struct wilc *wl, const char *name,
 293                                      int vif_type, enum nl80211_iftype type,
 294                                      bool rtnl_locked);
 295#endif
 296