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