|
@@ -22,7 +22,226 @@
|
|
|
#ifndef __WLCORE_H__
|
|
|
#define __WLCORE_H__
|
|
|
|
|
|
+#include <linux/platform_device.h>
|
|
|
+
|
|
|
#include "wl12xx.h"
|
|
|
+#include "event.h"
|
|
|
+
|
|
|
+struct wlcore_ops {
|
|
|
+};
|
|
|
+
|
|
|
+struct wl1271 {
|
|
|
+ struct ieee80211_hw *hw;
|
|
|
+ bool mac80211_registered;
|
|
|
+
|
|
|
+ struct device *dev;
|
|
|
+
|
|
|
+ void *if_priv;
|
|
|
+
|
|
|
+ struct wl1271_if_operations *if_ops;
|
|
|
+
|
|
|
+ void (*set_power)(bool enable);
|
|
|
+ int irq;
|
|
|
+ int ref_clock;
|
|
|
+
|
|
|
+ spinlock_t wl_lock;
|
|
|
+
|
|
|
+ enum wl1271_state state;
|
|
|
+ enum wl12xx_fw_type fw_type;
|
|
|
+ bool plt;
|
|
|
+ u8 last_vif_count;
|
|
|
+ struct mutex mutex;
|
|
|
+
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ struct wl1271_partition_set part;
|
|
|
+
|
|
|
+ struct wl1271_chip chip;
|
|
|
+
|
|
|
+ int cmd_box_addr;
|
|
|
+ int event_box_addr;
|
|
|
+
|
|
|
+ u8 *fw;
|
|
|
+ size_t fw_len;
|
|
|
+ void *nvs;
|
|
|
+ size_t nvs_len;
|
|
|
+
|
|
|
+ s8 hw_pg_ver;
|
|
|
+
|
|
|
+ /* address read from the fuse ROM */
|
|
|
+ u32 fuse_oui_addr;
|
|
|
+ u32 fuse_nic_addr;
|
|
|
+
|
|
|
+ /* we have up to 2 MAC addresses */
|
|
|
+ struct mac_address addresses[2];
|
|
|
+ int channel;
|
|
|
+ u8 system_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;
|
|
|
+
|
|
|
+ /* Accounting for allocated / available TX blocks on HW */
|
|
|
+ u32 tx_blocks_freed;
|
|
|
+ u32 tx_blocks_available;
|
|
|
+ u32 tx_allocated_blocks;
|
|
|
+ u32 tx_results_count;
|
|
|
+
|
|
|
+ /* amount of spare TX blocks to use */
|
|
|
+ u32 tx_spare_blocks;
|
|
|
+
|
|
|
+ /* Accounting for allocated / available Tx packets in HW */
|
|
|
+ u32 tx_pkts_freed[NUM_TX_QUEUES];
|
|
|
+ u32 tx_allocated_pkts[NUM_TX_QUEUES];
|
|
|
+
|
|
|
+ /* Transmitted TX packets counter for chipset interface */
|
|
|
+ u32 tx_packets_count;
|
|
|
+
|
|
|
+ /* Time-offset between host and chipset clocks */
|
|
|
+ s64 time_offset;
|
|
|
+
|
|
|
+ /* Frames scheduled for transmission, not handled yet */
|
|
|
+ int tx_queue_count[NUM_TX_QUEUES];
|
|
|
+ long stopped_queues_map;
|
|
|
+
|
|
|
+ /* 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;
|
|
|
+
|
|
|
+ /* Pending TX frames */
|
|
|
+ unsigned long tx_frames_map[BITS_TO_LONGS(ACX_TX_DESCRIPTORS)];
|
|
|
+ struct sk_buff *tx_frames[ACX_TX_DESCRIPTORS];
|
|
|
+ int tx_frames_cnt;
|
|
|
+
|
|
|
+ /* FW Rx counter */
|
|
|
+ u32 rx_counter;
|
|
|
+
|
|
|
+ /* Rx memory pool address */
|
|
|
+ struct wl1271_rx_mem_pool_addr rx_mem_pool_addr;
|
|
|
+
|
|
|
+ /* Intermediate buffer, used for packet aggregation */
|
|
|
+ u8 *aggr_buf;
|
|
|
+
|
|
|
+ /* 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;
|
|
|
+
|
|
|
+ /* Sysfs FW log entry readers wait queue */
|
|
|
+ wait_queue_head_t fwlog_waitq;
|
|
|
+
|
|
|
+ /* Hardware recovery work */
|
|
|
+ struct work_struct recovery_work;
|
|
|
+
|
|
|
+ /* Pointer that holds DMA-friendly block for the mailbox */
|
|
|
+ struct event_mailbox *mbox;
|
|
|
+
|
|
|
+ /* The mbox event mask */
|
|
|
+ u32 event_mask;
|
|
|
+
|
|
|
+ /* Mailbox pointers */
|
|
|
+ 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;
|
|
|
+
|
|
|
+ /* The current band */
|
|
|
+ enum ieee80211_band band;
|
|
|
+
|
|
|
+ struct completion *elp_compl;
|
|
|
+ struct delayed_work elp_work;
|
|
|
+
|
|
|
+ /* in dBm */
|
|
|
+ int power_level;
|
|
|
+
|
|
|
+ struct wl1271_stats stats;
|
|
|
+
|
|
|
+ __le32 buffer_32;
|
|
|
+ u32 buffer_cmd;
|
|
|
+ u32 buffer_busyword[WL1271_BUSY_WORD_CNT];
|
|
|
+
|
|
|
+ struct wl12xx_fw_status *fw_status;
|
|
|
+ struct wl1271_tx_hw_res_if *tx_res_if;
|
|
|
+
|
|
|
+ /* Current chipset configuration */
|
|
|
+ struct conf_drv_settings conf;
|
|
|
+
|
|
|
+ bool sg_enabled;
|
|
|
+
|
|
|
+ bool enable_11a;
|
|
|
+
|
|
|
+ /* Most recently reported noise in dBm */
|
|
|
+ s8 noise;
|
|
|
+
|
|
|
+ /* bands supported by this instance of wl12xx */
|
|
|
+ struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
|
|
|
+
|
|
|
+ int tcxo_clock;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * wowlan trigger was configured during suspend.
|
|
|
+ * (currently, only "ANY" trigger is supported)
|
|
|
+ */
|
|
|
+ bool wow_enabled;
|
|
|
+ bool irq_wake_enabled;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * AP-mode - links indexed by HLID. The global and broadcast links
|
|
|
+ * are always active.
|
|
|
+ */
|
|
|
+ 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;
|
|
|
+
|
|
|
+ /* 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;
|
|
|
+
|
|
|
+ /* Platform limitations */
|
|
|
+ unsigned int platform_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 wl12xx_vif *last_wlvif;
|
|
|
+
|
|
|
+ /* work to fire when Tx is stuck */
|
|
|
+ struct delayed_work tx_watchdog_work;
|
|
|
+
|
|
|
+ struct wlcore_ops *ops;
|
|
|
+};
|
|
|
|
|
|
int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);
|
|
|
int __devexit wlcore_remove(struct platform_device *pdev);
|