From: Michael Nemanov <Michael.Nemanov@ti.com>
These are header files with definitions common to the entire driver.
Signed-off-by: Michael Nemanov <michael.nemanov@ti.com>
---
drivers/net/wireless/ti/cc33xx/cc33xx.h | 481 ++++++++++++++++++++++
drivers/net/wireless/ti/cc33xx/cc33xx_i.h | 459 +++++++++++++++++++++
2 files changed, 940 insertions(+)
create mode 100644 drivers/net/wireless/ti/cc33xx/cc33xx.h
create mode 100644 drivers/net/wireless/ti/cc33xx/cc33xx_i.h
diff --git a/drivers/net/wireless/ti/cc33xx/cc33xx.h b/drivers/net/wireless/ti/cc33xx/cc33xx.h
new file mode 100644
index 000000000000..3a2e56af4da7
--- /dev/null
+++ b/drivers/net/wireless/ti/cc33xx/cc33xx.h
@@ -0,0 +1,481 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright (C) 2022-2024 Texas Instruments Incorporated - https://www.ti.com/
+ */
+
+#ifndef __CC33XX_H__
+#define __CC33XX_H__
+
+#include "cc33xx_i.h"
+#include "rx.h"
+
+/* Wireless Driver Version */
+#define DRV_VERSION "1.7.0.108"
+
+/* The maximum number of Tx descriptors in all chip families */
+#define CC33XX_MAX_TX_DESCRIPTORS 32
+
+#define CC33XX_CMD_MAX_SIZE (896)
+#define CC33XX_INI_PARAM_COMMAND_SIZE (16UL)
+#define CC33XX_INI_CMD_MAX_SIZE (CC33X_CONF_SIZE + CC33XX_INI_PARAM_COMMAND_SIZE + sizeof(int))
+
+#define CC33XX_CMD_BUFFER_SIZE ((CC33XX_INI_CMD_MAX_SIZE > CC33XX_CMD_MAX_SIZE)\
+ ? CC33XX_INI_CMD_MAX_SIZE : CC33XX_CMD_MAX_SIZE)
+
+#define CC33XX_NUM_MAC_ADDRESSES 3
+
+#define CC33XX_AGGR_BUFFER_SIZE (8 * PAGE_SIZE)
+
+#define CC33XX_NUM_TX_DESCRIPTORS 32
+#define CC33XX_NUM_RX_DESCRIPTORS 32
+
+#define CC33XX_RX_BA_MAX_SESSIONS 13
+
+#define CC33XX_MAX_AP_STATIONS 16
+
+struct cc33xx_tx_hw_descr;
+struct cc33xx_rx_descriptor;
+struct partial_rx_frame;
+struct core_fw_status;
+struct core_status;
+
+enum wl_rx_buf_align;
+
+struct driver_fw_versions {
+ const char *driver_ver;
+ struct cc33xx_acx_fw_versions *fw_ver;
+};
+
+struct cc33xx_stats {
+ void *fw_stats;
+ unsigned long fw_stats_update;
+ unsigned int retry_count;
+ unsigned int excessive_retries;
+};
+
+struct cc33xx_ant_diversity {
+ u8 diversity_enable;
+ s8 rssi_threshold;
+ u8 default_antenna;
+ u8 padding;
+};
+
+struct cc33xx {
+ bool initialized;
+ struct ieee80211_hw *hw;
+ bool mac80211_registered;
+
+ struct device *dev;
+ struct platform_device *pdev;
+
+ struct cc33xx_if_operations *if_ops;
+
+ int wakeirq;
+
+ spinlock_t cc_lock; /* Protects critical sections */
+
+ enum cc33xx_state state;
+ bool plt;
+ enum plt_mode plt_mode;
+ u8 plt_role_id;
+ u8 fem_manuf;
+ u8 last_vif_count;
+ struct mutex mutex; /* Protect all CC33xx operations */
+ struct core_status *core_status;
+ u8 last_fw_rls_idx;
+ u8 command_result[CC33XX_CMD_MAX_SIZE];
+ u16 result_length;
+ struct partial_rx_frame partial_rx;
+
+ unsigned long flags;
+
+ void *nvs_mac_addr;
+ size_t nvs_mac_addr_len;
+ struct cc33xx_fw_download *fw_download;
+
+ struct mac_address addresses[CC33XX_NUM_MAC_ADDRESSES];
+
+ unsigned long links_map[BITS_TO_LONGS(CC33XX_MAX_LINKS)];
+ unsigned long roles_map[BITS_TO_LONGS(CC33XX_MAX_ROLES)];
+ unsigned long roc_map[BITS_TO_LONGS(CC33XX_MAX_ROLES)];
+ unsigned long rate_policies_map[BITS_TO_LONGS(CC33XX_MAX_RATE_POLICIES)];
+
+ u8 session_ids[CC33XX_MAX_LINKS];
+
+ struct list_head wlvif_list;
+
+ u8 sta_count;
+ u8 ap_count;
+
+ struct cc33xx_acx_mem_map *target_mem_map;
+
+ /* Accounting for allocated / available TX blocks on HW */
+
+ u32 tx_blocks_available;
+ u32 tx_allocated_blocks;
+
+ /* Accounting for allocated / available Tx packets in HW */
+
+ u32 tx_allocated_pkts[NUM_TX_QUEUES];
+
+ /* Time-offset between host and chipset clocks */
+
+ /* Frames scheduled for transmission, not handled yet */
+ int tx_queue_count[NUM_TX_QUEUES];
+ unsigned long queue_stop_reasons[NUM_TX_QUEUES * CC33XX_NUM_MAC_ADDRESSES];
+
+ /* Frames received, not handled yet by mac80211 */
+ struct sk_buff_head deferred_rx_queue;
+
+ /* Frames sent, not returned yet to mac80211 */
+ struct sk_buff_head deferred_tx_queue;
+
+ struct work_struct tx_work;
+ struct workqueue_struct *freezable_wq;
+
+ /*freezable wq for netstack_work*/
+ struct workqueue_struct *freezable_netstack_wq;
+
+ /* Pending TX frames */
+ unsigned long tx_frames_map[BITS_TO_LONGS(CC33XX_MAX_TX_DESCRIPTORS)];
+ struct sk_buff *tx_frames[CC33XX_MAX_TX_DESCRIPTORS];
+ int tx_frames_cnt;
+
+ /* FW Rx counter */
+ u32 rx_counter;
+
+ /* Intermediate buffer, used for packet aggregation */
+ u8 *aggr_buf;
+ u32 aggr_buf_size;
+ size_t max_transaction_len;
+
+ /* Reusable dummy packet template */
+ struct sk_buff *dummy_packet;
+
+ /* Network stack work */
+ struct work_struct netstack_work;
+ /* FW log buffer */
+ u8 *fwlog;
+
+ /* Number of valid bytes in the FW log buffer */
+ ssize_t fwlog_size;
+
+ /* Hardware recovery work */
+ struct work_struct recovery_work;
+
+ struct work_struct irq_deferred_work;
+
+ /* Reg domain last configuration */
+ DECLARE_BITMAP(reg_ch_conf_last, 64);
+ /* Reg domain pending configuration */
+ DECLARE_BITMAP(reg_ch_conf_pending, 64);
+
+ /* Lock-less list for deferred event handling */
+ struct llist_head event_list;
+ /* The mbox event mask */
+ u32 event_mask;
+ /* events to unmask only when ap interface is up */
+ u32 ap_event_mask;
+
+ /* Are we currently scanning */
+ struct cc33xx_vif *scan_wlvif;
+ struct cc33xx_scan scan;
+ struct delayed_work scan_complete_work;
+
+ struct ieee80211_vif *roc_vif;
+ struct delayed_work roc_complete_work;
+
+ struct cc33xx_vif *sched_vif;
+
+ u8 mac80211_scan_stopped;
+
+ /* The current band */
+ enum nl80211_band band;
+
+ /* in dBm */
+ int power_level;
+
+ struct cc33xx_stats stats;
+
+ __le32 *buffer_32;
+
+ /* Current chipset configuration */
+ struct cc33xx_conf_file conf;
+
+ bool enable_11a;
+
+ /* bands supported by this instance of cc33xx */
+ struct ieee80211_supported_band bands[CC33XX_NUM_BANDS];
+
+ /* wowlan trigger was configured during suspend.
+ * (currently, only "ANY" and "PATTERN" trigger is supported)
+ */
+
+ bool keep_device_power;
+
+ /* AP-mode - links indexed by HLID. The global and broadcast links
+ * are always active.
+ */
+ struct cc33xx_link links[CC33XX_MAX_LINKS];
+
+ /* number of currently active links */
+ int active_link_count;
+
+ /* AP-mode - a bitmap of links currently in PS mode according to FW */
+ unsigned long ap_fw_ps_map;
+
+ /* AP-mode - a bitmap of links currently in PS mode in mac80211 */
+ unsigned long ap_ps_map;
+
+ /* Quirks of specific hardware revisions */
+ unsigned int quirks;
+
+ /* number of currently active RX BA sessions */
+ int ba_rx_session_count;
+
+ /* AP-mode - number of currently connected stations */
+ int active_sta_count;
+
+ /* last wlvif we transmitted from */
+ struct cc33xx_vif *last_wlvif;
+
+ /* work to fire when Tx is stuck */
+ struct delayed_work tx_watchdog_work;
+
+ /* HW HT (11n) capabilities */
+ struct ieee80211_sta_ht_cap ht_cap[CC33XX_NUM_BANDS];
+
+ /* the current dfs region */
+ enum nl80211_dfs_regions dfs_region;
+ bool radar_debug_mode;
+
+ /* RX Data filter rule state - enabled/disabled */
+ /* used in CONFIG PM AND W8 Code */
+ unsigned long rx_filter_enabled[BITS_TO_LONGS(CC33XX_MAX_RX_FILTERS)];
+
+ /* mutex for protecting the tx_flush function */
+ struct mutex flush_mutex;
+
+ /* sleep auth value currently configured to FW */
+ int sleep_auth;
+
+ /*ble_enable value - 1=enabled, 0=disabled. */
+ int ble_enable;
+
+ /* parameters for joining a TWT agreement */
+ int min_wake_duration_usec;
+ int min_wake_interval_mantissa;
+ int min_wake_interval_exponent;
+ int max_wake_interval_mantissa;
+ int max_wake_interval_exponent;
+
+ /* the number of allocated MAC addresses in this chip */
+ int num_mac_addr;
+
+ /* sta role index - if 0 - wlan0 primary station interface,
+ * if 1 - wlan2 - secondary station interface
+ */
+ u8 sta_role_idx;
+
+ u16 max_cmd_size;
+
+ struct completion nvs_loading_complete;
+ struct completion command_complete;
+
+ /* dynamic fw traces */
+ u32 dynamic_fw_traces;
+
+ /* buffer for sending commands to FW */
+ u8 cmd_buf[CC33XX_CMD_BUFFER_SIZE];
+
+ /* number of keys requiring extra spare mem-blocks */
+ int extra_spare_key_count;
+
+ u8 efuse_mac_address[ETH_ALEN];
+
+ u32 fuse_rom_structure_version;
+ u32 device_part_number;
+ u32 pg_version;
+ u8 disable_5g;
+ u8 disable_6g;
+
+ struct driver_fw_versions all_versions;
+
+ u8 antenna_selection;
+
+ /* burst mode cfg */
+ u8 burst_disable;
+
+ struct cc33xx_ant_diversity diversity;
+};
+
+void cc33xx_update_inconn_sta(struct cc33xx *cc, struct cc33xx_vif *wlvif,
+ struct cc33xx_station *wl_sta, bool in_conn);
+
+void cc33xx_irq(void *cookie);
+
+/* Quirks */
+
+/* the first start_role(sta) sometimes doesn't work on wl12xx */
+#define CC33XX_QUIRK_START_STA_FAILS BIT(1)
+
+/* wl127x and SPI don't support SDIO block size alignment */
+#define CC33XX_QUIRK_TX_BLOCKSIZE_ALIGN BIT(2)
+
+/* means aggregated Rx packets are aligned to a SDIO block */
+#define CC33XX_QUIRK_RX_BLOCKSIZE_ALIGN BIT(3)
+
+/* pad only the last frame in the aggregate buffer */
+#define CC33XX_QUIRK_TX_PAD_LAST_FRAME BIT(7)
+
+/* extra header space is required for TKIP */
+#define CC33XX_QUIRK_TKIP_HEADER_SPACE BIT(8)
+
+/* Some firmwares not support sched scans while connected */
+#define CC33XX_QUIRK_NO_SCHED_SCAN_WHILE_CONN BIT(9)
+
+/* separate probe response templates for one-shot and sched scans */
+#define CC33XX_QUIRK_DUAL_PROBE_TMPL BIT(10)
+
+/* Firmware requires reg domain configuration for active calibration */
+#define CC33XX_QUIRK_REGDOMAIN_CONF BIT(11)
+
+/* The FW only support a zero session id for AP */
+#define CC33XX_QUIRK_AP_ZERO_SESSION_ID BIT(12)
+
+/* TODO: move all these common registers and values elsewhere */
+#define HW_ACCESS_ELP_CTRL_REG 0x1FFFC
+
+enum CC33xx_FRAME_FORMAT {
+ CC33xx_B_SHORT = 0,
+ CC33xx_B_LONG,
+ CC33xx_LEGACY_OFDM,
+ CC33xx_HT_MF,
+ CC33xx_HT_GF,
+ CC33xx_HE_SU,
+ CC33xx_HE_MU,
+ CC33xx_HE_SU_ER,
+ CC33xx_HE_TB,
+ CC33xx_HE_TB_NDP_FB,
+ CC33xx_VHT
+};
+
+/* CC33xx HW Common Definitions */
+
+#define HOST_SYNC_PATTERN 0x5C5C5C5C
+#define DEVICE_SYNC_PATTERN 0xABCDDCBA
+#define NAB_DATA_ADDR 0x0000BFF0
+#define NAB_CONTROL_ADDR 0x0000BFF8
+#define NAB_STATUS_ADDR 0x0000BFFC
+
+#define NAB_SEND_CMD 0x940d
+#define NAB_SEND_FLAGS 0x08
+#define CC33xx_INTERNAL_DESC_SIZE 200
+#define NAB_EXTRA_BYTES 4
+
+#define TX_RESULT_QUEUE_SIZE 108
+
+struct control_info_descriptor {
+ __le16 type_and_length;
+};
+
+enum control_message_type {
+ CTRL_MSG_NONE = 0,
+ CTRL_MSG_EVENT = 1,
+ CTRL_MSG_COMMND_COMPLETE = 2
+};
+
+struct core_fw_status {
+ u8 tx_result_queue_index;
+ u8 reserved1[3];
+ u8 tx_result_queue[TX_RESULT_QUEUE_SIZE];
+
+ /* A bitmap (where each bit represents a single HLID)
+ * to indicate PS/Active mode of the link
+ */
+ __le32 link_ps_bitmap;
+
+ /* A bitmap (where each bit represents a single HLID)
+ * to indicate if the station is in Fast mode
+ */
+ __le32 link_fast_bitmap;
+
+ /* A bitmap (where each bit represents a single HLID)
+ * to indicate if a links is suspended/aboout to be suspended
+ */
+ __le32 link_suspend_bitmap;
+
+ /* Host TX Flow Control descriptor per AC threshold */
+ u8 tx_flow_control_ac_threshold;
+
+ /* Host TX Flow Control descriptor PS link threshold */
+ u8 tx_ps_threshold;
+
+ /* Host TX Flow Control descriptor Suspended link threshold */
+ u8 tx_suspend_threshold;
+
+ /* Host TX Flow Control descriptor Slow link threshold */
+ u8 tx_slow_link_prio_threshold;
+
+ /* Host TX Flow Control descriptor Fast link threshold */
+ u8 tx_fast_link_prio_threshold;
+
+ /* Host TX Flow Control descriptor Stop Slow link threshold */
+ u8 tx_slow_stop_threshold;
+
+ /* Host TX Flow Control descriptor Stop Fast link threshold */
+ u8 tx_fast_stop_threshold;
+
+ u8 reserved2;
+ /* Additional information can be added here */
+} __packed;
+
+struct core_status {
+ __le32 block_pad[28];
+ __le32 host_interrupt_status;
+ __le32 rx_status;
+ struct core_fw_status fw_info;
+ __le32 tsf;
+} __packed;
+
+struct NAB_header {
+ __le32 sync_pattern;
+ __le16 opcode;
+ __le16 len;
+};
+
+/* rx_status lower bytes hold the rx byte count */
+#define RX_BYTE_COUNT_MASK 0xFFFF
+
+#define HINT_NEW_TX_RESULT 0x1
+#define HINT_COMMAND_COMPLETE 0x2
+#define HINT_ROM_LOADER_INIT_COMPLETE 0x8
+#define HINT_SECOND_LOADER_INIT_COMPLETE 0x10
+#define HINT_FW_WAKEUP_COMPLETE 0x20
+#define HINT_FW_INIT_COMPLETE 0x40
+#define HINT_GENERAL_ERROR 0x80000000
+
+#define BOOT_TIME_INTERRUPTS (\
+ HINT_ROM_LOADER_INIT_COMPLETE | \
+ HINT_SECOND_LOADER_INIT_COMPLETE | \
+ HINT_FW_WAKEUP_COMPLETE | \
+ HINT_FW_INIT_COMPLETE)
+
+struct NAB_tx_header {
+ __le32 sync;
+ __le16 opcode;
+ __le16 len;
+ __le16 desc_length;
+ u8 sd;
+ u8 flags;
+} __packed;
+
+struct NAB_rx_header {
+ __le32 cnys;
+ __le16 opcode;
+ __le16 len;
+ __le32 rx_desc;
+ __le32 reserved;
+} __packed;
+
+#endif /* __CC33XX_H__ */
diff --git a/drivers/net/wireless/ti/cc33xx/cc33xx_i.h b/drivers/net/wireless/ti/cc33xx/cc33xx_i.h
new file mode 100644
index 000000000000..9437f78b364f
--- /dev/null
+++ b/drivers/net/wireless/ti/cc33xx/cc33xx_i.h
@@ -0,0 +1,459 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright (C) 2022-2024 Texas Instruments Incorporated - https://www.ti.com/
+ */
+
+#ifndef __CC33XX_I_H__
+#define __CC33XX_I_H__
+
+#include <net/mac80211.h>
+#include <linux/platform_device.h>
+
+#include "conf.h"
+
+struct cc33xx_family_data {
+ const char *name;
+ const char *nvs_name; /* nvs file */
+ const char *cfg_name; /* cfg file */
+};
+
+#define CC33XX_TX_SECURITY_LO16(s) ((u16)((s) & 0xffff))
+#define CC33XX_TX_SECURITY_HI32(s) ((u32)(((s) >> 16) & 0xffffffff))
+#define CC33XX_TX_SQN_POST_RECOVERY_PADDING 0xff
+/* Use smaller padding for GEM, as some APs have issues when it's too big */
+#define CC33XX_TX_SQN_POST_RECOVERY_PADDING_GEM 0x20
+
+#define CC33XX_CIPHER_SUITE_GEM 0x00147201
+
+#define CC33XX_BUSY_WORD_LEN (sizeof(u32))
+
+#define CC33XX_DEFAULT_BEACON_INT 100
+
+#define CC33XX_MAX_ROLES 4
+#define CC33XX_INVALID_ROLE_ID 0xff
+#define CC33XX_INVALID_LINK_ID 0xff
+
+#define CC33XX_MAX_LINKS 21
+
+/* the driver supports the 2.4Ghz and 5Ghz bands */
+#define CC33XX_NUM_BANDS 2
+
+#define CC33XX_MAX_RATE_POLICIES 16
+
+/* Defined by FW as 0. Will not be freed or allocated. */
+#define CC33XX_SYSTEM_HLID 0
+
+/* When in AP-mode, we allow (at least) this number of packets
+ * to be transmitted to FW for a STA in PS-mode. Only when packets are
+ * present in the FW buffers it will wake the sleeping STA. We want to put
+ * enough packets for the driver to transmit all of its buffered data before
+ * the STA goes to sleep again. But we don't want to take too much memory
+ * as it might hurt the throughput of active STAs.
+ */
+#define CC33XX_PS_STA_MAX_PACKETS 2
+
+#define CC33XX_AP_BSS_INDEX 0
+
+enum cc33xx_state {
+ CC33XX_STATE_OFF,
+ CC33XX_STATE_RESTARTING,
+ CC33XX_STATE_ON,
+};
+
+struct cc33xx;
+
+#define NUM_TX_QUEUES 4
+
+#define CC33XX_MAX_CHANNELS 64
+struct cc33xx_scan {
+ struct cfg80211_scan_request *req;
+ unsigned long scanned_ch[BITS_TO_LONGS(CC33XX_MAX_CHANNELS)];
+ bool failed;
+ u8 state;
+ u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
+ size_t ssid_len;
+};
+
+struct cc33xx_if_operations {
+ void (*interface_claim)(struct device *child);
+ void (*interface_release)(struct device *child);
+ int __must_check (*read)(struct device *child, int addr, void *buf,
+ size_t len, bool fixed);
+ int __must_check (*write)(struct device *child, int addr, void *buf,
+ size_t len, bool fixed);
+ void (*reset)(struct device *child);
+ void (*init)(struct device *child);
+ int (*power)(struct device *child, bool enable);
+ void (*set_block_size)(struct device *child, unsigned int blksz);
+ size_t (*get_max_transaction_len)(struct device *child);
+ void (*set_irq_handler)(struct device *child, void *irq_handler);
+ void (*enable_irq)(struct device *child);
+ void (*disable_irq)(struct device *child);
+};
+
+struct cc33xx_platdev_data {
+ struct cc33xx_if_operations *if_ops;
+ const struct cc33xx_family_data *family;
+ void (*irq_handler)(struct platform_device *pdev);
+ int gpio_irq_num;
+
+ bool ref_clock_xtal; /* specify whether the clock is XTAL or not */
+ bool pwr_in_suspend;
+};
+
+#define MAX_NUM_KEYS 14
+#define MAX_KEY_SIZE 32
+
+struct cc33xx_ap_key {
+ u8 id;
+ u8 key_type;
+ u8 key_size;
+ u8 key[MAX_KEY_SIZE];
+ u8 hlid;
+ u32 tx_seq_32;
+ u16 tx_seq_16;
+};
+
+enum cc33xx_flags {
+ CC33XX_FLAG_GPIO_POWER,
+ CC33XX_FLAG_TX_PENDING,
+ CC33XX_FLAG_IN_ELP,
+ CC33XX_FLAG_FW_TX_BUSY,
+ CC33XX_FLAG_DUMMY_PACKET_PENDING,
+ CC33XX_FLAG_SUSPENDED,
+ CC33XX_FLAG_PENDING_WORK,
+ CC33XX_FLAG_SOFT_GEMINI,
+ CC33XX_FLAG_DRIVER_REMOVED,
+ CC33XX_FLAG_RECOVERY_IN_PROGRESS,
+ CC33XX_FLAG_VIF_CHANGE_IN_PROGRESS,
+ CC33XX_FLAG_IO_FAILED,
+ CC33XX_FLAG_REINIT_TX_WDOG,
+};
+
+enum cc33xx_vif_flags {
+ WLVIF_FLAG_INITIALIZED,
+ WLVIF_FLAG_STA_ASSOCIATED,
+ WLVIF_FLAG_STA_AUTHORIZED,
+ WLVIF_FLAG_IBSS_JOINED,
+ WLVIF_FLAG_AP_STARTED,
+ WLVIF_FLAG_IN_PS,
+ WLVIF_FLAG_STA_STATE_SENT,
+ WLVIF_FLAG_PSPOLL_FAILURE,
+ WLVIF_FLAG_CS_PROGRESS,
+ WLVIF_FLAG_AP_PROBE_RESP_SET,
+ WLVIF_FLAG_IN_USE,
+ WLVIF_FLAG_ACTIVE,
+ WLVIF_FLAG_BEACON_DISABLED,
+};
+
+struct cc33xx_vif;
+
+struct cc33xx_link {
+ /* AP-mode - TX queue per AC in link */
+ struct sk_buff_head tx_queue[NUM_TX_QUEUES];
+
+ /* accounting for allocated / freed packets in FW */
+ u8 allocated_pkts;
+ u8 prev_freed_pkts;
+
+ u8 addr[ETH_ALEN];
+
+ /* bitmap of TIDs where RX BA sessions are active for this link */
+ u8 ba_bitmap;
+
+ /* the last fw rate index we used for this link */
+ u8 fw_rate_idx;
+
+ /* the last fw rate [Mbps] we used for this link */
+ u8 fw_rate_mbps;
+
+ /* The wlvif this link belongs to. Might be null for global links */
+ struct cc33xx_vif *wlvif;
+
+ /* total freed FW packets on the link - used for tracking the
+ * AES/TKIP PN across recoveries. Re-initialized each time
+ * from the cc33xx_station structure.
+ */
+ u64 total_freed_pkts;
+};
+
+#define CC33XX_MAX_RX_FILTERS 5
+#define CC33XX_RX_FILTER_MAX_FIELDS 8
+
+#define CC33XX_RX_FILTER_ETH_HEADER_SIZE 14
+#define CC33XX_RX_FILTER_MAX_FIELDS_SIZE 95
+#define RX_FILTER_FIELD_OVERHEAD \
+ (sizeof(struct cc33xx_rx_filter_field) - sizeof(u8 *))
+#define CC33XX_RX_FILTER_MAX_PATTERN_SIZE \
+ (CC33XX_RX_FILTER_MAX_FIELDS_SIZE - RX_FILTER_FIELD_OVERHEAD)
+
+#define CC33XX_RX_FILTER_FLAG_IP_HEADER 0
+#define CC33XX_RX_FILTER_FLAG_ETHERNET_HEADER BIT(1)
+
+struct ieee80211_header {
+ __le16 frame_ctl;
+ __le16 duration_id;
+ u8 da[ETH_ALEN];
+ u8 sa[ETH_ALEN];
+ u8 bssid[ETH_ALEN];
+ __le16 seq_ctl;
+ u8 payload[];
+} __packed;
+
+enum rx_filter_action {
+ FILTER_DROP = 0,
+ FILTER_SIGNAL = 1,
+ FILTER_FW_HANDLE = 2
+};
+
+enum plt_mode {
+ PLT_OFF = 0,
+ PLT_ON = 1,
+ PLT_FEM_DETECT = 2,
+ PLT_CHIP_AWAKE = 3
+};
+
+struct cc33xx_rx_filter_field {
+ __le16 offset;
+ u8 len;
+ u8 flags;
+ u8 *pattern;
+} __packed;
+
+struct cc33xx_rx_filter {
+ u8 action;
+ int num_fields;
+ struct cc33xx_rx_filter_field fields[CC33XX_RX_FILTER_MAX_FIELDS];
+};
+
+struct cc33xx_station {
+ u8 hlid;
+ bool in_connection;
+
+ /* total freed FW packets on the link to the STA - used for tracking the
+ * AES/TKIP PN across recoveries. Re-initialized each time from the
+ * cc33xx_station structure.
+ * Used in both AP and STA mode.
+ */
+ u64 total_freed_pkts;
+};
+
+struct cc33xx_vif {
+ struct cc33xx *cc;
+ struct list_head list;
+ unsigned long flags;
+ u8 bss_type;
+ u8 p2p; /* we are using p2p role */
+ u8 role_id;
+
+ /* sta/ibss specific */
+ u8 dev_role_id;
+ u8 dev_hlid;
+
+ union {
+ struct {
+ u8 hlid;
+
+ u8 basic_rate_idx;
+ u8 ap_rate_idx;
+ u8 p2p_rate_idx;
+
+ bool qos;
+ /* channel type we started the STA role with */
+ enum nl80211_channel_type role_chan_type;
+ } sta;
+ struct {
+ u8 global_hlid;
+ u8 bcast_hlid;
+
+ /* HLIDs bitmap of associated stations */
+ unsigned long sta_hlid_map[BITS_TO_LONGS(CC33XX_MAX_LINKS)];
+
+ /* recoreded keys - set here before AP startup */
+ struct cc33xx_ap_key *recorded_keys[MAX_NUM_KEYS];
+
+ u8 mgmt_rate_idx;
+ u8 bcast_rate_idx;
+ u8 ucast_rate_idx[CONF_TX_MAX_AC_COUNT];
+ } ap;
+ };
+
+ /* the hlid of the last transmitted skb */
+ int last_tx_hlid;
+
+ /* counters of packets per AC, across all links in the vif */
+ int tx_queue_count[NUM_TX_QUEUES];
+
+ unsigned long links_map[BITS_TO_LONGS(CC33XX_MAX_LINKS)];
+
+ u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
+ u8 ssid_len;
+
+ /* The current band */
+ enum nl80211_band band;
+ int channel;
+ enum nl80211_channel_type channel_type;
+
+ u32 bitrate_masks[CC33XX_NUM_BANDS];
+ u32 basic_rate_set;
+
+ /* currently configured rate set:
+ * bits 0-15 - 802.11abg rates
+ * bits 16-23 - 802.11n MCS index mask
+ * support only 1 stream, thus only 8 bits for the MCS rates (0-7).
+ */
+ u32 basic_rate;
+ u32 rate_set;
+
+ /* probe-req template for the current AP */
+ struct sk_buff *probereq;
+
+ /* Beaconing interval (needed for ad-hoc) */
+ u32 beacon_int;
+
+ /* Default key (for WEP) */
+ u32 default_key;
+
+ /* Our association ID */
+ u16 aid;
+
+ /* retry counter for PSM entries */
+ u8 psm_entry_retry;
+
+ /* in dBm */
+ int power_level;
+
+ int rssi_thold;
+ int last_rssi_event;
+
+ /* save the current encryption type for auto-arp config */
+ u8 encryption_type;
+ __be32 ip_addr;
+
+ /* RX BA constraint value */
+ bool ba_support;
+ bool ba_allowed;
+
+ bool wmm_enabled;
+
+ bool radar_enabled;
+
+ struct delayed_work channel_switch_work;
+ struct delayed_work connection_loss_work;
+
+ /* number of in connection stations */
+ int inconn_count;
+
+ /* This vif's queues are mapped to mac80211 HW queues as:
+ * VO - hw_queue_base
+ * VI - hw_queue_base + 1
+ * BE - hw_queue_base + 2
+ * BK - hw_queue_base + 3
+ */
+ int hw_queue_base;
+
+ /* do we have a pending auth reply? (and ROC) */
+ bool ap_pending_auth_reply;
+
+ /* time when we sent the pending auth reply */
+ unsigned long pending_auth_reply_time;
+
+ /* work for canceling ROC after pending auth reply */
+ struct delayed_work pending_auth_complete_work;
+
+ struct delayed_work roc_timeout_work;
+
+ /* update rate conrol */
+ enum ieee80211_sta_rx_bandwidth rc_update_bw;
+ struct ieee80211_sta_ht_cap rc_ht_cap;
+ struct work_struct rc_update_work;
+
+ /* total freed FW packets on the link.
+ * For STA this holds the PN of the link to the AP.
+ * For AP this holds the PN of the broadcast link.
+ */
+ u64 total_freed_pkts;
+
+ /* for MBSSID: this BSS is a nontransmitted BSS profile
+ * Relevant for STA role
+ */
+ bool nontransmitted;
+
+ /* for MBSSID: update transmitter BSSID */
+ u8 transmitter_bssid[ETH_ALEN];
+
+ /* for MBSSID: BSSID index */
+ u8 bssid_index;
+
+ /* for MBSSID: BSSID indicator */
+ u8 bssid_indicator;
+
+ /* for STA: if connection established and has HE support*/
+ u8 sta_has_he;
+
+ /* This struct must be last!
+ * data that has to be saved acrossed reconfigs (e.g. recovery)
+ * should be declared in this struct.
+ */
+ u8 persistent[];
+};
+
+static inline struct cc33xx_vif *cc33xx_vif_to_data(struct ieee80211_vif *vif)
+{
+ WARN_ON(!vif);
+ return (struct cc33xx_vif *)vif->drv_priv;
+}
+
+static inline
+struct ieee80211_vif *cc33xx_wlvif_to_vif(struct cc33xx_vif *wlvif)
+{
+ return container_of((void *)wlvif, struct ieee80211_vif, drv_priv);
+}
+
+static inline bool cc33xx_is_p2p_mgmt(struct cc33xx_vif *wlvif)
+{
+ return cc33xx_wlvif_to_vif(wlvif)->type == NL80211_IFTYPE_P2P_DEVICE;
+}
+
+#define cc33xx_for_each_wlvif(cc, wlvif) \
+ list_for_each_entry(wlvif, &(cc)->wlvif_list, list)
+
+#define cc33xx_for_each_wlvif_continue(cc, wlvif) \
+ list_for_each_entry_continue(wlvif, &(cc)->wlvif_list, list)
+
+#define cc33xx_for_each_wlvif_bss_type(cc, wlvif, _bss_type) \
+ cc33xx_for_each_wlvif((cc), (wlvif)) \
+ if ((wlvif)->bss_type == (_bss_type))
+
+#define cc33xx_for_each_wlvif_sta(cc, wlvif) \
+ cc33xx_for_each_wlvif_bss_type(cc, wlvif, BSS_TYPE_STA_BSS)
+
+#define cc33xx_for_each_wlvif_ap(cc, wlvif) \
+ cc33xx_for_each_wlvif_bss_type(cc, wlvif, BSS_TYPE_AP_BSS)
+
+int cc33xx_plt_start(struct cc33xx *cc, const enum plt_mode plt_mode);
+int cc33xx_plt_stop(struct cc33xx *cc);
+void cc33xx_queue_recovery_work(struct cc33xx *cc);
+void cc33xx_flush_deferred_work(struct cc33xx *cc);
+
+#define SESSION_COUNTER_INVALID 7 /* used with dummy_packet */
+
+#define CC33XX_MAX_TXPWR 21 /* maximum power limit is 21dBm */
+#define CC33XX_MIN_TXPWR -10 /* minmum power limit is -10dBm */
+
+#define CC33XX_TX_QUEUE_LOW_WATERMARK 32
+#define CC33XX_TX_QUEUE_HIGH_WATERMARK 256
+
+#define CC33XX_RX_QUEUE_MAX_LEN 256
+
+/* cc33xx needs a 200ms sleep after power on, and a 20ms sleep before power
+ * on in case is has been shut down shortly before
+ */
+#define CC33XX_PRE_POWER_ON_SLEEP 20 /* in milliseconds */
+#define CC33XX_POWER_ON_SLEEP 200 /* in milliseconds */
+
+/* Macros to handle cc33xx.sta_rate_set */
+#define HW_HT_RATES_OFFSET 16
+#define HW_MIMO_RATES_OFFSET 24
+
+#endif /* __CC33XX_I_H__ */
--
2.25.1
On 21/05/2024 19:18, michael.nemanov@ti.com wrote:
> From: Michael Nemanov <Michael.Nemanov@ti.com>
>
> These are header files with definitions common to the entire driver.
Please use subject prefixes matching the subsystem. You can get them for
example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory
your patch is touching. For bindings, the preferred subjects are
explained here:
https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patches.html#i-for-patch-submitters
>
> Signed-off-by: Michael Nemanov <michael.nemanov@ti.com>
> ---
> drivers/net/wireless/ti/cc33xx/cc33xx.h | 481 ++++++++++++++++++++++
> drivers/net/wireless/ti/cc33xx/cc33xx_i.h | 459 +++++++++++++++++++++
> 2 files changed, 940 insertions(+)
> create mode 100644 drivers/net/wireless/ti/cc33xx/cc33xx.h
> create mode 100644 drivers/net/wireless/ti/cc33xx/cc33xx_i.h
>
> diff --git a/drivers/net/wireless/ti/cc33xx/cc33xx.h b/drivers/net/wireless/ti/cc33xx/cc33xx.h
> new file mode 100644
> index 000000000000..3a2e56af4da7
> --- /dev/null
> +++ b/drivers/net/wireless/ti/cc33xx/cc33xx.h
> @@ -0,0 +1,481 @@
> +/* SPDX-License-Identifier: GPL-2.0-only
> + *
> + * Copyright (C) 2022-2024 Texas Instruments Incorporated - https://www.ti.com/
> + */
> +
> +#ifndef __CC33XX_H__
> +#define __CC33XX_H__
> +
> +#include "cc33xx_i.h"
> +#include "rx.h"
> +
> +/* Wireless Driver Version */
> +#define DRV_VERSION "1.7.0.108"
> +
> +/* The maximum number of Tx descriptors in all chip families */
> +#define CC33XX_MAX_TX_DESCRIPTORS 32
> +
> +#define CC33XX_CMD_MAX_SIZE (896)
> +#define CC33XX_INI_PARAM_COMMAND_SIZE (16UL)
> +#define CC33XX_INI_CMD_MAX_SIZE (CC33X_CONF_SIZE + CC33XX_INI_PARAM_COMMAND_SIZE + sizeof(int))
> +
> +#define CC33XX_CMD_BUFFER_SIZE ((CC33XX_INI_CMD_MAX_SIZE > CC33XX_CMD_MAX_SIZE)\
> + ? CC33XX_INI_CMD_MAX_SIZE : CC33XX_CMD_MAX_SIZE)
> +
> +#define CC33XX_NUM_MAC_ADDRESSES 3
> +
> +#define CC33XX_AGGR_BUFFER_SIZE (8 * PAGE_SIZE)
> +
> +#define CC33XX_NUM_TX_DESCRIPTORS 32
> +#define CC33XX_NUM_RX_DESCRIPTORS 32
> +
> +#define CC33XX_RX_BA_MAX_SESSIONS 13
> +
> +#define CC33XX_MAX_AP_STATIONS 16
> +
> +struct cc33xx_tx_hw_descr;
> +struct cc33xx_rx_descriptor;
> +struct partial_rx_frame;
> +struct core_fw_status;
> +struct core_status;
> +
> +enum wl_rx_buf_align;
> +
> +struct driver_fw_versions {
> + const char *driver_ver;
> + struct cc33xx_acx_fw_versions *fw_ver;
> +};
> +
> +struct cc33xx_stats {
> + void *fw_stats;
> + unsigned long fw_stats_update;
> + unsigned int retry_count;
> + unsigned int excessive_retries;
> +};
> +
> +struct cc33xx_ant_diversity {
> + u8 diversity_enable;
> + s8 rssi_threshold;
> + u8 default_antenna;
> + u8 padding;
> +};
> +
> +struct cc33xx {
> + bool initialized;
> + struct ieee80211_hw *hw;
> + bool mac80211_registered;
> +
> + struct device *dev;
> + struct platform_device *pdev;
> +
> + struct cc33xx_if_operations *if_ops;
> +
> + int wakeirq;
> +
> + spinlock_t cc_lock; /* Protects critical sections */
Which ones. Your comment is entirely useless, just to satisfy checkpatch.
> +
> + enum cc33xx_state state;
> + bool plt;
> + enum plt_mode plt_mode;
> + u8 plt_role_id;
> + u8 fem_manuf;
> + u8 last_vif_count;
> + struct mutex mutex; /* Protect all CC33xx operations */
?!? So double lock?
> + struct core_status *core_status;
> + u8 last_fw_rls_idx;
> + u8 command_result[CC33XX_CMD_MAX_SIZE];
> + u16 result_length;
> + struct partial_rx_frame partial_rx;
> +
> + unsigned long flags;
> +
> + void *nvs_mac_addr;
> + size_t nvs_mac_addr_len;
> + struct cc33xx_fw_download *fw_download;
> +
> + struct mac_address addresses[CC33XX_NUM_MAC_ADDRESSES];
> +
> + unsigned long links_map[BITS_TO_LONGS(CC33XX_MAX_LINKS)];
> + unsigned long roles_map[BITS_TO_LONGS(CC33XX_MAX_ROLES)];
> + unsigned long roc_map[BITS_TO_LONGS(CC33XX_MAX_ROLES)];
> + unsigned long rate_policies_map[BITS_TO_LONGS(CC33XX_MAX_RATE_POLICIES)];
> +
> + u8 session_ids[CC33XX_MAX_LINKS];
> +
> + struct list_head wlvif_list;
> +
> + u8 sta_count;
> + u8 ap_count;
> +
> + struct cc33xx_acx_mem_map *target_mem_map;
> +
> + /* Accounting for allocated / available TX blocks on HW */
> +
> + u32 tx_blocks_available;
> + u32 tx_allocated_blocks;
> +
> + /* Accounting for allocated / available Tx packets in HW */
> +
> + u32 tx_allocated_pkts[NUM_TX_QUEUES];
> +
> + /* Time-offset between host and chipset clocks */
> +
> + /* Frames scheduled for transmission, not handled yet */
> + int tx_queue_count[NUM_TX_QUEUES];
> + unsigned long queue_stop_reasons[NUM_TX_QUEUES * CC33XX_NUM_MAC_ADDRESSES];
> +
> + /* Frames received, not handled yet by mac80211 */
> + struct sk_buff_head deferred_rx_queue;
> +
> + /* Frames sent, not returned yet to mac80211 */
> + struct sk_buff_head deferred_tx_queue;
> +
> + struct work_struct tx_work;
> + struct workqueue_struct *freezable_wq;
> +
> + /*freezable wq for netstack_work*/
> + struct workqueue_struct *freezable_netstack_wq;
> +
> + /* Pending TX frames */
> + unsigned long tx_frames_map[BITS_TO_LONGS(CC33XX_MAX_TX_DESCRIPTORS)];
> + struct sk_buff *tx_frames[CC33XX_MAX_TX_DESCRIPTORS];
> + int tx_frames_cnt;
> +
> + /* FW Rx counter */
> + u32 rx_counter;
> +
> + /* Intermediate buffer, used for packet aggregation */
> + u8 *aggr_buf;
> + u32 aggr_buf_size;
> + size_t max_transaction_len;
> +
> + /* Reusable dummy packet template */
> + struct sk_buff *dummy_packet;
> +
> + /* Network stack work */
> + struct work_struct netstack_work;
> + /* FW log buffer */
> + u8 *fwlog;
> +
> + /* Number of valid bytes in the FW log buffer */
> + ssize_t fwlog_size;
> +
> + /* Hardware recovery work */
> + struct work_struct recovery_work;
> +
> + struct work_struct irq_deferred_work;
> +
> + /* Reg domain last configuration */
> + DECLARE_BITMAP(reg_ch_conf_last, 64);
> + /* Reg domain pending configuration */
> + DECLARE_BITMAP(reg_ch_conf_pending, 64);
> +
> + /* Lock-less list for deferred event handling */
> + struct llist_head event_list;
> + /* The mbox event mask */
> + u32 event_mask;
> + /* events to unmask only when ap interface is up */
> + u32 ap_event_mask;
> +
> + /* Are we currently scanning */
> + struct cc33xx_vif *scan_wlvif;
> + struct cc33xx_scan scan;
> + struct delayed_work scan_complete_work;
> +
> + struct ieee80211_vif *roc_vif;
> + struct delayed_work roc_complete_work;
> +
> + struct cc33xx_vif *sched_vif;
> +
> + u8 mac80211_scan_stopped;
> +
> + /* The current band */
> + enum nl80211_band band;
> +
> + /* in dBm */
> + int power_level;
> +
> + struct cc33xx_stats stats;
> +
> + __le32 *buffer_32;
> +
> + /* Current chipset configuration */
> + struct cc33xx_conf_file conf;
> +
> + bool enable_11a;
> +
> + /* bands supported by this instance of cc33xx */
> + struct ieee80211_supported_band bands[CC33XX_NUM_BANDS];
> +
> + /* wowlan trigger was configured during suspend.
> + * (currently, only "ANY" and "PATTERN" trigger is supported)
> + */
> +
> + bool keep_device_power;
> +
> + /* AP-mode - links indexed by HLID. The global and broadcast links
> + * are always active.
> + */
> + struct cc33xx_link links[CC33XX_MAX_LINKS];
> +
> + /* number of currently active links */
> + int active_link_count;
> +
> + /* AP-mode - a bitmap of links currently in PS mode according to FW */
> + unsigned long ap_fw_ps_map;
> +
> + /* AP-mode - a bitmap of links currently in PS mode in mac80211 */
> + unsigned long ap_ps_map;
> +
> + /* Quirks of specific hardware revisions */
> + unsigned int quirks;
> +
> + /* number of currently active RX BA sessions */
> + int ba_rx_session_count;
> +
> + /* AP-mode - number of currently connected stations */
> + int active_sta_count;
> +
> + /* last wlvif we transmitted from */
> + struct cc33xx_vif *last_wlvif;
> +
> + /* work to fire when Tx is stuck */
> + struct delayed_work tx_watchdog_work;
> +
> + /* HW HT (11n) capabilities */
> + struct ieee80211_sta_ht_cap ht_cap[CC33XX_NUM_BANDS];
> +
> + /* the current dfs region */
> + enum nl80211_dfs_regions dfs_region;
> + bool radar_debug_mode;
> +
> + /* RX Data filter rule state - enabled/disabled */
> + /* used in CONFIG PM AND W8 Code */
> + unsigned long rx_filter_enabled[BITS_TO_LONGS(CC33XX_MAX_RX_FILTERS)];
> +
> + /* mutex for protecting the tx_flush function */
> + struct mutex flush_mutex;
> +
> + /* sleep auth value currently configured to FW */
> + int sleep_auth;
> +
> + /*ble_enable value - 1=enabled, 0=disabled. */
> + int ble_enable;
> +
> + /* parameters for joining a TWT agreement */
> + int min_wake_duration_usec;
> + int min_wake_interval_mantissa;
> + int min_wake_interval_exponent;
> + int max_wake_interval_mantissa;
> + int max_wake_interval_exponent;
> +
> + /* the number of allocated MAC addresses in this chip */
> + int num_mac_addr;
> +
> + /* sta role index - if 0 - wlan0 primary station interface,
> + * if 1 - wlan2 - secondary station interface
> + */
> + u8 sta_role_idx;
> +
> + u16 max_cmd_size;
> +
> + struct completion nvs_loading_complete;
> + struct completion command_complete;
> +
> + /* dynamic fw traces */
> + u32 dynamic_fw_traces;
> +
> + /* buffer for sending commands to FW */
> + u8 cmd_buf[CC33XX_CMD_BUFFER_SIZE];
> +
> + /* number of keys requiring extra spare mem-blocks */
> + int extra_spare_key_count;
This entire struct is quite unmanageable...
> +
> + u8 efuse_mac_address[ETH_ALEN];
> +
> + u32 fuse_rom_structure_version;
> + u32 device_part_number;
> + u32 pg_version;
> + u8 disable_5g;
> + u8 disable_6g;
Please fix trivial whitespace issues.
This driver looks like having basic issues unresolved, really basic. I
advise to get internal TI review first, before you will be using
community resources for these trivial things.
Please also confirm that you also fixed all warnings from:
1. checkpatch --strict
2. smatch
3. sparse
4. coccinelle/coccicheck
Best regards,
Krzysztof
On 5/22/2024 12:38 PM, Krzysztof Kozlowski wrote: > >> + struct core_status *core_status; >> + u8 last_fw_rls_idx; >> + u8 command_result[CC33XX_CMD_MAX_SIZE]; >> + u16 result_length; >> + struct partial_rx_frame partial_rx; >> + >> + unsigned long flags; >> + >> + void *nvs_mac_addr; >> + size_t nvs_mac_addr_len; >> + struct cc33xx_fw_download *fw_download; >> + >> + struct mac_address addresses[CC33XX_NUM_MAC_ADDRESSES]; >> + >> + unsigned long links_map[BITS_TO_LONGS(CC33XX_MAX_LINKS)]; >> + unsigned long roles_map[BITS_TO_LONGS(CC33XX_MAX_ROLES)]; >> + unsigned long roc_map[BITS_TO_LONGS(CC33XX_MAX_ROLES)]; >> + unsigned long rate_policies_map[BITS_TO_LONGS(CC33XX_MAX_RATE_POLICIES)]; >> + >> + u8 session_ids[CC33XX_MAX_LINKS]; >> + >> + struct list_head wlvif_list; >> + >> + u8 sta_count; >> + u8 ap_count; >> + >> + struct cc33xx_acx_mem_map *target_mem_map; >> + >> + /* Accounting for allocated / available TX blocks on HW */ >> + >> + u32 tx_blocks_available; >> + u32 tx_allocated_blocks; >> + >> + /* Accounting for allocated / available Tx packets in HW */ >> + >> + u32 tx_allocated_pkts[NUM_TX_QUEUES]; >> + >> + /* Time-offset between host and chipset clocks */ >> + >> + /* Frames scheduled for transmission, not handled yet */ >> + int tx_queue_count[NUM_TX_QUEUES]; >> + unsigned long queue_stop_reasons[NUM_TX_QUEUES * CC33XX_NUM_MAC_ADDRESSES]; >> + >> + /* Frames received, not handled yet by mac80211 */ >> + struct sk_buff_head deferred_rx_queue; >> + >> + /* Frames sent, not returned yet to mac80211 */ >> + struct sk_buff_head deferred_tx_queue; >> + >> + struct work_struct tx_work; >> + struct workqueue_struct *freezable_wq; >> + >> + /*freezable wq for netstack_work*/ >> + struct workqueue_struct *freezable_netstack_wq; >> + >> + /* Pending TX frames */ >> + unsigned long tx_frames_map[BITS_TO_LONGS(CC33XX_MAX_TX_DESCRIPTORS)]; >> + struct sk_buff *tx_frames[CC33XX_MAX_TX_DESCRIPTORS]; >> + int tx_frames_cnt; >> + >> + /* FW Rx counter */ >> + u32 rx_counter; >> + >> + /* Intermediate buffer, used for packet aggregation */ >> + u8 *aggr_buf; >> + u32 aggr_buf_size; >> + size_t max_transaction_len; >> + >> + /* Reusable dummy packet template */ >> + struct sk_buff *dummy_packet; >> + >> + /* Network stack work */ >> + struct work_struct netstack_work; >> + /* FW log buffer */ >> + u8 *fwlog; >> + >> + /* Number of valid bytes in the FW log buffer */ >> + ssize_t fwlog_size; >> + >> + /* Hardware recovery work */ >> + struct work_struct recovery_work; >> + >> + struct work_struct irq_deferred_work; >> + >> + /* Reg domain last configuration */ >> + DECLARE_BITMAP(reg_ch_conf_last, 64); >> + /* Reg domain pending configuration */ >> + DECLARE_BITMAP(reg_ch_conf_pending, 64); >> + >> + /* Lock-less list for deferred event handling */ >> + struct llist_head event_list; >> + /* The mbox event mask */ >> + u32 event_mask; >> + /* events to unmask only when ap interface is up */ >> + u32 ap_event_mask; >> + >> + /* Are we currently scanning */ >> + struct cc33xx_vif *scan_wlvif; >> + struct cc33xx_scan scan; >> + struct delayed_work scan_complete_work; >> + >> + struct ieee80211_vif *roc_vif; >> + struct delayed_work roc_complete_work; >> + >> + struct cc33xx_vif *sched_vif; >> + >> + u8 mac80211_scan_stopped; >> + >> + /* The current band */ >> + enum nl80211_band band; >> + >> + /* in dBm */ >> + int power_level; >> + >> + struct cc33xx_stats stats; >> + >> + __le32 *buffer_32; >> + >> + /* Current chipset configuration */ >> + struct cc33xx_conf_file conf; >> + >> + bool enable_11a; >> + >> + /* bands supported by this instance of cc33xx */ >> + struct ieee80211_supported_band bands[CC33XX_NUM_BANDS]; >> + >> + /* wowlan trigger was configured during suspend. >> + * (currently, only "ANY" and "PATTERN" trigger is supported) >> + */ >> + >> + bool keep_device_power; >> + >> + /* AP-mode - links indexed by HLID. The global and broadcast links >> + * are always active. >> + */ >> + struct cc33xx_link links[CC33XX_MAX_LINKS]; >> + >> + /* number of currently active links */ >> + int active_link_count; >> + >> + /* AP-mode - a bitmap of links currently in PS mode according to FW */ >> + unsigned long ap_fw_ps_map; >> + >> + /* AP-mode - a bitmap of links currently in PS mode in mac80211 */ >> + unsigned long ap_ps_map; >> + >> + /* Quirks of specific hardware revisions */ >> + unsigned int quirks; >> + >> + /* number of currently active RX BA sessions */ >> + int ba_rx_session_count; >> + >> + /* AP-mode - number of currently connected stations */ >> + int active_sta_count; >> + >> + /* last wlvif we transmitted from */ >> + struct cc33xx_vif *last_wlvif; >> + >> + /* work to fire when Tx is stuck */ >> + struct delayed_work tx_watchdog_work; >> + >> + /* HW HT (11n) capabilities */ >> + struct ieee80211_sta_ht_cap ht_cap[CC33XX_NUM_BANDS]; >> + >> + /* the current dfs region */ >> + enum nl80211_dfs_regions dfs_region; >> + bool radar_debug_mode; >> + >> + /* RX Data filter rule state - enabled/disabled */ >> + /* used in CONFIG PM AND W8 Code */ >> + unsigned long rx_filter_enabled[BITS_TO_LONGS(CC33XX_MAX_RX_FILTERS)]; >> + >> + /* mutex for protecting the tx_flush function */ >> + struct mutex flush_mutex; >> + >> + /* sleep auth value currently configured to FW */ >> + int sleep_auth; >> + >> + /*ble_enable value - 1=enabled, 0=disabled. */ >> + int ble_enable; >> + >> + /* parameters for joining a TWT agreement */ >> + int min_wake_duration_usec; >> + int min_wake_interval_mantissa; >> + int min_wake_interval_exponent; >> + int max_wake_interval_mantissa; >> + int max_wake_interval_exponent; >> + >> + /* the number of allocated MAC addresses in this chip */ >> + int num_mac_addr; >> + >> + /* sta role index - if 0 - wlan0 primary station interface, >> + * if 1 - wlan2 - secondary station interface >> + */ >> + u8 sta_role_idx; >> + >> + u16 max_cmd_size; >> + >> + struct completion nvs_loading_complete; >> + struct completion command_complete; >> + >> + /* dynamic fw traces */ >> + u32 dynamic_fw_traces; >> + >> + /* buffer for sending commands to FW */ >> + u8 cmd_buf[CC33XX_CMD_BUFFER_SIZE]; >> + >> + /* number of keys requiring extra spare mem-blocks */ >> + int extra_spare_key_count; > > This entire struct is quite unmanageable... > From what I saw many wireless drivers hold their private members in a single structure of roughly the same size. Most of these are unrelated to each other so I doubt grouping them in sub-structures will improve readability.
On 5/22/2024 12:38 PM, Krzysztof Kozlowski wrote: > Please also confirm that you also fixed all warnings from: > 1. checkpatch --strict > 2. smatch > 3. sparse > 4. coccinelle/coccicheck I was running checkpatch --strict and sparse. I'll add smatch and coccinelle/coccicheck to the test list as well as testing on other architectures. Thanks and regards, Michael.
© 2016 - 2026 Red Hat, Inc.