18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * This file is part of wl1251
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (c) 1998-2007 Texas Instruments Incorporated
68c2ecf20Sopenharmony_ci * Copyright (C) 2008-2009 Nokia Corporation
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifndef __WL1251_H__
108c2ecf20Sopenharmony_ci#define __WL1251_H__
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/mutex.h>
138c2ecf20Sopenharmony_ci#include <linux/list.h>
148c2ecf20Sopenharmony_ci#include <linux/bitops.h>
158c2ecf20Sopenharmony_ci#include <net/mac80211.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define DRIVER_NAME "wl1251"
188c2ecf20Sopenharmony_ci#define DRIVER_PREFIX DRIVER_NAME ": "
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cienum {
218c2ecf20Sopenharmony_ci	DEBUG_NONE	= 0,
228c2ecf20Sopenharmony_ci	DEBUG_IRQ	= BIT(0),
238c2ecf20Sopenharmony_ci	DEBUG_SPI	= BIT(1),
248c2ecf20Sopenharmony_ci	DEBUG_BOOT	= BIT(2),
258c2ecf20Sopenharmony_ci	DEBUG_MAILBOX	= BIT(3),
268c2ecf20Sopenharmony_ci	DEBUG_NETLINK	= BIT(4),
278c2ecf20Sopenharmony_ci	DEBUG_EVENT	= BIT(5),
288c2ecf20Sopenharmony_ci	DEBUG_TX	= BIT(6),
298c2ecf20Sopenharmony_ci	DEBUG_RX	= BIT(7),
308c2ecf20Sopenharmony_ci	DEBUG_SCAN	= BIT(8),
318c2ecf20Sopenharmony_ci	DEBUG_CRYPT	= BIT(9),
328c2ecf20Sopenharmony_ci	DEBUG_PSM	= BIT(10),
338c2ecf20Sopenharmony_ci	DEBUG_MAC80211	= BIT(11),
348c2ecf20Sopenharmony_ci	DEBUG_CMD	= BIT(12),
358c2ecf20Sopenharmony_ci	DEBUG_ACX	= BIT(13),
368c2ecf20Sopenharmony_ci	DEBUG_ALL	= ~0,
378c2ecf20Sopenharmony_ci};
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define DEBUG_LEVEL (DEBUG_NONE)
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define DEBUG_DUMP_LIMIT 1024
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#define wl1251_error(fmt, arg...) \
448c2ecf20Sopenharmony_ci	printk(KERN_ERR DRIVER_PREFIX "ERROR " fmt "\n", ##arg)
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#define wl1251_warning(fmt, arg...) \
478c2ecf20Sopenharmony_ci	printk(KERN_WARNING DRIVER_PREFIX "WARNING " fmt "\n", ##arg)
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#define wl1251_notice(fmt, arg...) \
508c2ecf20Sopenharmony_ci	printk(KERN_INFO DRIVER_PREFIX fmt "\n", ##arg)
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci#define wl1251_info(fmt, arg...) \
538c2ecf20Sopenharmony_ci	printk(KERN_DEBUG DRIVER_PREFIX fmt "\n", ##arg)
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci#define wl1251_debug(level, fmt, arg...) \
568c2ecf20Sopenharmony_ci	do { \
578c2ecf20Sopenharmony_ci		if (level & DEBUG_LEVEL) \
588c2ecf20Sopenharmony_ci			printk(KERN_DEBUG DRIVER_PREFIX fmt "\n", ##arg); \
598c2ecf20Sopenharmony_ci	} while (0)
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci#define wl1251_dump(level, prefix, buf, len)	\
628c2ecf20Sopenharmony_ci	do { \
638c2ecf20Sopenharmony_ci		if (level & DEBUG_LEVEL) \
648c2ecf20Sopenharmony_ci			print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \
658c2ecf20Sopenharmony_ci				       DUMP_PREFIX_OFFSET, 16, 1,	\
668c2ecf20Sopenharmony_ci				       buf,				\
678c2ecf20Sopenharmony_ci				       min_t(size_t, len, DEBUG_DUMP_LIMIT), \
688c2ecf20Sopenharmony_ci				       0);				\
698c2ecf20Sopenharmony_ci	} while (0)
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci#define wl1251_dump_ascii(level, prefix, buf, len)	\
728c2ecf20Sopenharmony_ci	do { \
738c2ecf20Sopenharmony_ci		if (level & DEBUG_LEVEL) \
748c2ecf20Sopenharmony_ci			print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \
758c2ecf20Sopenharmony_ci				       DUMP_PREFIX_OFFSET, 16, 1,	\
768c2ecf20Sopenharmony_ci				       buf,				\
778c2ecf20Sopenharmony_ci				       min_t(size_t, len, DEBUG_DUMP_LIMIT), \
788c2ecf20Sopenharmony_ci				       true);				\
798c2ecf20Sopenharmony_ci	} while (0)
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_RX_CONFIG (CFG_UNI_FILTER_EN |	\
828c2ecf20Sopenharmony_ci				  CFG_MC_FILTER_EN |	\
838c2ecf20Sopenharmony_ci				  CFG_BSSID_FILTER_EN)
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_RX_FILTER (CFG_RX_PRSP_EN |  \
868c2ecf20Sopenharmony_ci				  CFG_RX_MGMT_EN |  \
878c2ecf20Sopenharmony_ci				  CFG_RX_DATA_EN |  \
888c2ecf20Sopenharmony_ci				  CFG_RX_CTL_EN |   \
898c2ecf20Sopenharmony_ci				  CFG_RX_BCN_EN |   \
908c2ecf20Sopenharmony_ci				  CFG_RX_AUTH_EN |  \
918c2ecf20Sopenharmony_ci				  CFG_RX_ASSOC_EN)
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci#define WL1251_BUSY_WORD_LEN 8
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_cistruct boot_attr {
968c2ecf20Sopenharmony_ci	u32 radio_type;
978c2ecf20Sopenharmony_ci	u8 mac_clock;
988c2ecf20Sopenharmony_ci	u8 arm_clock;
998c2ecf20Sopenharmony_ci	int firmware_debug;
1008c2ecf20Sopenharmony_ci	u32 minor;
1018c2ecf20Sopenharmony_ci	u32 major;
1028c2ecf20Sopenharmony_ci	u32 bugfix;
1038c2ecf20Sopenharmony_ci};
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cienum wl1251_state {
1068c2ecf20Sopenharmony_ci	WL1251_STATE_OFF,
1078c2ecf20Sopenharmony_ci	WL1251_STATE_ON,
1088c2ecf20Sopenharmony_ci	WL1251_STATE_PLT,
1098c2ecf20Sopenharmony_ci};
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_cienum wl1251_partition_type {
1128c2ecf20Sopenharmony_ci	PART_DOWN,
1138c2ecf20Sopenharmony_ci	PART_WORK,
1148c2ecf20Sopenharmony_ci	PART_DRPW,
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	PART_TABLE_LEN
1178c2ecf20Sopenharmony_ci};
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_cienum wl1251_station_mode {
1208c2ecf20Sopenharmony_ci	STATION_ACTIVE_MODE,
1218c2ecf20Sopenharmony_ci	STATION_POWER_SAVE_MODE,
1228c2ecf20Sopenharmony_ci	STATION_IDLE,
1238c2ecf20Sopenharmony_ci};
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_cistruct wl1251_partition {
1268c2ecf20Sopenharmony_ci	u32 size;
1278c2ecf20Sopenharmony_ci	u32 start;
1288c2ecf20Sopenharmony_ci};
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_cistruct wl1251_partition_set {
1318c2ecf20Sopenharmony_ci	struct wl1251_partition mem;
1328c2ecf20Sopenharmony_ci	struct wl1251_partition reg;
1338c2ecf20Sopenharmony_ci};
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_cistruct wl1251;
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cistruct wl1251_stats {
1388c2ecf20Sopenharmony_ci	struct acx_statistics *fw_stats;
1398c2ecf20Sopenharmony_ci	unsigned long fw_stats_update;
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci	unsigned int retry_count;
1428c2ecf20Sopenharmony_ci	unsigned int excessive_retries;
1438c2ecf20Sopenharmony_ci};
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_cistruct wl1251_debugfs {
1468c2ecf20Sopenharmony_ci	struct dentry *rootdir;
1478c2ecf20Sopenharmony_ci	struct dentry *fw_statistics;
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci	struct dentry *tx_internal_desc_overflow;
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci	struct dentry *rx_out_of_mem;
1528c2ecf20Sopenharmony_ci	struct dentry *rx_hdr_overflow;
1538c2ecf20Sopenharmony_ci	struct dentry *rx_hw_stuck;
1548c2ecf20Sopenharmony_ci	struct dentry *rx_dropped;
1558c2ecf20Sopenharmony_ci	struct dentry *rx_fcs_err;
1568c2ecf20Sopenharmony_ci	struct dentry *rx_xfr_hint_trig;
1578c2ecf20Sopenharmony_ci	struct dentry *rx_path_reset;
1588c2ecf20Sopenharmony_ci	struct dentry *rx_reset_counter;
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci	struct dentry *dma_rx_requested;
1618c2ecf20Sopenharmony_ci	struct dentry *dma_rx_errors;
1628c2ecf20Sopenharmony_ci	struct dentry *dma_tx_requested;
1638c2ecf20Sopenharmony_ci	struct dentry *dma_tx_errors;
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci	struct dentry *isr_cmd_cmplt;
1668c2ecf20Sopenharmony_ci	struct dentry *isr_fiqs;
1678c2ecf20Sopenharmony_ci	struct dentry *isr_rx_headers;
1688c2ecf20Sopenharmony_ci	struct dentry *isr_rx_mem_overflow;
1698c2ecf20Sopenharmony_ci	struct dentry *isr_rx_rdys;
1708c2ecf20Sopenharmony_ci	struct dentry *isr_irqs;
1718c2ecf20Sopenharmony_ci	struct dentry *isr_tx_procs;
1728c2ecf20Sopenharmony_ci	struct dentry *isr_decrypt_done;
1738c2ecf20Sopenharmony_ci	struct dentry *isr_dma0_done;
1748c2ecf20Sopenharmony_ci	struct dentry *isr_dma1_done;
1758c2ecf20Sopenharmony_ci	struct dentry *isr_tx_exch_complete;
1768c2ecf20Sopenharmony_ci	struct dentry *isr_commands;
1778c2ecf20Sopenharmony_ci	struct dentry *isr_rx_procs;
1788c2ecf20Sopenharmony_ci	struct dentry *isr_hw_pm_mode_changes;
1798c2ecf20Sopenharmony_ci	struct dentry *isr_host_acknowledges;
1808c2ecf20Sopenharmony_ci	struct dentry *isr_pci_pm;
1818c2ecf20Sopenharmony_ci	struct dentry *isr_wakeups;
1828c2ecf20Sopenharmony_ci	struct dentry *isr_low_rssi;
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci	struct dentry *wep_addr_key_count;
1858c2ecf20Sopenharmony_ci	struct dentry *wep_default_key_count;
1868c2ecf20Sopenharmony_ci	/* skipping wep.reserved */
1878c2ecf20Sopenharmony_ci	struct dentry *wep_key_not_found;
1888c2ecf20Sopenharmony_ci	struct dentry *wep_decrypt_fail;
1898c2ecf20Sopenharmony_ci	struct dentry *wep_packets;
1908c2ecf20Sopenharmony_ci	struct dentry *wep_interrupt;
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ci	struct dentry *pwr_ps_enter;
1938c2ecf20Sopenharmony_ci	struct dentry *pwr_elp_enter;
1948c2ecf20Sopenharmony_ci	struct dentry *pwr_missing_bcns;
1958c2ecf20Sopenharmony_ci	struct dentry *pwr_wake_on_host;
1968c2ecf20Sopenharmony_ci	struct dentry *pwr_wake_on_timer_exp;
1978c2ecf20Sopenharmony_ci	struct dentry *pwr_tx_with_ps;
1988c2ecf20Sopenharmony_ci	struct dentry *pwr_tx_without_ps;
1998c2ecf20Sopenharmony_ci	struct dentry *pwr_rcvd_beacons;
2008c2ecf20Sopenharmony_ci	struct dentry *pwr_power_save_off;
2018c2ecf20Sopenharmony_ci	struct dentry *pwr_enable_ps;
2028c2ecf20Sopenharmony_ci	struct dentry *pwr_disable_ps;
2038c2ecf20Sopenharmony_ci	struct dentry *pwr_fix_tsf_ps;
2048c2ecf20Sopenharmony_ci	/* skipping cont_miss_bcns_spread for now */
2058c2ecf20Sopenharmony_ci	struct dentry *pwr_rcvd_awake_beacons;
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	struct dentry *mic_rx_pkts;
2088c2ecf20Sopenharmony_ci	struct dentry *mic_calc_failure;
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	struct dentry *aes_encrypt_fail;
2118c2ecf20Sopenharmony_ci	struct dentry *aes_decrypt_fail;
2128c2ecf20Sopenharmony_ci	struct dentry *aes_encrypt_packets;
2138c2ecf20Sopenharmony_ci	struct dentry *aes_decrypt_packets;
2148c2ecf20Sopenharmony_ci	struct dentry *aes_encrypt_interrupt;
2158c2ecf20Sopenharmony_ci	struct dentry *aes_decrypt_interrupt;
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ci	struct dentry *event_heart_beat;
2188c2ecf20Sopenharmony_ci	struct dentry *event_calibration;
2198c2ecf20Sopenharmony_ci	struct dentry *event_rx_mismatch;
2208c2ecf20Sopenharmony_ci	struct dentry *event_rx_mem_empty;
2218c2ecf20Sopenharmony_ci	struct dentry *event_rx_pool;
2228c2ecf20Sopenharmony_ci	struct dentry *event_oom_late;
2238c2ecf20Sopenharmony_ci	struct dentry *event_phy_transmit_error;
2248c2ecf20Sopenharmony_ci	struct dentry *event_tx_stuck;
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ci	struct dentry *ps_pspoll_timeouts;
2278c2ecf20Sopenharmony_ci	struct dentry *ps_upsd_timeouts;
2288c2ecf20Sopenharmony_ci	struct dentry *ps_upsd_max_sptime;
2298c2ecf20Sopenharmony_ci	struct dentry *ps_upsd_max_apturn;
2308c2ecf20Sopenharmony_ci	struct dentry *ps_pspoll_max_apturn;
2318c2ecf20Sopenharmony_ci	struct dentry *ps_pspoll_utilization;
2328c2ecf20Sopenharmony_ci	struct dentry *ps_upsd_utilization;
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci	struct dentry *rxpipe_rx_prep_beacon_drop;
2358c2ecf20Sopenharmony_ci	struct dentry *rxpipe_descr_host_int_trig_rx_data;
2368c2ecf20Sopenharmony_ci	struct dentry *rxpipe_beacon_buffer_thres_host_int_trig_rx_data;
2378c2ecf20Sopenharmony_ci	struct dentry *rxpipe_missed_beacon_host_int_trig_rx_data;
2388c2ecf20Sopenharmony_ci	struct dentry *rxpipe_tx_xfr_host_int_trig_rx_data;
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci	struct dentry *tx_queue_len;
2418c2ecf20Sopenharmony_ci	struct dentry *tx_queue_status;
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci	struct dentry *retry_count;
2448c2ecf20Sopenharmony_ci	struct dentry *excessive_retries;
2458c2ecf20Sopenharmony_ci};
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_cistruct wl1251_if_operations {
2488c2ecf20Sopenharmony_ci	void (*read)(struct wl1251 *wl, int addr, void *buf, size_t len);
2498c2ecf20Sopenharmony_ci	void (*write)(struct wl1251 *wl, int addr, void *buf, size_t len);
2508c2ecf20Sopenharmony_ci	void (*read_elp)(struct wl1251 *wl, int addr, u32 *val);
2518c2ecf20Sopenharmony_ci	void (*write_elp)(struct wl1251 *wl, int addr, u32 val);
2528c2ecf20Sopenharmony_ci	int  (*power)(struct wl1251 *wl, bool enable);
2538c2ecf20Sopenharmony_ci	void (*reset)(struct wl1251 *wl);
2548c2ecf20Sopenharmony_ci	void (*enable_irq)(struct wl1251 *wl);
2558c2ecf20Sopenharmony_ci	void (*disable_irq)(struct wl1251 *wl);
2568c2ecf20Sopenharmony_ci};
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_cistruct wl1251 {
2598c2ecf20Sopenharmony_ci	struct ieee80211_hw *hw;
2608c2ecf20Sopenharmony_ci	bool mac80211_registered;
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	void *if_priv;
2638c2ecf20Sopenharmony_ci	const struct wl1251_if_operations *if_ops;
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci	int power_gpio;
2668c2ecf20Sopenharmony_ci	int irq;
2678c2ecf20Sopenharmony_ci	bool use_eeprom;
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci	struct regulator *vio;
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci	spinlock_t wl_lock;
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci	enum wl1251_state state;
2748c2ecf20Sopenharmony_ci	struct mutex mutex;
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	int physical_mem_addr;
2778c2ecf20Sopenharmony_ci	int physical_reg_addr;
2788c2ecf20Sopenharmony_ci	int virtual_mem_addr;
2798c2ecf20Sopenharmony_ci	int virtual_reg_addr;
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	int cmd_box_addr;
2828c2ecf20Sopenharmony_ci	int event_box_addr;
2838c2ecf20Sopenharmony_ci	struct boot_attr boot_attr;
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci	u8 *fw;
2868c2ecf20Sopenharmony_ci	size_t fw_len;
2878c2ecf20Sopenharmony_ci	u8 *nvs;
2888c2ecf20Sopenharmony_ci	size_t nvs_len;
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci	u8 bssid[ETH_ALEN];
2918c2ecf20Sopenharmony_ci	u8 mac_addr[ETH_ALEN];
2928c2ecf20Sopenharmony_ci	u8 bss_type;
2938c2ecf20Sopenharmony_ci	u8 listen_int;
2948c2ecf20Sopenharmony_ci	int channel;
2958c2ecf20Sopenharmony_ci	bool monitor_present;
2968c2ecf20Sopenharmony_ci	bool joined;
2978c2ecf20Sopenharmony_ci
2988c2ecf20Sopenharmony_ci	void *target_mem_map;
2998c2ecf20Sopenharmony_ci	struct acx_data_path_params_resp *data_path;
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci	/* Number of TX packets transferred to the FW, modulo 16 */
3028c2ecf20Sopenharmony_ci	u32 data_in_count;
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci	/* Frames scheduled for transmission, not handled yet */
3058c2ecf20Sopenharmony_ci	struct sk_buff_head tx_queue;
3068c2ecf20Sopenharmony_ci	bool tx_queue_stopped;
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci	struct work_struct tx_work;
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_ci	/* Pending TX frames */
3118c2ecf20Sopenharmony_ci	struct sk_buff *tx_frames[16];
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci	/*
3148c2ecf20Sopenharmony_ci	 * Index pointing to the next TX complete entry
3158c2ecf20Sopenharmony_ci	 * in the cyclic XT complete array we get from
3168c2ecf20Sopenharmony_ci	 * the FW.
3178c2ecf20Sopenharmony_ci	 */
3188c2ecf20Sopenharmony_ci	u32 next_tx_complete;
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	/* FW Rx counter */
3218c2ecf20Sopenharmony_ci	u32 rx_counter;
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_ci	/* Rx frames handled */
3248c2ecf20Sopenharmony_ci	u32 rx_handled;
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ci	/* Current double buffer */
3278c2ecf20Sopenharmony_ci	u32 rx_current_buffer;
3288c2ecf20Sopenharmony_ci	u32 rx_last_id;
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci	/* The target interrupt mask */
3318c2ecf20Sopenharmony_ci	u32 intr_mask;
3328c2ecf20Sopenharmony_ci	struct work_struct irq_work;
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci	/* The mbox event mask */
3358c2ecf20Sopenharmony_ci	u32 event_mask;
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci	/* Mailbox pointers */
3388c2ecf20Sopenharmony_ci	u32 mbox_ptr[2];
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci	/* Are we currently scanning */
3418c2ecf20Sopenharmony_ci	bool scanning;
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_ci	/* Default key (for WEP) */
3448c2ecf20Sopenharmony_ci	u32 default_key;
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_ci	unsigned int tx_mgmt_frm_rate;
3478c2ecf20Sopenharmony_ci	unsigned int tx_mgmt_frm_mod;
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_ci	unsigned int rx_config;
3508c2ecf20Sopenharmony_ci	unsigned int rx_filter;
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ci	/* is firmware in elp mode */
3538c2ecf20Sopenharmony_ci	bool elp;
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci	struct delayed_work elp_work;
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_ci	enum wl1251_station_mode station_mode;
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	/* PSM mode requested */
3608c2ecf20Sopenharmony_ci	bool psm_requested;
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci	/* retry counter for PSM entries */
3638c2ecf20Sopenharmony_ci	u8 psm_entry_retry;
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci	u16 beacon_int;
3668c2ecf20Sopenharmony_ci	u8 dtim_period;
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci	/* in dBm */
3698c2ecf20Sopenharmony_ci	int power_level;
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci	int rssi_thold;
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci	struct wl1251_stats stats;
3748c2ecf20Sopenharmony_ci	struct wl1251_debugfs debugfs;
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci	__le32 buffer_32;
3778c2ecf20Sopenharmony_ci	u32 buffer_cmd;
3788c2ecf20Sopenharmony_ci	u8 buffer_busyword[WL1251_BUSY_WORD_LEN];
3798c2ecf20Sopenharmony_ci	struct wl1251_rx_descriptor *rx_descriptor;
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ci	struct ieee80211_vif *vif;
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	u32 chip_id;
3848c2ecf20Sopenharmony_ci	char fw_ver[21];
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci	/* Most recently reported noise in dBm */
3878c2ecf20Sopenharmony_ci	s8 noise;
3888c2ecf20Sopenharmony_ci};
3898c2ecf20Sopenharmony_ci
3908c2ecf20Sopenharmony_ciint wl1251_plt_start(struct wl1251 *wl);
3918c2ecf20Sopenharmony_ciint wl1251_plt_stop(struct wl1251 *wl);
3928c2ecf20Sopenharmony_ci
3938c2ecf20Sopenharmony_cistruct ieee80211_hw *wl1251_alloc_hw(void);
3948c2ecf20Sopenharmony_ciint wl1251_free_hw(struct wl1251 *wl);
3958c2ecf20Sopenharmony_ciint wl1251_init_ieee80211(struct wl1251 *wl);
3968c2ecf20Sopenharmony_civoid wl1251_enable_interrupts(struct wl1251 *wl);
3978c2ecf20Sopenharmony_civoid wl1251_disable_interrupts(struct wl1251 *wl);
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ci#define DEFAULT_HW_GEN_MODULATION_TYPE    CCK_LONG /* Long Preamble */
4008c2ecf20Sopenharmony_ci#define DEFAULT_HW_GEN_TX_RATE          RATE_2MBPS
4018c2ecf20Sopenharmony_ci#define JOIN_TIMEOUT 5000 /* 5000 milliseconds to join */
4028c2ecf20Sopenharmony_ci
4038c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_POWER_LEVEL 20
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci#define WL1251_TX_QUEUE_LOW_WATERMARK  10
4068c2ecf20Sopenharmony_ci#define WL1251_TX_QUEUE_HIGH_WATERMARK 25
4078c2ecf20Sopenharmony_ci
4088c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_BEACON_INT 100
4098c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_DTIM_PERIOD 1
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_CHANNEL 0
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_BET_CONSECUTIVE 10
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_ci#define CHIP_ID_1251_PG10	           (0x7010101)
4168c2ecf20Sopenharmony_ci#define CHIP_ID_1251_PG11	           (0x7020101)
4178c2ecf20Sopenharmony_ci#define CHIP_ID_1251_PG12	           (0x7030101)
4188c2ecf20Sopenharmony_ci#define CHIP_ID_1271_PG10	           (0x4030101)
4198c2ecf20Sopenharmony_ci#define CHIP_ID_1271_PG20	           (0x4030111)
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci#define WL1251_FW_NAME "ti-connectivity/wl1251-fw.bin"
4228c2ecf20Sopenharmony_ci#define WL1251_NVS_NAME "ti-connectivity/wl1251-nvs.bin"
4238c2ecf20Sopenharmony_ci
4248c2ecf20Sopenharmony_ci#define WL1251_POWER_ON_SLEEP 10 /* in milliseconds */
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci#define WL1251_PART_DOWN_MEM_START	0x0
4278c2ecf20Sopenharmony_ci#define WL1251_PART_DOWN_MEM_SIZE	0x16800
4288c2ecf20Sopenharmony_ci#define WL1251_PART_DOWN_REG_START	REGISTERS_BASE
4298c2ecf20Sopenharmony_ci#define WL1251_PART_DOWN_REG_SIZE	REGISTERS_DOWN_SIZE
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ci#define WL1251_PART_WORK_MEM_START	0x28000
4328c2ecf20Sopenharmony_ci#define WL1251_PART_WORK_MEM_SIZE	0x14000
4338c2ecf20Sopenharmony_ci#define WL1251_PART_WORK_REG_START	REGISTERS_BASE
4348c2ecf20Sopenharmony_ci#define WL1251_PART_WORK_REG_SIZE	REGISTERS_WORK_SIZE
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_LOW_RSSI_WEIGHT          10
4378c2ecf20Sopenharmony_ci#define WL1251_DEFAULT_LOW_RSSI_DEPTH           10
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_ci#endif
440