bl_iot_sdk/components/bl602/bl602_wifidrv/bl60x_wifi_driver/bl_defs.h
2020-10-26 20:35:25 +08:00

352 lines
11 KiB
C

/*
* Copyright (c) 2020 Bouffalolab.
*
* This file is part of
* *** Bouffalolab Software Dev Kit ***
* (see www.bouffalolab.com).
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of Bouffalo Lab nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __RWNX_DEFS_H__
#define __RWNX_DEFS_H__
#include "errno.h"
#include "ipc_host.h"
#include "ipc_shared.h"
#include "bl_cmds.h"
#include "bl_mod_params.h"
#define ETH_ALEN 6
/**
****************************************************************************************
*
* @file bl_defs.h
* Copyright (C) Bouffalo Lab 2016-2018
*
****************************************************************************************
*/
#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
#include "ieee80211.h"
#include "cfg80211.h"
#include "nl80211.h"
//#define CONFIG_RWNX_DBG
#define RWNX_RXBUFF_MAX (4 * 1)
#define IEEE80211_MIN_AMPDU_BUF 0x8
#define IEEE80211_MAX_AMPDU_BUF 0x40
#define NX_VIRT_DEV_MAX 2
#define NX_REMOTE_STA_MAX CFG_STA_MAX
#define CONFIG_USER_MAX 1
#define cpu_to_le16(v16) (v16)
#define cpu_to_le32(v32) (v32)
#define le16_to_cpu(v16) (v16)
#define le32_to_cpu(v32) (v32)
#define RWNX_TX_LIFETIME_MS 100
#define IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT 2
#define RWNX_HWTXHDR_ALIGN_SZ 4
#define RWNX_HWTXHDR_ALIGN_MSK (RWNX_HWTXHDR_ALIGN_SZ - 1)
#define RWNX_HWTXHDR_ALIGN_PADS(x) \
((RWNX_HWTXHDR_ALIGN_SZ - ((x) & RWNX_HWTXHDR_ALIGN_MSK)) \
& RWNX_HWTXHDR_ALIGN_MSK)
#define REG_SW_SET_PROFILING(env, value) do{ }while(0)
#define REG_SW_CLEAR_PROFILING(env, value) do{ }while(0)
enum {
SW_PROF_HOSTBUF_IDX = 12,
/****** IPC IRQs related signals ******/
/* E2A direction */
SW_PROF_IRQ_E2A_RXDESC = 16, // to make sure we let 16 bits available for LMAC FW
SW_PROF_IRQ_E2A_TXCFM,
SW_PROF_IRQ_E2A_DBG,
SW_PROF_IRQ_E2A_MSG,
SW_PROF_IPC_MSGPUSH,
SW_PROF_MSGALLOC,
SW_PROF_MSGIND,
SW_PROF_DBGIND,
/* A2E direction */
SW_PROF_IRQ_A2E_TXCFM_BACK,
/****** Driver functions related signals ******/
SW_PROF_WAIT_QUEUE_STOP,
SW_PROF_WAIT_QUEUE_WAKEUP,
SW_PROF_RWNXDATAIND,
SW_PROF_RWNX_IPC_IRQ_HDLR,
SW_PROF_RWNX_IPC_THR_IRQ_HDLR,
SW_PROF_IEEE80211RX,
SW_PROF_RWNX_PATTERN,
SW_PROF_MAX
};
/*
* * Maximum length of AMPDU that the STA can receive.
* * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
* */
enum ieee80211_max_ampdu_length_exp {
IEEE80211_HT_MAX_AMPDU_8K = 0,
IEEE80211_HT_MAX_AMPDU_16K = 1,
IEEE80211_HT_MAX_AMPDU_32K = 2,
IEEE80211_HT_MAX_AMPDU_64K = 3
};
/* U-APSD queues for WMM IEs sent by STA */
#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO (1<<0)
#define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI (1<<1)
#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK (1<<2)
#define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE (1<<3)
#define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK 0x0f
/**
* enum ieee80211_vht_mcs_support - VHT MCS support definitions
* @IEEE80211_VHT_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the
* number of streams
* @IEEE80211_VHT_MCS_SUPPORT_0_8: MCSes 0-8 are supported
* @IEEE80211_VHT_MCS_SUPPORT_0_9: MCSes 0-9 are supported
* @IEEE80211_VHT_MCS_NOT_SUPPORTED: This number of streams isn't supported
*
* These definitions are used in each 2-bit subfield of the @rx_mcs_map
* and @tx_mcs_map fields of &struct ieee80211_vht_mcs_info, which are
* both split into 8 subfields by number of streams. These values indicate
* which MCSes are supported for the number of streams the value appears
* for.
*/
enum ieee80211_vht_mcs_support {
IEEE80211_VHT_MCS_SUPPORT_0_7 = 0,
IEEE80211_VHT_MCS_SUPPORT_0_8 = 1,
IEEE80211_VHT_MCS_SUPPORT_0_9 = 2,
IEEE80211_VHT_MCS_NOT_SUPPORTED = 3,
};
enum RWNX_INTERFACE_STATUS {
RWNX_INTERFACE_STATUS_DOWN = 0,
RWNX_INTERFACE_STATUS_UP = 1,
};
struct bl_stats {
int cfm_balance;
unsigned long last_rx, last_tx; /* jiffies */
int ampdus_tx[IEEE80211_MAX_AMPDU_BUF];
int ampdus_rx[IEEE80211_MAX_AMPDU_BUF];
int ampdus_rx_map[4];
int ampdus_rx_miss;
int amsdus_rx[64];
};
struct bl_patternbuf {
u32 *buf;
u32 dma_addr;
int bufsz;
};
struct bl_dbginfo {
os_mutex_t mutex;
struct dbg_debug_dump_tag *buf;
u32 dma_addr;
int bufsz;
};
struct net_device_stats {
unsigned long rx_packets;
unsigned long tx_packets;
unsigned long rx_bytes;
unsigned long tx_bytes;
unsigned long rx_errors;
unsigned long tx_errors;
unsigned long rx_dropped;
unsigned long tx_dropped;
unsigned long multicast;
unsigned long collisions;
unsigned long rx_length_errors;
unsigned long rx_over_errors;
unsigned long rx_crc_errors;
unsigned long rx_frame_errors;
unsigned long rx_fifo_errors;
unsigned long rx_missed_errors;
unsigned long tx_aborted_errors;
unsigned long tx_carrier_errors;
unsigned long tx_fifo_errors;
unsigned long tx_heartbeat_errors;
unsigned long tx_window_errors;
unsigned long rx_compressed;
unsigned long tx_compressed;
};
/*
* Structure used to save information relative to the managed stations.
*/
struct bl_sta {
struct mac_addr sta_addr;
u16 aid; /* association ID */
u8 is_used;
u8 sta_idx; /* Identifier of the station */
u8 vif_idx; /* Identifier of the VIF (fw id) the station
belongs to */
u8 vlan_idx; /* Identifier of the VLAN VIF (fw id) the station
belongs to (= vif_idx if no vlan in used) */
int8_t rssi;
uint32_t tsflo;
uint32_t tsfhi;
uint8_t data_rate;
};
/**
* struct bl_bcn - Information of the beacon in used (AP mode)
*
* @head: head portion of beacon (before TIM IE)
* @tail: tail portion of beacon (after TIM IE)
* @ies: extra IEs (not used ?)
* @head_len: length of head data
* @tail_len: length of tail data
* @ies_len: length of extra IEs data
* @tim_len: length of TIM IE
* @len: Total beacon len (head + tim + tail + extra)
* @dtim: dtim period
*/
struct bl_bcn {
u8 *head;
u8 *tail;
u8 *ies;
size_t head_len;
size_t tail_len;
size_t ies_len;
size_t tim_len;
size_t len;
u8 dtim;
};
/*
* Structure used to save information relative to the managed interfaces.
* This is also linked within the bl_hw vifs list.
*
*/
struct bl_vif {
struct list_head list;
struct netif *dev;
struct bl_hw *bl_hw;
struct net_device_stats net_stats;
u8 drv_vif_index; /* Identifier of the VIF in driver */
u8 vif_index; /* Identifier of the station in FW */
u8 ch_index; /* Channel context identifier */
bool up; /* Indicate if associated netdev is up
(i.e. Interface is created at fw level) */
bool use_4addr; /* Should we use 4addresses mode */
bool is_resending; /* Indicate if a frame is being resent on this interface */
bool user_mpm; /* In case of Mesh Point VIF, indicate if MPM is handled by userspace */
bool roc_tdls; /* Indicate if the ROC has been called by a
TDLS station */
u8 tdls_status; /* Status of the TDLS link */
union
{
struct
{
struct bl_sta *ap; /* Pointer to the peer STA entry allocated for
the AP */
struct bl_sta *tdls_sta; /* Pointer to the TDLS station */
} sta;
struct
{
u16 flags; /* see bl_ap_flags */
struct list_head sta_list; /* List of STA connected to the AP */
struct bl_bcn bcn; /* beacon */
u8 bcmc_index; /* Index of the BCMC sta to use */
struct list_head mpath_list; /* List of Mesh Paths used on this interface */
struct list_head proxy_list; /* List of Proxies Information used on this interface */
bool create_path; /* Indicate if we are waiting for a MESH_CREATE_PATH_CFM
message */
int generation; /* Increased each time the list of Mesh Paths is updated */
} ap;
struct
{
struct bl_vif *master; /* pointer on master interface */
struct bl_sta *sta_4a;
} ap_vlan;
};
};
struct bl_hw {
int is_up;
struct bl_cmd_mgr cmd_mgr;
struct ipc_host_env_tag *ipc_env; /* store the IPC environment */
struct bl_stats stats;
struct list_head vifs;
struct bl_vif vif_table[NX_VIRT_DEV_MAX + NX_REMOTE_STA_MAX]; /* indexed with fw id */
struct bl_sta sta_table[NX_REMOTE_STA_MAX + NX_VIRT_DEV_MAX];
unsigned long drv_flags;
struct mm_version_cfm version_cfm; /* Lower layers versions - obtained via MM_VERSION_REQ */
struct bl_mod_params *mod_params;
enum wiphy_flags flags;
struct ieee80211_sta_ht_cap ht_cap;
u8 vif_started;
int vif_index_sta;
int vif_index_ap;
/*custom added id*/
int sta_idx;
int ap_bcmc_idx;
struct phy_cfg_tag phy_config;
enum RWNX_INTERFACE_STATUS status;
};
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
__be16 h_proto; /* packet type ID field */
} __attribute__((packed));
/// Definitions of the RF bands
enum
{
/// 2.4GHz Band
PHY_BAND_2G4,
/// 5GHz band
PHY_BAND_5G,
/// Number of bands
PHY_BAND_MAX,
};
/// Definitions of the channel bandwidths
enum
{
/// 20MHz BW
PHY_CHNL_BW_20,
/// 40MHz BW
PHY_CHNL_BW_40,
/// 80MHz BW
PHY_CHNL_BW_80,
/// 160MHz BW
PHY_CHNL_BW_160,
/// 80+80MHz BW
PHY_CHNL_BW_80P80,
/// Reserved BW
PHY_CHNL_BW_OTHER,
};
#endif