diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl12xx.h')
| -rw-r--r-- | drivers/net/wireless/wl12xx/wl12xx.h | 386 | 
1 files changed, 190 insertions, 196 deletions
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h index 1ec90fc7505..b2b09cd0202 100644 --- a/drivers/net/wireless/wl12xx/wl12xx.h +++ b/drivers/net/wireless/wl12xx/wl12xx.h @@ -35,83 +35,6 @@  #include "conf.h"  #include "ini.h" -#define DRIVER_NAME "wl1271" -#define DRIVER_PREFIX DRIVER_NAME ": " - -/* - * FW versions support BA 11n - * versions marks x.x.x.50-60.x - */ -#define WL12XX_BA_SUPPORT_FW_COST_VER2_START    50 -#define WL12XX_BA_SUPPORT_FW_COST_VER2_END      60 - -enum { -	DEBUG_NONE	= 0, -	DEBUG_IRQ	= BIT(0), -	DEBUG_SPI	= BIT(1), -	DEBUG_BOOT	= BIT(2), -	DEBUG_MAILBOX	= BIT(3), -	DEBUG_TESTMODE	= BIT(4), -	DEBUG_EVENT	= BIT(5), -	DEBUG_TX	= BIT(6), -	DEBUG_RX	= BIT(7), -	DEBUG_SCAN	= BIT(8), -	DEBUG_CRYPT	= BIT(9), -	DEBUG_PSM	= BIT(10), -	DEBUG_MAC80211	= BIT(11), -	DEBUG_CMD	= BIT(12), -	DEBUG_ACX	= BIT(13), -	DEBUG_SDIO	= BIT(14), -	DEBUG_FILTERS   = BIT(15), -	DEBUG_ADHOC     = BIT(16), -	DEBUG_AP	= BIT(17), -	DEBUG_MASTER	= (DEBUG_ADHOC | DEBUG_AP), -	DEBUG_ALL	= ~0, -}; - -extern u32 wl12xx_debug_level; - -#define DEBUG_DUMP_LIMIT 1024 - -#define wl1271_error(fmt, arg...) \ -	pr_err(DRIVER_PREFIX "ERROR " fmt "\n", ##arg) - -#define wl1271_warning(fmt, arg...) \ -	pr_warning(DRIVER_PREFIX "WARNING " fmt "\n", ##arg) - -#define wl1271_notice(fmt, arg...) \ -	pr_info(DRIVER_PREFIX fmt "\n", ##arg) - -#define wl1271_info(fmt, arg...) \ -	pr_info(DRIVER_PREFIX fmt "\n", ##arg) - -#define wl1271_debug(level, fmt, arg...) \ -	do { \ -		if (level & wl12xx_debug_level) \ -			pr_debug(DRIVER_PREFIX fmt "\n", ##arg); \ -	} while (0) - -/* TODO: use pr_debug_hex_dump when it will be available */ -#define wl1271_dump(level, prefix, buf, len)	\ -	do { \ -		if (level & wl12xx_debug_level) \ -			print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \ -				       DUMP_PREFIX_OFFSET, 16, 1,	\ -				       buf,				\ -				       min_t(size_t, len, DEBUG_DUMP_LIMIT), \ -				       0);				\ -	} while (0) - -#define wl1271_dump_ascii(level, prefix, buf, len)	\ -	do { \ -		if (level & wl12xx_debug_level) \ -			print_hex_dump(KERN_DEBUG, DRIVER_PREFIX prefix, \ -				       DUMP_PREFIX_OFFSET, 16, 1,	\ -				       buf,				\ -				       min_t(size_t, len, DEBUG_DUMP_LIMIT), \ -				       true);				\ -	} while (0) -  #define WL127X_FW_NAME "ti-connectivity/wl127x-fw-3.bin"  #define WL128X_FW_NAME "ti-connectivity/wl128x-fw-3.bin" @@ -142,16 +65,12 @@ extern u32 wl12xx_debug_level;  #define WL12XX_INVALID_ROLE_ID     0xff  #define WL12XX_INVALID_LINK_ID     0xff +#define WL12XX_MAX_RATE_POLICIES 16 +  /* Defined by FW as 0. Will not be freed or allocated. */  #define WL12XX_SYSTEM_HLID         0  /* - * TODO: we currently don't support multirole. remove - * this constant from the code when we do. - */ -#define WL1271_AP_STA_HLID_START   3 - -/*   * 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 @@ -236,13 +155,6 @@ struct wl1271_stats {  #define AP_MAX_STATIONS            8 -/* Broadcast and Global links + system link + links to stations */ -/* - * TODO: when WL1271_AP_STA_HLID_START is no longer constant, change all - * the places that use this. - */ -#define AP_MAX_LINKS               (AP_MAX_STATIONS + WL1271_AP_STA_HLID_START) -  /* FW status registers */  struct wl12xx_fw_status {  	__le32 intr; @@ -299,17 +211,14 @@ struct wl1271_scan {  };  struct wl1271_if_operations { -	void (*read)(struct wl1271 *wl, int addr, void *buf, size_t len, +	void (*read)(struct device *child, int addr, void *buf, size_t len,  		     bool fixed); -	void (*write)(struct wl1271 *wl, int addr, void *buf, size_t len, +	void (*write)(struct device *child, int addr, void *buf, size_t len,  		     bool fixed); -	void (*reset)(struct wl1271 *wl); -	void (*init)(struct wl1271 *wl); -	int (*power)(struct wl1271 *wl, bool enable); -	struct device* (*dev)(struct wl1271 *wl); -	void (*enable_irq)(struct wl1271 *wl); -	void (*disable_irq)(struct wl1271 *wl); -	void (*set_block_size) (struct wl1271 *wl, unsigned int blksz); +	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);  };  #define MAX_NUM_KEYS 14 @@ -326,29 +235,33 @@ struct wl1271_ap_key {  };  enum wl12xx_flags { -	WL1271_FLAG_STA_ASSOCIATED, -	WL1271_FLAG_IBSS_JOINED,  	WL1271_FLAG_GPIO_POWER,  	WL1271_FLAG_TX_QUEUE_STOPPED,  	WL1271_FLAG_TX_PENDING,  	WL1271_FLAG_IN_ELP,  	WL1271_FLAG_ELP_REQUESTED, -	WL1271_FLAG_PSM, -	WL1271_FLAG_PSM_REQUESTED,  	WL1271_FLAG_IRQ_RUNNING, -	WL1271_FLAG_IDLE, -	WL1271_FLAG_PSPOLL_FAILURE, -	WL1271_FLAG_STA_STATE_SENT,  	WL1271_FLAG_FW_TX_BUSY, -	WL1271_FLAG_AP_STARTED, -	WL1271_FLAG_IF_INITIALIZED,  	WL1271_FLAG_DUMMY_PACKET_PENDING,  	WL1271_FLAG_SUSPENDED,  	WL1271_FLAG_PENDING_WORK,  	WL1271_FLAG_SOFT_GEMINI, -	WL1271_FLAG_RX_STREAMING_STARTED,  	WL1271_FLAG_RECOVERY_IN_PROGRESS, -	WL1271_FLAG_CS_PROGRESS, +}; + +enum wl12xx_vif_flags { +	WLVIF_FLAG_INITIALIZED, +	WLVIF_FLAG_STA_ASSOCIATED, +	WLVIF_FLAG_IBSS_JOINED, +	WLVIF_FLAG_AP_STARTED, +	WLVIF_FLAG_PSM, +	WLVIF_FLAG_PSM_REQUESTED, +	WLVIF_FLAG_STA_STATE_SENT, +	WLVIF_FLAG_RX_STREAMING_STARTED, +	WLVIF_FLAG_PSPOLL_FAILURE, +	WLVIF_FLAG_CS_PROGRESS, +	WLVIF_FLAG_AP_PROBE_RESP_SET, +	WLVIF_FLAG_IN_USE,  };  struct wl1271_link { @@ -366,10 +279,11 @@ struct wl1271_link {  };  struct wl1271 { -	struct platform_device *plat_dev;  	struct ieee80211_hw *hw;  	bool mac80211_registered; +	struct device *dev; +  	void *if_priv;  	struct wl1271_if_operations *if_ops; @@ -399,25 +313,20 @@ struct wl1271 {  	s8 hw_pg_ver; -	u8 bssid[ETH_ALEN];  	u8 mac_addr[ETH_ALEN]; -	u8 bss_type; -	u8 set_bss_type; -	u8 p2p; /* we are using p2p role */ -	u8 ssid[IEEE80211_MAX_SSID_LEN + 1]; -	u8 ssid_len;  	int channel; -	u8 role_id; -	u8 dev_role_id;  	u8 system_hlid; -	u8 sta_hlid; -	u8 dev_hlid; -	u8 ap_global_hlid; -	u8 ap_bcast_hlid;  	unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];  	unsigned long roles_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];  	unsigned long roc_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)]; +	unsigned long rate_policies_map[ +			BITS_TO_LONGS(WL12XX_MAX_RATE_POLICIES)]; + +	struct list_head wlvif_list; + +	u8 sta_count; +	u8 ap_count;  	struct wl1271_acx_mem_map *target_mem_map; @@ -440,11 +349,7 @@ struct wl1271 {  	/* Time-offset between host and chipset clocks */  	s64 time_offset; -	/* Session counter for the chipset */ -	int session_counter; -  	/* Frames scheduled for transmission, not handled yet */ -	struct sk_buff_head tx_queue[NUM_TX_QUEUES];  	int tx_queue_count[NUM_TX_QUEUES];  	long stopped_queues_map; @@ -462,17 +367,6 @@ struct wl1271 {  	struct sk_buff *tx_frames[ACX_TX_DESCRIPTORS];  	int tx_frames_cnt; -	/* -	 * Security sequence number -	 *     bits 0-15: lower 16 bits part of sequence number -	 *     bits 16-47: higher 32 bits part of sequence number -	 *     bits 48-63: not in use -	 */ -	u64 tx_security_seq; - -	/* 8 bits of the last sequence number in use */ -	u8 tx_security_last_seq_lsb; -  	/* FW Rx counter */  	u32 rx_counter; @@ -507,59 +401,21 @@ struct wl1271 {  	u32 mbox_ptr[2];  	/* Are we currently scanning */ +	struct ieee80211_vif *scan_vif;  	struct wl1271_scan scan;  	struct delayed_work scan_complete_work;  	bool sched_scanning; -	/* probe-req template for the current AP */ -	struct sk_buff *probereq; - -	/* Our association ID */ -	u16 aid; - -	/* -	 * 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_set; -	u32 basic_rate; -	u32 rate_set; -	u32 bitrate_masks[IEEE80211_NUM_BANDS]; -  	/* The current band */  	enum ieee80211_band band; -	/* Beaconing interval (needed for ad-hoc) */ -	u32 beacon_int; - -	/* Default key (for WEP) */ -	u32 default_key; - -	/* Rx Streaming */ -	struct work_struct rx_streaming_enable_work; -	struct work_struct rx_streaming_disable_work; -	struct timer_list rx_streaming_timer; -  	struct completion *elp_compl; -	struct completion *ps_compl;  	struct delayed_work elp_work; -	struct delayed_work pspoll_work; - -	/* counter for ps-poll delivery failures */ -	int ps_poll_failures; - -	/* retry counter for PSM entries */ -	u8 psm_entry_retry;  	/* in dBm */  	int power_level; -	int rssi_thold; -	int last_rssi_event; -  	struct wl1271_stats stats;  	__le32 buffer_32; @@ -583,20 +439,9 @@ struct wl1271 {  	/* Most recently reported noise in dBm */  	s8 noise; -	/* map for HLIDs of associated stations - when operating in AP mode */ -	unsigned long ap_hlid_map[BITS_TO_LONGS(AP_MAX_STATIONS)]; - -	/* recoreded keys for AP-mode - set here before AP startup */ -	struct wl1271_ap_key *recorded_ap_keys[MAX_NUM_KEYS]; -  	/* bands supported by this instance of wl12xx */  	struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; -	/* RX BA constraint value */ -	bool ba_support; -	u8 ba_rx_bitmap; -	bool ba_allowed; -  	int tcxo_clock;  	/* @@ -610,10 +455,7 @@ struct wl1271 {  	 * AP-mode - links indexed by HLID. The global and broadcast links  	 * are always active.  	 */ -	struct wl1271_link links[AP_MAX_LINKS]; - -	/* the hlid of the link where the last transmitted skb came from */ -	int last_tx_hlid; +	struct wl1271_link links[WL12XX_MAX_LINKS];  	/* AP-mode - a bitmap of links currently in PS mode according to FW */  	u32 ap_fw_ps_map; @@ -632,21 +474,173 @@ struct wl1271 {  	/* AP-mode - number of currently connected stations */  	int active_sta_count; + +	/* last wlvif we transmitted from */ +	struct wl12xx_vif *last_wlvif;  };  struct wl1271_station {  	u8 hlid;  }; +struct wl12xx_vif { +	struct wl1271 *wl; +	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 ba_rx_bitmap; + +			u8 basic_rate_idx; +			u8 ap_rate_idx; +			u8 p2p_rate_idx; +		} sta; +		struct { +			u8 global_hlid; +			u8 bcast_hlid; + +			/* HLIDs bitmap of associated stations */ +			unsigned long sta_hlid_map[BITS_TO_LONGS( +							WL12XX_MAX_LINKS)]; + +			/* recoreded keys - set here before AP startup */ +			struct wl1271_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; + +	unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)]; + +	u8 ssid[IEEE80211_MAX_SSID_LEN + 1]; +	u8 ssid_len; + +	/* The current band */ +	enum ieee80211_band band; +	int channel; + +	u32 bitrate_masks[IEEE80211_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; + +	/* Session counter for the chipset */ +	int session_counter; + +	struct completion *ps_compl; +	struct delayed_work pspoll_work; + +	/* counter for ps-poll delivery failures */ +	int ps_poll_failures; + +	/* retry counter for PSM entries */ +	u8 psm_entry_retry; + +	/* in dBm */ +	int power_level; + +	int rssi_thold; +	int last_rssi_event; + +	/* RX BA constraint value */ +	bool ba_support; +	bool ba_allowed; + +	/* Rx Streaming */ +	struct work_struct rx_streaming_enable_work; +	struct work_struct rx_streaming_disable_work; +	struct timer_list rx_streaming_timer; + +	/* +	 * This struct must be last! +	 * data that has to be saved acrossed reconfigs (e.g. recovery) +	 * should be declared in this struct. +	 */ +	struct { +		u8 persistent[0]; +		/* +		 * Security sequence number +		 *     bits 0-15: lower 16 bits part of sequence number +		 *     bits 16-47: higher 32 bits part of sequence number +		 *     bits 48-63: not in use +		 */ +		u64 tx_security_seq; + +		/* 8 bits of the last sequence number in use */ +		u8 tx_security_last_seq_lsb; +	}; +}; + +static inline struct wl12xx_vif *wl12xx_vif_to_data(struct ieee80211_vif *vif) +{ +	return (struct wl12xx_vif *)vif->drv_priv; +} + +static inline +struct ieee80211_vif *wl12xx_wlvif_to_vif(struct wl12xx_vif *wlvif) +{ +	return container_of((void *)wlvif, struct ieee80211_vif, drv_priv); +} + +#define wl12xx_for_each_wlvif(wl, wlvif) \ +		list_for_each_entry(wlvif, &wl->wlvif_list, list) + +#define wl12xx_for_each_wlvif_continue(wl, wlvif) \ +		list_for_each_entry_continue(wlvif, &wl->wlvif_list, list) + +#define wl12xx_for_each_wlvif_bss_type(wl, wlvif, _bss_type)	\ +		wl12xx_for_each_wlvif(wl, wlvif)		\ +			if (wlvif->bss_type == _bss_type) + +#define wl12xx_for_each_wlvif_sta(wl, wlvif)	\ +		wl12xx_for_each_wlvif_bss_type(wl, wlvif, BSS_TYPE_STA_BSS) + +#define wl12xx_for_each_wlvif_ap(wl, wlvif)	\ +		wl12xx_for_each_wlvif_bss_type(wl, wlvif, BSS_TYPE_AP_BSS) +  int wl1271_plt_start(struct wl1271 *wl);  int wl1271_plt_stop(struct wl1271 *wl); -int wl1271_recalc_rx_streaming(struct wl1271 *wl); +int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif);  void wl12xx_queue_recovery_work(struct wl1271 *wl);  size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen);  #define JOIN_TIMEOUT 5000 /* 5000 milliseconds to join */ -#define SESSION_COUNTER_MAX 7 /* maximum value for the session counter */ +#define SESSION_COUNTER_MAX 6 /* maximum value for the session counter */ +#define SESSION_COUNTER_INVALID 7 /* used with dummy_packet */  #define WL1271_DEFAULT_POWER_LEVEL 0 @@ -669,8 +663,8 @@ size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen);  /* Each RX/TX transaction requires an end-of-transaction transfer */  #define WL12XX_QUIRK_END_OF_TRANSACTION		BIT(0) -/* WL128X requires aggregated packets to be aligned to the SDIO block size */ -#define WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT	BIT(2) +/* wl127x and SPI don't support SDIO block size alignment */ +#define WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT	BIT(2)  /* Older firmwares did not implement the FW logger over bus feature */  #define WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED	BIT(4)  |