mirror of
https://github.com/torvalds/linux.git
synced 2024-12-23 11:21:33 +00:00
954ee164f4
This patch moves all firmware load responsibility into the interface-specific code and gets rid of the firmware pointer in the generic card structure. It also removes 3 fairly unecessary callbacks: hw_register_dev, hw_unregister_dev, and hw_prog_firmware. It also makes the init sequence from interface probe functions more logical, as there are paired add/remove and start/stop calls into generic libertas code. Because the USB driver code uses the same TX URB callback for both firmware upload (where the generic libertas structure isn't initialized yet) and for normal operation (where it is), some bits of USB code have to deal with 'priv' being NULL. All USB firmware upload bits have been changed to not require 'priv' at all, but simply the USB card structure. Signed-off-by: Dan Williams <dcbw@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
372 lines
8.2 KiB
C
372 lines
8.2 KiB
C
/**
|
|
* This file contains definitions and data structures specific
|
|
* to Marvell 802.11 NIC. It contains the Device Information
|
|
* structure wlan_adapter.
|
|
*/
|
|
#ifndef _WLAN_DEV_H_
|
|
#define _WLAN_DEV_H_
|
|
|
|
#include <linux/netdevice.h>
|
|
#include <linux/wireless.h>
|
|
#include <linux/ethtool.h>
|
|
#include <linux/debugfs.h>
|
|
#include <net/ieee80211.h>
|
|
|
|
#include "defs.h"
|
|
#include "scan.h"
|
|
|
|
extern struct ethtool_ops libertas_ethtool_ops;
|
|
|
|
#define MAX_BSSID_PER_CHANNEL 16
|
|
|
|
#define NR_TX_QUEUE 3
|
|
|
|
/* For the extended Scan */
|
|
#define MAX_EXTENDED_SCAN_BSSID_LIST MAX_BSSID_PER_CHANNEL * \
|
|
MRVDRV_MAX_CHANNEL_SIZE + 1
|
|
|
|
#define MAX_REGION_CHANNEL_NUM 2
|
|
|
|
/** Chan-freq-TxPower mapping table*/
|
|
struct chan_freq_power {
|
|
/** channel Number */
|
|
u16 channel;
|
|
/** frequency of this channel */
|
|
u32 freq;
|
|
/** Max allowed Tx power level */
|
|
u16 maxtxpower;
|
|
/** TRUE:channel unsupported; FLASE:supported*/
|
|
u8 unsupported;
|
|
};
|
|
|
|
/** region-band mapping table*/
|
|
struct region_channel {
|
|
/** TRUE if this entry is valid */
|
|
u8 valid;
|
|
/** region code for US, Japan ... */
|
|
u8 region;
|
|
/** band B/G/A, used for BAND_CONFIG cmd */
|
|
u8 band;
|
|
/** Actual No. of elements in the array below */
|
|
u8 nrcfp;
|
|
/** chan-freq-txpower mapping table*/
|
|
struct chan_freq_power *CFP;
|
|
};
|
|
|
|
struct wlan_802_11_security {
|
|
u8 WPAenabled;
|
|
u8 WPA2enabled;
|
|
u8 wep_enabled;
|
|
u8 auth_mode;
|
|
};
|
|
|
|
/** Current Basic Service Set State Structure */
|
|
struct current_bss_params {
|
|
/** bssid */
|
|
u8 bssid[ETH_ALEN];
|
|
/** ssid */
|
|
u8 ssid[IW_ESSID_MAX_SIZE + 1];
|
|
u8 ssid_len;
|
|
|
|
/** band */
|
|
u8 band;
|
|
/** channel */
|
|
u8 channel;
|
|
/** zero-terminated array of supported data rates */
|
|
u8 rates[MAX_RATES + 1];
|
|
};
|
|
|
|
/** sleep_params */
|
|
struct sleep_params {
|
|
u16 sp_error;
|
|
u16 sp_offset;
|
|
u16 sp_stabletime;
|
|
u8 sp_calcontrol;
|
|
u8 sp_extsleepclk;
|
|
u16 sp_reserved;
|
|
};
|
|
|
|
/* Mesh statistics */
|
|
struct wlan_mesh_stats {
|
|
u32 fwd_bcast_cnt; /* Fwd: Broadcast counter */
|
|
u32 fwd_unicast_cnt; /* Fwd: Unicast counter */
|
|
u32 fwd_drop_ttl; /* Fwd: TTL zero */
|
|
u32 fwd_drop_rbt; /* Fwd: Recently Broadcasted */
|
|
u32 fwd_drop_noroute; /* Fwd: No route to Destination */
|
|
u32 fwd_drop_nobuf; /* Fwd: Run out of internal buffers */
|
|
u32 drop_blind; /* Rx: Dropped by blinding table */
|
|
u32 tx_failed_cnt; /* Tx: Failed transmissions */
|
|
};
|
|
|
|
/** Private structure for the MV device */
|
|
struct _wlan_private {
|
|
int open;
|
|
int mesh_open;
|
|
int infra_open;
|
|
int mesh_autostart_enabled;
|
|
__le16 boot2_version;
|
|
|
|
char name[DEV_NAME_LEN];
|
|
|
|
void *card;
|
|
wlan_adapter *adapter;
|
|
struct net_device *dev;
|
|
|
|
struct net_device_stats stats;
|
|
struct net_device *mesh_dev; /* Virtual device */
|
|
struct net_device *rtap_net_dev;
|
|
struct ieee80211_device *ieee;
|
|
|
|
struct iw_statistics wstats;
|
|
struct wlan_mesh_stats mstats;
|
|
struct dentry *debugfs_dir;
|
|
struct dentry *debugfs_debug;
|
|
struct dentry *debugfs_files[6];
|
|
|
|
struct dentry *events_dir;
|
|
struct dentry *debugfs_events_files[6];
|
|
|
|
struct dentry *regs_dir;
|
|
struct dentry *debugfs_regs_files[6];
|
|
|
|
u32 mac_offset;
|
|
u32 bbp_offset;
|
|
u32 rf_offset;
|
|
|
|
/** Upload length */
|
|
u32 upld_len;
|
|
/* Upload buffer */
|
|
u8 upld_buf[WLAN_UPLD_SIZE];
|
|
/* Download sent:
|
|
bit0 1/0=data_sent/data_tx_done,
|
|
bit1 1/0=cmd_sent/cmd_tx_done,
|
|
all other bits reserved 0 */
|
|
u8 dnld_sent;
|
|
|
|
struct device *hotplug_device;
|
|
|
|
/** thread to service interrupts */
|
|
struct task_struct *main_thread;
|
|
wait_queue_head_t waitq;
|
|
struct workqueue_struct *work_thread;
|
|
|
|
struct delayed_work scan_work;
|
|
struct delayed_work assoc_work;
|
|
struct work_struct sync_channel;
|
|
|
|
/** Hardware access */
|
|
int (*hw_host_to_card) (wlan_private * priv, u8 type, u8 * payload, u16 nb);
|
|
int (*hw_get_int_status) (wlan_private * priv, u8 *);
|
|
int (*hw_read_event_cause) (wlan_private *);
|
|
};
|
|
|
|
/** Association request
|
|
*
|
|
* Encapsulates all the options that describe a specific assocation request
|
|
* or configuration of the wireless card's radio, mode, and security settings.
|
|
*/
|
|
struct assoc_request {
|
|
#define ASSOC_FLAG_SSID 1
|
|
#define ASSOC_FLAG_CHANNEL 2
|
|
#define ASSOC_FLAG_BAND 3
|
|
#define ASSOC_FLAG_MODE 4
|
|
#define ASSOC_FLAG_BSSID 5
|
|
#define ASSOC_FLAG_WEP_KEYS 6
|
|
#define ASSOC_FLAG_WEP_TX_KEYIDX 7
|
|
#define ASSOC_FLAG_WPA_MCAST_KEY 8
|
|
#define ASSOC_FLAG_WPA_UCAST_KEY 9
|
|
#define ASSOC_FLAG_SECINFO 10
|
|
#define ASSOC_FLAG_WPA_IE 11
|
|
unsigned long flags;
|
|
|
|
u8 ssid[IW_ESSID_MAX_SIZE + 1];
|
|
u8 ssid_len;
|
|
u8 channel;
|
|
u8 band;
|
|
u8 mode;
|
|
u8 bssid[ETH_ALEN];
|
|
|
|
/** WEP keys */
|
|
struct enc_key wep_keys[4];
|
|
u16 wep_tx_keyidx;
|
|
|
|
/** WPA keys */
|
|
struct enc_key wpa_mcast_key;
|
|
struct enc_key wpa_unicast_key;
|
|
|
|
struct wlan_802_11_security secinfo;
|
|
|
|
/** WPA Information Elements*/
|
|
u8 wpa_ie[MAX_WPA_IE_LEN];
|
|
u8 wpa_ie_len;
|
|
|
|
/* BSS to associate with for infrastructure of Ad-Hoc join */
|
|
struct bss_descriptor bss;
|
|
};
|
|
|
|
/** Wlan adapter data structure*/
|
|
struct _wlan_adapter {
|
|
/** STATUS variables */
|
|
u8 fwreleasenumber[4];
|
|
u32 fwcapinfo;
|
|
/* protected with big lock */
|
|
|
|
struct mutex lock;
|
|
|
|
u8 tmptxbuf[WLAN_UPLD_SIZE];
|
|
/* protected by hard_start_xmit serialization */
|
|
|
|
/** command-related variables */
|
|
u16 seqnum;
|
|
/* protected by big lock */
|
|
|
|
struct cmd_ctrl_node *cmd_array;
|
|
/** Current command */
|
|
struct cmd_ctrl_node *cur_cmd;
|
|
int cur_cmd_retcode;
|
|
/** command Queues */
|
|
/** Free command buffers */
|
|
struct list_head cmdfreeq;
|
|
/** Pending command buffers */
|
|
struct list_head cmdpendingq;
|
|
|
|
wait_queue_head_t cmd_pending;
|
|
u8 nr_cmd_pending;
|
|
/* command related variables protected by adapter->driver_lock */
|
|
|
|
/** Async and Sync Event variables */
|
|
u32 intcounter;
|
|
u32 eventcause;
|
|
u8 nodename[16]; /* nickname */
|
|
|
|
/** spin locks */
|
|
spinlock_t driver_lock;
|
|
|
|
/** Timers */
|
|
struct timer_list command_timer;
|
|
|
|
/* TX queue used in PS mode */
|
|
spinlock_t txqueue_lock;
|
|
struct sk_buff *tx_queue_ps[NR_TX_QUEUE];
|
|
unsigned int tx_queue_idx;
|
|
|
|
u8 hisregcpy;
|
|
|
|
/** current ssid/bssid related parameters*/
|
|
struct current_bss_params curbssparams;
|
|
|
|
/* IW_MODE_* */
|
|
u8 mode;
|
|
|
|
/* Scan results list */
|
|
struct list_head network_list;
|
|
struct list_head network_free_list;
|
|
struct bss_descriptor *networks;
|
|
|
|
u8 adhoccreate;
|
|
|
|
/** capability Info used in Association, start, join */
|
|
u16 capability;
|
|
|
|
/** MAC address information */
|
|
u8 current_addr[ETH_ALEN];
|
|
u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN];
|
|
u32 nr_of_multicastmacaddr;
|
|
|
|
/** 802.11 statistics */
|
|
// struct cmd_DS_802_11_GET_STAT wlan802_11Stat;
|
|
|
|
u16 enablehwauto;
|
|
u16 ratebitmap;
|
|
|
|
u32 fragthsd;
|
|
u32 rtsthsd;
|
|
|
|
u8 txretrycount;
|
|
|
|
/** Tx-related variables (for single packet tx) */
|
|
struct sk_buff *currenttxskb;
|
|
u16 TxLockFlag;
|
|
|
|
/** NIC Operation characteristics */
|
|
u16 currentpacketfilter;
|
|
u32 connect_status;
|
|
u16 regioncode;
|
|
u16 txpowerlevel;
|
|
|
|
/** POWER MANAGEMENT AND PnP SUPPORT */
|
|
u8 surpriseremoved;
|
|
|
|
u16 psmode; /* Wlan802_11PowermodeCAM=disable
|
|
Wlan802_11PowermodeMAX_PSP=enable */
|
|
u32 psstate;
|
|
u8 needtowakeup;
|
|
|
|
struct PS_CMD_ConfirmSleep libertas_ps_confirm_sleep;
|
|
|
|
struct assoc_request * pending_assoc_req;
|
|
struct assoc_request * in_progress_assoc_req;
|
|
|
|
/** Encryption parameter */
|
|
struct wlan_802_11_security secinfo;
|
|
|
|
/** WEP keys */
|
|
struct enc_key wep_keys[4];
|
|
u16 wep_tx_keyidx;
|
|
|
|
/** WPA keys */
|
|
struct enc_key wpa_mcast_key;
|
|
struct enc_key wpa_unicast_key;
|
|
|
|
/** WPA Information Elements*/
|
|
u8 wpa_ie[MAX_WPA_IE_LEN];
|
|
u8 wpa_ie_len;
|
|
|
|
/** Requested Signal Strength*/
|
|
u16 SNR[MAX_TYPE_B][MAX_TYPE_AVG];
|
|
u16 NF[MAX_TYPE_B][MAX_TYPE_AVG];
|
|
u8 RSSI[MAX_TYPE_B][MAX_TYPE_AVG];
|
|
u8 rawSNR[DEFAULT_DATA_AVG_FACTOR];
|
|
u8 rawNF[DEFAULT_DATA_AVG_FACTOR];
|
|
u16 nextSNRNF;
|
|
u16 numSNRNF;
|
|
|
|
u8 radioon;
|
|
u32 preamble;
|
|
|
|
/** data rate stuff */
|
|
u8 cur_rate;
|
|
u8 auto_rate;
|
|
|
|
/** sleep_params */
|
|
struct sleep_params sp;
|
|
|
|
/** RF calibration data */
|
|
|
|
#define MAX_REGION_CHANNEL_NUM 2
|
|
/** region channel data */
|
|
struct region_channel region_channel[MAX_REGION_CHANNEL_NUM];
|
|
|
|
struct region_channel universal_channel[MAX_REGION_CHANNEL_NUM];
|
|
|
|
/** 11D and Domain Regulatory Data */
|
|
struct wlan_802_11d_domain_reg domainreg;
|
|
struct parsed_region_chan_11d parsed_region_chan;
|
|
|
|
/** FSM variable for 11d support */
|
|
u32 enable11d;
|
|
|
|
/** MISCELLANEOUS */
|
|
u8 *prdeeprom;
|
|
struct wlan_offset_value offsetvalue;
|
|
|
|
struct cmd_ds_802_11_get_log logmsg;
|
|
|
|
u32 monitormode;
|
|
u8 fw_ready;
|
|
|
|
u8 last_scanned_channel;
|
|
};
|
|
|
|
#endif /* _WLAN_DEV_H_ */
|