libertas: convert subscribed events API to debugfs

Marcelo Tosatti mtosatti at redhat.unroutablecom
Mon Dec 11 15:18:30 EST 2006


Commit:     400b8252ff99b36d63d51a1c89220e22f9416a69
Parent:     bbaacfea6de95aae6173fa5d8ade1bf9fe86df42
commit 400b8252ff99b36d63d51a1c89220e22f9416a69
Author:     Marcelo Tosatti <mtosatti at redhat.com>
AuthorDate: Wed Nov 29 02:48:36 2006 -0200
Commit:     Marcelo Tosatti <mtosatti at redhat.com>
CommitDate: Wed Nov 29 02:48:36 2006 -0200

    libertas: convert subscribed events API to debugfs
    
    Subject says it all.
    
    Signed-off-by: Marcelo Tosatti <mtosatti at redhat.com>
---
 drivers/net/wireless/libertas/hostcmd.h      |    1 
 drivers/net/wireless/libertas/wlan_debugfs.c | 1047 ++++++++++++++++++++++++++
 drivers/net/wireless/libertas/wlan_dev.h     |    8 
 drivers/net/wireless/libertas/wlan_ioctl.c   |   94 --
 drivers/net/wireless/libertas/wlan_wext.h    |    1 
 5 files changed, 1056 insertions(+), 95 deletions(-)

diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index fd63bdc..a11a68a 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -961,6 +961,7 @@ struct HostCmd_DS_COMMAND {
 		struct HostCmd_TX_RATE_QUERY txrate;
 		struct HostCmd_DS_DFT_ACCESS dft;
 		struct HostCmd_DS_GET_TSF gettsf;
+		struct HostCmd_DS_802_11_SUBSCRIBE_EVENT subscribe_event;
 	} params;
 } __attribute__ ((packed));
 
diff --git a/drivers/net/wireless/libertas/wlan_debugfs.c b/drivers/net/wireless/libertas/wlan_debugfs.c
index 17128d0..14e1295 100644
--- a/drivers/net/wireless/libertas/wlan_debugfs.c
+++ b/drivers/net/wireless/libertas/wlan_debugfs.c
@@ -407,6 +407,970 @@ out_unlock:
 	return count;
 }
 
+int libertas_event_initcmd(wlan_private *priv, void **response_buf,
+			struct CmdCtrlNode **cmdnode,
+			struct HostCmd_DS_COMMAND **cmd)
+{
+	u16 wait_option = HostCmd_OPTION_WAITFORRSP;
+
+	if (!(*cmdnode = libertas_get_free_cmd_ctrl_node(priv))) {
+		dprintk(1, "Failed libertas_get_free_cmd_ctrl_node\n");
+		return -ENOMEM;
+	}
+	if (!(*response_buf = kmalloc(3000, GFP_KERNEL))) {
+		dprintk(1, "Failed to allocate response buffer!\n");
+		return -ENOMEM;
+	}
+	libertas_set_cmd_ctrl_node(priv, *cmdnode, 0, wait_option, NULL);
+	init_waitqueue_head(&(*cmdnode)->cmdwait_q);
+	(*cmdnode)->pdata_buf = *response_buf;
+	(*cmdnode)->CmdFlags |= CMD_F_HOSTCMD;
+	(*cmdnode)->CmdWaitQWoken = 0;
+	*cmd = (struct HostCmd_DS_COMMAND *)(*cmdnode)->BufVirtualAddr;
+	(*cmd)->Command = HostCmd_CMD_802_11_SUBSCRIBE_EVENT;
+	(*cmd)->SeqNum = ++priv->adapter->SeqNum;
+	(*cmd)->Result = 0;
+	return 0;
+}
+
+static ssize_t libertas_lowrssi_read(struct file *file, char __user *userbuf,
+				  size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	char *buf = big_buffer;
+	ssize_t len = big_buffer_len;
+	void *response_buf;
+	int res, cmd_len;
+	ssize_t pos = 0;
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		return res;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_GET;
+	pCmdPtr->Size =
+	cpu_to_le16(sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) + S_DS_GEN);
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	down(&big_buffer_sem);
+
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	event = (struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *)(response_buf + S_DS_GEN);
+	while (cmd_len < pCmdPtr->Size) {
+		struct MrvlIEtypesHeader *header = (struct MrvlIEtypesHeader *)(response_buf + cmd_len);
+		switch(header->Type) {
+		struct MrvlIEtypes_RssiThreshold  *LowRssi;
+		case TLV_TYPE_RSSI_LOW:
+		LowRssi = (struct MrvlIEtypes_RssiThreshold *)(response_buf + cmd_len);
+		pos += snprintf(buf+pos, len-pos, "%d %d %d\n",
+				LowRssi->RSSIValue,
+				LowRssi->RSSIFreq,
+				(event->Events & 0x0001)?1:0);
+		default:
+			cmd_len += sizeof(struct MrvlIEtypes_SnrThreshold);
+			break;
+		}
+	}
+
+	kfree(response_buf);
+
+	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+	up(&big_buffer_sem);
+	return res;
+}
+
+u16 libertas_get_events_bitmap(wlan_private *priv)
+{
+	wlan_adapter *adapter = priv->adapter;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	void *response_buf;
+	int res;
+	u16 event_bitmap;
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		return res;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_GET;
+	pCmdPtr->Size =
+	cpu_to_le16(sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) + S_DS_GEN);
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	event = (struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *)(response_buf + S_DS_GEN);
+	event_bitmap = event->Events;
+	kfree(response_buf);
+	return event_bitmap;
+}
+
+static ssize_t libertas_lowrssi_write(struct file *file, 
+				    const char __user *userbuf,
+				    size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	char *buf = big_buffer;
+	ssize_t res, buf_size;
+	int value, freq, subscribed, cmd_len;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	struct MrvlIEtypes_RssiThreshold *rssi_threshold;
+	void *response_buf;
+	u16 event_bitmap;
+	u8 *ptr;
+
+	down(&big_buffer_sem);
+	buf_size = min(count, sizeof(big_buffer) - 1);
+	if (copy_from_user(buf, userbuf, buf_size)) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+	res = sscanf(buf, "%d %d %d", &value, &freq, &subscribed);
+	if (res != 3) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+
+	event_bitmap = libertas_get_events_bitmap(priv);
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		goto out_unlock;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_SET;
+	pCmdPtr->Size = cpu_to_le16(S_DS_GEN +
+		sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) +
+		sizeof(struct MrvlIEtypes_RssiThreshold));
+
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	ptr = (u8*) pCmdPtr+cmd_len;
+	rssi_threshold = (struct MrvlIEtypes_RssiThreshold *)(ptr);
+	rssi_threshold->Header.Type = cpu_to_le16(0x0104);
+	rssi_threshold->Header.Len = 2;
+	rssi_threshold->RSSIValue = cpu_to_le16(value);
+	rssi_threshold->RSSIFreq = cpu_to_le16(freq);
+	event_bitmap |= subscribed ? 0x0001 : 0x0;
+	event->Events = event_bitmap;
+
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	res = count;
+out_unlock:
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_lowsnr_read(struct file *file, char __user *userbuf,
+				  size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	char *buf = big_buffer;
+	ssize_t len = big_buffer_len;
+	void *response_buf;
+	int res, cmd_len;
+	ssize_t pos = 0;
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		return res;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_GET;
+	pCmdPtr->Size =
+	cpu_to_le16(sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) + S_DS_GEN);
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	down(&big_buffer_sem);
+
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	event = (struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *)(response_buf + S_DS_GEN);
+	while (cmd_len < pCmdPtr->Size) {
+		struct MrvlIEtypesHeader *header = (struct MrvlIEtypesHeader *)(response_buf + cmd_len);
+		switch(header->Type) {
+		struct MrvlIEtypes_SnrThreshold *LowSnr;
+		case TLV_TYPE_SNR_LOW:
+		LowSnr = (struct MrvlIEtypes_SnrThreshold *)(response_buf + cmd_len);
+		pos += snprintf(buf+pos, len-pos, "%d %d %d\n",
+				LowSnr->SNRValue,
+				LowSnr->SNRFreq,
+				(event->Events & 0x0002)?1:0);
+		default:
+			cmd_len += sizeof(struct MrvlIEtypes_SnrThreshold);
+			break;
+		}
+	}
+
+	kfree(response_buf);
+
+	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_lowsnr_write(struct file *file, 
+				    const char __user *userbuf,
+				    size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	char *buf = big_buffer;
+	ssize_t res, buf_size;
+	int value, freq, subscribed, cmd_len;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	struct MrvlIEtypes_SnrThreshold *snr_threshold;
+	void *response_buf;
+	u16 event_bitmap;
+	u8 *ptr;
+
+	down(&big_buffer_sem);
+	buf_size = min(count, sizeof(big_buffer) - 1);
+	if (copy_from_user(buf, userbuf, buf_size)) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+	res = sscanf(buf, "%d %d %d", &value, &freq, &subscribed);
+	if (res != 3) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+
+	event_bitmap = libertas_get_events_bitmap(priv);
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		goto out_unlock;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_SET;
+	pCmdPtr->Size = cpu_to_le16(S_DS_GEN +
+		sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) +
+		sizeof(struct MrvlIEtypes_SnrThreshold));
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	ptr = (u8*) pCmdPtr+cmd_len;
+	snr_threshold = (struct MrvlIEtypes_SnrThreshold *)(ptr);
+	snr_threshold->Header.Type = cpu_to_le16(TLV_TYPE_SNR_LOW);
+	snr_threshold->Header.Len = 2;
+	snr_threshold->SNRValue = cpu_to_le16(value);
+	snr_threshold->SNRFreq = cpu_to_le16(freq);
+	event_bitmap |= subscribed ? 0x0002 : 0x0;
+	event->Events = event_bitmap;
+
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	res = count;
+
+out_unlock:
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_failcount_read(struct file *file, char __user *userbuf,
+				  size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	char *buf = big_buffer;
+	ssize_t len = big_buffer_len;
+	void *response_buf;
+	int res, cmd_len;
+	ssize_t pos = 0;
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		return res;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_GET;
+	pCmdPtr->Size =
+	cpu_to_le16(sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) + S_DS_GEN);
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	down(&big_buffer_sem);
+
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	event = (struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *)(response_buf + S_DS_GEN);
+	while (cmd_len < pCmdPtr->Size) {
+		struct MrvlIEtypesHeader *header = (struct MrvlIEtypesHeader *)(response_buf + cmd_len);
+		switch(header->Type) {
+		struct MrvlIEtypes_FailureCount *failcount;
+		case TLV_TYPE_FAILCOUNT:
+		failcount = (struct MrvlIEtypes_FailureCount *)(response_buf + cmd_len);
+		pos += snprintf(buf+pos, len-pos, "%d %d %d\n",
+				failcount->FailValue,
+				failcount->FailFreq,
+				(event->Events & 0x0004)?1:0);
+		default:
+			cmd_len += sizeof(struct MrvlIEtypes_FailureCount);
+			break;
+		}
+	}
+
+	kfree(response_buf);
+
+	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_failcount_write(struct file *file, 
+				    const char __user *userbuf,
+				    size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	char *buf = big_buffer;
+	ssize_t res, buf_size;
+	int value, freq, subscribed, cmd_len;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	struct MrvlIEtypes_FailureCount *failcount;
+	void *response_buf;
+	u16 event_bitmap;
+	u8 *ptr;
+
+	down(&big_buffer_sem);
+	buf_size = min(count, sizeof(big_buffer) - 1);
+	if (copy_from_user(buf, userbuf, buf_size)) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+	res = sscanf(buf, "%d %d %d", &value, &freq, &subscribed);
+	if (res != 3) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+
+	event_bitmap = libertas_get_events_bitmap(priv);
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		goto out_unlock;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_SET;
+	pCmdPtr->Size = cpu_to_le16(S_DS_GEN +
+		sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) +
+		sizeof(struct MrvlIEtypes_FailureCount));
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	ptr = (u8*) pCmdPtr+cmd_len;
+	failcount = (struct MrvlIEtypes_FailureCount *)(ptr);
+	failcount->Header.Type = cpu_to_le16(TLV_TYPE_FAILCOUNT);
+	failcount->Header.Len = 2;
+	failcount->FailValue = cpu_to_le16(value);
+	failcount->FailFreq = cpu_to_le16(freq);
+	event_bitmap |= subscribed ? 0x0004 : 0x0;
+	event->Events = event_bitmap;
+
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	res = count;
+out_unlock:
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_bcnmiss_read(struct file *file, char __user *userbuf,
+				  size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	char *buf = big_buffer;
+	ssize_t len = big_buffer_len;
+	void *response_buf;
+	int res, cmd_len;
+	ssize_t pos = 0;
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		return res;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_GET;
+	pCmdPtr->Size =
+	cpu_to_le16(sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) + S_DS_GEN);
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	down(&big_buffer_sem);
+
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	event = (struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *)(response_buf + S_DS_GEN);
+	while (cmd_len < pCmdPtr->Size) {
+		struct MrvlIEtypesHeader *header = (struct MrvlIEtypesHeader *)(response_buf + cmd_len);
+		switch(header->Type) {
+		struct MrvlIEtypes_BeaconsMissed *bcnmiss;
+		case TLV_TYPE_BCNMISS:
+		bcnmiss = (struct MrvlIEtypes_BeaconsMissed *)(response_buf + cmd_len);
+		pos += snprintf(buf+pos, len-pos, "%d N/A %d\n",
+				bcnmiss->BeaconMissed,
+				(event->Events & 0x0008)?1:0);
+		default:
+			cmd_len += sizeof(struct MrvlIEtypes_BeaconsMissed);
+			break;
+		}
+	}
+
+	kfree(response_buf);
+
+	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_bcnmiss_write(struct file *file, 
+				    const char __user *userbuf,
+				    size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	char *buf = big_buffer;
+	ssize_t res, buf_size;
+	int value, freq, subscribed, cmd_len;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	struct MrvlIEtypes_BeaconsMissed *bcnmiss;
+	void *response_buf;
+	u16 event_bitmap;
+	u8 *ptr;
+
+	down(&big_buffer_sem);
+	buf_size = min(count, sizeof(big_buffer) - 1);
+	if (copy_from_user(buf, userbuf, buf_size)) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+	res = sscanf(buf, "%d %d %d", &value, &freq, &subscribed);
+	if (res != 3) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+
+	event_bitmap = libertas_get_events_bitmap(priv);
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		goto out_unlock;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_SET;
+	pCmdPtr->Size = cpu_to_le16(S_DS_GEN +
+		sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) +
+		sizeof(struct MrvlIEtypes_BeaconsMissed));
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	ptr = (u8*) pCmdPtr+cmd_len;
+	bcnmiss = (struct MrvlIEtypes_BeaconsMissed *)(ptr);
+	bcnmiss->Header.Type = cpu_to_le16(TLV_TYPE_BCNMISS);
+	bcnmiss->Header.Len = 2;
+	bcnmiss->BeaconMissed = cpu_to_le16(value);
+	event_bitmap |= subscribed ? 0x0008 : 0x0;
+	event->Events = event_bitmap;
+
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	res = count;
+out_unlock:
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_highrssi_read(struct file *file, char __user *userbuf,
+				  size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	char *buf = big_buffer;
+	ssize_t len = big_buffer_len;
+	void *response_buf;
+	int res, cmd_len;
+	ssize_t pos = 0;
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		return res;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_GET;
+	pCmdPtr->Size =
+	cpu_to_le16(sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) + S_DS_GEN);
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	down(&big_buffer_sem);
+
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	event = (struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *)(response_buf + S_DS_GEN);
+	while (cmd_len < pCmdPtr->Size) {
+		struct MrvlIEtypesHeader *header = (struct MrvlIEtypesHeader *)(response_buf + cmd_len);
+		switch(header->Type) {
+		struct MrvlIEtypes_RssiThreshold  *HighRssi;
+		case TLV_TYPE_RSSI_HIGH:
+		HighRssi = (struct MrvlIEtypes_RssiThreshold *)(response_buf + cmd_len);
+		pos += snprintf(buf+pos, len-pos, "%d %d %d\n",
+				HighRssi->RSSIValue,
+				HighRssi->RSSIFreq,
+				(event->Events & 0x0010)?1:0);
+		default:
+			cmd_len += sizeof(struct MrvlIEtypes_SnrThreshold);
+			break;
+		}
+	}
+
+	kfree(response_buf);
+
+	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_highrssi_write(struct file *file, 
+				    const char __user *userbuf,
+				    size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	char *buf = big_buffer;
+	ssize_t res, buf_size;
+	int value, freq, subscribed, cmd_len;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	struct MrvlIEtypes_RssiThreshold *rssi_threshold;
+	void *response_buf;
+	u16 event_bitmap;
+	u8 *ptr;
+
+	down(&big_buffer_sem);
+	buf_size = min(count, sizeof(big_buffer) - 1);
+	if (copy_from_user(buf, userbuf, buf_size)) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+	res = sscanf(buf, "%d %d %d", &value, &freq, &subscribed);
+	if (res != 3) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+
+	event_bitmap = libertas_get_events_bitmap(priv);
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		goto out_unlock;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_SET;
+	pCmdPtr->Size = cpu_to_le16(S_DS_GEN +
+		sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) +
+		sizeof(struct MrvlIEtypes_RssiThreshold));
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	ptr = (u8*) pCmdPtr+cmd_len;
+	rssi_threshold = (struct MrvlIEtypes_RssiThreshold *)(ptr);
+	rssi_threshold->Header.Type = cpu_to_le16(TLV_TYPE_RSSI_HIGH);
+	rssi_threshold->Header.Len = 2;
+	rssi_threshold->RSSIValue = cpu_to_le16(value);
+	rssi_threshold->RSSIFreq = cpu_to_le16(freq);
+	event_bitmap |= subscribed ? 0x0010 : 0x0;
+	event->Events = event_bitmap;
+
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	res = count;
+out_unlock:
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_highsnr_read(struct file *file, char __user *userbuf,
+				  size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	char *buf = big_buffer;
+	ssize_t len = big_buffer_len;
+	void *response_buf;
+	int res, cmd_len;
+	ssize_t pos = 0;
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		return res;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_GET;
+	pCmdPtr->Size =
+	cpu_to_le16(sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) + S_DS_GEN);
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	down(&big_buffer_sem);
+
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	event = (struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *)(response_buf + S_DS_GEN);
+	while (cmd_len < pCmdPtr->Size) {
+		struct MrvlIEtypesHeader *header = (struct MrvlIEtypesHeader *)(response_buf + cmd_len);
+		switch(header->Type) {
+		struct MrvlIEtypes_SnrThreshold *HighSnr;
+		case TLV_TYPE_SNR_HIGH:
+		HighSnr = (struct MrvlIEtypes_SnrThreshold *)(response_buf + cmd_len);
+		pos += snprintf(buf+pos, len-pos, "%d %d %d\n",
+				HighSnr->SNRValue,
+				HighSnr->SNRFreq,
+				(event->Events & 0x0020)?1:0);
+		default:
+			cmd_len += sizeof(struct MrvlIEtypes_SnrThreshold);
+			break;
+		}
+	}
+
+	kfree(response_buf);
+
+	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+	up(&big_buffer_sem);
+	return res;
+}
+
+static ssize_t libertas_highsnr_write(struct file *file, 
+				    const char __user *userbuf,
+				    size_t count, loff_t *ppos)
+{
+	wlan_private *priv = file->private_data;
+	wlan_adapter *adapter = priv->adapter;
+	char *buf = big_buffer;
+	ssize_t res, buf_size;
+	int value, freq, subscribed, cmd_len;
+	struct CmdCtrlNode *pCmdNode;
+	struct HostCmd_DS_COMMAND *pCmdPtr;
+	struct HostCmd_DS_802_11_SUBSCRIBE_EVENT *event;
+	struct MrvlIEtypes_SnrThreshold *snr_threshold;
+	void *response_buf;
+	u16 event_bitmap;
+	u8 *ptr;
+
+	down(&big_buffer_sem);
+	buf_size = min(count, sizeof(big_buffer) - 1);
+	if (copy_from_user(buf, userbuf, buf_size)) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+	res = sscanf(buf, "%d %d %d", &value, &freq, &subscribed);
+	if (res != 3) {
+		res = -EFAULT;
+		goto out_unlock;
+	}
+
+	event_bitmap = libertas_get_events_bitmap(priv);
+
+	res = libertas_event_initcmd(priv, &response_buf, &pCmdNode, &pCmdPtr);
+	if (res < 0)
+		goto out_unlock;
+
+	event = &pCmdPtr->params.subscribe_event;
+	event->Action = HostCmd_ACT_SET;
+	pCmdPtr->Size = cpu_to_le16(S_DS_GEN +
+		sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT) +
+		sizeof(struct MrvlIEtypes_SnrThreshold));
+	cmd_len = S_DS_GEN + sizeof(struct HostCmd_DS_802_11_SUBSCRIBE_EVENT);
+	ptr = (u8*) pCmdPtr+cmd_len;
+	snr_threshold = (struct MrvlIEtypes_SnrThreshold *)(ptr);
+	snr_threshold->Header.Type = cpu_to_le16(TLV_TYPE_SNR_HIGH);
+	snr_threshold->Header.Len = 2;
+	snr_threshold->SNRValue = cpu_to_le16(value);
+	snr_threshold->SNRFreq = cpu_to_le16(freq);
+	event_bitmap |= subscribed ? 0x0020 : 0x0;
+	event->Events = event_bitmap;
+
+	libertas_queue_cmd(adapter, pCmdNode, 1);
+	wake_up_interruptible(&priv->MainThread.waitQ);
+
+	/* Sleep until response is generated by FW */
+	wait_event_interruptible(pCmdNode->cmdwait_q,
+				pCmdNode->CmdWaitQWoken);
+
+	pCmdPtr = (struct HostCmd_DS_COMMAND *)response_buf;
+
+	if (pCmdPtr->Result) {
+		printk(KERN_ERR "%s: fail, result=%d\n", __FUNCTION__,
+			pCmdPtr->Result);
+		kfree(response_buf);
+		return 0;
+	}
+
+	if (pCmdPtr->Command != HostCmd_RET_802_11_SUBSCRIBE_EVENT) {
+		printk(KERN_ERR "Command response incorrect!\n");
+		kfree(response_buf);
+		return 0;
+	}
+
+	res = count;
+out_unlock:
+	up(&big_buffer_sem);
+	return res;
+}
 
 static struct file_operations libertas_devinfo_fops = { 
 	.owner = THIS_MODULE,
@@ -441,6 +1405,48 @@ static struct file_operations libertas_s
 	.write = libertas_setuserscan,
 };
 
+static struct file_operations libertas_lowrssi_fops = { 
+	.owner = THIS_MODULE,
+	.open = open_file_generic,
+	.read = libertas_lowrssi_read,
+	.write = libertas_lowrssi_write,
+};
+
+static struct file_operations libertas_lowsnr_fops = { 
+	.owner = THIS_MODULE,
+	.open = open_file_generic,
+	.read = libertas_lowsnr_read,
+	.write = libertas_lowsnr_write,
+};
+
+static struct file_operations libertas_failcount_fops = { 
+	.owner = THIS_MODULE,
+	.open = open_file_generic,
+	.read = libertas_failcount_read,
+	.write = libertas_failcount_write,
+};
+
+static struct file_operations libertas_bcnmiss_fops = { 
+	.owner = THIS_MODULE,
+	.open = open_file_generic,
+	.read = libertas_bcnmiss_read,
+	.write = libertas_bcnmiss_write,
+};
+
+static struct file_operations libertas_highrssi_fops = { 
+	.owner = THIS_MODULE,
+	.open = open_file_generic,
+	.read = libertas_highrssi_read,
+	.write = libertas_highrssi_write,
+};
+
+static struct file_operations libertas_highsnr_fops = { 
+	.owner = THIS_MODULE,
+	.open = open_file_generic,
+	.read = libertas_highsnr_read,
+	.write = libertas_highsnr_write,
+};
+
 void libertas_debugfs_init(void)
 {
 	if (!libertas_dir)
@@ -493,6 +1499,39 @@ void libertas_debugfs_init_one(wlan_priv
 						    priv,
 						    &libertas_setuserscan_fops);
 
+	priv->events_dir = debugfs_create_dir("subscribed_events", priv->debugfs_dir);
+	if (!priv->events_dir)
+		goto exit;
+
+	priv->low_rssi = debugfs_create_file("low_rssi", 0644,
+					    priv->events_dir,
+					    priv,
+					    &libertas_lowrssi_fops);
+
+	priv->low_snr = debugfs_create_file("low_snr", 0644,
+					    priv->events_dir,
+					    priv,
+					    &libertas_lowsnr_fops);
+
+	priv->failure_count = debugfs_create_file("failure_count", 0644,
+					    priv->events_dir,
+					    priv,
+					    &libertas_failcount_fops);
+
+	priv->beacon_missed = debugfs_create_file("beacon_missed", 0644,
+					    priv->events_dir,
+					    priv,
+					    &libertas_bcnmiss_fops);
+
+	priv->high_rssi = debugfs_create_file("high_rssi", 0644,
+					    priv->events_dir,
+					    priv,
+					    &libertas_highrssi_fops);
+
+	priv->high_snr = debugfs_create_file("high_snr", 0644,
+					    priv->events_dir,
+					    priv,
+					    &libertas_highsnr_fops);
 
 #ifdef PROC_DEBUG
 	libertas_debug_init(priv, dev);
@@ -503,6 +1542,14 @@ exit:
 
 void libertas_debugfs_remove_one(wlan_private *priv)
 {
+
+	debugfs_remove(priv->low_rssi);
+	debugfs_remove(priv->low_snr);
+	debugfs_remove(priv->failure_count);
+	debugfs_remove(priv->beacon_missed);
+	debugfs_remove(priv->high_rssi);
+	debugfs_remove(priv->high_snr);
+	debugfs_remove(priv->events_dir);
 #ifdef PROC_DEBUG
 	debugfs_remove(priv->debugfs_debug);
 #endif
diff --git a/drivers/net/wireless/libertas/wlan_dev.h b/drivers/net/wireless/libertas/wlan_dev.h
index 102e30d..84817cc 100644
--- a/drivers/net/wireless/libertas/wlan_dev.h
+++ b/drivers/net/wireless/libertas/wlan_dev.h
@@ -177,6 +177,14 @@ struct _wlan_private {
 	struct dentry *debugfs_extscan;
 	struct dentry *debugfs_setuserscan;
 
+	struct dentry *events_dir;
+	struct dentry *low_rssi;
+	struct dentry *low_snr;
+	struct dentry *failure_count;
+	struct dentry *beacon_missed;
+	struct dentry *high_rssi;
+	struct dentry *high_snr;
+
 	const struct firmware *firmware;
 	struct device *hotplug_device;
 
diff --git a/drivers/net/wireless/libertas/wlan_ioctl.c b/drivers/net/wireless/libertas/wlan_ioctl.c
index 4c84863..bf6ec4c 100644
--- a/drivers/net/wireless/libertas/wlan_ioctl.c
+++ b/drivers/net/wireless/libertas/wlan_ioctl.c
@@ -297,96 +297,6 @@ static int wlan_null_pkt_interval(wlan_p
 }
 
 /**
- *  @brief wlan hostcmd ioctl handler
- *
- *  @param dev                  A pointer to net_device structure
- *  @param req		        A pointer to ifreq structure
- *  @param cmd			command
- *  @return 	   		WLAN_STATUS_SUCCESS --success, otherwise fail
- */
-static int wlan_hostcmd_ioctl(struct net_device *dev, struct ifreq *req,
-			      int cmd)
-{
-	u8 *tempResponseBuffer;
-	struct CmdCtrlNode *pCmdNode;
-	struct HostCmd_DS_GEN *gencmd, *pCmdPtr;
-	wlan_private *priv = dev->priv;
-	wlan_adapter *Adapter = priv->adapter;
-	u16 wait_option = 0;
-
-	ENTER();
-
-	/*
-	 * Get a free command control node
-	 */
-	if (!(pCmdNode = libertas_get_free_cmd_ctrl_node(priv))) {
-		dprintk(1, "Failed libertas_get_free_cmd_ctrl_node\n");
-		return -ENOMEM;
-	}
-
-	if (!(tempResponseBuffer = kmalloc(3000, GFP_KERNEL))) {
-		dprintk(1, "ERROR: Failed to allocate response buffer!\n");
-		return -ENOMEM;
-	}
-
-	mutex_lock(&Adapter->lock);
-
-	wait_option |= HostCmd_OPTION_WAITFORRSP;
-
-	libertas_set_cmd_ctrl_node(priv, pCmdNode, 0, wait_option, NULL);
-	init_waitqueue_head(&pCmdNode->cmdwait_q);
-
-	pCmdPtr = (struct HostCmd_DS_GEN *)pCmdNode->BufVirtualAddr;
-	gencmd = (struct HostCmd_DS_GEN *)req->ifr_data;
-
-	/*
-	 * Copy the whole command into the command buffer
-	 */
-	if (copy_from_user(pCmdPtr, req->ifr_data, gencmd->Size)) {
-		dprintk(1, "Copy from user failed\n");
-		kfree(tempResponseBuffer);
-		mutex_unlock(&Adapter->lock);
-		return -EFAULT;
-	}
-
-	pCmdNode->pdata_buf = tempResponseBuffer;
-	pCmdNode->CmdFlags |= CMD_F_HOSTCMD;
-
-	pCmdPtr->SeqNum = ++priv->adapter->SeqNum;
-	pCmdPtr->Result = 0;
-
-	dprintk(1, "HOSTCMD Command: 0x%04x Size: %d SeqNum: %d\n",
-	       pCmdPtr->Command, pCmdPtr->Size, pCmdPtr->SeqNum);
-	HEXDUMP("Command Data", (u8 *) (pCmdPtr),
-		min_t(u16, 32, pCmdPtr->Size));
-	dprintk(1, "Copying data from : (user)0x%p -> 0x%p(driver)\n",
-	       req->ifr_data, pCmdPtr);
-
-	pCmdNode->CmdWaitQWoken = 0;
-	libertas_queue_cmd(Adapter, pCmdNode, 1);
-	wake_up_interruptible(&priv->MainThread.waitQ);
-
-	mutex_unlock(&Adapter->lock);
-
-	if (wait_option & HostCmd_OPTION_WAITFORRSP) {
-		/* Sleep until response is generated by FW */
-		wait_event_interruptible(pCmdNode->cmdwait_q,
-					 pCmdNode->CmdWaitQWoken);
-	}
-
-	/* Copy the response back to user space */
-	pCmdPtr = (struct HostCmd_DS_GEN *)tempResponseBuffer;
-
-	if (copy_to_user(req->ifr_data, tempResponseBuffer, pCmdPtr->Size))
-		dprintk(1, "ERROR: copy_to_user failed!\n");
-
-	kfree(tempResponseBuffer);
-
-	LEAVE();
-	return WLAN_STATUS_SUCCESS;
-}
-
-/**
  *  @brief Get Rx Info
  *
  *  @param priv                 A pointer to wlan_private structure
@@ -2038,10 +1948,6 @@ int libertas_do_ioctl(struct net_device 
 
 	dprintk(1, "libertas_do_ioctl: ioctl cmd = 0x%x\n", cmd);
 	switch (cmd) {
-	case WLANHOSTCMD:
-		ret = wlan_hostcmd_ioctl(dev, req, cmd);
-		break;
-
 	case WLANCISDUMP:	/* Read CIS Table  */
 		ret = wlan_do_getcis_ioctl(priv, req);
 		break;
diff --git a/drivers/net/wireless/libertas/wlan_wext.h b/drivers/net/wireless/libertas/wlan_wext.h
index f3054a3..07b7a4f 100644
--- a/drivers/net/wireless/libertas/wlan_wext.h
+++ b/drivers/net/wireless/libertas/wlan_wext.h
@@ -40,7 +40,6 @@ #define WLANSETWPAIE			(WLANIOCTL + 0)
 #define WLANCISDUMP 			(WLANIOCTL + 1)
 #define	WLANREGRDWR			(WLANIOCTL + 3)
 #define MAX_EEPROM_DATA     			256
-#define	WLANHOSTCMD			(WLANIOCTL + 4)
 
 #define WLAN_SETINT_GETINT		(WLANIOCTL + 7)
 #define WLANNF					1


More information about the Commits-kernel mailing list