From: Viktor Barna <viktor.barna@xxxxxxxxxx> (Part of the split. Please, take a look at the cover letter for more details). Signed-off-by: Viktor Barna <viktor.barna@xxxxxxxxxx> --- drivers/net/wireless/celeno/cl8k/utils.h | 185 +++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 drivers/net/wireless/celeno/cl8k/utils.h diff --git a/drivers/net/wireless/celeno/cl8k/utils.h b/drivers/net/wireless/celeno/cl8k/utils.h new file mode 100644 index 000000000000..052687183dd3 --- /dev/null +++ b/drivers/net/wireless/celeno/cl8k/utils.h @@ -0,0 +1,185 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ +/* Copyright(c) 2019-2022, Celeno Communications Ltd. */ + +#ifndef CL_UTILS_H +#define CL_UTILS_H + +#include "def.h" +#include "ieee80211_i.h" +#include "chip.h" + +/* + * GI_LTF field for common info + * 0 - 1x HE-LTF + 1.6 us GI + * 1 - 2x HE-LTF + 1.6 us GI + * 2 - 4x HE-LTF + 3.2 us GI + */ +enum cl_he_ltf_gi { + HE_LTF_X1_GI_16, /* Not supported */ + HE_LTF_X2_GI_16, + HE_LTF_X4_GI_32, + + HE_LTF_MAX +}; + +#define CL_TF_GI_LTF_TO_GI(gi_ltf) \ + ((gi_ltf) == HE_LTF_X4_GI_32 ? WRS_GI_LONG : \ + ((gi_ltf) == HE_LTF_X2_GI_16 ? WRS_GI_SHORT : \ + ((gi_ltf) == HE_LTF_X1_GI_16 ? WRS_GI_SHORT : WRS_GI_LONG))) + +#define CL_TF_GI_TO_GI_LTF(gi) \ + ((gi) == WRS_GI_LONG ? HE_LTF_X4_GI_32 : \ + ((gi) == WRS_GI_SHORT ? HE_LTF_X2_GI_16 : \ + ((gi) == WRS_GI_VSHORT ? HE_LTF_X2_GI_16 : HE_LTF_X4_GI_32))) + +#define CL_TF_RU_ALLOC_MAX_TYPE_1 36 +#define CL_TF_RU_ALLOC_MAX_TYPE_2 52 +#define CL_TF_RU_ALLOC_MAX_TYPE_3 60 +#define CL_TF_RU_ALLOC_MAX_TYPE_4 64 +#define CL_TF_RU_ALLOC_MAX_TYPE_5 66 +#define CL_TF_RU_ALLOC_MAX_TYPE_6 67 +#define CL_TF_RU_ALLOC_MAX_TYPE_7 68 + +/* + *IEEE80211 G Rate provided by Hostapd in WLAN_EID_SUPP_RATES EID + *EID Rate = ieee802Rate/5 + */ +#define CL_80211G_RATE_6MB 12 +#define CL_80211G_RATE_9MB 18 +#define CL_80211G_RATE_12MB 24 +#define CL_80211G_RATE_18MB 36 +#define CL_80211G_RATE_24MB 48 +#define CL_80211G_RATE_36MB 72 +#define CL_80211G_RATE_48MB 96 +#define CL_80211G_RATE_54MB 108 + +#define CL_SUPP_RATE_MASK 0x7F + +#define BAND_IS_5G_6G(cl_hw) \ + (cl_band_is_5g(cl_hw) || cl_band_is_6g(cl_hw)) + +static const u8 tid_to_ac[] = { + AC_BE, AC_BK, AC_BK, AC_BE, AC_VI, AC_VI, AC_VO, AC_VO +}; + +static inline u16 cl_adc_to_mv(u16 adc) +{ + return (adc * 1800) >> 12; +} + +static inline struct ieee80211_vif *NETDEV_TO_VIF(struct net_device *dev) +{ + struct wireless_dev *wdev = dev->ieee80211_ptr; + + if (!wdev) + return NULL; + + return wdev_to_ieee80211_vif(wdev); +} + +static inline struct cl_hw *NETDEV_TO_CL_HW(struct net_device *dev) +{ + struct ieee80211_hw *hw = wdev_priv(dev->ieee80211_ptr); + + return hw->priv; +} + +static inline struct cl_vif *NETDEV_TO_CL_VIF(struct net_device *dev) +{ + struct ieee80211_vif *vif = NETDEV_TO_VIF(dev); + + WARN_ON(!vif); + + if (unlikely(vif->type == NL80211_IFTYPE_AP_VLAN)) { + struct cl_hw *cl_hw = NETDEV_TO_CL_HW(dev); + + return cl_vif_get_by_dev(cl_hw, dev); + } + + return (struct cl_vif *)vif->drv_priv; +} + +static inline struct cl_vif *TX_INFO_TO_CL_VIF(struct cl_hw *cl_hw, + struct ieee80211_tx_info *tx_info) +{ + struct ieee80211_vif *vif = tx_info->control.vif; + + WARN_ON(!vif); + + if (unlikely(vif->type == NL80211_IFTYPE_AP_VLAN)) + return cl_vif_get_by_mac(cl_hw, vif->addr); + + return (struct cl_vif *)(vif->drv_priv); +} + +void cl_hex_dump(char *caption, u8 *buffer, u32 length, u32 offset, bool is_byte); +u8 cl_convert_gi_format_wrs_to_fw(u8 wrs_mode, u8 gi); +u8 cl_convert_gi_format_fw_to_wrs(u8 format_mode, u8 gi); +u8 cl_map_gi_to_ltf(u8 mode, u8 gi); +s8 cl_calc_noise_floor(struct cl_hw *cl_hw, const s8 *reg_noise_floor); +u8 cl_convert_signed_to_reg_value(s8 val); +u8 cl_width_to_bw(enum nl80211_chan_width width); +u8 cl_center_freq_offset(u8 bw); +u8 cl_max_bw_idx(u8 wrs_mode, bool is_24g); +bool cl_hw_mode_is_b_or_bg(struct cl_hw *cl_hw); +bool cl_is_eapol(struct sk_buff *skb); +u8 cl_ru_alloc_to_ru_type(u8 ru_alloc); +bool cl_is_valid_g_rates(const u8 *rate_ie); +enum cl_wireless_mode cl_recalc_wireless_mode(struct cl_hw *cl_hw, + bool ieee80211n, + bool ieee80211ac, + bool ieee80211ax); + +enum cl_mu_ofdma_ru_type { + CL_MU_OFDMA_RU_TYPE_NONE = 0, + CL_MU_OFDMA_RU_TYPE_26, /* 2.5MHz */ + CL_MU_OFDMA_RU_TYPE_52, /* 5MHz */ + CL_MU_OFDMA_RU_TYPE_106, /* 10MHz */ + CL_MU_OFDMA_RU_TYPE_242, /* 20MHz */ + CL_MU_OFDMA_RU_TYPE_484, /* 40MHz */ + CL_MU_OFDMA_RU_TYPE_996, /* 80MHz */ + CL_MU_OFDMA_RU_TYPE_2x996, /* 160MHz */ + CL_MU_OFDMA_RU_TYPE_MAX +}; + +enum nl80211_he_ru_alloc cl_ru_type_to_nl80211_he_ru_alloc(enum cl_mu_ofdma_ru_type ru_type); +u8 cl_mu_ofdma_grp_convert_ru_type_to_bw(struct cl_hw *cl_hw, u8 ru_type); +void cl_ieee802_11_parse_elems(const u8 *ies, size_t ies_len, struct ieee802_11_elems *elems); + +/* + * cl_file_open_and_read - Read the whole file into an allocated buffer. + * + * Allocates a buffer large enough to hold the contents of file at @filename and reads the + * contents of that file into that buffer. Upon success, the address of the allocated buffer + * is returned (which needs to be free later). Upon failure, returns NULL. + */ +size_t cl_file_open_and_read(struct cl_chip *chip, const char *filename, + char **buf); + +/* Traffic analysis */ +/* Check if a packet has specific LLC fields e.g. DSAP, SSAP and Control */ +#define PKT_HAS_LLC_HDR(a) ((a[0] == 0xAA) && (a[1] == 0xAA) && (a[2] == 0x03)) + +/* Multiply by 4 because IHL is number of 32-bit words */ +#define IPV4_HDR_LEN(ihl) ((ihl) << 2) + +bool cl_set_network_header_if_proto(struct sk_buff *skb, u16 protocol); +bool cl_is_ipv4_packet(struct sk_buff *skb); +bool cl_is_ipv6_packet(struct sk_buff *skb); +bool cl_is_tcp_ack(struct sk_buff *skb, bool *syn_rst_push); + +/* Band helpers */ +bool cl_band_is_6g(struct cl_hw *cl_hw); +bool cl_band_is_5g(struct cl_hw *cl_hw); +bool cl_band_is_24g(struct cl_hw *cl_hw); +u8 cl_band_to_fw_idx(struct cl_hw *cl_hw); +u8 cl_band_from_fw_idx(u32 phy_band); + +static inline unsigned short cl_get_ether_type(int offset, unsigned char *src_buf) +{ + unsigned short type_len = *(unsigned short *)(src_buf + offset); + + return (unsigned short)be16_to_cpu(htons(type_len)); +} + +#endif /* CL_UTILS_H */ -- 2.36.1