/*
 * drivers/net/wireless/mwl8k.c driver for Marvell TOPDOG 802.11 Wireless cards
 *
 * Copyright (C) 2008 Marvell Semiconductor Inc.
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2.  This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/completion.h>
#include <linux/etherdevice.h>
#include <net/mac80211.h>
#include <linux/moduleparam.h>
#include <linux/firmware.h>
#include <linux/workqueue.h>

#define MWL8K_DESC	"Marvell TOPDOG(R) 802.11 Wireless Network Driver"
#define MWL8K_NAME	KBUILD_MODNAME
#define MWL8K_VERSION	"0.9.1"

MODULE_DESCRIPTION(MWL8K_DESC);
MODULE_VERSION(MWL8K_VERSION);
MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com>");
MODULE_LICENSE("GPL");

static DEFINE_PCI_DEVICE_TABLE(mwl8k_table) = {
	{ PCI_VDEVICE(MARVELL, 0x2a2b), .driver_data = 8687, },
	{ PCI_VDEVICE(MARVELL, 0x2a30), .driver_data = 8687, },
	{ }
};
MODULE_DEVICE_TABLE(pci, mwl8k_table);

#define IEEE80211_ADDR_LEN			ETH_ALEN

/* Register definitions */
#define MWL8K_HIU_GEN_PTR			0x00000c10
#define  MWL8K_MODE_STA				0x0000005a
#define  MWL8K_MODE_AP				0x000000a5
#define MWL8K_HIU_INT_CODE			0x00000c14
#define  MWL8K_FWSTA_READY			0xf0f1f2f4
#define  MWL8K_FWAP_READY			0xf1f2f4a5
#define  MWL8K_INT_CODE_CMD_FINISHED		0x00000005
#define MWL8K_HIU_SCRATCH			0x00000c40

/* Host->device communications */
#define MWL8K_HIU_H2A_INTERRUPT_EVENTS		0x00000c18
#define MWL8K_HIU_H2A_INTERRUPT_STATUS		0x00000c1c
#define MWL8K_HIU_H2A_INTERRUPT_MASK		0x00000c20
#define MWL8K_HIU_H2A_INTERRUPT_CLEAR_SEL	0x00000c24
#define MWL8K_HIU_H2A_INTERRUPT_STATUS_MASK	0x00000c28
#define  MWL8K_H2A_INT_DUMMY			(1 << 20)
#define  MWL8K_H2A_INT_RESET			(1 << 15)
#define  MWL8K_H2A_INT_PS			(1 << 2)
#define  MWL8K_H2A_INT_DOORBELL			(1 << 1)
#define  MWL8K_H2A_INT_PPA_READY		(1 << 0)

/* Device->host communications */
#define MWL8K_HIU_A2H_INTERRUPT_EVENTS		0x00000c2c
#define MWL8K_HIU_A2H_INTERRUPT_STATUS		0x00000c30
#define MWL8K_HIU_A2H_INTERRUPT_MASK		0x00000c34
#define MWL8K_HIU_A2H_INTERRUPT_CLEAR_SEL	0x00000c38
#define MWL8K_HIU_A2H_INTERRUPT_STATUS_MASK	0x00000c3c
#define  MWL8K_A2H_INT_DUMMY			(1 << 20)
#define  MWL8K_A2H_INT_CHNL_SWITCHED		(1 << 11)
#define  MWL8K_A2H_INT_QUEUE_EMPTY		(1 << 10)
#define  MWL8K_A2H_INT_RADAR_DETECT		(1 << 7)
#define  MWL8K_A2H_INT_RADIO_ON			(1 << 6)
#define  MWL8K_A2H_INT_RADIO_OFF		(1 << 5)
#define  MWL8K_A2H_INT_MAC_EVENT		(1 << 3)
#define  MWL8K_A2H_INT_OPC_DONE			(1 << 2)
#define  MWL8K_A2H_INT_RX_READY			(1 << 1)
#define  MWL8K_A2H_INT_TX_DONE			(1 << 0)

#define MWL8K_A2H_EVENTS	(MWL8K_A2H_INT_DUMMY | \
				 MWL8K_A2H_INT_CHNL_SWITCHED | \
				 MWL8K_A2H_INT_QUEUE_EMPTY | \
				 MWL8K_A2H_INT_RADAR_DETECT | \
				 MWL8K_A2H_INT_RADIO_ON | \
				 MWL8K_A2H_INT_RADIO_OFF | \
				 MWL8K_A2H_INT_MAC_EVENT | \
				 MWL8K_A2H_INT_OPC_DONE | \
				 MWL8K_A2H_INT_RX_READY | \
				 MWL8K_A2H_INT_TX_DONE)

/* WME stream classes */
#define WME_AC_BE	0		/* best effort */
#define WME_AC_BK	1		/* background */
#define WME_AC_VI	2		/* video */
#define WME_AC_VO	3		/* voice */

#define MWL8K_RX_QUEUES		1
#define MWL8K_TX_QUEUES		4

struct mwl8k_rx_queue {
	int rx_desc_count;

	/* hw receives here */
	int rx_head;

	/* refill descs here */
	int rx_tail;

	struct mwl8k_rx_desc *rx_desc_area;
	dma_addr_t rx_desc_dma;
	struct sk_buff **rx_skb;
};

struct mwl8k_skb {
	/*
	 * The DMA engine requires a modification to the payload.
	 * If the skbuff is shared/cloned, it needs to be unshared.
	 * This method is used to ensure the stack always gets back
	 * the skbuff it sent for transmission.
	 */
	struct sk_buff *clone;
	struct sk_buff *skb;
};

struct mwl8k_tx_queue {
	/* hw transmits here */
	int tx_head;

	/* sw appends here */
	int tx_tail;

	struct ieee80211_tx_queue_stats tx_stats;
	struct mwl8k_tx_desc *tx_desc_area;
	dma_addr_t tx_desc_dma;
	struct mwl8k_skb *tx_skb;
};

/* Pointers to the firmware data and meta information about it.  */
struct mwl8k_firmware {
	/* Microcode */
	struct firmware *ucode;

	/* Boot helper code */
	struct firmware *helper;
};

struct mwl8k_priv {
	void __iomem *regs;
	struct ieee80211_hw *hw;

	struct pci_dev *pdev;
	u8 name[16];
	/* firmware access lock */
	spinlock_t fw_lock;

	/* firmware files and meta data */
	struct mwl8k_firmware fw;
	u32 part_num;

	/* lock held over TX and TX reap */
	spinlock_t tx_lock;
	u32 int_mask;

	struct ieee80211_vif *vif;
	struct list_head vif_list;

	struct ieee80211_channel *current_channel;

	/* power management status cookie from firmware */
	u32 *cookie;
	dma_addr_t cookie_dma;

	u16 num_mcaddrs;
	u16 region_code;
	u8 hw_rev;
	__le32 fw_rev;
	u32 wep_enabled;

	/*
	 * Running count of TX packets in flight, to avoid
	 * iterating over the transmit rings each time.
	 */
	int pending_tx_pkts;

	struct mwl8k_rx_queue rxq[MWL8K_RX_QUEUES];
	struct mwl8k_tx_queue txq[MWL8K_TX_QUEUES];

	/* PHY parameters */
	struct ieee80211_supported_band band;
	struct ieee80211_channel channels[14];
	struct ieee80211_rate rates[12];

	/* RF preamble: Short, Long or Auto */
	u8	radio_preamble;
	u8	radio_state;

	/* WMM MODE 1 for enabled; 0 for disabled */
	bool wmm_mode;

	/* Set if PHY config is in progress */
	bool inconfig;

	/* XXX need to convert this to handle multiple interfaces */
	bool capture_beacon;
	u8 capture_bssid[IEEE80211_ADDR_LEN];
	struct sk_buff *beacon_skb;

	/*
	 * This FJ worker has to be global as it is scheduled from the
	 * RX handler.  At this point we don't know which interface it
	 * belongs to until the list of bssids waiting to complete join
	 * is checked.
	 */
	struct work_struct finalize_join_worker;

	/* Tasklet to reclaim TX descriptors and buffers after tx */
	struct tasklet_struct tx_reclaim_task;

	/* Work thread to serialize configuration requests */
	struct workqueue_struct *config_wq;
	struct completion *hostcmd_wait;
	struct completion *tx_wait;
};

/* Per interface specific private data */
struct mwl8k_vif {
	struct list_head node;

	/* backpointer to parent config block */
	struct mwl8k_priv *priv;

	/* BSS config of AP or IBSS from mac80211*/
	struct ieee80211_bss_conf bss_info;

	/* BSSID of AP or IBSS */
	u8	bssid[IEEE80211_ADDR_LEN];
	u8	mac_addr[IEEE80211_ADDR_LEN];

	/*
	 * Subset of supported legacy rates.
	 * Intersection of AP and STA supported rates.
	 */
	struct ieee80211_rate legacy_rates[12];

	/* number of supported legacy rates */
	u8	legacy_nrates;

	/* Number of supported MCS rates. Work in progress */
	u8	mcs_nrates;

	 /* Index into station database.Returned by update_sta_db call */
	u8	peer_id;

	/* Non AMPDU sequence number assigned by driver */
	u16	seqno;

	/* Note:There is no channel info,
	 * refer to the master channel info in priv
	 */
};

#define MWL8K_VIF(_vif) (struct mwl8k_vif *)(&((_vif)->drv_priv))

static const struct ieee80211_channel mwl8k_channels[] = {
	{ .center_freq = 2412, .hw_value = 1, },
	{ .center_freq = 2417, .hw_value = 2, },
	{ .center_freq = 2422, .hw_value = 3, },
	{ .center_freq = 2427, .hw_value = 4, },
	{ .center_freq = 2432, .hw_value = 5, },
	{ .center_freq = 2437, .hw_value = 6, },
	{ .center_freq = 2442, .hw_value = 7, },
	{ .center_freq = 2447, .hw_value = 8, },
	{ .center_freq = 2452, .hw_value = 9, },
	{ .center_freq = 2457, .hw_value = 10, },
	{ .center_freq = 2462, .hw_value = 11, },
};

static const struct ieee80211_rate mwl8k_rates[] = {
	{ .bitrate = 10, .hw_value = 2, },
	{ .bitrate = 20, .hw_value = 4, },
	{ .bitrate = 55, .hw_value = 11, },
	{ .bitrate = 60, .hw_value = 12, },
	{ .bitrate = 90, .hw_value = 18, },
	{ .bitrate = 110, .hw_value = 22, },
	{ .bitrate = 120, .hw_value = 24, },
	{ .bitrate = 180, .hw_value = 36, },
	{ .bitrate = 240, .hw_value = 48, },
	{ .bitrate = 360, .hw_value = 72, },
	{ .bitrate = 480, .hw_value = 96, },
	{ .bitrate = 540, .hw_value = 108, },
};

/* Radio settings */
#define MWL8K_RADIO_FORCE		0x2
#define MWL8K_RADIO_ENABLE		0x1
#define MWL8K_RADIO_DISABLE		0x0
#define MWL8K_RADIO_AUTO_PREAMBLE	0x0005
#define MWL8K_RADIO_SHORT_PREAMBLE	0x0003
#define MWL8K_RADIO_LONG_PREAMBLE	0x0001

/* WMM */
#define MWL8K_WMM_ENABLE		1
#define MWL8K_WMM_DISABLE		0

#define MWL8K_RADIO_DEFAULT_PREAMBLE	MWL8K_RADIO_LONG_PREAMBLE

/* Slot time */

/* Short Slot: 9us slot time */
#define MWL8K_SHORT_SLOTTIME		1

/* Long slot: 20us slot time */
#define MWL8K_LONG_SLOTTIME		0

/* Set or get info from Firmware */
#define MWL8K_CMD_SET			0x0001
#define MWL8K_CMD_GET			0x0000

/* Firmware command codes */
#define MWL8K_CMD_CODE_DNLD		0x0001
#define MWL8K_CMD_GET_HW_SPEC		0x0003
#define MWL8K_CMD_MAC_MULTICAST_ADR	0x0010
#define MWL8K_CMD_GET_STAT		0x0014
#define MWL8K_CMD_RADIO_CONTROL		0x001C
#define MWL8K_CMD_RF_TX_POWER		0x001E
#define MWL8K_CMD_SET_PRE_SCAN		0x0107
#define MWL8K_CMD_SET_POST_SCAN		0x0108
#define MWL8K_CMD_SET_RF_CHANNEL	0x010A
#define MWL8K_CMD_SET_SLOT		0x0114
#define MWL8K_CMD_MIMO_CONFIG		0x0125
#define MWL8K_CMD_ENABLE_SNIFFER	0x0150
#define MWL8K_CMD_SET_WMM_MODE		0x0123
#define MWL8K_CMD_SET_EDCA_PARAMS	0x0115
#define MWL8K_CMD_SET_FINALIZE_JOIN	0x0111
#define MWL8K_CMD_UPDATE_STADB		0x1123
#define MWL8K_CMD_SET_RATEADAPT_MODE	0x0203
#define MWL8K_CMD_SET_LINKADAPT_MODE	0x0129
#define MWL8K_CMD_SET_AID		0x010d
#define MWL8K_CMD_SET_RATE		0x0110
#define MWL8K_CMD_USE_FIXED_RATE	0x0126
#define MWL8K_CMD_RTS_THRESHOLD		0x0113
#define MWL8K_CMD_ENCRYPTION		0x1122

static const char *mwl8k_cmd_name(u16 cmd, char *buf, int bufsize)
{
#define MWL8K_CMDNAME(x)	case MWL8K_CMD_##x: do {\
					snprintf(buf, bufsize, "%s", #x);\
					return buf;\
					} while (0)
	switch (cmd & (~0x8000)) {
		MWL8K_CMDNAME(CODE_DNLD);
		MWL8K_CMDNAME(GET_HW_SPEC);
		MWL8K_CMDNAME(MAC_MULTICAST_ADR);
		MWL8K_CMDNAME(GET_STAT);
		MWL8K_CMDNAME(RADIO_CONTROL);
		MWL8K_CMDNAME(RF_TX_POWER);
		MWL8K_CMDNAME(SET_PRE_SCAN);
		MWL8K_CMDNAME(SET_POST_SCAN);
		MWL8K_CMDNAME(SET_RF_CHANNEL);
		MWL8K_CMDNAME(SET_SLOT);
		MWL8K_CMDNAME(MIMO_CONFIG);
		MWL8K_CMDNAME(ENABLE_SNIFFER);
		MWL8K_CMDNAME(SET_WMM_MODE);
		MWL8K_CMDNAME(SET_EDCA_PARAMS);
		MWL8K_CMDNAME(SET_FINALIZE_JOIN);
		MWL8K_CMDNAME(UPDATE_STADB);
		MWL8K_CMDNAME(SET_RATEADAPT_MODE);
		MWL8K_CMDNAME(SET_LINKADAPT_MODE);
		MWL8K_CMDNAME(SET_AID);
		MWL8K_CMDNAME(SET_RATE);
		MWL8K_CMDNAME(USE_FIXED_RATE);
		MWL8K_CMDNAME(RTS_THRESHOLD);
		MWL8K_CMDNAME(ENCRYPTION);
	default:
		snprintf(buf, bufsize, "0x%x", cmd);
	}
#undef MWL8K_CMDNAME

	return buf;
}

/* Hardware and firmware reset */
static void mwl8k_hw_reset(struct mwl8k_priv *priv)
{
	iowrite32(MWL8K_H2A_INT_RESET,
		priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
	iowrite32(MWL8K_H2A_INT_RESET,
		priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
	msleep(20);
}

/* Release fw image */
static void mwl8k_release_fw(struct firmware **fw)
{
	if (*fw == NULL)
		return;
	release_firmware(*fw);
	*fw = NULL;
}

static void mwl8k_release_firmware(struct mwl8k_priv *priv)
{
	mwl8k_release_fw(&priv->fw.ucode);
	mwl8k_release_fw(&priv->fw.helper);
}

/* Request fw image */
static int mwl8k_request_fw(struct mwl8k_priv *priv,
				const char *fname, struct firmware **fw)
{
	/* release current image */
	if (*fw != NULL)
		mwl8k_release_fw(fw);

	return request_firmware((const struct firmware **)fw,
						fname, &priv->pdev->dev);
}

static int mwl8k_request_firmware(struct mwl8k_priv *priv, u32 part_num)
{
	u8 filename[64];
	int rc;

	priv->part_num = part_num;

	snprintf(filename, sizeof(filename),
		 "mwl8k/helper_%u.fw", priv->part_num);

	rc = mwl8k_request_fw(priv, filename, &priv->fw.helper);
	if (rc) {
		printk(KERN_ERR
			"%s Error requesting helper firmware file %s\n",
			pci_name(priv->pdev), filename);
		return rc;
	}

	snprintf(filename, sizeof(filename),
		 "mwl8k/fmimage_%u.fw", priv->part_num);

	rc = mwl8k_request_fw(priv, filename, &priv->fw.ucode);
	if (rc) {
		printk(KERN_ERR "%s Error requesting firmware file %s\n",
					pci_name(priv->pdev), filename);
		mwl8k_release_fw(&priv->fw.helper);
		return rc;
	}

	return 0;
}

struct mwl8k_cmd_pkt {
	__le16	code;
	__le16	length;
	__le16	seq_num;
	__le16	result;
	char	payload[0];
} __attribute__((packed));

/*
 * Firmware loading.
 */
static int
mwl8k_send_fw_load_cmd(struct mwl8k_priv *priv, void *data, int length)
{
	void __iomem *regs = priv->regs;
	dma_addr_t dma_addr;
	int rc;
	int loops;

	dma_addr = pci_map_single(priv->pdev, data, length, PCI_DMA_TODEVICE);
	if (pci_dma_mapping_error(priv->pdev, dma_addr))
		return -ENOMEM;

	iowrite32(dma_addr, regs + MWL8K_HIU_GEN_PTR);
	iowrite32(0, regs + MWL8K_HIU_INT_CODE);
	iowrite32(MWL8K_H2A_INT_DOORBELL,
		regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
	iowrite32(MWL8K_H2A_INT_DUMMY,
		regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);

	rc = -ETIMEDOUT;
	loops = 1000;
	do {
		u32 int_code;

		int_code = ioread32(regs + MWL8K_HIU_INT_CODE);
		if (int_code == MWL8K_INT_CODE_CMD_FINISHED) {
			iowrite32(0, regs + MWL8K_HIU_INT_CODE);
			rc = 0;
			break;
		}

		udelay(1);
	} while (--loops);

	pci_unmap_single(priv->pdev, dma_addr, length, PCI_DMA_TODEVICE);

	/*
	 * Clear 'command done' interrupt bit.
	 */
	loops = 1000;
	do {
		u32 status;

		status = ioread32(priv->regs +
				MWL8K_HIU_A2H_INTERRUPT_STATUS);
		if (status & MWL8K_A2H_INT_OPC_DONE) {
			iowrite32(~MWL8K_A2H_INT_OPC_DONE,
				priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
			ioread32(priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
			break;
		}

		udelay(1);
	} while (--loops);

	return rc;
}

static int mwl8k_load_fw_image(struct mwl8k_priv *priv,
				const u8 *data, size_t length)
{
	struct mwl8k_cmd_pkt *cmd;
	int done;
	int rc = 0;

	cmd = kmalloc(sizeof(*cmd) + 256, GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->code = cpu_to_le16(MWL8K_CMD_CODE_DNLD);
	cmd->seq_num = 0;
	cmd->result = 0;

	done = 0;
	while (length) {
		int block_size = length > 256 ? 256 : length;

		memcpy(cmd->payload, data + done, block_size);
		cmd->length = cpu_to_le16(block_size);

		rc = mwl8k_send_fw_load_cmd(priv, cmd,
						sizeof(*cmd) + block_size);
		if (rc)
			break;

		done += block_size;
		length -= block_size;
	}

	if (!rc) {
		cmd->length = 0;
		rc = mwl8k_send_fw_load_cmd(priv, cmd, sizeof(*cmd));
	}

	kfree(cmd);

	return rc;
}

static int mwl8k_feed_fw_image(struct mwl8k_priv *priv,
				const u8 *data, size_t length)
{
	unsigned char *buffer;
	int may_continue, rc = 0;
	u32 done, prev_block_size;

	buffer = kmalloc(1024, GFP_KERNEL);
	if (buffer == NULL)
		return -ENOMEM;

	done = 0;
	prev_block_size = 0;
	may_continue = 1000;
	while (may_continue > 0) {
		u32 block_size;

		block_size = ioread32(priv->regs + MWL8K_HIU_SCRATCH);
		if (block_size & 1) {
			block_size &= ~1;
			may_continue--;
		} else {
			done += prev_block_size;
			length -= prev_block_size;
		}

		if (block_size > 1024 || block_size > length) {
			rc = -EOVERFLOW;
			break;
		}

		if (length == 0) {
			rc = 0;
			break;
		}

		if (block_size == 0) {
			rc = -EPROTO;
			may_continue--;
			udelay(1);
			continue;
		}

		prev_block_size = block_size;
		memcpy(buffer, data + done, block_size);

		rc = mwl8k_send_fw_load_cmd(priv, buffer, block_size);
		if (rc)
			break;
	}

	if (!rc && length != 0)
		rc = -EREMOTEIO;

	kfree(buffer);

	return rc;
}

static int mwl8k_load_firmware(struct mwl8k_priv *priv)
{
	int loops, rc;

	const u8 *ucode = priv->fw.ucode->data;
	size_t ucode_len = priv->fw.ucode->size;
	const u8 *helper = priv->fw.helper->data;
	size_t helper_len = priv->fw.helper->size;

	if (!memcmp(ucode, "\x01\x00\x00\x00", 4)) {
		rc = mwl8k_load_fw_image(priv, helper, helper_len);
		if (rc) {
			printk(KERN_ERR "%s: unable to load firmware "
				"helper image\n", pci_name(priv->pdev));
			return rc;
		}
		msleep(1);

		rc = mwl8k_feed_fw_image(priv, ucode, ucode_len);
	} else {
		rc = mwl8k_load_fw_image(priv, ucode, ucode_len);
	}

	if (rc) {
		printk(KERN_ERR "%s: unable to load firmware data\n",
			pci_name(priv->pdev));
		return rc;
	}

	iowrite32(MWL8K_MODE_STA, priv->regs + MWL8K_HIU_GEN_PTR);
	msleep(1);

	loops = 200000;
	do {
		if (ioread32(priv->regs + MWL8K_HIU_INT_CODE)
						== MWL8K_FWSTA_READY)
			break;
		udelay(1);
	} while (--loops);

	return loops ? 0 : -ETIMEDOUT;
}


/*
 * Defines shared between transmission and reception.
 */
/* HT control fields for firmware */
struct ewc_ht_info {
	__le16	control1;
	__le16	control2;
	__le16	control3;
} __attribute__((packed));

/* Firmware Station database operations */
#define MWL8K_STA_DB_ADD_ENTRY		0
#define MWL8K_STA_DB_MODIFY_ENTRY	1
#define MWL8K_STA_DB_DEL_ENTRY		2
#define MWL8K_STA_DB_FLUSH		3

/* Peer Entry flags - used to define the type of the peer node */
#define MWL8K_PEER_TYPE_ACCESSPOINT	2
#define MWL8K_PEER_TYPE_ADHOC_STATION	4

#define MWL8K_IEEE_LEGACY_DATA_RATES	12
#define MWL8K_MCS_BITMAP_SIZE		16
#define pad_size			16

struct peer_capability_info {
	/* Peer type - AP vs. STA.  */
	__u8	peer_type;

	/* Basic 802.11 capabilities from assoc resp.  */
	__le16	basic_caps;

	/* Set if peer supports 802.11n high throughput (HT).  */
	__u8	ht_support;

	/* Valid if HT is supported.  */
	__le16	ht_caps;
	__u8	extended_ht_caps;
	struct ewc_ht_info	ewc_info;

	/* Legacy rate table. Intersection of our rates and peer rates.  */
	__u8	legacy_rates[MWL8K_IEEE_LEGACY_DATA_RATES];

	/* HT rate table. Intersection of our rates and peer rates.  */
	__u8	ht_rates[MWL8K_MCS_BITMAP_SIZE];
	__u8	pad[pad_size];

	/* If set, interoperability mode, no proprietary extensions.  */
	__u8	interop;
	__u8	pad2;
	__u8	station_id;
	__le16	amsdu_enabled;
} __attribute__((packed));

/* Inline functions to manipulate QoS field in data descriptor.  */
static inline u16 mwl8k_qos_setbit_tid(u16 qos, u8 tid)
{
	u16 val_mask = 0x000f;
	u16 qos_mask = ~val_mask;

	/* TID bits 0-3 */
	return (qos & qos_mask) | (tid & val_mask);
}

static inline u16 mwl8k_qos_setbit_eosp(u16 qos)
{
	u16 val_mask = 1 << 4;

	/* End of Service Period Bit 4 */
	return qos | val_mask;
}

static inline u16 mwl8k_qos_setbit_ack(u16 qos, u8 ack_policy)
{
	u16 val_mask = 0x3;
	u8	shift = 5;
	u16 qos_mask = ~(val_mask << shift);

	/* Ack Policy Bit 5-6 */
	return (qos & qos_mask) | ((ack_policy & val_mask) << shift);
}

static inline u16 mwl8k_qos_setbit_amsdu(u16 qos)
{
	u16 val_mask = 1 << 7;

	/* AMSDU present Bit 7 */
	return qos | val_mask;
}

static inline u16 mwl8k_qos_setbit_qlen(u16 qos, u8 len)
{
	u16 val_mask = 0xff;
	u8	shift = 8;
	u16 qos_mask = ~(val_mask << shift);

	/* Queue Length Bits 8-15 */
	return (qos & qos_mask) | ((len & val_mask) << shift);
}

/* DMA header used by firmware and hardware.  */
struct mwl8k_dma_data {
	__le16 fwlen;
	struct ieee80211_hdr wh;
} __attribute__((packed));

/* Routines to add/remove DMA header from skb.  */
static inline int mwl8k_remove_dma_header(struct sk_buff *skb)
{
	struct mwl8k_dma_data *tr = (struct mwl8k_dma_data *)(skb->data);
	void *dst, *src = &tr->wh;
	__le16 fc = tr->wh.frame_control;
	int hdrlen = ieee80211_hdrlen(fc);
	u16 space = sizeof(struct mwl8k_dma_data) - hdrlen;

	dst = (void *)tr + space;
	if (dst != src) {
		memmove(dst, src, hdrlen);
		skb_pull(skb, space);
	}

	return 0;
}

static inline struct sk_buff *mwl8k_add_dma_header(struct sk_buff *skb)
{
	struct ieee80211_hdr *wh;
	u32 hdrlen, pktlen;
	struct mwl8k_dma_data *tr;

	wh = (struct ieee80211_hdr *)skb->data;
	hdrlen = ieee80211_hdrlen(wh->frame_control);
	pktlen = skb->len;

	/*
	 * Copy up/down the 802.11 header; the firmware requires
	 * we present a 2-byte payload length followed by a
	 * 4-address header (w/o QoS), followed (optionally) by
	 * any WEP/ExtIV header (but only filled in for CCMP).
	 */
	if (hdrlen != sizeof(struct mwl8k_dma_data))
		skb_push(skb, sizeof(struct mwl8k_dma_data) - hdrlen);

	tr = (struct mwl8k_dma_data *)skb->data;
	if (wh != &tr->wh)
		memmove(&tr->wh, wh, hdrlen);

	/* Clear addr4 */
	memset(tr->wh.addr4, 0, IEEE80211_ADDR_LEN);

	/*
	 * Firmware length is the length of the fully formed "802.11
	 * payload".  That is, everything except for the 802.11 header.
	 * This includes all crypto material including the MIC.
	 */
	tr->fwlen = cpu_to_le16(pktlen - hdrlen);

	return skb;
}


/*
 * Packet reception.
 */
#define MWL8K_RX_CTRL_KEY_INDEX_MASK	0x30
#define MWL8K_RX_CTRL_OWNED_BY_HOST	0x02
#define MWL8K_RX_CTRL_AMPDU		0x01

struct mwl8k_rx_desc {
	__le16 pkt_len;
	__u8 link_quality;
	__u8 noise_level;
	__le32 pkt_phys_addr;
	__le32 next_rx_desc_phys_addr;
	__le16 qos_control;
	__le16 rate_info;
	__le32 pad0[4];
	__u8 rssi;
	__u8 channel;
	__le16 pad1;
	__u8 rx_ctrl;
	__u8 rx_status;
	__u8 pad2[2];
} __attribute__((packed));

#define MWL8K_RX_DESCS		256
#define MWL8K_RX_MAXSZ		3800

static int mwl8k_rxq_init(struct ieee80211_hw *hw, int index)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_rx_queue *rxq = priv->rxq + index;
	int size;
	int i;

	rxq->rx_desc_count = 0;
	rxq->rx_head = 0;
	rxq->rx_tail = 0;

	size = MWL8K_RX_DESCS * sizeof(struct mwl8k_rx_desc);

	rxq->rx_desc_area =
		pci_alloc_consistent(priv->pdev, size, &rxq->rx_desc_dma);
	if (rxq->rx_desc_area == NULL) {
		printk(KERN_ERR "%s: failed to alloc RX descriptors\n",
		       priv->name);
		return -ENOMEM;
	}
	memset(rxq->rx_desc_area, 0, size);

	rxq->rx_skb = kmalloc(MWL8K_RX_DESCS *
				sizeof(*rxq->rx_skb), GFP_KERNEL);
	if (rxq->rx_skb == NULL) {
		printk(KERN_ERR "%s: failed to alloc RX skbuff list\n",
			priv->name);
		pci_free_consistent(priv->pdev, size,
				    rxq->rx_desc_area, rxq->rx_desc_dma);
		return -ENOMEM;
	}
	memset(rxq->rx_skb, 0, MWL8K_RX_DESCS * sizeof(*rxq->rx_skb));

	for (i = 0; i < MWL8K_RX_DESCS; i++) {
		struct mwl8k_rx_desc *rx_desc;
		int nexti;

		rx_desc = rxq->rx_desc_area + i;
		nexti = (i + 1) % MWL8K_RX_DESCS;

		rx_desc->next_rx_desc_phys_addr =
			cpu_to_le32(rxq->rx_desc_dma
						+ nexti * sizeof(*rx_desc));
		rx_desc->rx_ctrl = MWL8K_RX_CTRL_OWNED_BY_HOST;
	}

	return 0;
}

static int rxq_refill(struct ieee80211_hw *hw, int index, int limit)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_rx_queue *rxq = priv->rxq + index;
	int refilled;

	refilled = 0;
	while (rxq->rx_desc_count < MWL8K_RX_DESCS && limit--) {
		struct sk_buff *skb;
		int rx;

		skb = dev_alloc_skb(MWL8K_RX_MAXSZ);
		if (skb == NULL)
			break;

		rxq->rx_desc_count++;

		rx = rxq->rx_tail;
		rxq->rx_tail = (rx + 1) % MWL8K_RX_DESCS;

		rxq->rx_desc_area[rx].pkt_phys_addr =
			cpu_to_le32(pci_map_single(priv->pdev, skb->data,
					MWL8K_RX_MAXSZ, DMA_FROM_DEVICE));

		rxq->rx_desc_area[rx].pkt_len = cpu_to_le16(MWL8K_RX_MAXSZ);
		rxq->rx_skb[rx] = skb;
		wmb();
		rxq->rx_desc_area[rx].rx_ctrl = 0;

		refilled++;
	}

	return refilled;
}

/* Must be called only when the card's reception is completely halted */
static void mwl8k_rxq_deinit(struct ieee80211_hw *hw, int index)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_rx_queue *rxq = priv->rxq + index;
	int i;

	for (i = 0; i < MWL8K_RX_DESCS; i++) {
		if (rxq->rx_skb[i] != NULL) {
			unsigned long addr;

			addr = le32_to_cpu(rxq->rx_desc_area[i].pkt_phys_addr);
			pci_unmap_single(priv->pdev, addr, MWL8K_RX_MAXSZ,
					 PCI_DMA_FROMDEVICE);
			kfree_skb(rxq->rx_skb[i]);
			rxq->rx_skb[i] = NULL;
		}
	}

	kfree(rxq->rx_skb);
	rxq->rx_skb = NULL;

	pci_free_consistent(priv->pdev,
			    MWL8K_RX_DESCS * sizeof(struct mwl8k_rx_desc),
			    rxq->rx_desc_area, rxq->rx_desc_dma);
	rxq->rx_desc_area = NULL;
}


/*
 * Scan a list of BSSIDs to process for finalize join.
 * Allows for extension to process multiple BSSIDs.
 */
static inline int
mwl8k_capture_bssid(struct mwl8k_priv *priv, struct ieee80211_hdr *wh)
{
	return priv->capture_beacon &&
		ieee80211_is_beacon(wh->frame_control) &&
		!compare_ether_addr(wh->addr3, priv->capture_bssid);
}

static inline void mwl8k_save_beacon(struct mwl8k_priv *priv,
							struct sk_buff *skb)
{
	priv->capture_beacon = false;
	memset(priv->capture_bssid, 0, IEEE80211_ADDR_LEN);

	/*
	 * Use GFP_ATOMIC as rxq_process is called from
	 * the primary interrupt handler, memory allocation call
	 * must not sleep.
	 */
	priv->beacon_skb = skb_copy(skb, GFP_ATOMIC);
	if (priv->beacon_skb != NULL)
		queue_work(priv->config_wq,
				&priv->finalize_join_worker);
}

static int rxq_process(struct ieee80211_hw *hw, int index, int limit)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_rx_queue *rxq = priv->rxq + index;
	int processed;

	processed = 0;
	while (rxq->rx_desc_count && limit--) {
		struct mwl8k_rx_desc *rx_desc;
		struct sk_buff *skb;
		struct ieee80211_rx_status status;
		unsigned long addr;
		struct ieee80211_hdr *wh;

		rx_desc = rxq->rx_desc_area + rxq->rx_head;
		if (!(rx_desc->rx_ctrl & MWL8K_RX_CTRL_OWNED_BY_HOST))
			break;
		rmb();

		skb = rxq->rx_skb[rxq->rx_head];
		rxq->rx_skb[rxq->rx_head] = NULL;

		rxq->rx_head = (rxq->rx_head + 1) % MWL8K_RX_DESCS;
		rxq->rx_desc_count--;

		addr = le32_to_cpu(rx_desc->pkt_phys_addr);
		pci_unmap_single(priv->pdev, addr,
					MWL8K_RX_MAXSZ, PCI_DMA_FROMDEVICE);

		skb_put(skb, le16_to_cpu(rx_desc->pkt_len));
		if (mwl8k_remove_dma_header(skb)) {
			dev_kfree_skb(skb);
			continue;
		}

		wh = (struct ieee80211_hdr *)skb->data;

		/*
		 * Check for pending join operation. save a copy of
		 * the beacon and schedule a tasklet to send finalize
		 * join command to the firmware.
		 */
		if (mwl8k_capture_bssid(priv, wh))
			mwl8k_save_beacon(priv, skb);

		memset(&status, 0, sizeof(status));
		status.mactime = 0;
		status.signal = -rx_desc->rssi;
		status.noise = -rx_desc->noise_level;
		status.qual = rx_desc->link_quality;
		status.antenna = 1;
		status.rate_idx = 1;
		status.flag = 0;
		status.band = IEEE80211_BAND_2GHZ;
		status.freq = ieee80211_channel_to_frequency(rx_desc->channel);
		ieee80211_rx_irqsafe(hw, skb, &status);

		processed++;
	}

	return processed;
}


/*
 * Packet transmission.
 */

/* Transmit queue assignment.  */
enum {
	MWL8K_WME_AC_BK	= 0,		/* background access */
	MWL8K_WME_AC_BE	= 1,		/* best effort access */
	MWL8K_WME_AC_VI	= 2,		/* video access */
	MWL8K_WME_AC_VO	= 3,		/* voice access */
};

/* Transmit packet ACK policy */
#define MWL8K_TXD_ACK_POLICY_NORMAL		0
#define MWL8K_TXD_ACK_POLICY_NONE		1
#define MWL8K_TXD_ACK_POLICY_NO_EXPLICIT	2
#define MWL8K_TXD_ACK_POLICY_BLOCKACK		3

#define GET_TXQ(_ac) (\
		((_ac) == WME_AC_VO) ? MWL8K_WME_AC_VO : \
		((_ac) == WME_AC_VI) ? MWL8K_WME_AC_VI : \
		((_ac) == WME_AC_BK) ? MWL8K_WME_AC_BK : \
		MWL8K_WME_AC_BE)

#define MWL8K_TXD_STATUS_IDLE			0x00000000
#define MWL8K_TXD_STATUS_USED			0x00000001
#define MWL8K_TXD_STATUS_OK			0x00000001
#define MWL8K_TXD_STATUS_OK_RETRY		0x00000002
#define MWL8K_TXD_STATUS_OK_MORE_RETRY		0x00000004
#define MWL8K_TXD_STATUS_MULTICAST_TX		0x00000008
#define MWL8K_TXD_STATUS_BROADCAST_TX		0x00000010
#define MWL8K_TXD_STATUS_FAILED_LINK_ERROR	0x00000020
#define MWL8K_TXD_STATUS_FAILED_EXCEED_LIMIT	0x00000040
#define MWL8K_TXD_STATUS_FAILED_AGING		0x00000080
#define MWL8K_TXD_STATUS_HOST_CMD		0x40000000
#define MWL8K_TXD_STATUS_FW_OWNED		0x80000000
#define  MWL8K_TXD_SOFTSTALE				0x80
#define  MWL8K_TXD_SOFTSTALE_MGMT_RETRY			0x01

struct mwl8k_tx_desc {
	__le32 status;
	__u8 data_rate;
	__u8 tx_priority;
	__le16 qos_control;
	__le32 pkt_phys_addr;
	__le16 pkt_len;
	__u8 dest_MAC_addr[IEEE80211_ADDR_LEN];
	__le32 next_tx_desc_phys_addr;
	__le32 reserved;
	__le16 rate_info;
	__u8 peer_id;
	__u8 tx_frag_cnt;
} __attribute__((packed));

#define MWL8K_TX_DESCS		128

static int mwl8k_txq_init(struct ieee80211_hw *hw, int index)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_tx_queue *txq = priv->txq + index;
	int size;
	int i;

	memset(&txq->tx_stats, 0,
		sizeof(struct ieee80211_tx_queue_stats));
	txq->tx_stats.limit = MWL8K_TX_DESCS;
	txq->tx_head = 0;
	txq->tx_tail = 0;

	size = MWL8K_TX_DESCS * sizeof(struct mwl8k_tx_desc);

	txq->tx_desc_area =
		pci_alloc_consistent(priv->pdev, size, &txq->tx_desc_dma);
	if (txq->tx_desc_area == NULL) {
		printk(KERN_ERR "%s: failed to alloc TX descriptors\n",
		       priv->name);
		return -ENOMEM;
	}
	memset(txq->tx_desc_area, 0, size);

	txq->tx_skb = kmalloc(MWL8K_TX_DESCS * sizeof(*txq->tx_skb),
								GFP_KERNEL);
	if (txq->tx_skb == NULL) {
		printk(KERN_ERR "%s: failed to alloc TX skbuff list\n",
		       priv->name);
		pci_free_consistent(priv->pdev, size,
				    txq->tx_desc_area, txq->tx_desc_dma);
		return -ENOMEM;
	}
	memset(txq->tx_skb, 0, MWL8K_TX_DESCS * sizeof(*txq->tx_skb));

	for (i = 0; i < MWL8K_TX_DESCS; i++) {
		struct mwl8k_tx_desc *tx_desc;
		int nexti;

		tx_desc = txq->tx_desc_area + i;
		nexti = (i + 1) % MWL8K_TX_DESCS;

		tx_desc->status = 0;
		tx_desc->next_tx_desc_phys_addr =
			cpu_to_le32(txq->tx_desc_dma +
						nexti * sizeof(*tx_desc));
	}

	return 0;
}

static inline void mwl8k_tx_start(struct mwl8k_priv *priv)
{
	iowrite32(MWL8K_H2A_INT_PPA_READY,
		priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
	iowrite32(MWL8K_H2A_INT_DUMMY,
		priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
	ioread32(priv->regs + MWL8K_HIU_INT_CODE);
}

static inline int mwl8k_txq_busy(struct mwl8k_priv *priv)
{
	return priv->pending_tx_pkts;
}

struct mwl8k_txq_info {
	u32 fw_owned;
	u32 drv_owned;
	u32 unused;
	u32 len;
	u32 head;
	u32 tail;
};

static int mwl8k_scan_tx_ring(struct mwl8k_priv *priv,
				struct mwl8k_txq_info txinfo[],
				u32 num_queues)
{
	int count, desc, status;
	struct mwl8k_tx_queue *txq;
	struct mwl8k_tx_desc *tx_desc;
	int ndescs = 0;

	memset(txinfo, 0, num_queues * sizeof(struct mwl8k_txq_info));
	spin_lock_bh(&priv->tx_lock);
	for (count = 0; count < num_queues; count++) {
		txq = priv->txq + count;
		txinfo[count].len = txq->tx_stats.len;
		txinfo[count].head = txq->tx_head;
		txinfo[count].tail = txq->tx_tail;
		for (desc = 0; desc < MWL8K_TX_DESCS; desc++) {
			tx_desc = txq->tx_desc_area + desc;
			status = le32_to_cpu(tx_desc->status);

			if (status & MWL8K_TXD_STATUS_FW_OWNED)
				txinfo[count].fw_owned++;
			else
				txinfo[count].drv_owned++;

			if (tx_desc->pkt_len == 0)
				txinfo[count].unused++;
		}
	}
	spin_unlock_bh(&priv->tx_lock);

	return ndescs;
}

static int mwl8k_tx_wait_empty(struct ieee80211_hw *hw, u32 delay_ms)
{
	u32 count = 0;
	unsigned long timeout = 0;
	struct mwl8k_priv *priv = hw->priv;
	DECLARE_COMPLETION_ONSTACK(cmd_wait);

	might_sleep();

	if (priv->tx_wait != NULL)
		printk(KERN_ERR "WARNING Previous TXWaitEmpty instance\n");

	spin_lock_bh(&priv->tx_lock);
	count = mwl8k_txq_busy(priv);
	if (count) {
		priv->tx_wait = &cmd_wait;
		if (priv->radio_state)
			mwl8k_tx_start(priv);
	}
	spin_unlock_bh(&priv->tx_lock);

	if (count) {
		struct mwl8k_txq_info txinfo[4];
		int index;
		int newcount;

		timeout = wait_for_completion_timeout(&cmd_wait,
					msecs_to_jiffies(delay_ms));
		if (timeout)
			return 0;

		spin_lock_bh(&priv->tx_lock);
		priv->tx_wait = NULL;
		newcount = mwl8k_txq_busy(priv);
		spin_unlock_bh(&priv->tx_lock);

		printk(KERN_ERR "%s(%u) TIMEDOUT:%ums Pend:%u-->%u\n",
		       __func__, __LINE__, delay_ms, count, newcount);

		mwl8k_scan_tx_ring(priv, txinfo, 4);
		for (index = 0 ; index < 4; index++)
			printk(KERN_ERR
				"TXQ:%u L:%u H:%u T:%u FW:%u DRV:%u U:%u\n",
					index,
					txinfo[index].len,
					txinfo[index].head,
					txinfo[index].tail,
					txinfo[index].fw_owned,
					txinfo[index].drv_owned,
					txinfo[index].unused);
		return -ETIMEDOUT;
	}

	return 0;
}

#define MWL8K_TXD_OK	(MWL8K_TXD_STATUS_OK | \
			 MWL8K_TXD_STATUS_OK_RETRY | \
			 MWL8K_TXD_STATUS_OK_MORE_RETRY)
#define MWL8K_TXD_SUCCESS(stat)		((stat) & MWL8K_TXD_OK)
#define MWL8K_TXD_FAIL_RETRY(stat)	\
	((stat) & (MWL8K_TXD_STATUS_FAILED_EXCEED_LIMIT))

static void mwl8k_txq_reclaim(struct ieee80211_hw *hw, int index, int force)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_tx_queue *txq = priv->txq + index;
	int wake = 0;

	while (txq->tx_stats.len > 0) {
		int tx;
		int rc;
		struct mwl8k_tx_desc *tx_desc;
		unsigned long addr;
		size_t size;
		struct sk_buff *skb;
		struct ieee80211_tx_info *info;
		u32 status;

		rc = 0;
		tx = txq->tx_head;
		tx_desc = txq->tx_desc_area + tx;

		status = le32_to_cpu(tx_desc->status);

		if (status & MWL8K_TXD_STATUS_FW_OWNED) {
			if (!force)
				break;
			tx_desc->status &=
				~cpu_to_le32(MWL8K_TXD_STATUS_FW_OWNED);
		}

		txq->tx_head = (tx + 1) % MWL8K_TX_DESCS;
		BUG_ON(txq->tx_stats.len == 0);
		txq->tx_stats.len--;
		priv->pending_tx_pkts--;

		addr = le32_to_cpu(tx_desc->pkt_phys_addr);
		size = (u32)(le16_to_cpu(tx_desc->pkt_len));
		skb = txq->tx_skb[tx].skb;
		txq->tx_skb[tx].skb = NULL;

		BUG_ON(skb == NULL);
		pci_unmap_single(priv->pdev, addr, size, PCI_DMA_TODEVICE);

		rc = mwl8k_remove_dma_header(skb);

		/* Mark descriptor as unused */
		tx_desc->pkt_phys_addr = 0;
		tx_desc->pkt_len = 0;

		if (txq->tx_skb[tx].clone) {
			/* Replace with original skb
			 * before returning to stack
			 * as buffer has been cloned
			 */
			dev_kfree_skb(skb);
			skb = txq->tx_skb[tx].clone;
			txq->tx_skb[tx].clone = NULL;
		}

		if (rc) {
			/* Something has gone wrong here.
			 * Failed to remove DMA header.
			 * Print error message and drop packet.
			 */
			printk(KERN_ERR "%s: Error removing DMA header from "
					"tx skb 0x%p.\n", priv->name, skb);

			dev_kfree_skb(skb);
			continue;
		}

		info = IEEE80211_SKB_CB(skb);
		ieee80211_tx_info_clear_status(info);

		/* Convert firmware status stuff into tx_status */
		if (MWL8K_TXD_SUCCESS(status)) {
			/* Transmit OK */
			info->flags |= IEEE80211_TX_STAT_ACK;
		}

		ieee80211_tx_status_irqsafe(hw, skb);

		wake = !priv->inconfig && priv->radio_state;
	}

	if (wake)
		ieee80211_wake_queue(hw, index);
}

/* must be called only when the card's transmit is completely halted */
static void mwl8k_txq_deinit(struct ieee80211_hw *hw, int index)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_tx_queue *txq = priv->txq + index;

	mwl8k_txq_reclaim(hw, index, 1);

	kfree(txq->tx_skb);
	txq->tx_skb = NULL;

	pci_free_consistent(priv->pdev,
			    MWL8K_TX_DESCS * sizeof(struct mwl8k_tx_desc),
			    txq->tx_desc_area, txq->tx_desc_dma);
	txq->tx_desc_area = NULL;
}

static int
mwl8k_txq_xmit(struct ieee80211_hw *hw, int index, struct sk_buff *skb)
{
	struct mwl8k_priv *priv = hw->priv;
	struct ieee80211_tx_info *tx_info;
	struct ieee80211_hdr *wh;
	struct mwl8k_tx_queue *txq;
	struct mwl8k_tx_desc *tx;
	struct mwl8k_dma_data *tr;
	struct mwl8k_vif *mwl8k_vif;
	struct sk_buff *org_skb = skb;
	dma_addr_t dma;
	u16 qos = 0;
	bool qosframe = false, ampduframe = false;
	bool mcframe = false, eapolframe = false;
	bool amsduframe = false;
	__le16 fc;

	txq = priv->txq + index;
	tx = txq->tx_desc_area + txq->tx_tail;

	BUG_ON(txq->tx_skb[txq->tx_tail].skb != NULL);

	/*
	 * Append HW DMA header to start of packet.  Drop packet if
	 * there is not enough space or a failure to unshare/unclone
	 * the skb.
	 */
	skb = mwl8k_add_dma_header(skb);

	if (skb == NULL) {
		printk(KERN_DEBUG "%s: failed to prepend HW DMA "
			"header, dropping TX frame.\n", priv->name);
		dev_kfree_skb(org_skb);
		return NETDEV_TX_OK;
	}

	tx_info = IEEE80211_SKB_CB(skb);
	mwl8k_vif = MWL8K_VIF(tx_info->control.vif);
	tr = (struct mwl8k_dma_data *)skb->data;
	wh = &tr->wh;
	fc = wh->frame_control;
	qosframe = ieee80211_is_data_qos(fc);
	mcframe = is_multicast_ether_addr(wh->addr1);
	ampduframe = !!(tx_info->flags & IEEE80211_TX_CTL_AMPDU);

	if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
		u16 seqno = mwl8k_vif->seqno;
		wh->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
		wh->seq_ctrl |= cpu_to_le16(seqno << 4);
		mwl8k_vif->seqno = seqno++ % 4096;
	}

	if (qosframe)
		qos = le16_to_cpu(*((__le16 *)ieee80211_get_qos_ctl(wh)));

	dma = pci_map_single(priv->pdev, skb->data,
				skb->len, PCI_DMA_TODEVICE);

	if (pci_dma_mapping_error(priv->pdev, dma)) {
		printk(KERN_DEBUG "%s: failed to dma map skb, "
			"dropping TX frame.\n", priv->name);

		if (org_skb != NULL)
			dev_kfree_skb(org_skb);
		if (skb != NULL)
			dev_kfree_skb(skb);
		return NETDEV_TX_OK;
	}

	/* Set desc header, cpu bit order.  */
	tx->status = 0;
	tx->data_rate = 0;
	tx->tx_priority = index;
	tx->qos_control = 0;
	tx->rate_info = 0;
	tx->peer_id = mwl8k_vif->peer_id;

	amsduframe = !!(qos & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT);

	/* Setup firmware control bit fields for each frame type.  */
	if (ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc)) {
		tx->data_rate = 0;
		qos = mwl8k_qos_setbit_eosp(qos);
		/* Set Queue size to unspecified */
		qos = mwl8k_qos_setbit_qlen(qos, 0xff);
	} else if (ieee80211_is_data(fc)) {
		tx->data_rate = 1;
		if (mcframe)
			tx->status |= MWL8K_TXD_STATUS_MULTICAST_TX;

		/*
		 * Tell firmware to not send EAPOL pkts in an
		 * aggregate.  Verify against mac80211 tx path.  If
		 * stack turns off AMPDU for an EAPOL frame this
		 * check will be removed.
		 */
		if (eapolframe) {
			qos = mwl8k_qos_setbit_ack(qos,
				MWL8K_TXD_ACK_POLICY_NORMAL);
		} else {
			/* Send pkt in an aggregate if AMPDU frame.  */
			if (ampduframe)
				qos = mwl8k_qos_setbit_ack(qos,
					MWL8K_TXD_ACK_POLICY_BLOCKACK);
			else
				qos = mwl8k_qos_setbit_ack(qos,
					MWL8K_TXD_ACK_POLICY_NORMAL);

			if (amsduframe)
				qos = mwl8k_qos_setbit_amsdu(qos);
		}
	}

	/* Convert to little endian */
	tx->qos_control = cpu_to_le16(qos);
	tx->status = cpu_to_le32(tx->status);
	tx->pkt_phys_addr = cpu_to_le32(dma);
	tx->pkt_len = cpu_to_le16(skb->len);

	txq->tx_skb[txq->tx_tail].skb = skb;
	txq->tx_skb[txq->tx_tail].clone =
		skb == org_skb ? NULL : org_skb;

	spin_lock_bh(&priv->tx_lock);

	tx->status = cpu_to_le32(MWL8K_TXD_STATUS_OK |
					MWL8K_TXD_STATUS_FW_OWNED);
	wmb();
	txq->tx_stats.len++;
	priv->pending_tx_pkts++;
	txq->tx_stats.count++;
	txq->tx_tail++;

	if (txq->tx_tail == MWL8K_TX_DESCS)
		txq->tx_tail = 0;
	if (txq->tx_head == txq->tx_tail)
		ieee80211_stop_queue(hw, index);

	if (priv->inconfig) {
		/*
		 * Silently queue packet when we are in the middle of
		 * a config cycle.  Notify firmware only if we are
		 * waiting for TXQs to empty.  If a packet is sent
		 * before .config() is complete, perhaps it is better
		 * to drop the packet, as the channel is being changed
		 * and the packet will end up on the wrong channel.
		 */
		printk(KERN_ERR "%s(): WARNING TX activity while "
			"in config\n", __func__);

		if (priv->tx_wait != NULL)
			mwl8k_tx_start(priv);
	} else
		mwl8k_tx_start(priv);

	spin_unlock_bh(&priv->tx_lock);

	return NETDEV_TX_OK;
}


/*
 * Command processing.
 */

/* Timeout firmware commands after 2000ms */
#define MWL8K_CMD_TIMEOUT_MS	2000

static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd)
{
	DECLARE_COMPLETION_ONSTACK(cmd_wait);
	struct mwl8k_priv *priv = hw->priv;
	void __iomem *regs = priv->regs;
	dma_addr_t dma_addr;
	unsigned int dma_size;
	int rc;
	u16 __iomem *result;
	unsigned long timeout = 0;
	u8 buf[32];

	cmd->result = 0xFFFF;
	dma_size = le16_to_cpu(cmd->length);
	dma_addr = pci_map_single(priv->pdev, cmd, dma_size,
				  PCI_DMA_BIDIRECTIONAL);
	if (pci_dma_mapping_error(priv->pdev, dma_addr))
		return -ENOMEM;

	if (priv->hostcmd_wait != NULL)
		printk(KERN_ERR "WARNING host command in progress\n");

	spin_lock_irq(&priv->fw_lock);
	priv->hostcmd_wait = &cmd_wait;
	iowrite32(dma_addr, regs + MWL8K_HIU_GEN_PTR);
	iowrite32(MWL8K_H2A_INT_DOORBELL,
		regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
	iowrite32(MWL8K_H2A_INT_DUMMY,
		regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
	spin_unlock_irq(&priv->fw_lock);

	timeout = wait_for_completion_timeout(&cmd_wait,
				msecs_to_jiffies(MWL8K_CMD_TIMEOUT_MS));

	result = &cmd->result;
	if (!timeout) {
		spin_lock_irq(&priv->fw_lock);
		priv->hostcmd_wait = NULL;
		spin_unlock_irq(&priv->fw_lock);
		printk(KERN_ERR "%s: Command %s timeout after %u ms\n",
		       priv->name,
		       mwl8k_cmd_name(cmd->code, buf, sizeof(buf)),
		       MWL8K_CMD_TIMEOUT_MS);
		rc = -ETIMEDOUT;
	} else {
		rc = *result ? -EINVAL : 0;
		if (rc)
			printk(KERN_ERR "%s: Command %s error 0x%x\n",
			       priv->name,
			       mwl8k_cmd_name(cmd->code, buf, sizeof(buf)),
			       *result);
	}

	pci_unmap_single(priv->pdev, dma_addr, dma_size,
					PCI_DMA_BIDIRECTIONAL);
	return rc;
}

/*
 * GET_HW_SPEC.
 */
struct mwl8k_cmd_get_hw_spec {
	struct mwl8k_cmd_pkt header;
	__u8 hw_rev;
	__u8 host_interface;
	__le16 num_mcaddrs;
	__u8 perm_addr[IEEE80211_ADDR_LEN];
	__le16 region_code;
	__le32 fw_rev;
	__le32 ps_cookie;
	__le32 caps;
	__u8 mcs_bitmap[16];
	__le32 rx_queue_ptr;
	__le32 num_tx_queues;
	__le32 tx_queue_ptrs[MWL8K_TX_QUEUES];
	__le32 caps2;
	__le32 num_tx_desc_per_queue;
	__le32 total_rx_desc;
} __attribute__((packed));

static int mwl8k_cmd_get_hw_spec(struct ieee80211_hw *hw)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_cmd_get_hw_spec *cmd;
	int rc;
	int i;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_GET_HW_SPEC);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));

	memset(cmd->perm_addr, 0xff, sizeof(cmd->perm_addr));
	cmd->ps_cookie = cpu_to_le32(priv->cookie_dma);
	cmd->rx_queue_ptr = cpu_to_le32(priv->rxq[0].rx_desc_dma);
	cmd->num_tx_queues = MWL8K_TX_QUEUES;
	for (i = 0; i < MWL8K_TX_QUEUES; i++)
		cmd->tx_queue_ptrs[i] = cpu_to_le32(priv->txq[i].tx_desc_dma);
	cmd->num_tx_desc_per_queue = MWL8K_TX_DESCS;
	cmd->total_rx_desc = MWL8K_RX_DESCS;

	rc = mwl8k_post_cmd(hw, &cmd->header);

	if (!rc) {
		SET_IEEE80211_PERM_ADDR(hw, cmd->perm_addr);
		priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs);
		priv->fw_rev = cmd->fw_rev;
		priv->hw_rev = cmd->hw_rev;
		priv->region_code = le16_to_cpu(cmd->region_code);
	}

	kfree(cmd);
	return rc;
}

/*
 * CMD_MAC_MULTICAST_ADR.
 */
struct mwl8k_cmd_mac_multicast_adr {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__le16 numaddr;
	__u8 addr[1][IEEE80211_ADDR_LEN];
};

#define MWL8K_ENABLE_RX_MULTICAST 0x000F
static int mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw,
					int mc_count,
					struct dev_addr_list *mclist)
{
	struct mwl8k_cmd_mac_multicast_adr *cmd;
	int index = 0;
	int rc;
	int size = sizeof(*cmd) + ((mc_count - 1) * IEEE80211_ADDR_LEN);
	cmd = kzalloc(size, GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_MAC_MULTICAST_ADR);
	cmd->header.length = cpu_to_le16(size);
	cmd->action = cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST);
	cmd->numaddr = cpu_to_le16(mc_count);
	while ((index < mc_count) && mclist) {
		if (mclist->da_addrlen != IEEE80211_ADDR_LEN) {
			rc = -EINVAL;
			goto mwl8k_cmd_mac_multicast_adr_exit;
		}
		memcpy(cmd->addr[index], mclist->da_addr, IEEE80211_ADDR_LEN);
		index++;
		mclist = mclist->next;
	}

	rc = mwl8k_post_cmd(hw, &cmd->header);

mwl8k_cmd_mac_multicast_adr_exit:
	kfree(cmd);
	return rc;
}

/*
 * CMD_802_11_GET_STAT.
 */
struct mwl8k_cmd_802_11_get_stat {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__le32 stats[64];
} __attribute__((packed));

#define MWL8K_STAT_ACK_FAILURE	9
#define MWL8K_STAT_RTS_FAILURE	12
#define MWL8K_STAT_FCS_ERROR	24
#define MWL8K_STAT_RTS_SUCCESS	11

static int mwl8k_cmd_802_11_get_stat(struct ieee80211_hw *hw,
				struct ieee80211_low_level_stats *stats)
{
	struct mwl8k_cmd_802_11_get_stat *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_GET_STAT);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le16(MWL8K_CMD_GET);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	if (!rc) {
		stats->dot11ACKFailureCount =
			le32_to_cpu(cmd->stats[MWL8K_STAT_ACK_FAILURE]);
		stats->dot11RTSFailureCount =
			le32_to_cpu(cmd->stats[MWL8K_STAT_RTS_FAILURE]);
		stats->dot11FCSErrorCount =
			le32_to_cpu(cmd->stats[MWL8K_STAT_FCS_ERROR]);
		stats->dot11RTSSuccessCount =
			le32_to_cpu(cmd->stats[MWL8K_STAT_RTS_SUCCESS]);
	}
	kfree(cmd);

	return rc;
}

/*
 * CMD_802_11_RADIO_CONTROL.
 */
struct mwl8k_cmd_802_11_radio_control {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__le16 control;
	__le16 radio_on;
} __attribute__((packed));

static int mwl8k_cmd_802_11_radio_control(struct ieee80211_hw *hw, int enable)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_cmd_802_11_radio_control *cmd;
	int rc;

	if (((enable & MWL8K_RADIO_ENABLE) == priv->radio_state) &&
	    !(enable & MWL8K_RADIO_FORCE))
		return 0;

	enable &= MWL8K_RADIO_ENABLE;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_RADIO_CONTROL);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le16(MWL8K_CMD_SET);
	cmd->control = cpu_to_le16(priv->radio_preamble);
	cmd->radio_on = cpu_to_le16(enable ? 0x0001 : 0x0000);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	if (!rc)
		priv->radio_state = enable;

	return rc;
}

static int
mwl8k_set_radio_preamble(struct ieee80211_hw *hw, bool short_preamble)
{
	struct mwl8k_priv *priv;

	if (hw == NULL || hw->priv == NULL)
		return -EINVAL;
	priv = hw->priv;

	priv->radio_preamble = (short_preamble ?
		MWL8K_RADIO_SHORT_PREAMBLE :
		MWL8K_RADIO_LONG_PREAMBLE);

	return mwl8k_cmd_802_11_radio_control(hw,
			MWL8K_RADIO_ENABLE | MWL8K_RADIO_FORCE);
}

/*
 * CMD_802_11_RF_TX_POWER.
 */
#define MWL8K_TX_POWER_LEVEL_TOTAL	8

struct mwl8k_cmd_802_11_rf_tx_power {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__le16 support_level;
	__le16 current_level;
	__le16 reserved;
	__le16 power_level_list[MWL8K_TX_POWER_LEVEL_TOTAL];
} __attribute__((packed));

static int mwl8k_cmd_802_11_rf_tx_power(struct ieee80211_hw *hw, int dBm)
{
	struct mwl8k_cmd_802_11_rf_tx_power *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_RF_TX_POWER);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le16(MWL8K_CMD_SET);
	cmd->support_level = cpu_to_le16(dBm);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_PRE_SCAN.
 */
struct mwl8k_cmd_set_pre_scan {
	struct mwl8k_cmd_pkt header;
} __attribute__((packed));

static int mwl8k_cmd_set_pre_scan(struct ieee80211_hw *hw)
{
	struct mwl8k_cmd_set_pre_scan *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_PRE_SCAN);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_POST_SCAN.
 */
struct mwl8k_cmd_set_post_scan {
	struct mwl8k_cmd_pkt header;
	__le32 isibss;
	__u8 bssid[IEEE80211_ADDR_LEN];
} __attribute__((packed));

static int
mwl8k_cmd_set_post_scan(struct ieee80211_hw *hw, __u8 mac[IEEE80211_ADDR_LEN])
{
	struct mwl8k_cmd_set_post_scan *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_POST_SCAN);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->isibss = 0;
	memcpy(cmd->bssid, mac, IEEE80211_ADDR_LEN);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_RF_CHANNEL.
 */
struct mwl8k_cmd_set_rf_channel {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__u8 current_channel;
	__le32 channel_flags;
} __attribute__((packed));

static int mwl8k_cmd_set_rf_channel(struct ieee80211_hw *hw,
				    struct ieee80211_channel *channel)
{
	struct mwl8k_cmd_set_rf_channel *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RF_CHANNEL);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le16(MWL8K_CMD_SET);
	cmd->current_channel = channel->hw_value;
	if (channel->band == IEEE80211_BAND_2GHZ)
		cmd->channel_flags = cpu_to_le32(0x00000081);
	else
		cmd->channel_flags = cpu_to_le32(0x00000000);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_SLOT.
 */
struct mwl8k_cmd_set_slot {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__u8 short_slot;
} __attribute__((packed));

static int mwl8k_cmd_set_slot(struct ieee80211_hw *hw, int slot_time)
{
	struct mwl8k_cmd_set_slot *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_SLOT);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le16(MWL8K_CMD_SET);
	cmd->short_slot = slot_time == MWL8K_SHORT_SLOTTIME ? 1 : 0;

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_MIMO_CONFIG.
 */
struct mwl8k_cmd_mimo_config {
	struct mwl8k_cmd_pkt header;
	__le32 action;
	__u8 rx_antenna_map;
	__u8 tx_antenna_map;
} __attribute__((packed));

static int mwl8k_cmd_mimo_config(struct ieee80211_hw *hw, __u8 rx, __u8 tx)
{
	struct mwl8k_cmd_mimo_config *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_MIMO_CONFIG);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le32((u32)MWL8K_CMD_SET);
	cmd->rx_antenna_map = rx;
	cmd->tx_antenna_map = tx;

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_ENABLE_SNIFFER.
 */
struct mwl8k_cmd_enable_sniffer {
	struct mwl8k_cmd_pkt header;
	__le32 action;
} __attribute__((packed));

static int mwl8k_enable_sniffer(struct ieee80211_hw *hw, bool enable)
{
	struct mwl8k_cmd_enable_sniffer *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_ENABLE_SNIFFER);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = enable ? cpu_to_le32((u32)MWL8K_CMD_SET) : 0;

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_RATE_ADAPT_MODE.
 */
struct mwl8k_cmd_set_rate_adapt_mode {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__le16 mode;
} __attribute__((packed));

static int mwl8k_cmd_setrateadaptmode(struct ieee80211_hw *hw, __u16 mode)
{
	struct mwl8k_cmd_set_rate_adapt_mode *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RATEADAPT_MODE);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le16(MWL8K_CMD_SET);
	cmd->mode = cpu_to_le16(mode);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_WMM_MODE.
 */
struct mwl8k_cmd_set_wmm {
	struct mwl8k_cmd_pkt header;
	__le16 action;
} __attribute__((packed));

static int mwl8k_set_wmm(struct ieee80211_hw *hw, bool enable)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_cmd_set_wmm *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_WMM_MODE);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = enable ? cpu_to_le16(MWL8K_CMD_SET) : 0;

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	if (!rc)
		priv->wmm_mode = enable;

	return rc;
}

/*
 * CMD_SET_RTS_THRESHOLD.
 */
struct mwl8k_cmd_rts_threshold {
	struct mwl8k_cmd_pkt header;
	__le16 action;
	__le16 threshold;
} __attribute__((packed));

static int mwl8k_rts_threshold(struct ieee80211_hw *hw,
			       u16 action, u16 *threshold)
{
	struct mwl8k_cmd_rts_threshold *cmd;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_RTS_THRESHOLD);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->action = cpu_to_le16(action);
	cmd->threshold = cpu_to_le16(*threshold);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_EDCA_PARAMS.
 */
struct mwl8k_cmd_set_edca_params {
	struct mwl8k_cmd_pkt header;

	/* See MWL8K_SET_EDCA_XXX below */
	__le16 action;

	/* TX opportunity in units of 32 us */
	__le16 txop;

	/* Log exponent of max contention period: 0...15*/
	__u8 log_cw_max;

	/* Log exponent of min contention period: 0...15 */
	__u8 log_cw_min;

	/* Adaptive interframe spacing in units of 32us */
	__u8 aifs;

	/* TX queue to configure */
	__u8 txq;
} __attribute__((packed));

#define MWL8K_GET_EDCA_ALL	0
#define MWL8K_SET_EDCA_CW	0x01
#define MWL8K_SET_EDCA_TXOP	0x02
#define MWL8K_SET_EDCA_AIFS	0x04

#define MWL8K_SET_EDCA_ALL	(MWL8K_SET_EDCA_CW | \
				 MWL8K_SET_EDCA_TXOP | \
				 MWL8K_SET_EDCA_AIFS)

static int
mwl8k_set_edca_params(struct ieee80211_hw *hw, __u8 qnum,
		__u16 cw_min, __u16 cw_max,
		__u8 aifs, __u16 txop)
{
	struct mwl8k_cmd_set_edca_params *cmd;
	u32 log_cw_min, log_cw_max;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	log_cw_min = ilog2(cw_min+1);
	log_cw_max = ilog2(cw_max+1);
	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_EDCA_PARAMS);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));

	cmd->action = cpu_to_le16(MWL8K_SET_EDCA_ALL);
	cmd->txop = cpu_to_le16(txop);
	cmd->log_cw_max = (u8)log_cw_max;
	cmd->log_cw_min = (u8)log_cw_min;
	cmd->aifs = aifs;
	cmd->txq = qnum;

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_FINALIZE_JOIN.
 */

/* FJ beacon buffer size is compiled into the firmware.  */
#define MWL8K_FJ_BEACON_MAXLEN	128

struct mwl8k_cmd_finalize_join {
	struct mwl8k_cmd_pkt header;
	__le32 sleep_interval;	/* Number of beacon periods to sleep */
	__u8 beacon_data[MWL8K_FJ_BEACON_MAXLEN];
} __attribute__((packed));

static int mwl8k_finalize_join(struct ieee80211_hw *hw, void *frame,
				__u16 framelen, __u16 dtim)
{
	struct mwl8k_cmd_finalize_join *cmd;
	struct ieee80211_mgmt *payload = frame;
	u16 hdrlen;
	u32 payload_len;
	int rc;

	if (frame == NULL)
		return -EINVAL;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_FINALIZE_JOIN);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));

	if (dtim)
		cmd->sleep_interval = cpu_to_le32(dtim);
	else
		cmd->sleep_interval = cpu_to_le32(1);

	hdrlen = ieee80211_hdrlen(payload->frame_control);

	payload_len = framelen > hdrlen ? framelen - hdrlen : 0;

	/* XXX TBD Might just have to abort and return an error */
	if (payload_len > MWL8K_FJ_BEACON_MAXLEN)
		printk(KERN_ERR "%s(): WARNING: Incomplete beacon "
			"sent to firmware. Sz=%u MAX=%u\n", __func__,
			payload_len, MWL8K_FJ_BEACON_MAXLEN);

	payload_len = payload_len > MWL8K_FJ_BEACON_MAXLEN ?
				MWL8K_FJ_BEACON_MAXLEN : payload_len;

	if (payload && payload_len)
		memcpy(cmd->beacon_data, &payload->u.beacon, payload_len);

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);
	return rc;
}

/*
 * CMD_UPDATE_STADB.
 */
struct mwl8k_cmd_update_sta_db {
	struct mwl8k_cmd_pkt header;

	/* See STADB_ACTION_TYPE */
	__le32	action;

	/* Peer MAC address */
	__u8	peer_addr[IEEE80211_ADDR_LEN];

	__le32	reserved;

	/* Peer info - valid during add/update.  */
	struct peer_capability_info	peer_info;
} __attribute__((packed));

static int mwl8k_cmd_update_sta_db(struct ieee80211_hw *hw,
		struct ieee80211_vif *vif, __u32 action)
{
	struct mwl8k_vif *mv_vif = MWL8K_VIF(vif);
	struct ieee80211_bss_conf *info = &mv_vif->bss_info;
	struct mwl8k_cmd_update_sta_db *cmd;
	struct peer_capability_info *peer_info;
	struct ieee80211_rate *bitrates = mv_vif->legacy_rates;
	DECLARE_MAC_BUF(mac);
	int rc;
	__u8 count, *rates;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_UPDATE_STADB);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));

	cmd->action = cpu_to_le32(action);
	peer_info = &cmd->peer_info;
	memcpy(cmd->peer_addr, mv_vif->bssid, IEEE80211_ADDR_LEN);

	switch (action) {
	case MWL8K_STA_DB_ADD_ENTRY:
	case MWL8K_STA_DB_MODIFY_ENTRY:
		/* Build peer_info block */
		peer_info->peer_type = MWL8K_PEER_TYPE_ACCESSPOINT;
		peer_info->basic_caps = cpu_to_le16(info->assoc_capability);
		peer_info->interop = 1;
		peer_info->amsdu_enabled = 0;

		rates = peer_info->legacy_rates;
		for (count = 0 ; count < mv_vif->legacy_nrates; count++)
			rates[count] = bitrates[count].hw_value;

		rc = mwl8k_post_cmd(hw, &cmd->header);
		if (rc == 0)
			mv_vif->peer_id = peer_info->station_id;

		break;

	case MWL8K_STA_DB_DEL_ENTRY:
	case MWL8K_STA_DB_FLUSH:
	default:
		rc = mwl8k_post_cmd(hw, &cmd->header);
		if (rc == 0)
			mv_vif->peer_id = 0;
		break;
	}
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_AID.
 */
#define IEEE80211_OPMODE_DISABLED			0x00
#define IEEE80211_OPMODE_NON_MEMBER_PROT_MODE		0x01
#define IEEE80211_OPMODE_ONE_20MHZ_STA_PROT_MODE	0x02
#define IEEE80211_OPMODE_HTMIXED_PROT_MODE		0x03

#define MWL8K_RATE_INDEX_MAX_ARRAY			14

#define MWL8K_FRAME_PROT_DISABLED			0x00
#define MWL8K_FRAME_PROT_11G				0x07
#define MWL8K_FRAME_PROT_11N_HT_40MHZ_ONLY		0x02
#define MWL8K_FRAME_PROT_11N_HT_ALL			0x06
#define MWL8K_FRAME_PROT_MASK				0x07

struct mwl8k_cmd_update_set_aid {
	struct	mwl8k_cmd_pkt header;
	__le16	aid;

	 /* AP's MAC address (BSSID) */
	__u8	bssid[IEEE80211_ADDR_LEN];
	__le16	protection_mode;
	__u8	supp_rates[MWL8K_RATE_INDEX_MAX_ARRAY];
} __attribute__((packed));

static int mwl8k_cmd_set_aid(struct ieee80211_hw *hw,
					struct ieee80211_vif *vif)
{
	struct mwl8k_vif *mv_vif = MWL8K_VIF(vif);
	struct ieee80211_bss_conf *info = &mv_vif->bss_info;
	struct mwl8k_cmd_update_set_aid *cmd;
	struct ieee80211_rate *bitrates = mv_vif->legacy_rates;
	int count;
	u16 prot_mode;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_AID);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));
	cmd->aid = cpu_to_le16(info->aid);

	memcpy(cmd->bssid, mv_vif->bssid, IEEE80211_ADDR_LEN);

	prot_mode = MWL8K_FRAME_PROT_DISABLED;

	if (info->use_cts_prot) {
		prot_mode = MWL8K_FRAME_PROT_11G;
	} else {
		switch (info->ht.operation_mode &
			IEEE80211_HT_OP_MODE_PROTECTION) {
		case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
			prot_mode = MWL8K_FRAME_PROT_11N_HT_40MHZ_ONLY;
			break;
		case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
			prot_mode = MWL8K_FRAME_PROT_11N_HT_ALL;
			break;
		default:
			prot_mode = MWL8K_FRAME_PROT_DISABLED;
			break;
		}
	}

	cmd->protection_mode = cpu_to_le16(prot_mode);

	for (count = 0; count < mv_vif->legacy_nrates; count++)
		cmd->supp_rates[count] = bitrates[count].hw_value;

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_SET_RATE.
 */
struct mwl8k_cmd_update_rateset {
	struct	mwl8k_cmd_pkt header;
	__u8	legacy_rates[MWL8K_RATE_INDEX_MAX_ARRAY];

	/* Bitmap for supported MCS codes.  */
	__u8	mcs_set[MWL8K_IEEE_LEGACY_DATA_RATES];
	__u8	reserved[MWL8K_IEEE_LEGACY_DATA_RATES];
} __attribute__((packed));

static int mwl8k_update_rateset(struct ieee80211_hw *hw,
		struct ieee80211_vif *vif)
{
	struct mwl8k_vif *mv_vif = MWL8K_VIF(vif);
	struct mwl8k_cmd_update_rateset *cmd;
	struct ieee80211_rate *bitrates = mv_vif->legacy_rates;
	int count;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RATE);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));

	for (count = 0; count < mv_vif->legacy_nrates; count++)
		cmd->legacy_rates[count] = bitrates[count].hw_value;

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}

/*
 * CMD_USE_FIXED_RATE.
 */
#define MWL8K_RATE_TABLE_SIZE	8
#define MWL8K_UCAST_RATE	0
#define MWL8K_MCAST_RATE	1
#define MWL8K_BCAST_RATE	2

#define MWL8K_USE_FIXED_RATE	0x0001
#define MWL8K_USE_AUTO_RATE	0x0002

struct mwl8k_rate_entry {
	/* Set to 1 if HT rate, 0 if legacy.  */
	__le32	is_ht_rate;

	/* Set to 1 to use retry_count field.  */
	__le32	enable_retry;

	/* Specified legacy rate or MCS.  */
	__le32	rate;

	/* Number of allowed retries.  */
	__le32	retry_count;
} __attribute__((packed));

struct mwl8k_rate_table {
	/* 1 to allow specified rate and below */
	__le32	allow_rate_drop;
	__le32	num_rates;
	struct mwl8k_rate_entry rate_entry[MWL8K_RATE_TABLE_SIZE];
} __attribute__((packed));

struct mwl8k_cmd_use_fixed_rate {
	struct	mwl8k_cmd_pkt header;
	__le32	action;
	struct mwl8k_rate_table rate_table;

	/* Unicast, Broadcast or Multicast */
	__le32	rate_type;
	__le32	reserved1;
	__le32	reserved2;
} __attribute__((packed));

static int mwl8k_cmd_use_fixed_rate(struct ieee80211_hw *hw,
	u32 action, u32 rate_type, struct mwl8k_rate_table *rate_table)
{
	struct mwl8k_cmd_use_fixed_rate *cmd;
	int count;
	int rc;

	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
	if (cmd == NULL)
		return -ENOMEM;

	cmd->header.code = cpu_to_le16(MWL8K_CMD_USE_FIXED_RATE);
	cmd->header.length = cpu_to_le16(sizeof(*cmd));

	cmd->action = cpu_to_le32(action);
	cmd->rate_type = cpu_to_le32(rate_type);

	if (rate_table != NULL) {
		/* Copy over each field manually so
		* that bitflipping can be done
		*/
		cmd->rate_table.allow_rate_drop =
				cpu_to_le32(rate_table->allow_rate_drop);
		cmd->rate_table.num_rates =
				cpu_to_le32(rate_table->num_rates);

		for (count = 0; count < rate_table->num_rates; count++) {
			struct mwl8k_rate_entry *dst =
				&cmd->rate_table.rate_entry[count];
			struct mwl8k_rate_entry *src =
				&rate_table->rate_entry[count];

			dst->is_ht_rate = cpu_to_le32(src->is_ht_rate);
			dst->enable_retry = cpu_to_le32(src->enable_retry);
			dst->rate = cpu_to_le32(src->rate);
			dst->retry_count = cpu_to_le32(src->retry_count);
		}
	}

	rc = mwl8k_post_cmd(hw, &cmd->header);
	kfree(cmd);

	return rc;
}


/*
 * Interrupt handling.
 */
static irqreturn_t mwl8k_interrupt(int irq, void *dev_id)
{
	struct ieee80211_hw *hw = dev_id;
	struct mwl8k_priv *priv = hw->priv;
	u32 status;

	status = ioread32(priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
	iowrite32(~status, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);

	status &= priv->int_mask;
	if (!status)
		return IRQ_NONE;

	if (status & MWL8K_A2H_INT_TX_DONE)
		tasklet_schedule(&priv->tx_reclaim_task);

	if (status & MWL8K_A2H_INT_RX_READY) {
		while (rxq_process(hw, 0, 1))
			rxq_refill(hw, 0, 1);
	}

	if (status & MWL8K_A2H_INT_OPC_DONE) {
		if (priv->hostcmd_wait != NULL) {
			complete(priv->hostcmd_wait);
			priv->hostcmd_wait = NULL;
		}
	}

	if (status & MWL8K_A2H_INT_QUEUE_EMPTY) {
		if (!priv->inconfig &&
			priv->radio_state &&
			mwl8k_txq_busy(priv))
				mwl8k_tx_start(priv);
	}

	return IRQ_HANDLED;
}


/*
 * Core driver operations.
 */
static int mwl8k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
{
	struct mwl8k_priv *priv = hw->priv;
	int index = skb_get_queue_mapping(skb);
	int rc;

	if (priv->current_channel == NULL) {
		printk(KERN_DEBUG "%s: dropped TX frame since radio "
		       "disabled\n", priv->name);
		dev_kfree_skb(skb);
		return NETDEV_TX_OK;
	}

	rc = mwl8k_txq_xmit(hw, index, skb);

	return rc;
}

struct mwl8k_work_struct {
	/* Initialized by mwl8k_queue_work().  */
	struct work_struct wt;

	/* Required field passed in to mwl8k_queue_work().  */
	struct ieee80211_hw *hw;

	/* Required field passed in to mwl8k_queue_work().  */
	int (*wfunc)(struct work_struct *w);

	/* Initialized by mwl8k_queue_work().  */
	struct completion *cmd_wait;

	/* Result code.  */
	int rc;

	/*
	 * Optional field. Refer to explanation of MWL8K_WQ_XXX_XXX
	 * flags for explanation.  Defaults to MWL8K_WQ_DEFAULT_OPTIONS.
	 */
	u32 options;

	/* Optional field.  Defaults to MWL8K_CONFIG_TIMEOUT_MS.  */
	unsigned long timeout_ms;

	/* Optional field.  Defaults to MWL8K_WQ_TXWAIT_ATTEMPTS.  */
	u32 txwait_attempts;

	/* Optional field.  Defaults to MWL8K_TXWAIT_MS.  */
	u32 tx_timeout_ms;
	u32 step;
};

/* Flags controlling behavior of config queue requests */

/* Caller spins while waiting for completion.  */
#define MWL8K_WQ_SPIN			0x00000001

/* Wait for TX queues to empty before proceeding with configuration.  */
#define MWL8K_WQ_TX_WAIT_EMPTY		0x00000002

/* Queue request and return immediately.  */
#define MWL8K_WQ_POST_REQUEST		0x00000004

/*
 * Caller sleeps and waits for task complete notification.
 * Do not use in atomic context.
 */
#define MWL8K_WQ_SLEEP			0x00000008

/* Free work struct when task is done.  */
#define MWL8K_WQ_FREE_WORKSTRUCT	0x00000010

/*
 * Config request is queued and returns to caller imediately.  Use
 * this in atomic context. Work struct is freed by mwl8k_queue_work()
 * when this flag is set.
 */
#define MWL8K_WQ_QUEUE_ONLY	(MWL8K_WQ_POST_REQUEST | \
				 MWL8K_WQ_FREE_WORKSTRUCT)

/* Default work queue behavior is to sleep and wait for tx completion.  */
#define MWL8K_WQ_DEFAULT_OPTIONS (MWL8K_WQ_SLEEP | MWL8K_WQ_TX_WAIT_EMPTY)

/*
 * Default config request timeout.  Add adjustments to make sure the
 * config thread waits long enough for both tx wait and cmd wait before
 * timing out.
 */

/* Time to wait for all TXQs to drain.  TX Doorbell is pressed each time.  */
#define MWL8K_TXWAIT_TIMEOUT_MS		1000

/* Default number of TX wait attempts.  */
#define MWL8K_WQ_TXWAIT_ATTEMPTS	4

/* Total time to wait for TXQ to drain.  */
#define MWL8K_TXWAIT_MS			(MWL8K_TXWAIT_TIMEOUT_MS * \
						MWL8K_WQ_TXWAIT_ATTEMPTS)

/* Scheduling slop.  */
#define MWL8K_OS_SCHEDULE_OVERHEAD_MS	200

#define MWL8K_CONFIG_TIMEOUT_MS	(MWL8K_CMD_TIMEOUT_MS + \
				 MWL8K_TXWAIT_MS + \
				 MWL8K_OS_SCHEDULE_OVERHEAD_MS)

static void mwl8k_config_thread(struct work_struct *wt)
{
	struct mwl8k_work_struct *worker = (struct mwl8k_work_struct *)wt;
	struct ieee80211_hw *hw = worker->hw;
	struct mwl8k_priv *priv = hw->priv;
	int rc = 0;

	spin_lock_irq(&priv->tx_lock);
	priv->inconfig = true;
	spin_unlock_irq(&priv->tx_lock);

	ieee80211_stop_queues(hw);

	/*
	 * Wait for host queues to drain before doing PHY
	 * reconfiguration. This avoids interrupting any in-flight
	 * DMA transfers to the hardware.
	 */
	if (worker->options & MWL8K_WQ_TX_WAIT_EMPTY) {
		u32 timeout;
		u32 time_remaining;
		u32 iter;
		u32 tx_wait_attempts = worker->txwait_attempts;

		time_remaining = worker->tx_timeout_ms;
		if (!tx_wait_attempts)
			tx_wait_attempts = 1;

		timeout = worker->tx_timeout_ms/tx_wait_attempts;
		if (!timeout)
			timeout = 1;

		iter = tx_wait_attempts;
		do {
			int wait_time;

			if (time_remaining > timeout) {
				time_remaining -= timeout;
				wait_time = timeout;
			} else
				wait_time = time_remaining;

			if (!wait_time)
				wait_time = 1;

			rc = mwl8k_tx_wait_empty(hw, wait_time);
			if (rc)
				printk(KERN_ERR "%s() txwait timeout=%ums "
					"Retry:%u/%u\n", __func__, timeout,
					tx_wait_attempts - iter + 1,
					tx_wait_attempts);

		} while (rc && --iter);

		rc = iter ? 0 : -ETIMEDOUT;
	}
	if (!rc)
		rc = worker->wfunc(wt);

	spin_lock_irq(&priv->tx_lock);
	priv->inconfig = false;
	if (priv->pending_tx_pkts && priv->radio_state)
		mwl8k_tx_start(priv);
	spin_unlock_irq(&priv->tx_lock);
	ieee80211_wake_queues(hw);

	worker->rc = rc;
	if (worker->options & MWL8K_WQ_SLEEP)
		complete(worker->cmd_wait);

	if (worker->options & MWL8K_WQ_FREE_WORKSTRUCT)
		kfree(wt);
}

static int mwl8k_queue_work(struct ieee80211_hw *hw,
				struct mwl8k_work_struct *worker,
				struct workqueue_struct *wqueue,
				int (*wfunc)(struct work_struct *w))
{
	unsigned long timeout = 0;
	int rc = 0;

	DECLARE_COMPLETION_ONSTACK(cmd_wait);

	if (!worker->timeout_ms)
		worker->timeout_ms = MWL8K_CONFIG_TIMEOUT_MS;

	if (!worker->options)
		worker->options = MWL8K_WQ_DEFAULT_OPTIONS;

	if (!worker->txwait_attempts)
		worker->txwait_attempts = MWL8K_WQ_TXWAIT_ATTEMPTS;

	if (!worker->tx_timeout_ms)
		worker->tx_timeout_ms = MWL8K_TXWAIT_MS;

	worker->hw = hw;
	worker->cmd_wait = &cmd_wait;
	worker->rc = 1;
	worker->wfunc = wfunc;

	INIT_WORK(&worker->wt, mwl8k_config_thread);
	queue_work(wqueue, &worker->wt);

	if (worker->options & MWL8K_WQ_POST_REQUEST) {
		rc = 0;
	} else {
		if (worker->options & MWL8K_WQ_SPIN) {
			timeout = worker->timeout_ms;
			while (timeout && (worker->rc > 0)) {
				mdelay(1);
				timeout--;
			}
		} else if (worker->options & MWL8K_WQ_SLEEP)
			timeout = wait_for_completion_timeout(&cmd_wait,
				msecs_to_jiffies(worker->timeout_ms));

		if (timeout)
			rc = worker->rc;
		else {
			cancel_work_sync(&worker->wt);
			rc = -ETIMEDOUT;
		}
	}

	return rc;
}

struct mwl8k_start_worker {
	struct mwl8k_work_struct header;
};

static int mwl8k_start_wt(struct work_struct *wt)
{
	struct mwl8k_start_worker *worker = (struct mwl8k_start_worker *)wt;
	struct ieee80211_hw *hw = worker->header.hw;
	struct mwl8k_priv *priv = hw->priv;
	int rc = 0;

	if (priv->vif != NULL) {
		rc = -EIO;
		goto mwl8k_start_exit;
	}

	/* Turn on radio */
	if (mwl8k_cmd_802_11_radio_control(hw, MWL8K_RADIO_ENABLE)) {
		rc = -EIO;
		goto mwl8k_start_exit;
	}

	/* Purge TX/RX HW queues */
	if (mwl8k_cmd_set_pre_scan(hw)) {
		rc = -EIO;
		goto mwl8k_start_exit;
	}

	if (mwl8k_cmd_set_post_scan(hw, "\x00\x00\x00\x00\x00\x00")) {
		rc = -EIO;
		goto mwl8k_start_exit;
	}

	/* Enable firmware rate adaptation */
	if (mwl8k_cmd_setrateadaptmode(hw, 0)) {
		rc = -EIO;
		goto mwl8k_start_exit;
	}

	/* Disable WMM. WMM gets enabled when stack sends WMM parms */
	if (mwl8k_set_wmm(hw, MWL8K_WMM_DISABLE)) {
		rc = -EIO;
		goto mwl8k_start_exit;
	}

	/* Disable sniffer mode */
	if (mwl8k_enable_sniffer(hw, 0))
		rc = -EIO;

mwl8k_start_exit:
	return rc;
}

static int mwl8k_start(struct ieee80211_hw *hw)
{
	struct mwl8k_start_worker *worker;
	struct mwl8k_priv *priv = hw->priv;
	int rc;

	/* Enable tx reclaim tasklet */
	tasklet_enable(&priv->tx_reclaim_task);

	rc = request_irq(priv->pdev->irq, &mwl8k_interrupt,
			 IRQF_SHARED, MWL8K_NAME, hw);
	if (rc) {
		printk(KERN_ERR "%s: failed to register IRQ handler\n",
		       priv->name);
		rc = -EIO;
		goto mwl8k_start_disable_tasklet;
	}

	/* Enable interrupts */
	iowrite32(priv->int_mask, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);

	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
	if (worker == NULL) {
		rc = -ENOMEM;
		goto mwl8k_start_disable_irq;
	}

	rc = mwl8k_queue_work(hw, &worker->header,
			      priv->config_wq, mwl8k_start_wt);
	kfree(worker);
	if (!rc)
		return rc;

	if (rc == -ETIMEDOUT)
		printk(KERN_ERR "%s() timed out\n", __func__);

	rc = -EIO;

mwl8k_start_disable_irq:
	spin_lock_irq(&priv->tx_lock);
	iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
	spin_unlock_irq(&priv->tx_lock);
	free_irq(priv->pdev->irq, hw);

mwl8k_start_disable_tasklet:
	tasklet_disable(&priv->tx_reclaim_task);

	return rc;
}

struct mwl8k_stop_worker {
	struct mwl8k_work_struct header;
};

static int mwl8k_stop_wt(struct work_struct *wt)
{
	struct mwl8k_stop_worker *worker = (struct mwl8k_stop_worker *)wt;
	struct ieee80211_hw *hw = worker->header.hw;
	int rc;

	rc = mwl8k_cmd_802_11_radio_control(hw, MWL8K_RADIO_DISABLE);

	return rc;
}

static void mwl8k_stop(struct ieee80211_hw *hw)
{
	int rc;
	struct mwl8k_stop_worker *worker;
	struct mwl8k_priv *priv = hw->priv;
	int i;

	if (priv->vif != NULL)
		return;

	ieee80211_stop_queues(hw);

	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
	if (worker == NULL)
		return;

	rc = mwl8k_queue_work(hw, &worker->header,
			      priv->config_wq, mwl8k_stop_wt);
	kfree(worker);
	if (rc == -ETIMEDOUT)
		printk(KERN_ERR "%s() timed out\n", __func__);

	/* Disable interrupts */
	spin_lock_irq(&priv->tx_lock);
	iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
	spin_unlock_irq(&priv->tx_lock);
	free_irq(priv->pdev->irq, hw);

	/* Stop finalize join worker */
	cancel_work_sync(&priv->finalize_join_worker);
	if (priv->beacon_skb != NULL)
		dev_kfree_skb(priv->beacon_skb);

	/* Stop tx reclaim tasklet */
	tasklet_disable(&priv->tx_reclaim_task);

	/* Stop config thread */
	flush_workqueue(priv->config_wq);

	/* Return all skbs to mac80211 */
	for (i = 0; i < MWL8K_TX_QUEUES; i++)
		mwl8k_txq_reclaim(hw, i, 1);
}

static int mwl8k_add_interface(struct ieee80211_hw *hw,
				struct ieee80211_if_init_conf *conf)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_vif *mwl8k_vif;

	/*
	 * We only support one active interface at a time.
	 */
	if (priv->vif != NULL)
		return -EBUSY;

	/*
	 * We only support managed interfaces for now.
	 */
	if (conf->type != NL80211_IFTYPE_STATION &&
	    conf->type != NL80211_IFTYPE_MONITOR)
		return -EINVAL;

	/* Clean out driver private area */
	mwl8k_vif = MWL8K_VIF(conf->vif);
	memset(mwl8k_vif, 0, sizeof(*mwl8k_vif));

	/* Save the mac address */
	memcpy(mwl8k_vif->mac_addr, conf->mac_addr, IEEE80211_ADDR_LEN);

	/* Back pointer to parent config block */
	mwl8k_vif->priv = priv;

	/* Setup initial PHY parameters */
	memcpy(mwl8k_vif->legacy_rates ,
		priv->rates, sizeof(mwl8k_vif->legacy_rates));
	mwl8k_vif->legacy_nrates = ARRAY_SIZE(priv->rates);

	/* Set Initial sequence number to zero */
	mwl8k_vif->seqno = 0;

	priv->vif = conf->vif;
	priv->current_channel = NULL;

	return 0;
}

static void mwl8k_remove_interface(struct ieee80211_hw *hw,
				   struct ieee80211_if_init_conf *conf)
{
	struct mwl8k_priv *priv = hw->priv;

	if (priv->vif == NULL)
		return;

	priv->vif = NULL;
}

struct mwl8k_config_worker {
	struct mwl8k_work_struct header;
	u32 changed;
};

static int mwl8k_config_wt(struct work_struct *wt)
{
	struct mwl8k_config_worker *worker =
		(struct mwl8k_config_worker *)wt;
	struct ieee80211_hw *hw = worker->header.hw;
	struct ieee80211_conf *conf = &hw->conf;
	struct mwl8k_priv *priv = hw->priv;
	int rc = 0;

	if (!conf->radio_enabled) {
		mwl8k_cmd_802_11_radio_control(hw, MWL8K_RADIO_DISABLE);
		priv->current_channel = NULL;
		rc = 0;
		goto mwl8k_config_exit;
	}

	if (mwl8k_cmd_802_11_radio_control(hw, MWL8K_RADIO_ENABLE)) {
		rc = -EINVAL;
		goto mwl8k_config_exit;
	}

	priv->current_channel = conf->channel;

	if (mwl8k_cmd_set_rf_channel(hw, conf->channel)) {
		rc = -EINVAL;
		goto mwl8k_config_exit;
	}

	if (conf->power_level > 18)
		conf->power_level = 18;
	if (mwl8k_cmd_802_11_rf_tx_power(hw, conf->power_level)) {
		rc = -EINVAL;
		goto mwl8k_config_exit;
	}

	if (mwl8k_cmd_mimo_config(hw, 0x7, 0x7))
		rc = -EINVAL;

mwl8k_config_exit:
	return rc;
}

static int mwl8k_config(struct ieee80211_hw *hw, u32 changed)
{
	int rc = 0;
	struct mwl8k_config_worker *worker;
	struct mwl8k_priv *priv = hw->priv;

	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
	if (worker == NULL)
		return -ENOMEM;

	worker->changed = changed;
	rc = mwl8k_queue_work(hw, &worker->header,
			      priv->config_wq, mwl8k_config_wt);
	if (rc == -ETIMEDOUT) {
		printk(KERN_ERR "%s() timed out.\n", __func__);
		rc = -EINVAL;
	}

	kfree(worker);

	/*
	 * mac80211 will crash on anything other than -EINVAL on
	 * error. Looks like wireless extensions which calls mac80211
	 * may be the actual culprit...
	 */
	return rc ? -EINVAL : 0;
}

static int mwl8k_config_interface(struct ieee80211_hw *hw,
				  struct ieee80211_vif *vif,
				  struct ieee80211_if_conf *conf)
{
	struct mwl8k_vif *mv_vif = MWL8K_VIF(vif);
	u32 changed = conf->changed;

	if (changed & IEEE80211_IFCC_BSSID)
		memcpy(mv_vif->bssid, conf->bssid, IEEE80211_ADDR_LEN);

	return 0;
}

struct mwl8k_bss_info_changed_worker {
	struct mwl8k_work_struct header;
	struct ieee80211_vif *vif;
	struct ieee80211_bss_conf *info;
	u32 changed;
};

static int mwl8k_bss_info_changed_wt(struct work_struct *wt)
{
	struct mwl8k_bss_info_changed_worker *worker =
		(struct mwl8k_bss_info_changed_worker *)wt;
	struct ieee80211_hw *hw = worker->header.hw;
	struct ieee80211_vif *vif = worker->vif;
	struct ieee80211_bss_conf *info = worker->info;
	u32 changed;
	int rc;

	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);

	changed = worker->changed;
	priv->capture_beacon = false;

	if (info->assoc) {
		memcpy(&mwl8k_vif->bss_info, info,
			sizeof(struct ieee80211_bss_conf));

		/* Install rates */
		if (mwl8k_update_rateset(hw, vif))
			goto mwl8k_bss_info_changed_exit;

		/* Turn on rate adaptation */
		if (mwl8k_cmd_use_fixed_rate(hw, MWL8K_USE_AUTO_RATE,
			MWL8K_UCAST_RATE, NULL))
			goto mwl8k_bss_info_changed_exit;

		/* Set radio preamble */
		if (mwl8k_set_radio_preamble(hw,
				info->use_short_preamble))
			goto mwl8k_bss_info_changed_exit;

		/* Set slot time */
		if (mwl8k_cmd_set_slot(hw, info->use_short_slot ?
				MWL8K_SHORT_SLOTTIME : MWL8K_LONG_SLOTTIME))
			goto mwl8k_bss_info_changed_exit;

		/* Update peer rate info */
		if (mwl8k_cmd_update_sta_db(hw, vif,
				MWL8K_STA_DB_MODIFY_ENTRY))
			goto mwl8k_bss_info_changed_exit;

		/* Set AID */
		if (mwl8k_cmd_set_aid(hw, vif))
			goto mwl8k_bss_info_changed_exit;

		/*
		 * Finalize the join.  Tell rx handler to process
		 * next beacon from our BSSID.
		 */
		memcpy(priv->capture_bssid,
				mwl8k_vif->bssid, IEEE80211_ADDR_LEN);
		priv->capture_beacon = true;
	} else {
		mwl8k_cmd_update_sta_db(hw, vif, MWL8K_STA_DB_DEL_ENTRY);
		memset(&mwl8k_vif->bss_info, 0,
			sizeof(struct ieee80211_bss_conf));
		memset(mwl8k_vif->bssid, 0, IEEE80211_ADDR_LEN);
	}

mwl8k_bss_info_changed_exit:
	rc = 0;
	return rc;
}

static void mwl8k_bss_info_changed(struct ieee80211_hw *hw,
				   struct ieee80211_vif *vif,
				   struct ieee80211_bss_conf *info,
				   u32 changed)
{
	struct mwl8k_bss_info_changed_worker *worker;
	struct mwl8k_priv *priv = hw->priv;
	int rc;

	if ((changed & BSS_CHANGED_ASSOC) == 0)
		return;

	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
	if (worker == NULL)
		return;

	worker->vif = vif;
	worker->info = info;
	worker->changed = changed;
	rc = mwl8k_queue_work(hw, &worker->header,
			      priv->config_wq,
			      mwl8k_bss_info_changed_wt);
	kfree(worker);
	if (rc == -ETIMEDOUT)
		printk(KERN_ERR "%s() timed out\n", __func__);
}

struct mwl8k_configure_filter_worker {
	struct mwl8k_work_struct header;
	unsigned int changed_flags;
	unsigned int *total_flags;
	int mc_count;
	struct dev_addr_list *mclist;
};

#define MWL8K_SUPPORTED_IF_FLAGS	FIF_BCN_PRBRESP_PROMISC

static int mwl8k_configure_filter_wt(struct work_struct *wt)
{
	struct mwl8k_configure_filter_worker *worker =
		(struct mwl8k_configure_filter_worker *)wt;

	struct ieee80211_hw *hw = worker->header.hw;
	unsigned int changed_flags = worker->changed_flags;
	unsigned int *total_flags = worker->total_flags;
	int mc_count = worker->mc_count;
	struct dev_addr_list *mclist = worker->mclist;

	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_vif *mv_vif;
	int rc = 0;

	if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
		if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
			rc = mwl8k_cmd_set_pre_scan(hw);
		else {
			mv_vif = MWL8K_VIF(priv->vif);
			rc = mwl8k_cmd_set_post_scan(hw, mv_vif->bssid);
		}
	}

	if (rc)
		goto mwl8k_configure_filter_exit;
	if (mc_count) {
		mc_count = mc_count < priv->num_mcaddrs ?
				mc_count : priv->num_mcaddrs;
		rc = mwl8k_cmd_mac_multicast_adr(hw, mc_count, mclist);
		if (rc)
			printk(KERN_ERR
			"%s()Error setting multicast addresses\n",
			__func__);
	}

mwl8k_configure_filter_exit:
	return rc;
}

static void mwl8k_configure_filter(struct ieee80211_hw *hw,
				   unsigned int changed_flags,
				   unsigned int *total_flags,
				   int mc_count,
				   struct dev_addr_list *mclist)
{

	struct mwl8k_configure_filter_worker *worker;
	struct mwl8k_priv *priv = hw->priv;

	/* Clear unsupported feature flags */
	*total_flags &= MWL8K_SUPPORTED_IF_FLAGS;

	if (!(changed_flags & MWL8K_SUPPORTED_IF_FLAGS) && !mc_count)
		return;

	worker = kzalloc(sizeof(*worker), GFP_ATOMIC);
	if (worker == NULL)
		return;

	worker->header.options = MWL8K_WQ_QUEUE_ONLY | MWL8K_WQ_TX_WAIT_EMPTY;
	worker->changed_flags = changed_flags;
	worker->total_flags = total_flags;
	worker->mc_count = mc_count;
	worker->mclist = mclist;

	mwl8k_queue_work(hw, &worker->header, priv->config_wq,
			 mwl8k_configure_filter_wt);
}

struct mwl8k_set_rts_threshold_worker {
	struct mwl8k_work_struct header;
	u32 value;
};

static int mwl8k_set_rts_threshold_wt(struct work_struct *wt)
{
	struct mwl8k_set_rts_threshold_worker *worker =
		(struct mwl8k_set_rts_threshold_worker *)wt;

	struct ieee80211_hw *hw = worker->header.hw;
	u16 threshold = (u16)(worker->value);
	int rc;

	rc = mwl8k_rts_threshold(hw, MWL8K_CMD_SET, &threshold);

	return rc;
}

static int mwl8k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
{
	int rc;
	struct mwl8k_set_rts_threshold_worker *worker;
	struct mwl8k_priv *priv = hw->priv;

	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
	if (worker == NULL)
		return -ENOMEM;

	worker->value = value;

	rc = mwl8k_queue_work(hw, &worker->header,
			      priv->config_wq,
			      mwl8k_set_rts_threshold_wt);
	kfree(worker);

	if (rc == -ETIMEDOUT) {
		printk(KERN_ERR "%s() timed out\n", __func__);
		rc = -EINVAL;
	}

	return rc;
}

struct mwl8k_conf_tx_worker {
	struct mwl8k_work_struct header;
	u16 queue;
	const struct ieee80211_tx_queue_params *params;
};

static int mwl8k_conf_tx_wt(struct work_struct *wt)
{
	struct mwl8k_conf_tx_worker *worker =
	(struct mwl8k_conf_tx_worker *)wt;

	struct ieee80211_hw *hw = worker->header.hw;
	u16 queue = worker->queue;
	const struct ieee80211_tx_queue_params *params = worker->params;

	struct mwl8k_priv *priv = hw->priv;
	int rc = 0;

	if (priv->wmm_mode == MWL8K_WMM_DISABLE)
		if (mwl8k_set_wmm(hw, MWL8K_WMM_ENABLE)) {
			rc = -EINVAL;
			goto mwl8k_conf_tx_exit;
	}

	if (mwl8k_set_edca_params(hw, GET_TXQ(queue), params->cw_min,
		params->cw_max, params->aifs, params->txop))
			rc = -EINVAL;
mwl8k_conf_tx_exit:
	return rc;
}

static int mwl8k_conf_tx(struct ieee80211_hw *hw, u16 queue,
			 const struct ieee80211_tx_queue_params *params)
{
	int rc;
	struct mwl8k_conf_tx_worker *worker;
	struct mwl8k_priv *priv = hw->priv;

	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
	if (worker == NULL)
		return -ENOMEM;

	worker->queue = queue;
	worker->params = params;
	rc = mwl8k_queue_work(hw, &worker->header,
			      priv->config_wq, mwl8k_conf_tx_wt);
	kfree(worker);
	if (rc == -ETIMEDOUT) {
		printk(KERN_ERR "%s() timed out\n", __func__);
		rc = -EINVAL;
	}
	return rc;
}

static int mwl8k_get_tx_stats(struct ieee80211_hw *hw,
			      struct ieee80211_tx_queue_stats *stats)
{
	struct mwl8k_priv *priv = hw->priv;
	struct mwl8k_tx_queue *txq;
	int index;

	spin_lock_bh(&priv->tx_lock);
	for (index = 0; index < MWL8K_TX_QUEUES; index++) {
		txq = priv->txq + index;
		memcpy(&stats[index], &txq->tx_stats,
			sizeof(struct ieee80211_tx_queue_stats));
	}
	spin_unlock_bh(&priv->tx_lock);
	return 0;
}

struct mwl8k_get_stats_worker {
	struct mwl8k_work_struct header;
	struct ieee80211_low_level_stats *stats;
};

static int mwl8k_get_stats_wt(struct work_struct *wt)
{
	struct mwl8k_get_stats_worker *worker =
		(struct mwl8k_get_stats_worker *)wt;

	return mwl8k_cmd_802_11_get_stat(worker->header.hw, worker->stats);
}

static int mwl8k_get_stats(struct ieee80211_hw *hw,
			   struct ieee80211_low_level_stats *stats)
{
	int rc;
	struct mwl8k_get_stats_worker *worker;
	struct mwl8k_priv *priv = hw->priv;

	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
	if (worker == NULL)
		return -ENOMEM;

	worker->stats = stats;
	rc = mwl8k_queue_work(hw, &worker->header,
			      priv->config_wq, mwl8k_get_stats_wt);

	kfree(worker);
	if (rc == -ETIMEDOUT) {
		printk(KERN_ERR "%s() timed out\n", __func__);
		rc = -EINVAL;
	}

	return rc;
}

static const struct ieee80211_ops mwl8k_ops = {
	.tx			= mwl8k_tx,
	.start			= mwl8k_start,
	.stop			= mwl8k_stop,
	.add_interface		= mwl8k_add_interface,
	.remove_interface	= mwl8k_remove_interface,
	.config			= mwl8k_config,
	.config_interface	= mwl8k_config_interface,
	.bss_info_changed	= mwl8k_bss_info_changed,
	.configure_filter	= mwl8k_configure_filter,
	.set_rts_threshold	= mwl8k_set_rts_threshold,
	.conf_tx		= mwl8k_conf_tx,
	.get_tx_stats		= mwl8k_get_tx_stats,
	.get_stats		= mwl8k_get_stats,
};

static void mwl8k_tx_reclaim_handler(unsigned long data)
{
	int i;
	struct ieee80211_hw *hw = (struct ieee80211_hw *) data;
	struct mwl8k_priv *priv = hw->priv;

	spin_lock_bh(&priv->tx_lock);
	for (i = 0; i < MWL8K_TX_QUEUES; i++)
		mwl8k_txq_reclaim(hw, i, 0);

	if (priv->tx_wait != NULL) {
		int count = mwl8k_txq_busy(priv);
		if (count == 0) {
			complete(priv->tx_wait);
			priv->tx_wait = NULL;
		}
	}
	spin_unlock_bh(&priv->tx_lock);
}

static void mwl8k_finalize_join_worker(struct work_struct *work)
{
	struct mwl8k_priv *priv =
		container_of(work, struct mwl8k_priv, finalize_join_worker);
	struct sk_buff *skb = priv->beacon_skb;
	u8 dtim = (MWL8K_VIF(priv->vif))->bss_info.dtim_period;

	mwl8k_finalize_join(priv->hw, skb->data, skb->len, dtim);
	dev_kfree_skb(skb);

	priv->beacon_skb = NULL;
}

static int __devinit mwl8k_probe(struct pci_dev *pdev,
				 const struct pci_device_id *id)
{
	struct ieee80211_hw *hw;
	struct mwl8k_priv *priv;
	DECLARE_MAC_BUF(mac);
	int rc;
	int i;
	u8 *fw;

	rc = pci_enable_device(pdev);
	if (rc) {
		printk(KERN_ERR "%s: Cannot enable new PCI device\n",
		       MWL8K_NAME);
		return rc;
	}

	rc = pci_request_regions(pdev, MWL8K_NAME);
	if (rc) {
		printk(KERN_ERR "%s: Cannot obtain PCI resources\n",
		       MWL8K_NAME);
		return rc;
	}

	pci_set_master(pdev);

	hw = ieee80211_alloc_hw(sizeof(*priv), &mwl8k_ops);
	if (hw == NULL) {
		printk(KERN_ERR "%s: ieee80211 alloc failed\n", MWL8K_NAME);
		rc = -ENOMEM;
		goto err_free_reg;
	}

	priv = hw->priv;
	priv->hw = hw;
	priv->pdev = pdev;
	priv->hostcmd_wait = NULL;
	priv->tx_wait = NULL;
	priv->inconfig = false;
	priv->wep_enabled = 0;
	priv->wmm_mode = false;
	priv->pending_tx_pkts = 0;
	strncpy(priv->name, MWL8K_NAME, sizeof(priv->name));

	spin_lock_init(&priv->fw_lock);

	SET_IEEE80211_DEV(hw, &pdev->dev);
	pci_set_drvdata(pdev, hw);

	priv->regs = pci_iomap(pdev, 1, 0x10000);
	if (priv->regs == NULL) {
		printk(KERN_ERR "%s: Cannot map device memory\n", priv->name);
		goto err_iounmap;
	}

	memcpy(priv->channels, mwl8k_channels, sizeof(mwl8k_channels));
	priv->band.band = IEEE80211_BAND_2GHZ;
	priv->band.channels = priv->channels;
	priv->band.n_channels = ARRAY_SIZE(mwl8k_channels);
	priv->band.bitrates = priv->rates;
	priv->band.n_bitrates = ARRAY_SIZE(mwl8k_rates);
	hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band;

	BUILD_BUG_ON(sizeof(priv->rates) != sizeof(mwl8k_rates));
	memcpy(priv->rates, mwl8k_rates, sizeof(mwl8k_rates));

	/*
	 * Extra headroom is the size of the required DMA header
	 * minus the size of the smallest 802.11 frame (CTS frame).
	 */
	hw->extra_tx_headroom =
		sizeof(struct mwl8k_dma_data) - sizeof(struct ieee80211_cts);

	hw->channel_change_time = 10;

	hw->queues = MWL8K_TX_QUEUES;

	hw->wiphy->interface_modes =
		BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_MONITOR);

	/* Set rssi and noise values to dBm */
	hw->flags |= (IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_NOISE_DBM);
	hw->vif_data_size = sizeof(struct mwl8k_vif);
	priv->vif = NULL;

	/* Set default radio state and preamble */
	priv->radio_preamble = MWL8K_RADIO_DEFAULT_PREAMBLE;
	priv->radio_state = MWL8K_RADIO_DISABLE;

	/* Finalize join worker */
	INIT_WORK(&priv->finalize_join_worker, mwl8k_finalize_join_worker);

	/* TX reclaim tasklet */
	tasklet_init(&priv->tx_reclaim_task,
			mwl8k_tx_reclaim_handler, (unsigned long)hw);
	tasklet_disable(&priv->tx_reclaim_task);

	/* Config workthread */
	priv->config_wq = create_singlethread_workqueue("mwl8k_config");
	if (priv->config_wq == NULL)
		goto err_iounmap;

	/* Power management cookie */
	priv->cookie = pci_alloc_consistent(priv->pdev, 4, &priv->cookie_dma);
	if (priv->cookie == NULL)
		goto err_iounmap;

	rc = mwl8k_rxq_init(hw, 0);
	if (rc)
		goto err_iounmap;
	rxq_refill(hw, 0, INT_MAX);

	spin_lock_init(&priv->tx_lock);

	for (i = 0; i < MWL8K_TX_QUEUES; i++) {
		rc = mwl8k_txq_init(hw, i);
		if (rc)
			goto err_free_queues;
	}

	iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
	priv->int_mask = 0;
	iowrite32(priv->int_mask, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
	iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_CLEAR_SEL);
	iowrite32(0xffffffff, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS_MASK);

	rc = request_irq(priv->pdev->irq, &mwl8k_interrupt,
			 IRQF_SHARED, MWL8K_NAME, hw);
	if (rc) {
		printk(KERN_ERR "%s: failed to register IRQ handler\n",
		       priv->name);
		goto err_free_queues;
	}

	/* Reset firmware and hardware */
	mwl8k_hw_reset(priv);

	/* Ask userland hotplug daemon for the device firmware */
	rc = mwl8k_request_firmware(priv, (u32)id->driver_data);
	if (rc) {
		printk(KERN_ERR "%s: Firmware files not found\n", priv->name);
		goto err_free_irq;
	}

	/* Load firmware into hardware */
	rc = mwl8k_load_firmware(priv);
	if (rc) {
		printk(KERN_ERR "%s: Cannot start firmware\n", priv->name);
		goto err_stop_firmware;
	}

	/* Reclaim memory once firmware is successfully loaded */
	mwl8k_release_firmware(priv);

	/*
	 * Temporarily enable interrupts.  Initial firmware host
	 * commands use interrupts and avoids polling.  Disable
	 * interrupts when done.
	 */
	priv->int_mask |= MWL8K_A2H_EVENTS;

	iowrite32(priv->int_mask, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);

	/* Get config data, mac addrs etc */
	rc = mwl8k_cmd_get_hw_spec(hw);
	if (rc) {
		printk(KERN_ERR "%s: Cannot initialise firmware\n", priv->name);
		goto err_stop_firmware;
	}

	/* Turn radio off */
	rc = mwl8k_cmd_802_11_radio_control(hw, MWL8K_RADIO_DISABLE);
	if (rc) {
		printk(KERN_ERR "%s: Cannot disable\n", priv->name);
		goto err_stop_firmware;
	}

	/* Disable interrupts */
	spin_lock_irq(&priv->tx_lock);
	iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
	spin_unlock_irq(&priv->tx_lock);
	free_irq(priv->pdev->irq, hw);

	rc = ieee80211_register_hw(hw);
	if (rc) {
		printk(KERN_ERR "%s: Cannot register device\n", priv->name);
		goto err_stop_firmware;
	}

	fw = (u8 *)&priv->fw_rev;
	printk(KERN_INFO "%s: 88W%u %s\n", priv->name, priv->part_num,
		MWL8K_DESC);
	printk(KERN_INFO "%s: Driver Ver:%s  Firmware Ver:%u.%u.%u.%u\n",
		priv->name, MWL8K_VERSION, fw[3], fw[2], fw[1], fw[0]);
	printk(KERN_INFO "%s: MAC Address: %s\n", priv->name,
	       print_mac(mac, hw->wiphy->perm_addr));

	return 0;

err_stop_firmware:
	mwl8k_hw_reset(priv);
	mwl8k_release_firmware(priv);

err_free_irq:
	spin_lock_irq(&priv->tx_lock);
	iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
	spin_unlock_irq(&priv->tx_lock);
	free_irq(priv->pdev->irq, hw);

err_free_queues:
	for (i = 0; i < MWL8K_TX_QUEUES; i++)
		mwl8k_txq_deinit(hw, i);
	mwl8k_rxq_deinit(hw, 0);

err_iounmap:
	if (priv->cookie != NULL)
		pci_free_consistent(priv->pdev, 4,
				priv->cookie, priv->cookie_dma);

	if (priv->regs != NULL)
		pci_iounmap(pdev, priv->regs);

	if (priv->config_wq != NULL)
		destroy_workqueue(priv->config_wq);

	pci_set_drvdata(pdev, NULL);
	ieee80211_free_hw(hw);

err_free_reg:
	pci_release_regions(pdev);
	pci_disable_device(pdev);

	return rc;
}

static void __devexit mwl8k_shutdown(struct pci_dev *pdev)
{
	printk(KERN_ERR "===>%s(%u)\n", __func__, __LINE__);
}

static void __devexit mwl8k_remove(struct pci_dev *pdev)
{
	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
	struct mwl8k_priv *priv;
	int i;

	if (hw == NULL)
		return;
	priv = hw->priv;

	ieee80211_stop_queues(hw);

	/* Remove tx reclaim tasklet */
	tasklet_kill(&priv->tx_reclaim_task);

	/* Stop config thread */
	destroy_workqueue(priv->config_wq);

	/* Stop hardware */
	mwl8k_hw_reset(priv);

	/* Return all skbs to mac80211 */
	for (i = 0; i < MWL8K_TX_QUEUES; i++)
		mwl8k_txq_reclaim(hw, i, 1);

	ieee80211_unregister_hw(hw);

	for (i = 0; i < MWL8K_TX_QUEUES; i++)
		mwl8k_txq_deinit(hw, i);

	mwl8k_rxq_deinit(hw, 0);

	pci_free_consistent(priv->pdev, 4,
				priv->cookie, priv->cookie_dma);

	pci_iounmap(pdev, priv->regs);
	pci_set_drvdata(pdev, NULL);
	ieee80211_free_hw(hw);
	pci_release_regions(pdev);
	pci_disable_device(pdev);
}

static struct pci_driver mwl8k_driver = {
	.name		= MWL8K_NAME,
	.id_table	= mwl8k_table,
	.probe		= mwl8k_probe,
	.remove		= __devexit_p(mwl8k_remove),
	.shutdown	= __devexit_p(mwl8k_shutdown),
};

static int __init mwl8k_init(void)
{
	return pci_register_driver(&mwl8k_driver);
}

static void __exit mwl8k_exit(void)
{
	pci_unregister_driver(&mwl8k_driver);
}

module_init(mwl8k_init);
module_exit(mwl8k_exit);
