* [PATCH 01/48] libertas: Fix memory leak of RX skbs
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 02/48] libertas: Remove cmd_oid from struct cmd_ctrl_node David Woodhouse
` (132 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 28 Nov 2007 16:20:51 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 4fce0ba..c27ffcf 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -460,6 +460,8 @@ static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
/* handle failure conditions */
lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed\n");
+ kfree_skb(skb);
+ rinfo->skb = NULL;
ret = -1;
} else {
/* lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB success\n"); */
@@ -667,8 +669,10 @@ static void if_usb_receive(struct urb *urb)
lbs_deb_usbd(&cardp->udev->dev,
"Recv length = 0x%x, Recv type = 0x%X\n",
recvlength, recvtype);
- } else if (urb->status)
+ } else if (urb->status) {
+ kfree_skb(skb);
goto rx_exit;
+ }
switch (recvtype) {
case CMD_TYPE_DATA:
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 02/48] libertas: Remove cmd_oid from struct cmd_ctrl_node
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
2007-12-10 15:45 ` [PATCH 01/48] libertas: Fix memory leak of RX skbs David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 03/48] libertas: Consolidate lbs_host_to_card_done() function David Woodhouse
` (131 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 1 Dec 2007 15:15:41 +0000
This is only needed for SNMP and key operations; it doesn't need to be
preserved outside that context.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 9 +++------
drivers/net/wireless/libertas/decl.h | 2 +-
drivers/net/wireless/libertas/hostcmd.h | 2 --
3 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index d98bec9..6658590 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1231,7 +1231,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
goto done;
}
- lbs_set_cmd_ctrl_node(priv, cmdnode, cmd_oid, wait_option, pdata_buf);
+ lbs_set_cmd_ctrl_node(priv, cmdnode, wait_option, pdata_buf);
cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
@@ -1404,7 +1404,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
case CMD_802_11_INACTIVITY_TIMEOUT:
ret = lbs_cmd_802_11_inactivity_timeout(priv, cmdptr,
cmd_action, pdata_buf);
- lbs_set_cmd_ctrl_node(priv, cmdnode, 0, 0, pdata_buf);
+ lbs_set_cmd_ctrl_node(priv, cmdnode, 0, pdata_buf);
break;
case CMD_802_11_TPC_CFG:
@@ -1668,7 +1668,6 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
ptempnode->cmdwaitqwoken = 1;
wake_up_interruptible(&ptempnode->cmdwait_q);
ptempnode->status = 0;
- ptempnode->cmd_oid = (u32) 0;
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
@@ -1683,21 +1682,19 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
*
* @param priv A pointer to struct lbs_private structure
* @param ptempnode A pointer to cmd_ctrl_node structure
- * @param cmd_oid cmd oid: treated as sub command
* @param wait_option wait option: wait response or not
* @param pdata_buf A pointer to informaion buffer
* @return 0 or -1
*/
void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
struct cmd_ctrl_node *ptempnode,
- u32 cmd_oid, u16 wait_option, void *pdata_buf)
+ u16 wait_option, void *pdata_buf)
{
lbs_deb_enter(LBS_DEB_HOST);
if (!ptempnode)
return;
- ptempnode->cmd_oid = cmd_oid;
ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 74187f3..447297a 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -26,7 +26,7 @@ struct cmd_ctrl_node *lbs_get_free_cmd_ctrl_node(struct lbs_private *priv);
void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
struct cmd_ctrl_node *ptempnode,
- u32 cmd_oid, u16 wait_option, void *pdata_buf);
+ u16 wait_option, void *pdata_buf);
int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 614db6c..c029149 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -69,8 +69,6 @@ struct cmd_ctrl_node {
/* CMD link list */
struct list_head list;
u32 status;
- /* CMD ID */
- u32 cmd_oid;
/*CMD wait option: wait for finish or no wait */
u16 wait_option;
/* command parameter */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 03/48] libertas: Consolidate lbs_host_to_card_done() function.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
2007-12-10 15:45 ` [PATCH 01/48] libertas: Fix memory leak of RX skbs David Woodhouse
2007-12-10 15:45 ` [PATCH 02/48] libertas: Remove cmd_oid from struct cmd_ctrl_node David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 04/48] libertas: select WIRELESS_EXT David Woodhouse
` (130 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 6 Dec 2007 14:36:11 +0000
As we move towards having this done by a state machine, start by having
a single 'stuff sent' function, which is called by if_usb/if_sdio/if_cs
after sending both data and commands.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/decl.h | 1 +
drivers/net/wireless/libertas/if_cs.c | 12 +++---------
drivers/net/wireless/libertas/if_sdio.c | 9 +++------
drivers/net/wireless/libertas/if_usb.c | 18 ++----------------
drivers/net/wireless/libertas/main.c | 18 ++++++++++++++++++
5 files changed, 27 insertions(+), 31 deletions(-)
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 447297a..201ec60 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -86,5 +86,6 @@ int lbs_stop_card(struct lbs_private *priv);
int lbs_add_mesh(struct lbs_private *priv, struct device *dev);
void lbs_remove_mesh(struct lbs_private *priv);
int lbs_reset_device(struct lbs_private *priv);
+void lbs_host_to_card_done(struct lbs_private *priv);
#endif
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 5fadcc0..54b1ba3 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -253,19 +253,13 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
/* Not for us */
return IRQ_NONE;
- } else if(int_cause == 0xffff) {
+ } else if (int_cause == 0xffff) {
/* Read in junk, the card has probably been removed */
card->priv->adapter->surpriseremoved = 1;
} else {
- if(int_cause & IF_CS_H_IC_TX_OVER) {
- card->priv->dnld_sent = DNLD_RES_RECEIVED;
- if (!card->priv->adapter->cur_cmd)
- wake_up_interruptible(&card->priv->waitq);
-
- if (card->priv->adapter->connect_status == LBS_CONNECTED)
- netif_wake_queue(card->priv->dev);
- }
+ if (int_cause & IF_CS_H_IC_TX_OVER)
+ lbs_host_to_card_done(card->priv);
/* clear interrupt */
if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause & IF_CS_C_IC_MASK);
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 437f3dd..0f0296b 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -835,12 +835,9 @@ static void if_sdio_interrupt(struct sdio_func *func)
* Ignore the define name, this really means the card has
* successfully received the command.
*/
- if (cause & IF_SDIO_H_INT_DNLD) {
- if ((card->priv->dnld_sent == DNLD_DATA_SENT) &&
- (card->priv->adapter->connect_status == LBS_CONNECTED))
- netif_wake_queue(card->priv->dev);
- card->priv->dnld_sent = DNLD_RES_RECEIVED;
- }
+ if (cause & IF_SDIO_H_INT_DNLD)
+ lbs_host_to_card_done(card->priv);
+
if (cause & IF_SDIO_H_INT_UPLD) {
ret = if_sdio_card_to_host(card);
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index c27ffcf..418dcab 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -66,22 +66,8 @@ static void if_usb_write_bulk_callback(struct urb *urb)
/* Used for both firmware TX and regular TX. priv isn't
* valid at firmware load time.
*/
- if (priv) {
- struct lbs_adapter *adapter = priv->adapter;
- struct net_device *dev = priv->dev;
-
- priv->dnld_sent = DNLD_RES_RECEIVED;
-
- /* Wake main thread if commands are pending */
- if (!adapter->cur_cmd)
- wake_up_interruptible(&priv->waitq);
-
- if (adapter->connect_status == LBS_CONNECTED)
- netif_wake_queue(dev);
-
- if (priv->mesh_dev && (adapter->mesh_connect_status == LBS_CONNECTED))
- netif_wake_queue(priv->mesh_dev);
- }
+ if (priv)
+ lbs_host_to_card_done(priv);
} else {
/* print the failure status number for debug */
lbs_pr_info("URB in failure status: %d\n", urb->status);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 67b6d79..ed02c02 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -616,6 +616,24 @@ static void lbs_tx_timeout(struct net_device *dev)
lbs_deb_leave(LBS_DEB_TX);
}
+void lbs_host_to_card_done(struct lbs_private *priv)
+{
+ struct lbs_adapter *adapter = priv->adapter;
+
+ priv->dnld_sent = DNLD_RES_RECEIVED;
+
+ /* Wake main thread if commands are pending */
+ if (!adapter->cur_cmd)
+ wake_up_interruptible(&priv->waitq);
+
+ if (priv->dev && adapter->connect_status == LBS_CONNECTED)
+ netif_wake_queue(priv->dev);
+
+ if (priv->mesh_dev && adapter->mesh_connect_status == LBS_CONNECTED)
+ netif_wake_queue(priv->mesh_dev);
+}
+EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
+
/**
* @brief This function returns the network statistics
*
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 04/48] libertas: select WIRELESS_EXT
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (2 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 03/48] libertas: Consolidate lbs_host_to_card_done() function David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 05/48] libertas: remove cmd_ctrl_node->cmdflags David Woodhouse
` (129 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 4 Dec 2007 12:17:54 -0500
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/Kconfig | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig
index 2b733c5..5583719 100644
--- a/drivers/net/wireless/Kconfig
+++ b/drivers/net/wireless/Kconfig
@@ -264,6 +264,7 @@ config IPW2200_DEBUG
config LIBERTAS
tristate "Marvell 8xxx Libertas WLAN driver support"
depends on WLAN_80211
+ select WIRELESS_EXT
select IEEE80211
select FW_LOADER
---help---
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 05/48] libertas: remove cmd_ctrl_node->cmdflags
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (3 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 04/48] libertas: select WIRELESS_EXT David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 06/48] libertas: remove cmd_ctrl_node->status David Woodhouse
` (128 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <h.schurig@mn-solutions.de>
Date: Wed, 5 Dec 2007 17:57:56 +0100
There was no code that ever did set this flag.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 7 -------
drivers/net/wireless/libertas/hostcmd.h | 1 -
2 files changed, 0 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 90f1c49..cbd28ee 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -856,13 +856,6 @@ int lbs_process_rx_command(struct lbs_private *priv)
goto done;
}
- if (adapter->cur_cmd->cmdflags & CMD_F_HOSTCMD) {
- /* Copy the response back to response buffer */
- memcpy(adapter->cur_cmd->pdata_buf, resp,
- le16_to_cpu(resp->size));
- adapter->cur_cmd->cmdflags &= ~CMD_F_HOSTCMD;
- }
-
/* If the command is not successful, cleanup and return failure */
if ((result != 0 || !(respcmd & 0x8000))) {
lbs_deb_host("CMD_RESP: error 0x%04x in command reply 0x%04x\n",
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index c029149..217ae12 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -75,7 +75,6 @@ struct cmd_ctrl_node {
void *pdata_buf;
/*command data */
u8 *bufvirtualaddr;
- u16 cmdflags;
/* wait queue */
u16 cmdwaitqwoken;
wait_queue_head_t cmdwait_q;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 06/48] libertas: remove cmd_ctrl_node->status
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (4 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 05/48] libertas: remove cmd_ctrl_node->cmdflags David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 07/48] libertas: make more functions static David Woodhouse
` (127 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <h.schurig@mn-solutions.de>
Date: Wed, 5 Dec 2007 17:57:58 +0100
There was no code that ever did set this variable.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 1 -
drivers/net/wireless/libertas/hostcmd.h | 1 -
2 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 6658590..43dde7e 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1667,7 +1667,6 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
return;
ptempnode->cmdwaitqwoken = 1;
wake_up_interruptible(&ptempnode->cmdwait_q);
- ptempnode->status = 0;
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 217ae12..f096d99 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -68,7 +68,6 @@ struct rxpd {
struct cmd_ctrl_node {
/* CMD link list */
struct list_head list;
- u32 status;
/*CMD wait option: wait for finish or no wait */
u16 wait_option;
/* command parameter */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 07/48] libertas: make more functions static
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (5 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 06/48] libertas: remove cmd_ctrl_node->status David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 16:08 ` Arnd Bergmann
2007-12-10 15:45 ` [PATCH 08/48] libertas: handy function to call firmware commands David Woodhouse
` (126 subsequent siblings)
133 siblings, 1 reply; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <h.schurig@mn-solutions.de>
Date: Wed, 5 Dec 2007 17:58:06 +0100
These functions were used in the old debugfs code for events, but
as this code is now gone, there's no need to export those functions.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 9 +++++++--
drivers/net/wireless/libertas/decl.h | 7 +------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 43dde7e..54ef990 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -13,6 +13,11 @@
#include "wext.h"
static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode);
+struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
+void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
+ struct cmd_ctrl_node *ptempnode,
+ u16 wait_option, void *pdata_buf);
+
static u16 commands_allowed_in_ps[] = {
CMD_802_11_RSSI,
@@ -1220,7 +1225,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
goto done;
}
- cmdnode = lbs_get_free_cmd_ctrl_node(priv);
+ cmdnode = lbs_get_cmd_ctrl_node(priv);
if (cmdnode == NULL) {
lbs_deb_host("PREP_CMD: cmdnode is NULL\n");
@@ -1623,7 +1628,7 @@ done:
* @param priv A pointer to struct lbs_private structure
* @return cmd_ctrl_node A pointer to cmd_ctrl_node structure or NULL
*/
-struct cmd_ctrl_node *lbs_get_free_cmd_ctrl_node(struct lbs_private *priv)
+struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
{
struct cmd_ctrl_node *tempnode;
struct lbs_adapter *adapter = priv->adapter;
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 201ec60..0856cc9 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -15,18 +15,13 @@ struct lbs_private;
struct lbs_adapter;
struct sk_buff;
struct net_device;
+struct cmd_ctrl_node;
int lbs_set_mac_packet_filter(struct lbs_private *priv);
void lbs_send_tx_feedback(struct lbs_private *priv);
int lbs_free_cmd_buffer(struct lbs_private *priv);
-struct cmd_ctrl_node;
-struct cmd_ctrl_node *lbs_get_free_cmd_ctrl_node(struct lbs_private *priv);
-
-void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
- struct cmd_ctrl_node *ptempnode,
- u16 wait_option, void *pdata_buf);
int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* Re: [PATCH 07/48] libertas: make more functions static
2007-12-10 15:45 ` [PATCH 07/48] libertas: make more functions static David Woodhouse
@ 2007-12-10 16:08 ` Arnd Bergmann
2007-12-10 16:23 ` Holger Schurig
0 siblings, 1 reply; 141+ messages in thread
From: Arnd Bergmann @ 2007-12-10 16:08 UTC (permalink / raw)
To: libertas-dev; +Cc: David Woodhouse, John Linville, Dan Williams, linux-wireless
On Monday 10 December 2007, David Woodhouse wrote:
> --- a/drivers/net/wireless/libertas/cmd.c
> +++ b/drivers/net/wireless/libertas/cmd.c
> @@ -13,6 +13,11 @@
> =A0#include "wext.h"
> =A0
> =A0static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode);
> +struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv=
);
> +void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
> +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 =A0 =A0struct cmd_ctrl=
_node *ptempnode,
> +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 =A0 =A0u16 wait_option=
, void *pdata_buf);
> +
You should never need forward declarations for global functions in a C =
file,
it is error prone in any case:
* if the functions are only used in one file, make them static.
* Better, avoid forward declarations entirely by ordering the functions=
in the
way they are called.
* If they are used in one file and defined in another, declare them in
a common header, and only there, in order to avoid the prototypes from =
diverging.
Arnd <><
-
To unsubscribe from this list: send the line "unsubscribe linux-wireles=
s" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 141+ messages in thread
* Re: [PATCH 07/48] libertas: make more functions static
2007-12-10 16:08 ` Arnd Bergmann
@ 2007-12-10 16:23 ` Holger Schurig
2007-12-10 16:30 ` David Woodhouse
0 siblings, 1 reply; 141+ messages in thread
From: Holger Schurig @ 2007-12-10 16:23 UTC (permalink / raw)
To: libertas-dev
Cc: Arnd Bergmann, Dan Williams, linux-wireless, David Woodhouse,
John Linville
> * Better, avoid forward declarations entirely by
> ordering the functions in the way they are called.
Right.
I wanted to keep the patch small, as I knew that David might
create patches in the same area.
But libertas can easily take another 200 cleanup-patches ... :-)
^ permalink raw reply [flat|nested] 141+ messages in thread
* Re: [PATCH 07/48] libertas: make more functions static
2007-12-10 16:23 ` Holger Schurig
@ 2007-12-10 16:30 ` David Woodhouse
0 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 16:30 UTC (permalink / raw)
To: Holger Schurig
Cc: libertas-dev, Arnd Bergmann, Dan Williams, linux-wireless,
John Linville
On Mon, 2007-12-10 at 17:23 +0100, Holger Schurig wrote:
> > * Better, avoid forward declarations entirely by
> > ordering the functions in the way they are called.
>
> Right.
>
> I wanted to keep the patch small, as I knew that David might
> create patches in the same area.
The whole command queueing stuff is my primary focus... I just had to
clean it all up a bit before I could really get on with that.
This function will be the subject of another commit with 'kill' in the
title, fairly soon now...
Although I suspect that given the title of Holger's commit, he actually
meant to make it static. It really is only used in that one file.
--
dwmw2
^ permalink raw reply [flat|nested] 141+ messages in thread
* [PATCH 08/48] libertas: handy function to call firmware commands
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (6 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 07/48] libertas: make more functions static David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 09/48] libertas: Don't claim to have checksummed incoming packets David Woodhouse
` (125 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <h.schurig@mn-solutions.de>
Date: Wed, 5 Dec 2007 17:58:11 +0100
Using an arbitrary firmware command was actually very painful. One
had to change big switch() statements in cmd.c, cmdresp.c, add
structs to the big union in "struct cmd_ds_command" and add the
define for the CMD_802_11_xxx to the proper place.
With this function, this is now much easier. For now, it implements
a blocking (a.k.a. CMD_OPTION_WAITFORRSP) way where one deals directly
with command requests and response buffers. You can do everything in
one place:
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 96 +++++++++++++++++++++++++++++++
drivers/net/wireless/libertas/cmdresp.c | 23 ++++++--
drivers/net/wireless/libertas/decl.h | 6 ++
drivers/net/wireless/libertas/hostcmd.h | 11 ++-
4 files changed, 126 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 54ef990..9064513 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -2007,3 +2007,99 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
lbs_deb_leave(LBS_DEB_HOST);
}
+
+
+/**
+ * @brief Simple way to call firmware functions
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param psmode one of the many CMD_802_11_xxxx
+ * @param cmd pointer to the parameters structure for above command
+ * (this should not include the command, size, sequence
+ * and result fields from struct cmd_ds_gen)
+ * @param cmd_size size structure pointed to by cmd
+ * @param rsp pointer to an area where the result should be placed
+ * @param rsp_size pointer to the size of the rsp area. If the firmware
+ * returns fewer bytes, then this *rsp_size will be
+ * changed to the actual size.
+ * @return -1 in case of a higher level error, otherwise
+ * the result code from the firmware
+ */
+int lbs_cmd(struct lbs_private *priv,
+ u16 command,
+ void *cmd, int cmd_size,
+ void *rsp, int *rsp_size)
+{
+ struct lbs_adapter *adapter = priv->adapter;
+ struct cmd_ctrl_node *cmdnode;
+ struct cmd_ds_gen *cmdptr;
+ unsigned long flags;
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_HOST);
+ lbs_deb_host("rsp at %p, rsp_size at %p\n", rsp, rsp_size);
+
+ if (!adapter || !rsp_size) {
+ lbs_deb_host("PREP_CMD: adapter is NULL\n");
+ ret = -1;
+ goto done;
+ }
+
+ if (adapter->surpriseremoved) {
+ lbs_deb_host("PREP_CMD: card removed\n");
+ ret = -1;
+ goto done;
+ }
+
+ cmdnode = lbs_get_cmd_ctrl_node(priv);
+
+ if (cmdnode == NULL) {
+ lbs_deb_host("PREP_CMD: cmdnode is NULL\n");
+
+ /* Wake up main thread to execute next command */
+ wake_up_interruptible(&priv->waitq);
+ ret = -1;
+ goto done;
+ }
+
+ cmdptr = (struct cmd_ds_gen *)cmdnode->bufvirtualaddr;
+ cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
+ cmdnode->pdata_buf = rsp;
+ cmdnode->pdata_size = rsp_size;
+
+ /* Set sequence number, clean result, move to buffer */
+ adapter->seqnum++;
+ cmdptr->command = cpu_to_le16(command);
+ cmdptr->size = cmd_size + S_DS_GEN;
+ cmdptr->seqnum = cpu_to_le16(adapter->seqnum);
+ cmdptr->result = 0;
+ memcpy(cmdptr->cmdresp, cmd, cmd_size);
+
+ lbs_deb_host("PREP_CMD: command 0x%04x\n", command);
+
+ /* here was the big old switch() statement, which is now obsolete,
+ * because the caller of lbs_cmd() sets up all of *cmd for us. */
+
+ cmdnode->cmdwaitqwoken = 0;
+ lbs_queue_cmd(adapter, cmdnode, 1);
+ wake_up_interruptible(&priv->waitq);
+
+ might_sleep();
+ wait_event_interruptible(cmdnode->cmdwait_q, cmdnode->cmdwaitqwoken);
+
+ spin_lock_irqsave(&adapter->driver_lock, flags);
+ if (adapter->cur_cmd_retcode) {
+ lbs_deb_host("PREP_CMD: command failed with return code %d\n",
+ adapter->cur_cmd_retcode);
+ adapter->cur_cmd_retcode = 0;
+ ret = -1;
+ }
+ spin_unlock_irqrestore(&adapter->driver_lock, flags);
+
+done:
+ lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(lbs_cmd);
+
+
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index cbd28ee..6a43de7 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -799,7 +799,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
}
/* Store the response code to cur_cmd_retcode. */
- adapter->cur_cmd_retcode = result;;
+ adapter->cur_cmd_retcode = result;
if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {
struct cmd_ds_802_11_ps_mode *psmode = &resp->params.psmode;
@@ -880,11 +880,22 @@ int lbs_process_rx_command(struct lbs_private *priv)
goto done;
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
-
- ret = handle_cmd_response(respcmd, resp, priv);
-
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ if (adapter->cur_cmd->pdata_size) {
+ struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
+ u16 sz = cpu_to_le16(resp->size);
+ if (sz > *adapter->cur_cmd->pdata_size) {
+ lbs_pr_err("response 0x%04x doesn't fit into "
+ "buffer (%d > %d)\n", respcmd,
+ sz, *adapter->cur_cmd->pdata_size);
+ sz = *adapter->cur_cmd->pdata_size;
+ }
+ memcpy(adapter->cur_cmd->pdata_buf, r->cmdresp, sz);
+ *adapter->cur_cmd->pdata_size = sz;
+ } else {
+ spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ ret = handle_cmd_response(respcmd, resp, priv);
+ spin_lock_irqsave(&adapter->driver_lock, flags);
+ }
if (adapter->cur_cmd) {
/* Clean up and Put current command back to cmdfreeq */
__lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 0856cc9..6f47ff0 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -16,6 +16,7 @@ struct lbs_adapter;
struct sk_buff;
struct net_device;
struct cmd_ctrl_node;
+struct cmd_ds_command;
int lbs_set_mac_packet_filter(struct lbs_private *priv);
@@ -23,6 +24,11 @@ void lbs_send_tx_feedback(struct lbs_private *priv);
int lbs_free_cmd_buffer(struct lbs_private *priv);
+int lbs_cmd(struct lbs_private *priv,
+ u16 command,
+ void *cmd, int cmd_size,
+ void *resp, int *resp_size);
+
int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
u16 cmd_action,
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index f096d99..be69ae6 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -66,13 +66,13 @@ struct rxpd {
};
struct cmd_ctrl_node {
- /* CMD link list */
struct list_head list;
- /*CMD wait option: wait for finish or no wait */
+ /* wait for finish or not */
u16 wait_option;
- /* command parameter */
+ /* command response */
void *pdata_buf;
- /*command data */
+ int *pdata_size;
+ /* command data */
u8 *bufvirtualaddr;
/* wait queue */
u16 cmdwaitqwoken;
@@ -100,9 +100,12 @@ struct cmd_ds_gen {
__le16 size;
__le16 seqnum;
__le16 result;
+ void *cmdresp[0];
};
#define S_DS_GEN sizeof(struct cmd_ds_gen)
+
+
/*
* Define data structure for CMD_GET_HW_SPEC
* This structure defines the response for the GET_HW_SPEC command
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 09/48] libertas: Don't claim to have checksummed incoming packets.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (7 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 08/48] libertas: handy function to call firmware commands David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 10/48] libertas: Move SET_BOOT2_VER command to if_usb where it belongs David Woodhouse
` (124 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 6 Dec 2007 10:36:08 +0000
This explains why we never noticed the corruption of checksums on
outgoing packets... we weren't actually checking them either.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/rx.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c
index fa467df..a252a8f 100644
--- a/drivers/net/wireless/libertas/rx.c
+++ b/drivers/net/wireless/libertas/rx.c
@@ -147,7 +147,7 @@ void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb)
else
skb->protocol = eth_type_trans(skb, priv->dev);
}
- skb->ip_summed = CHECKSUM_UNNECESSARY;
+ skb->ip_summed = CHECKSUM_NONE;
netif_rx(skb);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 10/48] libertas: Move SET_BOOT2_VER command to if_usb where it belongs
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (8 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 09/48] libertas: Don't claim to have checksummed incoming packets David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 11/48] libertas: Zero 'pdata_size' field in cmd_ctrl_node reliably David Woodhouse
` (123 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 6 Dec 2007 14:41:08 +0000
This is meaningless for non-USB devices and unimplemented in their
firmware. It's somewhat dubious for USB devices too, but that's a
different story.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 5 +++++
drivers/net/wireless/libertas/main.c | 4 ----
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 418dcab..f858928 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -222,6 +222,11 @@ static int if_usb_probe(struct usb_interface *intf,
if (lbs_start_card(priv))
goto err_start_card;
+ /* Set the boot2 version in firmware, ignoring errors. */
+ (void)lbs_prepare_and_send_command(priv, CMD_SET_BOOT2_VER,
+ 0, CMD_OPTION_WAITFORRSP, 0, NULL);
+
+
usb_get_dev(udev);
usb_set_intfdata(intf, cardp);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index ed02c02..a5b573c 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -999,10 +999,6 @@ static int lbs_setup_firmware(struct lbs_private *priv)
priv->mesh_autostart_enabled = 0;
}
- /* Set the boot2 version in firmware */
- ret = lbs_prepare_and_send_command(priv, CMD_SET_BOOT2_VER,
- 0, CMD_OPTION_WAITFORRSP, 0, NULL);
-
ret = 0;
done:
lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 11/48] libertas: Zero 'pdata_size' field in cmd_ctrl_node reliably.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (9 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 10/48] libertas: Move SET_BOOT2_VER command to if_usb where it belongs David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 12/48] libertas: Byteswap cmdptr->size in lbs_cmd() David Woodhouse
` (122 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 6 Dec 2007 12:37:31 +0000
Otherwise, lbs_process_rx_command() will take the new path for
lbs_cmd() responses, when it shouldn't.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 9064513..4fc3e4b 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1674,6 +1674,7 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
wake_up_interruptible(&ptempnode->cmdwait_q);
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
+ ptempnode->pdata_size = 0;
if (ptempnode->bufvirtualaddr != NULL)
memset(ptempnode->bufvirtualaddr, 0, MRVDRV_SIZE_OF_CMD_BUFFER);
@@ -1701,6 +1702,7 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
+ ptempnode->pdata_size = 0;
lbs_deb_leave(LBS_DEB_HOST);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 12/48] libertas: Byteswap cmdptr->size in lbs_cmd()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (10 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 11/48] libertas: Zero 'pdata_size' field in cmd_ctrl_node reliably David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 13/48] libertas: don't cast a pointer to pointer of David Woodhouse
` (121 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 6 Dec 2007 12:38:31 +0000
Bad Holger. Always test on big-endian machines, if it's little-endian
you need to be swapping to/from.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 4fc3e4b..7097dcf 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -2072,7 +2072,7 @@ int lbs_cmd(struct lbs_private *priv,
/* Set sequence number, clean result, move to buffer */
adapter->seqnum++;
cmdptr->command = cpu_to_le16(command);
- cmdptr->size = cmd_size + S_DS_GEN;
+ cmdptr->size = cpu_to_le16(cmd_size + S_DS_GEN);
cmdptr->seqnum = cpu_to_le16(adapter->seqnum);
cmdptr->result = 0;
memcpy(cmdptr->cmdresp, cmd, cmd_size);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 13/48] libertas: don't cast a pointer to pointer of
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (11 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 12/48] libertas: Byteswap cmdptr->size in lbs_cmd() David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 14/48] libertas: fix data packet size errors David Woodhouse
` (120 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Li Zefan <lizf@cn.fujitsu.com>
Date: Thu, 6 Dec 2007 13:01:21 +0100
Don't cast struct foo * to struct list_head *, it's safe only when
the list member is the first member of struct foo.
Also don't cast struct list_head * to struct foo *.
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 22 +++++++++++-----------
1 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 7097dcf..851eb3c 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1021,11 +1021,10 @@ void lbs_queue_cmd(struct lbs_adapter *adapter,
spin_lock_irqsave(&adapter->driver_lock, flags);
if (addtail) {
- list_add_tail((struct list_head *)cmdnode,
- &adapter->cmdpendingq);
+ list_add_tail(&cmdnode->list, &adapter->cmdpendingq);
adapter->nr_cmd_pending++;
} else
- list_add((struct list_head *)cmdnode, &adapter->cmdpendingq);
+ list_add(&cmdnode->list, &adapter->cmdpendingq);
spin_unlock_irqrestore(&adapter->driver_lock, flags);
@@ -1144,7 +1143,7 @@ void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
return;
cleanup_cmdnode(ptempcmd);
- list_add_tail((struct list_head *)ptempcmd, &adapter->cmdfreeq);
+ list_add_tail(&ptempcmd->list, &adapter->cmdfreeq);
}
static void lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
@@ -1642,8 +1641,9 @@ struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
spin_lock_irqsave(&adapter->driver_lock, flags);
if (!list_empty(&adapter->cmdfreeq)) {
- tempnode = (struct cmd_ctrl_node *)adapter->cmdfreeq.next;
- list_del((struct list_head *)tempnode);
+ tempnode = list_first_entry(&adapter->cmdfreeq,
+ struct cmd_ctrl_node, list);
+ list_del(&tempnode->list);
} else {
lbs_deb_host("GET_CMD_NODE: cmd_ctrl_node is not available\n");
tempnode = NULL;
@@ -1738,8 +1738,8 @@ int lbs_execute_next_command(struct lbs_private *priv)
}
if (!list_empty(&adapter->cmdpendingq)) {
- cmdnode = (struct cmd_ctrl_node *)
- adapter->cmdpendingq.next;
+ cmdnode = list_first_entry(&adapter->cmdpendingq,
+ struct cmd_ctrl_node, list);
}
spin_unlock_irqrestore(&adapter->driver_lock, flags);
@@ -1803,7 +1803,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
cpu_to_le16(CMD_SUBCMD_EXIT_PS)) {
lbs_deb_host(
"EXEC_NEXT_CMD: ignore ENTER_PS cmd\n");
- list_del((struct list_head *)cmdnode);
+ list_del(&cmdnode->list);
lbs_cleanup_and_insert_cmd(priv, cmdnode);
ret = 0;
@@ -1814,7 +1814,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
(adapter->psstate == PS_STATE_PRE_SLEEP)) {
lbs_deb_host(
"EXEC_NEXT_CMD: ignore EXIT_PS cmd in sleep\n");
- list_del((struct list_head *)cmdnode);
+ list_del(&cmdnode->list);
lbs_cleanup_and_insert_cmd(priv, cmdnode);
adapter->needtowakeup = 1;
@@ -1826,7 +1826,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
"EXEC_NEXT_CMD: sending EXIT_PS\n");
}
}
- list_del((struct list_head *)cmdnode);
+ list_del(&cmdnode->list);
lbs_deb_host("EXEC_NEXT_CMD: sending command 0x%04x\n",
le16_to_cpu(cmdptr->command));
DownloadcommandToStation(priv, cmdnode);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 14/48] libertas: fix data packet size errors
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (12 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 13/48] libertas: don't cast a pointer to pointer of David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:49 ` Michael Buesch
2007-12-10 15:45 ` [PATCH 15/48] libertas: Use lbs_cmd() for setting Boot2 version David Woodhouse
` (119 subsequent siblings)
133 siblings, 1 reply; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <hs4233@mail.mn-solutions.de>
Date: Thu, 6 Dec 2007 13:50:30 +0100
I wondered about junk bytes at the end when using "lbsdebug +hex +host"
until I noticed that firmware for the CF card sends my extranous bytes.
It says "I have 20 bytes", I take 20 bytes, but the last 8 bytes of this
are just data junk.
Also, in the new lbs_cmd() where was a size miscalulation
that made itself clear after fixing this bug.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 2 +-
drivers/net/wireless/libertas/if_cs.c | 3 +++
2 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 6a43de7..22a6973 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -882,7 +882,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
if (adapter->cur_cmd->pdata_size) {
struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
- u16 sz = cpu_to_le16(resp->size);
+ u16 sz = cpu_to_le16(resp->size) - S_DS_GEN;
if (sz > *adapter->cur_cmd->pdata_size) {
lbs_pr_err("response 0x%04x doesn't fit into "
"buffer (%d > %d)\n", respcmd,
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 54b1ba3..8508260 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -373,6 +373,9 @@ static int if_cs_receive_cmdres(struct lbs_private *priv, u8 *data, u32 *len)
if (*len & 1)
data[*len-1] = if_cs_read8(priv->card, IF_CS_C_CMD);
+ /* This is a workaround for a firmware that reports too much
+ * bytes */
+ *len -= 8;
ret = 0;
out:
lbs_deb_leave_args(LBS_DEB_CS, "ret %d, len %d", ret, *len);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* Re: [PATCH 14/48] libertas: fix data packet size errors
2007-12-10 15:45 ` [PATCH 14/48] libertas: fix data packet size errors David Woodhouse
@ 2007-12-10 15:49 ` Michael Buesch
2007-12-10 16:01 ` Holger Schurig
2007-12-10 16:03 ` David Woodhouse
0 siblings, 2 replies; 141+ messages in thread
From: Michael Buesch @ 2007-12-10 15:49 UTC (permalink / raw)
To: David Woodhouse; +Cc: John Linville, Dan Williams, libertas-dev, linux-wireless
On Monday 10 December 2007 16:45:48 David Woodhouse wrote:
> From: Holger Schurig <hs4233@mail.mn-solutions.de>
> Date: Thu, 6 Dec 2007 13:50:30 +0100
>
> I wondered about junk bytes at the end when using "lbsdebug +hex +host"
> until I noticed that firmware for the CF card sends my extranous bytes.
> It says "I have 20 bytes", I take 20 bytes, but the last 8 bytes of this
> are just data junk.
>
> Also, in the new lbs_cmd() where was a size miscalulation
> that made itself clear after fixing this bug.
>
> Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
> ---
> drivers/net/wireless/libertas/cmdresp.c | 2 +-
> drivers/net/wireless/libertas/if_cs.c | 3 +++
> 2 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
> index 6a43de7..22a6973 100644
> --- a/drivers/net/wireless/libertas/cmdresp.c
> +++ b/drivers/net/wireless/libertas/cmdresp.c
> @@ -882,7 +882,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
>
> if (adapter->cur_cmd->pdata_size) {
> struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
> - u16 sz = cpu_to_le16(resp->size);
> + u16 sz = cpu_to_le16(resp->size) - S_DS_GEN;
Whoops, something's wrong here.
You are subtracting from a LE value.
> if (sz > *adapter->cur_cmd->pdata_size) {
> lbs_pr_err("response 0x%04x doesn't fit into "
> "buffer (%d > %d)\n", respcmd,
> diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
> index 54b1ba3..8508260 100644
> --- a/drivers/net/wireless/libertas/if_cs.c
> +++ b/drivers/net/wireless/libertas/if_cs.c
> @@ -373,6 +373,9 @@ static int if_cs_receive_cmdres(struct lbs_private *priv, u8 *data, u32 *len)
> if (*len & 1)
> data[*len-1] = if_cs_read8(priv->card, IF_CS_C_CMD);
>
> + /* This is a workaround for a firmware that reports too much
> + * bytes */
> + *len -= 8;
> ret = 0;
> out:
> lbs_deb_leave_args(LBS_DEB_CS, "ret %d, len %d", ret, *len);
--
Greetings Michael.
^ permalink raw reply [flat|nested] 141+ messages in thread* Re: [PATCH 14/48] libertas: fix data packet size errors
2007-12-10 15:49 ` Michael Buesch
@ 2007-12-10 16:01 ` Holger Schurig
2007-12-10 16:03 ` David Woodhouse
1 sibling, 0 replies; 141+ messages in thread
From: Holger Schurig @ 2007-12-10 16:01 UTC (permalink / raw)
To: libertas-dev
Cc: Michael Buesch, David Woodhouse, Dan Williams, linux-wireless,
John Linville
> Whoops, something's wrong here.
> You are subtracting from a LE value.
You're right. Sparse detected that and I later sent a patch that
fixed it. See Patch 21/48.
^ permalink raw reply [flat|nested] 141+ messages in thread
* Re: [PATCH 14/48] libertas: fix data packet size errors
2007-12-10 15:49 ` Michael Buesch
2007-12-10 16:01 ` Holger Schurig
@ 2007-12-10 16:03 ` David Woodhouse
1 sibling, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 16:03 UTC (permalink / raw)
To: Michael Buesch; +Cc: John Linville, Dan Williams, libertas-dev, linux-wireless
On Mon, 2007-12-10 at 16:49 +0100, Michael Buesch wrote:
> > + u16 sz = cpu_to_le16(resp->size) - S_DS_GEN;
>
> Whoops, something's wrong here.
> You are subtracting from a LE value.
It should have been le16_to_cpu(), not cpu_to_le16(). It works as it is
on all real hardware, although it makes sparse unhappy. Holger later
fixed a bunch of such things (including this one along with some _real_
errors) in patch #21.
--
dwmw2
^ permalink raw reply [flat|nested] 141+ messages in thread
* [PATCH 15/48] libertas: Use lbs_cmd() for setting Boot2 version
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (13 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 14/48] libertas: fix data packet size errors David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 16/48] libertas: Remove SET_BOOT2_VER support from the Big Switch Statement David Woodhouse
` (118 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 6 Dec 2007 12:51:00 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 20 ++++++++++++++++----
1 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index f858928..4d89fd0 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -101,6 +101,21 @@ static void if_usb_free(struct usb_card_rec *cardp)
lbs_deb_leave(LBS_DEB_USB);
}
+static void if_usb_set_boot2_ver(struct lbs_private *priv)
+{
+ struct cmd_ds_set_boot2_ver b2_cmd;
+ int rsp_len = sizeof(b2_cmd);
+
+ b2_cmd.action = 0;
+ b2_cmd.version = cpu_to_le16(priv->boot2_version);
+
+ if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd),
+ &b2_cmd, &rsp_len)) {
+ lbs_deb_usb("Setting boot2 version failed\n");
+ }
+}
+
+
/**
* @brief sets the configuration values
* @param ifnum interface number
@@ -222,10 +237,7 @@ static int if_usb_probe(struct usb_interface *intf,
if (lbs_start_card(priv))
goto err_start_card;
- /* Set the boot2 version in firmware, ignoring errors. */
- (void)lbs_prepare_and_send_command(priv, CMD_SET_BOOT2_VER,
- 0, CMD_OPTION_WAITFORRSP, 0, NULL);
-
+ if_usb_set_boot2_ver(priv);
usb_get_dev(udev);
usb_set_intfdata(intf, cardp);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 16/48] libertas: Remove SET_BOOT2_VER support from the Big Switch Statement.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (14 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 15/48] libertas: Use lbs_cmd() for setting Boot2 version David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 17/48] libertas: Fix endianness in boot2_version handling David Woodhouse
` (117 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 6 Dec 2007 14:44:21 +0000
And the death of libertas_prepare_and_send_command() starts...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 15 ---------------
1 files changed, 0 insertions(+), 15 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 851eb3c..b1ea878 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -974,17 +974,6 @@ static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
return 0;
}
-static int lbs_cmd_set_boot2_ver(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- u16 cmd_action, void *pdata_buf)
-{
- struct cmd_ds_set_boot2_ver *boot2_ver = &cmd->params.boot2_ver;
- cmd->command = cpu_to_le16(CMD_SET_BOOT2_VER);
- cmd->size = cpu_to_le16(sizeof(struct cmd_ds_set_boot2_ver) + S_DS_GEN);
- boot2_ver->version = priv->boot2_version;
- return 0;
-}
-
/*
* Note: NEVER use lbs_queue_cmd() with addtail==0 other than for
* the command timer, because it does not account for queued commands.
@@ -1470,10 +1459,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_mesh_access(priv, cmdptr, cmd_action, pdata_buf);
break;
- case CMD_SET_BOOT2_VER:
- ret = lbs_cmd_set_boot2_ver(priv, cmdptr, cmd_action, pdata_buf);
- break;
-
case CMD_GET_TSF:
cmdptr->command = cpu_to_le16(CMD_GET_TSF);
cmdptr->size = cpu_to_le16(sizeof(struct cmd_ds_get_tsf) +
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 17/48] libertas: Fix endianness in boot2_version handling.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (15 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 16/48] libertas: Remove SET_BOOT2_VER support from the Big Switch Statement David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 18/48] libertas: implement new scanning logic David Woodhouse
` (116 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Fri, 7 Dec 2007 12:56:45 +0000
We read it from the card. We byte-swap it. We write it back to the card.
D'oh.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 4d89fd0..d5fc7d7 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -227,7 +227,7 @@ static int if_usb_probe(struct usb_interface *intf,
priv->hw_host_to_card = if_usb_host_to_card;
priv->hw_get_int_status = if_usb_get_int_status;
priv->hw_read_event_cause = if_usb_read_event_cause;
- priv->boot2_version = udev->descriptor.bcdDevice;
+ priv->boot2_version = le16_to_cpu(udev->descriptor.bcdDevice);
/* Delay 200 ms to waiting for the FW ready */
if_usb_submit_rx_urb(cardp);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 18/48] libertas: implement new scanning logic
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (16 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 17/48] libertas: Fix endianness in boot2_version handling David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 19/48] libertas: when usb_submit_usb fails, include the error code in the printk David Woodhouse
` (115 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <hs4233@mail.mn-solutions.de>
Date: Fri, 7 Dec 2007 16:52:10 +0100
This changes the code that is used for scanning and makes it hopefully
easier to understand:
* move function into logical blocks
* create a bunch of lbs_scan_add_XXXX_tlv() functions, that
help to create the TLV parameter of CMD_802_11_SCAN
* all of them are now called from the much simpler lbs_do_scan()
* no **puserscancfg double-pointers :-)
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/dev.h | 3 +-
drivers/net/wireless/libertas/scan.c | 871 ++++++++++++++--------------------
2 files changed, 361 insertions(+), 513 deletions(-)
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 1efea63..96a34c5 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -366,9 +366,8 @@ struct lbs_adapter {
struct cmd_ds_802_11_get_log logmsg;
u32 monitormode;
+ int last_scanned_channel;
u8 fw_ready;
-
- u8 last_scanned_channel;
};
#endif
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c
index 236bc7d..90c1888 100644
--- a/drivers/net/wireless/libertas/scan.c
+++ b/drivers/net/wireless/libertas/scan.c
@@ -79,6 +79,22 @@ static inline void clear_bss_descriptor (struct bss_descriptor * bss)
memset(bss, 0, offsetof(struct bss_descriptor, list));
}
+/**
+ * @brief Compare two SSIDs
+ *
+ * @param ssid1 A pointer to ssid to compare
+ * @param ssid2 A pointer to ssid to compare
+ *
+ * @return 0: ssid is same, otherwise is different
+ */
+int lbs_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len)
+{
+ if (ssid1_len != ssid2_len)
+ return -1;
+
+ return memcmp(ssid1, ssid2, ssid1_len);
+}
+
static inline int match_bss_no_security(struct lbs_802_11_security *secinfo,
struct bss_descriptor * match_bss)
{
@@ -149,6 +165,18 @@ static inline int match_bss_dynamic_wep(struct lbs_802_11_security *secinfo,
return 0;
}
+static inline int is_same_network(struct bss_descriptor *src,
+ struct bss_descriptor *dst)
+{
+ /* A network is only a duplicate if the channel, BSSID, and ESSID
+ * all match. We treat all <hidden> with the same BSSID and channel
+ * as one network */
+ return ((src->ssid_len == dst->ssid_len) &&
+ (src->channel == dst->channel) &&
+ !compare_ether_addr(src->bssid, dst->bssid) &&
+ !memcmp(src->ssid, dst->ssid, src->ssid_len));
+}
+
/**
* @brief Check if a scanned network compatible with the driver settings
*
@@ -184,9 +212,9 @@ static int is_network_compatible(struct lbs_adapter *adapter,
goto done;
} else if ((matched = match_bss_wpa(&adapter->secinfo, bss))) {
lbs_deb_scan(
- "is_network_compatible() WPA: wpa_ie=%#x "
- "wpa2_ie=%#x WEP=%s WPA=%s WPA2=%s "
- "privacy=%#x\n", bss->wpa_ie[0], bss->rsn_ie[0],
+ "is_network_compatible() WPA: wpa_ie 0x%x "
+ "wpa2_ie 0x%x WEP %s WPA %s WPA2 %s "
+ "privacy 0x%x\n", bss->wpa_ie[0], bss->rsn_ie[0],
adapter->secinfo.wep_enabled ? "e" : "d",
adapter->secinfo.WPAenabled ? "e" : "d",
adapter->secinfo.WPA2enabled ? "e" : "d",
@@ -194,9 +222,9 @@ static int is_network_compatible(struct lbs_adapter *adapter,
goto done;
} else if ((matched = match_bss_wpa2(&adapter->secinfo, bss))) {
lbs_deb_scan(
- "is_network_compatible() WPA2: wpa_ie=%#x "
- "wpa2_ie=%#x WEP=%s WPA=%s WPA2=%s "
- "privacy=%#x\n", bss->wpa_ie[0], bss->rsn_ie[0],
+ "is_network_compatible() WPA2: wpa_ie 0x%x "
+ "wpa2_ie 0x%x WEP %s WPA %s WPA2 %s "
+ "privacy 0x%x\n", bss->wpa_ie[0], bss->rsn_ie[0],
adapter->secinfo.wep_enabled ? "e" : "d",
adapter->secinfo.WPAenabled ? "e" : "d",
adapter->secinfo.WPA2enabled ? "e" : "d",
@@ -205,7 +233,7 @@ static int is_network_compatible(struct lbs_adapter *adapter,
} else if ((matched = match_bss_dynamic_wep(&adapter->secinfo, bss))) {
lbs_deb_scan(
"is_network_compatible() dynamic WEP: "
- "wpa_ie=%#x wpa2_ie=%#x privacy=%#x\n",
+ "wpa_ie 0x%x wpa2_ie 0x%x privacy 0x%x\n",
bss->wpa_ie[0], bss->rsn_ie[0],
(bss->capability & WLAN_CAPABILITY_PRIVACY));
goto done;
@@ -213,8 +241,8 @@ static int is_network_compatible(struct lbs_adapter *adapter,
/* bss security settings don't match those configured on card */
lbs_deb_scan(
- "is_network_compatible() FAILED: wpa_ie=%#x "
- "wpa2_ie=%#x WEP=%s WPA=%s WPA2=%s privacy=%#x\n",
+ "is_network_compatible() FAILED: wpa_ie 0x%x "
+ "wpa2_ie 0x%x WEP %s WPA %s WPA2 %s privacy 0x%x\n",
bss->wpa_ie[0], bss->rsn_ie[0],
adapter->secinfo.wep_enabled ? "e" : "d",
adapter->secinfo.WPAenabled ? "e" : "d",
@@ -226,22 +254,6 @@ done:
return matched;
}
-/**
- * @brief Compare two SSIDs
- *
- * @param ssid1 A pointer to ssid to compare
- * @param ssid2 A pointer to ssid to compare
- *
- * @return 0--ssid is same, otherwise is different
- */
-int lbs_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len)
-{
- if (ssid1_len != ssid2_len)
- return -1;
-
- return memcmp(ssid1, ssid2, ssid1_len);
-}
-
@@ -251,6 +263,16 @@ int lbs_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len)
/* */
/*********************************************************************/
+void lbs_scan_worker(struct work_struct *work)
+{
+ struct lbs_private *priv =
+ container_of(work, struct lbs_private, scan_work.work);
+
+ lbs_deb_enter(LBS_DEB_SCAN);
+ lbs_scan_networks(priv, NULL, 0);
+ lbs_deb_leave(LBS_DEB_SCAN);
+}
+
/**
* @brief Create a channel list for the driver to scan based on region info
@@ -271,7 +293,7 @@ int lbs_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len)
*
* @return void
*/
-static void lbs_scan_create_channel_list(struct lbs_private *priv,
+static int lbs_scan_create_channel_list(struct lbs_private *priv,
struct chanscanparamset * scanchanlist,
u8 filteredscan)
{
@@ -284,8 +306,6 @@ static void lbs_scan_create_channel_list(struct lbs_private *priv,
int nextchan;
u8 scantype;
- lbs_deb_enter_args(LBS_DEB_SCAN, "filteredscan %d", filteredscan);
-
chanidx = 0;
/* Set the default scan type to the user specified type, will later
@@ -353,383 +373,151 @@ static void lbs_scan_create_channel_list(struct lbs_private *priv,
}
}
}
+ return chanidx;
}
-/* Delayed partial scan worker */
-void lbs_scan_worker(struct work_struct *work)
+/*
+ * Add SSID TLV of the form:
+ *
+ * TLV-ID SSID 00 00
+ * length 06 00
+ * ssid 4d 4e 54 45 53 54
+ */
+static int lbs_scan_add_ssid_tlv(u8 *tlv,
+ const struct lbs_ioctl_user_scan_cfg *user_cfg)
{
- struct lbs_private *priv = container_of(work,
- struct lbs_private,
- scan_work.work);
-
- lbs_scan_networks(priv, NULL, 0);
+ struct mrvlietypes_ssidparamset *ssid_tlv =
+ (struct mrvlietypes_ssidparamset *)tlv;
+ ssid_tlv->header.type = cpu_to_le16(TLV_TYPE_SSID);
+ ssid_tlv->header.len = cpu_to_le16(user_cfg->ssid_len);
+ memcpy(ssid_tlv->ssid, user_cfg->ssid, user_cfg->ssid_len);
+ return sizeof(ssid_tlv->header) + user_cfg->ssid_len;
}
-/**
- * @brief Construct a lbs_scan_cmd_config structure to use in issue scan cmds
- *
- * Application layer or other functions can invoke lbs_scan_networks
- * with a scan configuration supplied in a lbs_ioctl_user_scan_cfg struct.
- * This structure is used as the basis of one or many lbs_scan_cmd_config
- * commands that are sent to the command processing module and sent to
- * firmware.
- *
- * Create a lbs_scan_cmd_config based on the following user supplied
- * parameters (if present):
- * - SSID filter
- * - BSSID filter
- * - Number of Probes to be sent
- * - channel list
- *
- * If the SSID or BSSID filter is not present, disable/clear the filter.
- * Qualify the channel
+/*
+ * Add CHANLIST TLV of the form
*
- * @param priv A pointer to struct lbs_private structure
- * @param puserscanin NULL or pointer to scan configuration parameters
- * @param ppchantlvout Output parameter: Pointer to the start of the
- * channel TLV portion of the output scan config
- * @param pscanchanlist Output parameter: Pointer to the resulting channel
- * list to scan
- * @param pmaxchanperscan Output parameter: Number of channels to scan for
- * each issuance of the firmware scan command
- * @param pfilteredscan Output parameter: Flag indicating whether or not
- * a BSSID or SSID filter is being sent in the
- * command to firmware. Used to increase the number
- * of channels sent in a scan command and to
- * disable the firmware channel scan filter.
- * @param pscancurrentonly Output parameter: Flag indicating whether or not
- * we are only scanning our current active channel
+ * TLV-ID CHANLIST 01 01
+ * length 5b 00
+ * channel 1 00 01 00 00 00 64 00
+ * radio type 00
+ * channel 01
+ * scan type 00
+ * min scan time 00 00
+ * max scan time 64 00
+ * channel 2 00 02 00 00 00 64 00
+ * channel 3 00 03 00 00 00 64 00
+ * channel 4 00 04 00 00 00 64 00
+ * channel 5 00 05 00 00 00 64 00
+ * channel 6 00 06 00 00 00 64 00
+ * channel 7 00 07 00 00 00 64 00
+ * channel 8 00 08 00 00 00 64 00
+ * channel 9 00 09 00 00 00 64 00
+ * channel 10 00 0a 00 00 00 64 00
+ * channel 11 00 0b 00 00 00 64 00
+ * channel 12 00 0c 00 00 00 64 00
+ * channel 13 00 0d 00 00 00 64 00
*
- * @return resulting scan configuration
*/
-static struct lbs_scan_cmd_config *
-lbs_scan_setup_scan_config(struct lbs_private *priv,
- const struct lbs_ioctl_user_scan_cfg *puserscanin,
- struct mrvlietypes_chanlistparamset ** ppchantlvout,
- struct chanscanparamset * pscanchanlist,
- int *pmaxchanperscan,
- u8 * pfilteredscan,
- u8 * pscancurrentonly)
+static int lbs_scan_add_chanlist_tlv(u8 *tlv,
+ struct chanscanparamset *chan_list,
+ int chan_count)
{
- struct mrvlietypes_ssidparamset *pssidtlv;
- struct lbs_scan_cmd_config *pscancfgout = NULL;
- u8 *ptlvpos;
-
- lbs_deb_enter(LBS_DEB_SCAN);
-
- pscancfgout = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL);
- if (pscancfgout == NULL)
- goto out;
-
- /* The tlvbufferlen is calculated for each scan command. The TLVs added
- * in this routine will be preserved since the routine that sends
- * the command will append channelTLVs at *ppchantlvout. The difference
- * between the *ppchantlvout and the tlvbuffer start will be used
- * to calculate the size of anything we add in this routine.
- */
- pscancfgout->tlvbufferlen = 0;
-
- /* Running tlv pointer. Assigned to ppchantlvout at end of function
- * so later routines know where channels can be added to the command buf
- */
- ptlvpos = pscancfgout->tlvbuffer;
-
- /*
- * Set the initial scan paramters for progressive scanning. If a specific
- * BSSID or SSID is used, the number of channels in the scan command
- * will be increased to the absolute maximum
- */
- *pmaxchanperscan = MRVDRV_CHANNELS_PER_SCAN_CMD;
-
- /* Initialize the scan as un-filtered by firmware, set to TRUE below if
- * a SSID or BSSID filter is sent in the command
- */
- *pfilteredscan = 0;
-
- /* Initialize the scan as not being only on the current channel. If
- * the channel list is customized, only contains one channel, and
- * is the active channel, this is set true and data flow is not halted.
- */
- *pscancurrentonly = 0;
-
- if (puserscanin) {
- /* Set the bss type scan filter, use adapter setting if unset */
- pscancfgout->bsstype =
- puserscanin->bsstype ? puserscanin->bsstype : CMD_BSS_TYPE_ANY;
-
- /*
- * Set the BSSID filter to the incoming configuration,
- * if non-zero. If not set, it will remain disabled (all zeros).
- */
- memcpy(pscancfgout->bssid, puserscanin->bssid,
- sizeof(pscancfgout->bssid));
-
- if (puserscanin->ssid_len) {
- pssidtlv =
- (struct mrvlietypes_ssidparamset *) pscancfgout->
- tlvbuffer;
- pssidtlv->header.type = cpu_to_le16(TLV_TYPE_SSID);
- pssidtlv->header.len = cpu_to_le16(puserscanin->ssid_len);
- memcpy(pssidtlv->ssid, puserscanin->ssid,
- puserscanin->ssid_len);
- ptlvpos += sizeof(pssidtlv->header) + puserscanin->ssid_len;
- }
-
- /*
- * The default number of channels sent in the command is low to
- * ensure the response buffer from the firmware does not truncate
- * scan results. That is not an issue with an SSID or BSSID
- * filter applied to the scan results in the firmware.
- */
- if ( puserscanin->ssid_len
- || (compare_ether_addr(pscancfgout->bssid, &zeromac[0]) != 0)) {
- *pmaxchanperscan = MRVDRV_MAX_CHANNELS_PER_SCAN;
- *pfilteredscan = 1;
- }
- } else {
- pscancfgout->bsstype = CMD_BSS_TYPE_ANY;
- }
-
- /*
- * Set the output for the channel TLV to the address in the tlv buffer
- * past any TLVs that were added in this fuction (SSID).
- * channel TLVs will be added past this for each scan command, preserving
- * the TLVs that were previously added.
- */
- *ppchantlvout = (struct mrvlietypes_chanlistparamset *) ptlvpos;
-
- lbs_scan_create_channel_list(priv, pscanchanlist,
- *pfilteredscan);
-out:
- return pscancfgout;
+ size_t size = sizeof(struct chanscanparamset) * chan_count;
+ struct mrvlietypes_chanlistparamset *chan_tlv =
+ (struct mrvlietypes_chanlistparamset *) tlv;
+
+ chan_tlv->header.type = cpu_to_le16(TLV_TYPE_CHANLIST);
+ memcpy(chan_tlv->chanscanparam, chan_list, size);
+ chan_tlv->header.len = cpu_to_le16(size);
+ return sizeof(chan_tlv->header) + size;
}
-/**
- * @brief Construct and send multiple scan config commands to the firmware
- *
- * Only used from lbs_scan_networks()
- *
- * Previous routines have created a lbs_scan_cmd_config with any requested
- * TLVs. This function splits the channel TLV into maxchanperscan lists
- * and sends the portion of the channel TLV along with the other TLVs
- * to the lbs_cmd routines for execution in the firmware.
+
+/*
+ * Add RATES TLV of the form
*
- * @param priv A pointer to struct lbs_private structure
- * @param maxchanperscan Maximum number channels to be included in each
- * scan command sent to firmware
- * @param filteredscan Flag indicating whether or not a BSSID or SSID
- * filter is being used for the firmware command
- * scan command sent to firmware
- * @param pscancfgout Scan configuration used for this scan.
- * @param pchantlvout Pointer in the pscancfgout where the channel TLV
- * should start. This is past any other TLVs that
- * must be sent down in each firmware command.
- * @param pscanchanlist List of channels to scan in maxchanperscan segments
+ * TLV-ID RATES 01 00
+ * length 0e 00
+ * rates 82 84 8b 96 0c 12 18 24 30 48 60 6c
*
- * @return 0 or error return otherwise
+ * The rates are in lbs_bg_rates[], but for the 802.11b
+ * rates the high bit isn't set.
*/
-static int lbs_scan_channel_list(struct lbs_private *priv,
- int maxchanperscan,
- u8 filteredscan,
- struct lbs_scan_cmd_config *pscancfgout,
- struct mrvlietypes_chanlistparamset * pchantlvout,
- struct chanscanparamset * pscanchanlist,
- const struct lbs_ioctl_user_scan_cfg *puserscanin,
- int full_scan)
+static int lbs_scan_add_rates_tlv(u8 *tlv)
{
- struct chanscanparamset *ptmpchan;
- struct chanscanparamset *pstartchan;
- u8 scanband;
- int doneearly;
- int tlvidx;
- int ret = 0;
- int scanned = 0;
- union iwreq_data wrqu;
-
- lbs_deb_enter_args(LBS_DEB_SCAN, "maxchanperscan %d, filteredscan %d, "
- "full_scan %d", maxchanperscan, filteredscan, full_scan);
-
- if (!pscancfgout || !pchantlvout || !pscanchanlist) {
- lbs_deb_scan("pscancfgout, pchantlvout or "
- "pscanchanlist is NULL\n");
- ret = -1;
- goto out;
- }
-
- pchantlvout->header.type = cpu_to_le16(TLV_TYPE_CHANLIST);
-
- /* Set the temp channel struct pointer to the start of the desired list */
- ptmpchan = pscanchanlist;
-
- if (priv->adapter->last_scanned_channel && !puserscanin)
- ptmpchan += priv->adapter->last_scanned_channel;
-
- /* Loop through the desired channel list, sending a new firmware scan
- * commands for each maxchanperscan channels (or for 1,6,11 individually
- * if configured accordingly)
- */
- while (ptmpchan->channumber) {
-
- tlvidx = 0;
- pchantlvout->header.len = 0;
- scanband = ptmpchan->radiotype;
- pstartchan = ptmpchan;
- doneearly = 0;
-
- /* Construct the channel TLV for the scan command. Continue to
- * insert channel TLVs until:
- * - the tlvidx hits the maximum configured per scan command
- * - the next channel to insert is 0 (end of desired channel list)
- * - doneearly is set (controlling individual scanning of 1,6,11)
- */
- while (tlvidx < maxchanperscan && ptmpchan->channumber
- && !doneearly && scanned < 2) {
-
- lbs_deb_scan("channel %d, radio %d, passive %d, "
- "dischanflt %d, maxscantime %d\n",
- ptmpchan->channumber,
- ptmpchan->radiotype,
- ptmpchan->chanscanmode.passivescan,
- ptmpchan->chanscanmode.disablechanfilt,
- ptmpchan->maxscantime);
-
- /* Copy the current channel TLV to the command being prepared */
- memcpy(pchantlvout->chanscanparam + tlvidx,
- ptmpchan, sizeof(pchantlvout->chanscanparam));
-
- /* Increment the TLV header length by the size appended */
- /* Ew, it would be _so_ nice if we could just declare the
- variable little-endian and let GCC handle it for us */
- pchantlvout->header.len =
- cpu_to_le16(le16_to_cpu(pchantlvout->header.len) +
- sizeof(pchantlvout->chanscanparam));
-
- /*
- * The tlv buffer length is set to the number of bytes of the
- * between the channel tlv pointer and the start of the
- * tlv buffer. This compensates for any TLVs that were appended
- * before the channel list.
- */
- pscancfgout->tlvbufferlen = ((u8 *) pchantlvout
- - pscancfgout->tlvbuffer);
-
- /* Add the size of the channel tlv header and the data length */
- pscancfgout->tlvbufferlen +=
- (sizeof(pchantlvout->header)
- + le16_to_cpu(pchantlvout->header.len));
-
- /* Increment the index to the channel tlv we are constructing */
- tlvidx++;
-
- doneearly = 0;
-
- /* Stop the loop if the *current* channel is in the 1,6,11 set
- * and we are not filtering on a BSSID or SSID.
- */
- if (!filteredscan && (ptmpchan->channumber == 1
- || ptmpchan->channumber == 6
- || ptmpchan->channumber == 11)) {
- doneearly = 1;
- }
-
- /* Increment the tmp pointer to the next channel to be scanned */
- ptmpchan++;
- scanned++;
-
- /* Stop the loop if the *next* channel is in the 1,6,11 set.
- * This will cause it to be the only channel scanned on the next
- * interation
- */
- if (!filteredscan && (ptmpchan->channumber == 1
- || ptmpchan->channumber == 6
- || ptmpchan->channumber == 11)) {
- doneearly = 1;
- }
- }
-
- /* Send the scan command to the firmware with the specified cfg */
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_SCAN, 0,
- 0, 0, pscancfgout);
- if (scanned >= 2 && !full_scan) {
- ret = 0;
- goto done;
- }
- scanned = 0;
- }
-
-done:
- priv->adapter->last_scanned_channel = ptmpchan->channumber;
-
- if (priv->adapter->last_scanned_channel) {
- /* Schedule the next part of the partial scan */
- if (!full_scan && !priv->adapter->surpriseremoved) {
- cancel_delayed_work(&priv->scan_work);
- queue_delayed_work(priv->work_thread, &priv->scan_work,
- msecs_to_jiffies(300));
- }
- } else {
- /* All done, tell userspace the scan table has been updated */
- memset(&wrqu, 0, sizeof(union iwreq_data));
- wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL);
+ int i;
+ struct mrvlietypes_ratesparamset *rate_tlv =
+ (struct mrvlietypes_ratesparamset *) tlv;
+
+ rate_tlv->header.type = cpu_to_le16(TLV_TYPE_RATES);
+ tlv += sizeof(rate_tlv->header);
+ for (i = 0; i < MAX_RATES; i++) {
+ *tlv = lbs_bg_rates[i];
+ if (*tlv == 0)
+ break;
+ /* This code makes sure that the 802.11b rates (1 MBit/s, 2
+ MBit/s, 5.5 MBit/s and 11 MBit/s get's the high bit set.
+ Note that the values are MBit/s * 2, to mark them as
+ basic rates so that the firmware likes it better */
+ if (*tlv == 0x02 || *tlv == 0x04 ||
+ *tlv == 0x0b || *tlv == 0x16)
+ *tlv |= 0x80;
+ tlv++;
}
-
-out:
- lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
- return ret;
+ rate_tlv->header.len = cpu_to_le16(i);
+ return sizeof(rate_tlv->header) + i;
}
+
/*
- * Only used from lbs_scan_networks()
-*/
-static void clear_selected_scan_list_entries(struct lbs_adapter *adapter,
- const struct lbs_ioctl_user_scan_cfg *scan_cfg)
+ * Generate the CMD_802_11_SCAN command with the proper tlv
+ * for a bunch of channels.
+ */
+static int lbs_do_scan(struct lbs_private *priv,
+ u8 bsstype,
+ struct chanscanparamset *chan_list,
+ int chan_count,
+ const struct lbs_ioctl_user_scan_cfg *user_cfg)
{
- struct bss_descriptor *bss;
- struct bss_descriptor *safe;
- u32 clear_ssid_flag = 0, clear_bssid_flag = 0;
+ int ret = -ENOMEM;
+ struct lbs_scan_cmd_config *scan_cmd;
+ u8 *tlv; /* pointer into our current, growing TLV storage area */
- lbs_deb_enter(LBS_DEB_SCAN);
+ lbs_deb_enter_args(LBS_DEB_SCAN, "bsstype %d, chanlist[].chan %d, "
+ "chan_count %d",
+ bsstype, chan_list[0].channumber, chan_count);
- if (!scan_cfg)
+ /* create the fixed part for scan command */
+ scan_cmd = kzalloc(MAX_SCAN_CFG_ALLOC, GFP_KERNEL);
+ if (scan_cmd == NULL)
goto out;
-
- if (scan_cfg->clear_ssid && scan_cfg->ssid_len)
- clear_ssid_flag = 1;
-
- if (scan_cfg->clear_bssid
- && (compare_ether_addr(scan_cfg->bssid, &zeromac[0]) != 0)
- && (compare_ether_addr(scan_cfg->bssid, &bcastmac[0]) != 0)) {
- clear_bssid_flag = 1;
- }
-
- if (!clear_ssid_flag && !clear_bssid_flag)
- goto out;
-
- mutex_lock(&adapter->lock);
- list_for_each_entry_safe (bss, safe, &adapter->network_list, list) {
- u32 clear = 0;
-
- /* Check for an SSID match */
- if ( clear_ssid_flag
- && (bss->ssid_len == scan_cfg->ssid_len)
- && !memcmp(bss->ssid, scan_cfg->ssid, bss->ssid_len))
- clear = 1;
-
- /* Check for a BSSID match */
- if ( clear_bssid_flag
- && !compare_ether_addr(bss->bssid, scan_cfg->bssid))
- clear = 1;
-
- if (clear) {
- list_move_tail (&bss->list, &adapter->network_free_list);
- clear_bss_descriptor(bss);
- }
- }
- mutex_unlock(&adapter->lock);
+ tlv = scan_cmd->tlvbuffer;
+ if (user_cfg)
+ memcpy(scan_cmd->bssid, user_cfg->bssid, ETH_ALEN);
+ scan_cmd->bsstype = bsstype;
+
+ /* add TLVs */
+ if (user_cfg && user_cfg->ssid_len)
+ tlv += lbs_scan_add_ssid_tlv(tlv, user_cfg);
+ if (chan_list && chan_count)
+ tlv += lbs_scan_add_chanlist_tlv(tlv, chan_list, chan_count);
+ tlv += lbs_scan_add_rates_tlv(tlv);
+
+ /* This is the final data we are about to send */
+ scan_cmd->tlvbufferlen = tlv - scan_cmd->tlvbuffer;
+ lbs_deb_hex(LBS_DEB_SCAN, "SCAN_CMD", (void *)scan_cmd, 1+6);
+ lbs_deb_hex(LBS_DEB_SCAN, "SCAN_TLV", scan_cmd->tlvbuffer,
+ scan_cmd->tlvbufferlen);
+
+ ret = lbs_prepare_and_send_command(priv, CMD_802_11_SCAN, 0,
+ CMD_OPTION_WAITFORRSP, 0, scan_cmd);
out:
- lbs_deb_leave(LBS_DEB_SCAN);
+ kfree(scan_cmd);
+ lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
+ return ret;
}
@@ -745,29 +533,30 @@ out:
* @param priv A pointer to struct lbs_private structure
* @param puserscanin Pointer to the input configuration for the requested
* scan.
- * @param full_scan ???
*
* @return 0 or < 0 if error
*/
int lbs_scan_networks(struct lbs_private *priv,
- const struct lbs_ioctl_user_scan_cfg *puserscanin,
+ const struct lbs_ioctl_user_scan_cfg *user_cfg,
int full_scan)
{
struct lbs_adapter *adapter = priv->adapter;
- struct mrvlietypes_chanlistparamset *pchantlvout;
- struct chanscanparamset * scan_chan_list = NULL;
- struct lbs_scan_cmd_config *scan_cfg = NULL;
- u8 filteredscan;
- u8 scancurrentchanonly;
- int maxchanperscan;
- int ret;
+ int ret = -ENOMEM;
+ struct chanscanparamset *chan_list;
+ struct chanscanparamset *curr_chans;
+ int chan_count;
+ u8 bsstype = CMD_BSS_TYPE_ANY;
+ int numchannels = MRVDRV_CHANNELS_PER_SCAN_CMD;
+ int filteredscan = 0;
+ union iwreq_data wrqu;
#ifdef CONFIG_LIBERTAS_DEBUG
- struct bss_descriptor * iter_bss;
+ struct bss_descriptor *iter;
int i = 0;
DECLARE_MAC_BUF(mac);
#endif
- lbs_deb_enter_args(LBS_DEB_SCAN, "full_scan %d", full_scan);
+ lbs_deb_enter_args(LBS_DEB_SCAN, "full_scan %d",
+ full_scan);
/* Cancel any partial outstanding partial scans if this scan
* is a full scan.
@@ -775,85 +564,130 @@ int lbs_scan_networks(struct lbs_private *priv,
if (full_scan && delayed_work_pending(&priv->scan_work))
cancel_delayed_work(&priv->scan_work);
- scan_chan_list = kzalloc(sizeof(struct chanscanparamset) *
- LBS_IOCTL_USER_SCAN_CHAN_MAX, GFP_KERNEL);
- if (scan_chan_list == NULL) {
- ret = -ENOMEM;
- goto out;
+ /* Determine same scan parameters */
+ if (user_cfg) {
+ if (user_cfg->bsstype)
+ bsstype = user_cfg->bsstype;
+ if (compare_ether_addr(user_cfg->bssid, &zeromac[0]) != 0) {
+ numchannels = MRVDRV_MAX_CHANNELS_PER_SCAN;
+ filteredscan = 1;
+ }
}
+ lbs_deb_scan("numchannels %d, bsstype %d, "
+ "filteredscan %d\n",
+ numchannels, bsstype, filteredscan);
- scan_cfg = lbs_scan_setup_scan_config(priv,
- puserscanin,
- &pchantlvout,
- scan_chan_list,
- &maxchanperscan,
- &filteredscan,
- &scancurrentchanonly);
- if (scan_cfg == NULL) {
- ret = -ENOMEM;
+ /* Create list of channels to scan */
+ chan_list = kzalloc(sizeof(struct chanscanparamset) *
+ LBS_IOCTL_USER_SCAN_CHAN_MAX, GFP_KERNEL);
+ if (!chan_list) {
+ lbs_pr_alert("SCAN: chan_list empty\n");
goto out;
}
- clear_selected_scan_list_entries(adapter, puserscanin);
+ /* We want to scan all channels */
+ chan_count = lbs_scan_create_channel_list(priv, chan_list,
+ filteredscan);
- /* Keep the data path active if we are only scanning our current channel */
- if (!scancurrentchanonly) {
- netif_stop_queue(priv->dev);
- netif_carrier_off(priv->dev);
- if (priv->mesh_dev) {
+ netif_stop_queue(priv->dev);
+ netif_carrier_off(priv->dev);
+ if (priv->mesh_dev) {
netif_stop_queue(priv->mesh_dev);
netif_carrier_off(priv->mesh_dev);
- }
}
- ret = lbs_scan_channel_list(priv,
- maxchanperscan,
- filteredscan,
- scan_cfg,
- pchantlvout,
- scan_chan_list,
- puserscanin,
- full_scan);
+ /* Prepare to continue an interrupted scan */
+ lbs_deb_scan("chan_count %d, last_scanned_channel %d\n",
+ chan_count, adapter->last_scanned_channel);
+ curr_chans = chan_list;
+ /* advance channel list by already-scanned-channels */
+ if (adapter->last_scanned_channel > 0) {
+ curr_chans += adapter->last_scanned_channel;
+ chan_count -= adapter->last_scanned_channel;
+ }
+
+ /* Send scan command(s)
+ * numchannels contains the number of channels we should maximally scan
+ * chan_count is the total number of channels to scan
+ */
+
+ while (chan_count) {
+ int to_scan = min(numchannels, chan_count);
+ lbs_deb_scan("scanning %d of %d channels\n",
+ to_scan, chan_count);
+ ret = lbs_do_scan(priv, bsstype, curr_chans,
+ to_scan, user_cfg);
+ if (ret) {
+ lbs_pr_err("SCAN_CMD failed\n");
+ goto out2;
+ }
+ curr_chans += to_scan;
+ chan_count -= to_scan;
+
+ /* somehow schedule the next part of the scan */
+ if (chan_count &&
+ !full_scan &&
+ !priv->adapter->surpriseremoved) {
+ /* -1 marks just that we're currently scanning */
+ if (adapter->last_scanned_channel < 0)
+ adapter->last_scanned_channel = to_scan;
+ else
+ adapter->last_scanned_channel += to_scan;
+ cancel_delayed_work(&priv->scan_work);
+ queue_delayed_work(priv->work_thread, &priv->scan_work,
+ msecs_to_jiffies(300));
+ /* skip over GIWSCAN event */
+ goto out;
+ }
+
+ }
+ memset(&wrqu, 0, sizeof(union iwreq_data));
+ wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL);
#ifdef CONFIG_LIBERTAS_DEBUG
/* Dump the scan table */
mutex_lock(&adapter->lock);
- lbs_deb_scan("The scan table contains:\n");
- list_for_each_entry (iter_bss, &adapter->network_list, list) {
- lbs_deb_scan("scan %02d, %s, RSSI, %d, SSID '%s'\n",
- i++, print_mac(mac, iter_bss->bssid), (s32) iter_bss->rssi,
- escape_essid(iter_bss->ssid, iter_bss->ssid_len));
- }
+ lbs_deb_scan("scan table:\n");
+ list_for_each_entry(iter, &adapter->network_list, list)
+ lbs_deb_scan("%02d: BSSID %s, RSSI %d, SSID '%s'\n",
+ i++, print_mac(mac, iter->bssid), (s32) iter->rssi,
+ escape_essid(iter->ssid, iter->ssid_len));
mutex_unlock(&adapter->lock);
#endif
+out2:
+ adapter->last_scanned_channel = 0;
+
+out:
if (adapter->connect_status == LBS_CONNECTED) {
netif_carrier_on(priv->dev);
netif_wake_queue(priv->dev);
}
-
if (priv->mesh_dev && (adapter->mesh_connect_status == LBS_CONNECTED)) {
netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
}
-
-out:
- if (scan_cfg)
- kfree(scan_cfg);
-
- if (scan_chan_list)
- kfree(scan_chan_list);
+ kfree(chan_list);
lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
return ret;
}
+
+
+
+/*********************************************************************/
+/* */
+/* Result interpretation */
+/* */
+/*********************************************************************/
+
/**
* @brief Interpret a BSS scan response returned from the firmware
*
* Parse the various fixed fields and IEs passed back for a a BSS probe
- * response or beacon from the scan command. Record information as needed
- * in the scan table struct bss_descriptor for that entry.
+ * response or beacon from the scan command. Record information as needed
+ * in the scan table struct bss_descriptor for that entry.
*
* @param bss Output parameter: Pointer to the BSS Entry
*
@@ -898,7 +732,7 @@ static int lbs_process_bss(struct bss_descriptor *bss,
*bytesleft -= beaconsize;
memcpy(bss->bssid, pos, ETH_ALEN);
- lbs_deb_scan("process_bss: AP BSSID %s\n", print_mac(mac, bss->bssid));
+ lbs_deb_scan("process_bss: BSSID %s\n", print_mac(mac, bss->bssid));
pos += ETH_ALEN;
if ((end - pos) < 12) {
@@ -914,7 +748,7 @@ static int lbs_process_bss(struct bss_descriptor *bss,
/* RSSI is 1 byte long */
bss->rssi = *pos;
- lbs_deb_scan("process_bss: RSSI=%02X\n", *pos);
+ lbs_deb_scan("process_bss: RSSI %d\n", *pos);
pos++;
/* time stamp is 8 bytes long */
@@ -926,18 +760,18 @@ static int lbs_process_bss(struct bss_descriptor *bss,
/* capability information is 2 bytes long */
bss->capability = le16_to_cpup((void *) pos);
- lbs_deb_scan("process_bss: capabilities = 0x%4X\n", bss->capability);
+ lbs_deb_scan("process_bss: capabilities 0x%04x\n", bss->capability);
pos += 2;
if (bss->capability & WLAN_CAPABILITY_PRIVACY)
- lbs_deb_scan("process_bss: AP WEP enabled\n");
+ lbs_deb_scan("process_bss: WEP enabled\n");
if (bss->capability & WLAN_CAPABILITY_IBSS)
bss->mode = IW_MODE_ADHOC;
else
bss->mode = IW_MODE_INFRA;
/* rest of the current buffer are IE's */
- lbs_deb_scan("process_bss: IE length for this AP = %zd\n", end - pos);
+ lbs_deb_scan("process_bss: IE len %zd\n", end - pos);
lbs_deb_hex(LBS_DEB_SCAN, "process_bss: IE info", pos, end - pos);
/* process variable IE */
@@ -955,7 +789,7 @@ static int lbs_process_bss(struct bss_descriptor *bss,
case MFIE_TYPE_SSID:
bss->ssid_len = elem->len;
memcpy(bss->ssid, elem->data, elem->len);
- lbs_deb_scan("ssid '%s', ssid length %u\n",
+ lbs_deb_scan("got SSID IE: '%s', len %u\n",
escape_essid(bss->ssid, bss->ssid_len),
bss->ssid_len);
break;
@@ -964,16 +798,14 @@ static int lbs_process_bss(struct bss_descriptor *bss,
n_basic_rates = min_t(u8, MAX_RATES, elem->len);
memcpy(bss->rates, elem->data, n_basic_rates);
got_basic_rates = 1;
+ lbs_deb_scan("got RATES IE\n");
break;
case MFIE_TYPE_FH_SET:
pFH = (struct ieeetypes_fhparamset *) pos;
memmove(&bss->phyparamset.fhparamset, pFH,
sizeof(struct ieeetypes_fhparamset));
-#if 0 /* I think we can store these LE */
- bss->phyparamset.fhparamset.dwelltime
- = le16_to_cpu(bss->phyparamset.fhparamset.dwelltime);
-#endif
+ lbs_deb_scan("got FH IE\n");
break;
case MFIE_TYPE_DS_SET:
@@ -981,12 +813,14 @@ static int lbs_process_bss(struct bss_descriptor *bss,
bss->channel = pDS->currentchan;
memcpy(&bss->phyparamset.dsparamset, pDS,
sizeof(struct ieeetypes_dsparamset));
+ lbs_deb_scan("got DS IE, channel %d\n", bss->channel);
break;
case MFIE_TYPE_CF_SET:
pCF = (struct ieeetypes_cfparamset *) pos;
memcpy(&bss->ssparamset.cfparamset, pCF,
sizeof(struct ieeetypes_cfparamset));
+ lbs_deb_scan("got CF IE\n");
break;
case MFIE_TYPE_IBSS_SET:
@@ -994,18 +828,16 @@ static int lbs_process_bss(struct bss_descriptor *bss,
bss->atimwindow = le32_to_cpu(pibss->atimwindow);
memmove(&bss->ssparamset.ibssparamset, pibss,
sizeof(struct ieeetypes_ibssparamset));
-#if 0
- bss->ssparamset.ibssparamset.atimwindow
- = le16_to_cpu(bss->ssparamset.ibssparamset.atimwindow);
-#endif
+ lbs_deb_scan("got IBSS IE\n");
break;
case MFIE_TYPE_COUNTRY:
pcountryinfo = (struct ieeetypes_countryinfoset *) pos;
+ lbs_deb_scan("got COUNTRY IE\n");
if (pcountryinfo->len < sizeof(pcountryinfo->countrycode)
|| pcountryinfo->len > 254) {
lbs_deb_scan("process_bss: 11D- Err "
- "CountryInfo len =%d min=%zd max=254\n",
+ "CountryInfo len %d, min %zd, max 254\n",
pcountryinfo->len,
sizeof(pcountryinfo->countrycode));
ret = -1;
@@ -1024,8 +856,11 @@ static int lbs_process_bss(struct bss_descriptor *bss,
* already found. Data rate IE should come before
* extended supported rate IE
*/
- if (!got_basic_rates)
+ lbs_deb_scan("got RATESEX IE\n");
+ if (!got_basic_rates) {
+ lbs_deb_scan("... but ignoring it\n");
break;
+ }
n_ex_rates = elem->len;
if (n_basic_rates + n_ex_rates > MAX_RATES)
@@ -1044,24 +879,36 @@ static int lbs_process_bss(struct bss_descriptor *bss,
bss->wpa_ie_len = min(elem->len + 2,
MAX_WPA_IE_LEN);
memcpy(bss->wpa_ie, elem, bss->wpa_ie_len);
- lbs_deb_hex(LBS_DEB_SCAN, "process_bss: WPA IE", bss->wpa_ie,
+ lbs_deb_scan("got WPA IE\n");
+ lbs_deb_hex(LBS_DEB_SCAN, "WPA IE", bss->wpa_ie,
elem->len);
} else if (elem->len >= MARVELL_MESH_IE_LENGTH &&
elem->data[0] == 0x00 &&
elem->data[1] == 0x50 &&
elem->data[2] == 0x43 &&
elem->data[3] == 0x04) {
+ lbs_deb_scan("got mesh IE\n");
bss->mesh = 1;
+ } else {
+ lbs_deb_scan("got generiec IE: "
+ "%02x:%02x:%02x:%02x, len %d\n",
+ elem->data[0], elem->data[1],
+ elem->data[2], elem->data[3],
+ elem->len);
}
break;
case MFIE_TYPE_RSN:
+ lbs_deb_scan("got RSN IE\n");
bss->rsn_ie_len = min(elem->len + 2, MAX_WPA_IE_LEN);
memcpy(bss->rsn_ie, elem, bss->rsn_ie_len);
- lbs_deb_hex(LBS_DEB_SCAN, "process_bss: RSN_IE", bss->rsn_ie, elem->len);
+ lbs_deb_hex(LBS_DEB_SCAN, "process_bss: RSN_IE",
+ bss->rsn_ie, elem->len);
break;
default:
+ lbs_deb_scan("got IE 0x%04x, len %d\n",
+ elem->id, elem->len);
break;
}
@@ -1273,8 +1120,6 @@ int lbs_find_best_network_ssid(struct lbs_private *priv,
if (adapter->surpriseremoved)
goto out;
- wait_event_interruptible(adapter->cmd_pending, !adapter->nr_cmd_pending);
-
found = lbs_find_best_ssid_in_list(adapter, preferred_mode);
if (found && (found->ssid_len > 0)) {
memcpy(out_ssid, &found->ssid, IW_ESSID_MAX_SIZE);
@@ -1288,36 +1133,6 @@ out:
return ret;
}
-/**
- * @brief Scan Network
- *
- * @param dev A pointer to net_device structure
- * @param info A pointer to iw_request_info structure
- * @param vwrq A pointer to iw_param structure
- * @param extra A pointer to extra data buf
- *
- * @return 0 --success, otherwise fail
- */
-int lbs_set_scan(struct net_device *dev, struct iw_request_info *info,
- struct iw_param *vwrq, char *extra)
-{
- struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
-
- lbs_deb_enter(LBS_DEB_SCAN);
-
- if (!delayed_work_pending(&priv->scan_work)) {
- queue_delayed_work(priv->work_thread, &priv->scan_work,
- msecs_to_jiffies(50));
- }
-
- if (adapter->surpriseremoved)
- return -1;
-
- lbs_deb_leave(LBS_DEB_SCAN);
- return 0;
-}
-
/**
* @brief Send a scan command for all available channels filtered on a spec
@@ -1329,8 +1144,6 @@ int lbs_set_scan(struct net_device *dev, struct iw_request_info *info,
* @param ssid_len Length of the SSID
* @param clear_ssid Should existing scan results with this SSID
* be cleared?
- * @param prequestedssid A pointer to AP's ssid
- * @param keeppreviousscan Flag used to save/clear scan table before scan
*
* @return 0-success, otherwise fail
*/
@@ -1357,7 +1170,6 @@ int lbs_send_specific_ssid_scan(struct lbs_private *priv,
ret = -1;
goto out;
}
- wait_event_interruptible(adapter->cmd_pending, !adapter->nr_cmd_pending);
out:
lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
@@ -1373,6 +1185,7 @@ out:
/* */
/*********************************************************************/
+
#define MAX_CUSTOM_LEN 64
static inline char *lbs_translate_scan(struct lbs_private *priv,
@@ -1398,7 +1211,7 @@ static inline char *lbs_translate_scan(struct lbs_private *priv,
goto out;
}
- /* First entry *MUST* be the AP BSSID */
+ /* First entry *MUST* be the BSSID */
iwe.cmd = SIOCGIWAP;
iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
memcpy(iwe.u.ap_addr.sa_data, &bss->bssid, ETH_ALEN);
@@ -1528,6 +1341,55 @@ out:
return start;
}
+
+/**
+ * @brief Handle Scan Network ioctl
+ *
+ * @param dev A pointer to net_device structure
+ * @param info A pointer to iw_request_info structure
+ * @param vwrq A pointer to iw_param structure
+ * @param extra A pointer to extra data buf
+ *
+ * @return 0 --success, otherwise fail
+ */
+int lbs_set_scan(struct net_device *dev, struct iw_request_info *info,
+ struct iw_param *wrqu, char *extra)
+{
+ struct lbs_private *priv = dev->priv;
+ struct lbs_adapter *adapter = priv->adapter;
+
+ lbs_deb_enter(LBS_DEB_SCAN);
+
+ if (!netif_running(dev))
+ return -ENETDOWN;
+
+ /* mac80211 does this:
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+ if (sdata->type != IEEE80211_IF_TYPE_xxx)
+ return -EOPNOTSUPP;
+
+ if (wrqu->data.length == sizeof(struct iw_scan_req) &&
+ wrqu->data.flags & IW_SCAN_THIS_ESSID) {
+ req = (struct iw_scan_req *)extra;
+ ssid = req->essid;
+ ssid_len = req->essid_len;
+ }
+ */
+
+ if (!delayed_work_pending(&priv->scan_work))
+ queue_delayed_work(priv->work_thread, &priv->scan_work,
+ msecs_to_jiffies(50));
+ /* set marker that currently a scan is taking place */
+ adapter->last_scanned_channel = -1;
+
+ if (adapter->surpriseremoved)
+ return -EIO;
+
+ lbs_deb_leave(LBS_DEB_SCAN);
+ return 0;
+}
+
+
/**
* @brief Handle Retrieve scan table ioctl
*
@@ -1552,6 +1414,10 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
lbs_deb_enter(LBS_DEB_SCAN);
+ /* iwlist should wait until the current scan is finished */
+ if (adapter->last_scanned_channel)
+ return -EAGAIN;
+
/* Update RSSI if current BSS is a locally created ad-hoc BSS */
if ((adapter->mode == IW_MODE_ADHOC) && adapter->adhoccreate) {
lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
@@ -1609,7 +1475,8 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
/**
* @brief Prepare a scan command to be sent to the firmware
*
- * Called from lbs_prepare_and_send_command() in cmd.c
+ * Called via lbs_prepare_and_send_command(priv, CMD_802_11_SCAN, ...)
+ * from cmd.c
*
* Sends a fixed lenght data part (specifying the BSS type and BSSID filters)
* as well as a variable number/length of TLVs to the firmware.
@@ -1623,7 +1490,7 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
* @return 0 or -1
*/
int lbs_cmd_80211_scan(struct lbs_private *priv,
- struct cmd_ds_command *cmd, void *pdata_buf)
+ struct cmd_ds_command *cmd, void *pdata_buf)
{
struct cmd_ds_802_11_scan *pscan = &cmd->params.scan;
struct lbs_scan_cmd_config *pscancfg = pdata_buf;
@@ -1635,32 +1502,14 @@ int lbs_cmd_80211_scan(struct lbs_private *priv,
memcpy(pscan->bssid, pscancfg->bssid, ETH_ALEN);
memcpy(pscan->tlvbuffer, pscancfg->tlvbuffer, pscancfg->tlvbufferlen);
- cmd->command = cpu_to_le16(CMD_802_11_SCAN);
-
/* size is equal to the sizeof(fixed portions) + the TLV len + header */
cmd->size = cpu_to_le16(sizeof(pscan->bsstype) + ETH_ALEN
+ pscancfg->tlvbufferlen + S_DS_GEN);
- lbs_deb_scan("SCAN_CMD: command 0x%04x, size %d, seqnum %d\n",
- le16_to_cpu(cmd->command), le16_to_cpu(cmd->size),
- le16_to_cpu(cmd->seqnum));
-
lbs_deb_leave(LBS_DEB_SCAN);
return 0;
}
-static inline int is_same_network(struct bss_descriptor *src,
- struct bss_descriptor *dst)
-{
- /* A network is only a duplicate if the channel, BSSID, and ESSID
- * all match. We treat all <hidden> with the same BSSID and channel
- * as one network */
- return ((src->ssid_len == dst->ssid_len) &&
- (src->channel == dst->channel) &&
- !compare_ether_addr(src->bssid, dst->bssid) &&
- !memcmp(src->ssid, dst->ssid, src->ssid_len));
-}
-
/**
* @brief This function handles the command response of scan
*
@@ -1725,7 +1574,7 @@ int lbs_ret_80211_scan(struct lbs_private *priv, struct cmd_ds_command *resp)
lbs_deb_scan("SCAN_RESP: bssdescriptsize %d\n", bytesleft);
scanrespsize = le16_to_cpu(get_unaligned((u16*)&resp->size));
- lbs_deb_scan("SCAN_RESP: returned %d AP before parsing\n",
+ lbs_deb_scan("SCAN_RESP: scan results %d\n",
pscan->nr_sets);
pbssinfo = pscan->bssdesc_and_tlvbuffer;
@@ -1788,7 +1637,7 @@ int lbs_ret_80211_scan(struct lbs_private *priv, struct cmd_ds_command *resp)
continue;
}
- lbs_deb_scan("SCAN_RESP: BSSID = %s\n",
+ lbs_deb_scan("SCAN_RESP: BSSID %s\n",
print_mac(mac, new.bssid));
/* Copy the locally created newbssentry to the scan table */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 19/48] libertas: when usb_submit_usb fails, include the error code in the printk
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (17 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 18/48] libertas: implement new scanning logic David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 20/48] libertas: Switch to using a callback function pointer for commands David Woodhouse
` (114 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Fri, 7 Dec 2007 15:12:26 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index d5fc7d7..e9190a6 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -424,7 +424,7 @@ static int usb_tx_block(struct usb_card_rec *cardp, u8 * payload, u16 nb)
if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
/* transfer failed */
- lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed\n");
+ lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
ret = -1;
} else {
/* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
@@ -462,7 +462,7 @@ static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
/* lbs_deb_usbd(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb); */
if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
/* handle failure conditions */
- lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed\n");
+ lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
kfree_skb(skb);
rinfo->skb = NULL;
ret = -1;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 20/48] libertas: Switch to using a callback function pointer for commands
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (18 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 19/48] libertas: when usb_submit_usb fails, include the error code in the printk David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 21/48] libertas: endianness fixes David Woodhouse
` (113 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Fri, 7 Dec 2007 15:13:05 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 31 +++++++++++++++++++++++++------
drivers/net/wireless/libertas/cmdresp.c | 23 ++++++++---------------
drivers/net/wireless/libertas/hostcmd.h | 1 +
3 files changed, 34 insertions(+), 21 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index b1ea878..ebfcb7b 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1659,7 +1659,8 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
wake_up_interruptible(&ptempnode->cmdwait_q);
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
- ptempnode->pdata_size = 0;
+ ptempnode->pdata_size = NULL;
+ ptempnode->callback = NULL;
if (ptempnode->bufvirtualaddr != NULL)
memset(ptempnode->bufvirtualaddr, 0, MRVDRV_SIZE_OF_CMD_BUFFER);
@@ -1687,7 +1688,8 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
- ptempnode->pdata_size = 0;
+ ptempnode->pdata_size = NULL;
+ ptempnode->callback = NULL;
lbs_deb_leave(LBS_DEB_HOST);
}
@@ -2012,10 +2014,26 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
* @return -1 in case of a higher level error, otherwise
* the result code from the firmware
*/
-int lbs_cmd(struct lbs_private *priv,
- u16 command,
- void *cmd, int cmd_size,
- void *rsp, int *rsp_size)
+
+static int lbs_cmd_callback(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv)
+{
+ struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
+ struct lbs_adapter *adapter = priv->adapter;
+ u16 sz = cpu_to_le16(resp->size) - S_DS_GEN;
+
+ if (sz > *adapter->cur_cmd->pdata_size) {
+ lbs_pr_err("response 0x%04x doesn't fit into buffer (%d > %d)\n",
+ respcmd, sz, *adapter->cur_cmd->pdata_size);
+ sz = *adapter->cur_cmd->pdata_size;
+ }
+ memcpy(adapter->cur_cmd->pdata_buf, r->cmdresp, sz);
+ *adapter->cur_cmd->pdata_size = sz;
+
+ return 0;
+}
+
+int lbs_cmd(struct lbs_private *priv, u16 command, void *cmd, int cmd_size,
+ void *rsp, int *rsp_size)
{
struct lbs_adapter *adapter = priv->adapter;
struct cmd_ctrl_node *cmdnode;
@@ -2053,6 +2071,7 @@ int lbs_cmd(struct lbs_private *priv,
cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
cmdnode->pdata_buf = rsp;
cmdnode->pdata_size = rsp_size;
+ cmdnode->callback = lbs_cmd_callback;
/* Set sequence number, clean result, move to buffer */
adapter->seqnum++;
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 22a6973..20ca38c 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -880,22 +880,15 @@ int lbs_process_rx_command(struct lbs_private *priv)
goto done;
}
- if (adapter->cur_cmd->pdata_size) {
- struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
- u16 sz = cpu_to_le16(resp->size) - S_DS_GEN;
- if (sz > *adapter->cur_cmd->pdata_size) {
- lbs_pr_err("response 0x%04x doesn't fit into "
- "buffer (%d > %d)\n", respcmd,
- sz, *adapter->cur_cmd->pdata_size);
- sz = *adapter->cur_cmd->pdata_size;
- }
- memcpy(adapter->cur_cmd->pdata_buf, r->cmdresp, sz);
- *adapter->cur_cmd->pdata_size = sz;
- } else {
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&adapter->driver_lock, flags);
+
+ if (adapter->cur_cmd && adapter->cur_cmd->callback)
+ ret = adapter->cur_cmd->callback(respcmd, resp, priv);
+ else
ret = handle_cmd_response(respcmd, resp, priv);
- spin_lock_irqsave(&adapter->driver_lock, flags);
- }
+
+ spin_lock_irqsave(&adapter->driver_lock, flags);
+
if (adapter->cur_cmd) {
/* Clean up and Put current command back to cmdfreeq */
__lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index be69ae6..5ef65ae 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -72,6 +72,7 @@ struct cmd_ctrl_node {
/* command response */
void *pdata_buf;
int *pdata_size;
+ int (*callback)(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv);
/* command data */
u8 *bufvirtualaddr;
/* wait queue */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 21/48] libertas: endianness fixes
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (19 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 20/48] libertas: Switch to using a callback function pointer for commands David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 22/48] libertas: Don't set IW_ENCODE_NOKEY when returning WEP keys David Woodhouse
` (112 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <hs4233@mail.mn-solutions.de>
Date: Fri, 7 Dec 2007 15:30:44 +0000
Recently I found that that sparse by default doesn't endianness
checks. So I changed my compilation habit to be
make modules C=1 SUBDIRS=drivers/net/wireless/libertas
CHECKFLAGS="-D__CHECK_ENDIAN__"
so that I get the little-endian checks from sparse as well. That
showed up a good bunch of problems.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/11d.c | 2 +-
drivers/net/wireless/libertas/cmd.c | 28 ++++++++++++++--------------
drivers/net/wireless/libertas/cmdresp.c | 2 +-
drivers/net/wireless/libertas/hostcmd.h | 8 ++++----
drivers/net/wireless/libertas/if_sdio.c | 2 +-
drivers/net/wireless/libertas/if_usb.c | 4 ++--
6 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/drivers/net/wireless/libertas/11d.c b/drivers/net/wireless/libertas/11d.c
index 377dcb5..013965d 100644
--- a/drivers/net/wireless/libertas/11d.c
+++ b/drivers/net/wireless/libertas/11d.c
@@ -518,7 +518,7 @@ int lbs_cmd_802_11d_domain_info(struct lbs_private *priv,
cmd->size =
cpu_to_le16(sizeof(pdomaininfo->action) + S_DS_GEN);
lbs_deb_hex(LBS_DEB_11D, "802_11D_DOMAIN_INFO", (u8 *) cmd,
- (int)(cmd->size));
+ le16_to_cpu(cmd->size));
goto done;
}
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index ebfcb7b..cf1ab8a 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -431,7 +431,7 @@ static int lbs_cmd_802_11_snmp_mib(struct lbs_private *priv,
u8 mode = (u8) (size_t) pdata_buf;
pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET);
pSNMPMIB->oid = cpu_to_le16((u16) DESIRED_BSSTYPE_I);
- pSNMPMIB->bufsize = sizeof(u8);
+ pSNMPMIB->bufsize = cpu_to_le16(sizeof(u8));
if (mode == IW_MODE_ADHOC) {
ucTemp = SNMP_MIB_VALUE_ADHOC;
} else {
@@ -451,8 +451,8 @@ static int lbs_cmd_802_11_snmp_mib(struct lbs_private *priv,
pSNMPMIB->oid = cpu_to_le16((u16) DOT11D_I);
if (cmd_action == CMD_ACT_SET) {
- pSNMPMIB->querytype = CMD_ACT_SET;
- pSNMPMIB->bufsize = sizeof(u16);
+ pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET);
+ pSNMPMIB->bufsize = cpu_to_le16(sizeof(u16));
ulTemp = *(u32 *)pdata_buf;
*((__le16 *)(pSNMPMIB->value)) =
cpu_to_le16((u16) ulTemp);
@@ -484,7 +484,7 @@ static int lbs_cmd_802_11_snmp_mib(struct lbs_private *priv,
{
u32 ulTemp;
- pSNMPMIB->oid = le16_to_cpu((u16) RTSTHRESH_I);
+ pSNMPMIB->oid = cpu_to_le16(RTSTHRESH_I);
if (cmd_action == CMD_ACT_GET) {
pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_GET);
@@ -759,7 +759,7 @@ static int lbs_cmd_reg_access(struct lbs_private *priv,
offval = (struct lbs_offset_value *)pdata_buf;
- switch (cmdptr->command) {
+ switch (le16_to_cpu(cmdptr->command)) {
case CMD_MAC_REG_ACCESS:
{
struct cmd_ds_mac_reg_access *macreg;
@@ -999,7 +999,7 @@ void lbs_queue_cmd(struct lbs_adapter *adapter,
}
/* Exit_PS command needs to be queued in the header always. */
- if (cmdptr->command == CMD_802_11_PS_MODE) {
+ if (le16_to_cpu(cmdptr->command) == CMD_802_11_PS_MODE) {
struct cmd_ds_802_11_ps_mode *psm = &cmdptr->params.psmode;
if (psm->action == cpu_to_le16(CMD_SUBCMD_EXIT_PS)) {
if (adapter->psstate != PS_STATE_FULL_POWER)
@@ -1062,15 +1062,14 @@ static int DownloadcommandToStation(struct lbs_private *priv,
adapter->cur_cmd_retcode = 0;
spin_unlock_irqrestore(&adapter->driver_lock, flags);
- cmdsize = cmdptr->size;
- command = cpu_to_le16(cmdptr->command);
+ cmdsize = le16_to_cpu(cmdptr->size);
+ command = le16_to_cpu(cmdptr->command);
lbs_deb_host("DNLD_CMD: command 0x%04x, size %d, jiffies %lu\n",
- command, le16_to_cpu(cmdptr->size), jiffies);
+ command, cmdsize, jiffies);
lbs_deb_hex(LBS_DEB_HOST, "DNLD_CMD", cmdnode->bufvirtualaddr, cmdsize);
cmdnode->cmdwaitqwoken = 0;
- cmdsize = cpu_to_le16(cmdsize);
ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmdptr, cmdsize);
@@ -1426,9 +1425,10 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
#define ACTION_NUMLED_TLVTYPE_LEN_FIELDS_LEN 8
cmdptr->size =
- cpu_to_le16(gpio->header.len + S_DS_GEN +
- ACTION_NUMLED_TLVTYPE_LEN_FIELDS_LEN);
- gpio->header.len = cpu_to_le16(gpio->header.len);
+ cpu_to_le16(le16_to_cpu(gpio->header.len)
+ + S_DS_GEN
+ + ACTION_NUMLED_TLVTYPE_LEN_FIELDS_LEN);
+ gpio->header.len = gpio->header.len;
ret = 0;
break;
@@ -2019,7 +2019,7 @@ static int lbs_cmd_callback(uint16_t respcmd, struct cmd_ds_command *resp, struc
{
struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
struct lbs_adapter *adapter = priv->adapter;
- u16 sz = cpu_to_le16(resp->size) - S_DS_GEN;
+ u16 sz = le16_to_cpu(resp->size) - S_DS_GEN;
if (sz > *adapter->cur_cmd->pdata_size) {
lbs_pr_err("response 0x%04x doesn't fit into buffer (%d > %d)\n",
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 20ca38c..f6c1016 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -561,7 +561,7 @@ static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_CMD);
if (dst_event->action == cpu_to_le16(CMD_ACT_GET)) {
- dst_event->events = le16_to_cpu(cmd_event->events);
+ dst_event->events = cmd_event->events;
memcpy(dst_event->tlv, cmd_event->tlv, sizeof(dst_event->tlv));
}
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 5ef65ae..efdb720 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -419,13 +419,13 @@ struct cmd_ds_802_11_rf_antenna {
};
struct cmd_ds_802_11_monitor_mode {
- u16 action;
- u16 mode;
+ __le16 action;
+ __le16 mode;
};
struct cmd_ds_set_boot2_ver {
- u16 action;
- u16 version;
+ __le16 action;
+ __le16 version;
};
struct cmd_ds_802_11_ps_mode {
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 0f0296b..6f5a517 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -454,7 +454,7 @@ static int if_sdio_prog_helper(struct if_sdio_card *card)
chunk_size = min(size, (size_t)60);
- *((u32*)chunk_buffer) = cpu_to_le32(chunk_size);
+ *((__le32*)chunk_buffer) = cpu_to_le32(chunk_size);
memcpy(chunk_buffer + 4, firmware, chunk_size);
/*
lbs_deb_sdio("sending %d bytes chunk\n", chunk_size);
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index e9190a6..a17371f 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -107,7 +107,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
int rsp_len = sizeof(b2_cmd);
b2_cmd.action = 0;
- b2_cmd.version = cpu_to_le16(priv->boot2_version);
+ b2_cmd.version = priv->boot2_version;
if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd),
&b2_cmd, &rsp_len)) {
@@ -227,7 +227,7 @@ static int if_usb_probe(struct usb_interface *intf,
priv->hw_host_to_card = if_usb_host_to_card;
priv->hw_get_int_status = if_usb_get_int_status;
priv->hw_read_event_cause = if_usb_read_event_cause;
- priv->boot2_version = le16_to_cpu(udev->descriptor.bcdDevice);
+ priv->boot2_version = udev->descriptor.bcdDevice;
/* Delay 200 ms to waiting for the FW ready */
if_usb_submit_rx_urb(cardp);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 22/48] libertas: Don't set IW_ENCODE_NOKEY when returning WEP keys.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (20 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 21/48] libertas: endianness fixes David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 23/48] libertas: Fix up error handling in lbs_setuserscan() David Woodhouse
` (111 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Fri, 7 Dec 2007 19:32:12 +0000
Also clean up the double setting/clearing of IW_ENCODE_DISABLED.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/wext.c | 11 +----------
1 files changed, 1 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index b8c93c0..1af140b 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -1122,14 +1122,6 @@ static int lbs_get_encode(struct net_device *dev,
break;
}
- if ( adapter->secinfo.wep_enabled
- || adapter->secinfo.WPAenabled
- || adapter->secinfo.WPA2enabled) {
- dwrq->flags &= ~IW_ENCODE_DISABLED;
- } else {
- dwrq->flags |= IW_ENCODE_DISABLED;
- }
-
memset(extra, 0, 16);
mutex_lock(&adapter->lock);
@@ -1150,14 +1142,13 @@ static int lbs_get_encode(struct net_device *dev,
|| (adapter->secinfo.WPA2enabled)) {
/* return WPA enabled */
dwrq->flags &= ~IW_ENCODE_DISABLED;
+ dwrq->flags |= IW_ENCODE_NOKEY;
} else {
dwrq->flags |= IW_ENCODE_DISABLED;
}
mutex_unlock(&adapter->lock);
- dwrq->flags |= IW_ENCODE_NOKEY;
-
lbs_deb_wext("key: %02x:%02x:%02x:%02x:%02x:%02x, keylen %d\n",
extra[0], extra[1], extra[2],
extra[3], extra[4], extra[5], dwrq->length);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 23/48] libertas: Fix up error handling in lbs_setuserscan()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (21 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 22/48] libertas: Don't set IW_ENCODE_NOKEY when returning WEP keys David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:45 ` [PATCH 24/48] libertas: kill adapter->nr_cmd_pending David Woodhouse
` (110 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 00:23:55 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/debugfs.c | 29 +++++++++++++++++++----------
1 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index 1d881ae..dde0c37 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -292,18 +292,23 @@ static ssize_t lbs_setuserscan(struct file *file,
struct lbs_ioctl_user_scan_cfg *scan_cfg;
union iwreq_data wrqu;
int dur;
- unsigned long addr = get_zeroed_page(GFP_KERNEL);
- char *buf = (char *)addr;
+ char *buf = (char *)get_zeroed_page(GFP_KERNEL);
- scan_cfg = kzalloc(sizeof(struct lbs_ioctl_user_scan_cfg), GFP_KERNEL);
- if (!scan_cfg)
+ if (!buf)
return -ENOMEM;
-
+
buf_size = min(count, len - 1);
if (copy_from_user(buf, userbuf, buf_size)) {
res = -EFAULT;
- goto out_unlock;
+ goto out_buf;
+ }
+
+ scan_cfg = kzalloc(sizeof(struct lbs_ioctl_user_scan_cfg), GFP_KERNEL);
+ if (!scan_cfg) {
+ res = -ENOMEM;
+ goto out_buf;
}
+ res = count;
scan_cfg->bsstype = LBS_SCAN_BSS_TYPE_ANY;
@@ -316,15 +321,19 @@ static ssize_t lbs_setuserscan(struct file *file,
lbs_scan_networks(priv, scan_cfg, 1);
wait_event_interruptible(priv->adapter->cmd_pending,
- !priv->adapter->nr_cmd_pending);
+ priv->adapter->surpriseremoved || !priv->adapter->nr_cmd_pending);
+
+ if (priv->adapter->surpriseremoved)
+ goto out_scan_cfg;
memset(&wrqu, 0x00, sizeof(union iwreq_data));
wireless_send_event(priv->dev, SIOCGIWSCAN, &wrqu, NULL);
-out_unlock:
- free_page(addr);
+ out_scan_cfg:
kfree(scan_cfg);
- return count;
+ out_buf:
+ free_page((unsigned long)buf);
+ return res;
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 24/48] libertas: kill adapter->nr_cmd_pending
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (22 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 23/48] libertas: Fix up error handling in lbs_setuserscan() David Woodhouse
@ 2007-12-10 15:45 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 25/48] libertas: switch lbs_cmd() to take a callback function pointer David Woodhouse
` (109 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:45 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 00:35:00 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 6 ++----
drivers/net/wireless/libertas/cmdresp.c | 5 -----
drivers/net/wireless/libertas/debugfs.c | 3 ++-
drivers/net/wireless/libertas/dev.h | 1 -
drivers/net/wireless/libertas/main.c | 4 +---
5 files changed, 5 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index cf1ab8a..092c295 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1009,10 +1009,9 @@ void lbs_queue_cmd(struct lbs_adapter *adapter,
spin_lock_irqsave(&adapter->driver_lock, flags);
- if (addtail) {
+ if (addtail)
list_add_tail(&cmdnode->list, &adapter->cmdpendingq);
- adapter->nr_cmd_pending++;
- } else
+ else
list_add(&cmdnode->list, &adapter->cmdpendingq);
spin_unlock_irqrestore(&adapter->driver_lock, flags);
@@ -1078,7 +1077,6 @@ static int DownloadcommandToStation(struct lbs_private *priv,
spin_lock_irqsave(&adapter->driver_lock, flags);
adapter->cur_cmd_retcode = ret;
__lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->nr_cmd_pending--;
adapter->cur_cmd = NULL;
spin_unlock_irqrestore(&adapter->driver_lock, flags);
goto done;
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index f6c1016..44865bf 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -791,7 +791,6 @@ int lbs_process_rx_command(struct lbs_private *priv)
lbs_deb_host("invalid response!\n");
adapter->cur_cmd_retcode = -1;
__lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->nr_cmd_pending--;
adapter->cur_cmd = NULL;
spin_unlock_irqrestore(&adapter->driver_lock, flags);
ret = -1;
@@ -848,7 +847,6 @@ int lbs_process_rx_command(struct lbs_private *priv)
}
__lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->nr_cmd_pending--;
adapter->cur_cmd = NULL;
spin_unlock_irqrestore(&adapter->driver_lock, flags);
@@ -872,7 +870,6 @@ int lbs_process_rx_command(struct lbs_private *priv)
}
__lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->nr_cmd_pending--;
adapter->cur_cmd = NULL;
spin_unlock_irqrestore(&adapter->driver_lock, flags);
@@ -892,8 +889,6 @@ int lbs_process_rx_command(struct lbs_private *priv)
if (adapter->cur_cmd) {
/* Clean up and Put current command back to cmdfreeq */
__lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->nr_cmd_pending--;
- WARN_ON(adapter->nr_cmd_pending > 128);
adapter->cur_cmd = NULL;
}
spin_unlock_irqrestore(&adapter->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index dde0c37..341ef67 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -321,7 +321,8 @@ static ssize_t lbs_setuserscan(struct file *file,
lbs_scan_networks(priv, scan_cfg, 1);
wait_event_interruptible(priv->adapter->cmd_pending,
- priv->adapter->surpriseremoved || !priv->adapter->nr_cmd_pending);
+ priv->adapter->surpriseremoved ||
+ (!priv->adapter->cur_cmd && list_empty(&priv->adapter->cmdpendingq)));
if (priv->adapter->surpriseremoved)
goto out_scan_cfg;
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 96a34c5..fb26f18 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -231,7 +231,6 @@ struct lbs_adapter {
struct list_head cmdpendingq;
wait_queue_head_t cmd_pending;
- u8 nr_cmd_pending;
/* command related variables protected by adapter->driver_lock */
/** Async and Sync Event variables */
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index a5b573c..500357b 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -929,14 +929,13 @@ static int lbs_thread(void *data)
/* Wake-up command waiters which can't sleep in
* lbs_prepare_and_send_command
*/
- if (!adapter->nr_cmd_pending)
+ if (!list_empty(&adapter->cmdpendingq))
wake_up_all(&adapter->cmd_pending);
lbs_tx_runqueue(priv);
}
del_timer(&adapter->command_timer);
- adapter->nr_cmd_pending = 0;
wake_up_all(&adapter->cmd_pending);
lbs_deb_leave(LBS_DEB_THREAD);
@@ -1105,7 +1104,6 @@ static int lbs_init_adapter(struct lbs_private *priv)
spin_lock_init(&adapter->driver_lock);
init_waitqueue_head(&adapter->cmd_pending);
- adapter->nr_cmd_pending = 0;
/* Allocate the command buffers */
if (lbs_allocate_cmd_buffer(priv)) {
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 25/48] libertas: switch lbs_cmd() to take a callback function pointer
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (23 preceding siblings ...)
2007-12-10 15:45 ` [PATCH 24/48] libertas: kill adapter->nr_cmd_pending David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 26/48] libertas: clean up lbs_thread() to make it slightly more readable David Woodhouse
` (108 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 00:59:54 +0000
All existing code which sends commands is set up to have some function
called with the results, not to get data back. It's more versatile this
way, and providing it with a callback function which involves memcpy()
is hardly difficult.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 30 ++++--------------------------
drivers/net/wireless/libertas/decl.h | 6 ++----
drivers/net/wireless/libertas/hostcmd.h | 1 -
drivers/net/wireless/libertas/if_usb.c | 5 +----
4 files changed, 7 insertions(+), 35 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 092c295..6838c9c 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1657,7 +1657,6 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
wake_up_interruptible(&ptempnode->cmdwait_q);
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
- ptempnode->pdata_size = NULL;
ptempnode->callback = NULL;
if (ptempnode->bufvirtualaddr != NULL)
@@ -1686,7 +1685,6 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
- ptempnode->pdata_size = NULL;
ptempnode->callback = NULL;
lbs_deb_leave(LBS_DEB_HOST);
@@ -2013,25 +2011,8 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
* the result code from the firmware
*/
-static int lbs_cmd_callback(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv)
-{
- struct cmd_ds_gen *r = (struct cmd_ds_gen *)resp;
- struct lbs_adapter *adapter = priv->adapter;
- u16 sz = le16_to_cpu(resp->size) - S_DS_GEN;
-
- if (sz > *adapter->cur_cmd->pdata_size) {
- lbs_pr_err("response 0x%04x doesn't fit into buffer (%d > %d)\n",
- respcmd, sz, *adapter->cur_cmd->pdata_size);
- sz = *adapter->cur_cmd->pdata_size;
- }
- memcpy(adapter->cur_cmd->pdata_buf, r->cmdresp, sz);
- *adapter->cur_cmd->pdata_size = sz;
-
- return 0;
-}
-
-int lbs_cmd(struct lbs_private *priv, u16 command, void *cmd, int cmd_size,
- void *rsp, int *rsp_size)
+int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
+ int (*callback)(uint16_t, struct cmd_ds_command *, struct lbs_private *))
{
struct lbs_adapter *adapter = priv->adapter;
struct cmd_ctrl_node *cmdnode;
@@ -2040,9 +2021,8 @@ int lbs_cmd(struct lbs_private *priv, u16 command, void *cmd, int cmd_size,
int ret = 0;
lbs_deb_enter(LBS_DEB_HOST);
- lbs_deb_host("rsp at %p, rsp_size at %p\n", rsp, rsp_size);
- if (!adapter || !rsp_size) {
+ if (!adapter) {
lbs_deb_host("PREP_CMD: adapter is NULL\n");
ret = -1;
goto done;
@@ -2067,9 +2047,7 @@ int lbs_cmd(struct lbs_private *priv, u16 command, void *cmd, int cmd_size,
cmdptr = (struct cmd_ds_gen *)cmdnode->bufvirtualaddr;
cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
- cmdnode->pdata_buf = rsp;
- cmdnode->pdata_size = rsp_size;
- cmdnode->callback = lbs_cmd_callback;
+ cmdnode->callback = callback;
/* Set sequence number, clean result, move to buffer */
adapter->seqnum++;
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 6f47ff0..1a8fdaa 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -24,10 +24,8 @@ void lbs_send_tx_feedback(struct lbs_private *priv);
int lbs_free_cmd_buffer(struct lbs_private *priv);
-int lbs_cmd(struct lbs_private *priv,
- u16 command,
- void *cmd, int cmd_size,
- void *resp, int *resp_size);
+int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
+ int (*callback)(uint16_t, struct cmd_ds_command *, struct lbs_private *));
int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index efdb720..f1c1d3f 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -71,7 +71,6 @@ struct cmd_ctrl_node {
u16 wait_option;
/* command response */
void *pdata_buf;
- int *pdata_size;
int (*callback)(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv);
/* command data */
u8 *bufvirtualaddr;
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index a17371f..7c4bd8d 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -104,15 +104,12 @@ static void if_usb_free(struct usb_card_rec *cardp)
static void if_usb_set_boot2_ver(struct lbs_private *priv)
{
struct cmd_ds_set_boot2_ver b2_cmd;
- int rsp_len = sizeof(b2_cmd);
b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;
- if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd),
- &b2_cmd, &rsp_len)) {
+ if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd), NULL))
lbs_deb_usb("Setting boot2 version failed\n");
- }
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 26/48] libertas: clean up lbs_thread() to make it slightly more readable
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (24 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 25/48] libertas: switch lbs_cmd() to take a callback function pointer David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 27/48] libertas: fix lbs_rtap attribute in sysfs David Woodhouse
` (107 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 17:42:59 +0000
No semantic changes.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 92 +++++++++++++--------------------
1 files changed, 36 insertions(+), 56 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 500357b..f595664 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -795,70 +795,60 @@ static int lbs_thread(void *data)
init_waitqueue_entry(&wait, current);
set_freezable();
+
for (;;) {
- lbs_deb_thread( "main-thread 111: intcounter=%d "
- "currenttxskb=%p dnld_sent=%d\n",
- adapter->intcounter,
- adapter->currenttxskb, priv->dnld_sent);
+ lbs_deb_thread( "main-thread 111: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
add_wait_queue(&priv->waitq, &wait);
set_current_state(TASK_INTERRUPTIBLE);
spin_lock_irq(&adapter->driver_lock);
+
if ((adapter->psstate == PS_STATE_SLEEP) ||
- (!adapter->intcounter
- && (priv->dnld_sent || adapter->cur_cmd ||
- list_empty(&adapter->cmdpendingq)))) {
- lbs_deb_thread(
- "main-thread sleeping... Conn=%d IntC=%d PS_mode=%d PS_State=%d\n",
- adapter->connect_status, adapter->intcounter,
- adapter->psmode, adapter->psstate);
+ (!adapter->intcounter && (priv->dnld_sent || adapter->cur_cmd || list_empty(&adapter->cmdpendingq)))) {
+ lbs_deb_thread("main-thread sleeping... Conn=%d IntC=%d PS_mode=%d PS_State=%d\n",
+ adapter->connect_status, adapter->intcounter,
+ adapter->psmode, adapter->psstate);
spin_unlock_irq(&adapter->driver_lock);
schedule();
} else
spin_unlock_irq(&adapter->driver_lock);
- lbs_deb_thread(
- "main-thread 222 (waking up): intcounter=%d currenttxskb=%p "
- "dnld_sent=%d\n", adapter->intcounter,
- adapter->currenttxskb, priv->dnld_sent);
+ lbs_deb_thread("main-thread 222 (waking up): intcounter=%d currenttxskb=%p dnld_sent=%d\n",
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
set_current_state(TASK_RUNNING);
remove_wait_queue(&priv->waitq, &wait);
try_to_freeze();
- lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p "
- "dnld_sent=%d\n",
- adapter->intcounter,
- adapter->currenttxskb, priv->dnld_sent);
+ lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
- if (kthread_should_stop()
- || adapter->surpriseremoved) {
- lbs_deb_thread(
- "main-thread: break from main thread: surpriseremoved=0x%x\n",
- adapter->surpriseremoved);
+ if (kthread_should_stop() || adapter->surpriseremoved) {
+ lbs_deb_thread("main-thread: break from main thread: surpriseremoved=0x%x\n",
+ adapter->surpriseremoved);
break;
}
spin_lock_irq(&adapter->driver_lock);
+
if (adapter->intcounter) {
u8 int_status;
+
adapter->intcounter = 0;
int_status = priv->hw_get_int_status(priv, &ireg);
if (int_status) {
- lbs_deb_thread(
- "main-thread: reading HOST_INT_STATUS_REG failed\n");
+ lbs_deb_thread("main-thread: reading HOST_INT_STATUS_REG failed\n");
spin_unlock_irq(&adapter->driver_lock);
continue;
}
adapter->hisregcpy |= ireg;
}
- lbs_deb_thread("main-thread 444: intcounter=%d currenttxskb=%p "
- "dnld_sent=%d\n",
- adapter->intcounter,
- adapter->currenttxskb, priv->dnld_sent);
+ lbs_deb_thread("main-thread 444: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
/* command response? */
if (adapter->hisregcpy & MRVDRV_CMD_UPLD_RDY) {
@@ -877,8 +867,7 @@ static int lbs_thread(void *data)
adapter->hisregcpy &= ~MRVDRV_CARDEVENT;
if (priv->hw_read_event_cause(priv)) {
- lbs_pr_alert(
- "main-thread: hw_read_event_cause failed\n");
+ lbs_pr_alert("main-thread: hw_read_event_cause failed\n");
spin_unlock_irq(&adapter->driver_lock);
continue;
}
@@ -888,30 +877,21 @@ static int lbs_thread(void *data)
spin_unlock_irq(&adapter->driver_lock);
/* Check if we need to confirm Sleep Request received previously */
- if (adapter->psstate == PS_STATE_PRE_SLEEP) {
- if (!priv->dnld_sent && !adapter->cur_cmd) {
- if (adapter->connect_status ==
- LBS_CONNECTED) {
- lbs_deb_thread(
- "main_thread: PRE_SLEEP--intcounter=%d currenttxskb=%p "
- "dnld_sent=%d cur_cmd=%p, confirm now\n",
- adapter->intcounter,
- adapter->currenttxskb,
- priv->dnld_sent,
- adapter->cur_cmd);
-
- lbs_ps_confirm_sleep(priv,
- (u16) adapter->psmode);
- } else {
- /* workaround for firmware sending
- * deauth/linkloss event immediately
- * after sleep request, remove this
- * after firmware fixes it
- */
- adapter->psstate = PS_STATE_AWAKE;
- lbs_pr_alert(
- "main-thread: ignore PS_SleepConfirm in non-connected state\n");
- }
+ if (adapter->psstate == PS_STATE_PRE_SLEEP &&
+ !priv->dnld_sent && !adapter->cur_cmd) {
+ if (adapter->connect_status == LBS_CONNECTED) {
+ lbs_deb_thread("main_thread: PRE_SLEEP--intcounter=%d currenttxskb=%p dnld_sent=%d cur_cmd=%p, confirm now\n",
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent, adapter->cur_cmd);
+
+ lbs_ps_confirm_sleep(priv, (u16) adapter->psmode);
+ } else {
+ /* workaround for firmware sending
+ * deauth/linkloss event immediately
+ * after sleep request; remove this
+ * after firmware fixes it
+ */
+ adapter->psstate = PS_STATE_AWAKE;
+ lbs_pr_alert("main-thread: ignore PS_SleepConfirm in non-connected state\n");
}
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 27/48] libertas: fix lbs_rtap attribute in sysfs
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (25 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 26/48] libertas: clean up lbs_thread() to make it slightly more readable David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 28/48] libertas: kill TxLockFlag David Woodhouse
` (106 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 18:29:16 +0000
At least it doesn't oops when you attempt to read or write it now.
Only when you enable it and then later turn it off. And when it's
enabled I don't see how it actually works.
But one fewer oops is good, for now...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/dev.h | 2 --
drivers/net/wireless/libertas/main.c | 18 ++++++------------
2 files changed, 6 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index fb26f18..5cb2923 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -143,8 +143,6 @@ struct lbs_private {
all other bits reserved 0 */
u8 dnld_sent;
- struct device *hotplug_device;
-
/** thread to service interrupts */
struct task_struct *main_thread;
wait_queue_head_t waitq;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index f595664..d03a2f8 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -256,8 +256,7 @@ void lbs_remove_rtap(struct lbs_private *priv);
static ssize_t lbs_rtap_get(struct device *dev,
struct device_attribute *attr, char * buf)
{
- struct lbs_private *priv = (struct lbs_private *)
- (to_net_dev(dev))->priv;
+ struct lbs_private *priv = to_net_dev(dev)->priv;
struct lbs_adapter *adapter = priv->adapter;
return snprintf(buf, 5, "0x%X\n", adapter->monitormode);
}
@@ -269,8 +268,7 @@ static ssize_t lbs_rtap_set(struct device *dev,
struct device_attribute *attr, const char * buf, size_t count)
{
int monitor_mode;
- struct lbs_private *priv = (struct lbs_private *)
- (to_net_dev(dev))->priv;
+ struct lbs_private *priv = to_net_dev(dev)->priv;
struct lbs_adapter *adapter = priv->adapter;
sscanf(buf, "%x", &monitor_mode);
@@ -1158,7 +1156,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
priv->card = card;
priv->mesh_open = 0;
priv->infra_open = 0;
- priv->hotplug_device = dmdev;
/* Setup the OS Interface to our functions */
dev->open = lbs_open;
@@ -1178,15 +1175,13 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
SET_NETDEV_DEV(dev, dmdev);
priv->rtap_net_dev = NULL;
- if (device_create_file(dmdev, &dev_attr_lbs_rtap))
- goto err_init_adapter;
lbs_deb_thread("Starting main thread...\n");
init_waitqueue_head(&priv->waitq);
priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
if (IS_ERR(priv->main_thread)) {
lbs_deb_thread("Error creating main thread.\n");
- goto err_kthread_run;
+ goto err_init_adapter;
}
priv->work_thread = create_singlethread_workqueue("lbs_worker");
@@ -1196,9 +1191,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
goto done;
-err_kthread_run:
- device_remove_file(dmdev, &dev_attr_lbs_rtap);
-
err_init_adapter:
lbs_free_adapter(priv);
@@ -1224,7 +1216,7 @@ int lbs_remove_card(struct lbs_private *priv)
lbs_remove_rtap(priv);
dev = priv->dev;
- device_remove_file(priv->hotplug_device, &dev_attr_lbs_rtap);
+ device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
cancel_delayed_work(&priv->scan_work);
cancel_delayed_work(&priv->assoc_work);
@@ -1273,6 +1265,8 @@ int lbs_start_card(struct lbs_private *priv)
lbs_pr_err("cannot register ethX device\n");
goto done;
}
+ if (device_create_file(&dev->dev, &dev_attr_lbs_rtap))
+ lbs_pr_err("cannot register lbs_rtap attribute\n");
lbs_debugfs_init_one(priv, dev);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 28/48] libertas: kill TxLockFlag
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (26 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 27/48] libertas: fix lbs_rtap attribute in sysfs David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 29/48] libertas: kill struct lbs_adapter David Woodhouse
` (105 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 19:46:19 +0000
We don't need this. We can use adapter->currenttxskb instead.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/dev.h | 1 -
drivers/net/wireless/libertas/main.c | 25 ++++++++++++++++++++++---
drivers/net/wireless/libertas/tx.c | 9 +++------
3 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 5cb2923..eaa45d4 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -285,7 +285,6 @@ struct lbs_adapter {
/** Tx-related variables (for single packet tx) */
struct sk_buff *currenttxskb;
- u16 TxLockFlag;
/** NIC Operation characteristics */
u16 currentpacketfilter;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index d03a2f8..7155f48 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -290,8 +290,14 @@ static ssize_t lbs_rtap_set(struct device *dev,
return strlen(buf);
adapter->monitormode = LBS_MONITOR_OFF;
lbs_remove_rtap(priv);
- netif_wake_queue(priv->dev);
- netif_wake_queue(priv->mesh_dev);
+
+ if (adapter->currenttxskb) {
+ dev_kfree_skb_any(adapter->currenttxskb);
+ adapter->currenttxskb = NULL;
+ }
+
+ /* Wake queues, command thread, etc. */
+ lbs_host_to_card_done(priv);
}
lbs_prepare_and_send_command(priv,
@@ -521,7 +527,15 @@ static int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
lbs_deb_enter(LBS_DEB_TX);
- if (priv->dnld_sent || priv->adapter->TxLockFlag) {
+ /* We could return NETDEV_TX_BUSY here, but I'd actually
+ like to get the point where we can BUG() */
+ if (priv->dnld_sent) {
+ lbs_pr_err("%s while dnld_sent\n", __func__);
+ priv->stats.tx_dropped++;
+ goto done;
+ }
+ if (priv->adapter->currenttxskb) {
+ lbs_pr_err("%s while TX skb pending\n", __func__);
priv->stats.tx_dropped++;
goto done;
}
@@ -624,6 +638,11 @@ void lbs_host_to_card_done(struct lbs_private *priv)
if (!adapter->cur_cmd)
wake_up_interruptible(&priv->waitq);
+ /* Don't wake netif queues if we're in monitor mode and
+ a TX packet is already pending. */
+ if (priv->adapter->currenttxskb)
+ return;
+
if (priv->dev && adapter->connect_status == LBS_CONNECTED)
netif_wake_queue(priv->dev);
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index b423ce1..131ef3f 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -152,11 +152,11 @@ done:
netif_stop_queue(priv->dev);
if (priv->mesh_dev)
netif_stop_queue(priv->mesh_dev);
- /* freeze any packets already in our queues */
- priv->adapter->TxLockFlag = 1;
+
+ /* Keep the skb around for when we get feedback */
+ priv->adapter->currenttxskb = skb;
} else {
dev_kfree_skb_any(skb);
- priv->adapter->currenttxskb = NULL;
}
lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
@@ -227,8 +227,6 @@ int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
return ret;
}
- priv->adapter->currenttxskb = skb;
-
ret = SendSinglePacket(priv, skb);
done:
lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
@@ -272,7 +270,6 @@ void lbs_send_tx_feedback(struct lbs_private *priv)
(1 + adapter->txretrycount - try_count) : 0;
lbs_upload_rx_packet(priv, adapter->currenttxskb);
adapter->currenttxskb = NULL;
- priv->adapter->TxLockFlag = 0;
if (adapter->connect_status == LBS_CONNECTED)
netif_wake_queue(priv->dev);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 29/48] libertas: kill struct lbs_adapter
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (27 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 28/48] libertas: kill TxLockFlag David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 30/48] libertas: use lbs_host_to_card_done() in lbs_tx_timeout() David Woodhouse
` (104 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 20:04:36 +0000
There seems to be no reason for a separate structure; move it all
into struct lbs_private.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/11d.c | 68 +++---
drivers/net/wireless/libertas/assoc.c | 136 ++++++------
drivers/net/wireless/libertas/assoc.h | 2 +-
drivers/net/wireless/libertas/cmd.c | 278 +++++++++++------------
drivers/net/wireless/libertas/cmdresp.c | 336 +++++++++++++---------------
drivers/net/wireless/libertas/debugfs.c | 56 +++---
drivers/net/wireless/libertas/decl.h | 7 +-
drivers/net/wireless/libertas/dev.h | 97 ++++----
drivers/net/wireless/libertas/ethtool.c | 19 +-
drivers/net/wireless/libertas/if_cs.c | 21 +-
drivers/net/wireless/libertas/if_sdio.c | 20 +-
drivers/net/wireless/libertas/if_usb.c | 27 +--
drivers/net/wireless/libertas/join.c | 150 ++++++-------
drivers/net/wireless/libertas/main.c | 326 ++++++++++++---------------
drivers/net/wireless/libertas/rx.c | 78 +++----
drivers/net/wireless/libertas/scan.c | 188 ++++++++--------
drivers/net/wireless/libertas/scan.h | 6 +-
drivers/net/wireless/libertas/tx.c | 63 +++---
drivers/net/wireless/libertas/wext.c | 372 ++++++++++++++-----------------
19 files changed, 1046 insertions(+), 1204 deletions(-)
diff --git a/drivers/net/wireless/libertas/11d.c b/drivers/net/wireless/libertas/11d.c
index 013965d..5e10ce0 100644
--- a/drivers/net/wireless/libertas/11d.c
+++ b/drivers/net/wireless/libertas/11d.c
@@ -432,8 +432,8 @@ u8 lbs_get_scan_type_11d(u8 chan,
void lbs_init_11d(struct lbs_private *priv)
{
- priv->adapter->enable11d = 0;
- memset(&(priv->adapter->parsed_region_chan), 0,
+ priv->enable11d = 0;
+ memset(&(priv->parsed_region_chan), 0,
sizeof(struct parsed_region_chan_11d));
return;
}
@@ -447,7 +447,7 @@ static int set_domain_info_11d(struct lbs_private *priv)
{
int ret;
- if (!priv->adapter->enable11d) {
+ if (!priv->enable11d) {
lbs_deb_11d("dnld domain Info with 11d disabled\n");
return 0;
}
@@ -469,22 +469,21 @@ static int set_domain_info_11d(struct lbs_private *priv)
*/
int lbs_set_universaltable(struct lbs_private *priv, u8 band)
{
- struct lbs_adapter *adapter = priv->adapter;
u16 size = sizeof(struct chan_freq_power);
u16 i = 0;
- memset(adapter->universal_channel, 0,
- sizeof(adapter->universal_channel));
+ memset(priv->universal_channel, 0,
+ sizeof(priv->universal_channel));
- adapter->universal_channel[i].nrcfp =
+ priv->universal_channel[i].nrcfp =
sizeof(channel_freq_power_UN_BG) / size;
lbs_deb_11d("BG-band nrcfp %d\n",
- adapter->universal_channel[i].nrcfp);
+ priv->universal_channel[i].nrcfp);
- adapter->universal_channel[i].CFP = channel_freq_power_UN_BG;
- adapter->universal_channel[i].valid = 1;
- adapter->universal_channel[i].region = UNIVERSAL_REGION_CODE;
- adapter->universal_channel[i].band = band;
+ priv->universal_channel[i].CFP = channel_freq_power_UN_BG;
+ priv->universal_channel[i].valid = 1;
+ priv->universal_channel[i].region = UNIVERSAL_REGION_CODE;
+ priv->universal_channel[i].band = band;
i++;
return 0;
@@ -505,8 +504,7 @@ int lbs_cmd_802_11d_domain_info(struct lbs_private *priv,
struct cmd_ds_802_11d_domain_info *pdomaininfo =
&cmd->params.domaininfo;
struct mrvlietypes_domainparamset *domain = &pdomaininfo->domain;
- struct lbs_adapter *adapter = priv->adapter;
- u8 nr_subband = adapter->domainreg.nr_subband;
+ u8 nr_subband = priv->domainreg.nr_subband;
lbs_deb_enter(LBS_DEB_11D);
@@ -523,7 +521,7 @@ int lbs_cmd_802_11d_domain_info(struct lbs_private *priv,
}
domain->header.type = cpu_to_le16(TLV_TYPE_DOMAIN);
- memcpy(domain->countrycode, adapter->domainreg.countrycode,
+ memcpy(domain->countrycode, priv->domainreg.countrycode,
sizeof(domain->countrycode));
domain->header.len =
@@ -531,7 +529,7 @@ int lbs_cmd_802_11d_domain_info(struct lbs_private *priv,
sizeof(domain->countrycode));
if (nr_subband) {
- memcpy(domain->subband, adapter->domainreg.subband,
+ memcpy(domain->subband, priv->domainreg.subband,
nr_subband * sizeof(struct ieeetypes_subbandset));
cmd->size = cpu_to_le16(sizeof(pdomaininfo->action) +
@@ -605,24 +603,23 @@ int lbs_parse_dnld_countryinfo_11d(struct lbs_private *priv,
struct bss_descriptor * bss)
{
int ret;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_11D);
- if (priv->adapter->enable11d) {
- memset(&adapter->parsed_region_chan, 0,
+ if (priv->enable11d) {
+ memset(&priv->parsed_region_chan, 0,
sizeof(struct parsed_region_chan_11d));
ret = parse_domain_info_11d(&bss->countryinfo, 0,
- &adapter->parsed_region_chan);
+ &priv->parsed_region_chan);
if (ret == -1) {
lbs_deb_11d("error parsing domain_info from AP\n");
goto done;
}
- memset(&adapter->domainreg, 0,
+ memset(&priv->domainreg, 0,
sizeof(struct lbs_802_11d_domain_reg));
- generate_domain_info_11d(&adapter->parsed_region_chan,
- &adapter->domainreg);
+ generate_domain_info_11d(&priv->parsed_region_chan,
+ &priv->domainreg);
ret = set_domain_info_11d(priv);
@@ -646,18 +643,17 @@ done:
int lbs_create_dnld_countryinfo_11d(struct lbs_private *priv)
{
int ret;
- struct lbs_adapter *adapter = priv->adapter;
struct region_channel *region_chan;
u8 j;
lbs_deb_enter(LBS_DEB_11D);
- lbs_deb_11d("curbssparams.band %d\n", adapter->curbssparams.band);
+ lbs_deb_11d("curbssparams.band %d\n", priv->curbssparams.band);
- if (priv->adapter->enable11d) {
+ if (priv->enable11d) {
/* update parsed_region_chan_11; dnld domaininf to FW */
- for (j = 0; j < ARRAY_SIZE(adapter->region_channel); j++) {
- region_chan = &adapter->region_channel[j];
+ for (j = 0; j < ARRAY_SIZE(priv->region_channel); j++) {
+ region_chan = &priv->region_channel[j];
lbs_deb_11d("%d region_chan->band %d\n", j,
region_chan->band);
@@ -665,28 +661,28 @@ int lbs_create_dnld_countryinfo_11d(struct lbs_private *priv)
if (!region_chan || !region_chan->valid
|| !region_chan->CFP)
continue;
- if (region_chan->band != adapter->curbssparams.band)
+ if (region_chan->band != priv->curbssparams.band)
continue;
break;
}
- if (j >= ARRAY_SIZE(adapter->region_channel)) {
+ if (j >= ARRAY_SIZE(priv->region_channel)) {
lbs_deb_11d("region_chan not found, band %d\n",
- adapter->curbssparams.band);
+ priv->curbssparams.band);
ret = -1;
goto done;
}
- memset(&adapter->parsed_region_chan, 0,
+ memset(&priv->parsed_region_chan, 0,
sizeof(struct parsed_region_chan_11d));
lbs_generate_parsed_region_chan_11d(region_chan,
- &adapter->
+ &priv->
parsed_region_chan);
- memset(&adapter->domainreg, 0,
+ memset(&priv->domainreg, 0,
sizeof(struct lbs_802_11d_domain_reg));
- generate_domain_info_11d(&adapter->parsed_region_chan,
- &adapter->domainreg);
+ generate_domain_info_11d(&priv->parsed_region_chan,
+ &priv->domainreg);
ret = set_domain_info_11d(priv);
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index 88da68e..63bd692 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -18,7 +18,6 @@ static const u8 bssid_off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static int assoc_helper_essid(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
struct bss_descriptor * bss;
int channel = -1;
@@ -38,7 +37,7 @@ static int assoc_helper_essid(struct lbs_private *priv,
lbs_send_specific_ssid_scan(priv, assoc_req->ssid,
assoc_req->ssid_len, 0);
- bss = lbs_find_ssid_in_list(adapter, assoc_req->ssid,
+ bss = lbs_find_ssid_in_list(priv, assoc_req->ssid,
assoc_req->ssid_len, NULL, IW_MODE_INFRA, channel);
if (bss != NULL) {
memcpy(&assoc_req->bss, bss, sizeof(struct bss_descriptor));
@@ -54,7 +53,7 @@ static int assoc_helper_essid(struct lbs_private *priv,
assoc_req->ssid_len, 1);
/* Search for the requested SSID in the scan table */
- bss = lbs_find_ssid_in_list(adapter, assoc_req->ssid,
+ bss = lbs_find_ssid_in_list(priv, assoc_req->ssid,
assoc_req->ssid_len, NULL, IW_MODE_ADHOC, channel);
if (bss != NULL) {
lbs_deb_assoc("SSID found, will join\n");
@@ -78,7 +77,6 @@ static int assoc_helper_essid(struct lbs_private *priv,
static int assoc_helper_bssid(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
struct bss_descriptor * bss;
DECLARE_MAC_BUF(mac);
@@ -87,7 +85,7 @@ static int assoc_helper_bssid(struct lbs_private *priv,
print_mac(mac, assoc_req->bssid));
/* Search for index position in list for requested MAC */
- bss = lbs_find_bssid_in_list(adapter, assoc_req->bssid,
+ bss = lbs_find_bssid_in_list(priv, assoc_req->bssid,
assoc_req->mode);
if (bss == NULL) {
lbs_deb_assoc("ASSOC: WAP: BSSID %s not found, "
@@ -138,21 +136,20 @@ static int assoc_helper_associate(struct lbs_private *priv,
static int assoc_helper_mode(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
- if (assoc_req->mode == adapter->mode)
+ if (assoc_req->mode == priv->mode)
goto done;
if (assoc_req->mode == IW_MODE_INFRA) {
- if (adapter->psstate != PS_STATE_FULL_POWER)
+ if (priv->psstate != PS_STATE_FULL_POWER)
lbs_ps_wakeup(priv, CMD_OPTION_WAITFORRSP);
- adapter->psmode = LBS802_11POWERMODECAM;
+ priv->psmode = LBS802_11POWERMODECAM;
}
- adapter->mode = assoc_req->mode;
+ priv->mode = assoc_req->mode;
ret = lbs_prepare_and_send_command(priv,
CMD_802_11_SNMP_MIB,
0, CMD_OPTION_WAITFORRSP,
@@ -191,7 +188,6 @@ void lbs_sync_channel(struct work_struct *work)
static int assoc_helper_channel(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
@@ -201,11 +197,11 @@ static int assoc_helper_channel(struct lbs_private *priv,
lbs_deb_assoc("ASSOC: channel: error getting channel.");
}
- if (assoc_req->channel == adapter->curbssparams.channel)
+ if (assoc_req->channel == priv->curbssparams.channel)
goto done;
lbs_deb_assoc("ASSOC: channel: %d -> %d\n",
- adapter->curbssparams.channel, assoc_req->channel);
+ priv->curbssparams.channel, assoc_req->channel);
ret = lbs_prepare_and_send_command(priv, CMD_802_11_RF_CHANNEL,
CMD_OPT_802_11_RF_CHANNEL_SET,
@@ -219,7 +215,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
lbs_deb_assoc("ASSOC: channel: error getting channel.");
}
- if (assoc_req->channel != adapter->curbssparams.channel) {
+ if (assoc_req->channel != priv->curbssparams.channel) {
lbs_deb_assoc("ASSOC: channel: failed to update channel to %d",
assoc_req->channel);
goto done;
@@ -246,7 +242,6 @@ done:
static int assoc_helper_wep_keys(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int i;
int ret = 0;
@@ -275,23 +270,23 @@ static int assoc_helper_wep_keys(struct lbs_private *priv,
/* enable/disable the MAC's WEP packet filter */
if (assoc_req->secinfo.wep_enabled)
- adapter->currentpacketfilter |= CMD_ACT_MAC_WEP_ENABLE;
+ priv->currentpacketfilter |= CMD_ACT_MAC_WEP_ENABLE;
else
- adapter->currentpacketfilter &= ~CMD_ACT_MAC_WEP_ENABLE;
+ priv->currentpacketfilter &= ~CMD_ACT_MAC_WEP_ENABLE;
ret = lbs_set_mac_packet_filter(priv);
if (ret)
goto out;
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
- /* Copy WEP keys into adapter wep key fields */
+ /* Copy WEP keys into priv wep key fields */
for (i = 0; i < 4; i++) {
- memcpy(&adapter->wep_keys[i], &assoc_req->wep_keys[i],
+ memcpy(&priv->wep_keys[i], &assoc_req->wep_keys[i],
sizeof(struct enc_key));
}
- adapter->wep_tx_keyidx = assoc_req->wep_tx_keyidx;
+ priv->wep_tx_keyidx = assoc_req->wep_tx_keyidx;
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
out:
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
@@ -301,14 +296,13 @@ out:
static int assoc_helper_secinfo(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
u32 do_wpa;
u32 rsn = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
- memcpy(&adapter->secinfo, &assoc_req->secinfo,
+ memcpy(&priv->secinfo, &assoc_req->secinfo,
sizeof(struct lbs_802_11_security));
ret = lbs_set_mac_packet_filter(priv);
@@ -396,17 +390,16 @@ out:
static int assoc_helper_wpa_ie(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
if (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled) {
- memcpy(&adapter->wpa_ie, &assoc_req->wpa_ie, assoc_req->wpa_ie_len);
- adapter->wpa_ie_len = assoc_req->wpa_ie_len;
+ memcpy(&priv->wpa_ie, &assoc_req->wpa_ie, assoc_req->wpa_ie_len);
+ priv->wpa_ie_len = assoc_req->wpa_ie_len;
} else {
- memset(&adapter->wpa_ie, 0, MAX_WPA_IE_LEN);
- adapter->wpa_ie_len = 0;
+ memset(&priv->wpa_ie, 0, MAX_WPA_IE_LEN);
+ priv->wpa_ie_len = 0;
}
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
@@ -414,14 +407,14 @@ static int assoc_helper_wpa_ie(struct lbs_private *priv,
}
-static int should_deauth_infrastructure(struct lbs_adapter *adapter,
+static int should_deauth_infrastructure(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
int ret = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
- if (adapter->connect_status != LBS_CONNECTED)
+ if (priv->connect_status != LBS_CONNECTED)
return 0;
if (test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) {
@@ -431,7 +424,7 @@ static int should_deauth_infrastructure(struct lbs_adapter *adapter,
}
if (test_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags)) {
- if (adapter->secinfo.auth_mode != assoc_req->secinfo.auth_mode) {
+ if (priv->secinfo.auth_mode != assoc_req->secinfo.auth_mode) {
lbs_deb_assoc("Deauthenticating due to new security\n");
ret = 1;
goto out;
@@ -466,16 +459,16 @@ out:
}
-static int should_stop_adhoc(struct lbs_adapter *adapter,
+static int should_stop_adhoc(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
lbs_deb_enter(LBS_DEB_ASSOC);
- if (adapter->connect_status != LBS_CONNECTED)
+ if (priv->connect_status != LBS_CONNECTED)
return 0;
- if (lbs_ssid_cmp(adapter->curbssparams.ssid,
- adapter->curbssparams.ssid_len,
+ if (lbs_ssid_cmp(priv->curbssparams.ssid,
+ priv->curbssparams.ssid_len,
assoc_req->ssid, assoc_req->ssid_len) != 0)
return 1;
@@ -486,7 +479,7 @@ static int should_stop_adhoc(struct lbs_adapter *adapter,
}
if (test_bit(ASSOC_FLAG_CHANNEL, &assoc_req->flags)) {
- if (assoc_req->channel != adapter->curbssparams.channel)
+ if (assoc_req->channel != priv->curbssparams.channel)
return 1;
}
@@ -499,7 +492,6 @@ void lbs_association_worker(struct work_struct *work)
{
struct lbs_private *priv = container_of(work, struct lbs_private,
assoc_work.work);
- struct lbs_adapter *adapter = priv->adapter;
struct assoc_request * assoc_req = NULL;
int ret = 0;
int find_any_ssid = 0;
@@ -507,11 +499,11 @@ void lbs_association_worker(struct work_struct *work)
lbs_deb_enter(LBS_DEB_ASSOC);
- mutex_lock(&adapter->lock);
- assoc_req = adapter->pending_assoc_req;
- adapter->pending_assoc_req = NULL;
- adapter->in_progress_assoc_req = assoc_req;
- mutex_unlock(&adapter->lock);
+ mutex_lock(&priv->lock);
+ assoc_req = priv->pending_assoc_req;
+ priv->pending_assoc_req = NULL;
+ priv->in_progress_assoc_req = assoc_req;
+ mutex_unlock(&priv->lock);
if (!assoc_req)
goto done;
@@ -569,8 +561,8 @@ void lbs_association_worker(struct work_struct *work)
* Check if the attributes being changing require deauthentication
* from the currently associated infrastructure access point.
*/
- if (adapter->mode == IW_MODE_INFRA) {
- if (should_deauth_infrastructure(adapter, assoc_req)) {
+ if (priv->mode == IW_MODE_INFRA) {
+ if (should_deauth_infrastructure(priv, assoc_req)) {
ret = lbs_send_deauthentication(priv);
if (ret) {
lbs_deb_assoc("Deauthentication due to new "
@@ -578,8 +570,8 @@ void lbs_association_worker(struct work_struct *work)
ret);
}
}
- } else if (adapter->mode == IW_MODE_ADHOC) {
- if (should_stop_adhoc(adapter, assoc_req)) {
+ } else if (priv->mode == IW_MODE_ADHOC) {
+ if (should_stop_adhoc(priv, assoc_req)) {
ret = lbs_stop_adhoc_network(priv);
if (ret) {
lbs_deb_assoc("Teardown of AdHoc network due to "
@@ -643,7 +635,7 @@ void lbs_association_worker(struct work_struct *work)
success = 0;
}
- if (adapter->connect_status != LBS_CONNECTED) {
+ if (priv->connect_status != LBS_CONNECTED) {
lbs_deb_assoc("ASSOC: association unsuccessful, "
"not connected\n");
success = 0;
@@ -651,9 +643,9 @@ void lbs_association_worker(struct work_struct *work)
if (success) {
lbs_deb_assoc("ASSOC: associated to '%s', %s\n",
- escape_essid(adapter->curbssparams.ssid,
- adapter->curbssparams.ssid_len),
- print_mac(mac, adapter->curbssparams.bssid));
+ escape_essid(priv->curbssparams.ssid,
+ priv->curbssparams.ssid_len),
+ print_mac(mac, priv->curbssparams.bssid));
lbs_prepare_and_send_command(priv,
CMD_802_11_RSSI,
0, CMD_OPTION_WAITFORRSP, 0, NULL);
@@ -672,9 +664,9 @@ out:
ret);
}
- mutex_lock(&adapter->lock);
- adapter->in_progress_assoc_req = NULL;
- mutex_unlock(&adapter->lock);
+ mutex_lock(&priv->lock);
+ priv->in_progress_assoc_req = NULL;
+ mutex_unlock(&priv->lock);
kfree(assoc_req);
done:
@@ -685,15 +677,15 @@ done:
/*
* Caller MUST hold any necessary locks
*/
-struct assoc_request *lbs_get_association_request(struct lbs_adapter *adapter)
+struct assoc_request *lbs_get_association_request(struct lbs_private *priv)
{
struct assoc_request * assoc_req;
lbs_deb_enter(LBS_DEB_ASSOC);
- if (!adapter->pending_assoc_req) {
- adapter->pending_assoc_req = kzalloc(sizeof(struct assoc_request),
+ if (!priv->pending_assoc_req) {
+ priv->pending_assoc_req = kzalloc(sizeof(struct assoc_request),
GFP_KERNEL);
- if (!adapter->pending_assoc_req) {
+ if (!priv->pending_assoc_req) {
lbs_pr_info("Not enough memory to allocate association"
" request!\n");
return NULL;
@@ -703,57 +695,57 @@ struct assoc_request *lbs_get_association_request(struct lbs_adapter *adapter)
/* Copy current configuration attributes to the association request,
* but don't overwrite any that are already set.
*/
- assoc_req = adapter->pending_assoc_req;
+ assoc_req = priv->pending_assoc_req;
if (!test_bit(ASSOC_FLAG_SSID, &assoc_req->flags)) {
- memcpy(&assoc_req->ssid, &adapter->curbssparams.ssid,
+ memcpy(&assoc_req->ssid, &priv->curbssparams.ssid,
IW_ESSID_MAX_SIZE);
- assoc_req->ssid_len = adapter->curbssparams.ssid_len;
+ assoc_req->ssid_len = priv->curbssparams.ssid_len;
}
if (!test_bit(ASSOC_FLAG_CHANNEL, &assoc_req->flags))
- assoc_req->channel = adapter->curbssparams.channel;
+ assoc_req->channel = priv->curbssparams.channel;
if (!test_bit(ASSOC_FLAG_BAND, &assoc_req->flags))
- assoc_req->band = adapter->curbssparams.band;
+ assoc_req->band = priv->curbssparams.band;
if (!test_bit(ASSOC_FLAG_MODE, &assoc_req->flags))
- assoc_req->mode = adapter->mode;
+ assoc_req->mode = priv->mode;
if (!test_bit(ASSOC_FLAG_BSSID, &assoc_req->flags)) {
- memcpy(&assoc_req->bssid, adapter->curbssparams.bssid,
+ memcpy(&assoc_req->bssid, priv->curbssparams.bssid,
ETH_ALEN);
}
if (!test_bit(ASSOC_FLAG_WEP_KEYS, &assoc_req->flags)) {
int i;
for (i = 0; i < 4; i++) {
- memcpy(&assoc_req->wep_keys[i], &adapter->wep_keys[i],
+ memcpy(&assoc_req->wep_keys[i], &priv->wep_keys[i],
sizeof(struct enc_key));
}
}
if (!test_bit(ASSOC_FLAG_WEP_TX_KEYIDX, &assoc_req->flags))
- assoc_req->wep_tx_keyidx = adapter->wep_tx_keyidx;
+ assoc_req->wep_tx_keyidx = priv->wep_tx_keyidx;
if (!test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags)) {
- memcpy(&assoc_req->wpa_mcast_key, &adapter->wpa_mcast_key,
+ memcpy(&assoc_req->wpa_mcast_key, &priv->wpa_mcast_key,
sizeof(struct enc_key));
}
if (!test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) {
- memcpy(&assoc_req->wpa_unicast_key, &adapter->wpa_unicast_key,
+ memcpy(&assoc_req->wpa_unicast_key, &priv->wpa_unicast_key,
sizeof(struct enc_key));
}
if (!test_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags)) {
- memcpy(&assoc_req->secinfo, &adapter->secinfo,
+ memcpy(&assoc_req->secinfo, &priv->secinfo,
sizeof(struct lbs_802_11_security));
}
if (!test_bit(ASSOC_FLAG_WPA_IE, &assoc_req->flags)) {
- memcpy(&assoc_req->wpa_ie, &adapter->wpa_ie,
+ memcpy(&assoc_req->wpa_ie, &priv->wpa_ie,
MAX_WPA_IE_LEN);
- assoc_req->wpa_ie_len = adapter->wpa_ie_len;
+ assoc_req->wpa_ie_len = priv->wpa_ie_len;
}
lbs_deb_leave(LBS_DEB_ASSOC);
diff --git a/drivers/net/wireless/libertas/assoc.h b/drivers/net/wireless/libertas/assoc.h
index fad00ae..08372bb 100644
--- a/drivers/net/wireless/libertas/assoc.h
+++ b/drivers/net/wireless/libertas/assoc.h
@@ -6,7 +6,7 @@
#include "dev.h"
void lbs_association_worker(struct work_struct *work);
-struct assoc_request *lbs_get_association_request(struct lbs_adapter *adapter);
+struct assoc_request *lbs_get_association_request(struct lbs_private *priv);
void lbs_sync_channel(struct work_struct *work);
#endif /* _LBS_ASSOC_H */
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 6838c9c..49a9aee 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -50,7 +50,7 @@ static int lbs_cmd_hw_spec(struct lbs_private *priv, struct cmd_ds_command *cmd)
cmd->command = cpu_to_le16(CMD_GET_HW_SPEC);
cmd->size = cpu_to_le16(sizeof(struct cmd_ds_get_hw_spec) + S_DS_GEN);
- memcpy(hwspec->permanentaddr, priv->adapter->current_addr, ETH_ALEN);
+ memcpy(hwspec->permanentaddr, priv->current_addr, ETH_ALEN);
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -123,7 +123,6 @@ static int lbs_cmd_802_11_sleep_params(struct lbs_private *priv,
struct cmd_ds_command *cmd,
u16 cmd_action)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_sleep_params *sp = &cmd->params.sleep_params;
lbs_deb_enter(LBS_DEB_CMD);
@@ -133,17 +132,17 @@ static int lbs_cmd_802_11_sleep_params(struct lbs_private *priv,
cmd->command = cpu_to_le16(CMD_802_11_SLEEP_PARAMS);
if (cmd_action == CMD_ACT_GET) {
- memset(&adapter->sp, 0, sizeof(struct sleep_params));
+ memset(&priv->sp, 0, sizeof(struct sleep_params));
memset(sp, 0, sizeof(struct cmd_ds_802_11_sleep_params));
sp->action = cpu_to_le16(cmd_action);
} else if (cmd_action == CMD_ACT_SET) {
sp->action = cpu_to_le16(cmd_action);
- sp->error = cpu_to_le16(adapter->sp.sp_error);
- sp->offset = cpu_to_le16(adapter->sp.sp_offset);
- sp->stabletime = cpu_to_le16(adapter->sp.sp_stabletime);
- sp->calcontrol = (u8) adapter->sp.sp_calcontrol;
- sp->externalsleepclk = (u8) adapter->sp.sp_extsleepclk;
- sp->reserved = cpu_to_le16(adapter->sp.sp_reserved);
+ sp->error = cpu_to_le16(priv->sp.sp_error);
+ sp->offset = cpu_to_le16(priv->sp.sp_offset);
+ sp->stabletime = cpu_to_le16(priv->sp.sp_stabletime);
+ sp->calcontrol = (u8) priv->sp.sp_calcontrol;
+ sp->externalsleepclk = (u8) priv->sp.sp_extsleepclk;
+ sp->reserved = cpu_to_le16(priv->sp.sp_reserved);
}
lbs_deb_leave(LBS_DEB_CMD);
@@ -156,7 +155,6 @@ static int lbs_cmd_802_11_set_wep(struct lbs_private *priv,
void * pdata_buf)
{
struct cmd_ds_802_11_set_wep *wep = &cmd->params.wep;
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
struct assoc_request * assoc_req = pdata_buf;
@@ -212,9 +210,9 @@ static int lbs_cmd_802_11_set_wep(struct lbs_private *priv,
wep->action = cpu_to_le16(CMD_ACT_REMOVE);
/* default tx key index */
- wep->keyindex = cpu_to_le16((u16)(adapter->wep_tx_keyidx &
+ wep->keyindex = cpu_to_le16((u16)(priv->wep_tx_keyidx &
(u32)CMD_WEP_KEY_INDEX_MASK));
- lbs_deb_cmd("SET_WEP: remove key %d\n", adapter->wep_tx_keyidx);
+ lbs_deb_cmd("SET_WEP: remove key %d\n", priv->wep_tx_keyidx);
}
ret = 0;
@@ -415,7 +413,6 @@ static int lbs_cmd_802_11_snmp_mib(struct lbs_private *priv,
int cmd_oid, void *pdata_buf)
{
struct cmd_ds_802_11_snmp_mib *pSNMPMIB = &cmd->params.smib;
- struct lbs_adapter *adapter = priv->adapter;
u8 ucTemp;
lbs_deb_enter(LBS_DEB_CMD);
@@ -507,7 +504,7 @@ static int lbs_cmd_802_11_snmp_mib(struct lbs_private *priv,
pSNMPMIB->querytype = cpu_to_le16(CMD_ACT_SET);
pSNMPMIB->bufsize = cpu_to_le16(sizeof(u16));
*((__le16 *)(pSNMPMIB->value)) =
- cpu_to_le16((u16) adapter->txretrycount);
+ cpu_to_le16((u16) priv->txretrycount);
}
break;
@@ -534,7 +531,6 @@ static int lbs_cmd_802_11_radio_control(struct lbs_private *priv,
struct cmd_ds_command *cmd,
int cmd_action)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_radio_control *pradiocontrol = &cmd->params.radio;
lbs_deb_enter(LBS_DEB_CMD);
@@ -546,7 +542,7 @@ static int lbs_cmd_802_11_radio_control(struct lbs_private *priv,
pradiocontrol->action = cpu_to_le16(cmd_action);
- switch (adapter->preamble) {
+ switch (priv->preamble) {
case CMD_TYPE_SHORT_PREAMBLE:
pradiocontrol->control = cpu_to_le16(SET_SHORT_PREAMBLE);
break;
@@ -561,7 +557,7 @@ static int lbs_cmd_802_11_radio_control(struct lbs_private *priv,
break;
}
- if (adapter->radioon)
+ if (priv->radioon)
pradiocontrol->control |= cpu_to_le16(TURN_ON_RF);
else
pradiocontrol->control &= cpu_to_le16(~TURN_ON_RF);
@@ -640,7 +636,6 @@ static int lbs_cmd_802_11_rate_adapt_rateset(struct lbs_private *priv,
{
struct cmd_ds_802_11_rate_adapt_rateset
*rateadapt = &cmd->params.rateset;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
cmd->size =
@@ -649,8 +644,8 @@ static int lbs_cmd_802_11_rate_adapt_rateset(struct lbs_private *priv,
cmd->command = cpu_to_le16(CMD_802_11_RATE_ADAPT_RATESET);
rateadapt->action = cpu_to_le16(cmd_action);
- rateadapt->enablehwauto = cpu_to_le16(adapter->enablehwauto);
- rateadapt->bitmap = cpu_to_le16(adapter->ratebitmap);
+ rateadapt->enablehwauto = cpu_to_le16(priv->enablehwauto);
+ rateadapt->bitmap = cpu_to_le16(priv->ratebitmap);
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -661,7 +656,6 @@ static int lbs_cmd_802_11_data_rate(struct lbs_private *priv,
u16 cmd_action)
{
struct cmd_ds_802_11_data_rate *pdatarate = &cmd->params.drate;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
@@ -672,9 +666,9 @@ static int lbs_cmd_802_11_data_rate(struct lbs_private *priv,
pdatarate->action = cpu_to_le16(cmd_action);
if (cmd_action == CMD_ACT_SET_TX_FIX_RATE) {
- pdatarate->rates[0] = lbs_data_rate_to_fw_index(adapter->cur_rate);
+ pdatarate->rates[0] = lbs_data_rate_to_fw_index(priv->cur_rate);
lbs_deb_cmd("DATA_RATE: set fixed 0x%02X\n",
- adapter->cur_rate);
+ priv->cur_rate);
} else if (cmd_action == CMD_ACT_SET_TX_AUTO) {
lbs_deb_cmd("DATA_RATE: setting auto\n");
}
@@ -688,7 +682,6 @@ static int lbs_cmd_mac_multicast_adr(struct lbs_private *priv,
u16 cmd_action)
{
struct cmd_ds_mac_multicast_adr *pMCastAdr = &cmd->params.madr;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
cmd->size = cpu_to_le16(sizeof(struct cmd_ds_mac_multicast_adr) +
@@ -698,9 +691,9 @@ static int lbs_cmd_mac_multicast_adr(struct lbs_private *priv,
lbs_deb_cmd("MULTICAST_ADR: setting %d addresses\n", pMCastAdr->nr_of_adrs);
pMCastAdr->action = cpu_to_le16(cmd_action);
pMCastAdr->nr_of_adrs =
- cpu_to_le16((u16) adapter->nr_of_multicastmacaddr);
- memcpy(pMCastAdr->maclist, adapter->multicastlist,
- adapter->nr_of_multicastmacaddr * ETH_ALEN);
+ cpu_to_le16((u16) priv->nr_of_multicastmacaddr);
+ memcpy(pMCastAdr->maclist, priv->multicastlist,
+ priv->nr_of_multicastmacaddr * ETH_ALEN);
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -730,7 +723,6 @@ static int lbs_cmd_802_11_rf_channel(struct lbs_private *priv,
static int lbs_cmd_802_11_rssi(struct lbs_private *priv,
struct cmd_ds_command *cmd)
{
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
cmd->command = cpu_to_le16(CMD_802_11_RSSI);
@@ -738,12 +730,12 @@ static int lbs_cmd_802_11_rssi(struct lbs_private *priv,
cmd->params.rssi.N = cpu_to_le16(DEFAULT_BCN_AVG_FACTOR);
/* reset Beacon SNR/NF/RSSI values */
- adapter->SNR[TYPE_BEACON][TYPE_NOAVG] = 0;
- adapter->SNR[TYPE_BEACON][TYPE_AVG] = 0;
- adapter->NF[TYPE_BEACON][TYPE_NOAVG] = 0;
- adapter->NF[TYPE_BEACON][TYPE_AVG] = 0;
- adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] = 0;
- adapter->RSSI[TYPE_BEACON][TYPE_AVG] = 0;
+ priv->SNR[TYPE_BEACON][TYPE_NOAVG] = 0;
+ priv->SNR[TYPE_BEACON][TYPE_AVG] = 0;
+ priv->NF[TYPE_BEACON][TYPE_NOAVG] = 0;
+ priv->NF[TYPE_BEACON][TYPE_AVG] = 0;
+ priv->RSSI[TYPE_BEACON][TYPE_NOAVG] = 0;
+ priv->RSSI[TYPE_BEACON][TYPE_AVG] = 0;
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -828,7 +820,6 @@ static int lbs_cmd_802_11_mac_address(struct lbs_private *priv,
struct cmd_ds_command *cmd,
u16 cmd_action)
{
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
cmd->command = cpu_to_le16(CMD_802_11_MAC_ADDRESS);
@@ -840,8 +831,8 @@ static int lbs_cmd_802_11_mac_address(struct lbs_private *priv,
if (cmd_action == CMD_ACT_SET) {
memcpy(cmd->params.macadd.macadd,
- adapter->current_addr, ETH_ALEN);
- lbs_deb_hex(LBS_DEB_CMD, "SET_CMD: MAC addr", adapter->current_addr, 6);
+ priv->current_addr, ETH_ALEN);
+ lbs_deb_hex(LBS_DEB_CMD, "SET_CMD: MAC addr", priv->current_addr, 6);
}
lbs_deb_leave(LBS_DEB_CMD);
@@ -958,7 +949,6 @@ static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
{
struct cmd_ds_802_11_beacon_control
*bcn_ctrl = &cmd->params.bcn_ctrl;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
cmd->size =
@@ -967,8 +957,8 @@ static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
cmd->command = cpu_to_le16(CMD_802_11_BEACON_CTRL);
bcn_ctrl->action = cpu_to_le16(cmd_action);
- bcn_ctrl->beacon_enable = cpu_to_le16(adapter->beacon_enable);
- bcn_ctrl->beacon_period = cpu_to_le16(adapter->beacon_period);
+ bcn_ctrl->beacon_enable = cpu_to_le16(priv->beacon_enable);
+ bcn_ctrl->beacon_period = cpu_to_le16(priv->beacon_period);
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -978,7 +968,7 @@ static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
* Note: NEVER use lbs_queue_cmd() with addtail==0 other than for
* the command timer, because it does not account for queued commands.
*/
-void lbs_queue_cmd(struct lbs_adapter *adapter,
+void lbs_queue_cmd(struct lbs_private *priv,
struct cmd_ctrl_node *cmdnode,
u8 addtail)
{
@@ -1002,19 +992,19 @@ void lbs_queue_cmd(struct lbs_adapter *adapter,
if (le16_to_cpu(cmdptr->command) == CMD_802_11_PS_MODE) {
struct cmd_ds_802_11_ps_mode *psm = &cmdptr->params.psmode;
if (psm->action == cpu_to_le16(CMD_SUBCMD_EXIT_PS)) {
- if (adapter->psstate != PS_STATE_FULL_POWER)
+ if (priv->psstate != PS_STATE_FULL_POWER)
addtail = 0;
}
}
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
if (addtail)
- list_add_tail(&cmdnode->list, &adapter->cmdpendingq);
+ list_add_tail(&cmdnode->list, &priv->cmdpendingq);
else
- list_add(&cmdnode->list, &adapter->cmdpendingq);
+ list_add(&cmdnode->list, &priv->cmdpendingq);
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
lbs_deb_host("QUEUE_CMD: inserted command 0x%04x into cmdpendingq\n",
le16_to_cpu(((struct cmd_ds_gen*)cmdnode->bufvirtualaddr)->command));
@@ -1035,31 +1025,30 @@ static int DownloadcommandToStation(struct lbs_private *priv,
{
unsigned long flags;
struct cmd_ds_command *cmdptr;
- struct lbs_adapter *adapter = priv->adapter;
int ret = -1;
u16 cmdsize;
u16 command;
lbs_deb_enter(LBS_DEB_HOST);
- if (!adapter || !cmdnode) {
- lbs_deb_host("DNLD_CMD: adapter or cmdmode is NULL\n");
+ if (!priv || !cmdnode) {
+ lbs_deb_host("DNLD_CMD: priv or cmdmode is NULL\n");
goto done;
}
cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
if (!cmdptr || !cmdptr->size) {
lbs_deb_host("DNLD_CMD: cmdptr is NULL or zero\n");
__lbs_cleanup_and_insert_cmd(priv, cmdnode);
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
goto done;
}
- adapter->cur_cmd = cmdnode;
- adapter->cur_cmd_retcode = 0;
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ priv->cur_cmd = cmdnode;
+ priv->cur_cmd_retcode = 0;
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
cmdsize = le16_to_cpu(cmdptr->size);
command = le16_to_cpu(cmdptr->command);
@@ -1074,11 +1063,11 @@ static int DownloadcommandToStation(struct lbs_private *priv,
if (ret != 0) {
lbs_deb_host("DNLD_CMD: hw_host_to_card failed\n");
- spin_lock_irqsave(&adapter->driver_lock, flags);
- adapter->cur_cmd_retcode = ret;
- __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->cur_cmd = NULL;
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ priv->cur_cmd_retcode = ret;
+ __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
+ priv->cur_cmd = NULL;
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
goto done;
}
@@ -1087,9 +1076,9 @@ static int DownloadcommandToStation(struct lbs_private *priv,
/* Setup the timer after transmit command */
if (command == CMD_802_11_SCAN || command == CMD_802_11_AUTHENTICATE
|| command == CMD_802_11_ASSOCIATE)
- mod_timer(&adapter->command_timer, jiffies + (10*HZ));
+ mod_timer(&priv->command_timer, jiffies + (10*HZ));
else
- mod_timer(&adapter->command_timer, jiffies + (5*HZ));
+ mod_timer(&priv->command_timer, jiffies + (5*HZ));
ret = 0;
@@ -1107,7 +1096,7 @@ static int lbs_cmd_mac_control(struct lbs_private *priv,
cmd->command = cpu_to_le16(CMD_MAC_CONTROL);
cmd->size = cpu_to_le16(sizeof(struct cmd_ds_mac_control) + S_DS_GEN);
- mac->action = cpu_to_le16(priv->adapter->currentpacketfilter);
+ mac->action = cpu_to_le16(priv->currentpacketfilter);
lbs_deb_cmd("MAC_CONTROL: action 0x%x, size %d\n",
le16_to_cpu(mac->action), le16_to_cpu(cmd->size));
@@ -1118,18 +1107,17 @@ static int lbs_cmd_mac_control(struct lbs_private *priv,
/**
* This function inserts command node to cmdfreeq
- * after cleans it. Requires adapter->driver_lock held.
+ * after cleans it. Requires priv->driver_lock held.
*/
void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
struct cmd_ctrl_node *ptempcmd)
{
- struct lbs_adapter *adapter = priv->adapter;
if (!ptempcmd)
return;
cleanup_cmdnode(ptempcmd);
- list_add_tail(&ptempcmd->list, &adapter->cmdfreeq);
+ list_add_tail(&ptempcmd->list, &priv->cmdfreeq);
}
static void lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
@@ -1137,9 +1125,9 @@ static void lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
{
unsigned long flags;
- spin_lock_irqsave(&priv->adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
__lbs_cleanup_and_insert_cmd(priv, ptempcmd);
- spin_unlock_irqrestore(&priv->adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
}
int lbs_set_radio_control(struct lbs_private *priv)
@@ -1154,7 +1142,7 @@ int lbs_set_radio_control(struct lbs_private *priv)
CMD_OPTION_WAITFORRSP, 0, NULL);
lbs_deb_cmd("RADIO_SET: radio %d, preamble %d\n",
- priv->adapter->radioon, priv->adapter->preamble);
+ priv->radioon, priv->preamble);
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
@@ -1191,20 +1179,19 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 wait_option, u32 cmd_oid, void *pdata_buf)
{
int ret = 0;
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ctrl_node *cmdnode;
struct cmd_ds_command *cmdptr;
unsigned long flags;
lbs_deb_enter(LBS_DEB_HOST);
- if (!adapter) {
- lbs_deb_host("PREP_CMD: adapter is NULL\n");
+ if (!priv) {
+ lbs_deb_host("PREP_CMD: priv is NULL\n");
ret = -1;
goto done;
}
- if (adapter->surpriseremoved) {
+ if (priv->surpriseremoved) {
lbs_deb_host("PREP_CMD: card removed\n");
ret = -1;
goto done;
@@ -1235,8 +1222,8 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
}
/* Set sequence number, command and INT option */
- adapter->seqnum++;
- cmdptr->seqnum = cpu_to_le16(adapter->seqnum);
+ priv->seqnum++;
+ cmdptr->seqnum = cpu_to_le16(priv->seqnum);
cmdptr->command = cpu_to_le16(cmd_no);
cmdptr->result = 0;
@@ -1482,7 +1469,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
cmdnode->cmdwaitqwoken = 0;
- lbs_queue_cmd(adapter, cmdnode, 1);
+ lbs_queue_cmd(priv, cmdnode, 1);
wake_up_interruptible(&priv->waitq);
if (wait_option & CMD_OPTION_WAITFORRSP) {
@@ -1492,14 +1479,14 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
cmdnode->cmdwaitqwoken);
}
- spin_lock_irqsave(&adapter->driver_lock, flags);
- if (adapter->cur_cmd_retcode) {
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ if (priv->cur_cmd_retcode) {
lbs_deb_host("PREP_CMD: command failed with return code %d\n",
- adapter->cur_cmd_retcode);
- adapter->cur_cmd_retcode = 0;
+ priv->cur_cmd_retcode);
+ priv->cur_cmd_retcode = 0;
ret = -1;
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
done:
lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
@@ -1521,7 +1508,6 @@ int lbs_allocate_cmd_buffer(struct lbs_private *priv)
u32 i;
struct cmd_ctrl_node *tempcmd_array;
u8 *ptempvirtualaddr;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_HOST);
@@ -1533,7 +1519,7 @@ int lbs_allocate_cmd_buffer(struct lbs_private *priv)
ret = -1;
goto done;
}
- adapter->cmd_array = tempcmd_array;
+ priv->cmd_array = tempcmd_array;
/* Allocate and initialize command buffers */
ulbufsize = MRVDRV_SIZE_OF_CMD_BUFFER;
@@ -1571,17 +1557,16 @@ int lbs_free_cmd_buffer(struct lbs_private *priv)
u32 ulbufsize; /* Someone needs to die for this. Slowly and painfully */
unsigned int i;
struct cmd_ctrl_node *tempcmd_array;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_HOST);
/* need to check if cmd array is allocated or not */
- if (adapter->cmd_array == NULL) {
+ if (priv->cmd_array == NULL) {
lbs_deb_host("FREE_CMD_BUF: cmd_array is NULL\n");
goto done;
}
- tempcmd_array = adapter->cmd_array;
+ tempcmd_array = priv->cmd_array;
/* Release shared memory buffers */
ulbufsize = MRVDRV_SIZE_OF_CMD_BUFFER;
@@ -1593,9 +1578,9 @@ int lbs_free_cmd_buffer(struct lbs_private *priv)
}
/* Release cmd_ctrl_node */
- if (adapter->cmd_array) {
- kfree(adapter->cmd_array);
- adapter->cmd_array = NULL;
+ if (priv->cmd_array) {
+ kfree(priv->cmd_array);
+ priv->cmd_array = NULL;
}
done:
@@ -1613,18 +1598,17 @@ done:
struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
{
struct cmd_ctrl_node *tempnode;
- struct lbs_adapter *adapter = priv->adapter;
unsigned long flags;
lbs_deb_enter(LBS_DEB_HOST);
- if (!adapter)
+ if (!priv)
return NULL;
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
- if (!list_empty(&adapter->cmdfreeq)) {
- tempnode = list_first_entry(&adapter->cmdfreeq,
+ if (!list_empty(&priv->cmdfreeq)) {
+ tempnode = list_first_entry(&priv->cmdfreeq,
struct cmd_ctrl_node, list);
list_del(&tempnode->list);
} else {
@@ -1632,7 +1616,7 @@ struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
tempnode = NULL;
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
if (tempnode)
cleanup_cmdnode(tempnode);
@@ -1700,7 +1684,6 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
*/
int lbs_execute_next_command(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ctrl_node *cmdnode = NULL;
struct cmd_ds_command *cmdptr;
unsigned long flags;
@@ -1711,40 +1694,40 @@ int lbs_execute_next_command(struct lbs_private *priv)
// data packet is received
lbs_deb_enter(LBS_DEB_THREAD);
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
- if (adapter->cur_cmd) {
+ if (priv->cur_cmd) {
lbs_pr_alert( "EXEC_NEXT_CMD: already processing command!\n");
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = -1;
goto done;
}
- if (!list_empty(&adapter->cmdpendingq)) {
- cmdnode = list_first_entry(&adapter->cmdpendingq,
+ if (!list_empty(&priv->cmdpendingq)) {
+ cmdnode = list_first_entry(&priv->cmdpendingq,
struct cmd_ctrl_node, list);
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
if (cmdnode) {
cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
if (is_command_allowed_in_ps(cmdptr->command)) {
- if ((adapter->psstate == PS_STATE_SLEEP) ||
- (adapter->psstate == PS_STATE_PRE_SLEEP)) {
+ if ((priv->psstate == PS_STATE_SLEEP) ||
+ (priv->psstate == PS_STATE_PRE_SLEEP)) {
lbs_deb_host(
"EXEC_NEXT_CMD: cannot send cmd 0x%04x in psstate %d\n",
le16_to_cpu(cmdptr->command),
- adapter->psstate);
+ priv->psstate);
ret = -1;
goto done;
}
lbs_deb_host("EXEC_NEXT_CMD: OK to send command "
"0x%04x in psstate %d\n",
le16_to_cpu(cmdptr->command),
- adapter->psstate);
- } else if (adapter->psstate != PS_STATE_FULL_POWER) {
+ priv->psstate);
+ } else if (priv->psstate != PS_STATE_FULL_POWER) {
/*
* 1. Non-PS command:
* Queue it. set needtowakeup to TRUE if current state
@@ -1760,12 +1743,12 @@ int lbs_execute_next_command(struct lbs_private *priv)
cpu_to_le16(CMD_802_11_PS_MODE)) {
/* Prepare to send Exit PS,
* this non PS command will be sent later */
- if ((adapter->psstate == PS_STATE_SLEEP)
- || (adapter->psstate == PS_STATE_PRE_SLEEP)
+ if ((priv->psstate == PS_STATE_SLEEP)
+ || (priv->psstate == PS_STATE_PRE_SLEEP)
) {
/* w/ new scheme, it will not reach here.
since it is blocked in main_thread. */
- adapter->needtowakeup = 1;
+ priv->needtowakeup = 1;
} else
lbs_ps_wakeup(priv, 0);
@@ -1793,13 +1776,13 @@ int lbs_execute_next_command(struct lbs_private *priv)
goto done;
}
- if ((adapter->psstate == PS_STATE_SLEEP) ||
- (adapter->psstate == PS_STATE_PRE_SLEEP)) {
+ if ((priv->psstate == PS_STATE_SLEEP) ||
+ (priv->psstate == PS_STATE_PRE_SLEEP)) {
lbs_deb_host(
"EXEC_NEXT_CMD: ignore EXIT_PS cmd in sleep\n");
list_del(&cmdnode->list);
lbs_cleanup_and_insert_cmd(priv, cmdnode);
- adapter->needtowakeup = 1;
+ priv->needtowakeup = 1;
ret = 0;
goto done;
@@ -1818,15 +1801,15 @@ int lbs_execute_next_command(struct lbs_private *priv)
* check if in power save mode, if yes, put the device back
* to PS mode
*/
- if ((adapter->psmode != LBS802_11POWERMODECAM) &&
- (adapter->psstate == PS_STATE_FULL_POWER) &&
- ((adapter->connect_status == LBS_CONNECTED) ||
- (adapter->mesh_connect_status == LBS_CONNECTED))) {
- if (adapter->secinfo.WPAenabled ||
- adapter->secinfo.WPA2enabled) {
+ if ((priv->psmode != LBS802_11POWERMODECAM) &&
+ (priv->psstate == PS_STATE_FULL_POWER) &&
+ ((priv->connect_status == LBS_CONNECTED) ||
+ (priv->mesh_connect_status == LBS_CONNECTED))) {
+ if (priv->secinfo.WPAenabled ||
+ priv->secinfo.WPA2enabled) {
/* check for valid WPA group keys */
- if (adapter->wpa_mcast_key.len ||
- adapter->wpa_unicast_key.len) {
+ if (priv->wpa_mcast_key.len ||
+ priv->wpa_unicast_key.len) {
lbs_deb_host(
"EXEC_NEXT_CMD: WPA enabled and GTK_SET"
" go back to PS_SLEEP");
@@ -1874,7 +1857,6 @@ void lbs_send_iwevcustom_event(struct lbs_private *priv, s8 *str)
static int sendconfirmsleep(struct lbs_private *priv, u8 *cmdptr, u16 size)
{
unsigned long flags;
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
lbs_deb_enter(LBS_DEB_HOST);
@@ -1887,24 +1869,24 @@ static int sendconfirmsleep(struct lbs_private *priv, u8 *cmdptr, u16 size)
ret = priv->hw_host_to_card(priv, MVMS_CMD, cmdptr, size);
priv->dnld_sent = DNLD_RES_RECEIVED;
- spin_lock_irqsave(&adapter->driver_lock, flags);
- if (adapter->intcounter || adapter->currenttxskb)
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ if (priv->intcounter || priv->currenttxskb)
lbs_deb_host("SEND_SLEEPC_CMD: intcounter %d, currenttxskb %p\n",
- adapter->intcounter, adapter->currenttxskb);
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ priv->intcounter, priv->currenttxskb);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
if (ret) {
lbs_pr_alert(
"SEND_SLEEPC_CMD: Host to Card failed for Confirm Sleep\n");
} else {
- spin_lock_irqsave(&adapter->driver_lock, flags);
- if (!adapter->intcounter) {
- adapter->psstate = PS_STATE_SLEEP;
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ if (!priv->intcounter) {
+ priv->psstate = PS_STATE_SLEEP;
} else {
lbs_deb_host("SEND_SLEEPC_CMD: after sent, intcounter %d\n",
- adapter->intcounter);
+ priv->intcounter);
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
lbs_deb_host("SEND_SLEEPC_CMD: sent confirm sleep\n");
}
@@ -1961,7 +1943,6 @@ void lbs_ps_wakeup(struct lbs_private *priv, int wait_option)
void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
{
unsigned long flags =0;
- struct lbs_adapter *adapter = priv->adapter;
u8 allowed = 1;
lbs_deb_enter(LBS_DEB_HOST);
@@ -1971,20 +1952,20 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
lbs_deb_host("dnld_sent was set");
}
- spin_lock_irqsave(&adapter->driver_lock, flags);
- if (adapter->cur_cmd) {
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ if (priv->cur_cmd) {
allowed = 0;
lbs_deb_host("cur_cmd was set");
}
- if (adapter->intcounter > 0) {
+ if (priv->intcounter > 0) {
allowed = 0;
- lbs_deb_host("intcounter %d", adapter->intcounter);
+ lbs_deb_host("intcounter %d", priv->intcounter);
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
if (allowed) {
lbs_deb_host("sending lbs_ps_confirm_sleep\n");
- sendconfirmsleep(priv, (u8 *) & adapter->lbs_ps_confirm_sleep,
+ sendconfirmsleep(priv, (u8 *) & priv->lbs_ps_confirm_sleep,
sizeof(struct PS_CMD_ConfirmSleep));
} else {
lbs_deb_host("sleep confirm has been delayed\n");
@@ -2014,7 +1995,6 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
int (*callback)(uint16_t, struct cmd_ds_command *, struct lbs_private *))
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ctrl_node *cmdnode;
struct cmd_ds_gen *cmdptr;
unsigned long flags;
@@ -2022,13 +2002,13 @@ int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
lbs_deb_enter(LBS_DEB_HOST);
- if (!adapter) {
- lbs_deb_host("PREP_CMD: adapter is NULL\n");
+ if (!priv) {
+ lbs_deb_host("PREP_CMD: priv is NULL\n");
ret = -1;
goto done;
}
- if (adapter->surpriseremoved) {
+ if (priv->surpriseremoved) {
lbs_deb_host("PREP_CMD: card removed\n");
ret = -1;
goto done;
@@ -2050,10 +2030,10 @@ int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
cmdnode->callback = callback;
/* Set sequence number, clean result, move to buffer */
- adapter->seqnum++;
+ priv->seqnum++;
cmdptr->command = cpu_to_le16(command);
cmdptr->size = cpu_to_le16(cmd_size + S_DS_GEN);
- cmdptr->seqnum = cpu_to_le16(adapter->seqnum);
+ cmdptr->seqnum = cpu_to_le16(priv->seqnum);
cmdptr->result = 0;
memcpy(cmdptr->cmdresp, cmd, cmd_size);
@@ -2063,20 +2043,20 @@ int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
* because the caller of lbs_cmd() sets up all of *cmd for us. */
cmdnode->cmdwaitqwoken = 0;
- lbs_queue_cmd(adapter, cmdnode, 1);
+ lbs_queue_cmd(priv, cmdnode, 1);
wake_up_interruptible(&priv->waitq);
might_sleep();
wait_event_interruptible(cmdnode->cmdwait_q, cmdnode->cmdwaitqwoken);
- spin_lock_irqsave(&adapter->driver_lock, flags);
- if (adapter->cur_cmd_retcode) {
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ if (priv->cur_cmd_retcode) {
lbs_deb_host("PREP_CMD: command failed with return code %d\n",
- adapter->cur_cmd_retcode);
- adapter->cur_cmd_retcode = 0;
+ priv->cur_cmd_retcode);
+ priv->cur_cmd_retcode = 0;
ret = -1;
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
done:
lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 44865bf..ab6e729 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -25,10 +25,9 @@
*/
void lbs_mac_event_disconnected(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
union iwreq_data wrqu;
- if (adapter->connect_status != LBS_CONNECTED)
+ if (priv->connect_status != LBS_CONNECTED)
return;
lbs_deb_enter(LBS_DEB_ASSOC);
@@ -45,31 +44,31 @@ void lbs_mac_event_disconnected(struct lbs_private *priv)
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
/* Free Tx and Rx packets */
- kfree_skb(priv->adapter->currenttxskb);
- priv->adapter->currenttxskb = NULL;
+ kfree_skb(priv->currenttxskb);
+ priv->currenttxskb = NULL;
/* report disconnect to upper layer */
netif_stop_queue(priv->dev);
netif_carrier_off(priv->dev);
/* reset SNR/NF/RSSI values */
- memset(adapter->SNR, 0x00, sizeof(adapter->SNR));
- memset(adapter->NF, 0x00, sizeof(adapter->NF));
- memset(adapter->RSSI, 0x00, sizeof(adapter->RSSI));
- memset(adapter->rawSNR, 0x00, sizeof(adapter->rawSNR));
- memset(adapter->rawNF, 0x00, sizeof(adapter->rawNF));
- adapter->nextSNRNF = 0;
- adapter->numSNRNF = 0;
- adapter->connect_status = LBS_DISCONNECTED;
+ memset(priv->SNR, 0x00, sizeof(priv->SNR));
+ memset(priv->NF, 0x00, sizeof(priv->NF));
+ memset(priv->RSSI, 0x00, sizeof(priv->RSSI));
+ memset(priv->rawSNR, 0x00, sizeof(priv->rawSNR));
+ memset(priv->rawNF, 0x00, sizeof(priv->rawNF));
+ priv->nextSNRNF = 0;
+ priv->numSNRNF = 0;
+ priv->connect_status = LBS_DISCONNECTED;
/* Clear out associated SSID and BSSID since connection is
* no longer valid.
*/
- memset(&adapter->curbssparams.bssid, 0, ETH_ALEN);
- memset(&adapter->curbssparams.ssid, 0, IW_ESSID_MAX_SIZE);
- adapter->curbssparams.ssid_len = 0;
+ memset(&priv->curbssparams.bssid, 0, ETH_ALEN);
+ memset(&priv->curbssparams.ssid, 0, IW_ESSID_MAX_SIZE);
+ priv->curbssparams.ssid_len = 0;
- if (adapter->psstate != PS_STATE_FULL_POWER) {
+ if (priv->psstate != PS_STATE_FULL_POWER) {
/* make firmware to exit PS mode */
lbs_deb_cmd("disconnected, so exit PS mode\n");
lbs_ps_wakeup(priv, 0);
@@ -107,7 +106,6 @@ static int lbs_ret_reg_access(struct lbs_private *priv,
u16 type, struct cmd_ds_command *resp)
{
int ret = 0;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
@@ -116,8 +114,8 @@ static int lbs_ret_reg_access(struct lbs_private *priv,
{
struct cmd_ds_mac_reg_access *reg = &resp->params.macreg;
- adapter->offsetvalue.offset = (u32)le16_to_cpu(reg->offset);
- adapter->offsetvalue.value = le32_to_cpu(reg->value);
+ priv->offsetvalue.offset = (u32)le16_to_cpu(reg->offset);
+ priv->offsetvalue.value = le32_to_cpu(reg->value);
break;
}
@@ -125,8 +123,8 @@ static int lbs_ret_reg_access(struct lbs_private *priv,
{
struct cmd_ds_bbp_reg_access *reg = &resp->params.bbpreg;
- adapter->offsetvalue.offset = (u32)le16_to_cpu(reg->offset);
- adapter->offsetvalue.value = reg->value;
+ priv->offsetvalue.offset = (u32)le16_to_cpu(reg->offset);
+ priv->offsetvalue.value = reg->value;
break;
}
@@ -134,8 +132,8 @@ static int lbs_ret_reg_access(struct lbs_private *priv,
{
struct cmd_ds_rf_reg_access *reg = &resp->params.rfreg;
- adapter->offsetvalue.offset = (u32)le16_to_cpu(reg->offset);
- adapter->offsetvalue.value = reg->value;
+ priv->offsetvalue.offset = (u32)le16_to_cpu(reg->offset);
+ priv->offsetvalue.value = reg->value;
break;
}
@@ -152,19 +150,18 @@ static int lbs_ret_get_hw_spec(struct lbs_private *priv,
{
u32 i;
struct cmd_ds_get_hw_spec *hwspec = &resp->params.hwspec;
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
DECLARE_MAC_BUF(mac);
lbs_deb_enter(LBS_DEB_CMD);
- adapter->fwcapinfo = le32_to_cpu(hwspec->fwcapinfo);
+ priv->fwcapinfo = le32_to_cpu(hwspec->fwcapinfo);
- memcpy(adapter->fwreleasenumber, hwspec->fwreleasenumber, 4);
+ memcpy(priv->fwreleasenumber, hwspec->fwreleasenumber, 4);
lbs_deb_cmd("GET_HW_SPEC: firmware release %u.%u.%up%u\n",
- adapter->fwreleasenumber[2], adapter->fwreleasenumber[1],
- adapter->fwreleasenumber[0], adapter->fwreleasenumber[3]);
+ priv->fwreleasenumber[2], priv->fwreleasenumber[1],
+ priv->fwreleasenumber[0], priv->fwreleasenumber[3]);
lbs_deb_cmd("GET_HW_SPEC: MAC addr %s\n",
print_mac(mac, hwspec->permanentaddr));
lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n",
@@ -174,29 +171,29 @@ static int lbs_ret_get_hw_spec(struct lbs_private *priv,
* only ever be 8-bit, even though the field size is 16-bit. Some firmware
* returns non-zero high 8 bits here.
*/
- adapter->regioncode = le16_to_cpu(hwspec->regioncode) & 0xFF;
+ priv->regioncode = le16_to_cpu(hwspec->regioncode) & 0xFF;
for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
/* use the region code to search for the index */
- if (adapter->regioncode == lbs_region_code_to_index[i]) {
+ if (priv->regioncode == lbs_region_code_to_index[i]) {
break;
}
}
/* if it's unidentified region code, use the default (USA) */
if (i >= MRVDRV_MAX_REGION_CODE) {
- adapter->regioncode = 0x10;
+ priv->regioncode = 0x10;
lbs_pr_info("unidentified region code; using the default (USA)\n");
}
- if (adapter->current_addr[0] == 0xff)
- memmove(adapter->current_addr, hwspec->permanentaddr, ETH_ALEN);
+ if (priv->current_addr[0] == 0xff)
+ memmove(priv->current_addr, hwspec->permanentaddr, ETH_ALEN);
- memcpy(priv->dev->dev_addr, adapter->current_addr, ETH_ALEN);
+ memcpy(priv->dev->dev_addr, priv->current_addr, ETH_ALEN);
if (priv->mesh_dev)
- memcpy(priv->mesh_dev->dev_addr, adapter->current_addr, ETH_ALEN);
+ memcpy(priv->mesh_dev->dev_addr, priv->current_addr, ETH_ALEN);
- if (lbs_set_regiontable(priv, adapter->regioncode, 0)) {
+ if (lbs_set_regiontable(priv, priv->regioncode, 0)) {
ret = -1;
goto done;
}
@@ -215,7 +212,6 @@ static int lbs_ret_802_11_sleep_params(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_sleep_params *sp = &resp->params.sleep_params;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
@@ -224,12 +220,12 @@ static int lbs_ret_802_11_sleep_params(struct lbs_private *priv,
le16_to_cpu(sp->offset), le16_to_cpu(sp->stabletime),
sp->calcontrol, sp->externalsleepclk);
- adapter->sp.sp_error = le16_to_cpu(sp->error);
- adapter->sp.sp_offset = le16_to_cpu(sp->offset);
- adapter->sp.sp_stabletime = le16_to_cpu(sp->stabletime);
- adapter->sp.sp_calcontrol = sp->calcontrol;
- adapter->sp.sp_extsleepclk = sp->externalsleepclk;
- adapter->sp.sp_reserved = le16_to_cpu(sp->reserved);
+ priv->sp.sp_error = le16_to_cpu(sp->error);
+ priv->sp.sp_offset = le16_to_cpu(sp->offset);
+ priv->sp.sp_stabletime = le16_to_cpu(sp->stabletime);
+ priv->sp.sp_calcontrol = sp->calcontrol;
+ priv->sp.sp_extsleepclk = sp->externalsleepclk;
+ priv->sp.sp_reserved = le16_to_cpu(sp->reserved);
lbs_deb_enter(LBS_DEB_CMD);
return 0;
@@ -239,13 +235,12 @@ static int lbs_ret_802_11_stat(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
lbs_deb_enter(LBS_DEB_CMD);
-/* currently adapter->wlan802_11Stat is unused
+/* currently priv->wlan802_11Stat is unused
struct cmd_ds_802_11_get_stat *p11Stat = &resp->params.gstat;
- struct lbs_adapter *adapter = priv->adapter;
// TODO Convert it to Big endian befor copy
- memcpy(&adapter->wlan802_11Stat,
+ memcpy(&priv->wlan802_11Stat,
p11Stat, sizeof(struct cmd_ds_802_11_get_stat));
*/
lbs_deb_leave(LBS_DEB_CMD);
@@ -268,22 +263,22 @@ static int lbs_ret_802_11_snmp_mib(struct lbs_private *priv,
if (querytype == CMD_ACT_GET) {
switch (oid) {
case FRAGTHRESH_I:
- priv->adapter->fragthsd =
+ priv->fragthsd =
le16_to_cpu(*((__le16 *)(smib->value)));
lbs_deb_cmd("SNMP_RESP: frag threshold %u\n",
- priv->adapter->fragthsd);
+ priv->fragthsd);
break;
case RTSTHRESH_I:
- priv->adapter->rtsthsd =
+ priv->rtsthsd =
le16_to_cpu(*((__le16 *)(smib->value)));
lbs_deb_cmd("SNMP_RESP: rts threshold %u\n",
- priv->adapter->rtsthsd);
+ priv->rtsthsd);
break;
case SHORT_RETRYLIM_I:
- priv->adapter->txretrycount =
+ priv->txretrycount =
le16_to_cpu(*((__le16 *)(smib->value)));
lbs_deb_cmd("SNMP_RESP: tx retry count %u\n",
- priv->adapter->rtsthsd);
+ priv->rtsthsd);
break;
default:
break;
@@ -299,7 +294,6 @@ static int lbs_ret_802_11_key_material(struct lbs_private *priv,
{
struct cmd_ds_802_11_key_material *pkeymaterial =
&resp->params.keymaterial;
- struct lbs_adapter *adapter = priv->adapter;
u16 action = le16_to_cpu(pkeymaterial->action);
lbs_deb_enter(LBS_DEB_CMD);
@@ -327,9 +321,9 @@ static int lbs_ret_802_11_key_material(struct lbs_private *priv,
break;
if (key_flags & KEY_INFO_WPA_UNICAST)
- pkey = &adapter->wpa_unicast_key;
+ pkey = &priv->wpa_unicast_key;
else if (key_flags & KEY_INFO_WPA_MCAST)
- pkey = &adapter->wpa_mcast_key;
+ pkey = &priv->wpa_mcast_key;
else
break;
@@ -354,11 +348,10 @@ static int lbs_ret_802_11_mac_address(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_mac_address *macadd = &resp->params.macadd;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
- memcpy(adapter->current_addr, macadd->macadd, ETH_ALEN);
+ memcpy(priv->current_addr, macadd->macadd, ETH_ALEN);
lbs_deb_enter(LBS_DEB_CMD);
return 0;
@@ -368,13 +361,12 @@ static int lbs_ret_802_11_rf_tx_power(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_rf_tx_power *rtp = &resp->params.txp;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
- adapter->txpowerlevel = le16_to_cpu(rtp->currentlevel);
+ priv->txpowerlevel = le16_to_cpu(rtp->currentlevel);
- lbs_deb_cmd("TX power currently %d\n", adapter->txpowerlevel);
+ lbs_deb_cmd("TX power currently %d\n", priv->txpowerlevel);
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -384,13 +376,12 @@ static int lbs_ret_802_11_rate_adapt_rateset(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_rate_adapt_rateset *rates = &resp->params.rateset;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
if (rates->action == CMD_ACT_GET) {
- adapter->enablehwauto = le16_to_cpu(rates->enablehwauto);
- adapter->ratebitmap = le16_to_cpu(rates->bitmap);
+ priv->enablehwauto = le16_to_cpu(rates->enablehwauto);
+ priv->ratebitmap = le16_to_cpu(rates->bitmap);
}
lbs_deb_leave(LBS_DEB_CMD);
@@ -401,7 +392,6 @@ static int lbs_ret_802_11_data_rate(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_data_rate *pdatarate = &resp->params.drate;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
@@ -411,8 +401,8 @@ static int lbs_ret_802_11_data_rate(struct lbs_private *priv,
/* FIXME: get actual rates FW can do if this command actually returns
* all data rates supported.
*/
- adapter->cur_rate = lbs_fw_index_to_data_rate(pdatarate->rates[0]);
- lbs_deb_cmd("DATA_RATE: current rate 0x%02x\n", adapter->cur_rate);
+ priv->cur_rate = lbs_fw_index_to_data_rate(pdatarate->rates[0]);
+ lbs_deb_cmd("DATA_RATE: current rate 0x%02x\n", priv->cur_rate);
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -422,19 +412,18 @@ static int lbs_ret_802_11_rf_channel(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_rf_channel *rfchannel = &resp->params.rfchannel;
- struct lbs_adapter *adapter = priv->adapter;
u16 action = le16_to_cpu(rfchannel->action);
u16 newchannel = le16_to_cpu(rfchannel->currentchannel);
lbs_deb_enter(LBS_DEB_CMD);
if (action == CMD_OPT_802_11_RF_CHANNEL_GET
- && adapter->curbssparams.channel != newchannel) {
+ && priv->curbssparams.channel != newchannel) {
lbs_deb_cmd("channel switch from %d to %d\n",
- adapter->curbssparams.channel, newchannel);
+ priv->curbssparams.channel, newchannel);
/* Update the channel again */
- adapter->curbssparams.channel = newchannel;
+ priv->curbssparams.channel = newchannel;
}
lbs_deb_enter(LBS_DEB_CMD);
@@ -445,28 +434,27 @@ static int lbs_ret_802_11_rssi(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_rssi_rsp *rssirsp = &resp->params.rssirsp;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
/* store the non average value */
- adapter->SNR[TYPE_BEACON][TYPE_NOAVG] = le16_to_cpu(rssirsp->SNR);
- adapter->NF[TYPE_BEACON][TYPE_NOAVG] = le16_to_cpu(rssirsp->noisefloor);
+ priv->SNR[TYPE_BEACON][TYPE_NOAVG] = le16_to_cpu(rssirsp->SNR);
+ priv->NF[TYPE_BEACON][TYPE_NOAVG] = le16_to_cpu(rssirsp->noisefloor);
- adapter->SNR[TYPE_BEACON][TYPE_AVG] = le16_to_cpu(rssirsp->avgSNR);
- adapter->NF[TYPE_BEACON][TYPE_AVG] = le16_to_cpu(rssirsp->avgnoisefloor);
+ priv->SNR[TYPE_BEACON][TYPE_AVG] = le16_to_cpu(rssirsp->avgSNR);
+ priv->NF[TYPE_BEACON][TYPE_AVG] = le16_to_cpu(rssirsp->avgnoisefloor);
- adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] =
- CAL_RSSI(adapter->SNR[TYPE_BEACON][TYPE_NOAVG],
- adapter->NF[TYPE_BEACON][TYPE_NOAVG]);
+ priv->RSSI[TYPE_BEACON][TYPE_NOAVG] =
+ CAL_RSSI(priv->SNR[TYPE_BEACON][TYPE_NOAVG],
+ priv->NF[TYPE_BEACON][TYPE_NOAVG]);
- adapter->RSSI[TYPE_BEACON][TYPE_AVG] =
- CAL_RSSI(adapter->SNR[TYPE_BEACON][TYPE_AVG] / AVG_SCALE,
- adapter->NF[TYPE_BEACON][TYPE_AVG] / AVG_SCALE);
+ priv->RSSI[TYPE_BEACON][TYPE_AVG] =
+ CAL_RSSI(priv->SNR[TYPE_BEACON][TYPE_AVG] / AVG_SCALE,
+ priv->NF[TYPE_BEACON][TYPE_AVG] / AVG_SCALE);
lbs_deb_cmd("RSSI: beacon %d, avg %d\n",
- adapter->RSSI[TYPE_BEACON][TYPE_NOAVG],
- adapter->RSSI[TYPE_BEACON][TYPE_AVG]);
+ priv->RSSI[TYPE_BEACON][TYPE_NOAVG],
+ priv->RSSI[TYPE_BEACON][TYPE_AVG]);
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -475,9 +463,8 @@ static int lbs_ret_802_11_rssi(struct lbs_private *priv,
static int lbs_ret_802_11_eeprom_access(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
- struct lbs_adapter *adapter = priv->adapter;
struct lbs_ioctl_regrdwr *pbuf;
- pbuf = (struct lbs_ioctl_regrdwr *) adapter->prdeeprom;
+ pbuf = (struct lbs_ioctl_regrdwr *) priv->prdeeprom;
lbs_deb_enter_args(LBS_DEB_CMD, "len %d",
le16_to_cpu(resp->params.rdeeprom.bytecount));
@@ -502,12 +489,11 @@ static int lbs_ret_get_log(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_get_log *logmessage = &resp->params.glog;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
/* Stored little-endian */
- memcpy(&adapter->logmsg, logmessage, sizeof(struct cmd_ds_802_11_get_log));
+ memcpy(&priv->logmsg, logmessage, sizeof(struct cmd_ds_802_11_get_log));
lbs_deb_leave(LBS_DEB_CMD);
return 0;
@@ -517,8 +503,7 @@ static int lbs_ret_802_11_enable_rsn(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_enable_rsn *enable_rsn = &resp->params.enbrsn;
- struct lbs_adapter *adapter = priv->adapter;
- u32 * pdata_buf = adapter->cur_cmd->pdata_buf;
+ u32 * pdata_buf = priv->cur_cmd->pdata_buf;
lbs_deb_enter(LBS_DEB_CMD);
@@ -536,13 +521,12 @@ static int lbs_ret_802_11_bcn_ctrl(struct lbs_private * priv,
{
struct cmd_ds_802_11_beacon_control *bcn_ctrl =
&resp->params.bcn_ctrl;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_CMD);
if (bcn_ctrl->action == CMD_ACT_GET) {
- adapter->beacon_enable = (u8) le16_to_cpu(bcn_ctrl->beacon_enable);
- adapter->beacon_period = le16_to_cpu(bcn_ctrl->beacon_period);
+ priv->beacon_enable = (u8) le16_to_cpu(bcn_ctrl->beacon_enable);
+ priv->beacon_period = le16_to_cpu(bcn_ctrl->beacon_period);
}
lbs_deb_enter(LBS_DEB_CMD);
@@ -552,11 +536,10 @@ static int lbs_ret_802_11_bcn_ctrl(struct lbs_private * priv,
static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_subscribe_event *cmd_event =
&resp->params.subscribe_event;
struct cmd_ds_802_11_subscribe_event *dst_event =
- adapter->cur_cmd->pdata_buf;
+ priv->cur_cmd->pdata_buf;
lbs_deb_enter(LBS_DEB_CMD);
@@ -575,7 +558,6 @@ static inline int handle_cmd_response(u16 respcmd,
{
int ret = 0;
unsigned long flags;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_HOST);
@@ -628,10 +610,10 @@ static inline int handle_cmd_response(u16 respcmd,
case CMD_RET(CMD_802_11_SET_AFC):
case CMD_RET(CMD_802_11_GET_AFC):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- memmove(adapter->cur_cmd->pdata_buf, &resp->params.afc,
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ memmove(priv->cur_cmd->pdata_buf, &resp->params.afc,
sizeof(struct cmd_ds_802_11_afc));
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
@@ -686,59 +668,59 @@ static inline int handle_cmd_response(u16 respcmd,
ret = lbs_ret_802_11_sleep_params(priv, resp);
break;
case CMD_RET(CMD_802_11_INACTIVITY_TIMEOUT):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- *((u16 *) adapter->cur_cmd->pdata_buf) =
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ *((u16 *) priv->cur_cmd->pdata_buf) =
le16_to_cpu(resp->params.inactivity_timeout.timeout);
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_802_11_TPC_CFG):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- memmove(adapter->cur_cmd->pdata_buf, &resp->params.tpccfg,
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ memmove(priv->cur_cmd->pdata_buf, &resp->params.tpccfg,
sizeof(struct cmd_ds_802_11_tpc_cfg));
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_802_11_LED_GPIO_CTRL):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- memmove(adapter->cur_cmd->pdata_buf, &resp->params.ledgpio,
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ memmove(priv->cur_cmd->pdata_buf, &resp->params.ledgpio,
sizeof(struct cmd_ds_802_11_led_ctrl));
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_802_11_SUBSCRIBE_EVENT):
ret = lbs_ret_802_11_subscribe_event(priv, resp);
break;
case CMD_RET(CMD_802_11_PWR_CFG):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- memmove(adapter->cur_cmd->pdata_buf, &resp->params.pwrcfg,
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ memmove(priv->cur_cmd->pdata_buf, &resp->params.pwrcfg,
sizeof(struct cmd_ds_802_11_pwr_cfg));
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_GET_TSF):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- memcpy(priv->adapter->cur_cmd->pdata_buf,
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ memcpy(priv->cur_cmd->pdata_buf,
&resp->params.gettsf.tsfvalue, sizeof(u64));
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_BT_ACCESS):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- if (adapter->cur_cmd->pdata_buf)
- memcpy(adapter->cur_cmd->pdata_buf,
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ if (priv->cur_cmd->pdata_buf)
+ memcpy(priv->cur_cmd->pdata_buf,
&resp->params.bt.addr1, 2 * ETH_ALEN);
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_FWT_ACCESS):
- spin_lock_irqsave(&adapter->driver_lock, flags);
- if (adapter->cur_cmd->pdata_buf)
- memcpy(adapter->cur_cmd->pdata_buf, &resp->params.fwt,
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ if (priv->cur_cmd->pdata_buf)
+ memcpy(priv->cur_cmd->pdata_buf, &resp->params.fwt,
sizeof(resp->params.fwt));
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_MESH_ACCESS):
- if (adapter->cur_cmd->pdata_buf)
- memcpy(adapter->cur_cmd->pdata_buf, &resp->params.mesh,
+ if (priv->cur_cmd->pdata_buf)
+ memcpy(priv->cur_cmd->pdata_buf, &resp->params.mesh,
sizeof(resp->params.mesh));
break;
case CMD_RET(CMD_802_11_BEACON_CTRL):
@@ -758,7 +740,6 @@ int lbs_process_rx_command(struct lbs_private *priv)
{
u16 respcmd;
struct cmd_ds_command *resp;
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
ulong flags;
u16 result;
@@ -766,39 +747,39 @@ int lbs_process_rx_command(struct lbs_private *priv)
lbs_deb_enter(LBS_DEB_HOST);
/* Now we got response from FW, cancel the command timer */
- del_timer(&adapter->command_timer);
+ del_timer(&priv->command_timer);
- mutex_lock(&adapter->lock);
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ mutex_lock(&priv->lock);
+ spin_lock_irqsave(&priv->driver_lock, flags);
- if (!adapter->cur_cmd) {
+ if (!priv->cur_cmd) {
lbs_deb_host("CMD_RESP: cur_cmd is NULL\n");
ret = -1;
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
goto done;
}
- resp = (struct cmd_ds_command *)(adapter->cur_cmd->bufvirtualaddr);
+ resp = (struct cmd_ds_command *)(priv->cur_cmd->bufvirtualaddr);
respcmd = le16_to_cpu(resp->command);
result = le16_to_cpu(resp->result);
lbs_deb_host("CMD_RESP: response 0x%04x, size %d, jiffies %lu\n",
respcmd, priv->upld_len, jiffies);
- lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", adapter->cur_cmd->bufvirtualaddr,
+ lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", priv->cur_cmd->bufvirtualaddr,
priv->upld_len);
if (!(respcmd & 0x8000)) {
lbs_deb_host("invalid response!\n");
- adapter->cur_cmd_retcode = -1;
- __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->cur_cmd = NULL;
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ priv->cur_cmd_retcode = -1;
+ __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
+ priv->cur_cmd = NULL;
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = -1;
goto done;
}
/* Store the response code to cur_cmd_retcode. */
- adapter->cur_cmd_retcode = result;
+ priv->cur_cmd_retcode = result;
if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {
struct cmd_ds_802_11_ps_mode *psmode = &resp->params.psmode;
@@ -816,15 +797,15 @@ int lbs_process_rx_command(struct lbs_private *priv)
* ad-hoc mode. It takes place in
* lbs_execute_next_command().
*/
- if (adapter->mode == IW_MODE_ADHOC &&
+ if (priv->mode == IW_MODE_ADHOC &&
action == CMD_SUBCMD_ENTER_PS)
- adapter->psmode = LBS802_11POWERMODECAM;
+ priv->psmode = LBS802_11POWERMODECAM;
} else if (action == CMD_SUBCMD_ENTER_PS) {
- adapter->needtowakeup = 0;
- adapter->psstate = PS_STATE_AWAKE;
+ priv->needtowakeup = 0;
+ priv->psstate = PS_STATE_AWAKE;
lbs_deb_host("CMD_RESP: ENTER_PS command response\n");
- if (adapter->connect_status != LBS_CONNECTED) {
+ if (priv->connect_status != LBS_CONNECTED) {
/*
* When Deauth Event received before Enter_PS command
* response, We need to wake up the firmware.
@@ -832,23 +813,23 @@ int lbs_process_rx_command(struct lbs_private *priv)
lbs_deb_host(
"disconnected, invoking lbs_ps_wakeup\n");
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
- mutex_unlock(&adapter->lock);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
+ mutex_unlock(&priv->lock);
lbs_ps_wakeup(priv, 0);
- mutex_lock(&adapter->lock);
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ mutex_lock(&priv->lock);
+ spin_lock_irqsave(&priv->driver_lock, flags);
}
} else if (action == CMD_SUBCMD_EXIT_PS) {
- adapter->needtowakeup = 0;
- adapter->psstate = PS_STATE_FULL_POWER;
+ priv->needtowakeup = 0;
+ priv->psstate = PS_STATE_FULL_POWER;
lbs_deb_host("CMD_RESP: EXIT_PS command response\n");
} else {
lbs_deb_host("CMD_RESP: PS action 0x%X\n", action);
}
- __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->cur_cmd = NULL;
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
+ priv->cur_cmd = NULL;
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = 0;
goto done;
@@ -869,32 +850,32 @@ int lbs_process_rx_command(struct lbs_private *priv)
}
- __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->cur_cmd = NULL;
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
+ priv->cur_cmd = NULL;
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = -1;
goto done;
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
- if (adapter->cur_cmd && adapter->cur_cmd->callback)
- ret = adapter->cur_cmd->callback(respcmd, resp, priv);
+ if (priv->cur_cmd && priv->cur_cmd->callback)
+ ret = priv->cur_cmd->callback(respcmd, resp, priv);
else
ret = handle_cmd_response(respcmd, resp, priv);
- spin_lock_irqsave(&adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
- if (adapter->cur_cmd) {
+ if (priv->cur_cmd) {
/* Clean up and Put current command back to cmdfreeq */
- __lbs_cleanup_and_insert_cmd(priv, adapter->cur_cmd);
- adapter->cur_cmd = NULL;
+ __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
+ priv->cur_cmd = NULL;
}
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
done:
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
return ret;
}
@@ -902,14 +883,13 @@ done:
int lbs_process_event(struct lbs_private *priv)
{
int ret = 0;
- struct lbs_adapter *adapter = priv->adapter;
u32 eventcause;
lbs_deb_enter(LBS_DEB_CMD);
- spin_lock_irq(&adapter->driver_lock);
- eventcause = adapter->eventcause >> SBI_EVENT_CAUSE_SHIFT;
- spin_unlock_irq(&adapter->driver_lock);
+ spin_lock_irq(&priv->driver_lock);
+ eventcause = priv->eventcause >> SBI_EVENT_CAUSE_SHIFT;
+ spin_unlock_irq(&priv->driver_lock);
lbs_deb_cmd("event cause %d\n", eventcause);
@@ -937,14 +917,14 @@ int lbs_process_event(struct lbs_private *priv)
lbs_deb_cmd("EVENT: sleep\n");
/* handle unexpected PS SLEEP event */
- if (adapter->psstate == PS_STATE_FULL_POWER) {
+ if (priv->psstate == PS_STATE_FULL_POWER) {
lbs_deb_cmd(
"EVENT: in FULL POWER mode, ignoreing PS_SLEEP\n");
break;
}
- adapter->psstate = PS_STATE_PRE_SLEEP;
+ priv->psstate = PS_STATE_PRE_SLEEP;
- lbs_ps_confirm_sleep(priv, (u16) adapter->psmode);
+ lbs_ps_confirm_sleep(priv, (u16) priv->psmode);
break;
@@ -952,19 +932,19 @@ int lbs_process_event(struct lbs_private *priv)
lbs_deb_cmd("EVENT: awake\n");
/* handle unexpected PS AWAKE event */
- if (adapter->psstate == PS_STATE_FULL_POWER) {
+ if (priv->psstate == PS_STATE_FULL_POWER) {
lbs_deb_cmd(
"EVENT: In FULL POWER mode - ignore PS AWAKE\n");
break;
}
- adapter->psstate = PS_STATE_AWAKE;
+ priv->psstate = PS_STATE_AWAKE;
- if (adapter->needtowakeup) {
+ if (priv->needtowakeup) {
/*
* wait for the command processing to finish
* before resuming sending
- * adapter->needtowakeup will be set to FALSE
+ * priv->needtowakeup will be set to FALSE
* in lbs_ps_wakeup()
*/
lbs_deb_cmd("waking up ...\n");
@@ -1012,12 +992,12 @@ int lbs_process_event(struct lbs_private *priv)
break;
}
lbs_pr_info("EVENT: MESH_AUTO_STARTED\n");
- adapter->mesh_connect_status = LBS_CONNECTED;
+ priv->mesh_connect_status = LBS_CONNECTED;
if (priv->mesh_open == 1) {
netif_wake_queue(priv->mesh_dev);
netif_carrier_on(priv->mesh_dev);
}
- adapter->mode = IW_MODE_ADHOC;
+ priv->mode = IW_MODE_ADHOC;
schedule_work(&priv->sync_channel);
break;
@@ -1026,9 +1006,9 @@ int lbs_process_event(struct lbs_private *priv)
break;
}
- spin_lock_irq(&adapter->driver_lock);
- adapter->eventcause = 0;
- spin_unlock_irq(&adapter->driver_lock);
+ spin_lock_irq(&priv->driver_lock);
+ priv->eventcause = 0;
+ spin_unlock_irq(&priv->driver_lock);
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index 341ef67..9917a18 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -45,9 +45,9 @@ static ssize_t lbs_dev_info(struct file *file, char __user *userbuf,
ssize_t res;
pos += snprintf(buf+pos, len-pos, "state = %s\n",
- szStates[priv->adapter->connect_status]);
+ szStates[priv->connect_status]);
pos += snprintf(buf+pos, len-pos, "region_code = %02x\n",
- (u32) priv->adapter->regioncode);
+ (u32) priv->regioncode);
res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
@@ -70,8 +70,8 @@ static ssize_t lbs_getscantable(struct file *file, char __user *userbuf,
pos += snprintf(buf+pos, len-pos,
"# | ch | rssi | bssid | cap | Qual | SSID \n");
- mutex_lock(&priv->adapter->lock);
- list_for_each_entry (iter_bss, &priv->adapter->network_list, list) {
+ mutex_lock(&priv->lock);
+ list_for_each_entry (iter_bss, &priv->network_list, list) {
u16 ibss = (iter_bss->capability & WLAN_CAPABILITY_IBSS);
u16 privacy = (iter_bss->capability & WLAN_CAPABILITY_PRIVACY);
u16 spectrum_mgmt = (iter_bss->capability & WLAN_CAPABILITY_SPECTRUM_MGMT);
@@ -90,7 +90,7 @@ static ssize_t lbs_getscantable(struct file *file, char __user *userbuf,
numscansdone++;
}
- mutex_unlock(&priv->adapter->lock);
+ mutex_unlock(&priv->lock);
res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
@@ -118,12 +118,12 @@ static ssize_t lbs_sleepparams_write(struct file *file,
res = -EFAULT;
goto out_unlock;
}
- priv->adapter->sp.sp_error = p1;
- priv->adapter->sp.sp_offset = p2;
- priv->adapter->sp.sp_stabletime = p3;
- priv->adapter->sp.sp_calcontrol = p4;
- priv->adapter->sp.sp_extsleepclk = p5;
- priv->adapter->sp.sp_reserved = p6;
+ priv->sp.sp_error = p1;
+ priv->sp.sp_offset = p2;
+ priv->sp.sp_stabletime = p3;
+ priv->sp.sp_calcontrol = p4;
+ priv->sp.sp_extsleepclk = p5;
+ priv->sp.sp_reserved = p6;
res = lbs_prepare_and_send_command(priv,
CMD_802_11_SLEEP_PARAMS,
@@ -144,7 +144,6 @@ static ssize_t lbs_sleepparams_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct lbs_private *priv = file->private_data;
- struct lbs_adapter *adapter = priv->adapter;
ssize_t res;
size_t pos = 0;
unsigned long addr = get_zeroed_page(GFP_KERNEL);
@@ -159,10 +158,10 @@ static ssize_t lbs_sleepparams_read(struct file *file, char __user *userbuf,
goto out_unlock;
}
- pos += snprintf(buf, len, "%d %d %d %d %d %d\n", adapter->sp.sp_error,
- adapter->sp.sp_offset, adapter->sp.sp_stabletime,
- adapter->sp.sp_calcontrol, adapter->sp.sp_extsleepclk,
- adapter->sp.sp_reserved);
+ pos += snprintf(buf, len, "%d %d %d %d %d %d\n", priv->sp.sp_error,
+ priv->sp.sp_offset, priv->sp.sp_stabletime,
+ priv->sp.sp_calcontrol, priv->sp.sp_extsleepclk,
+ priv->sp.sp_reserved);
res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
@@ -320,11 +319,11 @@ static ssize_t lbs_setuserscan(struct file *file,
lbs_parse_type(buf, count, scan_cfg);
lbs_scan_networks(priv, scan_cfg, 1);
- wait_event_interruptible(priv->adapter->cmd_pending,
- priv->adapter->surpriseremoved ||
- (!priv->adapter->cur_cmd && list_empty(&priv->adapter->cmdpendingq)));
+ wait_event_interruptible(priv->cmd_pending,
+ priv->surpriseremoved ||
+ (!priv->cur_cmd && list_empty(&priv->cmdpendingq)));
- if (priv->adapter->surpriseremoved)
+ if (priv->surpriseremoved)
goto out_scan_cfg;
memset(&wrqu, 0x00, sizeof(union iwreq_data));
@@ -619,7 +618,6 @@ static ssize_t lbs_rdmac_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct lbs_private *priv = file->private_data;
- struct lbs_adapter *adapter = priv->adapter;
struct lbs_offset_value offval;
ssize_t pos = 0;
int ret;
@@ -634,7 +632,7 @@ static ssize_t lbs_rdmac_read(struct file *file, char __user *userbuf,
CMD_OPTION_WAITFORRSP, 0, &offval);
mdelay(10);
pos += snprintf(buf+pos, len-pos, "MAC[0x%x] = 0x%08x\n",
- priv->mac_offset, adapter->offsetvalue.value);
+ priv->mac_offset, priv->offsetvalue.value);
ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
free_page(addr);
@@ -702,7 +700,6 @@ static ssize_t lbs_rdbbp_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct lbs_private *priv = file->private_data;
- struct lbs_adapter *adapter = priv->adapter;
struct lbs_offset_value offval;
ssize_t pos = 0;
int ret;
@@ -717,7 +714,7 @@ static ssize_t lbs_rdbbp_read(struct file *file, char __user *userbuf,
CMD_OPTION_WAITFORRSP, 0, &offval);
mdelay(10);
pos += snprintf(buf+pos, len-pos, "BBP[0x%x] = 0x%08x\n",
- priv->bbp_offset, adapter->offsetvalue.value);
+ priv->bbp_offset, priv->offsetvalue.value);
ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
free_page(addr);
@@ -786,7 +783,6 @@ static ssize_t lbs_rdrf_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct lbs_private *priv = file->private_data;
- struct lbs_adapter *adapter = priv->adapter;
struct lbs_offset_value offval;
ssize_t pos = 0;
int ret;
@@ -801,7 +797,7 @@ static ssize_t lbs_rdrf_read(struct file *file, char __user *userbuf,
CMD_OPTION_WAITFORRSP, 0, &offval);
mdelay(10);
pos += snprintf(buf+pos, len-pos, "RF[0x%x] = 0x%08x\n",
- priv->rf_offset, adapter->offsetvalue.value);
+ priv->rf_offset, priv->offsetvalue.value);
ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
free_page(addr);
@@ -1008,8 +1004,8 @@ void lbs_debugfs_remove_one(struct lbs_private *priv)
#ifdef PROC_DEBUG
-#define item_size(n) (FIELD_SIZEOF(struct lbs_adapter, n))
-#define item_addr(n) (offsetof(struct lbs_adapter, n))
+#define item_size(n) (FIELD_SIZEOF(struct lbs_private, n))
+#define item_addr(n) (offsetof(struct lbs_private, n))
struct debug_data {
@@ -1018,7 +1014,7 @@ struct debug_data {
size_t addr;
};
-/* To debug any member of struct lbs_adapter, simply add one line here.
+/* To debug any member of struct lbs_private, simply add one line here.
*/
static struct debug_data items[] = {
{"intcounter", item_size(intcounter), item_addr(intcounter)},
@@ -1157,7 +1153,7 @@ static void lbs_debug_init(struct lbs_private *priv, struct net_device *dev)
return;
for (i = 0; i < num_of_items; i++)
- items[i].addr += (size_t) priv->adapter;
+ items[i].addr += (size_t) priv;
priv->debugfs_debug = debugfs_create_file("debug", 0644,
priv->debugfs_dir, &items[0],
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 1a8fdaa..e255b19 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -12,7 +12,6 @@
/** Function Prototype Declaration */
struct lbs_private;
-struct lbs_adapter;
struct sk_buff;
struct net_device;
struct cmd_ctrl_node;
@@ -32,7 +31,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_action,
u16 wait_option, u32 cmd_oid, void *pdata_buf);
-void lbs_queue_cmd(struct lbs_adapter *adapter,
+void lbs_queue_cmd(struct lbs_private *priv,
struct cmd_ctrl_node *cmdnode,
u8 addtail);
@@ -43,7 +42,7 @@ void lbs_interrupt(struct net_device *);
int lbs_set_radio_control(struct lbs_private *priv);
u32 lbs_fw_index_to_data_rate(u8 index);
u8 lbs_data_rate_to_fw_index(u32 rate);
-void lbs_get_fwversion(struct lbs_adapter *adapter,
+void lbs_get_fwversion(struct lbs_private *priv,
char *fwversion,
int maxlen);
@@ -66,7 +65,7 @@ void lbs_ps_wakeup(struct lbs_private *priv, int wait_option);
void lbs_tx_runqueue(struct lbs_private *priv);
struct chan_freq_power *lbs_find_cfp_by_band_and_channel(
- struct lbs_adapter *adapter,
+ struct lbs_private *priv,
u8 band,
u16 channel);
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index eaa45d4..21b0d38 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -1,7 +1,7 @@
/**
* This file contains definitions and data structures specific
* to Marvell 802.11 NIC. It contains the Device Information
- * structure struct lbs_adapter.
+ * structure struct lbs_private..
*/
#ifndef _LBS_DEV_H_
#define _LBS_DEV_H_
@@ -109,7 +109,6 @@ struct lbs_private {
char name[DEV_NAME_LEN];
void *card;
- struct lbs_adapter *adapter;
struct net_device *dev;
struct net_device_stats stats;
@@ -156,54 +155,10 @@ struct lbs_private {
int (*hw_host_to_card) (struct lbs_private *priv, u8 type, u8 *payload, u16 nb);
int (*hw_get_int_status) (struct lbs_private *priv, u8 *);
int (*hw_read_event_cause) (struct lbs_private *);
-};
-
-/** Association request
- *
- * Encapsulates all the options that describe a specific assocation request
- * or configuration of the wireless card's radio, mode, and security settings.
- */
-struct assoc_request {
-#define ASSOC_FLAG_SSID 1
-#define ASSOC_FLAG_CHANNEL 2
-#define ASSOC_FLAG_BAND 3
-#define ASSOC_FLAG_MODE 4
-#define ASSOC_FLAG_BSSID 5
-#define ASSOC_FLAG_WEP_KEYS 6
-#define ASSOC_FLAG_WEP_TX_KEYIDX 7
-#define ASSOC_FLAG_WPA_MCAST_KEY 8
-#define ASSOC_FLAG_WPA_UCAST_KEY 9
-#define ASSOC_FLAG_SECINFO 10
-#define ASSOC_FLAG_WPA_IE 11
- unsigned long flags;
-
- u8 ssid[IW_ESSID_MAX_SIZE + 1];
- u8 ssid_len;
- u8 channel;
- u8 band;
- u8 mode;
- u8 bssid[ETH_ALEN];
-
- /** WEP keys */
- struct enc_key wep_keys[4];
- u16 wep_tx_keyidx;
-
- /** WPA keys */
- struct enc_key wpa_mcast_key;
- struct enc_key wpa_unicast_key;
-
- struct lbs_802_11_security secinfo;
- /** WPA Information Elements*/
- u8 wpa_ie[MAX_WPA_IE_LEN];
- u8 wpa_ie_len;
-
- /* BSS to associate with for infrastructure of Ad-Hoc join */
- struct bss_descriptor bss;
-};
+ /* was struct lbs_adapter from here... */
-/** Wlan adapter data structure*/
-struct lbs_adapter {
+ /** Wlan adapter data structure*/
/** STATUS variables */
u8 fwreleasenumber[4];
u32 fwcapinfo;
@@ -229,7 +184,7 @@ struct lbs_adapter {
struct list_head cmdpendingq;
wait_queue_head_t cmd_pending;
- /* command related variables protected by adapter->driver_lock */
+ /* command related variables protected by priv->driver_lock */
/** Async and Sync Event variables */
u32 intcounter;
@@ -366,4 +321,48 @@ struct lbs_adapter {
u8 fw_ready;
};
+/** Association request
+ *
+ * Encapsulates all the options that describe a specific assocation request
+ * or configuration of the wireless card's radio, mode, and security settings.
+ */
+struct assoc_request {
+#define ASSOC_FLAG_SSID 1
+#define ASSOC_FLAG_CHANNEL 2
+#define ASSOC_FLAG_BAND 3
+#define ASSOC_FLAG_MODE 4
+#define ASSOC_FLAG_BSSID 5
+#define ASSOC_FLAG_WEP_KEYS 6
+#define ASSOC_FLAG_WEP_TX_KEYIDX 7
+#define ASSOC_FLAG_WPA_MCAST_KEY 8
+#define ASSOC_FLAG_WPA_UCAST_KEY 9
+#define ASSOC_FLAG_SECINFO 10
+#define ASSOC_FLAG_WPA_IE 11
+ unsigned long flags;
+
+ u8 ssid[IW_ESSID_MAX_SIZE + 1];
+ u8 ssid_len;
+ u8 channel;
+ u8 band;
+ u8 mode;
+ u8 bssid[ETH_ALEN];
+
+ /** WEP keys */
+ struct enc_key wep_keys[4];
+ u16 wep_tx_keyidx;
+
+ /** WPA keys */
+ struct enc_key wpa_mcast_key;
+ struct enc_key wpa_unicast_key;
+
+ struct lbs_802_11_security secinfo;
+
+ /** WPA Information Elements*/
+ u8 wpa_ie[MAX_WPA_IE_LEN];
+ u8 wpa_ie_len;
+
+ /* BSS to associate with for infrastructure of Ad-Hoc join */
+ struct bss_descriptor bss;
+};
+
#endif
diff --git a/drivers/net/wireless/libertas/ethtool.c b/drivers/net/wireless/libertas/ethtool.c
index f32fb00..a54b4f4 100644
--- a/drivers/net/wireless/libertas/ethtool.c
+++ b/drivers/net/wireless/libertas/ethtool.c
@@ -25,7 +25,7 @@ static void lbs_ethtool_get_drvinfo(struct net_device *dev,
struct lbs_private *priv = (struct lbs_private *) dev->priv;
char fwver[32];
- lbs_get_fwversion(priv->adapter, fwver, sizeof(fwver) - 1);
+ lbs_get_fwversion(priv, fwver, sizeof(fwver) - 1);
strcpy(info->driver, "libertas");
strcpy(info->version, lbs_driver_version);
@@ -46,7 +46,6 @@ static int lbs_ethtool_get_eeprom(struct net_device *dev,
struct ethtool_eeprom *eeprom, u8 * bytes)
{
struct lbs_private *priv = (struct lbs_private *) dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct lbs_ioctl_regrdwr regctrl;
char *ptr;
int ret;
@@ -60,10 +59,10 @@ static int lbs_ethtool_get_eeprom(struct net_device *dev,
// mutex_lock(&priv->mutex);
- adapter->prdeeprom = kmalloc(eeprom->len+sizeof(regctrl), GFP_KERNEL);
- if (!adapter->prdeeprom)
+ priv->prdeeprom = kmalloc(eeprom->len+sizeof(regctrl), GFP_KERNEL);
+ if (!priv->prdeeprom)
return -ENOMEM;
- memcpy(adapter->prdeeprom, ®ctrl, sizeof(regctrl));
+ memcpy(priv->prdeeprom, ®ctrl, sizeof(regctrl));
/* +14 is for action, offset, and NOB in
* response */
@@ -77,14 +76,14 @@ static int lbs_ethtool_get_eeprom(struct net_device *dev,
®ctrl);
if (ret) {
- if (adapter->prdeeprom)
- kfree(adapter->prdeeprom);
+ if (priv->prdeeprom)
+ kfree(priv->prdeeprom);
goto done;
}
mdelay(10);
- ptr = (char *)adapter->prdeeprom;
+ ptr = (char *)priv->prdeeprom;
/* skip the command header, but include the "value" u32 variable */
ptr = ptr + sizeof(struct lbs_ioctl_regrdwr) - 4;
@@ -94,8 +93,8 @@ static int lbs_ethtool_get_eeprom(struct net_device *dev,
*/
memcpy(bytes, ptr, eeprom->len);
- if (adapter->prdeeprom)
- kfree(adapter->prdeeprom);
+ if (priv->prdeeprom)
+ kfree(priv->prdeeprom);
// mutex_unlock(&priv->mutex);
ret = 0;
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 8508260..49a0178 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -255,7 +255,7 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
} else if (int_cause == 0xffff) {
/* Read in junk, the card has probably been removed */
- card->priv->adapter->surpriseremoved = 1;
+ card->priv->surpriseremoved = 1;
} else {
if (int_cause & IF_CS_H_IC_TX_OVER)
@@ -644,7 +644,6 @@ static int if_cs_host_to_card(struct lbs_private *priv,
static int if_cs_get_int_status(struct lbs_private *priv, u8 *ireg)
{
struct if_cs_card *card = (struct if_cs_card *)priv->card;
- /* struct lbs_adapter *adapter = priv->adapter; */
int ret = 0;
u16 int_cause;
u8 *cmdbuf;
@@ -652,7 +651,7 @@ static int if_cs_get_int_status(struct lbs_private *priv, u8 *ireg)
lbs_deb_enter(LBS_DEB_CS);
- if (priv->adapter->surpriseremoved)
+ if (priv->surpriseremoved)
goto out;
int_cause = if_cs_read16(card, IF_CS_C_INT_CAUSE) & IF_CS_C_IC_MASK;
@@ -678,22 +677,22 @@ sbi_get_int_status_exit:
/* Card has a command result for us */
if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) {
- spin_lock(&priv->adapter->driver_lock);
- if (!priv->adapter->cur_cmd) {
+ spin_lock(&priv->driver_lock);
+ if (!priv->cur_cmd) {
cmdbuf = priv->upld_buf;
- priv->adapter->hisregcpy &= ~IF_CS_C_S_RX_UPLD_RDY;
+ priv->hisregcpy &= ~IF_CS_C_S_RX_UPLD_RDY;
} else {
- cmdbuf = priv->adapter->cur_cmd->bufvirtualaddr;
+ cmdbuf = priv->cur_cmd->bufvirtualaddr;
}
ret = if_cs_receive_cmdres(priv, cmdbuf, &priv->upld_len);
- spin_unlock(&priv->adapter->driver_lock);
+ spin_unlock(&priv->driver_lock);
if (ret < 0)
lbs_pr_err("could not receive cmd from card\n");
}
out:
- lbs_deb_leave_args(LBS_DEB_CS, "ret %d, ireg 0x%x, hisregcpy 0x%x", ret, *ireg, priv->adapter->hisregcpy);
+ lbs_deb_leave_args(LBS_DEB_CS, "ret %d, ireg 0x%x, hisregcpy 0x%x", ret, *ireg, priv->hisregcpy);
return ret;
}
@@ -702,7 +701,7 @@ static int if_cs_read_event_cause(struct lbs_private *priv)
{
lbs_deb_enter(LBS_DEB_CS);
- priv->adapter->eventcause = (if_cs_read16(priv->card, IF_CS_C_STATUS) & IF_CS_C_S_STATUS_MASK) >> 5;
+ priv->eventcause = (if_cs_read16(priv->card, IF_CS_C_STATUS) & IF_CS_C_S_STATUS_MASK) >> 5;
if_cs_write16(priv->card, IF_CS_H_INT_CAUSE, IF_CS_H_IC_HOST_EVENT);
return 0;
@@ -869,7 +868,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
priv->hw_get_int_status = if_cs_get_int_status;
priv->hw_read_event_cause = if_cs_read_event_cause;
- priv->adapter->fw_ready = 1;
+ priv->fw_ready = 1;
/* Now actually get the IRQ */
ret = request_irq(p_dev->irq.AssignedIRQ, if_cs_interrupt,
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 6f5a517..6456613 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -134,9 +134,9 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,
lbs_deb_enter(LBS_DEB_SDIO);
- spin_lock_irqsave(&card->priv->adapter->driver_lock, flags);
+ spin_lock_irqsave(&card->priv->driver_lock, flags);
- if (!card->priv->adapter->cur_cmd) {
+ if (!card->priv->cur_cmd) {
lbs_deb_sdio("discarding spurious response\n");
ret = 0;
goto out;
@@ -149,7 +149,7 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,
goto out;
}
- memcpy(card->priv->adapter->cur_cmd->bufvirtualaddr, buffer, size);
+ memcpy(card->priv->cur_cmd->bufvirtualaddr, buffer, size);
card->priv->upld_len = size;
card->int_cause |= MRVDRV_CMD_UPLD_RDY;
@@ -159,7 +159,7 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,
ret = 0;
out:
- spin_unlock_irqrestore(&card->priv->adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&card->priv->driver_lock, flags);
lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
@@ -231,14 +231,14 @@ static int if_sdio_handle_event(struct if_sdio_card *card,
event <<= SBI_EVENT_CAUSE_SHIFT;
}
- spin_lock_irqsave(&card->priv->adapter->driver_lock, flags);
+ spin_lock_irqsave(&card->priv->driver_lock, flags);
card->event = event;
card->int_cause |= MRVDRV_CARDEVENT;
lbs_interrupt(card->priv->dev);
- spin_unlock_irqrestore(&card->priv->adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&card->priv->driver_lock, flags);
ret = 0;
@@ -800,7 +800,7 @@ static int if_sdio_read_event_cause(struct lbs_private *priv)
card = priv->card;
- priv->adapter->eventcause = card->event;
+ priv->eventcause = card->event;
lbs_deb_leave(LBS_DEB_SDIO);
@@ -958,7 +958,7 @@ static int if_sdio_probe(struct sdio_func *func,
priv->hw_get_int_status = if_sdio_get_int_status;
priv->hw_read_event_cause = if_sdio_read_event_cause;
- priv->adapter->fw_ready = 1;
+ priv->fw_ready = 1;
/*
* Enable interrupts now that everything is set up
@@ -981,7 +981,7 @@ out:
err_activate_card:
flush_scheduled_work();
free_netdev(priv->dev);
- kfree(priv->adapter);
+ kfree(priv);
reclaim:
sdio_claim_host(func);
release_int:
@@ -1011,7 +1011,7 @@ static void if_sdio_remove(struct sdio_func *func)
card = sdio_get_drvdata(func);
- card->priv->adapter->surpriseremoved = 1;
+ card->priv->surpriseremoved = 1;
lbs_deb_sdio("call remove card\n");
lbs_stop_card(card->priv);
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 7c4bd8d..87bed4a 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -229,7 +229,7 @@ static int if_usb_probe(struct usb_interface *intf,
/* Delay 200 ms to waiting for the FW ready */
if_usb_submit_rx_urb(cardp);
msleep_interruptible(200);
- priv->adapter->fw_ready = 1;
+ priv->fw_ready = 1;
if (lbs_start_card(priv))
goto err_start_card;
@@ -270,9 +270,8 @@ static void if_usb_disconnect(struct usb_interface *intf)
cardp->surprise_removed = 1;
if (priv) {
- struct lbs_adapter *adapter = priv->adapter;
- adapter->surpriseremoved = 1;
+ priv->surpriseremoved = 1;
lbs_stop_card(priv);
lbs_remove_mesh(priv);
lbs_remove_card(priv);
@@ -609,14 +608,14 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
if (!in_interrupt())
BUG();
- spin_lock(&priv->adapter->driver_lock);
+ spin_lock(&priv->driver_lock);
/* take care of cur_cmd = NULL case by reading the
* data to clear the interrupt */
- if (!priv->adapter->cur_cmd) {
+ if (!priv->cur_cmd) {
cmdbuf = priv->upld_buf;
- priv->adapter->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
+ priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
} else
- cmdbuf = priv->adapter->cur_cmd->bufvirtualaddr;
+ cmdbuf = priv->cur_cmd->bufvirtualaddr;
cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
@@ -625,7 +624,7 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
kfree_skb(skb);
lbs_interrupt(priv->dev);
- spin_unlock(&priv->adapter->driver_lock);
+ spin_unlock(&priv->driver_lock);
lbs_deb_usbd(&cardp->udev->dev,
"Wake up main thread to handle cmd response\n");
@@ -685,20 +684,20 @@ static void if_usb_receive(struct urb *urb)
case CMD_TYPE_INDICATION:
/* Event cause handling */
- spin_lock(&priv->adapter->driver_lock);
+ spin_lock(&priv->driver_lock);
cardp->usb_event_cause = le32_to_cpu(*(__le32 *) (recvbuff + MESSAGE_HEADER_LEN));
lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
cardp->usb_event_cause);
if (cardp->usb_event_cause & 0xffff0000) {
lbs_send_tx_feedback(priv);
- spin_unlock(&priv->adapter->driver_lock);
+ spin_unlock(&priv->driver_lock);
break;
}
cardp->usb_event_cause <<= 3;
cardp->usb_int_cause |= MRVDRV_CARDEVENT;
kfree_skb(skb);
lbs_interrupt(priv->dev);
- spin_unlock(&priv->adapter->driver_lock);
+ spin_unlock(&priv->driver_lock);
goto rx_exit;
default:
lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
@@ -750,7 +749,7 @@ static int if_usb_host_to_card(struct lbs_private *priv,
nb + MESSAGE_HEADER_LEN);
}
-/* called with adapter->driver_lock held */
+/* called with priv->driver_lock held */
static int if_usb_get_int_status(struct lbs_private *priv, u8 *ireg)
{
struct usb_card_rec *cardp = priv->card;
@@ -767,7 +766,7 @@ static int if_usb_read_event_cause(struct lbs_private *priv)
{
struct usb_card_rec *cardp = priv->card;
- priv->adapter->eventcause = cardp->usb_event_cause;
+ priv->eventcause = cardp->usb_event_cause;
/* Re-submit rx urb here to avoid event lost issue */
if_usb_submit_rx_urb(cardp);
return 0;
@@ -942,7 +941,7 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
lbs_deb_enter(LBS_DEB_USB);
- if (priv->adapter->psstate != PS_STATE_FULL_POWER)
+ if (priv->psstate != PS_STATE_FULL_POWER)
return -1;
if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
diff --git a/drivers/net/wireless/libertas/join.c b/drivers/net/wireless/libertas/join.c
index 1550e6a..14425d9 100644
--- a/drivers/net/wireless/libertas/join.c
+++ b/drivers/net/wireless/libertas/join.c
@@ -30,13 +30,13 @@
* NOTE: Setting the MSB of the basic rates need to be taken
* care, either before or after calling this function
*
- * @param adapter A pointer to struct lbs_adapter structure
+ * @param priv A pointer to struct lbs_private structure
* @param rate1 the buffer which keeps input and output
* @param rate1_size the size of rate1 buffer; new size of buffer on return
*
* @return 0 or -1
*/
-static int get_common_rates(struct lbs_adapter *adapter,
+static int get_common_rates(struct lbs_private *priv,
u8 *rates,
u16 *rates_size)
{
@@ -57,15 +57,15 @@ static int get_common_rates(struct lbs_adapter *adapter,
lbs_deb_hex(LBS_DEB_JOIN, "AP rates ", rates, *rates_size);
lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates, num_card_rates);
lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size);
- lbs_deb_join("TX data rate 0x%02x\n", adapter->cur_rate);
+ lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate);
- if (!adapter->auto_rate) {
+ if (!priv->auto_rate) {
for (i = 0; i < tmp_size; i++) {
- if (tmp[i] == adapter->cur_rate)
+ if (tmp[i] == priv->cur_rate)
goto done;
}
lbs_pr_alert("Previously set fixed data rate %#x isn't "
- "compatible with the network.\n", adapter->cur_rate);
+ "compatible with the network.\n", priv->cur_rate);
ret = -1;
goto done;
}
@@ -125,7 +125,6 @@ void lbs_unset_basic_rate_flags(u8 *rates, size_t len)
*/
int lbs_associate(struct lbs_private *priv, struct assoc_request *assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret;
lbs_deb_enter(LBS_DEB_ASSOC);
@@ -138,11 +137,11 @@ int lbs_associate(struct lbs_private *priv, struct assoc_request *assoc_req)
goto done;
/* set preamble to firmware */
- if ( (adapter->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
+ if ( (priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
&& (assoc_req->bss.capability & WLAN_CAPABILITY_SHORT_PREAMBLE))
- adapter->preamble = CMD_TYPE_SHORT_PREAMBLE;
+ priv->preamble = CMD_TYPE_SHORT_PREAMBLE;
else
- adapter->preamble = CMD_TYPE_LONG_PREAMBLE;
+ priv->preamble = CMD_TYPE_LONG_PREAMBLE;
lbs_set_radio_control(priv);
@@ -164,17 +163,16 @@ done:
int lbs_start_adhoc_network(struct lbs_private *priv,
struct assoc_request *assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
- adapter->adhoccreate = 1;
+ priv->adhoccreate = 1;
- if (adapter->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) {
+ if (priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) {
lbs_deb_join("AdhocStart: Short preamble\n");
- adapter->preamble = CMD_TYPE_SHORT_PREAMBLE;
+ priv->preamble = CMD_TYPE_SHORT_PREAMBLE;
} else {
lbs_deb_join("AdhocStart: Long preamble\n");
- adapter->preamble = CMD_TYPE_LONG_PREAMBLE;
+ priv->preamble = CMD_TYPE_LONG_PREAMBLE;
}
lbs_set_radio_control(priv);
@@ -200,26 +198,25 @@ int lbs_start_adhoc_network(struct lbs_private *priv,
int lbs_join_adhoc_network(struct lbs_private *priv,
struct assoc_request *assoc_req)
{
- struct lbs_adapter *adapter = priv->adapter;
struct bss_descriptor * bss = &assoc_req->bss;
int ret = 0;
lbs_deb_join("%s: Current SSID '%s', ssid length %u\n",
__func__,
- escape_essid(adapter->curbssparams.ssid,
- adapter->curbssparams.ssid_len),
- adapter->curbssparams.ssid_len);
+ escape_essid(priv->curbssparams.ssid,
+ priv->curbssparams.ssid_len),
+ priv->curbssparams.ssid_len);
lbs_deb_join("%s: requested ssid '%s', ssid length %u\n",
__func__, escape_essid(bss->ssid, bss->ssid_len),
bss->ssid_len);
/* check if the requested SSID is already joined */
- if ( adapter->curbssparams.ssid_len
- && !lbs_ssid_cmp(adapter->curbssparams.ssid,
- adapter->curbssparams.ssid_len,
+ if ( priv->curbssparams.ssid_len
+ && !lbs_ssid_cmp(priv->curbssparams.ssid,
+ priv->curbssparams.ssid_len,
bss->ssid, bss->ssid_len)
- && (adapter->mode == IW_MODE_ADHOC)
- && (adapter->connect_status == LBS_CONNECTED)) {
+ && (priv->mode == IW_MODE_ADHOC)
+ && (priv->connect_status == LBS_CONNECTED)) {
union iwreq_data wrqu;
lbs_deb_join("ADHOC_J_CMD: New ad-hoc SSID is the same as "
@@ -229,7 +226,7 @@ int lbs_join_adhoc_network(struct lbs_private *priv,
* request really was successful, even if just a null-op.
*/
memset(&wrqu, 0, sizeof(wrqu));
- memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid,
+ memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid,
ETH_ALEN);
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
@@ -239,12 +236,12 @@ int lbs_join_adhoc_network(struct lbs_private *priv,
/* Use shortpreamble only when both creator and card supports
short preamble */
if ( !(bss->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
- || !(adapter->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) {
+ || !(priv->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) {
lbs_deb_join("AdhocJoin: Long preamble\n");
- adapter->preamble = CMD_TYPE_LONG_PREAMBLE;
+ priv->preamble = CMD_TYPE_LONG_PREAMBLE;
} else {
lbs_deb_join("AdhocJoin: Short preamble\n");
- adapter->preamble = CMD_TYPE_SHORT_PREAMBLE;
+ priv->preamble = CMD_TYPE_SHORT_PREAMBLE;
}
lbs_set_radio_control(priv);
@@ -252,7 +249,7 @@ int lbs_join_adhoc_network(struct lbs_private *priv,
lbs_deb_join("AdhocJoin: channel = %d\n", assoc_req->channel);
lbs_deb_join("AdhocJoin: band = %c\n", assoc_req->band);
- adapter->adhoccreate = 0;
+ priv->adhoccreate = 0;
ret = lbs_prepare_and_send_command(priv, CMD_802_11_AD_HOC_JOIN,
0, CMD_OPTION_WAITFORRSP,
@@ -293,7 +290,6 @@ int lbs_cmd_80211_authenticate(struct lbs_private *priv,
struct cmd_ds_command *cmd,
void *pdata_buf)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_authenticate *pauthenticate = &cmd->params.auth;
int ret = -1;
u8 *bssid = pdata_buf;
@@ -306,7 +302,7 @@ int lbs_cmd_80211_authenticate(struct lbs_private *priv,
+ S_DS_GEN);
/* translate auth mode to 802.11 defined wire value */
- switch (adapter->secinfo.auth_mode) {
+ switch (priv->secinfo.auth_mode) {
case IW_AUTH_ALG_OPEN_SYSTEM:
pauthenticate->authtype = 0x00;
break;
@@ -318,7 +314,7 @@ int lbs_cmd_80211_authenticate(struct lbs_private *priv,
break;
default:
lbs_deb_join("AUTH_CMD: invalid auth alg 0x%X\n",
- adapter->secinfo.auth_mode);
+ priv->secinfo.auth_mode);
goto out;
}
@@ -336,7 +332,6 @@ out:
int lbs_cmd_80211_deauthenticate(struct lbs_private *priv,
struct cmd_ds_command *cmd)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_deauthenticate *dauth = &cmd->params.deauth;
lbs_deb_enter(LBS_DEB_JOIN);
@@ -346,7 +341,7 @@ int lbs_cmd_80211_deauthenticate(struct lbs_private *priv,
S_DS_GEN);
/* set AP MAC address */
- memmove(dauth->macaddr, adapter->curbssparams.bssid, ETH_ALEN);
+ memmove(dauth->macaddr, priv->curbssparams.bssid, ETH_ALEN);
/* Reason code 3 = Station is leaving */
#define REASON_CODE_STA_LEAVING 3
@@ -359,7 +354,6 @@ int lbs_cmd_80211_deauthenticate(struct lbs_private *priv,
int lbs_cmd_80211_associate(struct lbs_private *priv,
struct cmd_ds_command *cmd, void *pdata_buf)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_associate *passo = &cmd->params.associate;
int ret = 0;
struct assoc_request * assoc_req = pdata_buf;
@@ -376,7 +370,7 @@ int lbs_cmd_80211_associate(struct lbs_private *priv,
pos = (u8 *) passo;
- if (!adapter) {
+ if (!priv) {
ret = -1;
goto done;
}
@@ -420,7 +414,7 @@ int lbs_cmd_80211_associate(struct lbs_private *priv,
rates->header.type = cpu_to_le16(TLV_TYPE_RATES);
memcpy(&rates->rates, &bss->rates, MAX_RATES);
tmplen = MAX_RATES;
- if (get_common_rates(adapter, rates->rates, &tmplen)) {
+ if (get_common_rates(priv, rates->rates, &tmplen)) {
ret = -1;
goto done;
}
@@ -429,8 +423,8 @@ int lbs_cmd_80211_associate(struct lbs_private *priv,
lbs_deb_assoc("ASSOC_CMD: num rates %u\n", tmplen);
/* Copy the infra. association rates into Current BSS state structure */
- memset(&adapter->curbssparams.rates, 0, sizeof(adapter->curbssparams.rates));
- memcpy(&adapter->curbssparams.rates, &rates->rates, tmplen);
+ memset(&priv->curbssparams.rates, 0, sizeof(priv->curbssparams.rates));
+ memcpy(&priv->curbssparams.rates, &rates->rates, tmplen);
/* Set MSB on basic rates as the firmware requires, but _after_
* copying to current bss rates.
@@ -450,7 +444,7 @@ int lbs_cmd_80211_associate(struct lbs_private *priv,
}
/* update curbssparams */
- adapter->curbssparams.channel = bss->phyparamset.dsparamset.currentchan;
+ priv->curbssparams.channel = bss->phyparamset.dsparamset.currentchan;
if (lbs_parse_dnld_countryinfo_11d(priv, bss)) {
ret = -1;
@@ -474,7 +468,6 @@ done:
int lbs_cmd_80211_ad_hoc_start(struct lbs_private *priv,
struct cmd_ds_command *cmd, void *pdata_buf)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_ad_hoc_start *adhs = &cmd->params.ads;
int ret = 0;
int cmdappendsize = 0;
@@ -484,7 +477,7 @@ int lbs_cmd_80211_ad_hoc_start(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_JOIN);
- if (!adapter) {
+ if (!priv) {
ret = -1;
goto done;
}
@@ -494,7 +487,7 @@ int lbs_cmd_80211_ad_hoc_start(struct lbs_private *priv,
/*
* Fill in the parameters for 2 data structures:
* 1. cmd_ds_802_11_ad_hoc_start command
- * 2. adapter->scantable[i]
+ * 2. priv->scantable[i]
*
* Driver will fill up SSID, bsstype,IBSS param, Physical Param,
* probe delay, and cap info.
@@ -512,10 +505,10 @@ int lbs_cmd_80211_ad_hoc_start(struct lbs_private *priv,
/* set the BSS type */
adhs->bsstype = CMD_BSS_TYPE_IBSS;
- adapter->mode = IW_MODE_ADHOC;
- if (adapter->beacon_period == 0)
- adapter->beacon_period = MRVDRV_BEACON_INTERVAL;
- adhs->beaconperiod = cpu_to_le16(adapter->beacon_period);
+ priv->mode = IW_MODE_ADHOC;
+ if (priv->beacon_period == 0)
+ priv->beacon_period = MRVDRV_BEACON_INTERVAL;
+ adhs->beaconperiod = cpu_to_le16(priv->beacon_period);
/* set Physical param set */
#define DS_PARA_IE_ID 3
@@ -557,8 +550,8 @@ int lbs_cmd_80211_ad_hoc_start(struct lbs_private *priv,
memcpy(adhs->rates, lbs_bg_rates, ratesize);
/* Copy the ad-hoc creating rates into Current BSS state structure */
- memset(&adapter->curbssparams.rates, 0, sizeof(adapter->curbssparams.rates));
- memcpy(&adapter->curbssparams.rates, &adhs->rates, ratesize);
+ memset(&priv->curbssparams.rates, 0, sizeof(priv->curbssparams.rates));
+ memcpy(&priv->curbssparams.rates, &adhs->rates, ratesize);
/* Set MSB on basic rates as the firmware requires, but _after_
* copying to current bss rates.
@@ -597,7 +590,6 @@ int lbs_cmd_80211_ad_hoc_stop(struct lbs_private *priv,
int lbs_cmd_80211_ad_hoc_join(struct lbs_private *priv,
struct cmd_ds_command *cmd, void *pdata_buf)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_ad_hoc_join *join_cmd = &cmd->params.adj;
struct assoc_request * assoc_req = pdata_buf;
struct bss_descriptor *bss = &assoc_req->bss;
@@ -638,21 +630,21 @@ int lbs_cmd_80211_ad_hoc_join(struct lbs_private *priv,
/* probedelay */
join_cmd->probedelay = cpu_to_le16(CMD_SCAN_PROBE_DELAY_TIME);
- adapter->curbssparams.channel = bss->channel;
+ priv->curbssparams.channel = bss->channel;
/* Copy Data rates from the rates recorded in scan response */
memset(join_cmd->bss.rates, 0, sizeof(join_cmd->bss.rates));
ratesize = min_t(u16, sizeof(join_cmd->bss.rates), MAX_RATES);
memcpy(join_cmd->bss.rates, bss->rates, ratesize);
- if (get_common_rates(adapter, join_cmd->bss.rates, &ratesize)) {
+ if (get_common_rates(priv, join_cmd->bss.rates, &ratesize)) {
lbs_deb_join("ADHOC_J_CMD: get_common_rates returns error.\n");
ret = -1;
goto done;
}
/* Copy the ad-hoc creating rates into Current BSS state structure */
- memset(&adapter->curbssparams.rates, 0, sizeof(adapter->curbssparams.rates));
- memcpy(&adapter->curbssparams.rates, join_cmd->bss.rates, ratesize);
+ memset(&priv->curbssparams.rates, 0, sizeof(priv->curbssparams.rates));
+ memcpy(&priv->curbssparams.rates, join_cmd->bss.rates, ratesize);
/* Set MSB on basic rates as the firmware requires, but _after_
* copying to current bss rates.
@@ -668,7 +660,7 @@ int lbs_cmd_80211_ad_hoc_join(struct lbs_private *priv,
join_cmd->bss.capability = cpu_to_le16(tmp);
}
- if (adapter->psmode == LBS802_11POWERMODEMAX_PSP) {
+ if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
/* wake up first */
__le32 Localpsmode;
@@ -700,7 +692,6 @@ done:
int lbs_ret_80211_associate(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
union iwreq_data wrqu;
struct ieeetypes_assocrsp *passocrsp;
@@ -709,12 +700,12 @@ int lbs_ret_80211_associate(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_ASSOC);
- if (!adapter->in_progress_assoc_req) {
+ if (!priv->in_progress_assoc_req) {
lbs_deb_assoc("ASSOC_RESP: no in-progress assoc request\n");
ret = -1;
goto done;
}
- bss = &adapter->in_progress_assoc_req->bss;
+ bss = &priv->in_progress_assoc_req->bss;
passocrsp = (struct ieeetypes_assocrsp *) & resp->params;
@@ -771,29 +762,29 @@ int lbs_ret_80211_associate(struct lbs_private *priv,
le16_to_cpu(resp->size) - S_DS_GEN);
/* Send a Media Connected event, according to the Spec */
- adapter->connect_status = LBS_CONNECTED;
+ priv->connect_status = LBS_CONNECTED;
/* Update current SSID and BSSID */
- memcpy(&adapter->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE);
- adapter->curbssparams.ssid_len = bss->ssid_len;
- memcpy(adapter->curbssparams.bssid, bss->bssid, ETH_ALEN);
+ memcpy(&priv->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE);
+ priv->curbssparams.ssid_len = bss->ssid_len;
+ memcpy(priv->curbssparams.bssid, bss->bssid, ETH_ALEN);
lbs_deb_assoc("ASSOC_RESP: currentpacketfilter is 0x%x\n",
- adapter->currentpacketfilter);
+ priv->currentpacketfilter);
- adapter->SNR[TYPE_RXPD][TYPE_AVG] = 0;
- adapter->NF[TYPE_RXPD][TYPE_AVG] = 0;
+ priv->SNR[TYPE_RXPD][TYPE_AVG] = 0;
+ priv->NF[TYPE_RXPD][TYPE_AVG] = 0;
- memset(adapter->rawSNR, 0x00, sizeof(adapter->rawSNR));
- memset(adapter->rawNF, 0x00, sizeof(adapter->rawNF));
- adapter->nextSNRNF = 0;
- adapter->numSNRNF = 0;
+ memset(priv->rawSNR, 0x00, sizeof(priv->rawSNR));
+ memset(priv->rawNF, 0x00, sizeof(priv->rawNF));
+ priv->nextSNRNF = 0;
+ priv->numSNRNF = 0;
netif_carrier_on(priv->dev);
netif_wake_queue(priv->dev);
- memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
+ memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid, ETH_ALEN);
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
@@ -816,7 +807,6 @@ int lbs_ret_80211_disassociate(struct lbs_private *priv,
int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
u16 command = le16_to_cpu(resp->command);
u16 result = le16_to_cpu(resp->result);
@@ -833,19 +823,19 @@ int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv,
lbs_deb_join("ADHOC_RESP: command = %x\n", command);
lbs_deb_join("ADHOC_RESP: result = %x\n", result);
- if (!adapter->in_progress_assoc_req) {
+ if (!priv->in_progress_assoc_req) {
lbs_deb_join("ADHOC_RESP: no in-progress association request\n");
ret = -1;
goto done;
}
- bss = &adapter->in_progress_assoc_req->bss;
+ bss = &priv->in_progress_assoc_req->bss;
/*
* Join result code 0 --> SUCCESS
*/
if (result) {
lbs_deb_join("ADHOC_RESP: failed\n");
- if (adapter->connect_status == LBS_CONNECTED) {
+ if (priv->connect_status == LBS_CONNECTED) {
lbs_mac_event_disconnected(priv);
}
ret = -1;
@@ -860,7 +850,7 @@ int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv,
escape_essid(bss->ssid, bss->ssid_len));
/* Send a Media Connected event, according to the Spec */
- adapter->connect_status = LBS_CONNECTED;
+ priv->connect_status = LBS_CONNECTED;
if (command == CMD_RET(CMD_802_11_AD_HOC_START)) {
/* Update the created network descriptor with the new BSSID */
@@ -868,22 +858,22 @@ int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv,
}
/* Set the BSSID from the joined/started descriptor */
- memcpy(&adapter->curbssparams.bssid, bss->bssid, ETH_ALEN);
+ memcpy(&priv->curbssparams.bssid, bss->bssid, ETH_ALEN);
/* Set the new SSID to current SSID */
- memcpy(&adapter->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE);
- adapter->curbssparams.ssid_len = bss->ssid_len;
+ memcpy(&priv->curbssparams.ssid, &bss->ssid, IW_ESSID_MAX_SIZE);
+ priv->curbssparams.ssid_len = bss->ssid_len;
netif_carrier_on(priv->dev);
netif_wake_queue(priv->dev);
memset(&wrqu, 0, sizeof(wrqu));
- memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
+ memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid, ETH_ALEN);
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
lbs_deb_join("ADHOC_RESP: - Joined/Started Ad Hoc\n");
- lbs_deb_join("ADHOC_RESP: channel = %d\n", adapter->curbssparams.channel);
+ lbs_deb_join("ADHOC_RESP: channel = %d\n", priv->curbssparams.channel);
lbs_deb_join("ADHOC_RESP: BSSID = %s\n",
print_mac(mac, padhocresult->bssid));
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 7155f48..243cdea 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -257,8 +257,7 @@ static ssize_t lbs_rtap_get(struct device *dev,
struct device_attribute *attr, char * buf)
{
struct lbs_private *priv = to_net_dev(dev)->priv;
- struct lbs_adapter *adapter = priv->adapter;
- return snprintf(buf, 5, "0x%X\n", adapter->monitormode);
+ return snprintf(buf, 5, "0x%X\n", priv->monitormode);
}
/**
@@ -269,31 +268,30 @@ static ssize_t lbs_rtap_set(struct device *dev,
{
int monitor_mode;
struct lbs_private *priv = to_net_dev(dev)->priv;
- struct lbs_adapter *adapter = priv->adapter;
sscanf(buf, "%x", &monitor_mode);
if (monitor_mode != LBS_MONITOR_OFF) {
- if(adapter->monitormode == monitor_mode)
+ if(priv->monitormode == monitor_mode)
return strlen(buf);
- if (adapter->monitormode == LBS_MONITOR_OFF) {
- if (adapter->mode == IW_MODE_INFRA)
+ if (priv->monitormode == LBS_MONITOR_OFF) {
+ if (priv->mode == IW_MODE_INFRA)
lbs_send_deauthentication(priv);
- else if (adapter->mode == IW_MODE_ADHOC)
+ else if (priv->mode == IW_MODE_ADHOC)
lbs_stop_adhoc_network(priv);
lbs_add_rtap(priv);
}
- adapter->monitormode = monitor_mode;
+ priv->monitormode = monitor_mode;
}
else {
- if (adapter->monitormode == LBS_MONITOR_OFF)
+ if (priv->monitormode == LBS_MONITOR_OFF)
return strlen(buf);
- adapter->monitormode = LBS_MONITOR_OFF;
+ priv->monitormode = LBS_MONITOR_OFF;
lbs_remove_rtap(priv);
- if (adapter->currenttxskb) {
- dev_kfree_skb_any(adapter->currenttxskb);
- adapter->currenttxskb = NULL;
+ if (priv->currenttxskb) {
+ dev_kfree_skb_any(priv->currenttxskb);
+ priv->currenttxskb = NULL;
}
/* Wake queues, command thread, etc. */
@@ -302,7 +300,7 @@ static ssize_t lbs_rtap_set(struct device *dev,
lbs_prepare_and_send_command(priv,
CMD_802_11_MONITOR_MODE, CMD_ACT_SET,
- CMD_OPTION_WAITFORRSP, 0, &adapter->monitormode);
+ CMD_OPTION_WAITFORRSP, 0, &priv->monitormode);
return strlen(buf);
}
@@ -382,14 +380,13 @@ static struct attribute_group lbs_mesh_attr_group = {
static int pre_open_check(struct net_device *dev)
{
struct lbs_private *priv = (struct lbs_private *) dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int i = 0;
- while (!adapter->fw_ready && i < 20) {
+ while (!priv->fw_ready && i < 20) {
i++;
msleep_interruptible(100);
}
- if (!adapter->fw_ready) {
+ if (!priv->fw_ready) {
lbs_pr_err("firmware not ready\n");
return -1;
}
@@ -406,19 +403,18 @@ static int pre_open_check(struct net_device *dev)
static int lbs_dev_open(struct net_device *dev)
{
struct lbs_private *priv = (struct lbs_private *) dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_NET);
priv->open = 1;
- if (adapter->connect_status == LBS_CONNECTED)
+ if (priv->connect_status == LBS_CONNECTED)
netif_carrier_on(priv->dev);
else
netif_carrier_off(priv->dev);
if (priv->mesh_dev) {
- if (adapter->mesh_connect_status == LBS_CONNECTED)
+ if (priv->mesh_connect_status == LBS_CONNECTED)
netif_carrier_on(priv->mesh_dev);
else
netif_carrier_off(priv->mesh_dev);
@@ -442,7 +438,7 @@ static int lbs_mesh_open(struct net_device *dev)
priv->mesh_open = 1 ;
netif_wake_queue(priv->mesh_dev);
- priv->adapter->mesh_connect_status = LBS_CONNECTED;
+ priv->mesh_connect_status = LBS_CONNECTED;
netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
@@ -534,7 +530,7 @@ static int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
priv->stats.tx_dropped++;
goto done;
}
- if (priv->adapter->currenttxskb) {
+ if (priv->currenttxskb) {
lbs_pr_err("%s while TX skb pending\n", __func__);
priv->stats.tx_dropped++;
goto done;
@@ -562,7 +558,7 @@ static int lbs_mesh_pre_start_xmit(struct sk_buff *skb,
int ret;
lbs_deb_enter(LBS_DEB_MESH);
- if (priv->adapter->monitormode != LBS_MONITOR_OFF) {
+ if (priv->monitormode != LBS_MONITOR_OFF) {
netif_stop_queue(dev);
return -EOPNOTSUPP;
}
@@ -585,7 +581,7 @@ static int lbs_pre_start_xmit(struct sk_buff *skb, struct net_device *dev)
lbs_deb_enter(LBS_DEB_TX);
- if (priv->adapter->monitormode != LBS_MONITOR_OFF) {
+ if (priv->monitormode != LBS_MONITOR_OFF) {
netif_stop_queue(dev);
return -EOPNOTSUPP;
}
@@ -608,20 +604,20 @@ static void lbs_tx_timeout(struct net_device *dev)
priv->dnld_sent = DNLD_RES_RECEIVED;
dev->trans_start = jiffies;
- if (priv->adapter->currenttxskb) {
- if (priv->adapter->monitormode != LBS_MONITOR_OFF) {
+ if (priv->currenttxskb) {
+ if (priv->monitormode != LBS_MONITOR_OFF) {
/* If we are here, we have not received feedback from
the previous packet. Assume TX_FAIL and move on. */
- priv->adapter->eventcause = 0x01000000;
+ priv->eventcause = 0x01000000;
lbs_send_tx_feedback(priv);
} else
wake_up_interruptible(&priv->waitq);
} else if (dev == priv->dev) {
- if (priv->adapter->connect_status == LBS_CONNECTED)
+ if (priv->connect_status == LBS_CONNECTED)
netif_wake_queue(priv->dev);
} else if (dev == priv->mesh_dev) {
- if (priv->adapter->mesh_connect_status == LBS_CONNECTED)
+ if (priv->mesh_connect_status == LBS_CONNECTED)
netif_wake_queue(priv->mesh_dev);
}
@@ -630,23 +626,22 @@ static void lbs_tx_timeout(struct net_device *dev)
void lbs_host_to_card_done(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
priv->dnld_sent = DNLD_RES_RECEIVED;
/* Wake main thread if commands are pending */
- if (!adapter->cur_cmd)
+ if (!priv->cur_cmd)
wake_up_interruptible(&priv->waitq);
/* Don't wake netif queues if we're in monitor mode and
a TX packet is already pending. */
- if (priv->adapter->currenttxskb)
+ if (priv->currenttxskb)
return;
- if (priv->dev && adapter->connect_status == LBS_CONNECTED)
+ if (priv->dev && priv->connect_status == LBS_CONNECTED)
netif_wake_queue(priv->dev);
- if (priv->mesh_dev && adapter->mesh_connect_status == LBS_CONNECTED)
+ if (priv->mesh_dev && priv->mesh_connect_status == LBS_CONNECTED)
netif_wake_queue(priv->mesh_dev);
}
EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
@@ -668,7 +663,6 @@ static int lbs_set_mac_address(struct net_device *dev, void *addr)
{
int ret = 0;
struct lbs_private *priv = (struct lbs_private *) dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct sockaddr *phwaddr = addr;
lbs_deb_enter(LBS_DEB_NET);
@@ -676,13 +670,13 @@ static int lbs_set_mac_address(struct net_device *dev, void *addr)
/* In case it was called from the mesh device */
dev = priv->dev ;
- memset(adapter->current_addr, 0, ETH_ALEN);
+ memset(priv->current_addr, 0, ETH_ALEN);
/* dev->dev_addr is 8 bytes */
lbs_deb_hex(LBS_DEB_NET, "dev->dev_addr", dev->dev_addr, ETH_ALEN);
lbs_deb_hex(LBS_DEB_NET, "addr", phwaddr->sa_data, ETH_ALEN);
- memcpy(adapter->current_addr, phwaddr->sa_data, ETH_ALEN);
+ memcpy(priv->current_addr, phwaddr->sa_data, ETH_ALEN);
ret = lbs_prepare_and_send_command(priv, CMD_802_11_MAC_ADDRESS,
CMD_ACT_SET,
@@ -694,24 +688,24 @@ static int lbs_set_mac_address(struct net_device *dev, void *addr)
goto done;
}
- lbs_deb_hex(LBS_DEB_NET, "adapter->macaddr", adapter->current_addr, ETH_ALEN);
- memcpy(dev->dev_addr, adapter->current_addr, ETH_ALEN);
+ lbs_deb_hex(LBS_DEB_NET, "priv->macaddr", priv->current_addr, ETH_ALEN);
+ memcpy(dev->dev_addr, priv->current_addr, ETH_ALEN);
if (priv->mesh_dev)
- memcpy(priv->mesh_dev->dev_addr, adapter->current_addr, ETH_ALEN);
+ memcpy(priv->mesh_dev->dev_addr, priv->current_addr, ETH_ALEN);
done:
lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
return ret;
}
-static int lbs_copy_multicast_address(struct lbs_adapter *adapter,
+static int lbs_copy_multicast_address(struct lbs_private *priv,
struct net_device *dev)
{
int i = 0;
struct dev_mc_list *mcptr = dev->mc_list;
for (i = 0; i < dev->mc_count; i++) {
- memcpy(&adapter->multicastlist[i], mcptr->dmi_addr, ETH_ALEN);
+ memcpy(&priv->multicastlist[i], mcptr->dmi_addr, ETH_ALEN);
mcptr = mcptr->next;
}
@@ -722,50 +716,49 @@ static int lbs_copy_multicast_address(struct lbs_adapter *adapter,
static void lbs_set_multicast_list(struct net_device *dev)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int oldpacketfilter;
DECLARE_MAC_BUF(mac);
lbs_deb_enter(LBS_DEB_NET);
- oldpacketfilter = adapter->currentpacketfilter;
+ oldpacketfilter = priv->currentpacketfilter;
if (dev->flags & IFF_PROMISC) {
lbs_deb_net("enable promiscuous mode\n");
- adapter->currentpacketfilter |=
+ priv->currentpacketfilter |=
CMD_ACT_MAC_PROMISCUOUS_ENABLE;
- adapter->currentpacketfilter &=
+ priv->currentpacketfilter &=
~(CMD_ACT_MAC_ALL_MULTICAST_ENABLE |
CMD_ACT_MAC_MULTICAST_ENABLE);
} else {
/* Multicast */
- adapter->currentpacketfilter &=
+ priv->currentpacketfilter &=
~CMD_ACT_MAC_PROMISCUOUS_ENABLE;
if (dev->flags & IFF_ALLMULTI || dev->mc_count >
MRVDRV_MAX_MULTICAST_LIST_SIZE) {
lbs_deb_net( "enabling all multicast\n");
- adapter->currentpacketfilter |=
+ priv->currentpacketfilter |=
CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
- adapter->currentpacketfilter &=
+ priv->currentpacketfilter &=
~CMD_ACT_MAC_MULTICAST_ENABLE;
} else {
- adapter->currentpacketfilter &=
+ priv->currentpacketfilter &=
~CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
if (!dev->mc_count) {
lbs_deb_net("no multicast addresses, "
"disabling multicast\n");
- adapter->currentpacketfilter &=
+ priv->currentpacketfilter &=
~CMD_ACT_MAC_MULTICAST_ENABLE;
} else {
int i;
- adapter->currentpacketfilter |=
+ priv->currentpacketfilter |=
CMD_ACT_MAC_MULTICAST_ENABLE;
- adapter->nr_of_multicastmacaddr =
- lbs_copy_multicast_address(adapter, dev);
+ priv->nr_of_multicastmacaddr =
+ lbs_copy_multicast_address(priv, dev);
lbs_deb_net("multicast addresses: %d\n",
dev->mc_count);
@@ -773,7 +766,7 @@ static void lbs_set_multicast_list(struct net_device *dev)
for (i = 0; i < dev->mc_count; i++) {
lbs_deb_net("Multicast address %d:%s\n",
i, print_mac(mac,
- adapter->multicastlist[i]));
+ priv->multicastlist[i]));
}
/* send multicast addresses to firmware */
lbs_prepare_and_send_command(priv,
@@ -784,7 +777,7 @@ static void lbs_set_multicast_list(struct net_device *dev)
}
}
- if (adapter->currentpacketfilter != oldpacketfilter) {
+ if (priv->currentpacketfilter != oldpacketfilter) {
lbs_set_mac_packet_filter(priv);
}
@@ -803,7 +796,6 @@ static int lbs_thread(void *data)
{
struct net_device *dev = data;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
wait_queue_t wait;
u8 ireg = 0;
@@ -815,99 +807,99 @@ static int lbs_thread(void *data)
for (;;) {
lbs_deb_thread( "main-thread 111: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
- adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
+ priv->intcounter, priv->currenttxskb, priv->dnld_sent);
add_wait_queue(&priv->waitq, &wait);
set_current_state(TASK_INTERRUPTIBLE);
- spin_lock_irq(&adapter->driver_lock);
+ spin_lock_irq(&priv->driver_lock);
- if ((adapter->psstate == PS_STATE_SLEEP) ||
- (!adapter->intcounter && (priv->dnld_sent || adapter->cur_cmd || list_empty(&adapter->cmdpendingq)))) {
+ if ((priv->psstate == PS_STATE_SLEEP) ||
+ (!priv->intcounter && (priv->dnld_sent || priv->cur_cmd || list_empty(&priv->cmdpendingq)))) {
lbs_deb_thread("main-thread sleeping... Conn=%d IntC=%d PS_mode=%d PS_State=%d\n",
- adapter->connect_status, adapter->intcounter,
- adapter->psmode, adapter->psstate);
- spin_unlock_irq(&adapter->driver_lock);
+ priv->connect_status, priv->intcounter,
+ priv->psmode, priv->psstate);
+ spin_unlock_irq(&priv->driver_lock);
schedule();
} else
- spin_unlock_irq(&adapter->driver_lock);
+ spin_unlock_irq(&priv->driver_lock);
lbs_deb_thread("main-thread 222 (waking up): intcounter=%d currenttxskb=%p dnld_sent=%d\n",
- adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
+ priv->intcounter, priv->currenttxskb, priv->dnld_sent);
set_current_state(TASK_RUNNING);
remove_wait_queue(&priv->waitq, &wait);
try_to_freeze();
lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
- adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
+ priv->intcounter, priv->currenttxskb, priv->dnld_sent);
- if (kthread_should_stop() || adapter->surpriseremoved) {
+ if (kthread_should_stop() || priv->surpriseremoved) {
lbs_deb_thread("main-thread: break from main thread: surpriseremoved=0x%x\n",
- adapter->surpriseremoved);
+ priv->surpriseremoved);
break;
}
- spin_lock_irq(&adapter->driver_lock);
+ spin_lock_irq(&priv->driver_lock);
- if (adapter->intcounter) {
+ if (priv->intcounter) {
u8 int_status;
- adapter->intcounter = 0;
+ priv->intcounter = 0;
int_status = priv->hw_get_int_status(priv, &ireg);
if (int_status) {
lbs_deb_thread("main-thread: reading HOST_INT_STATUS_REG failed\n");
- spin_unlock_irq(&adapter->driver_lock);
+ spin_unlock_irq(&priv->driver_lock);
continue;
}
- adapter->hisregcpy |= ireg;
+ priv->hisregcpy |= ireg;
}
lbs_deb_thread("main-thread 444: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
- adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
+ priv->intcounter, priv->currenttxskb, priv->dnld_sent);
/* command response? */
- if (adapter->hisregcpy & MRVDRV_CMD_UPLD_RDY) {
+ if (priv->hisregcpy & MRVDRV_CMD_UPLD_RDY) {
lbs_deb_thread("main-thread: cmd response ready\n");
- adapter->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
- spin_unlock_irq(&adapter->driver_lock);
+ priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
+ spin_unlock_irq(&priv->driver_lock);
lbs_process_rx_command(priv);
- spin_lock_irq(&adapter->driver_lock);
+ spin_lock_irq(&priv->driver_lock);
}
/* Any Card Event */
- if (adapter->hisregcpy & MRVDRV_CARDEVENT) {
+ if (priv->hisregcpy & MRVDRV_CARDEVENT) {
lbs_deb_thread("main-thread: Card Event Activity\n");
- adapter->hisregcpy &= ~MRVDRV_CARDEVENT;
+ priv->hisregcpy &= ~MRVDRV_CARDEVENT;
if (priv->hw_read_event_cause(priv)) {
lbs_pr_alert("main-thread: hw_read_event_cause failed\n");
- spin_unlock_irq(&adapter->driver_lock);
+ spin_unlock_irq(&priv->driver_lock);
continue;
}
- spin_unlock_irq(&adapter->driver_lock);
+ spin_unlock_irq(&priv->driver_lock);
lbs_process_event(priv);
} else
- spin_unlock_irq(&adapter->driver_lock);
+ spin_unlock_irq(&priv->driver_lock);
/* Check if we need to confirm Sleep Request received previously */
- if (adapter->psstate == PS_STATE_PRE_SLEEP &&
- !priv->dnld_sent && !adapter->cur_cmd) {
- if (adapter->connect_status == LBS_CONNECTED) {
+ if (priv->psstate == PS_STATE_PRE_SLEEP &&
+ !priv->dnld_sent && !priv->cur_cmd) {
+ if (priv->connect_status == LBS_CONNECTED) {
lbs_deb_thread("main_thread: PRE_SLEEP--intcounter=%d currenttxskb=%p dnld_sent=%d cur_cmd=%p, confirm now\n",
- adapter->intcounter, adapter->currenttxskb, priv->dnld_sent, adapter->cur_cmd);
+ priv->intcounter, priv->currenttxskb, priv->dnld_sent, priv->cur_cmd);
- lbs_ps_confirm_sleep(priv, (u16) adapter->psmode);
+ lbs_ps_confirm_sleep(priv, (u16) priv->psmode);
} else {
/* workaround for firmware sending
* deauth/linkloss event immediately
* after sleep request; remove this
* after firmware fixes it
*/
- adapter->psstate = PS_STATE_AWAKE;
+ priv->psstate = PS_STATE_AWAKE;
lbs_pr_alert("main-thread: ignore PS_SleepConfirm in non-connected state\n");
}
}
@@ -915,25 +907,25 @@ static int lbs_thread(void *data)
/* The PS state is changed during processing of Sleep Request
* event above
*/
- if ((priv->adapter->psstate == PS_STATE_SLEEP) ||
- (priv->adapter->psstate == PS_STATE_PRE_SLEEP))
+ if ((priv->psstate == PS_STATE_SLEEP) ||
+ (priv->psstate == PS_STATE_PRE_SLEEP))
continue;
/* Execute the next command */
- if (!priv->dnld_sent && !priv->adapter->cur_cmd)
+ if (!priv->dnld_sent && !priv->cur_cmd)
lbs_execute_next_command(priv);
/* Wake-up command waiters which can't sleep in
* lbs_prepare_and_send_command
*/
- if (!list_empty(&adapter->cmdpendingq))
- wake_up_all(&adapter->cmd_pending);
+ if (!list_empty(&priv->cmdpendingq))
+ wake_up_all(&priv->cmd_pending);
lbs_tx_runqueue(priv);
}
- del_timer(&adapter->command_timer);
- wake_up_all(&adapter->cmd_pending);
+ del_timer(&priv->command_timer);
+ wake_up_all(&priv->cmd_pending);
lbs_deb_leave(LBS_DEB_THREAD);
return 0;
@@ -950,7 +942,6 @@ static int lbs_thread(void *data)
static int lbs_setup_firmware(struct lbs_private *priv)
{
int ret = -1;
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_mesh_access mesh_access;
lbs_deb_enter(LBS_DEB_FW);
@@ -958,7 +949,7 @@ static int lbs_setup_firmware(struct lbs_private *priv)
/*
* Read MAC address from HW
*/
- memset(adapter->current_addr, 0xff, ETH_ALEN);
+ memset(priv->current_addr, 0xff, ETH_ALEN);
ret = lbs_prepare_and_send_command(priv, CMD_GET_HW_SPEC,
0, CMD_OPTION_WAITFORRSP, 0, NULL);
@@ -1008,12 +999,11 @@ done:
static void command_timer_fn(unsigned long data)
{
struct lbs_private *priv = (struct lbs_private *)data;
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ctrl_node *ptempnode;
struct cmd_ds_command *cmd;
unsigned long flags;
- ptempnode = adapter->cur_cmd;
+ ptempnode = priv->cur_cmd;
if (ptempnode == NULL) {
lbs_deb_fw("ptempnode empty\n");
return;
@@ -1027,15 +1017,15 @@ static void command_timer_fn(unsigned long data)
lbs_deb_fw("command_timer_fn fired, cmd %x\n", cmd->command);
- if (!adapter->fw_ready)
+ if (!priv->fw_ready)
return;
- spin_lock_irqsave(&adapter->driver_lock, flags);
- adapter->cur_cmd = NULL;
- spin_unlock_irqrestore(&adapter->driver_lock, flags);
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ priv->cur_cmd = NULL;
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
lbs_deb_fw("re-sending same command because of timeout\n");
- lbs_queue_cmd(adapter, ptempnode, 0);
+ lbs_queue_cmd(priv, ptempnode, 0);
wake_up_interruptible(&priv->waitq);
@@ -1044,63 +1034,62 @@ static void command_timer_fn(unsigned long data)
static int lbs_init_adapter(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
size_t bufsize;
int i, ret = 0;
/* Allocate buffer to store the BSSID list */
bufsize = MAX_NETWORK_COUNT * sizeof(struct bss_descriptor);
- adapter->networks = kzalloc(bufsize, GFP_KERNEL);
- if (!adapter->networks) {
+ priv->networks = kzalloc(bufsize, GFP_KERNEL);
+ if (!priv->networks) {
lbs_pr_err("Out of memory allocating beacons\n");
ret = -1;
goto out;
}
/* Initialize scan result lists */
- INIT_LIST_HEAD(&adapter->network_free_list);
- INIT_LIST_HEAD(&adapter->network_list);
+ INIT_LIST_HEAD(&priv->network_free_list);
+ INIT_LIST_HEAD(&priv->network_list);
for (i = 0; i < MAX_NETWORK_COUNT; i++) {
- list_add_tail(&adapter->networks[i].list,
- &adapter->network_free_list);
+ list_add_tail(&priv->networks[i].list,
+ &priv->network_free_list);
}
- adapter->lbs_ps_confirm_sleep.seqnum = cpu_to_le16(++adapter->seqnum);
- adapter->lbs_ps_confirm_sleep.command =
+ priv->lbs_ps_confirm_sleep.seqnum = cpu_to_le16(++priv->seqnum);
+ priv->lbs_ps_confirm_sleep.command =
cpu_to_le16(CMD_802_11_PS_MODE);
- adapter->lbs_ps_confirm_sleep.size =
+ priv->lbs_ps_confirm_sleep.size =
cpu_to_le16(sizeof(struct PS_CMD_ConfirmSleep));
- adapter->lbs_ps_confirm_sleep.action =
+ priv->lbs_ps_confirm_sleep.action =
cpu_to_le16(CMD_SUBCMD_SLEEP_CONFIRMED);
- memset(adapter->current_addr, 0xff, ETH_ALEN);
+ memset(priv->current_addr, 0xff, ETH_ALEN);
- adapter->connect_status = LBS_DISCONNECTED;
- adapter->mesh_connect_status = LBS_DISCONNECTED;
- adapter->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM;
- adapter->mode = IW_MODE_INFRA;
- adapter->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL;
- adapter->currentpacketfilter = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
- adapter->radioon = RADIO_ON;
- adapter->auto_rate = 1;
- adapter->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
- adapter->psmode = LBS802_11POWERMODECAM;
- adapter->psstate = PS_STATE_FULL_POWER;
+ priv->connect_status = LBS_DISCONNECTED;
+ priv->mesh_connect_status = LBS_DISCONNECTED;
+ priv->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM;
+ priv->mode = IW_MODE_INFRA;
+ priv->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL;
+ priv->currentpacketfilter = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
+ priv->radioon = RADIO_ON;
+ priv->auto_rate = 1;
+ priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
+ priv->psmode = LBS802_11POWERMODECAM;
+ priv->psstate = PS_STATE_FULL_POWER;
- mutex_init(&adapter->lock);
+ mutex_init(&priv->lock);
- memset(&adapter->tx_queue_ps, 0, NR_TX_QUEUE*sizeof(struct sk_buff*));
- adapter->tx_queue_idx = 0;
- spin_lock_init(&adapter->txqueue_lock);
+ memset(&priv->tx_queue_ps, 0, NR_TX_QUEUE*sizeof(struct sk_buff*));
+ priv->tx_queue_idx = 0;
+ spin_lock_init(&priv->txqueue_lock);
- setup_timer(&adapter->command_timer, command_timer_fn,
+ setup_timer(&priv->command_timer, command_timer_fn,
(unsigned long)priv);
- INIT_LIST_HEAD(&adapter->cmdfreeq);
- INIT_LIST_HEAD(&adapter->cmdpendingq);
+ INIT_LIST_HEAD(&priv->cmdfreeq);
+ INIT_LIST_HEAD(&priv->cmdpendingq);
- spin_lock_init(&adapter->driver_lock);
- init_waitqueue_head(&adapter->cmd_pending);
+ spin_lock_init(&priv->driver_lock);
+ init_waitqueue_head(&priv->cmd_pending);
/* Allocate the command buffers */
if (lbs_allocate_cmd_buffer(priv)) {
@@ -1114,27 +1103,15 @@ out:
static void lbs_free_adapter(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
-
- if (!adapter) {
- lbs_deb_fw("why double free adapter?\n");
- return;
- }
-
lbs_deb_fw("free command buffer\n");
lbs_free_cmd_buffer(priv);
lbs_deb_fw("free command_timer\n");
- del_timer(&adapter->command_timer);
+ del_timer(&priv->command_timer);
lbs_deb_fw("free scan results table\n");
- kfree(adapter->networks);
- adapter->networks = NULL;
-
- /* Free the adapter object itself */
- lbs_deb_fw("free adapter\n");
- kfree(adapter);
- priv->adapter = NULL;
+ kfree(priv->networks);
+ priv->networks = NULL;
}
/**
@@ -1159,13 +1136,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
}
priv = dev->priv;
- /* allocate buffer for struct lbs_adapter */
- priv->adapter = kzalloc(sizeof(struct lbs_adapter), GFP_KERNEL);
- if (!priv->adapter) {
- lbs_pr_err("allocate buffer for struct lbs_adapter failed\n");
- goto err_kzalloc;
- }
-
if (lbs_init_adapter(priv)) {
lbs_pr_err("failed to initialize adapter structure.\n");
goto err_init_adapter;
@@ -1212,8 +1182,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
err_init_adapter:
lbs_free_adapter(priv);
-
-err_kzalloc:
free_netdev(dev);
priv = NULL;
@@ -1226,7 +1194,6 @@ EXPORT_SYMBOL_GPL(lbs_add_card);
int lbs_remove_card(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
struct net_device *dev = priv->dev;
union iwreq_data wrqu;
@@ -1241,8 +1208,8 @@ int lbs_remove_card(struct lbs_private *priv)
cancel_delayed_work(&priv->assoc_work);
destroy_workqueue(priv->work_thread);
- if (adapter->psmode == LBS802_11POWERMODEMAX_PSP) {
- adapter->psmode = LBS802_11POWERMODECAM;
+ if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
+ priv->psmode = LBS802_11POWERMODECAM;
lbs_ps_wakeup(priv, CMD_OPTION_WAITFORRSP);
}
@@ -1251,7 +1218,7 @@ int lbs_remove_card(struct lbs_private *priv)
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
/* Stop the thread servicing the interrupts */
- adapter->surpriseremoved = 1;
+ priv->surpriseremoved = 1;
kthread_stop(priv->main_thread);
lbs_free_adapter(priv);
@@ -1315,12 +1282,12 @@ int lbs_stop_card(struct lbs_private *priv)
lbs_debugfs_remove_one(priv);
/* Flush pending command nodes */
- spin_lock_irqsave(&priv->adapter->driver_lock, flags);
- list_for_each_entry(cmdnode, &priv->adapter->cmdpendingq, list) {
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
cmdnode->cmdwaitqwoken = 1;
wake_up_interruptible(&cmdnode->cmdwait_q);
}
- spin_unlock_irqrestore(&priv->adapter->driver_lock, flags);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
unregister_netdev(dev);
@@ -1452,7 +1419,6 @@ struct chan_freq_power *lbs_get_region_cfp_table(u8 region, u8 band, int *cfp_no
int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
int i = 0;
@@ -1461,22 +1427,22 @@ int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band)
lbs_deb_enter(LBS_DEB_MAIN);
- memset(adapter->region_channel, 0, sizeof(adapter->region_channel));
+ memset(priv->region_channel, 0, sizeof(priv->region_channel));
{
cfp = lbs_get_region_cfp_table(region, band, &cfp_no);
if (cfp != NULL) {
- adapter->region_channel[i].nrcfp = cfp_no;
- adapter->region_channel[i].CFP = cfp;
+ priv->region_channel[i].nrcfp = cfp_no;
+ priv->region_channel[i].CFP = cfp;
} else {
lbs_deb_main("wrong region code %#x in band B/G\n",
region);
ret = -1;
goto out;
}
- adapter->region_channel[i].valid = 1;
- adapter->region_channel[i].region = region;
- adapter->region_channel[i].band = band;
+ priv->region_channel[i].valid = 1;
+ priv->region_channel[i].region = region;
+ priv->region_channel[i].band = band;
i++;
}
out:
@@ -1499,12 +1465,12 @@ void lbs_interrupt(struct net_device *dev)
lbs_deb_enter(LBS_DEB_THREAD);
lbs_deb_thread("lbs_interrupt: intcounter=%d\n",
- priv->adapter->intcounter);
+ priv->intcounter);
- priv->adapter->intcounter++;
+ priv->intcounter++;
- if (priv->adapter->psstate == PS_STATE_SLEEP) {
- priv->adapter->psstate = PS_STATE_AWAKE;
+ if (priv->psstate == PS_STATE_SLEEP) {
+ priv->psstate = PS_STATE_AWAKE;
netif_wake_queue(dev);
if (priv->mesh_dev)
netif_wake_queue(priv->mesh_dev);
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c
index a252a8f..58e8311 100644
--- a/drivers/net/wireless/libertas/rx.c
+++ b/drivers/net/wireless/libertas/rx.c
@@ -48,12 +48,11 @@ static u8 lbs_getavgsnr(struct lbs_private *priv)
{
u8 i;
u16 temp = 0;
- struct lbs_adapter *adapter = priv->adapter;
- if (adapter->numSNRNF == 0)
+ if (priv->numSNRNF == 0)
return 0;
- for (i = 0; i < adapter->numSNRNF; i++)
- temp += adapter->rawSNR[i];
- return (u8) (temp / adapter->numSNRNF);
+ for (i = 0; i < priv->numSNRNF; i++)
+ temp += priv->rawSNR[i];
+ return (u8) (temp / priv->numSNRNF);
}
@@ -67,12 +66,11 @@ static u8 lbs_getavgnf(struct lbs_private *priv)
{
u8 i;
u16 temp = 0;
- struct lbs_adapter *adapter = priv->adapter;
- if (adapter->numSNRNF == 0)
+ if (priv->numSNRNF == 0)
return 0;
- for (i = 0; i < adapter->numSNRNF; i++)
- temp += adapter->rawNF[i];
- return (u8) (temp / adapter->numSNRNF);
+ for (i = 0; i < priv->numSNRNF; i++)
+ temp += priv->rawNF[i];
+ return (u8) (temp / priv->numSNRNF);
}
@@ -85,14 +83,13 @@ static u8 lbs_getavgnf(struct lbs_private *priv)
*/
static void lbs_save_rawSNRNF(struct lbs_private *priv, struct rxpd *p_rx_pd)
{
- struct lbs_adapter *adapter = priv->adapter;
- if (adapter->numSNRNF < DEFAULT_DATA_AVG_FACTOR)
- adapter->numSNRNF++;
- adapter->rawSNR[adapter->nextSNRNF] = p_rx_pd->snr;
- adapter->rawNF[adapter->nextSNRNF] = p_rx_pd->nf;
- adapter->nextSNRNF++;
- if (adapter->nextSNRNF >= DEFAULT_DATA_AVG_FACTOR)
- adapter->nextSNRNF = 0;
+ if (priv->numSNRNF < DEFAULT_DATA_AVG_FACTOR)
+ priv->numSNRNF++;
+ priv->rawSNR[priv->nextSNRNF] = p_rx_pd->snr;
+ priv->rawNF[priv->nextSNRNF] = p_rx_pd->nf;
+ priv->nextSNRNF++;
+ if (priv->nextSNRNF >= DEFAULT_DATA_AVG_FACTOR)
+ priv->nextSNRNF = 0;
return;
}
@@ -105,32 +102,31 @@ static void lbs_save_rawSNRNF(struct lbs_private *priv, struct rxpd *p_rx_pd)
*/
static void lbs_compute_rssi(struct lbs_private *priv, struct rxpd *p_rx_pd)
{
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_RX);
lbs_deb_rx("rxpd: SNR %d, NF %d\n", p_rx_pd->snr, p_rx_pd->nf);
lbs_deb_rx("before computing SNR: SNR-avg = %d, NF-avg = %d\n",
- adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
- adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
+ priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
+ priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
- adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->snr;
- adapter->NF[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->nf;
+ priv->SNR[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->snr;
+ priv->NF[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->nf;
lbs_save_rawSNRNF(priv, p_rx_pd);
- adapter->SNR[TYPE_RXPD][TYPE_AVG] = lbs_getavgsnr(priv) * AVG_SCALE;
- adapter->NF[TYPE_RXPD][TYPE_AVG] = lbs_getavgnf(priv) * AVG_SCALE;
+ priv->SNR[TYPE_RXPD][TYPE_AVG] = lbs_getavgsnr(priv) * AVG_SCALE;
+ priv->NF[TYPE_RXPD][TYPE_AVG] = lbs_getavgnf(priv) * AVG_SCALE;
lbs_deb_rx("after computing SNR: SNR-avg = %d, NF-avg = %d\n",
- adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
- adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
+ priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
+ priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
- adapter->RSSI[TYPE_RXPD][TYPE_NOAVG] =
- CAL_RSSI(adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
- adapter->NF[TYPE_RXPD][TYPE_NOAVG]);
+ priv->RSSI[TYPE_RXPD][TYPE_NOAVG] =
+ CAL_RSSI(priv->SNR[TYPE_RXPD][TYPE_NOAVG],
+ priv->NF[TYPE_RXPD][TYPE_NOAVG]);
- adapter->RSSI[TYPE_RXPD][TYPE_AVG] =
- CAL_RSSI(adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
- adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
+ priv->RSSI[TYPE_RXPD][TYPE_AVG] =
+ CAL_RSSI(priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
+ priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
lbs_deb_leave(LBS_DEB_RX);
}
@@ -139,7 +135,7 @@ void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb)
{
lbs_deb_rx("skb->data %p\n", skb->data);
- if (priv->adapter->monitormode != LBS_MONITOR_OFF) {
+ if (priv->monitormode != LBS_MONITOR_OFF) {
skb->protocol = eth_type_trans(skb, priv->rtap_net_dev);
} else {
if (priv->mesh_dev && IS_MESH_FRAME(skb))
@@ -161,7 +157,6 @@ void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb)
*/
int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
struct rxpackethdr *p_rx_pkt;
@@ -174,7 +169,7 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
lbs_deb_enter(LBS_DEB_RX);
- if (priv->adapter->monitormode != LBS_MONITOR_OFF)
+ if (priv->monitormode != LBS_MONITOR_OFF)
return process_rxed_802_11_packet(priv, skb);
p_rx_pkt = (struct rxpackethdr *) skb->data;
@@ -258,8 +253,8 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
/* Take the data rate from the rxpd structure
* only if the rate is auto
*/
- if (adapter->auto_rate)
- adapter->cur_rate = lbs_fw_index_to_data_rate(p_rx_pd->rx_rate);
+ if (priv->auto_rate)
+ priv->cur_rate = lbs_fw_index_to_data_rate(p_rx_pd->rx_rate);
lbs_compute_rssi(priv, p_rx_pd);
@@ -327,7 +322,6 @@ static u8 convert_mv_rate_to_radiotap(u8 rate)
static int process_rxed_802_11_packet(struct lbs_private *priv,
struct sk_buff *skb)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
struct rx80211packethdr *p_rx_pkt;
@@ -361,7 +355,7 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
skb->len, sizeof(struct rxpd), skb->len - sizeof(struct rxpd));
/* create the exported radio header */
- if (priv->adapter->monitormode == LBS_MONITOR_OFF) {
+ if (priv->monitormode == LBS_MONITOR_OFF) {
/* no radio header */
/* chop the rxpd */
skb_pull(skb, sizeof(struct rxpd));
@@ -410,8 +404,8 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
/* Take the data rate from the rxpd structure
* only if the rate is auto
*/
- if (adapter->auto_rate)
- adapter->cur_rate = lbs_fw_index_to_data_rate(prxpd->rx_rate);
+ if (priv->auto_rate)
+ priv->cur_rate = lbs_fw_index_to_data_rate(prxpd->rx_rate);
lbs_compute_rssi(priv, prxpd);
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c
index 90c1888..8b6ce61 100644
--- a/drivers/net/wireless/libertas/scan.c
+++ b/drivers/net/wireless/libertas/scan.c
@@ -190,13 +190,13 @@ static inline int is_same_network(struct bss_descriptor *src,
* 0 0 0 0 !=NONE 1 0 0 yes Dynamic WEP
*
*
- * @param adapter A pointer to struct lbs_adapter
+ * @param priv A pointer to struct lbs_private
* @param index Index in scantable to check against current driver settings
* @param mode Network mode: Infrastructure or IBSS
*
* @return Index in scantable, or error code if negative
*/
-static int is_network_compatible(struct lbs_adapter *adapter,
+static int is_network_compatible(struct lbs_private *priv,
struct bss_descriptor * bss, u8 mode)
{
int matched = 0;
@@ -206,31 +206,31 @@ static int is_network_compatible(struct lbs_adapter *adapter,
if (bss->mode != mode)
goto done;
- if ((matched = match_bss_no_security(&adapter->secinfo, bss))) {
+ if ((matched = match_bss_no_security(&priv->secinfo, bss))) {
goto done;
- } else if ((matched = match_bss_static_wep(&adapter->secinfo, bss))) {
+ } else if ((matched = match_bss_static_wep(&priv->secinfo, bss))) {
goto done;
- } else if ((matched = match_bss_wpa(&adapter->secinfo, bss))) {
+ } else if ((matched = match_bss_wpa(&priv->secinfo, bss))) {
lbs_deb_scan(
"is_network_compatible() WPA: wpa_ie 0x%x "
"wpa2_ie 0x%x WEP %s WPA %s WPA2 %s "
"privacy 0x%x\n", bss->wpa_ie[0], bss->rsn_ie[0],
- adapter->secinfo.wep_enabled ? "e" : "d",
- adapter->secinfo.WPAenabled ? "e" : "d",
- adapter->secinfo.WPA2enabled ? "e" : "d",
+ priv->secinfo.wep_enabled ? "e" : "d",
+ priv->secinfo.WPAenabled ? "e" : "d",
+ priv->secinfo.WPA2enabled ? "e" : "d",
(bss->capability & WLAN_CAPABILITY_PRIVACY));
goto done;
- } else if ((matched = match_bss_wpa2(&adapter->secinfo, bss))) {
+ } else if ((matched = match_bss_wpa2(&priv->secinfo, bss))) {
lbs_deb_scan(
"is_network_compatible() WPA2: wpa_ie 0x%x "
"wpa2_ie 0x%x WEP %s WPA %s WPA2 %s "
"privacy 0x%x\n", bss->wpa_ie[0], bss->rsn_ie[0],
- adapter->secinfo.wep_enabled ? "e" : "d",
- adapter->secinfo.WPAenabled ? "e" : "d",
- adapter->secinfo.WPA2enabled ? "e" : "d",
+ priv->secinfo.wep_enabled ? "e" : "d",
+ priv->secinfo.WPAenabled ? "e" : "d",
+ priv->secinfo.WPA2enabled ? "e" : "d",
(bss->capability & WLAN_CAPABILITY_PRIVACY));
goto done;
- } else if ((matched = match_bss_dynamic_wep(&adapter->secinfo, bss))) {
+ } else if ((matched = match_bss_dynamic_wep(&priv->secinfo, bss))) {
lbs_deb_scan(
"is_network_compatible() dynamic WEP: "
"wpa_ie 0x%x wpa2_ie 0x%x privacy 0x%x\n",
@@ -244,9 +244,9 @@ static int is_network_compatible(struct lbs_adapter *adapter,
"is_network_compatible() FAILED: wpa_ie 0x%x "
"wpa2_ie 0x%x WEP %s WPA %s WPA2 %s privacy 0x%x\n",
bss->wpa_ie[0], bss->rsn_ie[0],
- adapter->secinfo.wep_enabled ? "e" : "d",
- adapter->secinfo.WPAenabled ? "e" : "d",
- adapter->secinfo.WPA2enabled ? "e" : "d",
+ priv->secinfo.wep_enabled ? "e" : "d",
+ priv->secinfo.WPAenabled ? "e" : "d",
+ priv->secinfo.WPA2enabled ? "e" : "d",
(bss->capability & WLAN_CAPABILITY_PRIVACY));
done:
@@ -298,7 +298,6 @@ static int lbs_scan_create_channel_list(struct lbs_private *priv,
u8 filteredscan)
{
- struct lbs_adapter *adapter = priv->adapter;
struct region_channel *scanregion;
struct chan_freq_power *cfp;
int rgnidx;
@@ -314,22 +313,22 @@ static int lbs_scan_create_channel_list(struct lbs_private *priv,
*/
scantype = CMD_SCAN_TYPE_ACTIVE;
- for (rgnidx = 0; rgnidx < ARRAY_SIZE(adapter->region_channel); rgnidx++) {
- if (priv->adapter->enable11d &&
- (adapter->connect_status != LBS_CONNECTED) &&
- (adapter->mesh_connect_status != LBS_CONNECTED)) {
+ for (rgnidx = 0; rgnidx < ARRAY_SIZE(priv->region_channel); rgnidx++) {
+ if (priv->enable11d &&
+ (priv->connect_status != LBS_CONNECTED) &&
+ (priv->mesh_connect_status != LBS_CONNECTED)) {
/* Scan all the supported chan for the first scan */
- if (!adapter->universal_channel[rgnidx].valid)
+ if (!priv->universal_channel[rgnidx].valid)
continue;
- scanregion = &adapter->universal_channel[rgnidx];
+ scanregion = &priv->universal_channel[rgnidx];
/* clear the parsed_region_chan for the first scan */
- memset(&adapter->parsed_region_chan, 0x00,
- sizeof(adapter->parsed_region_chan));
+ memset(&priv->parsed_region_chan, 0x00,
+ sizeof(priv->parsed_region_chan));
} else {
- if (!adapter->region_channel[rgnidx].valid)
+ if (!priv->region_channel[rgnidx].valid)
continue;
- scanregion = &adapter->region_channel[rgnidx];
+ scanregion = &priv->region_channel[rgnidx];
}
for (nextchan = 0;
@@ -337,10 +336,10 @@ static int lbs_scan_create_channel_list(struct lbs_private *priv,
cfp = scanregion->CFP + nextchan;
- if (priv->adapter->enable11d) {
+ if (priv->enable11d) {
scantype =
lbs_get_scan_type_11d(cfp->channel,
- &adapter->
+ &priv->
parsed_region_chan);
}
@@ -540,7 +539,6 @@ int lbs_scan_networks(struct lbs_private *priv,
const struct lbs_ioctl_user_scan_cfg *user_cfg,
int full_scan)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = -ENOMEM;
struct chanscanparamset *chan_list;
struct chanscanparamset *curr_chans;
@@ -598,12 +596,12 @@ int lbs_scan_networks(struct lbs_private *priv,
/* Prepare to continue an interrupted scan */
lbs_deb_scan("chan_count %d, last_scanned_channel %d\n",
- chan_count, adapter->last_scanned_channel);
+ chan_count, priv->last_scanned_channel);
curr_chans = chan_list;
/* advance channel list by already-scanned-channels */
- if (adapter->last_scanned_channel > 0) {
- curr_chans += adapter->last_scanned_channel;
- chan_count -= adapter->last_scanned_channel;
+ if (priv->last_scanned_channel > 0) {
+ curr_chans += priv->last_scanned_channel;
+ chan_count -= priv->last_scanned_channel;
}
/* Send scan command(s)
@@ -627,12 +625,12 @@ int lbs_scan_networks(struct lbs_private *priv,
/* somehow schedule the next part of the scan */
if (chan_count &&
!full_scan &&
- !priv->adapter->surpriseremoved) {
+ !priv->surpriseremoved) {
/* -1 marks just that we're currently scanning */
- if (adapter->last_scanned_channel < 0)
- adapter->last_scanned_channel = to_scan;
+ if (priv->last_scanned_channel < 0)
+ priv->last_scanned_channel = to_scan;
else
- adapter->last_scanned_channel += to_scan;
+ priv->last_scanned_channel += to_scan;
cancel_delayed_work(&priv->scan_work);
queue_delayed_work(priv->work_thread, &priv->scan_work,
msecs_to_jiffies(300));
@@ -646,24 +644,24 @@ int lbs_scan_networks(struct lbs_private *priv,
#ifdef CONFIG_LIBERTAS_DEBUG
/* Dump the scan table */
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
lbs_deb_scan("scan table:\n");
- list_for_each_entry(iter, &adapter->network_list, list)
+ list_for_each_entry(iter, &priv->network_list, list)
lbs_deb_scan("%02d: BSSID %s, RSSI %d, SSID '%s'\n",
i++, print_mac(mac, iter->bssid), (s32) iter->rssi,
escape_essid(iter->ssid, iter->ssid_len));
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
#endif
out2:
- adapter->last_scanned_channel = 0;
+ priv->last_scanned_channel = 0;
out:
- if (adapter->connect_status == LBS_CONNECTED) {
+ if (priv->connect_status == LBS_CONNECTED) {
netif_carrier_on(priv->dev);
netif_wake_queue(priv->dev);
}
- if (priv->mesh_dev && (adapter->mesh_connect_status == LBS_CONNECTED)) {
+ if (priv->mesh_dev && (priv->mesh_connect_status == LBS_CONNECTED)) {
netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
}
@@ -931,13 +929,13 @@ done:
*
* Used in association code
*
- * @param adapter A pointer to struct lbs_adapter
+ * @param priv A pointer to struct lbs_private
* @param bssid BSSID to find in the scan list
* @param mode Network mode: Infrastructure or IBSS
*
* @return index in BSSID list, or error return code (< 0)
*/
-struct bss_descriptor *lbs_find_bssid_in_list(struct lbs_adapter *adapter,
+struct bss_descriptor *lbs_find_bssid_in_list(struct lbs_private *priv,
u8 * bssid, u8 mode)
{
struct bss_descriptor * iter_bss;
@@ -955,14 +953,14 @@ struct bss_descriptor *lbs_find_bssid_in_list(struct lbs_adapter *adapter,
* continue past a matched bssid that is not compatible in case there
* is an AP with multiple SSIDs assigned to the same BSSID
*/
- mutex_lock(&adapter->lock);
- list_for_each_entry (iter_bss, &adapter->network_list, list) {
+ mutex_lock(&priv->lock);
+ list_for_each_entry (iter_bss, &priv->network_list, list) {
if (compare_ether_addr(iter_bss->bssid, bssid))
continue; /* bssid doesn't match */
switch (mode) {
case IW_MODE_INFRA:
case IW_MODE_ADHOC:
- if (!is_network_compatible(adapter, iter_bss, mode))
+ if (!is_network_compatible(priv, iter_bss, mode))
break;
found_bss = iter_bss;
break;
@@ -971,7 +969,7 @@ struct bss_descriptor *lbs_find_bssid_in_list(struct lbs_adapter *adapter,
break;
}
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
out:
lbs_deb_leave_args(LBS_DEB_SCAN, "found_bss %p", found_bss);
@@ -983,14 +981,14 @@ out:
*
* Used in association code
*
- * @param adapter A pointer to struct lbs_adapter
+ * @param priv A pointer to struct lbs_private
* @param ssid SSID to find in the list
* @param bssid BSSID to qualify the SSID selection (if provided)
* @param mode Network mode: Infrastructure or IBSS
*
* @return index in BSSID list
*/
-struct bss_descriptor *lbs_find_ssid_in_list(struct lbs_adapter *adapter,
+struct bss_descriptor *lbs_find_ssid_in_list(struct lbs_private *priv,
u8 *ssid, u8 ssid_len, u8 * bssid, u8 mode,
int channel)
{
@@ -1001,9 +999,9 @@ struct bss_descriptor *lbs_find_ssid_in_list(struct lbs_adapter *adapter,
lbs_deb_enter(LBS_DEB_SCAN);
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
- list_for_each_entry (iter_bss, &adapter->network_list, list) {
+ list_for_each_entry (iter_bss, &priv->network_list, list) {
if ( !tmp_oldest
|| (iter_bss->last_scanned < tmp_oldest->last_scanned))
tmp_oldest = iter_bss;
@@ -1019,7 +1017,7 @@ struct bss_descriptor *lbs_find_ssid_in_list(struct lbs_adapter *adapter,
switch (mode) {
case IW_MODE_INFRA:
case IW_MODE_ADHOC:
- if (!is_network_compatible(adapter, iter_bss, mode))
+ if (!is_network_compatible(priv, iter_bss, mode))
break;
if (bssid) {
@@ -1044,7 +1042,7 @@ struct bss_descriptor *lbs_find_ssid_in_list(struct lbs_adapter *adapter,
}
out:
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_SCAN, "found_bss %p", found_bss);
return found_bss;
}
@@ -1055,12 +1053,12 @@ out:
* Search the scan table for the best SSID that also matches the current
* adapter network preference (infrastructure or adhoc)
*
- * @param adapter A pointer to struct lbs_adapter
+ * @param priv A pointer to struct lbs_private
*
* @return index in BSSID list
*/
static struct bss_descriptor *lbs_find_best_ssid_in_list(
- struct lbs_adapter *adapter,
+ struct lbs_private *priv,
u8 mode)
{
u8 bestrssi = 0;
@@ -1069,13 +1067,13 @@ static struct bss_descriptor *lbs_find_best_ssid_in_list(
lbs_deb_enter(LBS_DEB_SCAN);
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
- list_for_each_entry (iter_bss, &adapter->network_list, list) {
+ list_for_each_entry (iter_bss, &priv->network_list, list) {
switch (mode) {
case IW_MODE_INFRA:
case IW_MODE_ADHOC:
- if (!is_network_compatible(adapter, iter_bss, mode))
+ if (!is_network_compatible(priv, iter_bss, mode))
break;
if (SCAN_RSSI(iter_bss->rssi) <= bestrssi)
break;
@@ -1092,7 +1090,7 @@ static struct bss_descriptor *lbs_find_best_ssid_in_list(
}
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_SCAN, "best_bss %p", best_bss);
return best_bss;
}
@@ -1110,17 +1108,16 @@ static struct bss_descriptor *lbs_find_best_ssid_in_list(
int lbs_find_best_network_ssid(struct lbs_private *priv,
u8 *out_ssid, u8 *out_ssid_len, u8 preferred_mode, u8 *out_mode)
{
- struct lbs_adapter *adapter = priv->adapter;
int ret = -1;
struct bss_descriptor * found;
lbs_deb_enter(LBS_DEB_SCAN);
lbs_scan_networks(priv, NULL, 1);
- if (adapter->surpriseremoved)
+ if (priv->surpriseremoved)
goto out;
- found = lbs_find_best_ssid_in_list(adapter, preferred_mode);
+ found = lbs_find_best_ssid_in_list(priv, preferred_mode);
if (found && (found->ssid_len > 0)) {
memcpy(out_ssid, &found->ssid, IW_ESSID_MAX_SIZE);
*out_ssid_len = found->ssid_len;
@@ -1150,7 +1147,6 @@ out:
int lbs_send_specific_ssid_scan(struct lbs_private *priv,
u8 *ssid, u8 ssid_len, u8 clear_ssid)
{
- struct lbs_adapter *adapter = priv->adapter;
struct lbs_ioctl_user_scan_cfg scancfg;
int ret = 0;
@@ -1166,7 +1162,7 @@ int lbs_send_specific_ssid_scan(struct lbs_private *priv,
scancfg.clear_ssid = clear_ssid;
lbs_scan_networks(priv, &scancfg, 1);
- if (adapter->surpriseremoved) {
+ if (priv->surpriseremoved) {
ret = -1;
goto out;
}
@@ -1192,7 +1188,6 @@ static inline char *lbs_translate_scan(struct lbs_private *priv,
char *start, char *stop,
struct bss_descriptor *bss)
{
- struct lbs_adapter *adapter = priv->adapter;
struct chan_freq_power *cfp;
char *current_val; /* For rates */
struct iw_event iwe; /* Temporary buffer */
@@ -1204,7 +1199,7 @@ static inline char *lbs_translate_scan(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_SCAN);
- cfp = lbs_find_cfp_by_band_and_channel(adapter, 0, bss->channel);
+ cfp = lbs_find_cfp_by_band_and_channel(priv, 0, bss->channel);
if (!cfp) {
lbs_deb_scan("Invalid channel number %d\n", bss->channel);
start = NULL;
@@ -1247,25 +1242,25 @@ static inline char *lbs_translate_scan(struct lbs_private *priv,
if (iwe.u.qual.qual > 100)
iwe.u.qual.qual = 100;
- if (adapter->NF[TYPE_BEACON][TYPE_NOAVG] == 0) {
+ if (priv->NF[TYPE_BEACON][TYPE_NOAVG] == 0) {
iwe.u.qual.noise = MRVDRV_NF_DEFAULT_SCAN_VALUE;
} else {
iwe.u.qual.noise =
- CAL_NF(adapter->NF[TYPE_BEACON][TYPE_NOAVG]);
+ CAL_NF(priv->NF[TYPE_BEACON][TYPE_NOAVG]);
}
/* Locally created ad-hoc BSSs won't have beacons if this is the
* only station in the adhoc network; so get signal strength
* from receive statistics.
*/
- if ((adapter->mode == IW_MODE_ADHOC)
- && adapter->adhoccreate
- && !lbs_ssid_cmp(adapter->curbssparams.ssid,
- adapter->curbssparams.ssid_len,
+ if ((priv->mode == IW_MODE_ADHOC)
+ && priv->adhoccreate
+ && !lbs_ssid_cmp(priv->curbssparams.ssid,
+ priv->curbssparams.ssid_len,
bss->ssid, bss->ssid_len)) {
int snr, nf;
- snr = adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
- nf = adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
+ snr = priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
+ nf = priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
iwe.u.qual.level = CAL_RSSI(snr, nf);
}
start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN);
@@ -1294,10 +1289,10 @@ static inline char *lbs_translate_scan(struct lbs_private *priv,
stop, &iwe, IW_EV_PARAM_LEN);
}
if ((bss->mode == IW_MODE_ADHOC)
- && !lbs_ssid_cmp(adapter->curbssparams.ssid,
- adapter->curbssparams.ssid_len,
+ && !lbs_ssid_cmp(priv->curbssparams.ssid,
+ priv->curbssparams.ssid_len,
bss->ssid, bss->ssid_len)
- && adapter->adhoccreate) {
+ && priv->adhoccreate) {
iwe.u.bitrate.value = 22 * 500000;
current_val = iwe_stream_add_value(start, current_val,
stop, &iwe, IW_EV_PARAM_LEN);
@@ -1356,7 +1351,6 @@ int lbs_set_scan(struct net_device *dev, struct iw_request_info *info,
struct iw_param *wrqu, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_SCAN);
@@ -1380,9 +1374,9 @@ int lbs_set_scan(struct net_device *dev, struct iw_request_info *info,
queue_delayed_work(priv->work_thread, &priv->scan_work,
msecs_to_jiffies(50));
/* set marker that currently a scan is taking place */
- adapter->last_scanned_channel = -1;
+ priv->last_scanned_channel = -1;
- if (adapter->surpriseremoved)
+ if (priv->surpriseremoved)
return -EIO;
lbs_deb_leave(LBS_DEB_SCAN);
@@ -1405,7 +1399,6 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
{
#define SCAN_ITEM_SIZE 128
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int err = 0;
char *ev = extra;
char *stop = ev + dwrq->length;
@@ -1415,17 +1408,17 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
lbs_deb_enter(LBS_DEB_SCAN);
/* iwlist should wait until the current scan is finished */
- if (adapter->last_scanned_channel)
+ if (priv->last_scanned_channel)
return -EAGAIN;
/* Update RSSI if current BSS is a locally created ad-hoc BSS */
- if ((adapter->mode == IW_MODE_ADHOC) && adapter->adhoccreate) {
+ if ((priv->mode == IW_MODE_ADHOC) && priv->adhoccreate) {
lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
CMD_OPTION_WAITFORRSP, 0, NULL);
}
- mutex_lock(&adapter->lock);
- list_for_each_entry_safe (iter_bss, safe, &adapter->network_list, list) {
+ mutex_lock(&priv->lock);
+ list_for_each_entry_safe (iter_bss, safe, &priv->network_list, list) {
char * next_ev;
unsigned long stale_time;
@@ -1442,7 +1435,7 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
stale_time = iter_bss->last_scanned + DEFAULT_MAX_SCAN_AGE;
if (time_after(jiffies, stale_time)) {
list_move_tail (&iter_bss->list,
- &adapter->network_free_list);
+ &priv->network_free_list);
clear_bss_descriptor(iter_bss);
continue;
}
@@ -1453,7 +1446,7 @@ int lbs_get_scan(struct net_device *dev, struct iw_request_info *info,
continue;
ev = next_ev;
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
dwrq->length = (ev - extra);
dwrq->flags = 0;
@@ -1538,7 +1531,6 @@ int lbs_cmd_80211_scan(struct lbs_private *priv,
*/
int lbs_ret_80211_scan(struct lbs_private *priv, struct cmd_ds_command *resp)
{
- struct lbs_adapter *adapter = priv->adapter;
struct cmd_ds_802_11_scan_rsp *pscan;
struct bss_descriptor * iter_bss;
struct bss_descriptor * safe;
@@ -1552,11 +1544,11 @@ int lbs_ret_80211_scan(struct lbs_private *priv, struct cmd_ds_command *resp)
lbs_deb_enter(LBS_DEB_SCAN);
/* Prune old entries from scan table */
- list_for_each_entry_safe (iter_bss, safe, &adapter->network_list, list) {
+ list_for_each_entry_safe (iter_bss, safe, &priv->network_list, list) {
unsigned long stale_time = iter_bss->last_scanned + DEFAULT_MAX_SCAN_AGE;
if (time_before(jiffies, stale_time))
continue;
- list_move_tail (&iter_bss->list, &adapter->network_free_list);
+ list_move_tail (&iter_bss->list, &priv->network_free_list);
clear_bss_descriptor(iter_bss);
}
@@ -1609,7 +1601,7 @@ int lbs_ret_80211_scan(struct lbs_private *priv, struct cmd_ds_command *resp)
}
/* Try to find this bss in the scan table */
- list_for_each_entry (iter_bss, &adapter->network_list, list) {
+ list_for_each_entry (iter_bss, &priv->network_list, list) {
if (is_same_network(iter_bss, &new)) {
found = iter_bss;
break;
@@ -1623,16 +1615,16 @@ int lbs_ret_80211_scan(struct lbs_private *priv, struct cmd_ds_command *resp)
if (found) {
/* found, clear it */
clear_bss_descriptor(found);
- } else if (!list_empty(&adapter->network_free_list)) {
+ } else if (!list_empty(&priv->network_free_list)) {
/* Pull one from the free list */
- found = list_entry(adapter->network_free_list.next,
+ found = list_entry(priv->network_free_list.next,
struct bss_descriptor, list);
- list_move_tail(&found->list, &adapter->network_list);
+ list_move_tail(&found->list, &priv->network_list);
} else if (oldest) {
/* If there are no more slots, expire the oldest */
found = oldest;
clear_bss_descriptor(found);
- list_move_tail(&found->list, &adapter->network_list);
+ list_move_tail(&found->list, &priv->network_list);
} else {
continue;
}
diff --git a/drivers/net/wireless/libertas/scan.h b/drivers/net/wireless/libertas/scan.h
index 9b62e2b..319f70d 100644
--- a/drivers/net/wireless/libertas/scan.h
+++ b/drivers/net/wireless/libertas/scan.h
@@ -10,8 +10,6 @@
#include <net/ieee80211.h>
#include "hostcmd.h"
-struct lbs_adapter;
-
/**
* @brief Maximum number of channels that can be sent in a setuserscan ioctl
*
@@ -168,11 +166,11 @@ struct bss_descriptor {
int lbs_ssid_cmp(u8 *ssid1, u8 ssid1_len, u8 *ssid2, u8 ssid2_len);
-struct bss_descriptor *lbs_find_ssid_in_list(struct lbs_adapter *adapter,
+struct bss_descriptor *lbs_find_ssid_in_list(struct lbs_private *priv,
u8 *ssid, u8 ssid_len, u8 *bssid, u8 mode,
int channel);
-struct bss_descriptor *lbs_find_bssid_in_list(struct lbs_adapter *adapter,
+struct bss_descriptor *lbs_find_bssid_in_list(struct lbs_private *priv,
u8 *bssid, u8 mode);
int lbs_find_best_network_ssid(struct lbs_private *priv, u8 *out_ssid,
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 131ef3f..4cb39d3 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -64,11 +64,11 @@ static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
u8 *p802x_hdr;
struct tx_radiotap_hdr *pradiotap_hdr;
u32 new_rate;
- u8 *ptr = priv->adapter->tmptxbuf;
+ u8 *ptr = priv->tmptxbuf;
lbs_deb_enter(LBS_DEB_TX);
- if (priv->adapter->surpriseremoved)
+ if (priv->surpriseremoved)
return -1;
if (!skb->len || (skb->len > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE)) {
@@ -86,7 +86,7 @@ static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
plocaltxpd->tx_packet_location = cpu_to_le32(sizeof(struct txpd));
p802x_hdr = skb->data;
- if (priv->adapter->monitormode != LBS_MONITOR_OFF) {
+ if (priv->monitormode != LBS_MONITOR_OFF) {
/* locate radiotap header */
pradiotap_hdr = (struct tx_radiotap_hdr *)skb->data;
@@ -106,7 +106,7 @@ static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
}
/* copy destination address from 802.3 or 802.11 header */
- if (priv->adapter->monitormode != LBS_MONITOR_OFF)
+ if (priv->monitormode != LBS_MONITOR_OFF)
memcpy(plocaltxpd->tx_dest_addr_high, p802x_hdr + 4, ETH_ALEN);
else
memcpy(plocaltxpd->tx_dest_addr_high, p802x_hdr, ETH_ALEN);
@@ -124,7 +124,7 @@ static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
lbs_deb_hex(LBS_DEB_TX, "Tx Data", (u8 *) p802x_hdr, le16_to_cpu(plocaltxpd->tx_packet_length));
memcpy(ptr, p802x_hdr, le16_to_cpu(plocaltxpd->tx_packet_length));
ret = priv->hw_host_to_card(priv, MVMS_DAT,
- priv->adapter->tmptxbuf,
+ priv->tmptxbuf,
le16_to_cpu(plocaltxpd->tx_packet_length) +
sizeof(struct txpd));
@@ -144,7 +144,7 @@ done:
priv->stats.tx_errors++;
}
- if (!ret && priv->adapter->monitormode != LBS_MONITOR_OFF) {
+ if (!ret && priv->monitormode != LBS_MONITOR_OFF) {
/* Keep the skb to echo it back once Tx feedback is
received from FW */
skb_orphan(skb);
@@ -154,7 +154,7 @@ done:
netif_stop_queue(priv->mesh_dev);
/* Keep the skb around for when we get feedback */
- priv->adapter->currenttxskb = skb;
+ priv->currenttxskb = skb;
} else {
dev_kfree_skb_any(skb);
}
@@ -166,29 +166,27 @@ done:
void lbs_tx_runqueue(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
int i;
- spin_lock(&adapter->txqueue_lock);
- for (i = 0; i < adapter->tx_queue_idx; i++) {
- struct sk_buff *skb = adapter->tx_queue_ps[i];
- spin_unlock(&adapter->txqueue_lock);
+ spin_lock(&priv->txqueue_lock);
+ for (i = 0; i < priv->tx_queue_idx; i++) {
+ struct sk_buff *skb = priv->tx_queue_ps[i];
+ spin_unlock(&priv->txqueue_lock);
SendSinglePacket(priv, skb);
- spin_lock(&adapter->txqueue_lock);
+ spin_lock(&priv->txqueue_lock);
}
- adapter->tx_queue_idx = 0;
- spin_unlock(&adapter->txqueue_lock);
+ priv->tx_queue_idx = 0;
+ spin_unlock(&priv->txqueue_lock);
}
static void lbs_tx_queue(struct lbs_private *priv, struct sk_buff *skb)
{
- struct lbs_adapter *adapter = priv->adapter;
- spin_lock(&adapter->txqueue_lock);
+ spin_lock(&priv->txqueue_lock);
- WARN_ON(priv->adapter->tx_queue_idx >= NR_TX_QUEUE);
- adapter->tx_queue_ps[adapter->tx_queue_idx++] = skb;
- if (adapter->tx_queue_idx == NR_TX_QUEUE) {
+ WARN_ON(priv->tx_queue_idx >= NR_TX_QUEUE);
+ priv->tx_queue_ps[priv->tx_queue_idx++] = skb;
+ if (priv->tx_queue_idx == NR_TX_QUEUE) {
netif_stop_queue(priv->dev);
if (priv->mesh_dev)
netif_stop_queue(priv->mesh_dev);
@@ -198,7 +196,7 @@ static void lbs_tx_queue(struct lbs_private *priv, struct sk_buff *skb)
netif_start_queue(priv->mesh_dev);
}
- spin_unlock(&adapter->txqueue_lock);
+ spin_unlock(&priv->txqueue_lock);
}
/**
@@ -221,8 +219,8 @@ int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
goto done;
}
- if ((priv->adapter->psstate == PS_STATE_SLEEP) ||
- (priv->adapter->psstate == PS_STATE_PRE_SLEEP)) {
+ if ((priv->psstate == PS_STATE_SLEEP) ||
+ (priv->psstate == PS_STATE_PRE_SLEEP)) {
lbs_tx_queue(priv, skb);
return ret;
}
@@ -244,17 +242,16 @@ done:
*/
void lbs_send_tx_feedback(struct lbs_private *priv)
{
- struct lbs_adapter *adapter = priv->adapter;
struct tx_radiotap_hdr *radiotap_hdr;
- u32 status = adapter->eventcause;
+ u32 status = priv->eventcause;
int txfail;
int try_count;
- if (adapter->monitormode == LBS_MONITOR_OFF ||
- adapter->currenttxskb == NULL)
+ if (priv->monitormode == LBS_MONITOR_OFF ||
+ priv->currenttxskb == NULL)
return;
- radiotap_hdr = (struct tx_radiotap_hdr *)adapter->currenttxskb->data;
+ radiotap_hdr = (struct tx_radiotap_hdr *)priv->currenttxskb->data;
txfail = (status >> 24);
@@ -267,14 +264,14 @@ void lbs_send_tx_feedback(struct lbs_private *priv)
#endif
try_count = (status >> 16) & 0xff;
radiotap_hdr->data_retries = (try_count) ?
- (1 + adapter->txretrycount - try_count) : 0;
- lbs_upload_rx_packet(priv, adapter->currenttxskb);
- adapter->currenttxskb = NULL;
+ (1 + priv->txretrycount - try_count) : 0;
+ lbs_upload_rx_packet(priv, priv->currenttxskb);
+ priv->currenttxskb = NULL;
- if (adapter->connect_status == LBS_CONNECTED)
+ if (priv->connect_status == LBS_CONNECTED)
netif_wake_queue(priv->dev);
- if (priv->mesh_dev && (adapter->mesh_connect_status == LBS_CONNECTED))
+ if (priv->mesh_dev && (priv->mesh_connect_status == LBS_CONNECTED))
netif_wake_queue(priv->mesh_dev);
}
EXPORT_SYMBOL_GPL(lbs_send_tx_feedback);
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 1af140b..1e0b224 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -23,7 +23,7 @@
static inline void lbs_postpone_association_work(struct lbs_private *priv)
{
- if (priv->adapter->surpriseremoved)
+ if (priv->surpriseremoved)
return;
cancel_delayed_work(&priv->assoc_work);
queue_delayed_work(priv->work_thread, &priv->assoc_work, HZ / 2);
@@ -32,21 +32,21 @@ static inline void lbs_postpone_association_work(struct lbs_private *priv)
static inline void lbs_cancel_association_work(struct lbs_private *priv)
{
cancel_delayed_work(&priv->assoc_work);
- kfree(priv->adapter->pending_assoc_req);
- priv->adapter->pending_assoc_req = NULL;
+ kfree(priv->pending_assoc_req);
+ priv->pending_assoc_req = NULL;
}
/**
* @brief Find the channel frequency power info with specific channel
*
- * @param adapter A pointer to struct lbs_adapter structure
+ * @param priv A pointer to struct lbs_private structure
* @param band it can be BAND_A, BAND_G or BAND_B
* @param channel the channel for looking
* @return A pointer to struct chan_freq_power structure or NULL if not find.
*/
struct chan_freq_power *lbs_find_cfp_by_band_and_channel(
- struct lbs_adapter *adapter,
+ struct lbs_private *priv,
u8 band,
u16 channel)
{
@@ -54,11 +54,11 @@ struct chan_freq_power *lbs_find_cfp_by_band_and_channel(
struct region_channel *rc;
int i, j;
- for (j = 0; !cfp && (j < ARRAY_SIZE(adapter->region_channel)); j++) {
- rc = &adapter->region_channel[j];
+ for (j = 0; !cfp && (j < ARRAY_SIZE(priv->region_channel)); j++) {
+ rc = &priv->region_channel[j];
- if (adapter->enable11d)
- rc = &adapter->universal_channel[j];
+ if (priv->enable11d)
+ rc = &priv->universal_channel[j];
if (!rc->valid || !rc->CFP)
continue;
if (rc->band != band)
@@ -81,13 +81,13 @@ struct chan_freq_power *lbs_find_cfp_by_band_and_channel(
/**
* @brief Find the channel frequency power info with specific frequency
*
- * @param adapter A pointer to struct lbs_adapter structure
+ * @param priv A pointer to struct lbs_private structure
* @param band it can be BAND_A, BAND_G or BAND_B
* @param freq the frequency for looking
* @return A pointer to struct chan_freq_power structure or NULL if not find.
*/
static struct chan_freq_power *find_cfp_by_band_and_freq(
- struct lbs_adapter *adapter,
+ struct lbs_private *priv,
u8 band,
u32 freq)
{
@@ -95,11 +95,11 @@ static struct chan_freq_power *find_cfp_by_band_and_freq(
struct region_channel *rc;
int i, j;
- for (j = 0; !cfp && (j < ARRAY_SIZE(adapter->region_channel)); j++) {
- rc = &adapter->region_channel[j];
+ for (j = 0; !cfp && (j < ARRAY_SIZE(priv->region_channel)); j++) {
+ rc = &priv->region_channel[j];
- if (adapter->enable11d)
- rc = &adapter->universal_channel[j];
+ if (priv->enable11d)
+ rc = &priv->universal_channel[j];
if (!rc->valid || !rc->CFP)
continue;
if (rc->band != band)
@@ -130,13 +130,12 @@ static struct chan_freq_power *find_cfp_by_band_and_freq(
static int lbs_radio_ioctl(struct lbs_private *priv, u8 option)
{
int ret = 0;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- if (adapter->radioon != option) {
+ if (priv->radioon != option) {
lbs_deb_wext("switching radio %s\n", option ? "on" : "off");
- adapter->radioon = option;
+ priv->radioon = option;
ret = lbs_prepare_and_send_command(priv,
CMD_802_11_RADIO_CONTROL,
@@ -151,18 +150,18 @@ static int lbs_radio_ioctl(struct lbs_private *priv, u8 option)
/**
* @brief Copy active data rates based on adapter mode and status
*
- * @param adapter A pointer to struct lbs_adapter structure
+ * @param priv A pointer to struct lbs_private structure
* @param rate The buf to return the active rates
*/
-static void copy_active_data_rates(struct lbs_adapter *adapter, u8 *rates)
+static void copy_active_data_rates(struct lbs_private *priv, u8 *rates)
{
lbs_deb_enter(LBS_DEB_WEXT);
- if ((adapter->connect_status != LBS_CONNECTED) &&
- (adapter->mesh_connect_status != LBS_CONNECTED))
+ if ((priv->connect_status != LBS_CONNECTED) &&
+ (priv->mesh_connect_status != LBS_CONNECTED))
memcpy(rates, lbs_bg_rates, MAX_RATES);
else
- memcpy(rates, adapter->curbssparams.rates, MAX_RATES);
+ memcpy(rates, priv->curbssparams.rates, MAX_RATES);
lbs_deb_leave(LBS_DEB_WEXT);
}
@@ -184,18 +183,17 @@ static int lbs_get_freq(struct net_device *dev, struct iw_request_info *info,
struct iw_freq *fwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct chan_freq_power *cfp;
lbs_deb_enter(LBS_DEB_WEXT);
- cfp = lbs_find_cfp_by_band_and_channel(adapter, 0,
- adapter->curbssparams.channel);
+ cfp = lbs_find_cfp_by_band_and_channel(priv, 0,
+ priv->curbssparams.channel);
if (!cfp) {
- if (adapter->curbssparams.channel)
+ if (priv->curbssparams.channel)
lbs_deb_wext("invalid channel %d\n",
- adapter->curbssparams.channel);
+ priv->curbssparams.channel);
return -EINVAL;
}
@@ -211,12 +209,11 @@ static int lbs_get_wap(struct net_device *dev, struct iw_request_info *info,
struct sockaddr *awrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- if (adapter->connect_status == LBS_CONNECTED) {
- memcpy(awrq->sa_data, adapter->curbssparams.bssid, ETH_ALEN);
+ if (priv->connect_status == LBS_CONNECTED) {
+ memcpy(awrq->sa_data, priv->curbssparams.bssid, ETH_ALEN);
} else {
memset(awrq->sa_data, 0, ETH_ALEN);
}
@@ -230,7 +227,6 @@ static int lbs_set_nick(struct net_device *dev, struct iw_request_info *info,
struct iw_point *dwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
@@ -242,10 +238,10 @@ static int lbs_set_nick(struct net_device *dev, struct iw_request_info *info,
return -E2BIG;
}
- mutex_lock(&adapter->lock);
- memset(adapter->nodename, 0, sizeof(adapter->nodename));
- memcpy(adapter->nodename, extra, dwrq->length);
- mutex_unlock(&adapter->lock);
+ mutex_lock(&priv->lock);
+ memset(priv->nodename, 0, sizeof(priv->nodename));
+ memcpy(priv->nodename, extra, dwrq->length);
+ mutex_unlock(&priv->lock);
lbs_deb_leave(LBS_DEB_WEXT);
return 0;
@@ -255,12 +251,11 @@ static int lbs_get_nick(struct net_device *dev, struct iw_request_info *info,
struct iw_point *dwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- dwrq->length = strlen(adapter->nodename);
- memcpy(extra, adapter->nodename, dwrq->length);
+ dwrq->length = strlen(priv->nodename);
+ memcpy(extra, priv->nodename, dwrq->length);
extra[dwrq->length] = '\0';
dwrq->flags = 1; /* active */
@@ -273,13 +268,12 @@ static int mesh_get_nick(struct net_device *dev, struct iw_request_info *info,
struct iw_point *dwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
/* Use nickname to indicate that mesh is on */
- if (adapter->mesh_connect_status == LBS_CONNECTED) {
+ if (priv->mesh_connect_status == LBS_CONNECTED) {
strncpy(extra, "Mesh", 12);
extra[12] = '\0';
dwrq->length = strlen(extra);
@@ -299,17 +293,16 @@ static int lbs_set_rts(struct net_device *dev, struct iw_request_info *info,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
u32 rthr = vwrq->value;
lbs_deb_enter(LBS_DEB_WEXT);
if (vwrq->disabled) {
- adapter->rtsthsd = rthr = MRVDRV_RTS_MAX_VALUE;
+ priv->rtsthsd = rthr = MRVDRV_RTS_MAX_VALUE;
} else {
if (rthr < MRVDRV_RTS_MIN_VALUE || rthr > MRVDRV_RTS_MAX_VALUE)
return -EINVAL;
- adapter->rtsthsd = rthr;
+ priv->rtsthsd = rthr;
}
ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
@@ -325,18 +318,17 @@ static int lbs_get_rts(struct net_device *dev, struct iw_request_info *info,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- adapter->rtsthsd = 0;
+ priv->rtsthsd = 0;
ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
CMD_ACT_GET, CMD_OPTION_WAITFORRSP,
OID_802_11_RTS_THRESHOLD, NULL);
if (ret)
goto out;
- vwrq->value = adapter->rtsthsd;
+ vwrq->value = priv->rtsthsd;
vwrq->disabled = ((vwrq->value < MRVDRV_RTS_MIN_VALUE)
|| (vwrq->value > MRVDRV_RTS_MAX_VALUE));
vwrq->fixed = 1;
@@ -352,17 +344,16 @@ static int lbs_set_frag(struct net_device *dev, struct iw_request_info *info,
int ret = 0;
u32 fthr = vwrq->value;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
if (vwrq->disabled) {
- adapter->fragthsd = fthr = MRVDRV_FRAG_MAX_VALUE;
+ priv->fragthsd = fthr = MRVDRV_FRAG_MAX_VALUE;
} else {
if (fthr < MRVDRV_FRAG_MIN_VALUE
|| fthr > MRVDRV_FRAG_MAX_VALUE)
return -EINVAL;
- adapter->fragthsd = fthr;
+ priv->fragthsd = fthr;
}
ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
@@ -378,11 +369,10 @@ static int lbs_get_frag(struct net_device *dev, struct iw_request_info *info,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- adapter->fragthsd = 0;
+ priv->fragthsd = 0;
ret = lbs_prepare_and_send_command(priv,
CMD_802_11_SNMP_MIB,
CMD_ACT_GET, CMD_OPTION_WAITFORRSP,
@@ -390,7 +380,7 @@ static int lbs_get_frag(struct net_device *dev, struct iw_request_info *info,
if (ret)
goto out;
- vwrq->value = adapter->fragthsd;
+ vwrq->value = priv->fragthsd;
vwrq->disabled = ((vwrq->value < MRVDRV_FRAG_MIN_VALUE)
|| (vwrq->value > MRVDRV_FRAG_MAX_VALUE));
vwrq->fixed = 1;
@@ -404,11 +394,10 @@ static int lbs_get_mode(struct net_device *dev,
struct iw_request_info *info, u32 * uwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- *uwrq = adapter->mode;
+ *uwrq = priv->mode;
lbs_deb_leave(LBS_DEB_WEXT);
return 0;
@@ -432,7 +421,6 @@ static int lbs_get_txpow(struct net_device *dev,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
@@ -444,10 +432,10 @@ static int lbs_get_txpow(struct net_device *dev,
if (ret)
goto out;
- lbs_deb_wext("tx power level %d dbm\n", adapter->txpowerlevel);
- vwrq->value = adapter->txpowerlevel;
+ lbs_deb_wext("tx power level %d dbm\n", priv->txpowerlevel);
+ vwrq->value = priv->txpowerlevel;
vwrq->fixed = 1;
- if (adapter->radioon) {
+ if (priv->radioon) {
vwrq->disabled = 0;
vwrq->flags = IW_TXPOW_DBM;
} else {
@@ -464,7 +452,6 @@ static int lbs_set_retry(struct net_device *dev, struct iw_request_info *info,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
@@ -477,7 +464,7 @@ static int lbs_set_retry(struct net_device *dev, struct iw_request_info *info,
return -EINVAL;
/* Adding 1 to convert retry count to try count */
- adapter->txretrycount = vwrq->value + 1;
+ priv->txretrycount = vwrq->value + 1;
ret = lbs_prepare_and_send_command(priv, CMD_802_11_SNMP_MIB,
CMD_ACT_SET,
@@ -499,12 +486,11 @@ static int lbs_get_retry(struct net_device *dev, struct iw_request_info *info,
struct iw_param *vwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
lbs_deb_enter(LBS_DEB_WEXT);
- adapter->txretrycount = 0;
+ priv->txretrycount = 0;
ret = lbs_prepare_and_send_command(priv,
CMD_802_11_SNMP_MIB,
CMD_ACT_GET, CMD_OPTION_WAITFORRSP,
@@ -516,7 +502,7 @@ static int lbs_get_retry(struct net_device *dev, struct iw_request_info *info,
if (!vwrq->flags) {
vwrq->flags = IW_RETRY_LIMIT;
/* Subtract 1 to convert try count to retry count */
- vwrq->value = adapter->txretrycount - 1;
+ vwrq->value = priv->txretrycount - 1;
}
out:
@@ -568,7 +554,6 @@ static int lbs_get_range(struct net_device *dev, struct iw_request_info *info,
{
int i, j;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct iw_range *range = (struct iw_range *)extra;
struct chan_freq_power *cfp;
u8 rates[MAX_RATES + 1];
@@ -584,7 +569,7 @@ static int lbs_get_range(struct net_device *dev, struct iw_request_info *info,
range->max_nwid = 0;
memset(rates, 0, sizeof(rates));
- copy_active_data_rates(adapter, rates);
+ copy_active_data_rates(priv, rates);
range->num_bitrates = strnlen(rates, IW_MAX_BITRATES);
for (i = 0; i < range->num_bitrates; i++)
range->bitrate[i] = rates[i] * 500000;
@@ -593,14 +578,14 @@ static int lbs_get_range(struct net_device *dev, struct iw_request_info *info,
range->num_bitrates);
range->num_frequency = 0;
- if (priv->adapter->enable11d &&
- (adapter->connect_status == LBS_CONNECTED ||
- adapter->mesh_connect_status == LBS_CONNECTED)) {
+ if (priv->enable11d &&
+ (priv->connect_status == LBS_CONNECTED ||
+ priv->mesh_connect_status == LBS_CONNECTED)) {
u8 chan_no;
u8 band;
struct parsed_region_chan_11d *parsed_region_chan =
- &adapter->parsed_region_chan;
+ &priv->parsed_region_chan;
if (parsed_region_chan == NULL) {
lbs_deb_wext("11d: parsed_region_chan is NULL\n");
@@ -624,12 +609,12 @@ static int lbs_get_range(struct net_device *dev, struct iw_request_info *info,
}
if (!flag) {
for (j = 0; (range->num_frequency < IW_MAX_FREQUENCIES)
- && (j < ARRAY_SIZE(adapter->region_channel)); j++) {
- cfp = adapter->region_channel[j].CFP;
+ && (j < ARRAY_SIZE(priv->region_channel)); j++) {
+ cfp = priv->region_channel[j].CFP;
for (i = 0; (range->num_frequency < IW_MAX_FREQUENCIES)
- && adapter->region_channel[j].valid
+ && priv->region_channel[j].valid
&& cfp
- && (i < adapter->region_channel[j].nrcfp); i++) {
+ && (i < priv->region_channel[j].nrcfp); i++) {
range->freq[range->num_frequency].i =
(long)cfp->channel;
range->freq[range->num_frequency].m =
@@ -729,7 +714,7 @@ static int lbs_get_range(struct net_device *dev, struct iw_request_info *info,
IW_EVENT_CAPA_MASK(SIOCGIWSCAN));
range->event_capa[1] = IW_EVENT_CAPA_K_1;
- if (adapter->fwcapinfo & FW_CAPINFO_WPA) {
+ if (priv->fwcapinfo & FW_CAPINFO_WPA) {
range->enc_capa = IW_ENC_CAPA_WPA
| IW_ENC_CAPA_WPA2
| IW_ENC_CAPA_CIPHER_TKIP
@@ -745,7 +730,6 @@ static int lbs_set_power(struct net_device *dev, struct iw_request_info *info,
struct iw_param *vwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
@@ -754,8 +738,8 @@ static int lbs_set_power(struct net_device *dev, struct iw_request_info *info,
*/
if (vwrq->disabled) {
- adapter->psmode = LBS802_11POWERMODECAM;
- if (adapter->psstate != PS_STATE_FULL_POWER) {
+ priv->psmode = LBS802_11POWERMODECAM;
+ if (priv->psstate != PS_STATE_FULL_POWER) {
lbs_ps_wakeup(priv, CMD_OPTION_WAITFORRSP);
}
@@ -771,13 +755,13 @@ static int lbs_set_power(struct net_device *dev, struct iw_request_info *info,
return -EINVAL;
}
- if (adapter->psmode != LBS802_11POWERMODECAM) {
+ if (priv->psmode != LBS802_11POWERMODECAM) {
return 0;
}
- adapter->psmode = LBS802_11POWERMODEMAX_PSP;
+ priv->psmode = LBS802_11POWERMODEMAX_PSP;
- if (adapter->connect_status == LBS_CONNECTED) {
+ if (priv->connect_status == LBS_CONNECTED) {
lbs_ps_sleep(priv, CMD_OPTION_WAITFORRSP);
}
@@ -789,15 +773,14 @@ static int lbs_get_power(struct net_device *dev, struct iw_request_info *info,
struct iw_param *vwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int mode;
lbs_deb_enter(LBS_DEB_WEXT);
- mode = adapter->psmode;
+ mode = priv->psmode;
if ((vwrq->disabled = (mode == LBS802_11POWERMODECAM))
- || adapter->connect_status == LBS_DISCONNECTED)
+ || priv->connect_status == LBS_DISCONNECTED)
{
goto out;
}
@@ -820,7 +803,6 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev)
PERFECT = 100
};
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
u32 rssi_qual;
u32 tx_qual;
u32 quality = 0;
@@ -830,23 +812,23 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev)
lbs_deb_enter(LBS_DEB_WEXT);
- priv->wstats.status = adapter->mode;
+ priv->wstats.status = priv->mode;
/* If we're not associated, all quality values are meaningless */
- if ((adapter->connect_status != LBS_CONNECTED) &&
- (adapter->mesh_connect_status != LBS_CONNECTED))
+ if ((priv->connect_status != LBS_CONNECTED) &&
+ (priv->mesh_connect_status != LBS_CONNECTED))
goto out;
/* Quality by RSSI */
priv->wstats.qual.level =
- CAL_RSSI(adapter->SNR[TYPE_BEACON][TYPE_NOAVG],
- adapter->NF[TYPE_BEACON][TYPE_NOAVG]);
+ CAL_RSSI(priv->SNR[TYPE_BEACON][TYPE_NOAVG],
+ priv->NF[TYPE_BEACON][TYPE_NOAVG]);
- if (adapter->NF[TYPE_BEACON][TYPE_NOAVG] == 0) {
+ if (priv->NF[TYPE_BEACON][TYPE_NOAVG] == 0) {
priv->wstats.qual.noise = MRVDRV_NF_DEFAULT_SCAN_VALUE;
} else {
priv->wstats.qual.noise =
- CAL_NF(adapter->NF[TYPE_BEACON][TYPE_NOAVG]);
+ CAL_NF(priv->NF[TYPE_BEACON][TYPE_NOAVG]);
}
lbs_deb_wext("signal level %#x\n", priv->wstats.qual.level);
@@ -870,7 +852,7 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev)
/* Quality by TX errors */
priv->wstats.discard.retries = priv->stats.tx_errors;
- tx_retries = le32_to_cpu(adapter->logmsg.retry);
+ tx_retries = le32_to_cpu(priv->logmsg.retry);
if (tx_retries > 75)
tx_qual = (90 - tx_retries) * POOR / 15;
@@ -886,10 +868,10 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev)
(PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
quality = min(quality, tx_qual);
- priv->wstats.discard.code = le32_to_cpu(adapter->logmsg.wepundecryptable);
- priv->wstats.discard.fragment = le32_to_cpu(adapter->logmsg.rxfrag);
+ priv->wstats.discard.code = le32_to_cpu(priv->logmsg.wepundecryptable);
+ priv->wstats.discard.fragment = le32_to_cpu(priv->logmsg.rxfrag);
priv->wstats.discard.retries = tx_retries;
- priv->wstats.discard.misc = le32_to_cpu(adapter->logmsg.ackfailure);
+ priv->wstats.discard.misc = le32_to_cpu(priv->logmsg.ackfailure);
/* Calculate quality */
priv->wstats.qual.qual = min_t(u8, quality, 100);
@@ -924,14 +906,13 @@ static int lbs_set_freq(struct net_device *dev, struct iw_request_info *info,
{
int ret = -EINVAL;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct chan_freq_power *cfp;
struct assoc_request * assoc_req;
lbs_deb_enter(LBS_DEB_WEXT);
- mutex_lock(&adapter->lock);
- assoc_req = lbs_get_association_request(adapter);
+ mutex_lock(&priv->lock);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
ret = -ENOMEM;
goto out;
@@ -941,7 +922,7 @@ static int lbs_set_freq(struct net_device *dev, struct iw_request_info *info,
if (fwrq->e == 1) {
long f = fwrq->m / 100000;
- cfp = find_cfp_by_band_and_freq(adapter, 0, f);
+ cfp = find_cfp_by_band_and_freq(priv, 0, f);
if (!cfp) {
lbs_deb_wext("invalid freq %ld\n", f);
goto out;
@@ -956,7 +937,7 @@ static int lbs_set_freq(struct net_device *dev, struct iw_request_info *info,
goto out;
}
- cfp = lbs_find_cfp_by_band_and_channel(adapter, 0, fwrq->m);
+ cfp = lbs_find_cfp_by_band_and_channel(priv, 0, fwrq->m);
if (!cfp) {
goto out;
}
@@ -971,7 +952,7 @@ out:
} else {
lbs_cancel_association_work(priv);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
return ret;
@@ -981,7 +962,6 @@ static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
struct iw_param *vwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
u32 new_rate;
u16 action;
int ret = -EINVAL;
@@ -993,14 +973,14 @@ static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
/* Auto rate? */
if (vwrq->value == -1) {
action = CMD_ACT_SET_TX_AUTO;
- adapter->auto_rate = 1;
- adapter->cur_rate = 0;
+ priv->auto_rate = 1;
+ priv->cur_rate = 0;
} else {
if (vwrq->value % 100000)
goto out;
memset(rates, 0, sizeof(rates));
- copy_active_data_rates(adapter, rates);
+ copy_active_data_rates(priv, rates);
new_rate = vwrq->value / 500000;
if (!memchr(rates, new_rate, sizeof(rates))) {
lbs_pr_alert("fixed data rate 0x%X out of range\n",
@@ -1008,9 +988,9 @@ static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
goto out;
}
- adapter->cur_rate = new_rate;
+ priv->cur_rate = new_rate;
action = CMD_ACT_SET_TX_FIX_RATE;
- adapter->auto_rate = 0;
+ priv->auto_rate = 0;
}
ret = lbs_prepare_and_send_command(priv, CMD_802_11_DATA_RATE,
@@ -1025,14 +1005,13 @@ static int lbs_get_rate(struct net_device *dev, struct iw_request_info *info,
struct iw_param *vwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- if (adapter->connect_status == LBS_CONNECTED) {
- vwrq->value = adapter->cur_rate * 500000;
+ if (priv->connect_status == LBS_CONNECTED) {
+ vwrq->value = priv->cur_rate * 500000;
- if (adapter->auto_rate)
+ if (priv->auto_rate)
vwrq->fixed = 0;
else
vwrq->fixed = 1;
@@ -1051,7 +1030,6 @@ static int lbs_set_mode(struct net_device *dev,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct assoc_request * assoc_req;
lbs_deb_enter(LBS_DEB_WEXT);
@@ -1064,8 +1042,8 @@ static int lbs_set_mode(struct net_device *dev,
goto out;
}
- mutex_lock(&adapter->lock);
- assoc_req = lbs_get_association_request(adapter);
+ mutex_lock(&priv->lock);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
ret = -ENOMEM;
lbs_cancel_association_work(priv);
@@ -1075,7 +1053,7 @@ static int lbs_set_mode(struct net_device *dev,
lbs_postpone_association_work(priv);
lbs_deb_wext("Switching to mode: 0x%x\n", *uwrq);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
out:
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
@@ -1097,18 +1075,17 @@ static int lbs_get_encode(struct net_device *dev,
struct iw_point *dwrq, u8 * extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
lbs_deb_enter(LBS_DEB_WEXT);
lbs_deb_wext("flags 0x%x, index %d, length %d, wep_tx_keyidx %d\n",
- dwrq->flags, index, dwrq->length, adapter->wep_tx_keyidx);
+ dwrq->flags, index, dwrq->length, priv->wep_tx_keyidx);
dwrq->flags = 0;
/* Authentication method */
- switch (adapter->secinfo.auth_mode) {
+ switch (priv->secinfo.auth_mode) {
case IW_AUTH_ALG_OPEN_SYSTEM:
dwrq->flags = IW_ENCODE_OPEN;
break;
@@ -1124,22 +1101,22 @@ static int lbs_get_encode(struct net_device *dev,
memset(extra, 0, 16);
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
/* Default to returning current transmit key */
if (index < 0)
- index = adapter->wep_tx_keyidx;
+ index = priv->wep_tx_keyidx;
- if ((adapter->wep_keys[index].len) && adapter->secinfo.wep_enabled) {
- memcpy(extra, adapter->wep_keys[index].key,
- adapter->wep_keys[index].len);
- dwrq->length = adapter->wep_keys[index].len;
+ if ((priv->wep_keys[index].len) && priv->secinfo.wep_enabled) {
+ memcpy(extra, priv->wep_keys[index].key,
+ priv->wep_keys[index].len);
+ dwrq->length = priv->wep_keys[index].len;
dwrq->flags |= (index + 1);
/* Return WEP enabled */
dwrq->flags &= ~IW_ENCODE_DISABLED;
- } else if ((adapter->secinfo.WPAenabled)
- || (adapter->secinfo.WPA2enabled)) {
+ } else if ((priv->secinfo.WPAenabled)
+ || (priv->secinfo.WPA2enabled)) {
/* return WPA enabled */
dwrq->flags &= ~IW_ENCODE_DISABLED;
dwrq->flags |= IW_ENCODE_NOKEY;
@@ -1147,7 +1124,7 @@ static int lbs_get_encode(struct net_device *dev,
dwrq->flags |= IW_ENCODE_DISABLED;
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_wext("key: %02x:%02x:%02x:%02x:%02x:%02x, keylen %d\n",
extra[0], extra[1], extra[2],
@@ -1293,14 +1270,13 @@ static int lbs_set_encode(struct net_device *dev,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct assoc_request * assoc_req;
u16 is_default = 0, index = 0, set_tx_key = 0;
lbs_deb_enter(LBS_DEB_WEXT);
- mutex_lock(&adapter->lock);
- assoc_req = lbs_get_association_request(adapter);
+ mutex_lock(&priv->lock);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
ret = -ENOMEM;
goto out;
@@ -1348,7 +1324,7 @@ out:
} else {
lbs_cancel_association_work(priv);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
return ret;
@@ -1370,7 +1346,6 @@ static int lbs_get_encodeext(struct net_device *dev,
{
int ret = -EINVAL;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
int index, max_key_len;
@@ -1386,46 +1361,46 @@ static int lbs_get_encodeext(struct net_device *dev,
goto out;
index--;
} else {
- index = adapter->wep_tx_keyidx;
+ index = priv->wep_tx_keyidx;
}
if (!(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) &&
ext->alg != IW_ENCODE_ALG_WEP) {
- if (index != 0 || adapter->mode != IW_MODE_INFRA)
+ if (index != 0 || priv->mode != IW_MODE_INFRA)
goto out;
}
dwrq->flags = index + 1;
memset(ext, 0, sizeof(*ext));
- if ( !adapter->secinfo.wep_enabled
- && !adapter->secinfo.WPAenabled
- && !adapter->secinfo.WPA2enabled) {
+ if ( !priv->secinfo.wep_enabled
+ && !priv->secinfo.WPAenabled
+ && !priv->secinfo.WPA2enabled) {
ext->alg = IW_ENCODE_ALG_NONE;
ext->key_len = 0;
dwrq->flags |= IW_ENCODE_DISABLED;
} else {
u8 *key = NULL;
- if ( adapter->secinfo.wep_enabled
- && !adapter->secinfo.WPAenabled
- && !adapter->secinfo.WPA2enabled) {
+ if ( priv->secinfo.wep_enabled
+ && !priv->secinfo.WPAenabled
+ && !priv->secinfo.WPA2enabled) {
/* WEP */
ext->alg = IW_ENCODE_ALG_WEP;
- ext->key_len = adapter->wep_keys[index].len;
- key = &adapter->wep_keys[index].key[0];
- } else if ( !adapter->secinfo.wep_enabled
- && (adapter->secinfo.WPAenabled ||
- adapter->secinfo.WPA2enabled)) {
+ ext->key_len = priv->wep_keys[index].len;
+ key = &priv->wep_keys[index].key[0];
+ } else if ( !priv->secinfo.wep_enabled
+ && (priv->secinfo.WPAenabled ||
+ priv->secinfo.WPA2enabled)) {
/* WPA */
struct enc_key * pkey = NULL;
- if ( adapter->wpa_mcast_key.len
- && (adapter->wpa_mcast_key.flags & KEY_INFO_WPA_ENABLED))
- pkey = &adapter->wpa_mcast_key;
- else if ( adapter->wpa_unicast_key.len
- && (adapter->wpa_unicast_key.flags & KEY_INFO_WPA_ENABLED))
- pkey = &adapter->wpa_unicast_key;
+ if ( priv->wpa_mcast_key.len
+ && (priv->wpa_mcast_key.flags & KEY_INFO_WPA_ENABLED))
+ pkey = &priv->wpa_mcast_key;
+ else if ( priv->wpa_unicast_key.len
+ && (priv->wpa_unicast_key.flags & KEY_INFO_WPA_ENABLED))
+ pkey = &priv->wpa_unicast_key;
if (pkey) {
if (pkey->type == KEY_TYPE_ID_AES) {
@@ -1477,15 +1452,14 @@ static int lbs_set_encodeext(struct net_device *dev,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
int alg = ext->alg;
struct assoc_request * assoc_req;
lbs_deb_enter(LBS_DEB_WEXT);
- mutex_lock(&adapter->lock);
- assoc_req = lbs_get_association_request(adapter);
+ mutex_lock(&priv->lock);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
ret = -ENOMEM;
goto out;
@@ -1589,7 +1563,7 @@ out:
} else {
lbs_cancel_association_work(priv);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
return ret;
@@ -1602,14 +1576,13 @@ static int lbs_set_genie(struct net_device *dev,
char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
struct assoc_request * assoc_req;
lbs_deb_enter(LBS_DEB_WEXT);
- mutex_lock(&adapter->lock);
- assoc_req = lbs_get_association_request(adapter);
+ mutex_lock(&priv->lock);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
ret = -ENOMEM;
goto out;
@@ -1625,7 +1598,7 @@ static int lbs_set_genie(struct net_device *dev,
memcpy(&assoc_req->wpa_ie[0], extra, dwrq->length);
assoc_req->wpa_ie_len = dwrq->length;
} else {
- memset(&assoc_req->wpa_ie[0], 0, sizeof(adapter->wpa_ie));
+ memset(&assoc_req->wpa_ie[0], 0, sizeof(priv->wpa_ie));
assoc_req->wpa_ie_len = 0;
}
@@ -1636,7 +1609,7 @@ out:
} else {
lbs_cancel_association_work(priv);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
return ret;
@@ -1649,22 +1622,21 @@ static int lbs_get_genie(struct net_device *dev,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
- if (adapter->wpa_ie_len == 0) {
+ if (priv->wpa_ie_len == 0) {
dwrq->length = 0;
goto out;
}
- if (dwrq->length < adapter->wpa_ie_len) {
+ if (dwrq->length < priv->wpa_ie_len) {
ret = -E2BIG;
goto out;
}
- dwrq->length = adapter->wpa_ie_len;
- memcpy(extra, &adapter->wpa_ie[0], adapter->wpa_ie_len);
+ dwrq->length = priv->wpa_ie_len;
+ memcpy(extra, &priv->wpa_ie[0], priv->wpa_ie_len);
out:
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
@@ -1678,15 +1650,14 @@ static int lbs_set_auth(struct net_device *dev,
char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct assoc_request * assoc_req;
int ret = 0;
int updated = 0;
lbs_deb_enter(LBS_DEB_WEXT);
- mutex_lock(&adapter->lock);
- assoc_req = lbs_get_association_request(adapter);
+ mutex_lock(&priv->lock);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
ret = -ENOMEM;
goto out;
@@ -1765,7 +1736,7 @@ out:
} else if (ret != -EOPNOTSUPP) {
lbs_cancel_association_work(priv);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
return ret;
@@ -1778,27 +1749,26 @@ static int lbs_get_auth(struct net_device *dev,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
switch (dwrq->flags & IW_AUTH_INDEX) {
case IW_AUTH_WPA_VERSION:
dwrq->value = 0;
- if (adapter->secinfo.WPAenabled)
+ if (priv->secinfo.WPAenabled)
dwrq->value |= IW_AUTH_WPA_VERSION_WPA;
- if (adapter->secinfo.WPA2enabled)
+ if (priv->secinfo.WPA2enabled)
dwrq->value |= IW_AUTH_WPA_VERSION_WPA2;
if (!dwrq->value)
dwrq->value |= IW_AUTH_WPA_VERSION_DISABLED;
break;
case IW_AUTH_80211_AUTH_ALG:
- dwrq->value = adapter->secinfo.auth_mode;
+ dwrq->value = priv->secinfo.auth_mode;
break;
case IW_AUTH_WPA_ENABLED:
- if (adapter->secinfo.WPAenabled && adapter->secinfo.WPA2enabled)
+ if (priv->secinfo.WPAenabled && priv->secinfo.WPA2enabled)
dwrq->value = 1;
break;
@@ -1816,7 +1786,6 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
{
int ret = 0;
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
u16 dbm;
@@ -1827,7 +1796,7 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
return 0;
}
- adapter->preamble = CMD_TYPE_AUTO_PREAMBLE;
+ priv->preamble = CMD_TYPE_AUTO_PREAMBLE;
lbs_radio_ioctl(priv, RADIO_ON);
@@ -1858,7 +1827,6 @@ static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info,
struct iw_point *dwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
lbs_deb_enter(LBS_DEB_WEXT);
@@ -1870,19 +1838,19 @@ static int lbs_get_essid(struct net_device *dev, struct iw_request_info *info,
/*
* Get the current SSID
*/
- if (adapter->connect_status == LBS_CONNECTED) {
- memcpy(extra, adapter->curbssparams.ssid,
- adapter->curbssparams.ssid_len);
- extra[adapter->curbssparams.ssid_len] = '\0';
+ if (priv->connect_status == LBS_CONNECTED) {
+ memcpy(extra, priv->curbssparams.ssid,
+ priv->curbssparams.ssid_len);
+ extra[priv->curbssparams.ssid_len] = '\0';
} else {
memset(extra, 0, 32);
- extra[adapter->curbssparams.ssid_len] = '\0';
+ extra[priv->curbssparams.ssid_len] = '\0';
}
/*
* If none, we may want to get the one that was set
*/
- dwrq->length = adapter->curbssparams.ssid_len;
+ dwrq->length = priv->curbssparams.ssid_len;
dwrq->flags = 1; /* active */
@@ -1894,7 +1862,6 @@ static int lbs_set_essid(struct net_device *dev, struct iw_request_info *info,
struct iw_point *dwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
int ret = 0;
u8 ssid[IW_ESSID_MAX_SIZE];
u8 ssid_len = 0;
@@ -1927,10 +1894,10 @@ static int lbs_set_essid(struct net_device *dev, struct iw_request_info *info,
}
out:
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
if (ret == 0) {
/* Get or create the current association request */
- assoc_req = lbs_get_association_request(adapter);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
ret = -ENOMEM;
} else {
@@ -1947,7 +1914,7 @@ out:
lbs_cancel_association_work(priv);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
return ret;
@@ -1966,7 +1933,6 @@ static int lbs_set_wap(struct net_device *dev, struct iw_request_info *info,
struct sockaddr *awrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- struct lbs_adapter *adapter = priv->adapter;
struct assoc_request * assoc_req;
int ret = 0;
DECLARE_MAC_BUF(mac);
@@ -1978,10 +1944,10 @@ static int lbs_set_wap(struct net_device *dev, struct iw_request_info *info,
lbs_deb_wext("ASSOC: WAP: sa_data %s\n", print_mac(mac, awrq->sa_data));
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
/* Get or create the current association request */
- assoc_req = lbs_get_association_request(adapter);
+ assoc_req = lbs_get_association_request(priv);
if (!assoc_req) {
lbs_cancel_association_work(priv);
ret = -ENOMEM;
@@ -1992,30 +1958,30 @@ static int lbs_set_wap(struct net_device *dev, struct iw_request_info *info,
lbs_postpone_association_work(priv);
}
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
return ret;
}
-void lbs_get_fwversion(struct lbs_adapter *adapter, char *fwversion, int maxlen)
+void lbs_get_fwversion(struct lbs_private *priv, char *fwversion, int maxlen)
{
char fwver[32];
- mutex_lock(&adapter->lock);
+ mutex_lock(&priv->lock);
- if (adapter->fwreleasenumber[3] == 0)
+ if (priv->fwreleasenumber[3] == 0)
sprintf(fwver, "%u.%u.%u",
- adapter->fwreleasenumber[2],
- adapter->fwreleasenumber[1],
- adapter->fwreleasenumber[0]);
+ priv->fwreleasenumber[2],
+ priv->fwreleasenumber[1],
+ priv->fwreleasenumber[0]);
else
sprintf(fwver, "%u.%u.%u.p%u",
- adapter->fwreleasenumber[2],
- adapter->fwreleasenumber[1],
- adapter->fwreleasenumber[0],
- adapter->fwreleasenumber[3]);
+ priv->fwreleasenumber[2],
+ priv->fwreleasenumber[1],
+ priv->fwreleasenumber[0],
+ priv->fwreleasenumber[3]);
- mutex_unlock(&adapter->lock);
+ mutex_unlock(&priv->lock);
snprintf(fwversion, maxlen, fwver);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 30/48] libertas: use lbs_host_to_card_done() in lbs_tx_timeout()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (28 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 29/48] libertas: kill struct lbs_adapter David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 31/48] libertas: cope with device which already has firmware loaded David Woodhouse
` (103 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 20:56:44 +0000
Also attempt some locking in lbs_host_to_card_done()
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 40 ++++++++++++++-------------------
1 files changed, 17 insertions(+), 23 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 243cdea..2ff5f1b 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -601,31 +601,24 @@ static void lbs_tx_timeout(struct net_device *dev)
lbs_pr_err("tx watch dog timeout\n");
- priv->dnld_sent = DNLD_RES_RECEIVED;
dev->trans_start = jiffies;
if (priv->currenttxskb) {
- if (priv->monitormode != LBS_MONITOR_OFF) {
- /* If we are here, we have not received feedback from
- the previous packet. Assume TX_FAIL and move on. */
- priv->eventcause = 0x01000000;
- lbs_send_tx_feedback(priv);
- } else
- wake_up_interruptible(&priv->waitq);
- } else if (dev == priv->dev) {
- if (priv->connect_status == LBS_CONNECTED)
- netif_wake_queue(priv->dev);
-
- } else if (dev == priv->mesh_dev) {
- if (priv->mesh_connect_status == LBS_CONNECTED)
- netif_wake_queue(priv->mesh_dev);
+ priv->eventcause = 0x01000000;
+ lbs_send_tx_feedback(priv);
}
+ /* XX: Shouldn't we also call into the hw-specific driver
+ to kick it somehow? */
+ lbs_host_to_card_done(priv);
lbs_deb_leave(LBS_DEB_TX);
}
void lbs_host_to_card_done(struct lbs_private *priv)
{
+ unsigned long flags;
+
+ spin_lock_irqsave(&priv->driver_lock, flags);
priv->dnld_sent = DNLD_RES_RECEIVED;
@@ -634,15 +627,16 @@ void lbs_host_to_card_done(struct lbs_private *priv)
wake_up_interruptible(&priv->waitq);
/* Don't wake netif queues if we're in monitor mode and
- a TX packet is already pending. */
- if (priv->currenttxskb)
- return;
-
- if (priv->dev && priv->connect_status == LBS_CONNECTED)
- netif_wake_queue(priv->dev);
+ a TX packet is already pending, or if there are commands
+ queued to be sent. */
+ if (!priv->currenttxskb && list_empty(&priv->cmdpendingq)) {
+ if (priv->dev && priv->connect_status == LBS_CONNECTED)
+ netif_wake_queue(priv->dev);
- if (priv->mesh_dev && priv->mesh_connect_status == LBS_CONNECTED)
- netif_wake_queue(priv->mesh_dev);
+ if (priv->mesh_dev && priv->mesh_connect_status == LBS_CONNECTED)
+ netif_wake_queue(priv->mesh_dev);
+ }
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
}
EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 31/48] libertas: cope with device which already has firmware loaded
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (29 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 30/48] libertas: use lbs_host_to_card_done() in lbs_tx_timeout() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 32/48] libertas: stop debugfs code looking at cmdpendingq David Woodhouse
` (102 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 8 Dec 2007 23:49:06 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 35 ++++++++++++++++++++-----------
drivers/net/wireless/libertas/if_usb.h | 2 +-
2 files changed, 23 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 87bed4a..141d185 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -374,20 +374,23 @@ static int if_prog_firmware(struct usb_card_rec *cardp)
static int if_usb_reset_device(struct usb_card_rec *cardp)
{
+ struct cmd_ds_command *cmd = (void *)&cardp->bulk_out_buffer[4];
int ret;
- struct lbs_private *priv = cardp->priv;
lbs_deb_enter(LBS_DEB_USB);
- /* Try a USB port reset first, if that fails send the reset
- * command to the firmware.
- */
+ *(__le32 *)cardp->bulk_out_buffer = cpu_to_le32(CMD_TYPE_REQUEST);
+
+ cmd->command = cpu_to_le16(CMD_802_11_RESET);
+ cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_reset) + S_DS_GEN);
+ cmd->result = cpu_to_le16(0);
+ cmd->seqnum = cpu_to_le16(0x5a5a);
+ cmd->params.reset.action = cpu_to_le16(CMD_ACT_HALT);
+ usb_tx_block(cardp, cardp->bulk_out_buffer, 4 + S_DS_GEN + sizeof(struct cmd_ds_802_11_reset));
+
+ msleep(10);
ret = usb_reset_device(cardp->udev);
- if (!ret && priv) {
- msleep(10);
- ret = lbs_reset_device(priv);
- msleep(10);
- }
+ msleep(10);
lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
@@ -508,9 +511,15 @@ static void if_usb_receive_fwload(struct urb *urb)
return;
}
if (bootcmdresp.u32magicnumber != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
- lbs_pr_info(
- "boot cmd response wrong magic number (0x%x)\n",
- le32_to_cpu(bootcmdresp.u32magicnumber));
+ if (bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_REQUEST) ||
+ bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_DATA) ||
+ bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_INDICATION)) {
+ lbs_pr_info("Firmware already seems alive; resetting\n");
+ cardp->bootcmdresp = -1;
+ } else {
+ lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
+ le32_to_cpu(bootcmdresp.u32magicnumber));
+ }
} else if (bootcmdresp.u8cmd_tag != BOOT_CMD_FW_BY_USB) {
lbs_pr_info(
"boot cmd response cmd_tag error (%d)\n",
@@ -883,7 +892,7 @@ restart:
} while (cardp->bootcmdresp == 0 && j < 10);
} while (cardp->bootcmdresp == 0 && i < 5);
- if (cardp->bootcmdresp == 0) {
+ if (cardp->bootcmdresp <= 0) {
if (--reset_count >= 0) {
if_usb_reset_device(cardp);
goto restart;
diff --git a/drivers/net/wireless/libertas/if_usb.h b/drivers/net/wireless/libertas/if_usb.h
index f53ddb2..940a369 100644
--- a/drivers/net/wireless/libertas/if_usb.h
+++ b/drivers/net/wireless/libertas/if_usb.h
@@ -70,7 +70,7 @@ struct usb_card_rec {
u8 rx_urb_recall;
- u8 bootcmdresp;
+ s8 bootcmdresp;
};
/** fwheader */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 32/48] libertas: stop debugfs code looking at cmdpendingq
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (30 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 31/48] libertas: cope with device which already has firmware loaded David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 33/48] libertas: kill internal tx queue for PS mode David Woodhouse
` (101 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 11:08:25 -0500
It doesn't need to wait until no commands are pending anyway -- it only
needs to wait until the scan is finished.
We can hopefully find it something else to wait on too -- it's the only
user of the cmd_pending waitqueue.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/debugfs.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index 9917a18..e8a24d7 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -320,8 +320,7 @@ static ssize_t lbs_setuserscan(struct file *file,
lbs_scan_networks(priv, scan_cfg, 1);
wait_event_interruptible(priv->cmd_pending,
- priv->surpriseremoved ||
- (!priv->cur_cmd && list_empty(&priv->cmdpendingq)));
+ priv->surpriseremoved || !priv->last_scanned_channel);
if (priv->surpriseremoved)
goto out_scan_cfg;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 33/48] libertas: kill internal tx queue for PS mode
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (31 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 32/48] libertas: stop debugfs code looking at cmdpendingq David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 34/48] libertas: kill SendSinglePacket() function David Woodhouse
` (100 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 12:37:27 -0500
It was buggy as hell anyway, since it was just spewing packets at the
device when it wasn't necessarily ready for them (in the USB case, while
the URB was still busy).
We could probably do with a better way of flushing packets to the device
_immediately_, before we stick it back into sleep mode. But we can no
longer just dequeue packets directly, it seems.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/decl.h | 2 -
drivers/net/wireless/libertas/dev.h | 5 ----
drivers/net/wireless/libertas/main.c | 6 -----
drivers/net/wireless/libertas/tx.c | 40 ++-------------------------------
4 files changed, 3 insertions(+), 50 deletions(-)
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index e255b19..b094514 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -62,8 +62,6 @@ void lbs_ps_sleep(struct lbs_private *priv, int wait_option);
void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode);
void lbs_ps_wakeup(struct lbs_private *priv, int wait_option);
-void lbs_tx_runqueue(struct lbs_private *priv);
-
struct chan_freq_power *lbs_find_cfp_by_band_and_channel(
struct lbs_private *priv,
u8 band,
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 21b0d38..a9c3adc 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -197,11 +197,6 @@ struct lbs_private {
/** Timers */
struct timer_list command_timer;
- /* TX queue used in PS mode */
- spinlock_t txqueue_lock;
- struct sk_buff *tx_queue_ps[NR_TX_QUEUE];
- unsigned int tx_queue_idx;
-
u8 hisregcpy;
/** current ssid/bssid related parameters*/
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 2ff5f1b..c638995 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -914,8 +914,6 @@ static int lbs_thread(void *data)
*/
if (!list_empty(&priv->cmdpendingq))
wake_up_all(&priv->cmd_pending);
-
- lbs_tx_runqueue(priv);
}
del_timer(&priv->command_timer);
@@ -1072,10 +1070,6 @@ static int lbs_init_adapter(struct lbs_private *priv)
mutex_init(&priv->lock);
- memset(&priv->tx_queue_ps, 0, NR_TX_QUEUE*sizeof(struct sk_buff*));
- priv->tx_queue_idx = 0;
- spin_lock_init(&priv->txqueue_lock);
-
setup_timer(&priv->command_timer, command_timer_fn,
(unsigned long)priv);
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 4cb39d3..749535e 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -164,41 +164,6 @@ done:
}
-void lbs_tx_runqueue(struct lbs_private *priv)
-{
- int i;
-
- spin_lock(&priv->txqueue_lock);
- for (i = 0; i < priv->tx_queue_idx; i++) {
- struct sk_buff *skb = priv->tx_queue_ps[i];
- spin_unlock(&priv->txqueue_lock);
- SendSinglePacket(priv, skb);
- spin_lock(&priv->txqueue_lock);
- }
- priv->tx_queue_idx = 0;
- spin_unlock(&priv->txqueue_lock);
-}
-
-static void lbs_tx_queue(struct lbs_private *priv, struct sk_buff *skb)
-{
-
- spin_lock(&priv->txqueue_lock);
-
- WARN_ON(priv->tx_queue_idx >= NR_TX_QUEUE);
- priv->tx_queue_ps[priv->tx_queue_idx++] = skb;
- if (priv->tx_queue_idx == NR_TX_QUEUE) {
- netif_stop_queue(priv->dev);
- if (priv->mesh_dev)
- netif_stop_queue(priv->mesh_dev);
- } else {
- netif_start_queue(priv->dev);
- if (priv->mesh_dev)
- netif_start_queue(priv->mesh_dev);
- }
-
- spin_unlock(&priv->txqueue_lock);
-}
-
/**
* @brief This function checks the conditions and sends packet to IF
* layer if everything is ok.
@@ -221,8 +186,9 @@ int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
if ((priv->psstate == PS_STATE_SLEEP) ||
(priv->psstate == PS_STATE_PRE_SLEEP)) {
- lbs_tx_queue(priv, skb);
- return ret;
+ lbs_pr_alert("TX error: packet xmit in %ssleep mode\n",
+ priv->psstate == PS_STATE_SLEEP?"":"pre-");
+ goto done;
}
ret = SendSinglePacket(priv, skb);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 34/48] libertas: kill SendSinglePacket() function.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (32 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 33/48] libertas: kill internal tx queue for PS mode David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 35/48] libertas: move lbs_hard_start_xmit() into tx.c David Woodhouse
` (99 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 12:48:10 -0500
Make a start on reducing the number of pointless nested functions,
starting with the StudlyCaps. No semantic changes (yet) -- we can sort
out the now-obvious discrepancy in the failure paths in a separate
commit.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/tx.c | 66 +++++++++++++-----------------------
1 files changed, 24 insertions(+), 42 deletions(-)
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 749535e..10596f3 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -49,16 +49,16 @@ static u32 convert_radiotap_rate_to_mv(u8 rate)
}
/**
- * @brief This function processes a single packet and sends
- * to IF layer
+ * @brief This function checks the conditions and sends packet to IF
+ * layer if everything is ok.
*
* @param priv A pointer to struct lbs_private structure
* @param skb A pointer to skb which includes TX packet
* @return 0 or -1
*/
-static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
+int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
{
- int ret = 0;
+ int ret = -1;
struct txpd localtxpd;
struct txpd *plocaltxpd = &localtxpd;
u8 *p802x_hdr;
@@ -68,16 +68,31 @@ static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
lbs_deb_enter(LBS_DEB_TX);
+ lbs_deb_hex(LBS_DEB_TX, "TX Data", skb->data, min_t(unsigned int, skb->len, 100));
+
+ if (priv->dnld_sent) {
+ lbs_pr_alert( "TX error: dnld_sent = %d, not sending\n",
+ priv->dnld_sent);
+ goto done;
+ }
+
+ if ((priv->psstate == PS_STATE_SLEEP) ||
+ (priv->psstate == PS_STATE_PRE_SLEEP)) {
+ lbs_pr_alert("TX error: packet xmit in %ssleep mode\n",
+ priv->psstate == PS_STATE_SLEEP?"":"pre-");
+ goto done;
+ }
+
if (priv->surpriseremoved)
return -1;
if (!skb->len || (skb->len > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE)) {
lbs_deb_tx("tx err: skb length %d 0 or > %zd\n",
skb->len, MRVDRV_ETH_TX_PACKET_BUFFER_SIZE);
- ret = -1;
- goto done;
+ goto done_tx;
}
+ ret = 0;
memset(plocaltxpd, 0, sizeof(struct txpd));
plocaltxpd->tx_packet_length = cpu_to_le16(skb->len);
@@ -130,12 +145,12 @@ static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
if (ret) {
lbs_deb_tx("tx err: hw_host_to_card returned 0x%X\n", ret);
- goto done;
+ goto done_tx;
}
- lbs_deb_tx("SendSinglePacket succeeds\n");
+ lbs_deb_tx("%s succeeds\n", __func__);
-done:
+done_tx:
if (!ret) {
priv->stats.tx_packets++;
priv->stats.tx_bytes += skb->len;
@@ -159,39 +174,6 @@ done:
dev_kfree_skb_any(skb);
}
- lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
- return ret;
-}
-
-
-/**
- * @brief This function checks the conditions and sends packet to IF
- * layer if everything is ok.
- *
- * @param priv A pointer to struct lbs_private structure
- * @return n/a
- */
-int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
-{
- int ret = -1;
-
- lbs_deb_enter(LBS_DEB_TX);
- lbs_deb_hex(LBS_DEB_TX, "TX Data", skb->data, min_t(unsigned int, skb->len, 100));
-
- if (priv->dnld_sent) {
- lbs_pr_alert( "TX error: dnld_sent = %d, not sending\n",
- priv->dnld_sent);
- goto done;
- }
-
- if ((priv->psstate == PS_STATE_SLEEP) ||
- (priv->psstate == PS_STATE_PRE_SLEEP)) {
- lbs_pr_alert("TX error: packet xmit in %ssleep mode\n",
- priv->psstate == PS_STATE_SLEEP?"":"pre-");
- goto done;
- }
-
- ret = SendSinglePacket(priv, skb);
done:
lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
return ret;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 35/48] libertas: move lbs_hard_start_xmit() into tx.c
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (33 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 34/48] libertas: kill SendSinglePacket() function David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 36/48] libertas: kill lbs_process_tx() by merging it into lbs_hard_start_xmit() David Woodhouse
` (98 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 12:52:19 -0500
... where it can shortly be merged with lbs_process_tx()...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/decl.h | 2 +-
drivers/net/wireless/libertas/main.c | 32 --------------------------------
drivers/net/wireless/libertas/tx.c | 33 ++++++++++++++++++++++++++++++++-
3 files changed, 33 insertions(+), 34 deletions(-)
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index b094514..fcb5a85 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -50,10 +50,10 @@ void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb);
/** The proc fs interface */
int lbs_process_rx_command(struct lbs_private *priv);
-int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb);
void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
struct cmd_ctrl_node *ptempcmd);
+int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band);
int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index c638995..d311d57 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -515,38 +515,6 @@ static int lbs_close(struct net_device *dev)
return 0;
}
-
-static int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
- int ret = 0;
- struct lbs_private *priv = dev->priv;
-
- lbs_deb_enter(LBS_DEB_TX);
-
- /* We could return NETDEV_TX_BUSY here, but I'd actually
- like to get the point where we can BUG() */
- if (priv->dnld_sent) {
- lbs_pr_err("%s while dnld_sent\n", __func__);
- priv->stats.tx_dropped++;
- goto done;
- }
- if (priv->currenttxskb) {
- lbs_pr_err("%s while TX skb pending\n", __func__);
- priv->stats.tx_dropped++;
- goto done;
- }
-
- netif_stop_queue(priv->dev);
- if (priv->mesh_dev)
- netif_stop_queue(priv->mesh_dev);
-
- if (lbs_process_tx(priv, skb) == 0)
- dev->trans_start = jiffies;
-done:
- lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
- return ret;
-}
-
/**
* @brief Mark mesh packets and handover them to lbs_hard_start_xmit
*
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 10596f3..336544c 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -56,7 +56,7 @@ static u32 convert_radiotap_rate_to_mv(u8 rate)
* @param skb A pointer to skb which includes TX packet
* @return 0 or -1
*/
-int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
+static int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
{
int ret = -1;
struct txpd localtxpd;
@@ -179,6 +179,37 @@ done:
return ret;
}
+int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+ int ret = 0;
+ struct lbs_private *priv = dev->priv;
+
+ lbs_deb_enter(LBS_DEB_TX);
+
+ /* We could return NETDEV_TX_BUSY here, but I'd actually
+ like to get the point where we can BUG() */
+ if (priv->dnld_sent) {
+ lbs_pr_err("%s while dnld_sent\n", __func__);
+ priv->stats.tx_dropped++;
+ goto done;
+ }
+ if (priv->currenttxskb) {
+ lbs_pr_err("%s while TX skb pending\n", __func__);
+ priv->stats.tx_dropped++;
+ goto done;
+ }
+
+ netif_stop_queue(priv->dev);
+ if (priv->mesh_dev)
+ netif_stop_queue(priv->mesh_dev);
+
+ if (lbs_process_tx(priv, skb) == 0)
+ dev->trans_start = jiffies;
+done:
+ lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
+ return ret;
+}
+
/**
* @brief This function sends to the host the last transmitted packet,
* filling the radiotap headers with transmission information.
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 36/48] libertas: kill lbs_process_tx() by merging it into lbs_hard_start_xmit()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (34 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 35/48] libertas: move lbs_hard_start_xmit() into tx.c David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 37/48] libertas: clean up lbs_hard_start_xmit() David Woodhouse
` (97 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 12:57:14 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/tx.c | 45 ++++++++++-------------------------
1 files changed, 13 insertions(+), 32 deletions(-)
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 336544c..7bc2124 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -56,8 +56,9 @@ static u32 convert_radiotap_rate_to_mv(u8 rate)
* @param skb A pointer to skb which includes TX packet
* @return 0 or -1
*/
-static int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
+int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
+ struct lbs_private *priv = dev->priv;
int ret = -1;
struct txpd localtxpd;
struct txpd *plocaltxpd = &localtxpd;
@@ -70,12 +71,21 @@ static int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb)
lbs_deb_hex(LBS_DEB_TX, "TX Data", skb->data, min_t(unsigned int, skb->len, 100));
+ netif_stop_queue(priv->dev);
+ if (priv->mesh_dev)
+ netif_stop_queue(priv->mesh_dev);
+
if (priv->dnld_sent) {
lbs_pr_alert( "TX error: dnld_sent = %d, not sending\n",
priv->dnld_sent);
goto done;
}
+ if (priv->currenttxskb) {
+ lbs_pr_err("%s while TX skb pending\n", __func__);
+ goto done;
+ }
+
if ((priv->psstate == PS_STATE_SLEEP) ||
(priv->psstate == PS_STATE_PRE_SLEEP)) {
lbs_pr_alert("TX error: packet xmit in %ssleep mode\n",
@@ -154,6 +164,8 @@ done_tx:
if (!ret) {
priv->stats.tx_packets++;
priv->stats.tx_bytes += skb->len;
+
+ dev->trans_start = jiffies;
} else {
priv->stats.tx_dropped++;
priv->stats.tx_errors++;
@@ -179,37 +191,6 @@ done:
return ret;
}
-int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
- int ret = 0;
- struct lbs_private *priv = dev->priv;
-
- lbs_deb_enter(LBS_DEB_TX);
-
- /* We could return NETDEV_TX_BUSY here, but I'd actually
- like to get the point where we can BUG() */
- if (priv->dnld_sent) {
- lbs_pr_err("%s while dnld_sent\n", __func__);
- priv->stats.tx_dropped++;
- goto done;
- }
- if (priv->currenttxskb) {
- lbs_pr_err("%s while TX skb pending\n", __func__);
- priv->stats.tx_dropped++;
- goto done;
- }
-
- netif_stop_queue(priv->dev);
- if (priv->mesh_dev)
- netif_stop_queue(priv->mesh_dev);
-
- if (lbs_process_tx(priv, skb) == 0)
- dev->trans_start = jiffies;
-done:
- lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
- return ret;
-}
-
/**
* @brief This function sends to the host the last transmitted packet,
* filling the radiotap headers with transmission information.
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 37/48] libertas: clean up lbs_hard_start_xmit()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (35 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 36/48] libertas: kill lbs_process_tx() by merging it into lbs_hard_start_xmit() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 38/48] libertas: kill lbs_pre_start_xmit(), lib_mesh_pre_start_xmit() David Woodhouse
` (96 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 14:37:59 -0500
Having merged the nest of functions into one, now we can clean it up and
fix the error handling, and the duplication -- and at least make a start
on the locking.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/tx.c | 133 +++++++++++++++++-------------------
1 files changed, 63 insertions(+), 70 deletions(-)
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 7bc2124..aefe524 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -58,22 +58,16 @@ static u32 convert_radiotap_rate_to_mv(u8 rate)
*/
int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
+ unsigned long flags;
struct lbs_private *priv = dev->priv;
- int ret = -1;
- struct txpd localtxpd;
- struct txpd *plocaltxpd = &localtxpd;
- u8 *p802x_hdr;
- struct tx_radiotap_hdr *pradiotap_hdr;
- u32 new_rate;
- u8 *ptr = priv->tmptxbuf;
+ struct txpd *txpd;
+ char *p802x_hdr;
+ uint16_t pkt_len;
+ int ret;
lbs_deb_enter(LBS_DEB_TX);
- lbs_deb_hex(LBS_DEB_TX, "TX Data", skb->data, min_t(unsigned int, skb->len, 100));
-
- netif_stop_queue(priv->dev);
- if (priv->mesh_dev)
- netif_stop_queue(priv->mesh_dev);
+ ret = NETDEV_TX_BUSY;
if (priv->dnld_sent) {
lbs_pr_alert( "TX error: dnld_sent = %d, not sending\n",
@@ -94,98 +88,97 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
}
if (priv->surpriseremoved)
- return -1;
+ goto drop;
if (!skb->len || (skb->len > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE)) {
lbs_deb_tx("tx err: skb length %d 0 or > %zd\n",
skb->len, MRVDRV_ETH_TX_PACKET_BUFFER_SIZE);
- goto done_tx;
+ /* We'll never manage to send this one; drop it and return 'OK' */
+ goto drop;
}
- ret = 0;
- memset(plocaltxpd, 0, sizeof(struct txpd));
-
- plocaltxpd->tx_packet_length = cpu_to_le16(skb->len);
+ lbs_deb_hex(LBS_DEB_TX, "TX Data", skb->data, min_t(unsigned int, skb->len, 100));
- /* offset of actual data */
- plocaltxpd->tx_packet_location = cpu_to_le32(sizeof(struct txpd));
+ txpd = (void *)priv->tmptxbuf;
+ memset(txpd, 0, sizeof(struct txpd));
p802x_hdr = skb->data;
- if (priv->monitormode != LBS_MONITOR_OFF) {
+ pkt_len = skb->len;
- /* locate radiotap header */
- pradiotap_hdr = (struct tx_radiotap_hdr *)skb->data;
+ if (priv->monitormode != LBS_MONITOR_OFF) {
+ struct tx_radiotap_hdr *rtap_hdr = (void *)skb->data;
/* set txpd fields from the radiotap header */
- new_rate = convert_radiotap_rate_to_mv(pradiotap_hdr->rate);
- if (new_rate != 0) {
- /* use new tx_control[4:0] */
- plocaltxpd->tx_control = cpu_to_le32(new_rate);
- }
+ txpd->tx_control = cpu_to_le32(convert_radiotap_rate_to_mv(rtap_hdr->rate));
/* skip the radiotap header */
- p802x_hdr += sizeof(struct tx_radiotap_hdr);
- plocaltxpd->tx_packet_length =
- cpu_to_le16(le16_to_cpu(plocaltxpd->tx_packet_length)
- - sizeof(struct tx_radiotap_hdr));
+ p802x_hdr += sizeof(*rtap_hdr);
+ pkt_len -= sizeof(*rtap_hdr);
+ /* copy destination address from 802.11 header */
+ memcpy(txpd->tx_dest_addr_high, p802x_hdr + 4, ETH_ALEN);
+ } else {
+ /* copy destination address from 802.3 header */
+ memcpy(txpd->tx_dest_addr_high, p802x_hdr, ETH_ALEN);
}
- /* copy destination address from 802.3 or 802.11 header */
- if (priv->monitormode != LBS_MONITOR_OFF)
- memcpy(plocaltxpd->tx_dest_addr_high, p802x_hdr + 4, ETH_ALEN);
- else
- memcpy(plocaltxpd->tx_dest_addr_high, p802x_hdr, ETH_ALEN);
- lbs_deb_hex(LBS_DEB_TX, "txpd", (u8 *) plocaltxpd, sizeof(struct txpd));
+ txpd->tx_packet_length = cpu_to_le16(pkt_len);
+ txpd->tx_packet_location = cpu_to_le32(sizeof(struct txpd));
- if (IS_MESH_FRAME(skb)) {
- plocaltxpd->tx_control |= cpu_to_le32(TxPD_MESH_FRAME);
- }
+ if (dev == priv->mesh_dev)
+ txpd->tx_control |= cpu_to_le32(TxPD_MESH_FRAME);
- memcpy(ptr, plocaltxpd, sizeof(struct txpd));
+ lbs_deb_hex(LBS_DEB_TX, "txpd", (u8 *) &txpd, sizeof(struct txpd));
- ptr += sizeof(struct txpd);
+ lbs_deb_hex(LBS_DEB_TX, "Tx Data", (u8 *) p802x_hdr, le16_to_cpu(txpd->tx_packet_length));
- lbs_deb_hex(LBS_DEB_TX, "Tx Data", (u8 *) p802x_hdr, le16_to_cpu(plocaltxpd->tx_packet_length));
- memcpy(ptr, p802x_hdr, le16_to_cpu(plocaltxpd->tx_packet_length));
- ret = priv->hw_host_to_card(priv, MVMS_DAT,
- priv->tmptxbuf,
- le16_to_cpu(plocaltxpd->tx_packet_length) +
- sizeof(struct txpd));
+ memcpy(&txpd[1], p802x_hdr, le16_to_cpu(txpd->tx_packet_length));
- if (ret) {
- lbs_deb_tx("tx err: hw_host_to_card returned 0x%X\n", ret);
- goto done_tx;
- }
+ /* We need to protect against the queues being restarted before
+ we get round to stopping them */
+ spin_lock_irqsave(&priv->driver_lock, flags);
- lbs_deb_tx("%s succeeds\n", __func__);
+ ret = priv->hw_host_to_card(priv, MVMS_DAT, priv->tmptxbuf,
+ pkt_len + sizeof(struct txpd));
-done_tx:
if (!ret) {
+ lbs_deb_tx("%s succeeds\n", __func__);
+
+ /* Stop processing outgoing pkts before submitting */
+ netif_stop_queue(priv->dev);
+ if (priv->mesh_dev)
+ netif_stop_queue(priv->mesh_dev);
+
priv->stats.tx_packets++;
priv->stats.tx_bytes += skb->len;
- dev->trans_start = jiffies;
- } else {
- priv->stats.tx_dropped++;
- priv->stats.tx_errors++;
+ dev->trans_start = jiffies;
+
+ if (priv->monitormode != LBS_MONITOR_OFF) {
+ /* Keep the skb to echo it back once Tx feedback is
+ received from FW */
+ skb_orphan(skb);
+
+ /* Keep the skb around for when we get feedback */
+ priv->currenttxskb = skb;
+ }
}
+
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
- if (!ret && priv->monitormode != LBS_MONITOR_OFF) {
- /* Keep the skb to echo it back once Tx feedback is
- received from FW */
- skb_orphan(skb);
- /* stop processing outgoing pkts */
- netif_stop_queue(priv->dev);
- if (priv->mesh_dev)
- netif_stop_queue(priv->mesh_dev);
+ if (ret) {
+ lbs_deb_tx("tx err: hw_host_to_card returned 0x%X\n", ret);
+drop:
+ priv->stats.tx_dropped++;
+ priv->stats.tx_errors++;
- /* Keep the skb around for when we get feedback */
- priv->currenttxskb = skb;
- } else {
dev_kfree_skb_any(skb);
}
+ /* Even if we dropped the packet, return OK. Otherwise the
+ packet gets requeued. */
+ ret = NETDEV_TX_OK;
+
done:
lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
return ret;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 38/48] libertas: kill lbs_pre_start_xmit(), lib_mesh_pre_start_xmit()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (36 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 37/48] libertas: clean up lbs_hard_start_xmit() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 39/48] libertas: stop using ieee80211 for radiotap device David Woodhouse
` (95 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 15:04:19 -0500
These wrappers only do two things.
Firstly, they set the frame type, which isn't necessary since
lbs_hard_start_xmit() gets to see which device it belongs to anyway.
Secondly, they return -EOPNOTSUPP if the device is in monitor mode.
Which is a strange thing to do and will provide nasty warnings from
qdisc_restart(). And lbs_hard_start_xmit() seems to have code to cope
with monitor mode anyway.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 50 +--------------------------------
1 files changed, 2 insertions(+), 48 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index d311d57..5c8cb00 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -515,52 +515,6 @@ static int lbs_close(struct net_device *dev)
return 0;
}
-/**
- * @brief Mark mesh packets and handover them to lbs_hard_start_xmit
- *
- */
-static int lbs_mesh_pre_start_xmit(struct sk_buff *skb,
- struct net_device *dev)
-{
- struct lbs_private *priv = dev->priv;
- int ret;
-
- lbs_deb_enter(LBS_DEB_MESH);
- if (priv->monitormode != LBS_MONITOR_OFF) {
- netif_stop_queue(dev);
- return -EOPNOTSUPP;
- }
-
- SET_MESH_FRAME(skb);
-
- ret = lbs_hard_start_xmit(skb, priv->mesh_dev);
- lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret);
- return ret;
-}
-
-/**
- * @brief Mark non-mesh packets and handover them to lbs_hard_start_xmit
- *
- */
-static int lbs_pre_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
- struct lbs_private *priv = dev->priv;
- int ret;
-
- lbs_deb_enter(LBS_DEB_TX);
-
- if (priv->monitormode != LBS_MONITOR_OFF) {
- netif_stop_queue(dev);
- return -EOPNOTSUPP;
- }
-
- UNSET_MESH_FRAME(skb);
-
- ret = lbs_hard_start_xmit(skb, dev);
- lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
- return ret;
-}
-
static void lbs_tx_timeout(struct net_device *dev)
{
struct lbs_private *priv = (struct lbs_private *) dev->priv;
@@ -1104,7 +1058,7 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
/* Setup the OS Interface to our functions */
dev->open = lbs_open;
- dev->hard_start_xmit = lbs_pre_start_xmit;
+ dev->hard_start_xmit = lbs_hard_start_xmit;
dev->stop = lbs_close;
dev->set_mac_address = lbs_set_mac_address;
dev->tx_timeout = lbs_tx_timeout;
@@ -1276,7 +1230,7 @@ int lbs_add_mesh(struct lbs_private *priv, struct device *dev)
priv->mesh_dev = mesh_dev;
mesh_dev->open = lbs_mesh_open;
- mesh_dev->hard_start_xmit = lbs_mesh_pre_start_xmit;
+ mesh_dev->hard_start_xmit = lbs_hard_start_xmit;
mesh_dev->stop = lbs_mesh_close;
mesh_dev->get_stats = lbs_get_stats;
mesh_dev->set_mac_address = lbs_set_mac_address;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 39/48] libertas: stop using ieee80211 for radiotap device
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (37 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 38/48] libertas: kill lbs_pre_start_xmit(), lib_mesh_pre_start_xmit() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 40/48] libertas: set dev_addr on rtap device David Woodhouse
` (94 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 16:22:21 -0500
There seems to be no point in doing it as an ieee80211 device instead of
a normal netdev, and when we override its ->priv and then call
free_ieee80211() it has a distressing tendency to crash horribly.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/dev.h | 2 -
drivers/net/wireless/libertas/main.c | 36 ++++++++++++++-------------------
2 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index a9c3adc..04cf33d 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -10,7 +10,6 @@
#include <linux/wireless.h>
#include <linux/ethtool.h>
#include <linux/debugfs.h>
-#include <net/ieee80211.h>
#include "defs.h"
#include "scan.h"
@@ -114,7 +113,6 @@ struct lbs_private {
struct net_device_stats stats;
struct net_device *mesh_dev; /* Virtual device */
struct net_device *rtap_net_dev;
- struct ieee80211_device *ieee;
struct iw_statistics wstats;
struct lbs_mesh_stats mstats;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 5c8cb00..55dce8d 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1448,7 +1448,7 @@ static int lbs_rtap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev)
{
struct lbs_private *priv = dev->priv;
- return &priv->ieee->stats;
+ return &priv->stats;
}
@@ -1457,42 +1457,36 @@ void lbs_remove_rtap(struct lbs_private *priv)
if (priv->rtap_net_dev == NULL)
return;
unregister_netdev(priv->rtap_net_dev);
- free_ieee80211(priv->rtap_net_dev);
+ free_netdev(priv->rtap_net_dev);
priv->rtap_net_dev = NULL;
}
int lbs_add_rtap(struct lbs_private *priv)
{
int rc = 0;
+ struct net_device *rtap_dev;
if (priv->rtap_net_dev)
return -EPERM;
- priv->rtap_net_dev = alloc_ieee80211(0);
- if (priv->rtap_net_dev == NULL)
+ rtap_dev = alloc_netdev(0, "rtap%d", ether_setup);
+ if (rtap_dev == NULL)
return -ENOMEM;
+ rtap_dev->type = ARPHRD_IEEE80211_RADIOTAP;
+ rtap_dev->open = lbs_rtap_open;
+ rtap_dev->stop = lbs_rtap_stop;
+ rtap_dev->get_stats = lbs_rtap_get_stats;
+ rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
+ rtap_dev->set_multicast_list = lbs_set_multicast_list;
+ rtap_dev->priv = priv;
- priv->ieee = netdev_priv(priv->rtap_net_dev);
-
- strcpy(priv->rtap_net_dev->name, "rtap%d");
-
- priv->rtap_net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
- priv->rtap_net_dev->open = lbs_rtap_open;
- priv->rtap_net_dev->stop = lbs_rtap_stop;
- priv->rtap_net_dev->get_stats = lbs_rtap_get_stats;
- priv->rtap_net_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
- priv->rtap_net_dev->set_multicast_list = lbs_set_multicast_list;
- priv->rtap_net_dev->priv = priv;
-
- priv->ieee->iw_mode = IW_MODE_MONITOR;
-
- rc = register_netdev(priv->rtap_net_dev);
+ rc = register_netdev(rtap_dev);
if (rc) {
- free_ieee80211(priv->rtap_net_dev);
- priv->rtap_net_dev = NULL;
+ free_netdev(rtap_dev);
return rc;
}
+ priv->rtap_net_dev = rtap_dev;
return 0;
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 40/48] libertas: set dev_addr on rtap device
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (38 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 39/48] libertas: stop using ieee80211 for radiotap device David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 41/48] libertas: TX packet is radiotap iff it comes from rtap_dev David Woodhouse
` (93 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 19:54:11 -0500
This lets us bring it up, because eth_validate_addr() succeeds instead
of returning -EINVAL. And finally monitor mode seems to (mostly) work.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 55dce8d..e9c6b4f 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1473,6 +1473,7 @@ int lbs_add_rtap(struct lbs_private *priv)
if (rtap_dev == NULL)
return -ENOMEM;
+ memcpy(rtap_dev->dev_addr, priv->current_addr, ETH_ALEN);
rtap_dev->type = ARPHRD_IEEE80211_RADIOTAP;
rtap_dev->open = lbs_rtap_open;
rtap_dev->stop = lbs_rtap_stop;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 41/48] libertas: TX packet is radiotap iff it comes from rtap_dev
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (39 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 40/48] libertas: set dev_addr on rtap device David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 42/48] libertas: free successfully transmitted skbs again David Woodhouse
` (92 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 22:00:55 -0500
Fix one of the barriers to simultaneous radiotap and normal operation --
stop misinterpreting the TX packets on the normal devices. We're also
going to have to clone the incoming skbs and feed them into both
devices, and there seem to be firmware problems with staying associated
too. But this is a reasonable start...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/tx.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index aefe524..c2881a9 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -105,7 +105,7 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
p802x_hdr = skb->data;
pkt_len = skb->len;
- if (priv->monitormode != LBS_MONITOR_OFF) {
+ if (dev == priv->rtap_net_dev) {
struct tx_radiotap_hdr *rtap_hdr = (void *)skb->data;
/* set txpd fields from the radiotap header */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 42/48] libertas: free successfully transmitted skbs again
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (40 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 41/48] libertas: TX packet is radiotap iff it comes from rtap_dev David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 43/48] libertas: refactor the 'should I sleep?' decision in lbs_thread() David Woodhouse
` (91 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 22:02:46 -0500
I was so busy cleaning up the failure modes that I accidentally forgot
to make sure we still free them in the success case. Oops.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/tx.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index c2881a9..300aa05 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -161,7 +161,9 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* Keep the skb around for when we get feedback */
priv->currenttxskb = skb;
- }
+ } else
+ dev_kfree_skb_any(skb);
+
}
spin_unlock_irqrestore(&priv->driver_lock, flags);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 43/48] libertas: refactor the 'should I sleep?' decision in lbs_thread()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (41 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 42/48] libertas: free successfully transmitted skbs again David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 44/48] libertas: Move actual transmission to main thread David Woodhouse
` (90 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 23:44:43 -0500
This was making my brain hurt.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 20 ++++++++++++++++++--
1 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index e9c6b4f..42b64b5 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -722,6 +722,8 @@ static int lbs_thread(void *data)
set_freezable();
for (;;) {
+ int shouldsleep;
+
lbs_deb_thread( "main-thread 111: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
priv->intcounter, priv->currenttxskb, priv->dnld_sent);
@@ -729,8 +731,22 @@ static int lbs_thread(void *data)
set_current_state(TASK_INTERRUPTIBLE);
spin_lock_irq(&priv->driver_lock);
- if ((priv->psstate == PS_STATE_SLEEP) ||
- (!priv->intcounter && (priv->dnld_sent || priv->cur_cmd || list_empty(&priv->cmdpendingq)))) {
+ if (priv->surpriseremoved)
+ shouldsleep = 0; /* Bye */
+ else if (priv->psstate == PS_STATE_SLEEP)
+ shouldsleep = 1; /* Sleep mode. Nothing we can do till it wakes */
+ else if (priv->intcounter)
+ shouldsleep = 0; /* Interrupt pending. Deal with it now */
+ else if (priv->dnld_sent)
+ shouldsleep = 1; /* Something is en route to the device already */
+ else if (priv->cur_cmd)
+ shouldsleep = 1; /* Can't send a command; one already running */
+ else if (!list_empty(&priv->cmdpendingq))
+ shouldsleep = 0; /* We have a command to send */
+ else
+ shouldsleep = 1; /* No command */
+
+ if (shouldsleep) {
lbs_deb_thread("main-thread sleeping... Conn=%d IntC=%d PS_mode=%d PS_State=%d\n",
priv->connect_status, priv->intcounter,
priv->psmode, priv->psstate);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 44/48] libertas: Move actual transmission to main thread
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (42 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 43/48] libertas: refactor the 'should I sleep?' decision in lbs_thread() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 45/48] libertas: remove unreachable code from process_rxed_802_11_packet() David Woodhouse
` (89 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 9 Dec 2007 23:54:27 -0500
The locking issues with TX, especially TX from multiple netdevs, get
_so_ much easier if you do it like this.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/dev.h | 5 +-
drivers/net/wireless/libertas/main.c | 24 ++++++++
drivers/net/wireless/libertas/tx.c | 103 ++++++++++++++--------------------
3 files changed, 71 insertions(+), 61 deletions(-)
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 04cf33d..4681405 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -164,7 +164,10 @@ struct lbs_private {
struct mutex lock;
- u8 tmptxbuf[LBS_UPLD_SIZE];
+ /* TX packet ready to be sent... */
+ int tx_pending_len; /* -1 while building packet */
+
+ u8 tx_pending_buf[LBS_UPLD_SIZE];
/* protected by hard_start_xmit serialization */
/** command-related variables */
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 42b64b5..f16c93b 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -739,6 +739,8 @@ static int lbs_thread(void *data)
shouldsleep = 0; /* Interrupt pending. Deal with it now */
else if (priv->dnld_sent)
shouldsleep = 1; /* Something is en route to the device already */
+ else if (priv->tx_pending_len > 0)
+ shouldsleep = 0; /* We've a packet to send */
else if (priv->cur_cmd)
shouldsleep = 1; /* Can't send a command; one already running */
else if (!list_empty(&priv->cmdpendingq))
@@ -852,6 +854,28 @@ static int lbs_thread(void *data)
*/
if (!list_empty(&priv->cmdpendingq))
wake_up_all(&priv->cmd_pending);
+
+ spin_lock_irq(&priv->driver_lock);
+ if (!priv->dnld_sent && priv->tx_pending_len > 0) {
+ int ret = priv->hw_host_to_card(priv, MVMS_DAT,
+ priv->tx_pending_buf,
+ priv->tx_pending_len);
+ if (ret) {
+ lbs_deb_tx("host_to_card failed %d\n", ret);
+ priv->dnld_sent = DNLD_RES_RECEIVED;
+ }
+ priv->tx_pending_len = 0;
+ if (!priv->currenttxskb) {
+ /* We can wake the queues immediately if we aren't
+ waiting for TX feedback */
+ if (priv->connect_status == LBS_CONNECTED)
+ netif_wake_queue(priv->dev);
+ if (priv->mesh_dev &&
+ priv->mesh_connect_status == LBS_CONNECTED)
+ netif_wake_queue(priv->mesh_dev);
+ }
+ }
+ spin_unlock_irq(&priv->driver_lock);
}
del_timer(&priv->command_timer);
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 300aa05..e2141f0 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -67,39 +67,45 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
lbs_deb_enter(LBS_DEB_TX);
- ret = NETDEV_TX_BUSY;
-
- if (priv->dnld_sent) {
- lbs_pr_alert( "TX error: dnld_sent = %d, not sending\n",
- priv->dnld_sent);
- goto done;
- }
-
- if (priv->currenttxskb) {
- lbs_pr_err("%s while TX skb pending\n", __func__);
- goto done;
- }
+ ret = NETDEV_TX_OK;
- if ((priv->psstate == PS_STATE_SLEEP) ||
- (priv->psstate == PS_STATE_PRE_SLEEP)) {
- lbs_pr_alert("TX error: packet xmit in %ssleep mode\n",
- priv->psstate == PS_STATE_SLEEP?"":"pre-");
- goto done;
- }
+ /* We need to protect against the queues being restarted before
+ we get round to stopping them */
+ spin_lock_irqsave(&priv->driver_lock, flags);
if (priv->surpriseremoved)
- goto drop;
+ goto free;
if (!skb->len || (skb->len > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE)) {
lbs_deb_tx("tx err: skb length %d 0 or > %zd\n",
skb->len, MRVDRV_ETH_TX_PACKET_BUFFER_SIZE);
/* We'll never manage to send this one; drop it and return 'OK' */
- goto drop;
+
+ priv->stats.tx_dropped++;
+ priv->stats.tx_errors++;
+ goto free;
+ }
+
+
+ netif_stop_queue(priv->dev);
+ if (priv->mesh_dev)
+ netif_stop_queue(priv->mesh_dev);
+
+ if (priv->tx_pending_len) {
+ /* This can happen if packets come in on the mesh and eth
+ device simultaneously -- there's no mutual exclusion on
+ hard_start_xmit() calls between devices. */
+ lbs_deb_tx("Packet on %s while busy\n", dev->name);
+ ret = NETDEV_TX_BUSY;
+ goto unlock;
}
+ priv->tx_pending_len = -1;
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
+
lbs_deb_hex(LBS_DEB_TX, "TX Data", skb->data, min_t(unsigned int, skb->len, 100));
- txpd = (void *)priv->tmptxbuf;
+ txpd = (void *)priv->tx_pending_buf;
memset(txpd, 0, sizeof(struct txpd));
p802x_hdr = skb->data;
@@ -134,54 +140,31 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
memcpy(&txpd[1], p802x_hdr, le16_to_cpu(txpd->tx_packet_length));
- /* We need to protect against the queues being restarted before
- we get round to stopping them */
spin_lock_irqsave(&priv->driver_lock, flags);
+ priv->tx_pending_len = pkt_len + sizeof(struct txpd);
- ret = priv->hw_host_to_card(priv, MVMS_DAT, priv->tmptxbuf,
- pkt_len + sizeof(struct txpd));
-
- if (!ret) {
- lbs_deb_tx("%s succeeds\n", __func__);
-
- /* Stop processing outgoing pkts before submitting */
- netif_stop_queue(priv->dev);
- if (priv->mesh_dev)
- netif_stop_queue(priv->mesh_dev);
-
- priv->stats.tx_packets++;
- priv->stats.tx_bytes += skb->len;
-
- dev->trans_start = jiffies;
+ lbs_deb_tx("%s lined up packet\n", __func__);
- if (priv->monitormode != LBS_MONITOR_OFF) {
- /* Keep the skb to echo it back once Tx feedback is
- received from FW */
- skb_orphan(skb);
+ priv->stats.tx_packets++;
+ priv->stats.tx_bytes += skb->len;
- /* Keep the skb around for when we get feedback */
- priv->currenttxskb = skb;
- } else
- dev_kfree_skb_any(skb);
-
- }
-
- spin_unlock_irqrestore(&priv->driver_lock, flags);
+ dev->trans_start = jiffies;
- if (ret) {
- lbs_deb_tx("tx err: hw_host_to_card returned 0x%X\n", ret);
-drop:
- priv->stats.tx_dropped++;
- priv->stats.tx_errors++;
+ if (priv->monitormode != LBS_MONITOR_OFF) {
+ /* Keep the skb to echo it back once Tx feedback is
+ received from FW */
+ skb_orphan(skb);
+ /* Keep the skb around for when we get feedback */
+ priv->currenttxskb = skb;
+ } else {
+ free:
dev_kfree_skb_any(skb);
}
+ unlock:
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
+ wake_up(&priv->waitq);
- /* Even if we dropped the packet, return OK. Otherwise the
- packet gets requeued. */
- ret = NETDEV_TX_OK;
-
-done:
lbs_deb_leave_args(LBS_DEB_TX, "ret %d", ret);
return ret;
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 45/48] libertas: remove unreachable code from process_rxed_802_11_packet()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (43 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 44/48] libertas: Move actual transmission to main thread David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 46/48] libertas: fix error cases in lbs_process_rxed_802_11_packet() David Woodhouse
` (88 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 00:05:37 -0500
The function is only ever called if we're in rtap mode. So the bit in it
which is conditional on rtap mode seems a little superfluous.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/rx.c | 75 +++++++++++++++--------------------
1 files changed, 32 insertions(+), 43 deletions(-)
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c
index 58e8311..90a2199 100644
--- a/drivers/net/wireless/libertas/rx.c
+++ b/drivers/net/wireless/libertas/rx.c
@@ -355,52 +355,41 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
skb->len, sizeof(struct rxpd), skb->len - sizeof(struct rxpd));
/* create the exported radio header */
- if (priv->monitormode == LBS_MONITOR_OFF) {
- /* no radio header */
- /* chop the rxpd */
- skb_pull(skb, sizeof(struct rxpd));
- }
- else {
- /* radiotap header */
- radiotap_hdr.hdr.it_version = 0;
- /* XXX must check this value for pad */
- radiotap_hdr.hdr.it_pad = 0;
- radiotap_hdr.hdr.it_len = cpu_to_le16 (sizeof(struct rx_radiotap_hdr));
- radiotap_hdr.hdr.it_present = cpu_to_le32 (RX_RADIOTAP_PRESENT);
- /* unknown values */
- radiotap_hdr.flags = 0;
- radiotap_hdr.chan_freq = 0;
- radiotap_hdr.chan_flags = 0;
- radiotap_hdr.antenna = 0;
- /* known values */
- radiotap_hdr.rate = convert_mv_rate_to_radiotap(prxpd->rx_rate);
- /* XXX must check no carryout */
- radiotap_hdr.antsignal = prxpd->snr + prxpd->nf;
- radiotap_hdr.rx_flags = 0;
- if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK)))
- radiotap_hdr.rx_flags |= IEEE80211_RADIOTAP_F_RX_BADFCS;
- //memset(radiotap_hdr.pad, 0x11, IEEE80211_RADIOTAP_HDRLEN - 18);
-
- /* chop the rxpd */
- skb_pull(skb, sizeof(struct rxpd));
-
- /* add space for the new radio header */
- if ((skb_headroom(skb) < sizeof(struct rx_radiotap_hdr)) &&
- pskb_expand_head(skb, sizeof(struct rx_radiotap_hdr), 0,
- GFP_ATOMIC)) {
- lbs_pr_alert("%s: couldn't pskb_expand_head\n",
- __func__);
- }
-
- pradiotap_hdr =
- (struct rx_radiotap_hdr *)skb_push(skb,
- sizeof(struct
- rx_radiotap_hdr));
- memcpy(pradiotap_hdr, &radiotap_hdr,
- sizeof(struct rx_radiotap_hdr));
+ /* radiotap header */
+ radiotap_hdr.hdr.it_version = 0;
+ /* XXX must check this value for pad */
+ radiotap_hdr.hdr.it_pad = 0;
+ radiotap_hdr.hdr.it_len = cpu_to_le16 (sizeof(struct rx_radiotap_hdr));
+ radiotap_hdr.hdr.it_present = cpu_to_le32 (RX_RADIOTAP_PRESENT);
+ /* unknown values */
+ radiotap_hdr.flags = 0;
+ radiotap_hdr.chan_freq = 0;
+ radiotap_hdr.chan_flags = 0;
+ radiotap_hdr.antenna = 0;
+ /* known values */
+ radiotap_hdr.rate = convert_mv_rate_to_radiotap(prxpd->rx_rate);
+ /* XXX must check no carryout */
+ radiotap_hdr.antsignal = prxpd->snr + prxpd->nf;
+ radiotap_hdr.rx_flags = 0;
+ if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK)))
+ radiotap_hdr.rx_flags |= IEEE80211_RADIOTAP_F_RX_BADFCS;
+ //memset(radiotap_hdr.pad, 0x11, IEEE80211_RADIOTAP_HDRLEN - 18);
+
+ /* chop the rxpd */
+ skb_pull(skb, sizeof(struct rxpd));
+
+ /* add space for the new radio header */
+ if ((skb_headroom(skb) < sizeof(struct rx_radiotap_hdr)) &&
+ pskb_expand_head(skb, sizeof(struct rx_radiotap_hdr), 0,
+ GFP_ATOMIC)) {
+ lbs_pr_alert("%s: couldn't pskb_expand_head\n",
+ __func__);
}
+ pradiotap_hdr = (void *)skb_push(skb, sizeof(struct rx_radiotap_hdr));
+ memcpy(pradiotap_hdr, &radiotap_hdr, sizeof(struct rx_radiotap_hdr));
+
/* Take the data rate from the rxpd structure
* only if the rate is auto
*/
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 46/48] libertas: fix error cases in lbs_process_rxed_802_11_packet()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (44 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 45/48] libertas: remove unreachable code from process_rxed_802_11_packet() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 47/48] libertas: kill lbs_upload_tx_packet() David Woodhouse
` (87 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 00:17:28 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/rx.c | 14 ++++++++------
1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c
index 90a2199..141069f 100644
--- a/drivers/net/wireless/libertas/rx.c
+++ b/drivers/net/wireless/libertas/rx.c
@@ -337,9 +337,10 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
// lbs_deb_hex(LBS_DEB_RX, "RX Data: Before chop rxpd", skb->data, min(skb->len, 100));
if (skb->len < (ETH_HLEN + 8 + sizeof(struct rxpd))) {
- lbs_deb_rx("rx err: frame received wit bad length\n");
+ lbs_deb_rx("rx err: frame received with bad length\n");
priv->stats.rx_length_errors++;
- ret = 0;
+ ret = -EINVAL;
+ kfree(skb);
goto done;
}
@@ -381,10 +382,11 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
/* add space for the new radio header */
if ((skb_headroom(skb) < sizeof(struct rx_radiotap_hdr)) &&
- pskb_expand_head(skb, sizeof(struct rx_radiotap_hdr), 0,
- GFP_ATOMIC)) {
- lbs_pr_alert("%s: couldn't pskb_expand_head\n",
- __func__);
+ pskb_expand_head(skb, sizeof(struct rx_radiotap_hdr), 0, GFP_ATOMIC)) {
+ lbs_pr_alert("%s: couldn't pskb_expand_head\n", __func__);
+ ret = -ENOMEM;
+ kfree_skb(skb);
+ goto done;
}
pradiotap_hdr = (void *)skb_push(skb, sizeof(struct rx_radiotap_hdr));
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 47/48] libertas: kill lbs_upload_tx_packet()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (45 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 46/48] libertas: fix error cases in lbs_process_rxed_802_11_packet() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-10 15:46 ` [PATCH 48/48] libertas: kill (IS,SET,UNSET)_MESH_FRAME David Woodhouse
` (86 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 00:49:26 -0500
It replaces two lines of code. And even for those it has to make
inferences about things (i.e. which device) which the caller would have
just known.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/decl.h | 2 --
drivers/net/wireless/libertas/rx.c | 32 +++++++++-----------------------
drivers/net/wireless/libertas/tx.c | 8 +++++++-
3 files changed, 16 insertions(+), 26 deletions(-)
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index fcb5a85..e8387c7 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -46,8 +46,6 @@ void lbs_get_fwversion(struct lbs_private *priv,
char *fwversion,
int maxlen);
-void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb);
-
/** The proc fs interface */
int lbs_process_rx_command(struct lbs_private *priv);
void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
diff --git a/drivers/net/wireless/libertas/rx.c b/drivers/net/wireless/libertas/rx.c
index 141069f..6332fd4 100644
--- a/drivers/net/wireless/libertas/rx.c
+++ b/drivers/net/wireless/libertas/rx.c
@@ -131,22 +131,6 @@ static void lbs_compute_rssi(struct lbs_private *priv, struct rxpd *p_rx_pd)
lbs_deb_leave(LBS_DEB_RX);
}
-void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb)
-{
- lbs_deb_rx("skb->data %p\n", skb->data);
-
- if (priv->monitormode != LBS_MONITOR_OFF) {
- skb->protocol = eth_type_trans(skb, priv->rtap_net_dev);
- } else {
- if (priv->mesh_dev && IS_MESH_FRAME(skb))
- skb->protocol = eth_type_trans(skb, priv->mesh_dev);
- else
- skb->protocol = eth_type_trans(skb, priv->dev);
- }
- skb->ip_summed = CHECKSUM_NONE;
- netif_rx(skb);
-}
-
/**
* @brief This function processes received packet and forwards it
* to kernel/upper layer
@@ -158,7 +142,7 @@ void lbs_upload_rx_packet(struct lbs_private *priv, struct sk_buff *skb)
int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
{
int ret = 0;
-
+ struct net_device *dev = priv->dev;
struct rxpackethdr *p_rx_pkt;
struct rxpd *p_rx_pd;
@@ -169,15 +153,15 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
lbs_deb_enter(LBS_DEB_RX);
+ skb->ip_summed = CHECKSUM_NONE;
+
if (priv->monitormode != LBS_MONITOR_OFF)
return process_rxed_802_11_packet(priv, skb);
p_rx_pkt = (struct rxpackethdr *) skb->data;
p_rx_pd = &p_rx_pkt->rx_pd;
- if (p_rx_pd->rx_control & RxPD_MESH_FRAME)
- SET_MESH_FRAME(skb);
- else
- UNSET_MESH_FRAME(skb);
+ if (priv->mesh_dev && (p_rx_pd->rx_control & RxPD_MESH_FRAME))
+ dev = priv->mesh_dev;
lbs_deb_hex(LBS_DEB_RX, "RX Data: Before chop rxpd", skb->data,
min_t(unsigned int, skb->len, 100));
@@ -262,7 +246,8 @@ int lbs_process_rxed_packet(struct lbs_private *priv, struct sk_buff *skb)
priv->stats.rx_bytes += skb->len;
priv->stats.rx_packets++;
- lbs_upload_rx_packet(priv, skb);
+ skb->protocol = eth_type_trans(skb, dev);
+ netif_rx(skb);
ret = 0;
done:
@@ -404,7 +389,8 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
priv->stats.rx_bytes += skb->len;
priv->stats.rx_packets++;
- lbs_upload_rx_packet(priv, skb);
+ skb->protocol = eth_type_trans(skb, priv->rtap_net_dev);
+ netif_rx(skb);
ret = 0;
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index e2141f0..8a1a396 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -2,6 +2,7 @@
* This file contains the handling of TX in wlan driver.
*/
#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
#include "hostcmd.h"
#include "radiotap.h"
@@ -203,7 +204,12 @@ void lbs_send_tx_feedback(struct lbs_private *priv)
try_count = (status >> 16) & 0xff;
radiotap_hdr->data_retries = (try_count) ?
(1 + priv->txretrycount - try_count) : 0;
- lbs_upload_rx_packet(priv, priv->currenttxskb);
+
+
+ priv->currenttxskb->protocol = eth_type_trans(priv->currenttxskb,
+ priv->rtap_net_dev);
+ netif_rx(priv->currenttxskb);
+
priv->currenttxskb = NULL;
if (priv->connect_status == LBS_CONNECTED)
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 48/48] libertas: kill (IS,SET,UNSET)_MESH_FRAME.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (46 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 47/48] libertas: kill lbs_upload_tx_packet() David Woodhouse
@ 2007-12-10 15:46 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 49/48] libertas: fix use-after-free error David Woodhouse
` (85 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-10 15:46 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 00:51:35 -0500
No need for these any more. We've collapsed all the unneeded nests of
functions which needed to keep track of which device the skb belonged to.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/defs.h | 4 ----
1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
index 8242384..04db6af 100644
--- a/drivers/net/wireless/libertas/defs.h
+++ b/drivers/net/wireless/libertas/defs.h
@@ -257,10 +257,6 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
#define MAX_LEDS 8
-#define IS_MESH_FRAME(x) (x->cb[6])
-#define SET_MESH_FRAME(x) (x->cb[6]=1)
-#define UNSET_MESH_FRAME(x) (x->cb[6]=0)
-
/** Global Variable Declaration */
extern const char lbs_driver_version[];
extern u16 lbs_region_code_to_index[MRVDRV_MAX_REGION_CODE];
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 49/48] libertas: fix use-after-free error
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (47 preceding siblings ...)
2007-12-10 15:46 ` [PATCH 48/48] libertas: kill (IS,SET,UNSET)_MESH_FRAME David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 50/48] libertas: add opaque extra argument to cmd callback function David Woodhouse
` (84 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Holger Schurig <hs4233@mail.mn-solutions.de>
Date: Mon, 10 Dec 2007 12:19:55 +0100
Previously, the display of subscribed events could be wrong.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/debugfs.c | 14 ++++++++------
1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index e8a24d7..f4858bd 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -409,30 +409,32 @@ static ssize_t lbs_threshold_read(
char *buf = (char *)addr;
u8 value;
u8 freq;
+ int events = 0;
- struct cmd_ds_802_11_subscribe_event *events = kzalloc(
+ struct cmd_ds_802_11_subscribe_event *subscribed = kzalloc(
sizeof(struct cmd_ds_802_11_subscribe_event),
GFP_KERNEL);
struct mrvlietypes_thresholds *got;
res = lbs_prepare_and_send_command(priv,
CMD_802_11_SUBSCRIBE_EVENT, CMD_ACT_GET,
- CMD_OPTION_WAITFORRSP, 0, events);
+ CMD_OPTION_WAITFORRSP, 0, subscribed);
if (res) {
- kfree(events);
+ kfree(subscribed);
return res;
}
- got = lbs_tlv_find(tlv_type, events->tlv, sizeof(events->tlv));
+ got = lbs_tlv_find(tlv_type, subscribed->tlv, sizeof(subscribed->tlv));
if (got) {
value = got->value;
freq = got->freq;
+ events = le16_to_cpu(subscribed->events);
}
- kfree(events);
+ kfree(subscribed);
if (got)
pos += snprintf(buf, len, "%d %d %d\n", value, freq,
- !!(le16_to_cpu(events->events) & event_mask));
+ !!(events & event_mask));
res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 50/48] libertas: add opaque extra argument to cmd callback function
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (48 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 49/48] libertas: fix use-after-free error David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 51/48] libertas: clean up lbs_interrupt() David Woodhouse
` (83 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 13:36:10 -0500
This will be useful for letting callbacks do stuff like copying the
response into a buffer provided by the caller of lbs_cmd()
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 6 +++++-
drivers/net/wireless/libertas/cmdresp.c | 11 ++++++-----
drivers/net/wireless/libertas/decl.h | 3 ++-
drivers/net/wireless/libertas/hostcmd.h | 3 ++-
drivers/net/wireless/libertas/if_usb.c | 2 +-
5 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 49a9aee..228e3fe 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1642,6 +1642,7 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
ptempnode->wait_option = 0;
ptempnode->pdata_buf = NULL;
ptempnode->callback = NULL;
+ ptempnode->callback_arg = 0;
if (ptempnode->bufvirtualaddr != NULL)
memset(ptempnode->bufvirtualaddr, 0, MRVDRV_SIZE_OF_CMD_BUFFER);
@@ -1670,6 +1671,7 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
ptempnode->callback = NULL;
+ ptempnode->callback_arg = 0;
lbs_deb_leave(LBS_DEB_HOST);
}
@@ -1993,7 +1995,8 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
*/
int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
- int (*callback)(uint16_t, struct cmd_ds_command *, struct lbs_private *))
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
+ unsigned long callback_arg)
{
struct cmd_ctrl_node *cmdnode;
struct cmd_ds_gen *cmdptr;
@@ -2028,6 +2031,7 @@ int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
cmdptr = (struct cmd_ds_gen *)cmdnode->bufvirtualaddr;
cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
cmdnode->callback = callback;
+ cmdnode->callback_arg = callback_arg;
/* Set sequence number, clean result, move to buffer */
priv->seqnum++;
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index ab6e729..7bad257 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -552,12 +552,13 @@ static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
return 0;
}
-static inline int handle_cmd_response(u16 respcmd,
- struct cmd_ds_command *resp,
- struct lbs_private *priv)
+static inline int handle_cmd_response(struct lbs_private *priv,
+ unsigned long dummy,
+ struct cmd_ds_command *resp)
{
int ret = 0;
unsigned long flags;
+ uint16_t respcmd = le16_to_cpu(resp->command);
lbs_deb_enter(LBS_DEB_HOST);
@@ -861,9 +862,9 @@ int lbs_process_rx_command(struct lbs_private *priv)
spin_unlock_irqrestore(&priv->driver_lock, flags);
if (priv->cur_cmd && priv->cur_cmd->callback)
- ret = priv->cur_cmd->callback(respcmd, resp, priv);
+ ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg, resp);
else
- ret = handle_cmd_response(respcmd, resp, priv);
+ ret = handle_cmd_response(priv, 0, resp);
spin_lock_irqsave(&priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index e8387c7..a086d0c 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -24,7 +24,8 @@ void lbs_send_tx_feedback(struct lbs_private *priv);
int lbs_free_cmd_buffer(struct lbs_private *priv);
int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
- int (*callback)(uint16_t, struct cmd_ds_command *, struct lbs_private *));
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
+ unsigned long callback_arg);
int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index f1c1d3f..ed502b7 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -71,7 +71,8 @@ struct cmd_ctrl_node {
u16 wait_option;
/* command response */
void *pdata_buf;
- int (*callback)(uint16_t respcmd, struct cmd_ds_command *resp, struct lbs_private *priv);
+ int (*callback)(struct lbs_private *priv, unsigned long arg, struct cmd_ds_command *resp);
+ unsigned long callback_arg;
/* command data */
u8 *bufvirtualaddr;
/* wait queue */
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 141d185..f59fd73 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -108,7 +108,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;
- if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd), NULL))
+ if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd), NULL, 0))
lbs_deb_usb("Setting boot2 version failed\n");
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 51/48] libertas: clean up lbs_interrupt()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (49 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 50/48] libertas: add opaque extra argument to cmd callback function David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 52/48] libertas: make lbs_cmd() usage nicer David Woodhouse
` (82 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 14:58:37 -0500
Make it take struct lbs_private as argument; that's all it wants anyway,
and all callers were starting off from that. Don't wake the netif
queues, because those should be handled elsewhere. And sort out the
locking, with a big nasty warning for those who don't have the
driver_lock locked when they call it.
Oh, and fix if_cs.c to lock the driver_lock before calling it.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/decl.h | 2 +-
drivers/net/wireless/libertas/if_cs.c | 5 +++--
drivers/net/wireless/libertas/if_sdio.c | 4 ++--
drivers/net/wireless/libertas/if_usb.c | 4 ++--
drivers/net/wireless/libertas/main.c | 19 +++++++++----------
5 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index a086d0c..82727a8 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -39,7 +39,7 @@ void lbs_queue_cmd(struct lbs_private *priv,
int lbs_allocate_cmd_buffer(struct lbs_private *priv);
int lbs_execute_next_command(struct lbs_private *priv);
int lbs_process_event(struct lbs_private *priv);
-void lbs_interrupt(struct net_device *);
+void lbs_interrupt(struct lbs_private *priv);
int lbs_set_radio_control(struct lbs_private *priv);
u32 lbs_fw_index_to_data_rate(u8 index);
u8 lbs_data_rate_to_fw_index(u32 rate);
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 49a0178..2acbe5d 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -264,8 +264,9 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
/* clear interrupt */
if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause & IF_CS_C_IC_MASK);
}
-
- lbs_interrupt(card->priv->dev);
+ spin_lock(&card->priv->driver_lock);
+ lbs_interrupt(card->priv);
+ spin_unlock(&card->priv->driver_lock);
return IRQ_HANDLED;
}
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 6456613..94060da 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -154,7 +154,7 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,
card->int_cause |= MRVDRV_CMD_UPLD_RDY;
- lbs_interrupt(card->priv->dev);
+ lbs_interrupt(card->priv);
ret = 0;
@@ -236,7 +236,7 @@ static int if_sdio_handle_event(struct if_sdio_card *card,
card->event = event;
card->int_cause |= MRVDRV_CARDEVENT;
- lbs_interrupt(card->priv->dev);
+ lbs_interrupt(card->priv);
spin_unlock_irqrestore(&card->priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index f59fd73..1c23166 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -632,7 +632,7 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
priv->upld_len);
kfree_skb(skb);
- lbs_interrupt(priv->dev);
+ lbs_interrupt(priv);
spin_unlock(&priv->driver_lock);
lbs_deb_usbd(&cardp->udev->dev,
@@ -705,7 +705,7 @@ static void if_usb_receive(struct urb *urb)
cardp->usb_event_cause <<= 3;
cardp->usb_int_cause |= MRVDRV_CARDEVENT;
kfree_skb(skb);
- lbs_interrupt(priv->dev);
+ lbs_interrupt(priv);
spin_unlock(&priv->driver_lock);
goto rx_exit;
default:
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index f16c93b..2797149 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1408,23 +1408,22 @@ out:
* @param dev A pointer to net_device structure
* @return n/a
*/
-void lbs_interrupt(struct net_device *dev)
+void lbs_interrupt(struct lbs_private *priv)
{
- struct lbs_private *priv = dev->priv;
-
lbs_deb_enter(LBS_DEB_THREAD);
- lbs_deb_thread("lbs_interrupt: intcounter=%d\n",
- priv->intcounter);
+ lbs_deb_thread("lbs_interrupt: intcounter=%d\n", priv->intcounter);
+
+ if (spin_trylock(&priv->driver_lock)) {
+ spin_unlock(&priv->driver_lock);
+ printk(KERN_CRIT "%s called without driver_lock held\n", __func__);
+ WARN_ON(1);
+ }
priv->intcounter++;
- if (priv->psstate == PS_STATE_SLEEP) {
+ if (priv->psstate == PS_STATE_SLEEP)
priv->psstate = PS_STATE_AWAKE;
- netif_wake_queue(dev);
- if (priv->mesh_dev)
- netif_wake_queue(priv->mesh_dev);
- }
wake_up_interruptible(&priv->waitq);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 52/48] libertas: make lbs_cmd() usage nicer
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (50 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 51/48] libertas: clean up lbs_interrupt() David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 53/48] libertas: remove pre_open_check() David Woodhouse
` (81 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Mon, 10 Dec 2007 15:11:23 -0500
Define a macro that relieves the caller from having to use sizeof on
the command structure when calling lbs_cmd(), and move the prototype
of __lbs_cmd() to a new cmd.h file.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 8 ++++----
drivers/net/wireless/libertas/cmd.h | 16 ++++++++++++++++
drivers/net/wireless/libertas/decl.h | 4 ----
drivers/net/wireless/libertas/if_usb.c | 3 ++-
4 files changed, 22 insertions(+), 9 deletions(-)
create mode 100644 drivers/net/wireless/libertas/cmd.h
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 228e3fe..c7c226c 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1994,9 +1994,9 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
* the result code from the firmware
*/
-int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
- int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
- unsigned long callback_arg)
+int __lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
+ unsigned long callback_arg)
{
struct cmd_ctrl_node *cmdnode;
struct cmd_ds_gen *cmdptr;
@@ -2066,6 +2066,6 @@ done:
lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
return ret;
}
-EXPORT_SYMBOL_GPL(lbs_cmd);
+EXPORT_SYMBOL_GPL(__lbs_cmd);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
new file mode 100644
index 0000000..546db49
--- /dev/null
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -0,0 +1,16 @@
+/* Copyright (C) 2007, Red Hat, Inc. */
+
+#ifndef _LBS_CMD_H_
+#define _LBS_CMD_H_
+
+#include "hostcmd.h"
+#include "dev.h"
+
+#define lbs_cmd(priv, cmdnr, cmd, callback, callback_arg) \
+ __lbs_cmd(priv, cmdnr, &cmd, sizeof(cmd), callback, callback_arg)
+
+int __lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
+ unsigned long callback_arg);
+
+#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 82727a8..33c8305 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -23,10 +23,6 @@ void lbs_send_tx_feedback(struct lbs_private *priv);
int lbs_free_cmd_buffer(struct lbs_private *priv);
-int lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
- int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
- unsigned long callback_arg);
-
int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_no,
u16 cmd_action,
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 1c23166..8ff57a6 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -13,6 +13,7 @@
#include "decl.h"
#include "defs.h"
#include "dev.h"
+#include "cmd.h"
#include "if_usb.h"
#define MESSAGE_HEADER_LEN 4
@@ -108,7 +109,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;
- if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, sizeof(b2_cmd), NULL, 0))
+ if (lbs_cmd(priv, CMD_SET_BOOT2_VER, b2_cmd, NULL, 0))
lbs_deb_usb("Setting boot2 version failed\n");
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 53/48] libertas: remove pre_open_check()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (51 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 52/48] libertas: make lbs_cmd() usage nicer David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 54/48] libertas: clean up is_command_allowed_in_ps() David Woodhouse
` (80 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 15:25:42 -0500
The firmware is always initialised before we register the netdevices.
It's not possible for pre_open_check() to fail.
One day we might try loading firmware in ->open(), but still it won't be
just a _check_, like this.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 32 --------------------------------
1 files changed, 0 insertions(+), 32 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 2797149..3d9de7a 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -367,34 +367,6 @@ static struct attribute_group lbs_mesh_attr_group = {
};
/**
- * @brief Check if the device can be open and wait if necessary.
- *
- * @param dev A pointer to net_device structure
- * @return 0
- *
- * For USB adapter, on some systems the device open handler will be
- * called before FW ready. Use the following flag check and wait
- * function to work around the issue.
- *
- */
-static int pre_open_check(struct net_device *dev)
-{
- struct lbs_private *priv = (struct lbs_private *) dev->priv;
- int i = 0;
-
- while (!priv->fw_ready && i < 20) {
- i++;
- msleep_interruptible(100);
- }
- if (!priv->fw_ready) {
- lbs_pr_err("firmware not ready\n");
- return -1;
- }
-
- return 0;
-}
-
-/**
* @brief This function opens the device
*
* @param dev A pointer to net_device structure
@@ -433,8 +405,6 @@ static int lbs_mesh_open(struct net_device *dev)
{
struct lbs_private *priv = (struct lbs_private *) dev->priv ;
- if (pre_open_check(dev) == -1)
- return -1;
priv->mesh_open = 1 ;
netif_wake_queue(priv->mesh_dev);
@@ -457,8 +427,6 @@ static int lbs_open(struct net_device *dev)
{
struct lbs_private *priv = (struct lbs_private *) dev->priv ;
- if(pre_open_check(dev) == -1)
- return -1;
priv->infra_open = 1 ;
netif_wake_queue(priv->dev);
if (priv->open == 0)
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 54/48] libertas: clean up is_command_allowed_in_ps()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (52 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 53/48] libertas: remove pre_open_check() David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 55/48] libertas: make rtap and normal modes mutually exclusive, clean up open/stop David Woodhouse
` (79 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Mon, 10 Dec 2007 15:24:47 -0500
Total overkill to have an array when there's only one command in it.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 24 +++++++++---------------
1 files changed, 9 insertions(+), 15 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index c7c226c..2efba57 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -19,26 +19,20 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
u16 wait_option, void *pdata_buf);
-static u16 commands_allowed_in_ps[] = {
- CMD_802_11_RSSI,
-};
-
/**
- * @brief This function checks if the commans is allowed
- * in PS mode not.
+ * @brief Checks whether a command is allowed in Power Save mode
*
* @param command the command ID
- * @return TRUE or FALSE
+ * @return 1 if allowed, 0 if not allowed
*/
-static u8 is_command_allowed_in_ps(__le16 command)
+static u8 is_command_allowed_in_ps(u16 cmd)
{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(commands_allowed_in_ps); i++) {
- if (command == cpu_to_le16(commands_allowed_in_ps[i]))
- return 1;
+ switch (cmd) {
+ case CMD_802_11_RSSI:
+ return 1;
+ default:
+ break;
}
-
return 0;
}
@@ -1715,7 +1709,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
if (cmdnode) {
cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
- if (is_command_allowed_in_ps(cmdptr->command)) {
+ if (is_command_allowed_in_ps(le16_to_cpu(cmdptr->command))) {
if ((priv->psstate == PS_STATE_SLEEP) ||
(priv->psstate == PS_STATE_PRE_SLEEP)) {
lbs_deb_host(
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 55/48] libertas: make rtap and normal modes mutually exclusive, clean up open/stop
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (53 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 54/48] libertas: clean up is_command_allowed_in_ps() David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 56/48] libertas: improve reliability of firmware reloading on USB David Woodhouse
` (78 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 16:38:18 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/dev.h | 1 -
drivers/net/wireless/libertas/main.c | 133 +++++++++++++---------------------
2 files changed, 50 insertions(+), 84 deletions(-)
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 4681405..9921d0c 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -99,7 +99,6 @@ struct lbs_mesh_stats {
/** Private structure for the MV device */
struct lbs_private {
- int open;
int mesh_open;
int infra_open;
int mesh_autostart_enabled;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 3d9de7a..8866402 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -274,6 +274,8 @@ static ssize_t lbs_rtap_set(struct device *dev,
if(priv->monitormode == monitor_mode)
return strlen(buf);
if (priv->monitormode == LBS_MONITOR_OFF) {
+ if (priv->infra_open || priv->mesh_open)
+ return -EBUSY;
if (priv->mode == IW_MODE_INFRA)
lbs_send_deauthentication(priv);
else if (priv->mode == IW_MODE_ADHOC)
@@ -367,84 +369,42 @@ static struct attribute_group lbs_mesh_attr_group = {
};
/**
- * @brief This function opens the device
+ * @brief This function opens the ethX or mshX interface
*
* @param dev A pointer to net_device structure
- * @return 0
+ * @return 0 or -EBUSY if monitor mode active
*/
static int lbs_dev_open(struct net_device *dev)
{
- struct lbs_private *priv = (struct lbs_private *) dev->priv;
-
- lbs_deb_enter(LBS_DEB_NET);
+ struct lbs_private *priv = (struct lbs_private *) dev->priv ;
+ int ret = 0;
- priv->open = 1;
+ spin_lock_irq(&priv->driver_lock);
- if (priv->connect_status == LBS_CONNECTED)
- netif_carrier_on(priv->dev);
- else
- netif_carrier_off(priv->dev);
+ if (priv->monitormode != LBS_MONITOR_OFF) {
+ ret = -EBUSY;
+ goto out;
+ }
- if (priv->mesh_dev) {
- if (priv->mesh_connect_status == LBS_CONNECTED)
- netif_carrier_on(priv->mesh_dev);
+ if (dev == priv->mesh_dev) {
+ priv->mesh_open = 1;
+ priv->mesh_connect_status = LBS_CONNECTED;
+ netif_carrier_on(dev);
+ } else {
+ priv->infra_open = 1;
+
+ if (priv->connect_status == LBS_CONNECTED)
+ netif_carrier_on(dev);
else
- netif_carrier_off(priv->mesh_dev);
+ netif_carrier_off(dev);
}
- lbs_deb_leave(LBS_DEB_NET);
- return 0;
-}
-/**
- * @brief This function opens the mshX interface
- *
- * @param dev A pointer to net_device structure
- * @return 0
- */
-static int lbs_mesh_open(struct net_device *dev)
-{
- struct lbs_private *priv = (struct lbs_private *) dev->priv ;
-
- priv->mesh_open = 1 ;
- netif_wake_queue(priv->mesh_dev);
-
- priv->mesh_connect_status = LBS_CONNECTED;
-
- netif_carrier_on(priv->mesh_dev);
- netif_wake_queue(priv->mesh_dev);
- if (priv->infra_open == 0)
- return lbs_dev_open(priv->dev) ;
- return 0;
-}
-
-/**
- * @brief This function opens the ethX interface
- *
- * @param dev A pointer to net_device structure
- * @return 0
- */
-static int lbs_open(struct net_device *dev)
-{
- struct lbs_private *priv = (struct lbs_private *) dev->priv ;
-
- priv->infra_open = 1 ;
- netif_wake_queue(priv->dev);
- if (priv->open == 0)
- return lbs_dev_open(priv->dev) ;
- return 0;
-}
+ if (!priv->tx_pending_len)
+ netif_wake_queue(dev);
+ out:
-static int lbs_dev_close(struct net_device *dev)
-{
- struct lbs_private *priv = dev->priv;
-
- lbs_deb_enter(LBS_DEB_NET);
-
- netif_carrier_off(priv->dev);
- priv->open = 0;
-
- lbs_deb_leave(LBS_DEB_NET);
- return 0;
+ spin_unlock_irq(&priv->driver_lock);
+ return ret;
}
/**
@@ -453,16 +413,20 @@ static int lbs_dev_close(struct net_device *dev)
* @param dev A pointer to net_device structure
* @return 0
*/
-static int lbs_mesh_close(struct net_device *dev)
+static int lbs_mesh_stop(struct net_device *dev)
{
struct lbs_private *priv = (struct lbs_private *) (dev->priv);
+ spin_lock_irq(&priv->driver_lock);
+
priv->mesh_open = 0;
- netif_stop_queue(priv->mesh_dev);
- if (priv->infra_open == 0)
- return lbs_dev_close(dev);
- else
- return 0;
+ priv->mesh_connect_status = LBS_DISCONNECTED;
+
+ netif_stop_queue(dev);
+ netif_carrier_off(dev);
+
+ spin_unlock_irq(&priv->driver_lock);
+ return 0;
}
/**
@@ -471,16 +435,18 @@ static int lbs_mesh_close(struct net_device *dev)
* @param dev A pointer to net_device structure
* @return 0
*/
-static int lbs_close(struct net_device *dev)
+static int lbs_eth_stop(struct net_device *dev)
{
struct lbs_private *priv = (struct lbs_private *) dev->priv;
- netif_stop_queue(dev);
+ spin_lock_irq(&priv->driver_lock);
+
priv->infra_open = 0;
- if (priv->mesh_open == 0)
- return lbs_dev_close(dev);
- else
- return 0;
+
+ netif_stop_queue(dev);
+
+ spin_unlock_irq(&priv->driver_lock);
+ return 0;
}
static void lbs_tx_timeout(struct net_device *dev)
@@ -1065,9 +1031,9 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
priv->infra_open = 0;
/* Setup the OS Interface to our functions */
- dev->open = lbs_open;
+ dev->open = lbs_dev_open;
dev->hard_start_xmit = lbs_hard_start_xmit;
- dev->stop = lbs_close;
+ dev->stop = lbs_eth_stop;
dev->set_mac_address = lbs_set_mac_address;
dev->tx_timeout = lbs_tx_timeout;
dev->get_stats = lbs_get_stats;
@@ -1237,9 +1203,9 @@ int lbs_add_mesh(struct lbs_private *priv, struct device *dev)
mesh_dev->priv = priv;
priv->mesh_dev = mesh_dev;
- mesh_dev->open = lbs_mesh_open;
+ mesh_dev->open = lbs_dev_open;
mesh_dev->hard_start_xmit = lbs_hard_start_xmit;
- mesh_dev->stop = lbs_mesh_close;
+ mesh_dev->stop = lbs_mesh_stop;
mesh_dev->get_stats = lbs_get_stats;
mesh_dev->set_mac_address = lbs_set_mac_address;
mesh_dev->ethtool_ops = &lbs_ethtool_ops;
@@ -1436,6 +1402,7 @@ static void __exit lbs_exit_module(void)
static int lbs_rtap_open(struct net_device *dev)
{
+ /* Yes, _stop_ the queue. Because we don't support injection */
netif_carrier_off(dev);
netif_stop_queue(dev);
return 0;
@@ -1449,7 +1416,7 @@ static int lbs_rtap_stop(struct net_device *dev)
static int lbs_rtap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
netif_stop_queue(dev);
- return -EOPNOTSUPP;
+ return NETDEV_TX_BUSY;
}
static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev)
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 56/48] libertas: improve reliability of firmware reloading on USB
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (54 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 55/48] libertas: make rtap and normal modes mutually exclusive, clean up open/stop David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 57/48] libertas: switch to a waitqueue and timer for handling USB firmware load David Woodhouse
` (77 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 10 Dec 2007 18:53:34 -0500
Increase the delay between issuing the RESET command and the usb reset,
and be prepared to discard more than one 'normal' packet from it before
it resets.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 8ff57a6..0a37950 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -389,9 +389,9 @@ static int if_usb_reset_device(struct usb_card_rec *cardp)
cmd->params.reset.action = cpu_to_le16(CMD_ACT_HALT);
usb_tx_block(cardp, cardp->bulk_out_buffer, 4 + S_DS_GEN + sizeof(struct cmd_ds_802_11_reset));
- msleep(10);
+ msleep(100);
ret = usb_reset_device(cardp->udev);
- msleep(10);
+ msleep(100);
lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
@@ -500,7 +500,7 @@ static void if_usb_receive_fwload(struct urb *urb)
return;
}
- if (cardp->bootcmdresp == 0) {
+ if (cardp->bootcmdresp <= 0) {
memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
sizeof(bootcmdresp));
if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 57/48] libertas: switch to a waitqueue and timer for handling USB firmware load
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (55 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 56/48] libertas: improve reliability of firmware reloading on USB David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 58/48] libertas: don't run thread while firmware not yet ready David Woodhouse
` (76 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 00:07:58 -0500
No need to busy-wait, even if we did have a 100ms delay in the loop.
This makes it easier to support the new 'firmware ready' event which is
in the new firmware, too.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 38 +++++++++++++++++++++----------
drivers/net/wireless/libertas/if_usb.h | 5 ++++
2 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 0a37950..a086653 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -113,7 +113,18 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
lbs_deb_usb("Setting boot2 version failed\n");
}
+void if_usb_fw_timeo(unsigned long priv)
+{
+ struct usb_card_rec *cardp = (void *)priv;
+ if (cardp->fwdnldover) {
+ lbs_deb_usb("Download complete, no event. Assuming success\n");
+ } else {
+ lbs_pr_err("Download timed out\n");
+ cardp->surprise_removed = 1;
+ }
+ wake_up(&cardp->fw_wq);
+}
/**
* @brief sets the configuration values
* @param ifnum interface number
@@ -138,6 +149,9 @@ static int if_usb_probe(struct usb_interface *intf,
goto error;
}
+ setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
+ init_waitqueue_head(&cardp->fw_wq);
+
cardp->udev = udev;
iface_desc = intf->cur_altsetting;
@@ -296,7 +310,7 @@ static void if_usb_disconnect(struct usb_interface *intf)
* @param priv pointer to struct lbs_private
* @return 0
*/
-static int if_prog_firmware(struct usb_card_rec *cardp)
+static int if_usb_send_fw_pkt(struct usb_card_rec *cardp)
{
struct FWData *fwdata;
struct fwheader *fwheader;
@@ -566,19 +580,21 @@ static void if_usb_receive_fwload(struct urb *urb)
kfree_skb(skb);
+ /* reschedule timer for 200ms hence */
+ mod_timer(&cardp->fw_timeout, jiffies + (HZ/5));
+
if (cardp->fwfinalblk) {
cardp->fwdnldover = 1;
goto exit;
}
- if_prog_firmware(cardp);
+ if_usb_send_fw_pkt(cardp);
if_usb_submit_rx_urb_fwload(cardp);
-exit:
+ exit:
kfree(syncfwheader);
return;
-
}
#define MRVDRV_MIN_PKT_LEN 30
@@ -911,15 +927,13 @@ restart:
cardp->totalbytes = 0;
cardp->fwfinalblk = 0;
- if_prog_firmware(cardp);
+ /* Send the first firmware packet... */
+ if_usb_send_fw_pkt(cardp);
- do {
- lbs_deb_usbd(&cardp->udev->dev,"Wlan sched timeout\n");
- i++;
- msleep_interruptible(100);
- if (cardp->surprise_removed || i >= 20)
- break;
- } while (!cardp->fwdnldover);
+ /* ... and wait for the process to complete */
+ wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
+
+ del_timer_sync(&cardp->fw_timeout);
if (!cardp->fwdnldover) {
lbs_pr_info("failed to load fw, resetting device!\n");
diff --git a/drivers/net/wireless/libertas/if_usb.h b/drivers/net/wireless/libertas/if_usb.h
index 940a369..224c957 100644
--- a/drivers/net/wireless/libertas/if_usb.h
+++ b/drivers/net/wireless/libertas/if_usb.h
@@ -1,6 +1,9 @@
#ifndef _LBS_IF_USB_H
#define _LBS_IF_USB_H
+#include <linux/wait.h>
+#include <linux/timer.h>
+
/**
* This file contains definition for USB interface.
*/
@@ -56,6 +59,8 @@ struct usb_card_rec {
u8 bulk_out_endpointAddr;
const struct firmware *fw;
+ struct timer_list fw_timeout;
+ wait_queue_head_t fw_wq;
u8 CRC_OK;
u32 fwseqnum;
u32 lastseqnum;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 58/48] libertas: don't run thread while firmware not yet ready
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (56 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 57/48] libertas: switch to a waitqueue and timer for handling USB firmware load David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 59/48] libertas: clean up direct command handling David Woodhouse
` (75 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 11:55:37 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 8866402..9a23109 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -671,6 +671,8 @@ static int lbs_thread(void *data)
shouldsleep = 1; /* Sleep mode. Nothing we can do till it wakes */
else if (priv->intcounter)
shouldsleep = 0; /* Interrupt pending. Deal with it now */
+ else if (!priv->fw_ready)
+ shouldsleep = 1; /* Firmware not ready. We're waiting for it */
else if (priv->dnld_sent)
shouldsleep = 1; /* Something is en route to the device already */
else if (priv->tx_pending_len > 0)
@@ -753,6 +755,9 @@ static int lbs_thread(void *data)
} else
spin_unlock_irq(&priv->driver_lock);
+ if (!priv->fw_ready)
+ continue;
+
/* Check if we need to confirm Sleep Request received previously */
if (priv->psstate == PS_STATE_PRE_SLEEP &&
!priv->dnld_sent && !priv->cur_cmd) {
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 59/48] libertas: clean up direct command handling
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (57 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 58/48] libertas: don't run thread while firmware not yet ready David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 60/48] libertas: add simple copyback command callback David Woodhouse
` (74 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 12:33:30 -0500
Move direct command handling through __lbs_cmd() over to using the
header as the first member of the command structure, and only define
the __lbs_cmd() callback in one place rather than 3. Convert boot2
version command to new usage.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 22 ++++++++++++----------
drivers/net/wireless/libertas/cmd.h | 8 +++++---
drivers/net/wireless/libertas/cmdresp.c | 7 ++++---
drivers/net/wireless/libertas/hostcmd.h | 12 ++++++++++--
4 files changed, 31 insertions(+), 18 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 2efba57..78870c7 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1988,12 +1988,13 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
* the result code from the firmware
*/
-int __lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
- int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
+int __lbs_cmd(struct lbs_private *priv, uint16_t command,
+ struct cmd_header *in_cmd, int in_cmd_size,
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
unsigned long callback_arg)
{
struct cmd_ctrl_node *cmdnode;
- struct cmd_ds_gen *cmdptr;
+ struct cmd_header *send_cmd;
unsigned long flags;
int ret = 0;
@@ -2012,7 +2013,6 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_siz
}
cmdnode = lbs_get_cmd_ctrl_node(priv);
-
if (cmdnode == NULL) {
lbs_deb_host("PREP_CMD: cmdnode is NULL\n");
@@ -2022,18 +2022,20 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_siz
goto done;
}
- cmdptr = (struct cmd_ds_gen *)cmdnode->bufvirtualaddr;
+ send_cmd = (struct cmd_header *) cmdnode->bufvirtualaddr;
cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
cmdnode->callback = callback;
cmdnode->callback_arg = callback_arg;
+ /* Copy the incoming command to the buffer */
+ memcpy(send_cmd, in_cmd, in_cmd_size);
+
/* Set sequence number, clean result, move to buffer */
priv->seqnum++;
- cmdptr->command = cpu_to_le16(command);
- cmdptr->size = cpu_to_le16(cmd_size + S_DS_GEN);
- cmdptr->seqnum = cpu_to_le16(priv->seqnum);
- cmdptr->result = 0;
- memcpy(cmdptr->cmdresp, cmd, cmd_size);
+ send_cmd->command = cpu_to_le16(command);
+ send_cmd->size = cpu_to_le16(in_cmd_size);
+ send_cmd->seqnum = cpu_to_le16(priv->seqnum);
+ send_cmd->result = 0;
lbs_deb_host("PREP_CMD: command 0x%04x\n", command);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 546db49..259d3e8 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -7,10 +7,12 @@
#include "dev.h"
#define lbs_cmd(priv, cmdnr, cmd, callback, callback_arg) \
- __lbs_cmd(priv, cmdnr, &cmd, sizeof(cmd), callback, callback_arg)
+ __lbs_cmd(priv, cmdnr, (struct cmd_header *) &cmd, sizeof(cmd), \
+ callback, callback_arg)
-int __lbs_cmd(struct lbs_private *priv, uint16_t command, void *cmd, int cmd_size,
- int (*callback)(struct lbs_private *, unsigned long, struct cmd_ds_command *),
+int __lbs_cmd(struct lbs_private *priv, uint16_t command,
+ struct cmd_header *in_cmd, int in_cmd_size,
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
unsigned long callback_arg);
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 7bad257..9113669 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -861,9 +861,10 @@ int lbs_process_rx_command(struct lbs_private *priv)
spin_unlock_irqrestore(&priv->driver_lock, flags);
- if (priv->cur_cmd && priv->cur_cmd->callback)
- ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg, resp);
- else
+ if (priv->cur_cmd && priv->cur_cmd->callback) {
+ ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg,
+ (struct cmd_header *) resp);
+ } else
ret = handle_cmd_response(priv, 0, resp);
spin_lock_irqsave(&priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index ed502b7..93ac46a 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -65,13 +65,20 @@ struct rxpd {
u8 reserved[3];
};
+struct cmd_header {
+ __le16 command;
+ __le16 size;
+ __le16 seqnum;
+ __le16 result;
+} __attribute__ ((packed));
+
struct cmd_ctrl_node {
struct list_head list;
/* wait for finish or not */
u16 wait_option;
/* command response */
void *pdata_buf;
- int (*callback)(struct lbs_private *priv, unsigned long arg, struct cmd_ds_command *resp);
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *);
unsigned long callback_arg;
/* command data */
u8 *bufvirtualaddr;
@@ -424,6 +431,8 @@ struct cmd_ds_802_11_monitor_mode {
};
struct cmd_ds_set_boot2_ver {
+ struct cmd_header hdr;
+
__le16 action;
__le16 version;
};
@@ -678,7 +687,6 @@ struct cmd_ds_command {
struct cmd_ds_bt_access bt;
struct cmd_ds_fwt_access fwt;
struct cmd_ds_mesh_access mesh;
- struct cmd_ds_set_boot2_ver boot2_ver;
struct cmd_ds_get_tsf gettsf;
struct cmd_ds_802_11_subscribe_event subscribe_event;
struct cmd_ds_802_11_beacon_control bcn_ctrl;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 60/48] libertas: add simple copyback command callback
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (58 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 59/48] libertas: clean up direct command handling David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 61/48] libertas: convert GET_HW_SPEC to a direct command David Woodhouse
` (73 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 12:40:35 -0500
A simple callback which copies the response back into the
command buffer that was used to send the command to the
card. Will allow for direct command processing outside
the mega-switches in cmd.c and cmdresp.c.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 29 ++++++++++++++++++++++++++++-
drivers/net/wireless/libertas/cmd.h | 7 +++++++
2 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 78870c7..c4b32a0 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1972,6 +1972,34 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
/**
+ * @brief Simple callback that copies response back into command
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param extra A pointer to the original command structure for which
+ * 'resp' is a response
+ * @param resp A pointer to the command response
+ *
+ * @return 0 on success, error on failure
+ */
+int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
+ struct cmd_header *resp)
+{
+ struct cmd_header *buf = (void *)extra;
+ uint16_t copy_len;
+
+ lbs_deb_enter(LBS_DEB_CMD);
+
+ copy_len = min(le16_to_cpu(buf->size), le16_to_cpu(resp->size));
+ lbs_deb_cmd("Copying back %u bytes; command response was %u bytes, "
+ "copy back buffer was %u bytes", copy_len, resp->size,
+ buf->size);
+ memcpy(buf, resp, copy_len);
+
+ lbs_deb_leave(LBS_DEB_CMD);
+ return 0;
+}
+
+/**
* @brief Simple way to call firmware functions
*
* @param priv A pointer to struct lbs_private structure
@@ -1987,7 +2015,6 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
* @return -1 in case of a higher level error, otherwise
* the result code from the firmware
*/
-
int __lbs_cmd(struct lbs_private *priv, uint16_t command,
struct cmd_header *in_cmd, int in_cmd_size,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 259d3e8..72857a1 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -10,9 +10,16 @@
__lbs_cmd(priv, cmdnr, (struct cmd_header *) &cmd, sizeof(cmd), \
callback, callback_arg)
+#define lbs_cmd_with_response(priv, cmdnr, cmd) \
+ __lbs_cmd(priv, cmdnr, (struct cmd_header *) &cmd, sizeof(cmd), \
+ lbs_cmd_copyback, (unsigned long) &cmd)
+
int __lbs_cmd(struct lbs_private *priv, uint16_t command,
struct cmd_header *in_cmd, int in_cmd_size,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
unsigned long callback_arg);
+int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
+ struct cmd_header *resp);
+
#endif /* _LBS_CMD_H */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 61/48] libertas: convert GET_HW_SPEC to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (59 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 60/48] libertas: add simple copyback command callback David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 62/48] libertas: switch USB cardp->priv to 'struct lbs_private *' and resulting fix David Woodhouse
` (72 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 12:42:16 -0500
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 76 +++++++++++++++++++++++++++----
drivers/net/wireless/libertas/cmd.h | 2 +
drivers/net/wireless/libertas/cmdresp.c | 67 ---------------------------
drivers/net/wireless/libertas/hostcmd.h | 3 +-
drivers/net/wireless/libertas/main.c | 6 +--
5 files changed, 73 insertions(+), 81 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index c4b32a0..bb940cc 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -11,6 +11,7 @@
#include "dev.h"
#include "join.h"
#include "wext.h"
+#include "cmd.h"
static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode);
struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
@@ -36,18 +37,78 @@ static u8 is_command_allowed_in_ps(u16 cmd)
return 0;
}
-static int lbs_cmd_hw_spec(struct lbs_private *priv, struct cmd_ds_command *cmd)
+/**
+ * @brief Updates the hardware details like MAC address and regulatory region
+ *
+ * @param priv A pointer to struct lbs_private structure
+ *
+ * @return 0 on success, error on failure
+ */
+int lbs_update_hw_spec(struct lbs_private *priv)
{
- struct cmd_ds_get_hw_spec *hwspec = &cmd->params.hwspec;
+ struct cmd_ds_get_hw_spec cmd;
+ int ret = -1;
+ u32 i;
+ DECLARE_MAC_BUF(mac);
lbs_deb_enter(LBS_DEB_CMD);
- cmd->command = cpu_to_le16(CMD_GET_HW_SPEC);
- cmd->size = cpu_to_le16(sizeof(struct cmd_ds_get_hw_spec) + S_DS_GEN);
- memcpy(hwspec->permanentaddr, priv->current_addr, ETH_ALEN);
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ memcpy(cmd.permanentaddr, priv->current_addr, ETH_ALEN);
+ ret = lbs_cmd_with_response(priv, CMD_GET_HW_SPEC, cmd);
+ if (ret)
+ goto out;
+
+ priv->fwcapinfo = le32_to_cpu(cmd.fwcapinfo);
+ memcpy(priv->fwreleasenumber, cmd.fwreleasenumber, 4);
+
+ lbs_deb_cmd("GET_HW_SPEC: firmware release %u.%u.%up%u\n",
+ priv->fwreleasenumber[2], priv->fwreleasenumber[1],
+ priv->fwreleasenumber[0], priv->fwreleasenumber[3]);
+ lbs_deb_cmd("GET_HW_SPEC: MAC addr %s\n",
+ print_mac(mac, cmd.permanentaddr));
+ lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n",
+ cmd.hwifversion, cmd.version);
+
+ /* Clamp region code to 8-bit since FW spec indicates that it should
+ * only ever be 8-bit, even though the field size is 16-bit. Some firmware
+ * returns non-zero high 8 bits here.
+ */
+ priv->regioncode = le16_to_cpu(cmd.regioncode) & 0xFF;
+
+ for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
+ /* use the region code to search for the index */
+ if (priv->regioncode == lbs_region_code_to_index[i])
+ break;
+ }
+ /* if it's unidentified region code, use the default (USA) */
+ if (i >= MRVDRV_MAX_REGION_CODE) {
+ priv->regioncode = 0x10;
+ lbs_pr_info("unidentified region code; using the default (USA)\n");
+ }
+
+ if (priv->current_addr[0] == 0xff)
+ memmove(priv->current_addr, cmd.permanentaddr, ETH_ALEN);
+
+ memcpy(priv->dev->dev_addr, priv->current_addr, ETH_ALEN);
+ if (priv->mesh_dev)
+ memcpy(priv->mesh_dev->dev_addr, priv->current_addr, ETH_ALEN);
+
+ if (lbs_set_regiontable(priv, priv->regioncode, 0)) {
+ ret = -1;
+ goto out;
+ }
+
+ if (lbs_set_universaltable(priv, 0)) {
+ ret = -1;
+ goto out;
+ }
+
+out:
lbs_deb_leave(LBS_DEB_CMD);
- return 0;
+ return ret;
}
static int lbs_cmd_802_11_ps_mode(struct lbs_private *priv,
@@ -1223,9 +1284,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
cmdptr->result = 0;
switch (cmd_no) {
- case CMD_GET_HW_SPEC:
- ret = lbs_cmd_hw_spec(priv, cmdptr);
- break;
case CMD_802_11_PS_MODE:
ret = lbs_cmd_802_11_ps_mode(priv, cmdptr, cmd_action);
break;
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 72857a1..b8e5d21 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -22,4 +22,6 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
struct cmd_header *resp);
+int lbs_update_hw_spec(struct lbs_private *priv);
+
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 9113669..671e323 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -145,69 +145,6 @@ static int lbs_ret_reg_access(struct lbs_private *priv,
return ret;
}
-static int lbs_ret_get_hw_spec(struct lbs_private *priv,
- struct cmd_ds_command *resp)
-{
- u32 i;
- struct cmd_ds_get_hw_spec *hwspec = &resp->params.hwspec;
- int ret = 0;
- DECLARE_MAC_BUF(mac);
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- priv->fwcapinfo = le32_to_cpu(hwspec->fwcapinfo);
-
- memcpy(priv->fwreleasenumber, hwspec->fwreleasenumber, 4);
-
- lbs_deb_cmd("GET_HW_SPEC: firmware release %u.%u.%up%u\n",
- priv->fwreleasenumber[2], priv->fwreleasenumber[1],
- priv->fwreleasenumber[0], priv->fwreleasenumber[3]);
- lbs_deb_cmd("GET_HW_SPEC: MAC addr %s\n",
- print_mac(mac, hwspec->permanentaddr));
- lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n",
- hwspec->hwifversion, hwspec->version);
-
- /* Clamp region code to 8-bit since FW spec indicates that it should
- * only ever be 8-bit, even though the field size is 16-bit. Some firmware
- * returns non-zero high 8 bits here.
- */
- priv->regioncode = le16_to_cpu(hwspec->regioncode) & 0xFF;
-
- for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
- /* use the region code to search for the index */
- if (priv->regioncode == lbs_region_code_to_index[i]) {
- break;
- }
- }
-
- /* if it's unidentified region code, use the default (USA) */
- if (i >= MRVDRV_MAX_REGION_CODE) {
- priv->regioncode = 0x10;
- lbs_pr_info("unidentified region code; using the default (USA)\n");
- }
-
- if (priv->current_addr[0] == 0xff)
- memmove(priv->current_addr, hwspec->permanentaddr, ETH_ALEN);
-
- memcpy(priv->dev->dev_addr, priv->current_addr, ETH_ALEN);
- if (priv->mesh_dev)
- memcpy(priv->mesh_dev->dev_addr, priv->current_addr, ETH_ALEN);
-
- if (lbs_set_regiontable(priv, priv->regioncode, 0)) {
- ret = -1;
- goto done;
- }
-
- if (lbs_set_universaltable(priv, 0)) {
- ret = -1;
- goto done;
- }
-
-done:
- lbs_deb_enter_args(LBS_DEB_CMD, "ret %d", ret);
- return ret;
-}
-
static int lbs_ret_802_11_sleep_params(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
@@ -569,10 +506,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
ret = lbs_ret_reg_access(priv, respcmd, resp);
break;
- case CMD_RET(CMD_GET_HW_SPEC):
- ret = lbs_ret_get_hw_spec(priv, resp);
- break;
-
case CMD_RET(CMD_802_11_SCAN):
ret = lbs_ret_80211_scan(priv, resp);
break;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 93ac46a..a87c217 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -119,6 +119,8 @@ struct cmd_ds_gen {
* This structure defines the response for the GET_HW_SPEC command
*/
struct cmd_ds_get_hw_spec {
+ struct cmd_header hdr;
+
/* HW Interface version number */
__le16 hwifversion;
/* HW version number */
@@ -637,7 +639,6 @@ struct cmd_ds_command {
/* command Body */
union {
- struct cmd_ds_get_hw_spec hwspec;
struct cmd_ds_802_11_ps_mode psmode;
struct cmd_ds_802_11_scan scan;
struct cmd_ds_802_11_scan_rsp scanresp;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 9a23109..9f6c119 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -22,6 +22,7 @@
#include "debugfs.h"
#include "assoc.h"
#include "join.h"
+#include "cmd.h"
#define DRIVER_RELEASE_VERSION "323.p0"
const char lbs_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION
@@ -843,10 +844,7 @@ static int lbs_setup_firmware(struct lbs_private *priv)
* Read MAC address from HW
*/
memset(priv->current_addr, 0xff, ETH_ALEN);
-
- ret = lbs_prepare_and_send_command(priv, CMD_GET_HW_SPEC,
- 0, CMD_OPTION_WAITFORRSP, 0, NULL);
-
+ ret = lbs_update_hw_spec(priv);
if (ret) {
ret = -1;
goto done;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 62/48] libertas: switch USB cardp->priv to 'struct lbs_private *' and resulting fix
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (60 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 61/48] libertas: convert GET_HW_SPEC to a direct command David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 63/48] libertas: move removal of lbs_rtap file to lbs_stop_card() David Woodhouse
` (71 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 12:53:43 -0500
Amazing what interesting things the compiler will tell you if you let it
know what types you expect to be passing around.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 2 +-
drivers/net/wireless/libertas/if_usb.h | 4 +++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index a086653..6cd6c96 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -1003,7 +1003,7 @@ static int if_usb_resume(struct usb_interface *intf)
cardp->rx_urb_recall = 0;
- if_usb_submit_rx_urb(cardp->priv);
+ if_usb_submit_rx_urb(cardp);
netif_device_attach(cardp->eth_dev);
netif_device_attach(priv->mesh_dev);
diff --git a/drivers/net/wireless/libertas/if_usb.h b/drivers/net/wireless/libertas/if_usb.h
index 224c957..f028df1 100644
--- a/drivers/net/wireless/libertas/if_usb.h
+++ b/drivers/net/wireless/libertas/if_usb.h
@@ -4,6 +4,8 @@
#include <linux/wait.h>
#include <linux/timer.h>
+struct lbs_private;
+
/**
* This file contains definition for USB interface.
*/
@@ -48,7 +50,7 @@ struct usb_card_rec {
struct net_device *eth_dev;
struct usb_device *udev;
struct urb *rx_urb, *tx_urb;
- void *priv;
+ struct lbs_private *priv;
struct read_cb_info rinfo;
int bulk_in_size;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 63/48] libertas: move removal of lbs_rtap file to lbs_stop_card()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (61 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 62/48] libertas: switch USB cardp->priv to 'struct lbs_private *' and resulting fix David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 64/48] libertas: wait for 'firmware ready' event from firmware after loading David Woodhouse
` (70 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 12:54:43 -0500
This prevents us from trying to remove it when it didn't exist, in the
error case.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 9f6c119..212cce3 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1089,7 +1089,6 @@ int lbs_remove_card(struct lbs_private *priv)
lbs_remove_rtap(priv);
dev = priv->dev;
- device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
cancel_delayed_work(&priv->scan_work);
cancel_delayed_work(&priv->assoc_work);
@@ -1167,6 +1166,7 @@ int lbs_stop_card(struct lbs_private *priv)
netif_carrier_off(priv->dev);
lbs_debugfs_remove_one(priv);
+ device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
/* Flush pending command nodes */
spin_lock_irqsave(&priv->driver_lock, flags);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 64/48] libertas: wait for 'firmware ready' event from firmware after loading
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (62 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 63/48] libertas: move removal of lbs_rtap file to lbs_stop_card() David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 65/48] libertas: rename and re-type bufvirtualaddr to cmdbuf David Woodhouse
` (69 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 13:15:25 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/host.h | 1 +
drivers/net/wireless/libertas/if_usb.c | 26 +++++++++++++++++++++-----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index 4828bbf..b23af19 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -304,5 +304,6 @@ enum cmd_mesh_access_opts {
#define MACREG_INT_CODE_RSSI_HIGH 28
#define MACREG_INT_CODE_SNR_HIGH 29
#define MACREG_INT_CODE_MESH_AUTO_STARTED 35
+#define MACREG_INT_CODE_FIRMWARE_READY 48
#endif
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 6cd6c96..c94b6df 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -230,6 +230,7 @@ static int if_usb_probe(struct usb_interface *intf,
goto err_prog_firmware;
cardp->priv = priv;
+ cardp->priv->fw_ready = 1;
if (lbs_add_mesh(priv, &udev->dev))
goto err_add_mesh;
@@ -241,10 +242,7 @@ static int if_usb_probe(struct usb_interface *intf,
priv->hw_read_event_cause = if_usb_read_event_cause;
priv->boot2_version = udev->descriptor.bcdDevice;
- /* Delay 200 ms to waiting for the FW ready */
if_usb_submit_rx_urb(cardp);
- msleep_interruptible(200);
- priv->fw_ready = 1;
if (lbs_start_card(priv))
goto err_start_card;
@@ -514,6 +512,21 @@ static void if_usb_receive_fwload(struct urb *urb)
return;
}
+ if (cardp->fwdnldover) {
+ __le32 *tmp = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);
+
+ if (tmp[0] == cpu_to_le32(CMD_TYPE_INDICATION) &&
+ tmp[1] == cpu_to_le32(MACREG_INT_CODE_FIRMWARE_READY)) {
+ lbs_pr_info("Firmware ready event received\n");
+ wake_up(&cardp->fw_wq);
+ } else {
+ lbs_deb_usb("Waiting for confirmation; got %x %x\n", le32_to_cpu(tmp[0]),
+ le32_to_cpu(tmp[1]));
+ if_usb_submit_rx_urb_fwload(cardp);
+ }
+ kfree_skb(skb);
+ return;
+ }
if (cardp->bootcmdresp <= 0) {
memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
sizeof(bootcmdresp));
@@ -529,7 +542,8 @@ static void if_usb_receive_fwload(struct urb *urb)
if (bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_REQUEST) ||
bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_DATA) ||
bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_INDICATION)) {
- lbs_pr_info("Firmware already seems alive; resetting\n");
+ if (!cardp->bootcmdresp)
+ lbs_pr_info("Firmware already seems alive; resetting\n");
cardp->bootcmdresp = -1;
} else {
lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
@@ -590,8 +604,9 @@ static void if_usb_receive_fwload(struct urb *urb)
if_usb_send_fw_pkt(cardp);
- if_usb_submit_rx_urb_fwload(cardp);
exit:
+ if_usb_submit_rx_urb_fwload(cardp);
+
kfree(syncfwheader);
return;
@@ -934,6 +949,7 @@ restart:
wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
del_timer_sync(&cardp->fw_timeout);
+ usb_kill_urb(cardp->rx_urb);
if (!cardp->fwdnldover) {
lbs_pr_info("failed to load fw, resetting device!\n");
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 65/48] libertas: rename and re-type bufvirtualaddr to cmdbuf
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (63 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 64/48] libertas: wait for 'firmware ready' event from firmware after loading David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 66/48] libertas: fix debug output in lbs_cmd_copyback() function David Woodhouse
` (68 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 13:49:39 -0500
Make it a struct cmd_header, since that's what it is, and clean up
the places that it's used.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 133 +++++++++++++------------------
drivers/net/wireless/libertas/cmdresp.c | 14 ++--
drivers/net/wireless/libertas/defs.h | 4 +-
drivers/net/wireless/libertas/hostcmd.h | 2 +-
drivers/net/wireless/libertas/if_cs.c | 4 +-
drivers/net/wireless/libertas/if_sdio.c | 4 +-
drivers/net/wireless/libertas/if_usb.c | 4 +-
drivers/net/wireless/libertas/main.c | 14 ++--
8 files changed, 79 insertions(+), 100 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index bb940cc..79a8d0d 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1028,24 +1028,18 @@ void lbs_queue_cmd(struct lbs_private *priv,
u8 addtail)
{
unsigned long flags;
- struct cmd_ds_command *cmdptr;
lbs_deb_enter(LBS_DEB_HOST);
- if (!cmdnode) {
- lbs_deb_host("QUEUE_CMD: cmdnode is NULL\n");
- goto done;
- }
-
- cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
- if (!cmdptr) {
- lbs_deb_host("QUEUE_CMD: cmdptr is NULL\n");
+ if (!cmdnode || !cmdnode->cmdbuf) {
+ lbs_deb_host("QUEUE_CMD: cmdnode or cmdbuf is NULL\n");
goto done;
}
/* Exit_PS command needs to be queued in the header always. */
- if (le16_to_cpu(cmdptr->command) == CMD_802_11_PS_MODE) {
- struct cmd_ds_802_11_ps_mode *psm = &cmdptr->params.psmode;
+ if (le16_to_cpu(cmdnode->cmdbuf->command) == CMD_802_11_PS_MODE) {
+ struct cmd_ds_802_11_ps_mode *psm = (void *) cmdnode->cmdbuf;
+
if (psm->action == cpu_to_le16(CMD_SUBCMD_EXIT_PS)) {
if (priv->psstate != PS_STATE_FULL_POWER)
addtail = 0;
@@ -1062,7 +1056,7 @@ void lbs_queue_cmd(struct lbs_private *priv,
spin_unlock_irqrestore(&priv->driver_lock, flags);
lbs_deb_host("QUEUE_CMD: inserted command 0x%04x into cmdpendingq\n",
- le16_to_cpu(((struct cmd_ds_gen*)cmdnode->bufvirtualaddr)->command));
+ le16_to_cpu(cmdnode->cmdbuf->command));
done:
lbs_deb_leave(LBS_DEB_HOST);
@@ -1079,7 +1073,7 @@ static int DownloadcommandToStation(struct lbs_private *priv,
struct cmd_ctrl_node *cmdnode)
{
unsigned long flags;
- struct cmd_ds_command *cmdptr;
+ struct cmd_header *cmd;
int ret = -1;
u16 cmdsize;
u16 command;
@@ -1091,10 +1085,10 @@ static int DownloadcommandToStation(struct lbs_private *priv,
goto done;
}
- cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
+ cmd = cmdnode->cmdbuf;
spin_lock_irqsave(&priv->driver_lock, flags);
- if (!cmdptr || !cmdptr->size) {
+ if (!cmd || !cmd->size) {
lbs_deb_host("DNLD_CMD: cmdptr is NULL or zero\n");
__lbs_cleanup_and_insert_cmd(priv, cmdnode);
spin_unlock_irqrestore(&priv->driver_lock, flags);
@@ -1105,16 +1099,16 @@ static int DownloadcommandToStation(struct lbs_private *priv,
priv->cur_cmd_retcode = 0;
spin_unlock_irqrestore(&priv->driver_lock, flags);
- cmdsize = le16_to_cpu(cmdptr->size);
- command = le16_to_cpu(cmdptr->command);
+ cmdsize = le16_to_cpu(cmd->size);
+ command = le16_to_cpu(cmd->command);
lbs_deb_host("DNLD_CMD: command 0x%04x, size %d, jiffies %lu\n",
command, cmdsize, jiffies);
- lbs_deb_hex(LBS_DEB_HOST, "DNLD_CMD", cmdnode->bufvirtualaddr, cmdsize);
+ lbs_deb_hex(LBS_DEB_HOST, "DNLD_CMD", (void *) cmdnode->cmdbuf, cmdsize);
cmdnode->cmdwaitqwoken = 0;
- ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmdptr, cmdsize);
+ ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmd, cmdsize);
if (ret != 0) {
lbs_deb_host("DNLD_CMD: hw_host_to_card failed\n");
@@ -1265,7 +1259,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
lbs_set_cmd_ctrl_node(priv, cmdnode, wait_option, pdata_buf);
- cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
+ cmdptr = (struct cmd_ds_command *)cmdnode->cmdbuf;
lbs_deb_host("PREP_CMD: command 0x%04x\n", cmd_no);
@@ -1556,41 +1550,35 @@ EXPORT_SYMBOL_GPL(lbs_prepare_and_send_command);
int lbs_allocate_cmd_buffer(struct lbs_private *priv)
{
int ret = 0;
- u32 ulbufsize;
+ u32 bufsize;
u32 i;
- struct cmd_ctrl_node *tempcmd_array;
- u8 *ptempvirtualaddr;
+ struct cmd_ctrl_node *cmdarray;
lbs_deb_enter(LBS_DEB_HOST);
- /* Allocate and initialize cmdCtrlNode */
- ulbufsize = sizeof(struct cmd_ctrl_node) * MRVDRV_NUM_OF_CMD_BUFFER;
-
- if (!(tempcmd_array = kzalloc(ulbufsize, GFP_KERNEL))) {
+ /* Allocate and initialize the command array */
+ bufsize = sizeof(struct cmd_ctrl_node) * LBS_NUM_CMD_BUFFERS;
+ if (!(cmdarray = kzalloc(bufsize, GFP_KERNEL))) {
lbs_deb_host("ALLOC_CMD_BUF: tempcmd_array is NULL\n");
ret = -1;
goto done;
}
- priv->cmd_array = tempcmd_array;
+ priv->cmd_array = cmdarray;
- /* Allocate and initialize command buffers */
- ulbufsize = MRVDRV_SIZE_OF_CMD_BUFFER;
- for (i = 0; i < MRVDRV_NUM_OF_CMD_BUFFER; i++) {
- if (!(ptempvirtualaddr = kzalloc(ulbufsize, GFP_KERNEL))) {
+ /* Allocate and initialize each command buffer in the command array */
+ for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
+ cmdarray[i].cmdbuf = kzalloc(LBS_CMD_BUFFER_SIZE, GFP_KERNEL);
+ if (!cmdarray[i].cmdbuf) {
lbs_deb_host("ALLOC_CMD_BUF: ptempvirtualaddr is NULL\n");
ret = -1;
goto done;
}
-
- /* Update command buffer virtual */
- tempcmd_array[i].bufvirtualaddr = ptempvirtualaddr;
}
- for (i = 0; i < MRVDRV_NUM_OF_CMD_BUFFER; i++) {
- init_waitqueue_head(&tempcmd_array[i].cmdwait_q);
- lbs_cleanup_and_insert_cmd(priv, &tempcmd_array[i]);
+ for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
+ init_waitqueue_head(&cmdarray[i].cmdwait_q);
+ lbs_cleanup_and_insert_cmd(priv, &cmdarray[i]);
}
-
ret = 0;
done:
@@ -1606,9 +1594,8 @@ done:
*/
int lbs_free_cmd_buffer(struct lbs_private *priv)
{
- u32 ulbufsize; /* Someone needs to die for this. Slowly and painfully */
+ struct cmd_ctrl_node *cmdarray;
unsigned int i;
- struct cmd_ctrl_node *tempcmd_array;
lbs_deb_enter(LBS_DEB_HOST);
@@ -1618,14 +1605,13 @@ int lbs_free_cmd_buffer(struct lbs_private *priv)
goto done;
}
- tempcmd_array = priv->cmd_array;
+ cmdarray = priv->cmd_array;
/* Release shared memory buffers */
- ulbufsize = MRVDRV_SIZE_OF_CMD_BUFFER;
- for (i = 0; i < MRVDRV_NUM_OF_CMD_BUFFER; i++) {
- if (tempcmd_array[i].bufvirtualaddr) {
- kfree(tempcmd_array[i].bufvirtualaddr);
- tempcmd_array[i].bufvirtualaddr = NULL;
+ for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
+ if (cmdarray[i].cmdbuf) {
+ kfree(cmdarray[i].cmdbuf);
+ cmdarray[i].cmdbuf = NULL;
}
}
@@ -1683,21 +1669,21 @@ struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
* @param ptempnode A pointer to cmdCtrlNode structure
* @return n/a
*/
-static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode)
+static void cleanup_cmdnode(struct cmd_ctrl_node *cmdnode)
{
lbs_deb_enter(LBS_DEB_HOST);
- if (!ptempnode)
+ if (!cmdnode)
return;
- ptempnode->cmdwaitqwoken = 1;
- wake_up_interruptible(&ptempnode->cmdwait_q);
- ptempnode->wait_option = 0;
- ptempnode->pdata_buf = NULL;
- ptempnode->callback = NULL;
- ptempnode->callback_arg = 0;
+ cmdnode->cmdwaitqwoken = 1;
+ wake_up_interruptible(&cmdnode->cmdwait_q);
+ cmdnode->wait_option = 0;
+ cmdnode->pdata_buf = NULL;
+ cmdnode->callback = NULL;
+ cmdnode->callback_arg = 0;
- if (ptempnode->bufvirtualaddr != NULL)
- memset(ptempnode->bufvirtualaddr, 0, MRVDRV_SIZE_OF_CMD_BUFFER);
+ if (cmdnode->cmdbuf != NULL)
+ memset(cmdnode->cmdbuf, 0, LBS_CMD_BUFFER_SIZE);
lbs_deb_leave(LBS_DEB_HOST);
}
@@ -1739,7 +1725,7 @@ void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
int lbs_execute_next_command(struct lbs_private *priv)
{
struct cmd_ctrl_node *cmdnode = NULL;
- struct cmd_ds_command *cmdptr;
+ struct cmd_header *cmd;
unsigned long flags;
int ret = 0;
@@ -1765,22 +1751,21 @@ int lbs_execute_next_command(struct lbs_private *priv)
spin_unlock_irqrestore(&priv->driver_lock, flags);
if (cmdnode) {
- cmdptr = (struct cmd_ds_command *)cmdnode->bufvirtualaddr;
+ cmd = cmdnode->cmdbuf;
- if (is_command_allowed_in_ps(le16_to_cpu(cmdptr->command))) {
+ if (is_command_allowed_in_ps(le16_to_cpu(cmd->command))) {
if ((priv->psstate == PS_STATE_SLEEP) ||
(priv->psstate == PS_STATE_PRE_SLEEP)) {
lbs_deb_host(
"EXEC_NEXT_CMD: cannot send cmd 0x%04x in psstate %d\n",
- le16_to_cpu(cmdptr->command),
+ le16_to_cpu(cmd->command),
priv->psstate);
ret = -1;
goto done;
}
lbs_deb_host("EXEC_NEXT_CMD: OK to send command "
- "0x%04x in psstate %d\n",
- le16_to_cpu(cmdptr->command),
- priv->psstate);
+ "0x%04x in psstate %d\n",
+ le16_to_cpu(cmd->command), priv->psstate);
} else if (priv->psstate != PS_STATE_FULL_POWER) {
/*
* 1. Non-PS command:
@@ -1793,8 +1778,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
* otherwise send this command down to firmware
* immediately.
*/
- if (cmdptr->command !=
- cpu_to_le16(CMD_802_11_PS_MODE)) {
+ if (cmd->command != cpu_to_le16(CMD_802_11_PS_MODE)) {
/* Prepare to send Exit PS,
* this non PS command will be sent later */
if ((priv->psstate == PS_STATE_SLEEP)
@@ -1813,8 +1797,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
* PS command. Ignore it if it is not Exit_PS.
* otherwise send it down immediately.
*/
- struct cmd_ds_802_11_ps_mode *psm =
- &cmdptr->params.psmode;
+ struct cmd_ds_802_11_ps_mode *psm = (void *)cmd;
lbs_deb_host(
"EXEC_NEXT_CMD: PS cmd, action 0x%02x\n",
@@ -1848,7 +1831,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
}
list_del(&cmdnode->list);
lbs_deb_host("EXEC_NEXT_CMD: sending command 0x%04x\n",
- le16_to_cpu(cmdptr->command));
+ le16_to_cpu(cmd->command));
DownloadcommandToStation(priv, cmdnode);
} else {
/*
@@ -2079,7 +2062,6 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
unsigned long callback_arg)
{
struct cmd_ctrl_node *cmdnode;
- struct cmd_header *send_cmd;
unsigned long flags;
int ret = 0;
@@ -2107,20 +2089,19 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
goto done;
}
- send_cmd = (struct cmd_header *) cmdnode->bufvirtualaddr;
cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
cmdnode->callback = callback;
cmdnode->callback_arg = callback_arg;
/* Copy the incoming command to the buffer */
- memcpy(send_cmd, in_cmd, in_cmd_size);
+ memcpy(cmdnode->cmdbuf, in_cmd, in_cmd_size);
/* Set sequence number, clean result, move to buffer */
priv->seqnum++;
- send_cmd->command = cpu_to_le16(command);
- send_cmd->size = cpu_to_le16(in_cmd_size);
- send_cmd->seqnum = cpu_to_le16(priv->seqnum);
- send_cmd->result = 0;
+ cmdnode->cmdbuf->command = cpu_to_le16(command);
+ cmdnode->cmdbuf->size = cpu_to_le16(in_cmd_size);
+ cmdnode->cmdbuf->seqnum = cpu_to_le16(priv->seqnum);
+ cmdnode->cmdbuf->result = 0;
lbs_deb_host("PREP_CMD: command 0x%04x\n", command);
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 671e323..b4cd7b7 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -491,8 +491,9 @@ static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
static inline int handle_cmd_response(struct lbs_private *priv,
unsigned long dummy,
- struct cmd_ds_command *resp)
+ struct cmd_header *cmd_response)
{
+ struct cmd_ds_command *resp = (struct cmd_ds_command *) cmd_response;
int ret = 0;
unsigned long flags;
uint16_t respcmd = le16_to_cpu(resp->command);
@@ -673,7 +674,7 @@ static inline int handle_cmd_response(struct lbs_private *priv,
int lbs_process_rx_command(struct lbs_private *priv)
{
u16 respcmd;
- struct cmd_ds_command *resp;
+ struct cmd_header *resp;
int ret = 0;
ulong flags;
u16 result;
@@ -692,15 +693,14 @@ int lbs_process_rx_command(struct lbs_private *priv)
spin_unlock_irqrestore(&priv->driver_lock, flags);
goto done;
}
- resp = (struct cmd_ds_command *)(priv->cur_cmd->bufvirtualaddr);
+ resp = priv->cur_cmd->cmdbuf;
respcmd = le16_to_cpu(resp->command);
result = le16_to_cpu(resp->result);
lbs_deb_host("CMD_RESP: response 0x%04x, size %d, jiffies %lu\n",
respcmd, priv->upld_len, jiffies);
- lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", priv->cur_cmd->bufvirtualaddr,
- priv->upld_len);
+ lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", (void *) resp, priv->upld_len);
if (!(respcmd & 0x8000)) {
lbs_deb_host("invalid response!\n");
@@ -716,7 +716,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
priv->cur_cmd_retcode = result;
if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {
- struct cmd_ds_802_11_ps_mode *psmode = &resp->params.psmode;
+ struct cmd_ds_802_11_ps_mode *psmode = (void *) resp;
u16 action = le16_to_cpu(psmode->action);
lbs_deb_host(
@@ -796,7 +796,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
if (priv->cur_cmd && priv->cur_cmd->callback) {
ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg,
- (struct cmd_header *) resp);
+ resp);
} else
ret = handle_cmd_response(priv, 0, resp);
diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
index 04db6af..9b98ae7 100644
--- a/drivers/net/wireless/libertas/defs.h
+++ b/drivers/net/wireless/libertas/defs.h
@@ -132,8 +132,8 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
*/
#define MRVDRV_MAX_MULTICAST_LIST_SIZE 32
-#define MRVDRV_NUM_OF_CMD_BUFFER 10
-#define MRVDRV_SIZE_OF_CMD_BUFFER (2 * 1024)
+#define LBS_NUM_CMD_BUFFERS 10
+#define LBS_CMD_BUFFER_SIZE (2 * 1024)
#define MRVDRV_MAX_CHANNEL_SIZE 14
#define MRVDRV_ASSOCIATION_TIME_OUT 255
#define MRVDRV_SNAP_HEADER_LEN 8
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index a87c217..e5e2106 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -81,7 +81,7 @@ struct cmd_ctrl_node {
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *);
unsigned long callback_arg;
/* command data */
- u8 *bufvirtualaddr;
+ struct cmd_header *cmdbuf;
/* wait queue */
u16 cmdwaitqwoken;
wait_queue_head_t cmdwait_q;
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 2acbe5d..5814363 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -364,7 +364,7 @@ static int if_cs_receive_cmdres(struct lbs_private *priv, u8 *data, u32 *len)
}
*len = if_cs_read16(priv->card, IF_CS_C_CMD_LEN);
- if ((*len == 0) || (*len > MRVDRV_SIZE_OF_CMD_BUFFER)) {
+ if ((*len == 0) || (*len > LBS_CMD_BUFFER_SIZE)) {
lbs_pr_err("card cmd buffer has invalid # of bytes (%d)\n", *len);
goto out;
}
@@ -683,7 +683,7 @@ sbi_get_int_status_exit:
cmdbuf = priv->upld_buf;
priv->hisregcpy &= ~IF_CS_C_S_RX_UPLD_RDY;
} else {
- cmdbuf = priv->cur_cmd->bufvirtualaddr;
+ cmdbuf = (u8 *) priv->cur_cmd->cmdbuf;
}
ret = if_cs_receive_cmdres(priv, cmdbuf, &priv->upld_len);
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 94060da..85675c5 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -142,14 +142,14 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,
goto out;
}
- if (size > MRVDRV_SIZE_OF_CMD_BUFFER) {
+ if (size > LBS_CMD_BUFFER_SIZE) {
lbs_deb_sdio("response packet too large (%d bytes)\n",
(int)size);
ret = -E2BIG;
goto out;
}
- memcpy(card->priv->cur_cmd->bufvirtualaddr, buffer, size);
+ memcpy(card->priv->cur_cmd->cmdbuf, buffer, size);
card->priv->upld_len = size;
card->int_cause |= MRVDRV_CMD_UPLD_RDY;
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index c94b6df..5f2d944 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -639,7 +639,7 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
struct lbs_private *priv)
{
u8 *cmdbuf;
- if (recvlength > MRVDRV_SIZE_OF_CMD_BUFFER) {
+ if (recvlength > LBS_CMD_BUFFER_SIZE) {
lbs_deb_usbd(&cardp->udev->dev,
"The receive buffer is too large\n");
kfree_skb(skb);
@@ -656,7 +656,7 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
cmdbuf = priv->upld_buf;
priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
} else
- cmdbuf = priv->cur_cmd->bufvirtualaddr;
+ cmdbuf = (u8 *) priv->cur_cmd->cmdbuf;
cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 212cce3..a081b91 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -890,23 +890,21 @@ done:
static void command_timer_fn(unsigned long data)
{
struct lbs_private *priv = (struct lbs_private *)data;
- struct cmd_ctrl_node *ptempnode;
- struct cmd_ds_command *cmd;
+ struct cmd_ctrl_node *node;
unsigned long flags;
- ptempnode = priv->cur_cmd;
- if (ptempnode == NULL) {
+ node = priv->cur_cmd;
+ if (node == NULL) {
lbs_deb_fw("ptempnode empty\n");
return;
}
- cmd = (struct cmd_ds_command *)ptempnode->bufvirtualaddr;
- if (!cmd) {
+ if (!node->cmdbuf) {
lbs_deb_fw("cmd is NULL\n");
return;
}
- lbs_deb_fw("command_timer_fn fired, cmd %x\n", cmd->command);
+ lbs_deb_fw("command_timer_fn fired, cmd %x\n", node->cmdbuf->command);
if (!priv->fw_ready)
return;
@@ -916,7 +914,7 @@ static void command_timer_fn(unsigned long data)
spin_unlock_irqrestore(&priv->driver_lock, flags);
lbs_deb_fw("re-sending same command because of timeout\n");
- lbs_queue_cmd(priv, ptempnode, 0);
+ lbs_queue_cmd(priv, node, 0);
wake_up_interruptible(&priv->waitq);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 66/48] libertas: fix debug output in lbs_cmd_copyback() function.
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (64 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 65/48] libertas: rename and re-type bufvirtualaddr to cmdbuf David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 67/48] libertas: convert CMD_MESH_ACCESS to a direct command David Woodhouse
` (67 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 15:22:27 -0500
Bad dcbw. Always test on big-endian, or at least use sparse.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 79a8d0d..eeb09e0 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -2023,7 +2023,7 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
* @return 0 on success, error on failure
*/
int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
- struct cmd_header *resp)
+ struct cmd_header *resp)
{
struct cmd_header *buf = (void *)extra;
uint16_t copy_len;
@@ -2032,8 +2032,8 @@ int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
copy_len = min(le16_to_cpu(buf->size), le16_to_cpu(resp->size));
lbs_deb_cmd("Copying back %u bytes; command response was %u bytes, "
- "copy back buffer was %u bytes", copy_len, resp->size,
- buf->size);
+ "copy back buffer was %u bytes\n", copy_len,
+ le16_to_cpu(resp->size), le16_to_cpu(buf->size));
memcpy(buf, resp, copy_len);
lbs_deb_leave(LBS_DEB_CMD);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 67/48] libertas: convert CMD_MESH_ACCESS to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (65 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 66/48] libertas: fix debug output in lbs_cmd_copyback() function David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 68/48] libertas: remove casts from lbs_cmd() and lbs_cmd_with_response() macros David Woodhouse
` (66 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 15:23:59 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 28 ++++++++-------------
drivers/net/wireless/libertas/cmd.h | 3 ++
drivers/net/wireless/libertas/cmdresp.c | 5 ----
drivers/net/wireless/libertas/hostcmd.h | 3 +-
drivers/net/wireless/libertas/if_usb.c | 11 ++------
drivers/net/wireless/libertas/main.c | 40 +++++++++++++++---------------
6 files changed, 39 insertions(+), 51 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index eeb09e0..9d621fe 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -976,27 +976,25 @@ static int lbs_cmd_fwt_access(struct lbs_private *priv,
return 0;
}
-static int lbs_cmd_mesh_access(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- u16 cmd_action, void *pdata_buf)
+int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
+ struct cmd_ds_mesh_access *cmd)
{
- struct cmd_ds_mesh_access *mesh_access = &cmd->params.mesh;
+ int ret;
+
lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action);
- cmd->command = cpu_to_le16(CMD_MESH_ACCESS);
- cmd->size = cpu_to_le16(sizeof(struct cmd_ds_mesh_access) + S_DS_GEN);
- cmd->result = 0;
+ cmd->hdr.command = cpu_to_le16(CMD_MESH_ACCESS);
+ cmd->hdr.size = cpu_to_le16(sizeof(struct cmd_ds_mesh_access) + S_DS_GEN);
+ cmd->hdr.result = 0;
- if (pdata_buf)
- memcpy(mesh_access, pdata_buf, sizeof(*mesh_access));
- else
- memset(mesh_access, 0, sizeof(*mesh_access));
+ cmd->action = cpu_to_le16(cmd_action);
- mesh_access->action = cpu_to_le16(cmd_action);
+ ret = lbs_cmd_with_response(priv, CMD_MESH_ACCESS, (*cmd));
lbs_deb_leave(LBS_DEB_CMD);
- return 0;
+ return ret;
}
+EXPORT_SYMBOL_GPL(lbs_mesh_access);
static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
struct cmd_ds_command *cmd,
@@ -1486,10 +1484,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_fwt_access(priv, cmdptr, cmd_action, pdata_buf);
break;
- case CMD_MESH_ACCESS:
- ret = lbs_cmd_mesh_access(priv, cmdptr, cmd_action, pdata_buf);
- break;
-
case CMD_GET_TSF:
cmdptr->command = cpu_to_le16(CMD_GET_TSF);
cmdptr->size = cpu_to_le16(sizeof(struct cmd_ds_get_tsf) +
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index b8e5d21..716f25b 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -24,4 +24,7 @@ int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
int lbs_update_hw_spec(struct lbs_private *priv);
+int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
+ struct cmd_ds_mesh_access *cmd);
+
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index b4cd7b7..6ff705b 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -653,11 +653,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
sizeof(resp->params.fwt));
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
- case CMD_RET(CMD_MESH_ACCESS):
- if (priv->cur_cmd->pdata_buf)
- memcpy(priv->cur_cmd->pdata_buf, &resp->params.mesh,
- sizeof(resp->params.mesh));
- break;
case CMD_RET(CMD_802_11_BEACON_CTRL):
ret = lbs_ret_802_11_bcn_ctrl(priv, resp);
break;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index e5e2106..d9b151a 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -623,6 +623,8 @@ struct cmd_ds_fwt_access {
} __attribute__ ((packed));
struct cmd_ds_mesh_access {
+ struct cmd_header hdr;
+
__le16 action;
__le32 data[32]; /* last position reserved */
} __attribute__ ((packed));
@@ -687,7 +689,6 @@ struct cmd_ds_command {
struct cmd_tx_rate_query txrate;
struct cmd_ds_bt_access bt;
struct cmd_ds_fwt_access fwt;
- struct cmd_ds_mesh_access mesh;
struct cmd_ds_get_tsf gettsf;
struct cmd_ds_802_11_subscribe_event subscribe_event;
struct cmd_ds_802_11_beacon_control bcn_ctrl;
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 5f2d944..a0866ef 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -990,11 +990,9 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
*/
struct cmd_ds_mesh_access mesh_access;
memset(&mesh_access, 0, sizeof(mesh_access));
+
mesh_access.data[0] = cpu_to_le32(1);
- lbs_prepare_and_send_command(priv,
- CMD_MESH_ACCESS,
- CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
- CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+ lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED, &mesh_access);
}
netif_device_detach(cardp->eth_dev);
@@ -1031,10 +1029,7 @@ static int if_usb_resume(struct usb_interface *intf)
struct cmd_ds_mesh_access mesh_access;
memset(&mesh_access, 0, sizeof(mesh_access));
mesh_access.data[0] = cpu_to_le32(0);
- lbs_prepare_and_send_command(priv,
- CMD_MESH_ACCESS,
- CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
- CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+ lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED, &mesh_access);
}
lbs_deb_leave(LBS_DEB_USB);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index a081b91..7f6b3cc 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -217,13 +217,15 @@ u8 lbs_data_rate_to_fw_index(u32 rate)
static ssize_t lbs_anycast_get(struct device *dev,
struct device_attribute *attr, char * buf)
{
+ struct lbs_private *priv = to_net_dev(dev)->priv;
struct cmd_ds_mesh_access mesh_access;
+ int ret;
memset(&mesh_access, 0, sizeof(mesh_access));
- lbs_prepare_and_send_command(to_net_dev(dev)->priv,
- CMD_MESH_ACCESS,
- CMD_ACT_MESH_GET_ANYCAST,
- CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+
+ ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_ANYCAST, &mesh_access);
+ if (ret)
+ return ret;
return snprintf(buf, 12, "0x%X\n", le32_to_cpu(mesh_access.data[0]));
}
@@ -234,17 +236,19 @@ static ssize_t lbs_anycast_get(struct device *dev,
static ssize_t lbs_anycast_set(struct device *dev,
struct device_attribute *attr, const char * buf, size_t count)
{
+ struct lbs_private *priv = to_net_dev(dev)->priv;
struct cmd_ds_mesh_access mesh_access;
uint32_t datum;
+ int ret;
memset(&mesh_access, 0, sizeof(mesh_access));
sscanf(buf, "%x", &datum);
mesh_access.data[0] = cpu_to_le32(datum);
- lbs_prepare_and_send_command((to_net_dev(dev))->priv,
- CMD_MESH_ACCESS,
- CMD_ACT_MESH_SET_ANYCAST,
- CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+ ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_ANYCAST, &mesh_access);
+ if (ret)
+ return ret;
+
return strlen(buf);
}
@@ -323,14 +327,15 @@ static DEVICE_ATTR(anycast_mask, 0644, lbs_anycast_get, lbs_anycast_set);
static ssize_t lbs_autostart_enabled_get(struct device *dev,
struct device_attribute *attr, char * buf)
{
+ struct lbs_private *priv = to_net_dev(dev)->priv;
struct cmd_ds_mesh_access mesh_access;
+ int ret;
memset(&mesh_access, 0, sizeof(mesh_access));
- lbs_prepare_and_send_command(to_net_dev(dev)->priv,
- CMD_MESH_ACCESS,
- CMD_ACT_MESH_GET_AUTOSTART_ENABLED,
- CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+ ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_AUTOSTART_ENABLED, &mesh_access);
+ if (ret)
+ return ret;
return sprintf(buf, "%d\n", le32_to_cpu(mesh_access.data[0]));
}
@@ -346,10 +351,7 @@ static ssize_t lbs_autostart_enabled_set(struct device *dev,
sscanf(buf, "%d", &datum);
mesh_access.data[0] = cpu_to_le32(datum);
- ret = lbs_prepare_and_send_command(priv,
- CMD_MESH_ACCESS,
- CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
- CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+ ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED, &mesh_access);
if (ret == 0)
priv->mesh_autostart_enabled = datum ? 1 : 0;
@@ -866,10 +868,8 @@ static int lbs_setup_firmware(struct lbs_private *priv)
if (priv->mesh_dev) {
memset(&mesh_access, 0, sizeof(mesh_access));
mesh_access.data[0] = cpu_to_le32(0);
- ret = lbs_prepare_and_send_command(priv,
- CMD_MESH_ACCESS,
- CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
- CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+ ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
+ &mesh_access);
if (ret) {
ret = -1;
goto done;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 68/48] libertas: remove casts from lbs_cmd() and lbs_cmd_with_response() macros
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (66 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 67/48] libertas: convert CMD_MESH_ACCESS to a direct command David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 69/48] libertas: fix case of FWT_ACCESS_LIST_ROUTE and FWT_ACCESS_LIST_NEIGHBOR commands David Woodhouse
` (65 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 15:28:18 -0500
If stupid people like me give it arguments with the wrong type (like a
pointer to the structure, for example, instead of the structure itself),
then we should probably notice that at compile time. Otherwise, much
confusion ensues.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 716f25b..950acce 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -7,11 +7,11 @@
#include "dev.h"
#define lbs_cmd(priv, cmdnr, cmd, callback, callback_arg) \
- __lbs_cmd(priv, cmdnr, (struct cmd_header *) &cmd, sizeof(cmd), \
+ __lbs_cmd(priv, cmdnr, &(cmd).hdr, sizeof(cmd), \
callback, callback_arg)
#define lbs_cmd_with_response(priv, cmdnr, cmd) \
- __lbs_cmd(priv, cmdnr, (struct cmd_header *) &cmd, sizeof(cmd), \
+ __lbs_cmd(priv, cmdnr, &(cmd).hdr, sizeof(cmd), \
lbs_cmd_copyback, (unsigned long) &cmd)
int __lbs_cmd(struct lbs_private *priv, uint16_t command,
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 69/48] libertas: fix case of FWT_ACCESS_LIST_ROUTE and FWT_ACCESS_LIST_NEIGHBOR commands
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (67 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 68/48] libertas: remove casts from lbs_cmd() and lbs_cmd_with_response() macros David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 70/48] libertas: convert DATA_RATE to a direct command David Woodhouse
` (64 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 15:29:10 -0500
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/host.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index b23af19..cc5f9bf 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -247,8 +247,8 @@ enum cmd_fwt_access_opts {
CMD_ACT_FWT_ACCESS_DEL,
CMD_ACT_FWT_ACCESS_LOOKUP,
CMD_ACT_FWT_ACCESS_LIST,
- CMD_ACT_FWT_ACCESS_LIST_route,
- CMD_ACT_FWT_ACCESS_LIST_neighbor,
+ CMD_ACT_FWT_ACCESS_LIST_ROUTE,
+ CMD_ACT_FWT_ACCESS_LIST_NEIGHBOR,
CMD_ACT_FWT_ACCESS_RESET,
CMD_ACT_FWT_ACCESS_CLEANUP,
CMD_ACT_FWT_ACCESS_TIME,
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 70/48] libertas: convert DATA_RATE to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (68 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 69/48] libertas: fix case of FWT_ACCESS_LIST_ROUTE and FWT_ACCESS_LIST_NEIGHBOR commands David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 71/48] libertas: convert RF_CHANNEL " David Woodhouse
` (63 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 15:50:59 -0500
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 93 ++++++++++++++++++++++++-------
drivers/net/wireless/libertas/cmd.h | 3 +
drivers/net/wireless/libertas/cmdresp.c | 23 --------
drivers/net/wireless/libertas/hostcmd.h | 3 +-
drivers/net/wireless/libertas/main.c | 8 +--
drivers/net/wireless/libertas/wext.c | 9 +--
6 files changed, 83 insertions(+), 56 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 9d621fe..eff7879 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -706,30 +706,86 @@ static int lbs_cmd_802_11_rate_adapt_rateset(struct lbs_private *priv,
return 0;
}
-static int lbs_cmd_802_11_data_rate(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- u16 cmd_action)
+/**
+ * @brief Get the current data rate
+ *
+ * @param priv A pointer to struct lbs_private structure
+ *
+ * @return The data rate on success, error on failure
+ */
+int lbs_get_data_rate(struct lbs_private *priv)
{
- struct cmd_ds_802_11_data_rate *pdatarate = &cmd->params.drate;
+ struct cmd_ds_802_11_data_rate cmd;
+ int ret = -1;
lbs_deb_enter(LBS_DEB_CMD);
- cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_data_rate) +
- S_DS_GEN);
- cmd->command = cpu_to_le16(CMD_802_11_DATA_RATE);
- memset(pdatarate, 0, sizeof(struct cmd_ds_802_11_data_rate));
- pdatarate->action = cpu_to_le16(cmd_action);
-
- if (cmd_action == CMD_ACT_SET_TX_FIX_RATE) {
- pdatarate->rates[0] = lbs_data_rate_to_fw_index(priv->cur_rate);
- lbs_deb_cmd("DATA_RATE: set fixed 0x%02X\n",
- priv->cur_rate);
- } else if (cmd_action == CMD_ACT_SET_TX_AUTO) {
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_ACT_GET_TX_RATE);
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, cmd);
+ if (ret)
+ goto out;
+
+ lbs_deb_hex(LBS_DEB_CMD, "DATA_RATE_RESP", (u8 *) &cmd, sizeof (cmd));
+
+ ret = (int) lbs_fw_index_to_data_rate(cmd.rates[0]);
+ lbs_deb_cmd("DATA_RATE: current rate 0x%02x\n", ret);
+
+out:
+ lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+ return ret;
+}
+
+/**
+ * @brief Set the data rate
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param rate The desired data rate, or 0 to clear a locked rate
+ *
+ * @return 0 on success, error on failure
+ */
+int lbs_set_data_rate(struct lbs_private *priv, u8 rate)
+{
+ struct cmd_ds_802_11_data_rate cmd;
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_CMD);
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+
+ if (rate > 0) {
+ cmd.action = cpu_to_le16(CMD_ACT_SET_TX_FIX_RATE);
+ cmd.rates[0] = lbs_data_rate_to_fw_index(rate);
+ if (cmd.rates[0] == 0) {
+ lbs_deb_cmd("DATA_RATE: invalid requested rate of"
+ " 0x%02X\n", rate);
+ ret = 0;
+ goto out;
+ }
+ lbs_deb_cmd("DATA_RATE: set fixed 0x%02X\n", cmd.rates[0]);
+ } else {
+ cmd.action = cpu_to_le16(CMD_ACT_SET_TX_AUTO);
lbs_deb_cmd("DATA_RATE: setting auto\n");
}
- lbs_deb_leave(LBS_DEB_CMD);
- return 0;
+ ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, cmd);
+ if (ret)
+ goto out;
+
+ lbs_deb_hex(LBS_DEB_CMD, "DATA_RATE_RESP", (u8 *) &cmd, sizeof (cmd));
+
+ /* FIXME: get actual rates FW can do if this command actually returns
+ * all data rates supported.
+ */
+ priv->cur_rate = lbs_fw_index_to_data_rate(cmd.rates[0]);
+ lbs_deb_cmd("DATA_RATE: current rate is 0x%02x\n", priv->cur_rate);
+
+out:
+ lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+ return ret;
}
static int lbs_cmd_mac_multicast_adr(struct lbs_private *priv,
@@ -1348,9 +1404,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_802_11_radio_control(priv, cmdptr, cmd_action);
break;
- case CMD_802_11_DATA_RATE:
- ret = lbs_cmd_802_11_data_rate(priv, cmdptr, cmd_action);
- break;
case CMD_802_11_RATE_ADAPT_RATESET:
ret = lbs_cmd_802_11_rate_adapt_rateset(priv,
cmdptr, cmd_action);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 950acce..4bd6f56 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -27,4 +27,7 @@ int lbs_update_hw_spec(struct lbs_private *priv);
int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
struct cmd_ds_mesh_access *cmd);
+int lbs_get_data_rate(struct lbs_private *priv);
+int lbs_set_data_rate(struct lbs_private *priv, u8 rate);
+
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 6ff705b..797c943 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -325,26 +325,6 @@ static int lbs_ret_802_11_rate_adapt_rateset(struct lbs_private *priv,
return 0;
}
-static int lbs_ret_802_11_data_rate(struct lbs_private *priv,
- struct cmd_ds_command *resp)
-{
- struct cmd_ds_802_11_data_rate *pdatarate = &resp->params.drate;
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- lbs_deb_hex(LBS_DEB_CMD, "DATA_RATE_RESP", (u8 *) pdatarate,
- sizeof(struct cmd_ds_802_11_data_rate));
-
- /* FIXME: get actual rates FW can do if this command actually returns
- * all data rates supported.
- */
- priv->cur_rate = lbs_fw_index_to_data_rate(pdatarate->rates[0]);
- lbs_deb_cmd("DATA_RATE: current rate 0x%02x\n", priv->cur_rate);
-
- lbs_deb_leave(LBS_DEB_CMD);
- return 0;
-}
-
static int lbs_ret_802_11_rf_channel(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
@@ -565,9 +545,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
ret = lbs_ret_802_11_enable_rsn(priv, resp);
break;
- case CMD_RET(CMD_802_11_DATA_RATE):
- ret = lbs_ret_802_11_data_rate(priv, resp);
- break;
case CMD_RET(CMD_802_11_RATE_ADAPT_RATESET):
ret = lbs_ret_802_11_rate_adapt_rateset(priv, resp);
break;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index d9b151a..d51010c 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -461,6 +461,8 @@ struct PS_CMD_ConfirmSleep {
};
struct cmd_ds_802_11_data_rate {
+ struct cmd_header hdr;
+
__le16 action;
__le16 reserved;
u8 rates[MAX_RATES];
@@ -659,7 +661,6 @@ struct cmd_ds_command {
struct cmd_ds_802_11_rf_tx_power txp;
struct cmd_ds_802_11_rf_antenna rant;
struct cmd_ds_802_11_monitor_mode monitor;
- struct cmd_ds_802_11_data_rate drate;
struct cmd_ds_802_11_rate_adapt_rateset rateset;
struct cmd_ds_mac_multicast_adr madr;
struct cmd_ds_802_11_ad_hoc_join adj;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 7f6b3cc..2fe7ad0 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -854,12 +854,8 @@ static int lbs_setup_firmware(struct lbs_private *priv)
lbs_set_mac_packet_filter(priv);
- /* Get the supported Data rates */
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_DATA_RATE,
- CMD_ACT_GET_TX_RATE,
- CMD_OPTION_WAITFORRSP, 0, NULL);
-
- if (ret) {
+ ret = lbs_get_data_rate(priv);
+ if (ret < 0) {
ret = -1;
goto done;
}
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 1e0b224..e44c0ce 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -19,6 +19,7 @@
#include "join.h"
#include "wext.h"
#include "assoc.h"
+#include "cmd.h"
static inline void lbs_postpone_association_work(struct lbs_private *priv)
@@ -962,8 +963,7 @@ static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
struct iw_param *vwrq, char *extra)
{
struct lbs_private *priv = dev->priv;
- u32 new_rate;
- u16 action;
+ u8 new_rate = 0;
int ret = -EINVAL;
u8 rates[MAX_RATES + 1];
@@ -972,7 +972,6 @@ static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
/* Auto rate? */
if (vwrq->value == -1) {
- action = CMD_ACT_SET_TX_AUTO;
priv->auto_rate = 1;
priv->cur_rate = 0;
} else {
@@ -989,12 +988,10 @@ static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
}
priv->cur_rate = new_rate;
- action = CMD_ACT_SET_TX_FIX_RATE;
priv->auto_rate = 0;
}
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_DATA_RATE,
- action, CMD_OPTION_WAITFORRSP, 0, NULL);
+ ret = lbs_set_data_rate(priv, new_rate);
out:
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 71/48] libertas: convert RF_CHANNEL to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (69 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 70/48] libertas: convert DATA_RATE to a direct command David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 72/48] libertas: endianness fixes for get_channel/set_channel David Woodhouse
` (62 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 16:54:15 -0500
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 23 ++++++----
drivers/net/wireless/libertas/cmd.c | 71 +++++++++++++++++++++++--------
drivers/net/wireless/libertas/cmd.h | 3 +
drivers/net/wireless/libertas/cmdresp.c | 25 -----------
drivers/net/wireless/libertas/hostcmd.h | 10 +++--
5 files changed, 75 insertions(+), 57 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index 63bd692..bd9cfe1 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -9,6 +9,7 @@
#include "decl.h"
#include "hostcmd.h"
#include "host.h"
+#include "cmd.h"
static const u8 bssid_any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
@@ -165,11 +166,14 @@ done:
static int update_channel(struct lbs_private *priv)
{
int ret;
+
/* the channel in f/w could be out of sync, get the current channel */
lbs_deb_enter(LBS_DEB_ASSOC);
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_RF_CHANNEL,
- CMD_OPT_802_11_RF_CHANNEL_GET,
- CMD_OPTION_WAITFORRSP, 0, NULL);
+
+ ret = lbs_get_channel(priv);
+ if (ret > 0)
+ priv->curbssparams.channel = (u8) ret;
+
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
return ret;
}
@@ -203,17 +207,16 @@ static int assoc_helper_channel(struct lbs_private *priv,
lbs_deb_assoc("ASSOC: channel: %d -> %d\n",
priv->curbssparams.channel, assoc_req->channel);
- ret = lbs_prepare_and_send_command(priv, CMD_802_11_RF_CHANNEL,
- CMD_OPT_802_11_RF_CHANNEL_SET,
- CMD_OPTION_WAITFORRSP, 0, &assoc_req->channel);
- if (ret < 0) {
+ ret = lbs_set_channel(priv, assoc_req->channel);
+ if (ret < 0)
lbs_deb_assoc("ASSOC: channel: error setting channel.");
- }
+ /* FIXME: shouldn't need to grab the channel _again_ after setting
+ * it since the firmware is supposed to return the new channel, but
+ * whatever... */
ret = update_channel(priv);
- if (ret < 0) {
+ if (ret < 0)
lbs_deb_assoc("ASSOC: channel: error getting channel.");
- }
if (assoc_req->channel != priv->curbssparams.channel) {
lbs_deb_assoc("ASSOC: channel: failed to update channel to %d",
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index eff7879..32f9f88 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -810,25 +810,65 @@ static int lbs_cmd_mac_multicast_adr(struct lbs_private *priv,
return 0;
}
-static int lbs_cmd_802_11_rf_channel(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- int option, void *pdata_buf)
+/**
+ * @brief Get the radio channel
+ *
+ * @param priv A pointer to struct lbs_private structure
+ *
+ * @return The channel on success, error on failure
+ */
+int lbs_get_channel(struct lbs_private *priv)
{
- struct cmd_ds_802_11_rf_channel *rfchan = &cmd->params.rfchannel;
+ struct cmd_ds_802_11_rf_channel cmd;
+ int ret = 0;
lbs_deb_enter(LBS_DEB_CMD);
- cmd->command = cpu_to_le16(CMD_802_11_RF_CHANNEL);
- cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_rf_channel) +
- S_DS_GEN);
- if (option == CMD_OPT_802_11_RF_CHANNEL_SET) {
- rfchan->currentchannel = cpu_to_le16(*((u16 *) pdata_buf));
- }
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_OPT_802_11_RF_CHANNEL_GET);
- rfchan->action = cpu_to_le16(option);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_RF_CHANNEL, cmd);
+ if (ret)
+ goto out;
- lbs_deb_leave(LBS_DEB_CMD);
- return 0;
+ lbs_deb_cmd("current radio channel is %d\n", cmd.channel);
+ ret = (int) cmd.channel;
+
+out:
+ lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+ return ret;
+}
+
+/**
+ * @brief Set the radio channel
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param channel The desired channel, or 0 to clear a locked channel
+ *
+ * @return 0 on success, error on failure
+ */
+int lbs_set_channel(struct lbs_private *priv, u8 channel)
+{
+ struct cmd_ds_802_11_rf_channel cmd;
+ u8 old_channel = priv->curbssparams.channel;
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_CMD);
+
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_OPT_802_11_RF_CHANNEL_SET);
+ cmd.channel = cpu_to_le16(channel);
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_RF_CHANNEL, cmd);
+ if (ret)
+ goto out;
+
+ priv->curbssparams.channel = cmd.channel;
+ lbs_deb_cmd("channel switch from %d to %d\n", old_channel, cmd.channel);
+
+out:
+ lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+ return ret;
}
static int lbs_cmd_802_11_rssi(struct lbs_private *priv,
@@ -1390,11 +1430,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_reg_access(priv, cmdptr, cmd_action, pdata_buf);
break;
- case CMD_802_11_RF_CHANNEL:
- ret = lbs_cmd_802_11_rf_channel(priv, cmdptr,
- cmd_action, pdata_buf);
- break;
-
case CMD_802_11_RF_TX_POWER:
ret = lbs_cmd_802_11_rf_tx_power(priv, cmdptr,
cmd_action, pdata_buf);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 4bd6f56..5b02d73 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -30,4 +30,7 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
int lbs_get_data_rate(struct lbs_private *priv);
int lbs_set_data_rate(struct lbs_private *priv, u8 rate);
+int lbs_get_channel(struct lbs_private *priv);
+int lbs_set_channel(struct lbs_private *priv, u8 channel);
+
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 797c943..bf9941e 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -325,28 +325,6 @@ static int lbs_ret_802_11_rate_adapt_rateset(struct lbs_private *priv,
return 0;
}
-static int lbs_ret_802_11_rf_channel(struct lbs_private *priv,
- struct cmd_ds_command *resp)
-{
- struct cmd_ds_802_11_rf_channel *rfchannel = &resp->params.rfchannel;
- u16 action = le16_to_cpu(rfchannel->action);
- u16 newchannel = le16_to_cpu(rfchannel->currentchannel);
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- if (action == CMD_OPT_802_11_RF_CHANNEL_GET
- && priv->curbssparams.channel != newchannel) {
- lbs_deb_cmd("channel switch from %d to %d\n",
- priv->curbssparams.channel, newchannel);
-
- /* Update the channel again */
- priv->curbssparams.channel = newchannel;
- }
-
- lbs_deb_enter(LBS_DEB_CMD);
- return 0;
-}
-
static int lbs_ret_802_11_rssi(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
@@ -548,9 +526,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_RATE_ADAPT_RATESET):
ret = lbs_ret_802_11_rate_adapt_rateset(priv, resp);
break;
- case CMD_RET(CMD_802_11_RF_CHANNEL):
- ret = lbs_ret_802_11_rf_channel(priv, resp);
- break;
case CMD_RET(CMD_802_11_RSSI):
ret = lbs_ret_802_11_rssi(priv, resp);
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index d51010c..7acb651 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -386,11 +386,13 @@ struct cmd_ds_802_11_inactivity_timeout {
};
struct cmd_ds_802_11_rf_channel {
+ struct cmd_header hdr;
+
__le16 action;
- __le16 currentchannel;
- __le16 rftype;
- __le16 reserved;
- u8 channellist[32];
+ __le16 channel;
+ __le16 rftype; /* unused */
+ __le16 reserved; /* unused */
+ u8 channellist[32]; /* unused */
};
struct cmd_ds_802_11_rssi {
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 72/48] libertas: endianness fixes for get_channel/set_channel
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (70 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 71/48] libertas: convert RF_CHANNEL " David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 73/48] libertas: make some more functions static David Woodhouse
` (61 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
From: Dan Williams <dcbw@redhat.com>
Date: Tue, 11 Dec 2007 17:35:51 -0500
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 32f9f88..0f07c2a 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -831,8 +831,8 @@ int lbs_get_channel(struct lbs_private *priv)
if (ret)
goto out;
- lbs_deb_cmd("current radio channel is %d\n", cmd.channel);
- ret = (int) cmd.channel;
+ ret = le16_to_cpu(cmd.channel);
+ lbs_deb_cmd("current radio channel is %d\n", ret);
out:
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
@@ -863,8 +863,9 @@ int lbs_set_channel(struct lbs_private *priv, u8 channel)
if (ret)
goto out;
- priv->curbssparams.channel = cmd.channel;
- lbs_deb_cmd("channel switch from %d to %d\n", old_channel, cmd.channel);
+ priv->curbssparams.channel = (uint8_t) le16_to_cpu(cmd.channel);
+ lbs_deb_cmd("channel switch from %d to %d\n", old_channel,
+ priv->curbssparams.channel);
out:
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 73/48] libertas: make some more functions static
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (71 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 72/48] libertas: endianness fixes for get_channel/set_channel David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 74/48] libertas: fix sparse endianness warnings in scan.c David Woodhouse
` (60 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 17:44:10 -0500
sparse was getting on my tits.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 12 ++++++------
drivers/net/wireless/libertas/if_usb.c | 2 +-
drivers/net/wireless/libertas/main.c | 8 ++++----
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 0f07c2a..2228fec 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -14,8 +14,8 @@
#include "cmd.h"
static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode);
-struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
-void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
+static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
+static void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
struct cmd_ctrl_node *ptempnode,
u16 wait_option, void *pdata_buf);
@@ -1716,7 +1716,7 @@ done:
* @param priv A pointer to struct lbs_private structure
* @return cmd_ctrl_node A pointer to cmd_ctrl_node structure or NULL
*/
-struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
+static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
{
struct cmd_ctrl_node *tempnode;
unsigned long flags;
@@ -1780,9 +1780,9 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *cmdnode)
* @param pdata_buf A pointer to informaion buffer
* @return 0 or -1
*/
-void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
- struct cmd_ctrl_node *ptempnode,
- u16 wait_option, void *pdata_buf)
+static void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
+ struct cmd_ctrl_node *ptempnode,
+ u16 wait_option, void *pdata_buf)
{
lbs_deb_enter(LBS_DEB_HOST);
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index a0866ef..7c57ff4 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -113,7 +113,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
lbs_deb_usb("Setting boot2 version failed\n");
}
-void if_usb_fw_timeo(unsigned long priv)
+static void if_usb_fw_timeo(unsigned long priv)
{
struct usb_card_rec *cardp = (void *)priv;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 2fe7ad0..c51d3af 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -252,8 +252,8 @@ static ssize_t lbs_anycast_set(struct device *dev,
return strlen(buf);
}
-int lbs_add_rtap(struct lbs_private *priv);
-void lbs_remove_rtap(struct lbs_private *priv);
+static int lbs_add_rtap(struct lbs_private *priv);
+static void lbs_remove_rtap(struct lbs_private *priv);
/**
* Get function for sysfs attribute rtap
@@ -1423,7 +1423,7 @@ static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev)
}
-void lbs_remove_rtap(struct lbs_private *priv)
+static void lbs_remove_rtap(struct lbs_private *priv)
{
if (priv->rtap_net_dev == NULL)
return;
@@ -1432,7 +1432,7 @@ void lbs_remove_rtap(struct lbs_private *priv)
priv->rtap_net_dev = NULL;
}
-int lbs_add_rtap(struct lbs_private *priv)
+static int lbs_add_rtap(struct lbs_private *priv)
{
int rc = 0;
struct net_device *rtap_dev;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 74/48] libertas: fix sparse endianness warnings in scan.c
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (72 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 73/48] libertas: make some more functions static David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 75/48] libertas: add lbs_mesh sysfs attribute for enabling mesh David Woodhouse
` (59 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 17:54:36 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/scan.c | 11 +++++------
1 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c
index 8b6ce61..92d84c7 100644
--- a/drivers/net/wireless/libertas/scan.c
+++ b/drivers/net/wireless/libertas/scan.c
@@ -709,7 +709,7 @@ static int lbs_process_bss(struct bss_descriptor *bss,
if (*bytesleft >= sizeof(beaconsize)) {
/* Extract & convert beacon size from the command buffer */
- beaconsize = le16_to_cpu(get_unaligned((u16 *)*pbeaconinfo));
+ beaconsize = le16_to_cpu(get_unaligned((__le16 *)*pbeaconinfo));
*bytesleft -= sizeof(beaconsize);
*pbeaconinfo += sizeof(beaconsize);
}
@@ -823,7 +823,7 @@ static int lbs_process_bss(struct bss_descriptor *bss,
case MFIE_TYPE_IBSS_SET:
pibss = (struct ieeetypes_ibssparamset *) pos;
- bss->atimwindow = le32_to_cpu(pibss->atimwindow);
+ bss->atimwindow = le16_to_cpu(pibss->atimwindow);
memmove(&bss->ssparamset.ibssparamset, pibss,
sizeof(struct ieeetypes_ibssparamset));
lbs_deb_scan("got IBSS IE\n");
@@ -1562,12 +1562,11 @@ int lbs_ret_80211_scan(struct lbs_private *priv, struct cmd_ds_command *resp)
goto done;
}
- bytesleft = le16_to_cpu(get_unaligned((u16*)&pscan->bssdescriptsize));
+ bytesleft = le16_to_cpu(pscan->bssdescriptsize);
lbs_deb_scan("SCAN_RESP: bssdescriptsize %d\n", bytesleft);
- scanrespsize = le16_to_cpu(get_unaligned((u16*)&resp->size));
- lbs_deb_scan("SCAN_RESP: scan results %d\n",
- pscan->nr_sets);
+ scanrespsize = le16_to_cpu(resp->size);
+ lbs_deb_scan("SCAN_RESP: scan results %d\n", pscan->nr_sets);
pbssinfo = pscan->bssdesc_and_tlvbuffer;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 75/48] libertas: add lbs_mesh sysfs attribute for enabling mesh
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (73 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 74/48] libertas: fix sparse endianness warnings in scan.c David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 76/48] libertas: kill references to mesh autostart David Woodhouse
` (58 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 18:56:42 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 17 +++++++
drivers/net/wireless/libertas/cmd.h | 2 +
drivers/net/wireless/libertas/decl.h | 2 -
drivers/net/wireless/libertas/dev.h | 2 +
drivers/net/wireless/libertas/host.h | 1 +
drivers/net/wireless/libertas/hostcmd.h | 12 +++++
drivers/net/wireless/libertas/if_usb.c | 6 ---
drivers/net/wireless/libertas/main.c | 74 +++++++++++++++++++++++++++----
8 files changed, 99 insertions(+), 17 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 2228fec..01d2349 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1093,6 +1093,23 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
}
EXPORT_SYMBOL_GPL(lbs_mesh_access);
+int lbs_mesh_config(struct lbs_private *priv, int enable)
+{
+ struct cmd_ds_mesh_config cmd;
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.action = cpu_to_le16(enable);
+ cmd.channel = cpu_to_le16(priv->curbssparams.channel);
+ cmd.type = cpu_to_le16(0x100 + 37);
+
+ if (enable) {
+ cmd.length = cpu_to_le16(priv->mesh_ssid_len);
+ memcpy(cmd.data, priv->mesh_ssid, priv->mesh_ssid_len);
+ }
+
+ return lbs_cmd_with_response(priv, CMD_MESH_CONFIG, cmd);
+}
+
static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
struct cmd_ds_command *cmd,
u16 cmd_action)
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 5b02d73..80714b5 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -33,4 +33,6 @@ int lbs_set_data_rate(struct lbs_private *priv, u8 rate);
int lbs_get_channel(struct lbs_private *priv);
int lbs_set_channel(struct lbs_private *priv, u8 channel);
+int lbs_mesh_config(struct lbs_private *priv, int enable);
+
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 33c8305..9b0ef16 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -74,8 +74,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev);
int lbs_remove_card(struct lbs_private *priv);
int lbs_start_card(struct lbs_private *priv);
int lbs_stop_card(struct lbs_private *priv);
-int lbs_add_mesh(struct lbs_private *priv, struct device *dev);
-void lbs_remove_mesh(struct lbs_private *priv);
int lbs_reset_device(struct lbs_private *priv);
void lbs_host_to_card_done(struct lbs_private *priv);
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 9921d0c..86b45a4 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -201,6 +201,8 @@ struct lbs_private {
/** current ssid/bssid related parameters*/
struct current_bss_params curbssparams;
+ u8 mesh_ssid[IW_ESSID_MAX_SIZE + 1];
+ u8 mesh_ssid_len;
/* IW_MODE_* */
u8 mode;
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index cc5f9bf..fcd2238 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -113,6 +113,7 @@
#define CMD_802_11_MONITOR_MODE 0x0098
#define CMD_MESH_ACCESS 0x009b
+#define CMD_MESH_CONFIG 0x00a3
#define CMD_SET_BOOT2_VER 0x00a5
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 7acb651..aab5d64 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -626,6 +626,18 @@ struct cmd_ds_fwt_access {
u8 prec[ETH_ALEN];
} __attribute__ ((packed));
+
+struct cmd_ds_mesh_config {
+ struct cmd_header hdr;
+
+ __le16 action;
+ __le16 channel;
+ __le16 type;
+ __le16 length;
+ u8 data[128]; /* last position reserved */
+} __attribute__ ((packed));
+
+
struct cmd_ds_mesh_access {
struct cmd_header hdr;
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 7c57ff4..351c7ea 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -232,9 +232,6 @@ static int if_usb_probe(struct usb_interface *intf,
cardp->priv = priv;
cardp->priv->fw_ready = 1;
- if (lbs_add_mesh(priv, &udev->dev))
- goto err_add_mesh;
-
cardp->eth_dev = priv->dev;
priv->hw_host_to_card = if_usb_host_to_card;
@@ -255,8 +252,6 @@ static int if_usb_probe(struct usb_interface *intf,
return 0;
err_start_card:
- lbs_remove_mesh(priv);
-err_add_mesh:
lbs_remove_card(priv);
err_prog_firmware:
if_usb_reset_device(cardp);
@@ -286,7 +281,6 @@ static void if_usb_disconnect(struct usb_interface *intf)
priv->surpriseremoved = 1;
lbs_stop_card(priv);
- lbs_remove_mesh(priv);
lbs_remove_card(priv);
}
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index c51d3af..fd76c46 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -254,6 +254,9 @@ static ssize_t lbs_anycast_set(struct device *dev,
static int lbs_add_rtap(struct lbs_private *priv);
static void lbs_remove_rtap(struct lbs_private *priv);
+static int lbs_add_mesh(struct lbs_private *priv);
+static void lbs_remove_mesh(struct lbs_private *priv);
+
/**
* Get function for sysfs attribute rtap
@@ -312,11 +315,53 @@ static ssize_t lbs_rtap_set(struct device *dev,
}
/**
- * lbs_rtap attribute to be exported per mshX interface
- * through sysfs (/sys/class/net/mshX/libertas-rtap)
+ * lbs_rtap attribute to be exported per ethX interface
+ * through sysfs (/sys/class/net/ethX/lbs_rtap)
*/
-static DEVICE_ATTR(lbs_rtap, 0644, lbs_rtap_get,
- lbs_rtap_set );
+static DEVICE_ATTR(lbs_rtap, 0644, lbs_rtap_get, lbs_rtap_set );
+
+/**
+ * Get function for sysfs attribute mesh
+ */
+static ssize_t lbs_mesh_get(struct device *dev,
+ struct device_attribute *attr, char * buf)
+{
+ struct lbs_private *priv = to_net_dev(dev)->priv;
+ return snprintf(buf, 5, "0x%X\n", !!priv->mesh_dev);
+}
+
+/**
+ * Set function for sysfs attribute mesh
+ */
+static ssize_t lbs_mesh_set(struct device *dev,
+ struct device_attribute *attr, const char * buf, size_t count)
+{
+ struct lbs_private *priv = to_net_dev(dev)->priv;
+ int enable;
+ int ret;
+
+ sscanf(buf, "%x", &enable);
+ enable = !!enable;
+ if (enable == !!priv->mesh_dev)
+ return count;
+
+ ret = lbs_mesh_config(priv, enable);
+ if (ret)
+ return ret;
+
+ if (enable)
+ lbs_add_mesh(priv);
+ else
+ lbs_remove_mesh(priv);
+
+ return count;
+}
+
+/**
+ * lbs_mesh attribute to be exported per ethX interface
+ * through sysfs (/sys/class/net/ethX/lbs_mesh)
+ */
+static DEVICE_ATTR(lbs_mesh, 0644, lbs_mesh_get, lbs_mesh_set);
/**
* anycast_mask attribute to be exported per mshX interface
@@ -867,7 +912,9 @@ static int lbs_setup_firmware(struct lbs_private *priv)
ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
&mesh_access);
if (ret) {
- ret = -1;
+ printk("Mesh autostart set failed\n");
+ ret = 0;
+ //ret = -1;
goto done;
}
priv->mesh_autostart_enabled = 0;
@@ -1059,6 +1106,9 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker);
INIT_WORK(&priv->sync_channel, lbs_sync_channel);
+ sprintf(priv->mesh_ssid, "mesh");
+ priv->mesh_ssid_len = 4;
+
goto done;
err_init_adapter:
@@ -1080,6 +1130,7 @@ int lbs_remove_card(struct lbs_private *priv)
lbs_deb_enter(LBS_DEB_MAIN);
+ lbs_remove_mesh(priv);
lbs_remove_rtap(priv);
dev = priv->dev;
@@ -1133,6 +1184,8 @@ int lbs_start_card(struct lbs_private *priv)
}
if (device_create_file(&dev->dev, &dev_attr_lbs_rtap))
lbs_pr_err("cannot register lbs_rtap attribute\n");
+ if (device_create_file(&dev->dev, &dev_attr_lbs_mesh))
+ lbs_pr_err("cannot register lbs_mesh attribute\n");
lbs_debugfs_init_one(priv, dev);
@@ -1161,6 +1214,7 @@ int lbs_stop_card(struct lbs_private *priv)
lbs_debugfs_remove_one(priv);
device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
+ device_remove_file(&dev->dev, &dev_attr_lbs_mesh);
/* Flush pending command nodes */
spin_lock_irqsave(&priv->driver_lock, flags);
@@ -1184,7 +1238,7 @@ EXPORT_SYMBOL_GPL(lbs_stop_card);
* @param priv A pointer to the struct lbs_private structure
* @return 0 if successful, -X otherwise
*/
-int lbs_add_mesh(struct lbs_private *priv, struct device *dev)
+static int lbs_add_mesh(struct lbs_private *priv)
{
struct net_device *mesh_dev = NULL;
int ret = 0;
@@ -1209,7 +1263,7 @@ int lbs_add_mesh(struct lbs_private *priv, struct device *dev)
memcpy(mesh_dev->dev_addr, priv->dev->dev_addr,
sizeof(priv->dev->dev_addr));
- SET_NETDEV_DEV(priv->mesh_dev, dev);
+ SET_NETDEV_DEV(priv->mesh_dev, priv->dev->dev.parent);
#ifdef WIRELESS_EXT
mesh_dev->wireless_handlers = (struct iw_handler_def *)&mesh_handler_def;
@@ -1242,7 +1296,7 @@ done:
EXPORT_SYMBOL_GPL(lbs_add_mesh);
-void lbs_remove_mesh(struct lbs_private *priv)
+static void lbs_remove_mesh(struct lbs_private *priv)
{
struct net_device *mesh_dev;
@@ -1252,6 +1306,8 @@ void lbs_remove_mesh(struct lbs_private *priv)
goto out;
mesh_dev = priv->mesh_dev;
+ if (!mesh_dev)
+ goto out;
netif_stop_queue(mesh_dev);
netif_carrier_off(priv->mesh_dev);
@@ -1259,7 +1315,7 @@ void lbs_remove_mesh(struct lbs_private *priv)
sysfs_remove_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group);
unregister_netdev(mesh_dev);
- priv->mesh_dev = NULL ;
+ priv->mesh_dev = NULL;
free_netdev(mesh_dev);
out:
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 76/48] libertas: kill references to mesh autostart
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (74 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 75/48] libertas: add lbs_mesh sysfs attribute for enabling mesh David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 77/48] libertas: kill rx_urb_recall and eth_dev members of struct usb_card_rec David Woodhouse
` (57 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 18:57:49 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 21 ------------
drivers/net/wireless/libertas/main.c | 54 --------------------------------
2 files changed, 0 insertions(+), 75 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 351c7ea..b19a6c9 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -978,17 +978,6 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
if (priv->psstate != PS_STATE_FULL_POWER)
return -1;
- if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
- /* Mesh autostart must be activated while sleeping
- * On resume it will go back to the current state
- */
- struct cmd_ds_mesh_access mesh_access;
- memset(&mesh_access, 0, sizeof(mesh_access));
-
- mesh_access.data[0] = cpu_to_le32(1);
- lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED, &mesh_access);
- }
-
netif_device_detach(cardp->eth_dev);
netif_device_detach(priv->mesh_dev);
@@ -1016,16 +1005,6 @@ static int if_usb_resume(struct usb_interface *intf)
netif_device_attach(cardp->eth_dev);
netif_device_attach(priv->mesh_dev);
- if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
- /* Mesh autostart was activated while sleeping
- * Disable it if appropriate
- */
- struct cmd_ds_mesh_access mesh_access;
- memset(&mesh_access, 0, sizeof(mesh_access));
- mesh_access.data[0] = cpu_to_le32(0);
- lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED, &mesh_access);
- }
-
lbs_deb_leave(LBS_DEB_USB);
return 0;
}
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index fd76c46..bb685ac 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -369,46 +369,8 @@ static DEVICE_ATTR(lbs_mesh, 0644, lbs_mesh_get, lbs_mesh_set);
*/
static DEVICE_ATTR(anycast_mask, 0644, lbs_anycast_get, lbs_anycast_set);
-static ssize_t lbs_autostart_enabled_get(struct device *dev,
- struct device_attribute *attr, char * buf)
-{
- struct lbs_private *priv = to_net_dev(dev)->priv;
- struct cmd_ds_mesh_access mesh_access;
- int ret;
-
- memset(&mesh_access, 0, sizeof(mesh_access));
-
- ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_AUTOSTART_ENABLED, &mesh_access);
- if (ret)
- return ret;
- return sprintf(buf, "%d\n", le32_to_cpu(mesh_access.data[0]));
-}
-
-static ssize_t lbs_autostart_enabled_set(struct device *dev,
- struct device_attribute *attr, const char * buf, size_t count)
-{
- struct cmd_ds_mesh_access mesh_access;
- uint32_t datum;
- struct lbs_private *priv = (to_net_dev(dev))->priv;
- int ret;
-
- memset(&mesh_access, 0, sizeof(mesh_access));
- sscanf(buf, "%d", &datum);
- mesh_access.data[0] = cpu_to_le32(datum);
-
- ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED, &mesh_access);
- if (ret == 0)
- priv->mesh_autostart_enabled = datum ? 1 : 0;
-
- return strlen(buf);
-}
-
-static DEVICE_ATTR(autostart_enabled, 0644,
- lbs_autostart_enabled_get, lbs_autostart_enabled_set);
-
static struct attribute *lbs_mesh_sysfs_entries[] = {
&dev_attr_anycast_mask.attr,
- &dev_attr_autostart_enabled.attr,
NULL,
};
@@ -883,7 +845,6 @@ static int lbs_thread(void *data)
static int lbs_setup_firmware(struct lbs_private *priv)
{
int ret = -1;
- struct cmd_ds_mesh_access mesh_access;
lbs_deb_enter(LBS_DEB_FW);
@@ -905,21 +866,6 @@ static int lbs_setup_firmware(struct lbs_private *priv)
goto done;
}
- /* Disable mesh autostart */
- if (priv->mesh_dev) {
- memset(&mesh_access, 0, sizeof(mesh_access));
- mesh_access.data[0] = cpu_to_le32(0);
- ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
- &mesh_access);
- if (ret) {
- printk("Mesh autostart set failed\n");
- ret = 0;
- //ret = -1;
- goto done;
- }
- priv->mesh_autostart_enabled = 0;
- }
-
ret = 0;
done:
lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 77/48] libertas: kill rx_urb_recall and eth_dev members of struct usb_card_rec
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (75 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 76/48] libertas: kill references to mesh autostart David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 78/48] libertas: whitespace cleanup in host.h David Woodhouse
` (56 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 18:36:35 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 12 ++----------
drivers/net/wireless/libertas/if_usb.h | 3 ---
2 files changed, 2 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index b19a6c9..02192e8 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -175,8 +175,6 @@ static int if_usb_probe(struct usb_interface *intf,
"Rx URB allocation failed\n");
goto dealloc;
}
- cardp->rx_urb_recall = 0;
-
cardp->bulk_in_size =
le16_to_cpu(endpoint->wMaxPacketSize);
cardp->bulk_in_endpointAddr =
@@ -232,8 +230,6 @@ static int if_usb_probe(struct usb_interface *intf,
cardp->priv = priv;
cardp->priv->fw_ready = 1;
- cardp->eth_dev = priv->dev;
-
priv->hw_host_to_card = if_usb_host_to_card;
priv->hw_get_int_status = if_usb_get_int_status;
priv->hw_read_event_cause = if_usb_read_event_cause;
@@ -978,15 +974,13 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
if (priv->psstate != PS_STATE_FULL_POWER)
return -1;
- netif_device_detach(cardp->eth_dev);
+ netif_device_detach(priv->dev);
netif_device_detach(priv->mesh_dev);
/* Unlink tx & rx urb */
usb_kill_urb(cardp->tx_urb);
usb_kill_urb(cardp->rx_urb);
- cardp->rx_urb_recall = 1;
-
lbs_deb_leave(LBS_DEB_USB);
return 0;
}
@@ -998,11 +992,9 @@ static int if_usb_resume(struct usb_interface *intf)
lbs_deb_enter(LBS_DEB_USB);
- cardp->rx_urb_recall = 0;
-
if_usb_submit_rx_urb(cardp);
- netif_device_attach(cardp->eth_dev);
+ netif_device_attach(priv->dev);
netif_device_attach(priv->mesh_dev);
lbs_deb_leave(LBS_DEB_USB);
diff --git a/drivers/net/wireless/libertas/if_usb.h b/drivers/net/wireless/libertas/if_usb.h
index f028df1..668410f 100644
--- a/drivers/net/wireless/libertas/if_usb.h
+++ b/drivers/net/wireless/libertas/if_usb.h
@@ -47,7 +47,6 @@ struct read_cb_info {
/** USB card description structure*/
struct usb_card_rec {
- struct net_device *eth_dev;
struct usb_device *udev;
struct urb *rx_urb, *tx_urb;
struct lbs_private *priv;
@@ -75,8 +74,6 @@ struct usb_card_rec {
u32 usb_event_cause;
u8 usb_int_cause;
- u8 rx_urb_recall;
-
s8 bootcmdresp;
};
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 78/48] libertas: whitespace cleanup in host.h
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (76 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 77/48] libertas: kill rx_urb_recall and eth_dev members of struct usb_card_rec David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 79/48] libertas: allow get/set SSID on mshX device David Woodhouse
` (55 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 18:53:20 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/host.h | 380 ++++++++++++++++------------------
1 files changed, 178 insertions(+), 202 deletions(-)
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index fcd2238..64178cf 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -6,21 +6,21 @@
#define _LBS_HOST_H_
/** PUBLIC DEFINITIONS */
-#define DEFAULT_AD_HOC_CHANNEL 6
-#define DEFAULT_AD_HOC_CHANNEL_A 36
+#define DEFAULT_AD_HOC_CHANNEL 6
+#define DEFAULT_AD_HOC_CHANNEL_A 36
/** IEEE 802.11 oids */
-#define OID_802_11_SSID 0x00008002
-#define OID_802_11_INFRASTRUCTURE_MODE 0x00008008
-#define OID_802_11_FRAGMENTATION_THRESHOLD 0x00008009
-#define OID_802_11_RTS_THRESHOLD 0x0000800A
-#define OID_802_11_TX_ANTENNA_SELECTED 0x0000800D
-#define OID_802_11_SUPPORTED_RATES 0x0000800E
-#define OID_802_11_STATISTICS 0x00008012
-#define OID_802_11_TX_RETRYCOUNT 0x0000801D
-#define OID_802_11D_ENABLE 0x00008020
-
-#define CMD_OPTION_WAITFORRSP 0x0002
+#define OID_802_11_SSID 0x00008002
+#define OID_802_11_INFRASTRUCTURE_MODE 0x00008008
+#define OID_802_11_FRAGMENTATION_THRESHOLD 0x00008009
+#define OID_802_11_RTS_THRESHOLD 0x0000800A
+#define OID_802_11_TX_ANTENNA_SELECTED 0x0000800D
+#define OID_802_11_SUPPORTED_RATES 0x0000800E
+#define OID_802_11_STATISTICS 0x00008012
+#define OID_802_11_TX_RETRYCOUNT 0x0000801D
+#define OID_802_11D_ENABLE 0x00008020
+
+#define CMD_OPTION_WAITFORRSP 0x0002
/** Host command IDs */
@@ -30,203 +30,179 @@
#define CMD_RET(cmd) (0x8000 | cmd)
/* Return command convention exceptions: */
-#define CMD_RET_802_11_ASSOCIATE 0x8012
+#define CMD_RET_802_11_ASSOCIATE 0x8012
/* Command codes */
-#define CMD_CODE_DNLD 0x0002
-#define CMD_GET_HW_SPEC 0x0003
-#define CMD_EEPROM_UPDATE 0x0004
-#define CMD_802_11_RESET 0x0005
-#define CMD_802_11_SCAN 0x0006
-#define CMD_802_11_GET_LOG 0x000b
-#define CMD_MAC_MULTICAST_ADR 0x0010
-#define CMD_802_11_AUTHENTICATE 0x0011
-#define CMD_802_11_EEPROM_ACCESS 0x0059
-#define CMD_802_11_ASSOCIATE 0x0050
-#define CMD_802_11_SET_WEP 0x0013
-#define CMD_802_11_GET_STAT 0x0014
-#define CMD_802_3_GET_STAT 0x0015
-#define CMD_802_11_SNMP_MIB 0x0016
-#define CMD_MAC_REG_MAP 0x0017
-#define CMD_BBP_REG_MAP 0x0018
-#define CMD_MAC_REG_ACCESS 0x0019
-#define CMD_BBP_REG_ACCESS 0x001a
-#define CMD_RF_REG_ACCESS 0x001b
-#define CMD_802_11_RADIO_CONTROL 0x001c
-#define CMD_802_11_RF_CHANNEL 0x001d
-#define CMD_802_11_RF_TX_POWER 0x001e
-#define CMD_802_11_RSSI 0x001f
-#define CMD_802_11_RF_ANTENNA 0x0020
-
-#define CMD_802_11_PS_MODE 0x0021
-
-#define CMD_802_11_DATA_RATE 0x0022
-#define CMD_RF_REG_MAP 0x0023
-#define CMD_802_11_DEAUTHENTICATE 0x0024
-#define CMD_802_11_REASSOCIATE 0x0025
-#define CMD_802_11_DISASSOCIATE 0x0026
-#define CMD_MAC_CONTROL 0x0028
-#define CMD_802_11_AD_HOC_START 0x002b
-#define CMD_802_11_AD_HOC_JOIN 0x002c
-
-#define CMD_802_11_QUERY_TKIP_REPLY_CNTRS 0x002e
-#define CMD_802_11_ENABLE_RSN 0x002f
-#define CMD_802_11_PAIRWISE_TSC 0x0036
-#define CMD_802_11_GROUP_TSC 0x0037
-#define CMD_802_11_KEY_MATERIAL 0x005e
-
-#define CMD_802_11_SET_AFC 0x003c
-#define CMD_802_11_GET_AFC 0x003d
-
-#define CMD_802_11_AD_HOC_STOP 0x0040
-
-#define CMD_802_11_BEACON_STOP 0x0049
-
-#define CMD_802_11_MAC_ADDRESS 0x004D
-#define CMD_802_11_EEPROM_ACCESS 0x0059
-
-#define CMD_802_11_BAND_CONFIG 0x0058
-
-#define CMD_802_11D_DOMAIN_INFO 0x005b
-
-#define CMD_802_11_SLEEP_PARAMS 0x0066
-
-#define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
-
-#define CMD_802_11_TPC_CFG 0x0072
-#define CMD_802_11_PWR_CFG 0x0073
-
-#define CMD_802_11_LED_GPIO_CTRL 0x004e
-
-#define CMD_802_11_SUBSCRIBE_EVENT 0x0075
-
-#define CMD_802_11_RATE_ADAPT_RATESET 0x0076
-
-#define CMD_802_11_TX_RATE_QUERY 0x007f
-
-#define CMD_GET_TSF 0x0080
-
-#define CMD_BT_ACCESS 0x0087
-
-#define CMD_FWT_ACCESS 0x0095
-
-#define CMD_802_11_MONITOR_MODE 0x0098
-
-#define CMD_MESH_ACCESS 0x009b
+#define CMD_CODE_DNLD 0x0002
+#define CMD_GET_HW_SPEC 0x0003
+#define CMD_EEPROM_UPDATE 0x0004
+#define CMD_802_11_RESET 0x0005
+#define CMD_802_11_SCAN 0x0006
+#define CMD_802_11_GET_LOG 0x000b
+#define CMD_MAC_MULTICAST_ADR 0x0010
+#define CMD_802_11_AUTHENTICATE 0x0011
+#define CMD_802_11_EEPROM_ACCESS 0x0059
+#define CMD_802_11_ASSOCIATE 0x0050
+#define CMD_802_11_SET_WEP 0x0013
+#define CMD_802_11_GET_STAT 0x0014
+#define CMD_802_3_GET_STAT 0x0015
+#define CMD_802_11_SNMP_MIB 0x0016
+#define CMD_MAC_REG_MAP 0x0017
+#define CMD_BBP_REG_MAP 0x0018
+#define CMD_MAC_REG_ACCESS 0x0019
+#define CMD_BBP_REG_ACCESS 0x001a
+#define CMD_RF_REG_ACCESS 0x001b
+#define CMD_802_11_RADIO_CONTROL 0x001c
+#define CMD_802_11_RF_CHANNEL 0x001d
+#define CMD_802_11_RF_TX_POWER 0x001e
+#define CMD_802_11_RSSI 0x001f
+#define CMD_802_11_RF_ANTENNA 0x0020
+#define CMD_802_11_PS_MODE 0x0021
+#define CMD_802_11_DATA_RATE 0x0022
+#define CMD_RF_REG_MAP 0x0023
+#define CMD_802_11_DEAUTHENTICATE 0x0024
+#define CMD_802_11_REASSOCIATE 0x0025
+#define CMD_802_11_DISASSOCIATE 0x0026
+#define CMD_MAC_CONTROL 0x0028
+#define CMD_802_11_AD_HOC_START 0x002b
+#define CMD_802_11_AD_HOC_JOIN 0x002c
+#define CMD_802_11_QUERY_TKIP_REPLY_CNTRS 0x002e
+#define CMD_802_11_ENABLE_RSN 0x002f
+#define CMD_802_11_PAIRWISE_TSC 0x0036
+#define CMD_802_11_GROUP_TSC 0x0037
+#define CMD_802_11_SET_AFC 0x003c
+#define CMD_802_11_GET_AFC 0x003d
+#define CMD_802_11_AD_HOC_STOP 0x0040
+#define CMD_802_11_BEACON_STOP 0x0049
+#define CMD_802_11_MAC_ADDRESS 0x004d
+#define CMD_802_11_LED_GPIO_CTRL 0x004e
+#define CMD_802_11_EEPROM_ACCESS 0x0059
+#define CMD_802_11_BAND_CONFIG 0x0058
+#define CMD_802_11D_DOMAIN_INFO 0x005b
+#define CMD_802_11_KEY_MATERIAL 0x005e
+#define CMD_802_11_SLEEP_PARAMS 0x0066
+#define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
+#define CMD_802_11_TPC_CFG 0x0072
+#define CMD_802_11_PWR_CFG 0x0073
+#define CMD_802_11_SUBSCRIBE_EVENT 0x0075
+#define CMD_802_11_RATE_ADAPT_RATESET 0x0076
+#define CMD_802_11_TX_RATE_QUERY 0x007f
+#define CMD_GET_TSF 0x0080
+#define CMD_BT_ACCESS 0x0087
+#define CMD_FWT_ACCESS 0x0095
+#define CMD_802_11_MONITOR_MODE 0x0098
+#define CMD_MESH_ACCESS 0x009b
#define CMD_MESH_CONFIG 0x00a3
-
-#define CMD_SET_BOOT2_VER 0x00a5
-
-#define CMD_802_11_BEACON_CTRL 0x00b0
+#define CMD_SET_BOOT2_VER 0x00a5
+#define CMD_802_11_BEACON_CTRL 0x00b0
/* For the IEEE Power Save */
-#define CMD_SUBCMD_ENTER_PS 0x0030
-#define CMD_SUBCMD_EXIT_PS 0x0031
-#define CMD_SUBCMD_SLEEP_CONFIRMED 0x0034
-#define CMD_SUBCMD_FULL_POWERDOWN 0x0035
-#define CMD_SUBCMD_FULL_POWERUP 0x0036
-
-#define CMD_ENABLE_RSN 0x0001
-#define CMD_DISABLE_RSN 0x0000
+#define CMD_SUBCMD_ENTER_PS 0x0030
+#define CMD_SUBCMD_EXIT_PS 0x0031
+#define CMD_SUBCMD_SLEEP_CONFIRMED 0x0034
+#define CMD_SUBCMD_FULL_POWERDOWN 0x0035
+#define CMD_SUBCMD_FULL_POWERUP 0x0036
-#define CMD_ACT_SET 0x0001
-#define CMD_ACT_GET 0x0000
+#define CMD_ENABLE_RSN 0x0001
+#define CMD_DISABLE_RSN 0x0000
-#define CMD_ACT_GET_AES (CMD_ACT_GET + 2)
-#define CMD_ACT_SET_AES (CMD_ACT_SET + 2)
-#define CMD_ACT_REMOVE_AES (CMD_ACT_SET + 3)
+#define CMD_ACT_GET 0x0000
+#define CMD_ACT_SET 0x0001
+#define CMD_ACT_GET_AES 0x0002
+#define CMD_ACT_SET_AES 0x0003
+#define CMD_ACT_REMOVE_AES 0x0004
/* Define action or option for CMD_802_11_SET_WEP */
-#define CMD_ACT_ADD 0x0002
-#define CMD_ACT_REMOVE 0x0004
-#define CMD_ACT_USE_DEFAULT 0x0008
+#define CMD_ACT_ADD 0x0002
+#define CMD_ACT_REMOVE 0x0004
+#define CMD_ACT_USE_DEFAULT 0x0008
-#define CMD_TYPE_WEP_40_BIT 0x01
-#define CMD_TYPE_WEP_104_BIT 0x02
+#define CMD_TYPE_WEP_40_BIT 0x01
+#define CMD_TYPE_WEP_104_BIT 0x02
-#define CMD_NUM_OF_WEP_KEYS 4
+#define CMD_NUM_OF_WEP_KEYS 4
-#define CMD_WEP_KEY_INDEX_MASK 0x3fff
+#define CMD_WEP_KEY_INDEX_MASK 0x3fff
/* Define action or option for CMD_802_11_RESET */
-#define CMD_ACT_HALT 0x0003
+#define CMD_ACT_HALT 0x0003
/* Define action or option for CMD_802_11_SCAN */
-#define CMD_BSS_TYPE_BSS 0x0001
-#define CMD_BSS_TYPE_IBSS 0x0002
-#define CMD_BSS_TYPE_ANY 0x0003
+#define CMD_BSS_TYPE_BSS 0x0001
+#define CMD_BSS_TYPE_IBSS 0x0002
+#define CMD_BSS_TYPE_ANY 0x0003
/* Define action or option for CMD_802_11_SCAN */
-#define CMD_SCAN_TYPE_ACTIVE 0x0000
-#define CMD_SCAN_TYPE_PASSIVE 0x0001
+#define CMD_SCAN_TYPE_ACTIVE 0x0000
+#define CMD_SCAN_TYPE_PASSIVE 0x0001
#define CMD_SCAN_RADIO_TYPE_BG 0
-#define CMD_SCAN_PROBE_DELAY_TIME 0
+#define CMD_SCAN_PROBE_DELAY_TIME 0
/* Define action or option for CMD_MAC_CONTROL */
-#define CMD_ACT_MAC_RX_ON 0x0001
-#define CMD_ACT_MAC_TX_ON 0x0002
-#define CMD_ACT_MAC_LOOPBACK_ON 0x0004
-#define CMD_ACT_MAC_WEP_ENABLE 0x0008
-#define CMD_ACT_MAC_INT_ENABLE 0x0010
-#define CMD_ACT_MAC_MULTICAST_ENABLE 0x0020
-#define CMD_ACT_MAC_BROADCAST_ENABLE 0x0040
-#define CMD_ACT_MAC_PROMISCUOUS_ENABLE 0x0080
-#define CMD_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100
-#define CMD_ACT_MAC_STRICT_PROTECTION_ENABLE 0x0400
+#define CMD_ACT_MAC_RX_ON 0x0001
+#define CMD_ACT_MAC_TX_ON 0x0002
+#define CMD_ACT_MAC_LOOPBACK_ON 0x0004
+#define CMD_ACT_MAC_WEP_ENABLE 0x0008
+#define CMD_ACT_MAC_INT_ENABLE 0x0010
+#define CMD_ACT_MAC_MULTICAST_ENABLE 0x0020
+#define CMD_ACT_MAC_BROADCAST_ENABLE 0x0040
+#define CMD_ACT_MAC_PROMISCUOUS_ENABLE 0x0080
+#define CMD_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100
+#define CMD_ACT_MAC_STRICT_PROTECTION_ENABLE 0x0400
/* Define action or option for CMD_802_11_RADIO_CONTROL */
-#define CMD_TYPE_AUTO_PREAMBLE 0x0001
-#define CMD_TYPE_SHORT_PREAMBLE 0x0002
-#define CMD_TYPE_LONG_PREAMBLE 0x0003
+#define CMD_TYPE_AUTO_PREAMBLE 0x0001
+#define CMD_TYPE_SHORT_PREAMBLE 0x0002
+#define CMD_TYPE_LONG_PREAMBLE 0x0003
/* Event flags for CMD_802_11_SUBSCRIBE_EVENT */
-#define CMD_SUBSCRIBE_RSSI_LOW 0x0001
-#define CMD_SUBSCRIBE_SNR_LOW 0x0002
-#define CMD_SUBSCRIBE_FAILCOUNT 0x0004
-#define CMD_SUBSCRIBE_BCNMISS 0x0008
-#define CMD_SUBSCRIBE_RSSI_HIGH 0x0010
-#define CMD_SUBSCRIBE_SNR_HIGH 0x0020
+#define CMD_SUBSCRIBE_RSSI_LOW 0x0001
+#define CMD_SUBSCRIBE_SNR_LOW 0x0002
+#define CMD_SUBSCRIBE_FAILCOUNT 0x0004
+#define CMD_SUBSCRIBE_BCNMISS 0x0008
+#define CMD_SUBSCRIBE_RSSI_HIGH 0x0010
+#define CMD_SUBSCRIBE_SNR_HIGH 0x0020
-#define TURN_ON_RF 0x01
-#define RADIO_ON 0x01
-#define RADIO_OFF 0x00
+#define TURN_ON_RF 0x01
+#define RADIO_ON 0x01
+#define RADIO_OFF 0x00
-#define SET_AUTO_PREAMBLE 0x05
-#define SET_SHORT_PREAMBLE 0x03
-#define SET_LONG_PREAMBLE 0x01
+#define SET_AUTO_PREAMBLE 0x05
+#define SET_SHORT_PREAMBLE 0x03
+#define SET_LONG_PREAMBLE 0x01
/* Define action or option for CMD_802_11_RF_CHANNEL */
-#define CMD_OPT_802_11_RF_CHANNEL_GET 0x00
-#define CMD_OPT_802_11_RF_CHANNEL_SET 0x01
+#define CMD_OPT_802_11_RF_CHANNEL_GET 0x00
+#define CMD_OPT_802_11_RF_CHANNEL_SET 0x01
/* Define action or option for CMD_802_11_RF_TX_POWER */
-#define CMD_ACT_TX_POWER_OPT_GET 0x0000
-#define CMD_ACT_TX_POWER_OPT_SET_HIGH 0x8007
-#define CMD_ACT_TX_POWER_OPT_SET_MID 0x8004
-#define CMD_ACT_TX_POWER_OPT_SET_LOW 0x8000
+#define CMD_ACT_TX_POWER_OPT_GET 0x0000
+#define CMD_ACT_TX_POWER_OPT_SET_HIGH 0x8007
+#define CMD_ACT_TX_POWER_OPT_SET_MID 0x8004
+#define CMD_ACT_TX_POWER_OPT_SET_LOW 0x8000
-#define CMD_ACT_TX_POWER_INDEX_HIGH 0x0007
-#define CMD_ACT_TX_POWER_INDEX_MID 0x0004
-#define CMD_ACT_TX_POWER_INDEX_LOW 0x0000
+#define CMD_ACT_TX_POWER_INDEX_HIGH 0x0007
+#define CMD_ACT_TX_POWER_INDEX_MID 0x0004
+#define CMD_ACT_TX_POWER_INDEX_LOW 0x0000
/* Define action or option for CMD_802_11_DATA_RATE */
-#define CMD_ACT_SET_TX_AUTO 0x0000
-#define CMD_ACT_SET_TX_FIX_RATE 0x0001
-#define CMD_ACT_GET_TX_RATE 0x0002
+#define CMD_ACT_SET_TX_AUTO 0x0000
+#define CMD_ACT_SET_TX_FIX_RATE 0x0001
+#define CMD_ACT_GET_TX_RATE 0x0002
-#define CMD_ACT_SET_RX 0x0001
-#define CMD_ACT_SET_TX 0x0002
-#define CMD_ACT_SET_BOTH 0x0003
-#define CMD_ACT_GET_RX 0x0004
-#define CMD_ACT_GET_TX 0x0008
-#define CMD_ACT_GET_BOTH 0x000c
+#define CMD_ACT_SET_RX 0x0001
+#define CMD_ACT_SET_TX 0x0002
+#define CMD_ACT_SET_BOTH 0x0003
+#define CMD_ACT_GET_RX 0x0004
+#define CMD_ACT_GET_TX 0x0008
+#define CMD_ACT_GET_BOTH 0x000c
/* Define action or option for CMD_802_11_PS_MODE */
-#define CMD_TYPE_CAM 0x0000
-#define CMD_TYPE_MAX_PSP 0x0001
-#define CMD_TYPE_FAST_PSP 0x0002
+#define CMD_TYPE_CAM 0x0000
+#define CMD_TYPE_MAX_PSP 0x0001
+#define CMD_TYPE_FAST_PSP 0x0002
/* Define action or option for CMD_BT_ACCESS */
enum cmd_bt_access_opts {
@@ -275,36 +251,36 @@ enum cmd_mesh_access_opts {
};
/** Card Event definition */
-#define MACREG_INT_CODE_TX_PPA_FREE 0
-#define MACREG_INT_CODE_TX_DMA_DONE 1
-#define MACREG_INT_CODE_LINK_LOST_W_SCAN 2
-#define MACREG_INT_CODE_LINK_LOST_NO_SCAN 3
-#define MACREG_INT_CODE_LINK_SENSED 4
-#define MACREG_INT_CODE_CMD_FINISHED 5
-#define MACREG_INT_CODE_MIB_CHANGED 6
-#define MACREG_INT_CODE_INIT_DONE 7
-#define MACREG_INT_CODE_DEAUTHENTICATED 8
-#define MACREG_INT_CODE_DISASSOCIATED 9
-#define MACREG_INT_CODE_PS_AWAKE 10
-#define MACREG_INT_CODE_PS_SLEEP 11
-#define MACREG_INT_CODE_MIC_ERR_MULTICAST 13
-#define MACREG_INT_CODE_MIC_ERR_UNICAST 14
-#define MACREG_INT_CODE_WM_AWAKE 15
-#define MACREG_INT_CODE_DEEP_SLEEP_AWAKE 16
-#define MACREG_INT_CODE_ADHOC_BCN_LOST 17
-#define MACREG_INT_CODE_HOST_AWAKE 18
-#define MACREG_INT_CODE_STOP_TX 19
-#define MACREG_INT_CODE_START_TX 20
-#define MACREG_INT_CODE_CHANNEL_SWITCH 21
-#define MACREG_INT_CODE_MEASUREMENT_RDY 22
-#define MACREG_INT_CODE_WMM_CHANGE 23
-#define MACREG_INT_CODE_BG_SCAN_REPORT 24
-#define MACREG_INT_CODE_RSSI_LOW 25
-#define MACREG_INT_CODE_SNR_LOW 26
-#define MACREG_INT_CODE_MAX_FAIL 27
-#define MACREG_INT_CODE_RSSI_HIGH 28
-#define MACREG_INT_CODE_SNR_HIGH 29
-#define MACREG_INT_CODE_MESH_AUTO_STARTED 35
-#define MACREG_INT_CODE_FIRMWARE_READY 48
+#define MACREG_INT_CODE_TX_PPA_FREE 0
+#define MACREG_INT_CODE_TX_DMA_DONE 1
+#define MACREG_INT_CODE_LINK_LOST_W_SCAN 2
+#define MACREG_INT_CODE_LINK_LOST_NO_SCAN 3
+#define MACREG_INT_CODE_LINK_SENSED 4
+#define MACREG_INT_CODE_CMD_FINISHED 5
+#define MACREG_INT_CODE_MIB_CHANGED 6
+#define MACREG_INT_CODE_INIT_DONE 7
+#define MACREG_INT_CODE_DEAUTHENTICATED 8
+#define MACREG_INT_CODE_DISASSOCIATED 9
+#define MACREG_INT_CODE_PS_AWAKE 10
+#define MACREG_INT_CODE_PS_SLEEP 11
+#define MACREG_INT_CODE_MIC_ERR_MULTICAST 13
+#define MACREG_INT_CODE_MIC_ERR_UNICAST 14
+#define MACREG_INT_CODE_WM_AWAKE 15
+#define MACREG_INT_CODE_DEEP_SLEEP_AWAKE 16
+#define MACREG_INT_CODE_ADHOC_BCN_LOST 17
+#define MACREG_INT_CODE_HOST_AWAKE 18
+#define MACREG_INT_CODE_STOP_TX 19
+#define MACREG_INT_CODE_START_TX 20
+#define MACREG_INT_CODE_CHANNEL_SWITCH 21
+#define MACREG_INT_CODE_MEASUREMENT_RDY 22
+#define MACREG_INT_CODE_WMM_CHANGE 23
+#define MACREG_INT_CODE_BG_SCAN_REPORT 24
+#define MACREG_INT_CODE_RSSI_LOW 25
+#define MACREG_INT_CODE_SNR_LOW 26
+#define MACREG_INT_CODE_MAX_FAIL 27
+#define MACREG_INT_CODE_RSSI_HIGH 28
+#define MACREG_INT_CODE_SNR_HIGH 29
+#define MACREG_INT_CODE_MESH_AUTO_STARTED 35
+#define MACREG_INT_CODE_FIRMWARE_READY 48
#endif
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 79/48] libertas: allow get/set SSID on mshX device
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (77 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 78/48] libertas: whitespace cleanup in host.h David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 80/48] libertas: allow setting channel " David Woodhouse
` (54 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 19:30:57 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/wext.c | 52 ++++++++++++++++++++++++++++++++-
1 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index e44c0ce..0a06072 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -1917,6 +1917,54 @@ out:
return ret;
}
+static int lbs_mesh_get_essid(struct net_device *dev,
+ struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+{
+ struct lbs_private *priv = dev->priv;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+ memcpy(extra, priv->mesh_ssid, priv->mesh_ssid_len);
+
+ dwrq->length = priv->mesh_ssid_len;
+
+ dwrq->flags = 1; /* active */
+
+ lbs_deb_leave(LBS_DEB_WEXT);
+ return 0;
+}
+
+static int lbs_mesh_set_essid(struct net_device *dev,
+ struct iw_request_info *info,
+ struct iw_point *dwrq, char *extra)
+{
+ struct lbs_private *priv = dev->priv;
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+ /* Check the size of the string */
+ if (dwrq->length > IW_ESSID_MAX_SIZE) {
+ ret = -E2BIG;
+ goto out;
+ }
+
+ if (!dwrq->flags || !dwrq->length) {
+ ret = -EINVAL;
+ goto out;
+ } else {
+ /* Specific SSID requested */
+ memcpy(priv->mesh_ssid, extra, dwrq->length);
+ priv->mesh_ssid_len = dwrq->length;
+ }
+
+ lbs_mesh_config(priv, 1);
+ out:
+ lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
+ return ret;
+}
+
/**
* @brief Connect to the AP or Ad-hoc Network with specific bssid
*
@@ -2071,8 +2119,8 @@ static const iw_handler mesh_wlan_handler[] = {
(iw_handler) NULL, /* SIOCGIWAPLIST - deprecated */
(iw_handler) lbs_set_scan, /* SIOCSIWSCAN */
(iw_handler) lbs_get_scan, /* SIOCGIWSCAN */
- (iw_handler) NULL, /* SIOCSIWESSID */
- (iw_handler) NULL, /* SIOCGIWESSID */
+ (iw_handler) lbs_mesh_set_essid,/* SIOCSIWESSID */
+ (iw_handler) lbs_mesh_get_essid,/* SIOCGIWESSID */
(iw_handler) NULL, /* SIOCSIWNICKN */
(iw_handler) mesh_get_nick, /* SIOCGIWNICKN */
(iw_handler) NULL, /* -- hole -- */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 80/48] libertas: allow setting channel on mshX device
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (78 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 79/48] libertas: allow get/set SSID on mshX device David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 81/48] libertas: add missing newline on debug message David Woodhouse
` (53 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 19:56:28 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/wext.c | 53 +++++++++++++++++++++++++++++++++-
1 files changed, 52 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 0a06072..262d4cc 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -959,6 +959,57 @@ out:
return ret;
}
+static int lbs_mesh_set_freq(struct net_device *dev,
+ struct iw_request_info *info,
+ struct iw_freq *fwrq, char *extra)
+{
+ struct lbs_private *priv = dev->priv;
+ struct chan_freq_power *cfp;
+ int ret = -EINVAL;
+
+ lbs_deb_enter(LBS_DEB_WEXT);
+
+ /* If setting by frequency, convert to a channel */
+ if (fwrq->e == 1) {
+ long f = fwrq->m / 100000;
+
+ cfp = find_cfp_by_band_and_freq(priv, 0, f);
+ if (!cfp) {
+ lbs_deb_wext("invalid freq %ld\n", f);
+ goto out;
+ }
+
+ fwrq->e = 0;
+ fwrq->m = (int) cfp->channel;
+ }
+
+ /* Setting by channel number */
+ if (fwrq->m > 1000 || fwrq->e > 0) {
+ goto out;
+ }
+
+ cfp = lbs_find_cfp_by_band_and_channel(priv, 0, fwrq->m);
+ if (!cfp) {
+ goto out;
+ }
+
+ if (fwrq->m != priv->curbssparams.channel) {
+ lbs_deb_wext("mesh channel change forces eth disconnect\n");
+ if (priv->mode == IW_MODE_INFRA)
+ lbs_send_deauthentication(priv);
+ else if (priv->mode == IW_MODE_ADHOC)
+ lbs_stop_adhoc_network(priv);
+ }
+ priv->curbssparams.channel = fwrq->m;
+ lbs_mesh_config(priv, 0);
+ lbs_mesh_config(priv, 1);
+ ret = 0;
+
+out:
+ lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
+ return ret;
+}
+
static int lbs_set_rate(struct net_device *dev, struct iw_request_info *info,
struct iw_param *vwrq, char *extra)
{
@@ -2097,7 +2148,7 @@ static const iw_handler mesh_wlan_handler[] = {
(iw_handler) lbs_get_name, /* SIOCGIWNAME */
(iw_handler) NULL, /* SIOCSIWNWID */
(iw_handler) NULL, /* SIOCGIWNWID */
- (iw_handler) lbs_set_freq, /* SIOCSIWFREQ */
+ (iw_handler) lbs_mesh_set_freq, /* SIOCSIWFREQ */
(iw_handler) lbs_get_freq, /* SIOCGIWFREQ */
(iw_handler) NULL, /* SIOCSIWMODE */
(iw_handler) mesh_wlan_get_mode, /* SIOCGIWMODE */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 81/48] libertas: add missing newline on debug message
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (79 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 80/48] libertas: allow setting channel " David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 6:59 ` [PATCH 82/48] libertas: disable mesh temporarily while setting eth channel/assoc David Woodhouse
` (52 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 19:57:05 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index bd9cfe1..a4b9756 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -219,7 +219,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
lbs_deb_assoc("ASSOC: channel: error getting channel.");
if (assoc_req->channel != priv->curbssparams.channel) {
- lbs_deb_assoc("ASSOC: channel: failed to update channel to %d",
+ lbs_deb_assoc("ASSOC: channel: failed to update channel to %d\n",
assoc_req->channel);
goto done;
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 82/48] libertas: disable mesh temporarily while setting eth channel/assoc
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (80 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 81/48] libertas: add missing newline on debug message David Woodhouse
@ 2007-12-13 6:59 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 83/48] libertas: add debugging output to lbs_mesh_config() David Woodhouse
` (51 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 6:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 20:03:01 -0500
Otherwise the device won't let us change channels.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 14 ++++++++++++--
1 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index a4b9756..7b672fe 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -204,6 +204,12 @@ static int assoc_helper_channel(struct lbs_private *priv,
if (assoc_req->channel == priv->curbssparams.channel)
goto done;
+ if (priv->mesh_dev) {
+ /* Disconnect mesh while associating -- otherwise it
+ won't let us change channels */
+ lbs_mesh_config(priv, 0);
+ }
+
lbs_deb_assoc("ASSOC: channel: %d -> %d\n",
priv->curbssparams.channel, assoc_req->channel);
@@ -221,7 +227,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
if (assoc_req->channel != priv->curbssparams.channel) {
lbs_deb_assoc("ASSOC: channel: failed to update channel to %d\n",
assoc_req->channel);
- goto done;
+ goto restore_mesh;
}
if ( assoc_req->secinfo.wep_enabled
@@ -236,7 +242,11 @@ static int assoc_helper_channel(struct lbs_private *priv,
/* Must restart/rejoin adhoc networks after channel change */
set_bit(ASSOC_FLAG_SSID, &assoc_req->flags);
-done:
+ restore_mesh:
+ if (priv->mesh_dev)
+ lbs_mesh_config(priv, 1);
+
+ done:
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
return ret;
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 83/48] libertas: add debugging output to lbs_mesh_config()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (81 preceding siblings ...)
2007-12-13 6:59 ` [PATCH 82/48] libertas: disable mesh temporarily while setting eth channel/assoc David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 84/48] libertas: be more careful about command responses matching cur_cmd David Woodhouse
` (50 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 22:52:03 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 01d2349..1cb42dc 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1106,7 +1106,9 @@ int lbs_mesh_config(struct lbs_private *priv, int enable)
cmd.length = cpu_to_le16(priv->mesh_ssid_len);
memcpy(cmd.data, priv->mesh_ssid, priv->mesh_ssid_len);
}
-
+ lbs_deb_cmd("mesh config channel %d SSID %s\n",
+ priv->curbssparams.channel,
+ escape_essid(priv->mesh_ssid, priv->mesh_ssid_len));
return lbs_cmd_with_response(priv, CMD_MESH_CONFIG, cmd);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 84/48] libertas: be more careful about command responses matching cur_cmd
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (82 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 83/48] libertas: add debugging output to lbs_mesh_config() David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 85/48] libertas: add missing newlines in debugging statements David Woodhouse
` (49 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 11 Dec 2007 23:42:49 -0500
Especially in the light of OLPC trac #5461, in which the firmware starts
sending us seemingly random command responses which bear little relation
to the command we sent it.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 4 +-
drivers/net/wireless/libertas/cmdresp.c | 36 +++++++++++++++++++------------
drivers/net/wireless/libertas/if_usb.c | 1 +
drivers/net/wireless/libertas/main.c | 2 +-
4 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 1cb42dc..5ddb46a 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1216,8 +1216,8 @@ static int DownloadcommandToStation(struct lbs_private *priv,
cmdsize = le16_to_cpu(cmd->size);
command = le16_to_cpu(cmd->command);
- lbs_deb_host("DNLD_CMD: command 0x%04x, size %d, jiffies %lu\n",
- command, cmdsize, jiffies);
+ lbs_deb_host("DNLD_CMD: command 0x%04x, seq %d, size %d, jiffies %lu\n",
+ command, le16_to_cpu(cmd->seqnum), cmdsize, jiffies);
lbs_deb_hex(LBS_DEB_HOST, "DNLD_CMD", (void *) cmdnode->cmdbuf, cmdsize);
cmdnode->cmdwaitqwoken = 0;
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index bf9941e..53f73c4 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -611,7 +611,7 @@ static inline int handle_cmd_response(struct lbs_private *priv,
default:
lbs_deb_host("CMD_RESP: unknown cmd response 0x%04x\n",
- resp->command);
+ le16_to_cpu(resp->command));
break;
}
lbs_deb_leave(LBS_DEB_HOST);
@@ -620,17 +620,14 @@ static inline int handle_cmd_response(struct lbs_private *priv,
int lbs_process_rx_command(struct lbs_private *priv)
{
- u16 respcmd;
+ uint16_t respcmd, curcmd;
struct cmd_header *resp;
int ret = 0;
- ulong flags;
- u16 result;
+ unsigned long flags;
+ uint16_t result;
lbs_deb_enter(LBS_DEB_HOST);
- /* Now we got response from FW, cancel the command timer */
- del_timer(&priv->command_timer);
-
mutex_lock(&priv->lock);
spin_lock_irqsave(&priv->driver_lock, flags);
@@ -640,24 +637,35 @@ int lbs_process_rx_command(struct lbs_private *priv)
spin_unlock_irqrestore(&priv->driver_lock, flags);
goto done;
}
+
+ curcmd = le16_to_cpu(priv->cur_cmd->cmdbuf->command);
+
resp = priv->cur_cmd->cmdbuf;
respcmd = le16_to_cpu(resp->command);
result = le16_to_cpu(resp->result);
- lbs_deb_host("CMD_RESP: response 0x%04x, size %d, jiffies %lu\n",
- respcmd, priv->upld_len, jiffies);
+ lbs_deb_host("CMD_RESP: response 0x%04x, seq %d, size %d, jiffies %lu\n",
+ respcmd, le16_to_cpu(resp->seqnum), priv->upld_len, jiffies);
lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", (void *) resp, priv->upld_len);
- if (!(respcmd & 0x8000)) {
- lbs_deb_host("invalid response!\n");
- priv->cur_cmd_retcode = -1;
- __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
- priv->cur_cmd = NULL;
+ if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) {
+ lbs_pr_info("Received CMD_RESP with invalid sequence %d (expected %d)\n",
+ le16_to_cpu(resp->seqnum), le16_to_cpu(priv->cur_cmd->cmdbuf->seqnum));
spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = -1;
goto done;
}
+ if (respcmd != CMD_RET(curcmd) &&
+ respcmd != CMD_802_11_ASSOCIATE && curcmd != CMD_RET_802_11_ASSOCIATE) {
+ lbs_pr_info("Invalid CMD_RESP %x to command %x!\n", respcmd, curcmd);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
+ ret = -1;
+ goto done;
+ }
+
+ /* Now we got response from FW, cancel the command timer */
+ del_timer(&priv->command_timer);
/* Store the response code to cur_cmd_retcode. */
priv->cur_cmd_retcode = result;
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 02192e8..6b8ac62 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -643,6 +643,7 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
/* take care of cur_cmd = NULL case by reading the
* data to clear the interrupt */
if (!priv->cur_cmd) {
+ lbs_deb_hex(LBS_DEB_HOST, "Unsolicited CMD_RESP", (void *) recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
cmdbuf = priv->upld_buf;
priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
} else
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index bb685ac..cdf5934 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -893,7 +893,7 @@ static void command_timer_fn(unsigned long data)
return;
}
- lbs_deb_fw("command_timer_fn fired, cmd %x\n", node->cmdbuf->command);
+ lbs_pr_info("command %x timed out\n", le16_to_cpu(node->cmdbuf->command));
if (!priv->fw_ready)
return;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 85/48] libertas: add missing newlines in debugging statements
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (83 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 84/48] libertas: be more careful about command responses matching cur_cmd David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 86/48] libertas: slight cleanup of netif queue stop/wake David Woodhouse
` (48 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 00:14:21 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 10 +++++-----
drivers/net/wireless/libertas/cmd.c | 8 ++++----
drivers/net/wireless/libertas/if_usb.c | 2 +-
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index 7b672fe..21a5696 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -198,7 +198,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
ret = update_channel(priv);
if (ret < 0) {
- lbs_deb_assoc("ASSOC: channel: error getting channel.");
+ lbs_deb_assoc("ASSOC: channel: error getting channel.\n");
}
if (assoc_req->channel == priv->curbssparams.channel)
@@ -215,14 +215,14 @@ static int assoc_helper_channel(struct lbs_private *priv,
ret = lbs_set_channel(priv, assoc_req->channel);
if (ret < 0)
- lbs_deb_assoc("ASSOC: channel: error setting channel.");
+ lbs_deb_assoc("ASSOC: channel: error setting channel.\n");
/* FIXME: shouldn't need to grab the channel _again_ after setting
* it since the firmware is supposed to return the new channel, but
* whatever... */
ret = update_channel(priv);
if (ret < 0)
- lbs_deb_assoc("ASSOC: channel: error getting channel.");
+ lbs_deb_assoc("ASSOC: channel: error getting channel.\n");
if (assoc_req->channel != priv->curbssparams.channel) {
lbs_deb_assoc("ASSOC: channel: failed to update channel to %d\n",
@@ -240,7 +240,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
}
/* Must restart/rejoin adhoc networks after channel change */
- set_bit(ASSOC_FLAG_SSID, &assoc_req->flags);
+ set_bit(ASSOC_FLAG_SSID, &assoc_req->flags);
restore_mesh:
if (priv->mesh_dev)
@@ -334,7 +334,7 @@ static int assoc_helper_secinfo(struct lbs_private *priv,
CMD_OPTION_WAITFORRSP,
0, &rsn);
if (ret) {
- lbs_deb_assoc("Failed to get RSN status: %d", ret);
+ lbs_deb_assoc("Failed to get RSN status: %d\n", ret);
goto out;
}
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 5ddb46a..8d8f9d9 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -222,7 +222,7 @@ static int lbs_cmd_802_11_set_wep(struct lbs_private *priv,
int i;
if (!assoc_req) {
- lbs_deb_cmd("Invalid association request!");
+ lbs_deb_cmd("Invalid association request!\n");
ret = -1;
goto done;
}
@@ -2088,17 +2088,17 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv, u16 psmode)
if (priv->dnld_sent) {
allowed = 0;
- lbs_deb_host("dnld_sent was set");
+ lbs_deb_host("dnld_sent was set\n");
}
spin_lock_irqsave(&priv->driver_lock, flags);
if (priv->cur_cmd) {
allowed = 0;
- lbs_deb_host("cur_cmd was set");
+ lbs_deb_host("cur_cmd was set\n");
}
if (priv->intcounter > 0) {
allowed = 0;
- lbs_deb_host("intcounter %d", priv->intcounter);
+ lbs_deb_host("intcounter %d\n", priv->intcounter);
}
spin_unlock_irqrestore(&priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 6b8ac62..3f8b83c 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -220,7 +220,7 @@ static int if_usb_probe(struct usb_interface *intf,
/* Upload firmware */
cardp->rinfo.cardp = cardp;
if (if_usb_prog_firmware(cardp)) {
- lbs_deb_usbd(&udev->dev, "FW upload failed");
+ lbs_deb_usbd(&udev->dev, "FW upload failed\n");
goto err_prog_firmware;
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 86/48] libertas: slight cleanup of netif queue stop/wake
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (84 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 85/48] libertas: add missing newlines in debugging statements David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 87/48] libertas: add lbs_host_sleep_cfg() command function David Woodhouse
` (47 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 00:41:51 -0500
In particular, we shouldn't be waking the queues in lbs_host_to_card_done()
any more.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 14 ++++++++------
drivers/net/wireless/libertas/join.c | 7 ++++---
drivers/net/wireless/libertas/main.c | 12 +-----------
drivers/net/wireless/libertas/scan.c | 12 +++++++-----
4 files changed, 20 insertions(+), 25 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 53f73c4..a809f8f 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -43,14 +43,15 @@ void lbs_mac_event_disconnected(struct lbs_private *priv)
msleep_interruptible(1000);
wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
- /* Free Tx and Rx packets */
- kfree_skb(priv->currenttxskb);
- priv->currenttxskb = NULL;
-
/* report disconnect to upper layer */
netif_stop_queue(priv->dev);
netif_carrier_off(priv->dev);
+ /* Free Tx and Rx packets */
+ kfree_skb(priv->currenttxskb);
+ priv->currenttxskb = NULL;
+ priv->tx_pending_len = 0;
+
/* reset SNR/NF/RSSI values */
memset(priv->SNR, 0x00, sizeof(priv->SNR));
memset(priv->NF, 0x00, sizeof(priv->NF));
@@ -883,9 +884,10 @@ int lbs_process_event(struct lbs_private *priv)
}
lbs_pr_info("EVENT: MESH_AUTO_STARTED\n");
priv->mesh_connect_status = LBS_CONNECTED;
- if (priv->mesh_open == 1) {
- netif_wake_queue(priv->mesh_dev);
+ if (priv->mesh_open) {
netif_carrier_on(priv->mesh_dev);
+ if (!priv->tx_pending_len)
+ netif_wake_queue(priv->mesh_dev);
}
priv->mode = IW_MODE_ADHOC;
schedule_work(&priv->sync_channel);
diff --git a/drivers/net/wireless/libertas/join.c b/drivers/net/wireless/libertas/join.c
index 14425d9..2d45080 100644
--- a/drivers/net/wireless/libertas/join.c
+++ b/drivers/net/wireless/libertas/join.c
@@ -781,8 +781,8 @@ int lbs_ret_80211_associate(struct lbs_private *priv,
priv->numSNRNF = 0;
netif_carrier_on(priv->dev);
- netif_wake_queue(priv->dev);
-
+ if (!priv->tx_pending_len)
+ netif_wake_queue(priv->dev);
memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid, ETH_ALEN);
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
@@ -865,7 +865,8 @@ int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv,
priv->curbssparams.ssid_len = bss->ssid_len;
netif_carrier_on(priv->dev);
- netif_wake_queue(priv->dev);
+ if (!priv->tx_pending_len)
+ netif_wake_queue(priv->dev);
memset(&wrqu, 0, sizeof(wrqu));
memcpy(wrqu.ap_addr.sa_data, priv->curbssparams.bssid, ETH_ALEN);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index cdf5934..f9bdd12 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -489,19 +489,9 @@ void lbs_host_to_card_done(struct lbs_private *priv)
priv->dnld_sent = DNLD_RES_RECEIVED;
/* Wake main thread if commands are pending */
- if (!priv->cur_cmd)
+ if (!priv->cur_cmd || priv->tx_pending_len > 0)
wake_up_interruptible(&priv->waitq);
- /* Don't wake netif queues if we're in monitor mode and
- a TX packet is already pending, or if there are commands
- queued to be sent. */
- if (!priv->currenttxskb && list_empty(&priv->cmdpendingq)) {
- if (priv->dev && priv->connect_status == LBS_CONNECTED)
- netif_wake_queue(priv->dev);
-
- if (priv->mesh_dev && priv->mesh_connect_status == LBS_CONNECTED)
- netif_wake_queue(priv->mesh_dev);
- }
spin_unlock_irqrestore(&priv->driver_lock, flags);
}
EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c
index 92d84c7..9a61188 100644
--- a/drivers/net/wireless/libertas/scan.c
+++ b/drivers/net/wireless/libertas/scan.c
@@ -590,13 +590,13 @@ int lbs_scan_networks(struct lbs_private *priv,
netif_stop_queue(priv->dev);
netif_carrier_off(priv->dev);
if (priv->mesh_dev) {
- netif_stop_queue(priv->mesh_dev);
- netif_carrier_off(priv->mesh_dev);
+ netif_stop_queue(priv->mesh_dev);
+ netif_carrier_off(priv->mesh_dev);
}
/* Prepare to continue an interrupted scan */
lbs_deb_scan("chan_count %d, last_scanned_channel %d\n",
- chan_count, priv->last_scanned_channel);
+ chan_count, priv->last_scanned_channel);
curr_chans = chan_list;
/* advance channel list by already-scanned-channels */
if (priv->last_scanned_channel > 0) {
@@ -659,11 +659,13 @@ out2:
out:
if (priv->connect_status == LBS_CONNECTED) {
netif_carrier_on(priv->dev);
- netif_wake_queue(priv->dev);
+ if (!priv->tx_pending_len)
+ netif_wake_queue(priv->dev);
}
if (priv->mesh_dev && (priv->mesh_connect_status == LBS_CONNECTED)) {
netif_carrier_on(priv->mesh_dev);
- netif_wake_queue(priv->mesh_dev);
+ if (!priv->tx_pending_len)
+ netif_wake_queue(priv->mesh_dev);
}
kfree(chan_list);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 87/48] libertas: add lbs_host_sleep_cfg() command function
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (85 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 86/48] libertas: slight cleanup of netif queue stop/wake David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 88/48] libertas: switch lbs_cmd() to take a _pointer_ to the command structure David Woodhouse
` (46 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 15:19:29 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 19 +++++++++++++++++++
drivers/net/wireless/libertas/cmd.h | 3 +++
drivers/net/wireless/libertas/defs.h | 7 +++++++
drivers/net/wireless/libertas/host.h | 2 ++
drivers/net/wireless/libertas/hostcmd.h | 7 +++++++
5 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 8d8f9d9..2d7b646 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -111,6 +111,25 @@ out:
return ret;
}
+int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
+ uint8_t gpio, uint8_t gap)
+{
+ struct cmd_ds_host_sleep cmd_config;
+ int ret;
+
+ cmd_config.criteria = cpu_to_le32(criteria);
+ cmd_config.gpio = gpio;
+ cmd_config.gap = gap;
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_HOST_SLEEP_CFG, cmd_config);
+ if (ret) {
+ lbs_pr_info("HOST_SLEEP_CFG failed %d\n", ret);
+ return ret;
+ }
+ return ret;
+}
+EXPORT_SYMBOL_GPL(lbs_host_sleep_cfg);
+
static int lbs_cmd_802_11_ps_mode(struct lbs_private *priv,
struct cmd_ds_command *cmd,
u16 cmd_action)
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 80714b5..8d72c7e 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -35,4 +35,7 @@ int lbs_set_channel(struct lbs_private *priv, u8 channel);
int lbs_mesh_config(struct lbs_private *priv, int enable);
+int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
+ uint8_t gpio, uint8_t gap);
+
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
index 9b98ae7..3053cc2 100644
--- a/drivers/net/wireless/libertas/defs.h
+++ b/drivers/net/wireless/libertas/defs.h
@@ -141,6 +141,13 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
#define LBS_UPLD_SIZE 2312
#define DEV_NAME_LEN 32
+/* Wake criteria for HOST_SLEEP_CFG command */
+#define EHS_WAKE_ON_BROADCAST_DATA 0x0001
+#define EHS_WAKE_ON_UNICAST_DATA 0x0002
+#define EHS_WAKE_ON_MAC_EVENT 0x0004
+#define EHS_WAKE_ON_MULTICAST_DATA 0x0008
+#define EHS_REMOVE_WAKEUP 0xFFFFFFFF
+
/** Misc constants */
/* This section defines 802.11 specific contants */
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index 64178cf..fe00081 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -73,6 +73,8 @@
#define CMD_802_11_SET_AFC 0x003c
#define CMD_802_11_GET_AFC 0x003d
#define CMD_802_11_AD_HOC_STOP 0x0040
+#define CMD_802_11_HOST_SLEEP_CFG 0x0043
+#define CMD_802_11_HOST_SLEEP_ACTIVATE 0x0045
#define CMD_802_11_BEACON_STOP 0x0049
#define CMD_802_11_MAC_ADDRESS 0x004d
#define CMD_802_11_LED_GPIO_CTRL 0x004e
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index aab5d64..aa4cea0 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -540,6 +540,13 @@ struct MrvlIEtype_keyParamSet {
u8 key[32];
};
+struct cmd_ds_host_sleep {
+ struct cmd_header hdr;
+ __le32 criteria;
+ uint8_t gpio;
+ uint8_t gap;
+} __attribute__ ((packed));
+
struct cmd_ds_802_11_key_material {
__le16 action;
struct MrvlIEtype_keyParamSet keyParamSet[2];
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 88/48] libertas: switch lbs_cmd() to take a _pointer_ to the command structure
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (86 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 87/48] libertas: add lbs_host_sleep_cfg() command function David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 89/48] libertas: make worker thread not freezable David Woodhouse
` (45 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 16:00:42 -0500
This way, it looks more like a normal function.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 17 +++++++++--------
drivers/net/wireless/libertas/cmd.h | 10 ++++------
drivers/net/wireless/libertas/if_usb.c | 2 +-
3 files changed, 14 insertions(+), 15 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 2d7b646..f87cecb 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -56,7 +56,7 @@ int lbs_update_hw_spec(struct lbs_private *priv)
memset(&cmd, 0, sizeof(cmd));
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
memcpy(cmd.permanentaddr, priv->current_addr, ETH_ALEN);
- ret = lbs_cmd_with_response(priv, CMD_GET_HW_SPEC, cmd);
+ ret = lbs_cmd_with_response(priv, CMD_GET_HW_SPEC, &cmd);
if (ret)
goto out;
@@ -121,7 +121,7 @@ int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
cmd_config.gpio = gpio;
cmd_config.gap = gap;
- ret = lbs_cmd_with_response(priv, CMD_802_11_HOST_SLEEP_CFG, cmd_config);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_HOST_SLEEP_CFG, &cmd_config);
if (ret) {
lbs_pr_info("HOST_SLEEP_CFG failed %d\n", ret);
return ret;
@@ -743,7 +743,7 @@ int lbs_get_data_rate(struct lbs_private *priv)
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.action = cpu_to_le16(CMD_ACT_GET_TX_RATE);
- ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, cmd);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, &cmd);
if (ret)
goto out;
@@ -790,7 +790,7 @@ int lbs_set_data_rate(struct lbs_private *priv, u8 rate)
lbs_deb_cmd("DATA_RATE: setting auto\n");
}
- ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, cmd);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_DATA_RATE, &cmd);
if (ret)
goto out;
@@ -846,7 +846,7 @@ int lbs_get_channel(struct lbs_private *priv)
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.action = cpu_to_le16(CMD_OPT_802_11_RF_CHANNEL_GET);
- ret = lbs_cmd_with_response(priv, CMD_802_11_RF_CHANNEL, cmd);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_RF_CHANNEL, &cmd);
if (ret)
goto out;
@@ -878,7 +878,7 @@ int lbs_set_channel(struct lbs_private *priv, u8 channel)
cmd.action = cpu_to_le16(CMD_OPT_802_11_RF_CHANNEL_SET);
cmd.channel = cpu_to_le16(channel);
- ret = lbs_cmd_with_response(priv, CMD_802_11_RF_CHANNEL, cmd);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_RF_CHANNEL, &cmd);
if (ret)
goto out;
@@ -1105,7 +1105,7 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
cmd->action = cpu_to_le16(cmd_action);
- ret = lbs_cmd_with_response(priv, CMD_MESH_ACCESS, (*cmd));
+ ret = lbs_cmd_with_response(priv, CMD_MESH_ACCESS, cmd);
lbs_deb_leave(LBS_DEB_CMD);
return ret;
@@ -1128,7 +1128,7 @@ int lbs_mesh_config(struct lbs_private *priv, int enable)
lbs_deb_cmd("mesh config channel %d SSID %s\n",
priv->curbssparams.channel,
escape_essid(priv->mesh_ssid, priv->mesh_ssid_len));
- return lbs_cmd_with_response(priv, CMD_MESH_CONFIG, cmd);
+ return lbs_cmd_with_response(priv, CMD_MESH_CONFIG, &cmd);
}
static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
@@ -2160,6 +2160,7 @@ int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
lbs_deb_leave(LBS_DEB_CMD);
return 0;
}
+EXPORT_SYMBOL_GPL(lbs_cmd_copyback);
/**
* @brief Simple way to call firmware functions
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 8d72c7e..e800295 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -6,13 +6,11 @@
#include "hostcmd.h"
#include "dev.h"
-#define lbs_cmd(priv, cmdnr, cmd, callback, callback_arg) \
- __lbs_cmd(priv, cmdnr, &(cmd).hdr, sizeof(cmd), \
- callback, callback_arg)
+#define lbs_cmd(priv, cmdnr, cmd, cb, cb_arg) \
+ __lbs_cmd(priv, cmdnr, &(cmd)->hdr, sizeof(*(cmd)), cb, cb_arg)
-#define lbs_cmd_with_response(priv, cmdnr, cmd) \
- __lbs_cmd(priv, cmdnr, &(cmd).hdr, sizeof(cmd), \
- lbs_cmd_copyback, (unsigned long) &cmd)
+#define lbs_cmd_with_response(priv, cmdnr, cmd) \
+ lbs_cmd(priv, cmdnr, cmd, lbs_cmd_copyback, (unsigned long) (cmd))
int __lbs_cmd(struct lbs_private *priv, uint16_t command,
struct cmd_header *in_cmd, int in_cmd_size,
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 3f8b83c..74fec9d 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -109,7 +109,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;
- if (lbs_cmd(priv, CMD_SET_BOOT2_VER, b2_cmd, NULL, 0))
+ if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, NULL, 0))
lbs_deb_usb("Setting boot2 version failed\n");
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 89/48] libertas: make worker thread not freezable
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (87 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 88/48] libertas: switch lbs_cmd() to take a _pointer_ to the command structure David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 90/48] libertas: implement suspend and resume core methods David Woodhouse
` (44 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 16:04:12 -0500
We want it to send the HOST_SLEEP_ACTIVATE command on the way down...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 4 ----
1 files changed, 0 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index f9bdd12..dd432ea 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -6,7 +6,6 @@
#include <linux/moduleparam.h>
#include <linux/delay.h>
-#include <linux/freezer.h>
#include <linux/etherdevice.h>
#include <linux/netdevice.h>
#include <linux/if_arp.h>
@@ -653,8 +652,6 @@ static int lbs_thread(void *data)
init_waitqueue_entry(&wait, current);
- set_freezable();
-
for (;;) {
int shouldsleep;
@@ -698,7 +695,6 @@ static int lbs_thread(void *data)
set_current_state(TASK_RUNNING);
remove_wait_queue(&priv->waitq, &wait);
- try_to_freeze();
lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
priv->intcounter, priv->currenttxskb, priv->dnld_sent);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 90/48] libertas: implement suspend and resume core methods
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (88 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 89/48] libertas: make worker thread not freezable David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 91/48] libertas: implement suspend/resume for USB devices David Woodhouse
` (43 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 17:38:56 -0500
We (ab)use priv->fw_ready to stop the worker thread from sending more
commands or data after the response to the HOST_SLEEP_ACTIVATE command
comes in. And we set it from the callback function _directly_ to ensure
that the worker thread sees it immediately; if we did it in
lbs_suspend() after waking up, that might be too late.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.h | 2 +
drivers/net/wireless/libertas/main.c | 47 ++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index e800295..e44a0db 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -35,5 +35,7 @@ int lbs_mesh_config(struct lbs_private *priv, int enable);
int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
uint8_t gpio, uint8_t gap);
+int lbs_suspend(struct lbs_private *priv);
+int lbs_resume(struct lbs_private *priv);
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index dd432ea..1ea119e 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -820,6 +820,53 @@ static int lbs_thread(void *data)
return 0;
}
+static int lbs_suspend_callback(struct lbs_private *priv, unsigned long dummy,
+ struct cmd_header *cmd)
+{
+ lbs_deb_fw("HOST_SLEEP_ACTIVATE succeeded\n");
+
+ netif_device_detach(priv->dev);
+ if (priv->mesh_dev)
+ netif_device_detach(priv->mesh_dev);
+
+ priv->fw_ready = 0;
+ return 0;
+}
+
+
+int lbs_suspend(struct lbs_private *priv)
+{
+ struct cmd_header cmd;
+ int ret;
+
+ memset(&cmd, 0, sizeof(cmd));
+
+ ret = __lbs_cmd(priv, CMD_802_11_HOST_SLEEP_ACTIVATE, &cmd,
+ sizeof(cmd), lbs_suspend_callback, 0);
+ if (ret)
+ lbs_pr_info("HOST_SLEEP_ACTIVATE failed: %d\n", ret);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(lbs_suspend);
+
+int lbs_resume(struct lbs_private *priv)
+{
+ priv->fw_ready = 1;
+
+ /* Firmware doesn't seem to give us RX packets any more
+ until we send it some command. Might as well update */
+ lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
+ 0, 0, NULL);
+
+ netif_device_attach(priv->dev);
+ if (priv->mesh_dev)
+ netif_device_attach(priv->mesh_dev);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(lbs_resume);
+
/**
* @brief This function downloads firmware image, gets
* HW spec from firmware and set basic parameters to
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 91/48] libertas: implement suspend/resume for USB devices
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (89 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 90/48] libertas: implement suspend and resume core methods David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 92/48] libertas: add ethtool support for wake-on-lan configuration David Woodhouse
` (42 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 17:40:56 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 74fec9d..15715a6 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -242,6 +242,10 @@ static int if_usb_probe(struct usb_interface *intf,
if_usb_set_boot2_ver(priv);
+ /* Set suspend/resume configuration:
+ wake via GPIO2 after a 20ms delay */
+ lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA, 2, 20);
+
usb_get_dev(udev);
usb_set_intfdata(intf, cardp);
@@ -969,21 +973,24 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
{
struct usb_card_rec *cardp = usb_get_intfdata(intf);
struct lbs_private *priv = cardp->priv;
+ int ret;
lbs_deb_enter(LBS_DEB_USB);
if (priv->psstate != PS_STATE_FULL_POWER)
return -1;
- netif_device_detach(priv->dev);
- netif_device_detach(priv->mesh_dev);
+ ret = lbs_suspend(priv);
+ if (ret)
+ goto out;
/* Unlink tx & rx urb */
usb_kill_urb(cardp->tx_urb);
usb_kill_urb(cardp->rx_urb);
+ out:
lbs_deb_leave(LBS_DEB_USB);
- return 0;
+ return ret;
}
static int if_usb_resume(struct usb_interface *intf)
@@ -995,8 +1002,7 @@ static int if_usb_resume(struct usb_interface *intf)
if_usb_submit_rx_urb(cardp);
- netif_device_attach(priv->dev);
- netif_device_attach(priv->mesh_dev);
+ lbs_resume(priv);
lbs_deb_leave(LBS_DEB_USB);
return 0;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 92/48] libertas: add ethtool support for wake-on-lan configuration
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (90 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 91/48] libertas: implement suspend/resume for USB devices David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 93/48] libertas: make lbs_update_channel() function non-static David Woodhouse
` (41 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 20:06:06 -0500
Also, check that suspend is refused if HOST_SLEEP_CFG hasn't been done.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 14 +++++----
drivers/net/wireless/libertas/cmd.h | 3 +-
drivers/net/wireless/libertas/dev.h | 5 +++
drivers/net/wireless/libertas/ethtool.c | 47 +++++++++++++++++++++++++++++++
drivers/net/wireless/libertas/if_usb.c | 6 ++--
drivers/net/wireless/libertas/main.c | 8 +++++
6 files changed, 72 insertions(+), 11 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index f87cecb..ddf1527 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -111,21 +111,23 @@ out:
return ret;
}
-int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
- uint8_t gpio, uint8_t gap)
+int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria)
{
struct cmd_ds_host_sleep cmd_config;
int ret;
cmd_config.criteria = cpu_to_le32(criteria);
- cmd_config.gpio = gpio;
- cmd_config.gap = gap;
+ cmd_config.gpio = priv->wol_gpio;
+ cmd_config.gap = priv->wol_gap;
ret = lbs_cmd_with_response(priv, CMD_802_11_HOST_SLEEP_CFG, &cmd_config);
- if (ret) {
+ if (!ret) {
+ lbs_deb_cmd("Set WOL criteria to %x\n", criteria);
+ priv->wol_criteria = criteria;
+ } else {
lbs_pr_info("HOST_SLEEP_CFG failed %d\n", ret);
- return ret;
}
+
return ret;
}
EXPORT_SYMBOL_GPL(lbs_host_sleep_cfg);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index e44a0db..55f2436 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -33,8 +33,7 @@ int lbs_set_channel(struct lbs_private *priv, u8 channel);
int lbs_mesh_config(struct lbs_private *priv, int enable);
-int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
- uint8_t gpio, uint8_t gap);
+int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria);
int lbs_suspend(struct lbs_private *priv);
int lbs_resume(struct lbs_private *priv);
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 86b45a4..60a6a51 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -153,6 +153,11 @@ struct lbs_private {
int (*hw_get_int_status) (struct lbs_private *priv, u8 *);
int (*hw_read_event_cause) (struct lbs_private *);
+ /* Wake On LAN */
+ uint32_t wol_criteria;
+ uint8_t wol_gpio;
+ uint8_t wol_gap;
+
/* was struct lbs_adapter from here... */
/** Wlan adapter data structure*/
diff --git a/drivers/net/wireless/libertas/ethtool.c b/drivers/net/wireless/libertas/ethtool.c
index a54b4f4..21e6f98 100644
--- a/drivers/net/wireless/libertas/ethtool.c
+++ b/drivers/net/wireless/libertas/ethtool.c
@@ -8,6 +8,8 @@
#include "dev.h"
#include "join.h"
#include "wext.h"
+#include "cmd.h"
+
static const char * mesh_stat_strings[]= {
"drop_duplicate_bcast",
"drop_ttl_zero",
@@ -172,6 +174,49 @@ static void lbs_ethtool_get_strings(struct net_device *dev,
lbs_deb_enter(LBS_DEB_ETHTOOL);
}
+static void lbs_ethtool_get_wol(struct net_device *dev,
+ struct ethtool_wolinfo *wol)
+{
+ struct lbs_private *priv = dev->priv;
+
+ if (priv->wol_criteria == 0xffffffff) {
+ /* Interface driver didn't configure wake */
+ wol->supported = wol->wolopts = 0;
+ return;
+ }
+
+ wol->supported = WAKE_UCAST|WAKE_MCAST|WAKE_BCAST|WAKE_PHY;
+
+ if (priv->wol_criteria & EHS_WAKE_ON_UNICAST_DATA)
+ wol->wolopts |= WAKE_UCAST;
+ if (priv->wol_criteria & EHS_WAKE_ON_MULTICAST_DATA)
+ wol->wolopts |= WAKE_MCAST;
+ if (priv->wol_criteria & EHS_WAKE_ON_BROADCAST_DATA)
+ wol->wolopts |= WAKE_BCAST;
+ if (priv->wol_criteria & EHS_WAKE_ON_MAC_EVENT)
+ wol->wolopts |= WAKE_PHY;
+}
+
+static int lbs_ethtool_set_wol(struct net_device *dev,
+ struct ethtool_wolinfo *wol)
+{
+ struct lbs_private *priv = dev->priv;
+ uint32_t criteria = 0;
+
+ if (priv->wol_criteria == 0xffffffff && wol->wolopts)
+ return -EOPNOTSUPP;
+
+ if (wol->wolopts & ~(WAKE_UCAST|WAKE_MCAST|WAKE_BCAST|WAKE_PHY))
+ return -EOPNOTSUPP;
+
+ if (wol->wolopts & WAKE_UCAST) criteria |= EHS_WAKE_ON_UNICAST_DATA;
+ if (wol->wolopts & WAKE_MCAST) criteria |= EHS_WAKE_ON_MULTICAST_DATA;
+ if (wol->wolopts & WAKE_BCAST) criteria |= EHS_WAKE_ON_BROADCAST_DATA;
+ if (wol->wolopts & WAKE_PHY) criteria |= EHS_WAKE_ON_MAC_EVENT;
+
+ return lbs_host_sleep_cfg(priv, criteria);
+}
+
struct ethtool_ops lbs_ethtool_ops = {
.get_drvinfo = lbs_ethtool_get_drvinfo,
.get_eeprom = lbs_ethtool_get_eeprom,
@@ -179,5 +224,7 @@ struct ethtool_ops lbs_ethtool_ops = {
.get_sset_count = lbs_ethtool_get_sset_count,
.get_ethtool_stats = lbs_ethtool_get_stats,
.get_strings = lbs_ethtool_get_strings,
+ .get_wol = lbs_ethtool_get_wol,
+ .set_wol = lbs_ethtool_set_wol,
};
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 15715a6..8191416 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -242,9 +242,9 @@ static int if_usb_probe(struct usb_interface *intf,
if_usb_set_boot2_ver(priv);
- /* Set suspend/resume configuration:
- wake via GPIO2 after a 20ms delay */
- lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA, 2, 20);
+ priv->wol_gpio = 2; /* Wake via GPIO2... */
+ priv->wol_gap = 20; /* ... after 20ms */
+ lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA);
usb_get_dev(udev);
usb_set_intfdata(intf, cardp);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 1ea119e..5e2f329 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -839,6 +839,11 @@ int lbs_suspend(struct lbs_private *priv)
struct cmd_header cmd;
int ret;
+ if (priv->wol_criteria == 0xffffffff) {
+ lbs_pr_info("Suspend attempt without configuring wake params!\n");
+ return -EINVAL;
+ }
+
memset(&cmd, 0, sizeof(cmd));
ret = __lbs_cmd(priv, CMD_802_11_HOST_SLEEP_ACTIVATE, &cmd,
@@ -1088,6 +1093,9 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
sprintf(priv->mesh_ssid, "mesh");
priv->mesh_ssid_len = 4;
+ priv->wol_criteria = 0xffffffff;
+ priv->wol_gpio = 0xff;
+
goto done;
err_init_adapter:
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 93/48] libertas: make lbs_update_channel() function non-static
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (91 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 92/48] libertas: add ethtool support for wake-on-lan configuration David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 94/48] libertas: cope with both old and new mesh TLV values David Woodhouse
` (40 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 22:50:21 -0500
We'll want to use this for meshfrobbing
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 8 ++++----
drivers/net/wireless/libertas/decl.h | 1 +
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index 21a5696..ff976eb 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -163,7 +163,7 @@ done:
}
-static int update_channel(struct lbs_private *priv)
+int lbs_update_channel(struct lbs_private *priv)
{
int ret;
@@ -184,7 +184,7 @@ void lbs_sync_channel(struct work_struct *work)
sync_channel);
lbs_deb_enter(LBS_DEB_ASSOC);
- if (update_channel(priv) != 0)
+ if (lbs_update_channel(priv))
lbs_pr_info("Channel synchronization failed.");
lbs_deb_leave(LBS_DEB_ASSOC);
}
@@ -196,7 +196,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_ASSOC);
- ret = update_channel(priv);
+ ret = lbs_update_channel(priv);
if (ret < 0) {
lbs_deb_assoc("ASSOC: channel: error getting channel.\n");
}
@@ -220,7 +220,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
/* FIXME: shouldn't need to grab the channel _again_ after setting
* it since the firmware is supposed to return the new channel, but
* whatever... */
- ret = update_channel(priv);
+ ret = lbs_update_channel(priv);
if (ret < 0)
lbs_deb_assoc("ASSOC: channel: error getting channel.\n");
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 9b0ef16..45f081b 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -77,4 +77,5 @@ int lbs_stop_card(struct lbs_private *priv);
int lbs_reset_device(struct lbs_private *priv);
void lbs_host_to_card_done(struct lbs_private *priv);
+int lbs_update_channel(struct lbs_private *priv);
#endif
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 94/48] libertas: cope with both old and new mesh TLV values
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (92 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 93/48] libertas: make lbs_update_channel() function non-static David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 95/48] libertas: pass channel argument directly to lbs_mesh_config() David Woodhouse
` (39 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 12 Dec 2007 23:29:13 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 6 +++---
drivers/net/wireless/libertas/dev.h | 2 ++
drivers/net/wireless/libertas/main.c | 32 +++++++++++++++++++++++++++++---
3 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index ddf1527..c4299ae 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1121,14 +1121,14 @@ int lbs_mesh_config(struct lbs_private *priv, int enable)
memset(&cmd, 0, sizeof(cmd));
cmd.action = cpu_to_le16(enable);
cmd.channel = cpu_to_le16(priv->curbssparams.channel);
- cmd.type = cpu_to_le16(0x100 + 37);
+ cmd.type = cpu_to_le16(priv->mesh_tlv);
if (enable) {
cmd.length = cpu_to_le16(priv->mesh_ssid_len);
memcpy(cmd.data, priv->mesh_ssid, priv->mesh_ssid_len);
}
- lbs_deb_cmd("mesh config channel %d SSID %s\n",
- priv->curbssparams.channel,
+ lbs_deb_cmd("mesh config enable %d TLV %x channel %d SSID %s\n",
+ enable, priv->mesh_tlv, priv->curbssparams.channel,
escape_essid(priv->mesh_ssid, priv->mesh_ssid_len));
return lbs_cmd_with_response(priv, CMD_MESH_CONFIG, &cmd);
}
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 60a6a51..e6f553d 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -206,6 +206,8 @@ struct lbs_private {
/** current ssid/bssid related parameters*/
struct current_bss_params curbssparams;
+
+ uint16_t mesh_tlv;
u8 mesh_ssid[IW_ESSID_MAX_SIZE + 1];
u8 mesh_ssid_len;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 5e2f329..2409df8 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1171,8 +1171,33 @@ int lbs_start_card(struct lbs_private *priv)
}
if (device_create_file(&dev->dev, &dev_attr_lbs_rtap))
lbs_pr_err("cannot register lbs_rtap attribute\n");
- if (device_create_file(&dev->dev, &dev_attr_lbs_mesh))
- lbs_pr_err("cannot register lbs_mesh attribute\n");
+
+ /* Enable mesh, if supported, and work out which TLV it uses.
+ 0x100 + 291 is an unofficial value used in 5.110.20.pXX
+ 0x100 + 37 is the official value used in 5.110.21.pXX
+ but we check them in that order because 20.pXX doesn't
+ give an error -- it just silently fails. */
+
+ /* 5.110.20.pXX firmware will fail the command if the channel
+ doesn't match the existing channel. But only if the TLV
+ is correct. If the channel is wrong, _BOTH_ versions will
+ give an error to 0x100+291, and allow 0x100+37 to succeed.
+ It's just that 5.110.20.pXX will not have done anything
+ useful */
+
+ lbs_update_channel(priv);
+ priv->mesh_tlv = 0x100 + 291;
+ if (lbs_mesh_config(priv, 1)) {
+ priv->mesh_tlv = 0x100 + 37;
+ if (lbs_mesh_config(priv, 1))
+ priv->mesh_tlv = 0;
+ }
+ if (priv->mesh_tlv) {
+ lbs_add_mesh(priv);
+
+ if (device_create_file(&dev->dev, &dev_attr_lbs_mesh))
+ lbs_pr_err("cannot register lbs_mesh attribute\n");
+ }
lbs_debugfs_init_one(priv, dev);
@@ -1201,7 +1226,8 @@ int lbs_stop_card(struct lbs_private *priv)
lbs_debugfs_remove_one(priv);
device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
- device_remove_file(&dev->dev, &dev_attr_lbs_mesh);
+ if (priv->mesh_tlv)
+ device_remove_file(&dev->dev, &dev_attr_lbs_mesh);
/* Flush pending command nodes */
spin_lock_irqsave(&priv->driver_lock, flags);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 95/48] libertas: pass channel argument directly to lbs_mesh_config()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (93 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 94/48] libertas: cope with both old and new mesh TLV values David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-13 7:00 ` [PATCH 96/48] libertas: use spin_is_locked() instead of spin_trylock() in lbs_interrupt() David Woodhouse
` (38 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 13 Dec 2007 00:32:36 -0500
There is weirdness here; the firmware seems to refuse to change channels
at will.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 11 ++++++-----
drivers/net/wireless/libertas/cmd.c | 6 +++---
drivers/net/wireless/libertas/cmd.h | 2 +-
drivers/net/wireless/libertas/main.c | 6 +++---
drivers/net/wireless/libertas/wext.c | 7 +++----
5 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index ff976eb..cd8e043 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -205,13 +205,14 @@ static int assoc_helper_channel(struct lbs_private *priv,
goto done;
if (priv->mesh_dev) {
- /* Disconnect mesh while associating -- otherwise it
- won't let us change channels */
- lbs_mesh_config(priv, 0);
+ /* Change mesh channel first; 21.p21 firmware won't let
+ you change channel otherwise (even though it'll return
+ an error to this */
+ lbs_mesh_config(priv, 0, assoc_req->channel);
}
lbs_deb_assoc("ASSOC: channel: %d -> %d\n",
- priv->curbssparams.channel, assoc_req->channel);
+ priv->curbssparams.channel, assoc_req->channel);
ret = lbs_set_channel(priv, assoc_req->channel);
if (ret < 0)
@@ -244,7 +245,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
restore_mesh:
if (priv->mesh_dev)
- lbs_mesh_config(priv, 1);
+ lbs_mesh_config(priv, 1, priv->curbssparams.channel);
done:
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index c4299ae..171acc2 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1114,13 +1114,13 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
}
EXPORT_SYMBOL_GPL(lbs_mesh_access);
-int lbs_mesh_config(struct lbs_private *priv, int enable)
+int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan)
{
struct cmd_ds_mesh_config cmd;
memset(&cmd, 0, sizeof(cmd));
cmd.action = cpu_to_le16(enable);
- cmd.channel = cpu_to_le16(priv->curbssparams.channel);
+ cmd.channel = cpu_to_le16(chan);
cmd.type = cpu_to_le16(priv->mesh_tlv);
if (enable) {
@@ -1128,7 +1128,7 @@ int lbs_mesh_config(struct lbs_private *priv, int enable)
memcpy(cmd.data, priv->mesh_ssid, priv->mesh_ssid_len);
}
lbs_deb_cmd("mesh config enable %d TLV %x channel %d SSID %s\n",
- enable, priv->mesh_tlv, priv->curbssparams.channel,
+ enable, priv->mesh_tlv, chan,
escape_essid(priv->mesh_ssid, priv->mesh_ssid_len));
return lbs_cmd_with_response(priv, CMD_MESH_CONFIG, &cmd);
}
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 55f2436..a4aaa6b 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -31,7 +31,7 @@ int lbs_set_data_rate(struct lbs_private *priv, u8 rate);
int lbs_get_channel(struct lbs_private *priv);
int lbs_set_channel(struct lbs_private *priv, u8 channel);
-int lbs_mesh_config(struct lbs_private *priv, int enable);
+int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan);
int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria);
int lbs_suspend(struct lbs_private *priv);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 2409df8..9232b97 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -344,7 +344,7 @@ static ssize_t lbs_mesh_set(struct device *dev,
if (enable == !!priv->mesh_dev)
return count;
- ret = lbs_mesh_config(priv, enable);
+ ret = lbs_mesh_config(priv, enable, priv->curbssparams.channel);
if (ret)
return ret;
@@ -1187,9 +1187,9 @@ int lbs_start_card(struct lbs_private *priv)
lbs_update_channel(priv);
priv->mesh_tlv = 0x100 + 291;
- if (lbs_mesh_config(priv, 1)) {
+ if (lbs_mesh_config(priv, 1, priv->curbssparams.channel)) {
priv->mesh_tlv = 0x100 + 37;
- if (lbs_mesh_config(priv, 1))
+ if (lbs_mesh_config(priv, 1, priv->curbssparams.channel))
priv->mesh_tlv = 0;
}
if (priv->mesh_tlv) {
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 262d4cc..b1e2472 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -1000,9 +1000,8 @@ static int lbs_mesh_set_freq(struct net_device *dev,
else if (priv->mode == IW_MODE_ADHOC)
lbs_stop_adhoc_network(priv);
}
- priv->curbssparams.channel = fwrq->m;
- lbs_mesh_config(priv, 0);
- lbs_mesh_config(priv, 1);
+ lbs_mesh_config(priv, 1, fwrq->m);
+ lbs_update_channel(priv);
ret = 0;
out:
@@ -2010,7 +2009,7 @@ static int lbs_mesh_set_essid(struct net_device *dev,
priv->mesh_ssid_len = dwrq->length;
}
- lbs_mesh_config(priv, 1);
+ lbs_mesh_config(priv, 1, priv->curbssparams.channel);
out:
lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
return ret;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 96/48] libertas: use spin_is_locked() instead of spin_trylock() in lbs_interrupt()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (94 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 95/48] libertas: pass channel argument directly to lbs_mesh_config() David Woodhouse
@ 2007-12-13 7:00 ` David Woodhouse
2007-12-16 22:58 ` [PATCH 97/48] libertas: don't exit worker thread until kthread_stop() is called David Woodhouse
` (37 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-13 7:00 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 13 Dec 2007 01:53:57 -0500
We get scary warnings on UP if we use spin_trylock() and find, as we
hoped, that the lock in question is already locked.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 9232b97..5d2bf53 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1414,8 +1414,7 @@ void lbs_interrupt(struct lbs_private *priv)
lbs_deb_thread("lbs_interrupt: intcounter=%d\n", priv->intcounter);
- if (spin_trylock(&priv->driver_lock)) {
- spin_unlock(&priv->driver_lock);
+ if (!spin_is_locked(&priv->driver_lock)) {
printk(KERN_CRIT "%s called without driver_lock held\n", __func__);
WARN_ON(1);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 97/48] libertas: don't exit worker thread until kthread_stop() is called
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (95 preceding siblings ...)
2007-12-13 7:00 ` [PATCH 96/48] libertas: use spin_is_locked() instead of spin_trylock() in lbs_interrupt() David Woodhouse
@ 2007-12-16 22:58 ` David Woodhouse
2007-12-16 22:58 ` [PATCH 98/48] libertas: stop attempting to reset devices on unload David Woodhouse
` (36 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:58 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 13 Dec 2007 21:48:00 -0500
The kthread code can't cope with a thread exiting of its own accord and
then someone calling kthread_stop() for it. When the thread detects that
it needs to die, make it wait for kthread_stop() to be called.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 5d2bf53..b51513f 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -662,8 +662,10 @@ static int lbs_thread(void *data)
set_current_state(TASK_INTERRUPTIBLE);
spin_lock_irq(&priv->driver_lock);
- if (priv->surpriseremoved)
+ if (kthread_should_stop())
shouldsleep = 0; /* Bye */
+ else if (priv->surpriseremoved)
+ shouldsleep = 1; /* We need to wait until we're _told_ to die */
else if (priv->psstate == PS_STATE_SLEEP)
shouldsleep = 1; /* Sleep mode. Nothing we can do till it wakes */
else if (priv->intcounter)
@@ -699,12 +701,15 @@ static int lbs_thread(void *data)
lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
priv->intcounter, priv->currenttxskb, priv->dnld_sent);
- if (kthread_should_stop() || priv->surpriseremoved) {
- lbs_deb_thread("main-thread: break from main thread: surpriseremoved=0x%x\n",
- priv->surpriseremoved);
+ if (kthread_should_stop()) {
+ lbs_deb_thread("main-thread: break from main thread\n");
break;
}
+ if (priv->surpriseremoved) {
+ lbs_deb_thread("adapter removed; waiting to die...\n");
+ continue;
+ }
spin_lock_irq(&priv->driver_lock);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 98/48] libertas: stop attempting to reset devices on unload
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (96 preceding siblings ...)
2007-12-16 22:58 ` [PATCH 97/48] libertas: don't exit worker thread until kthread_stop() is called David Woodhouse
@ 2007-12-16 22:58 ` David Woodhouse
2007-12-16 22:58 ` [PATCH 99/48] libertas: clean up if_usb driver David Woodhouse
` (35 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:58 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Thu, 13 Dec 2007 21:53:16 -0500
It wasn't working anyway -- by the time we get into if_usb_disconnect()
the USB core has already stopped us talking to the thing; even if it's
just on unload and the device still exists.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 8191416..25925bd 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -278,16 +278,11 @@ static void if_usb_disconnect(struct usb_interface *intf)
cardp->surprise_removed = 1;
if (priv) {
-
priv->surpriseremoved = 1;
lbs_stop_card(priv);
lbs_remove_card(priv);
}
- /* this is (apparently?) necessary for future usage of the device */
- lbs_prepare_and_send_command(priv, CMD_802_11_RESET, CMD_ACT_HALT,
- 0, 0, NULL);
-
/* Unlink and free urb */
if_usb_free(cardp);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 99/48] libertas: clean up if_usb driver
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (97 preceding siblings ...)
2007-12-16 22:58 ` [PATCH 98/48] libertas: stop attempting to reset devices on unload David Woodhouse
@ 2007-12-16 22:58 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 100/48] libertas: kill whitespace at end of lines David Woodhouse
` (34 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:58 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Fri, 14 Dec 2007 00:47:05 -0500
It was just getting on my tits, really.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 428 ++++++++++++++------------------
drivers/net/wireless/libertas/if_usb.h | 95 ++++----
2 files changed, 225 insertions(+), 298 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 25925bd..9cb9e03 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -16,6 +16,9 @@
#include "cmd.h"
#include "if_usb.h"
+#define INSANEDEBUG 0
+#define lbs_deb_usb2(...) do { if (INSANEDEBUG) lbs_deb_usbd(__VA_ARGS__); } while (0)
+
#define MESSAGE_HEADER_LEN 4
static char *lbs_fw_name = "usb8388.bin";
@@ -32,17 +35,16 @@ MODULE_DEVICE_TABLE(usb, if_usb_table);
static void if_usb_receive(struct urb *urb);
static void if_usb_receive_fwload(struct urb *urb);
-static int if_usb_prog_firmware(struct usb_card_rec *cardp);
-static int if_usb_host_to_card(struct lbs_private *priv,
- u8 type,
- u8 *payload,
- u16 nb);
-static int if_usb_get_int_status(struct lbs_private *priv, u8 *);
+static int if_usb_prog_firmware(struct if_usb_card *cardp);
+static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
+ uint8_t *payload, uint16_t nb);
+static int if_usb_get_int_status(struct lbs_private *priv, uint8_t *);
static int if_usb_read_event_cause(struct lbs_private *);
-static int usb_tx_block(struct usb_card_rec *cardp, u8 *payload, u16 nb);
-static void if_usb_free(struct usb_card_rec *cardp);
-static int if_usb_submit_rx_urb(struct usb_card_rec *cardp);
-static int if_usb_reset_device(struct usb_card_rec *cardp);
+static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
+ uint16_t nb);
+static void if_usb_free(struct if_usb_card *cardp);
+static int if_usb_submit_rx_urb(struct if_usb_card *cardp);
+static int if_usb_reset_device(struct if_usb_card *cardp);
/**
* @brief call back function to handle the status of the URB
@@ -51,18 +53,16 @@ static int if_usb_reset_device(struct usb_card_rec *cardp);
*/
static void if_usb_write_bulk_callback(struct urb *urb)
{
- struct usb_card_rec *cardp = (struct usb_card_rec *) urb->context;
+ struct if_usb_card *cardp = (struct if_usb_card *) urb->context;
/* handle the transmission complete validations */
if (urb->status == 0) {
struct lbs_private *priv = cardp->priv;
- /*
- lbs_deb_usbd(&urb->dev->dev, "URB status is successfull\n");
- lbs_deb_usbd(&urb->dev->dev, "Actual length transmitted %d\n",
- urb->actual_length);
- */
+ lbs_deb_usb2(&urb->dev->dev, "URB status is successful\n");
+ lbs_deb_usb2(&urb->dev->dev, "Actual length transmitted %d\n",
+ urb->actual_length);
/* Used for both firmware TX and regular TX. priv isn't
* valid at firmware load time.
@@ -79,10 +79,10 @@ static void if_usb_write_bulk_callback(struct urb *urb)
/**
* @brief free tx/rx urb, skb and rx buffer
- * @param cardp pointer usb_card_rec
+ * @param cardp pointer if_usb_card
* @return N/A
*/
-static void if_usb_free(struct usb_card_rec *cardp)
+static void if_usb_free(struct if_usb_card *cardp)
{
lbs_deb_enter(LBS_DEB_USB);
@@ -96,8 +96,8 @@ static void if_usb_free(struct usb_card_rec *cardp)
usb_free_urb(cardp->rx_urb);
cardp->rx_urb = NULL;
- kfree(cardp->bulk_out_buffer);
- cardp->bulk_out_buffer = NULL;
+ kfree(cardp->ep_out_buf);
+ cardp->ep_out_buf = NULL;
lbs_deb_leave(LBS_DEB_USB);
}
@@ -115,7 +115,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
static void if_usb_fw_timeo(unsigned long priv)
{
- struct usb_card_rec *cardp = (void *)priv;
+ struct if_usb_card *cardp = (void *)priv;
if (cardp->fwdnldover) {
lbs_deb_usb("Download complete, no event. Assuming success\n");
@@ -125,6 +125,7 @@ static void if_usb_fw_timeo(unsigned long priv)
}
wake_up(&cardp->fw_wq);
}
+
/**
* @brief sets the configuration values
* @param ifnum interface number
@@ -138,12 +139,12 @@ static int if_usb_probe(struct usb_interface *intf,
struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint;
struct lbs_private *priv;
- struct usb_card_rec *cardp;
+ struct if_usb_card *cardp;
int i;
udev = interface_to_usbdev(intf);
- cardp = kzalloc(sizeof(struct usb_card_rec), GFP_KERNEL);
+ cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
if (!cardp) {
lbs_pr_err("Out of memory allocating private data.\n");
goto error;
@@ -156,7 +157,7 @@ static int if_usb_probe(struct usb_interface *intf,
iface_desc = intf->cur_altsetting;
lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
- " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
+ " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
le16_to_cpu(udev->descriptor.bcdUSB),
udev->descriptor.bDeviceClass,
udev->descriptor.bDeviceSubClass,
@@ -164,61 +165,40 @@ static int if_usb_probe(struct usb_interface *intf,
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
endpoint = &iface_desc->endpoint[i].desc;
- if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
- && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
- /* we found a bulk in endpoint */
- lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n",
- le16_to_cpu(endpoint->wMaxPacketSize));
- if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
- lbs_deb_usbd(&udev->dev,
- "Rx URB allocation failed\n");
- goto dealloc;
- }
- cardp->bulk_in_size =
- le16_to_cpu(endpoint->wMaxPacketSize);
- cardp->bulk_in_endpointAddr =
- (endpoint->
- bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
- lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n",
- endpoint->bEndpointAddress);
- }
+ if (usb_endpoint_is_bulk_in(endpoint)) {
+ cardp->ep_in_size = le16_to_cpu(endpoint->wMaxPacketSize);
+ cardp->ep_in = usb_endpoint_num(endpoint);
- if (((endpoint->
- bEndpointAddress & USB_ENDPOINT_DIR_MASK) ==
- USB_DIR_OUT)
- && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
- USB_ENDPOINT_XFER_BULK)) {
- /* We found bulk out endpoint */
- if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
- lbs_deb_usbd(&udev->dev,
- "Tx URB allocation failed\n");
- goto dealloc;
- }
+ lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n", cardp->ep_in);
+ lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n", cardp->ep_in_size);
- cardp->bulk_out_size =
- le16_to_cpu(endpoint->wMaxPacketSize);
- lbs_deb_usbd(&udev->dev,
- "Bulk out size is %d\n",
- le16_to_cpu(endpoint->wMaxPacketSize));
- cardp->bulk_out_endpointAddr =
- endpoint->bEndpointAddress;
- lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n",
- endpoint->bEndpointAddress);
- cardp->bulk_out_buffer =
- kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,
- GFP_KERNEL);
-
- if (!cardp->bulk_out_buffer) {
- lbs_deb_usbd(&udev->dev,
- "Could not allocate buffer\n");
- goto dealloc;
- }
+ } else if (usb_endpoint_is_bulk_out(endpoint)) {
+ cardp->ep_out_size = le16_to_cpu(endpoint->wMaxPacketSize);
+ cardp->ep_out = usb_endpoint_num(endpoint);
+
+ lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n", cardp->ep_out);
+ lbs_deb_usbd(&udev->dev, "Bulk out size is %d\n", cardp->ep_out_size);
}
}
+ if (!cardp->ep_out_size || !cardp->ep_in_size) {
+ lbs_deb_usbd(&udev->dev, "Endpoints not found\n");
+ goto dealloc;
+ }
+ if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
+ lbs_deb_usbd(&udev->dev, "Rx URB allocation failed\n");
+ goto dealloc;
+ }
+ if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
+ lbs_deb_usbd(&udev->dev, "Tx URB allocation failed\n");
+ goto dealloc;
+ }
+ cardp->ep_out_buf = kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE, GFP_KERNEL);
+ if (!cardp->ep_out_buf) {
+ lbs_deb_usbd(&udev->dev, "Could not allocate buffer\n");
+ goto dealloc;
+ }
/* Upload firmware */
- cardp->rinfo.cardp = cardp;
if (if_usb_prog_firmware(cardp)) {
lbs_deb_usbd(&udev->dev, "FW upload failed\n");
goto err_prog_firmware;
@@ -269,12 +249,11 @@ error:
*/
static void if_usb_disconnect(struct usb_interface *intf)
{
- struct usb_card_rec *cardp = usb_get_intfdata(intf);
+ struct if_usb_card *cardp = usb_get_intfdata(intf);
struct lbs_private *priv = (struct lbs_private *) cardp->priv;
lbs_deb_enter(LBS_DEB_MAIN);
- /* Update Surprise removed to TRUE */
cardp->surprise_removed = 1;
if (priv) {
@@ -297,98 +276,75 @@ static void if_usb_disconnect(struct usb_interface *intf)
* @param priv pointer to struct lbs_private
* @return 0
*/
-static int if_usb_send_fw_pkt(struct usb_card_rec *cardp)
+static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
{
- struct FWData *fwdata;
- struct fwheader *fwheader;
- u8 *firmware = cardp->fw->data;
-
- fwdata = kmalloc(sizeof(struct FWData), GFP_ATOMIC);
-
- if (!fwdata)
- return -1;
-
- fwheader = &fwdata->fwheader;
+ struct fwdata *fwdata = cardp->ep_out_buf;
+ uint8_t *firmware = cardp->fw->data;
+ /* If we got a CRC failure on the last block, back
+ up and retry it */
if (!cardp->CRC_OK) {
cardp->totalbytes = cardp->fwlastblksent;
- cardp->fwseqnum = cardp->lastseqnum - 1;
+ cardp->fwseqnum--;
}
- /*
- lbs_deb_usbd(&cardp->udev->dev, "totalbytes = %d\n",
- cardp->totalbytes);
- */
+ lbs_deb_usb2(&cardp->udev->dev, "totalbytes = %d\n",
+ cardp->totalbytes);
- memcpy(fwheader, &firmware[cardp->totalbytes],
+ /* struct fwdata (which we sent to the card) has an
+ extra __le32 field in between the header and the data,
+ which is not in the struct fwheader in the actual
+ firmware binary. Insert the seqnum in the middle... */
+ memcpy(&fwdata->hdr, &firmware[cardp->totalbytes],
sizeof(struct fwheader));
cardp->fwlastblksent = cardp->totalbytes;
cardp->totalbytes += sizeof(struct fwheader);
- /* lbs_deb_usbd(&cardp->udev->dev,"Copy Data\n"); */
memcpy(fwdata->data, &firmware[cardp->totalbytes],
- le32_to_cpu(fwdata->fwheader.datalength));
+ le32_to_cpu(fwdata->hdr.datalength));
- /*
- lbs_deb_usbd(&cardp->udev->dev,
- "Data length = %d\n", le32_to_cpu(fwdata->fwheader.datalength));
- */
+ lbs_deb_usb2(&cardp->udev->dev, "Data length = %d\n",
+ le32_to_cpu(fwdata->hdr.datalength));
- cardp->fwseqnum = cardp->fwseqnum + 1;
+ fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
+ cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
- fwdata->seqnum = cpu_to_le32(cardp->fwseqnum);
- cardp->lastseqnum = cardp->fwseqnum;
- cardp->totalbytes += le32_to_cpu(fwdata->fwheader.datalength);
+ usb_tx_block(cardp, cardp->ep_out_buf, sizeof(struct fwdata) +
+ le32_to_cpu(fwdata->hdr.datalength));
+
+ if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
+ lbs_deb_usb2(&cardp->udev->dev, "There are data to follow\n");
+ lbs_deb_usb2(&cardp->udev->dev, "seqnum = %d totalbytes = %d\n",
+ cardp->fwseqnum, cardp->totalbytes);
+ } else if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
+ lbs_deb_usb2(&cardp->udev->dev, "Host has finished FW downloading\n");
+ lbs_deb_usb2(&cardp->udev->dev, "Donwloading FW JUMP BLOCK\n");
- if (fwheader->dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
- /*
- lbs_deb_usbd(&cardp->udev->dev, "There are data to follow\n");
- lbs_deb_usbd(&cardp->udev->dev,
- "seqnum = %d totalbytes = %d\n", cardp->fwseqnum,
- cardp->totalbytes);
- */
- memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
- usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
-
- } else if (fwdata->fwheader.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
- /*
- lbs_deb_usbd(&cardp->udev->dev,
- "Host has finished FW downloading\n");
- lbs_deb_usbd(&cardp->udev->dev,
- "Donwloading FW JUMP BLOCK\n");
- */
- memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
- usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
cardp->fwfinalblk = 1;
}
- /*
- lbs_deb_usbd(&cardp->udev->dev,
- "The firmware download is done size is %d\n",
- cardp->totalbytes);
- */
-
- kfree(fwdata);
+ lbs_deb_usb2(&cardp->udev->dev, "Firmware download done; size %d\n",
+ cardp->totalbytes);
return 0;
}
-static int if_usb_reset_device(struct usb_card_rec *cardp)
+static int if_usb_reset_device(struct if_usb_card *cardp)
{
- struct cmd_ds_command *cmd = (void *)&cardp->bulk_out_buffer[4];
+ struct cmd_ds_command *cmd = cardp->ep_out_buf + 4;
int ret;
lbs_deb_enter(LBS_DEB_USB);
- *(__le32 *)cardp->bulk_out_buffer = cpu_to_le32(CMD_TYPE_REQUEST);
+ *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
cmd->command = cpu_to_le16(CMD_802_11_RESET);
cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_reset) + S_DS_GEN);
cmd->result = cpu_to_le16(0);
cmd->seqnum = cpu_to_le16(0x5a5a);
cmd->params.reset.action = cpu_to_le16(CMD_ACT_HALT);
- usb_tx_block(cardp, cardp->bulk_out_buffer, 4 + S_DS_GEN + sizeof(struct cmd_ds_802_11_reset));
+ usb_tx_block(cardp, cardp->ep_out_buf, 4 + S_DS_GEN + sizeof(struct cmd_ds_802_11_reset));
msleep(100);
ret = usb_reset_device(cardp->udev);
@@ -406,7 +362,7 @@ static int if_usb_reset_device(struct usb_card_rec *cardp)
* @param nb data length
* @return 0 or -1
*/
-static int usb_tx_block(struct usb_card_rec *cardp, u8 * payload, u16 nb)
+static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload, uint16_t nb)
{
int ret = -1;
@@ -418,17 +374,16 @@ static int usb_tx_block(struct usb_card_rec *cardp, u8 * payload, u16 nb)
usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
usb_sndbulkpipe(cardp->udev,
- cardp->bulk_out_endpointAddr),
+ cardp->ep_out),
payload, nb, if_usb_write_bulk_callback, cardp);
cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;
if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
- /* transfer failed */
lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
ret = -1;
} else {
- /* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
+ lbs_deb_usb2(&cardp->udev->dev, "usb_submit_urb success\n");
ret = 0;
}
@@ -436,11 +391,10 @@ tx_ret:
return ret;
}
-static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
+static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
void (*callbackfn)(struct urb *urb))
{
struct sk_buff *skb;
- struct read_cb_info *rinfo = &cardp->rinfo;
int ret = -1;
if (!(skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE))) {
@@ -448,27 +402,25 @@ static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
goto rx_ret;
}
- rinfo->skb = skb;
+ cardp->rx_skb = skb;
/* Fill the receive configuration URB and initialise the Rx call back */
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
- usb_rcvbulkpipe(cardp->udev,
- cardp->bulk_in_endpointAddr),
+ usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
(void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
- rinfo);
+ cardp);
cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
- /* lbs_deb_usbd(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb); */
+ lbs_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb);
if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
- /* handle failure conditions */
lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
kfree_skb(skb);
- rinfo->skb = NULL;
+ cardp->rx_skb = NULL;
ret = -1;
} else {
- /* lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB success\n"); */
+ lbs_deb_usb2(&cardp->udev->dev, "Submit Rx URB success\n");
ret = 0;
}
@@ -476,27 +428,26 @@ rx_ret:
return ret;
}
-static int if_usb_submit_rx_urb_fwload(struct usb_card_rec *cardp)
+static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
{
return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
}
-static int if_usb_submit_rx_urb(struct usb_card_rec *cardp)
+static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
{
return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
}
static void if_usb_receive_fwload(struct urb *urb)
{
- struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
- struct sk_buff *skb = rinfo->skb;
- struct usb_card_rec *cardp = (struct usb_card_rec *)rinfo->cardp;
+ struct if_usb_card *cardp = urb->context;
+ struct sk_buff *skb = cardp->rx_skb;
struct fwsyncheader *syncfwheader;
- struct bootcmdrespStr bootcmdresp;
+ struct bootcmdresp bootcmdresp;
if (urb->status) {
lbs_deb_usbd(&cardp->udev->dev,
- "URB status is failed during fw load\n");
+ "URB status is failed during fw load\n");
kfree_skb(skb);
return;
}
@@ -509,8 +460,8 @@ static void if_usb_receive_fwload(struct urb *urb)
lbs_pr_info("Firmware ready event received\n");
wake_up(&cardp->fw_wq);
} else {
- lbs_deb_usb("Waiting for confirmation; got %x %x\n", le32_to_cpu(tmp[0]),
- le32_to_cpu(tmp[1]));
+ lbs_deb_usb("Waiting for confirmation; got %x %x\n",
+ le32_to_cpu(tmp[0]), le32_to_cpu(tmp[1]));
if_usb_submit_rx_urb_fwload(cardp);
}
kfree_skb(skb);
@@ -519,37 +470,36 @@ static void if_usb_receive_fwload(struct urb *urb)
if (cardp->bootcmdresp <= 0) {
memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
sizeof(bootcmdresp));
+
if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
kfree_skb(skb);
if_usb_submit_rx_urb_fwload(cardp);
cardp->bootcmdresp = 1;
lbs_deb_usbd(&cardp->udev->dev,
- "Received valid boot command response\n");
+ "Received valid boot command response\n");
return;
}
- if (bootcmdresp.u32magicnumber != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
- if (bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_REQUEST) ||
- bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_DATA) ||
- bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_INDICATION)) {
+ if (bootcmdresp.magic != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
+ if (bootcmdresp.magic == cpu_to_le32(CMD_TYPE_REQUEST) ||
+ bootcmdresp.magic == cpu_to_le32(CMD_TYPE_DATA) ||
+ bootcmdresp.magic == cpu_to_le32(CMD_TYPE_INDICATION)) {
if (!cardp->bootcmdresp)
lbs_pr_info("Firmware already seems alive; resetting\n");
cardp->bootcmdresp = -1;
} else {
lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
- le32_to_cpu(bootcmdresp.u32magicnumber));
+ le32_to_cpu(bootcmdresp.magic));
}
- } else if (bootcmdresp.u8cmd_tag != BOOT_CMD_FW_BY_USB) {
- lbs_pr_info(
- "boot cmd response cmd_tag error (%d)\n",
- bootcmdresp.u8cmd_tag);
- } else if (bootcmdresp.u8result != BOOT_CMD_RESP_OK) {
- lbs_pr_info(
- "boot cmd response result error (%d)\n",
- bootcmdresp.u8result);
+ } else if (bootcmdresp.cmd != BOOT_CMD_FW_BY_USB) {
+ lbs_pr_info("boot cmd response cmd_tag error (%d)\n",
+ bootcmdresp.cmd);
+ } else if (bootcmdresp.result != BOOT_CMD_RESP_OK) {
+ lbs_pr_info("boot cmd response result error (%d)\n",
+ bootcmdresp.result);
} else {
cardp->bootcmdresp = 1;
lbs_deb_usbd(&cardp->udev->dev,
- "Received valid boot command response\n");
+ "Received valid boot command response\n");
}
kfree_skb(skb);
if_usb_submit_rx_urb_fwload(cardp);
@@ -564,20 +514,15 @@ static void if_usb_receive_fwload(struct urb *urb)
}
memcpy(syncfwheader, skb->data + IPFIELD_ALIGN_OFFSET,
- sizeof(struct fwsyncheader));
+ sizeof(struct fwsyncheader));
if (!syncfwheader->cmd) {
- /*
- lbs_deb_usbd(&cardp->udev->dev,
- "FW received Blk with correct CRC\n");
- lbs_deb_usbd(&cardp->udev->dev,
- "FW received Blk seqnum = %d\n",
- syncfwheader->seqnum);
- */
+ lbs_deb_usb2(&cardp->udev->dev, "FW received Blk with correct CRC\n");
+ lbs_deb_usb2(&cardp->udev->dev, "FW received Blk seqnum = %d\n",
+ le32_to_cpu(syncfwheader->seqnum));
cardp->CRC_OK = 1;
} else {
- lbs_deb_usbd(&cardp->udev->dev,
- "FW received Blk with CRC error\n");
+ lbs_deb_usbd(&cardp->udev->dev, "FW received Blk with CRC error\n");
cardp->CRC_OK = 0;
}
@@ -604,13 +549,12 @@ static void if_usb_receive_fwload(struct urb *urb)
#define MRVDRV_MIN_PKT_LEN 30
static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
- struct usb_card_rec *cardp,
+ struct if_usb_card *cardp,
struct lbs_private *priv)
{
- if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE +
- MESSAGE_HEADER_LEN || recvlength < MRVDRV_MIN_PKT_LEN) {
- lbs_deb_usbd(&cardp->udev->dev,
- "Packet length is Invalid\n");
+ if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + MESSAGE_HEADER_LEN
+ || recvlength < MRVDRV_MIN_PKT_LEN) {
+ lbs_deb_usbd(&cardp->udev->dev, "Packet length is Invalid\n");
kfree_skb(skb);
return;
}
@@ -618,19 +562,21 @@ static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
skb_reserve(skb, IPFIELD_ALIGN_OFFSET);
skb_put(skb, recvlength);
skb_pull(skb, MESSAGE_HEADER_LEN);
+
lbs_process_rxed_packet(priv, skb);
priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
}
-static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
+static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
struct sk_buff *skb,
- struct usb_card_rec *cardp,
+ struct if_usb_card *cardp,
struct lbs_private *priv)
{
- u8 *cmdbuf;
+ uint8_t *cmdbuf;
+
if (recvlength > LBS_CMD_BUFFER_SIZE) {
lbs_deb_usbd(&cardp->udev->dev,
- "The receive buffer is too large\n");
+ "The receive buffer is too large\n");
kfree_skb(skb);
return;
}
@@ -642,16 +588,16 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
/* take care of cur_cmd = NULL case by reading the
* data to clear the interrupt */
if (!priv->cur_cmd) {
- lbs_deb_hex(LBS_DEB_HOST, "Unsolicited CMD_RESP", (void *) recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
+ lbs_deb_hex(LBS_DEB_HOST, "Unsolicited CMD_RESP",
+ (void *) recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
cmdbuf = priv->upld_buf;
priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
} else
- cmdbuf = (u8 *) priv->cur_cmd->cmdbuf;
+ cmdbuf = (uint8_t *) priv->cur_cmd->cmdbuf;
cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
- memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN,
- priv->upld_len);
+ memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
kfree_skb(skb);
lbs_interrupt(priv);
@@ -659,8 +605,6 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
lbs_deb_usbd(&cardp->udev->dev,
"Wake up main thread to handle cmd response\n");
-
- return;
}
/**
@@ -672,30 +616,26 @@ static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
*/
static void if_usb_receive(struct urb *urb)
{
- struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
- struct sk_buff *skb = rinfo->skb;
- struct usb_card_rec *cardp = (struct usb_card_rec *) rinfo->cardp;
+ struct if_usb_card *cardp = urb->context;
+ struct sk_buff *skb = cardp->rx_skb;
struct lbs_private *priv = cardp->priv;
-
int recvlength = urb->actual_length;
- u8 *recvbuff = NULL;
- u32 recvtype = 0;
+ uint8_t *recvbuff = NULL;
+ uint32_t recvtype = 0;
+ __le32 *pkt = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);
lbs_deb_enter(LBS_DEB_USB);
if (recvlength) {
- __le32 tmp;
-
if (urb->status) {
- lbs_deb_usbd(&cardp->udev->dev,
- "URB status is failed\n");
+ lbs_deb_usbd(&cardp->udev->dev, "RX URB failed: %d\n",
+ urb->status);
kfree_skb(skb);
goto setup_for_next;
}
recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
- memcpy(&tmp, recvbuff, sizeof(u32));
- recvtype = le32_to_cpu(tmp);
+ recvtype = le32_to_cpu(pkt[0]);
lbs_deb_usbd(&cardp->udev->dev,
"Recv length = 0x%x, Recv type = 0x%X\n",
recvlength, recvtype);
@@ -716,9 +656,13 @@ static void if_usb_receive(struct urb *urb)
case CMD_TYPE_INDICATION:
/* Event cause handling */
spin_lock(&priv->driver_lock);
- cardp->usb_event_cause = le32_to_cpu(*(__le32 *) (recvbuff + MESSAGE_HEADER_LEN));
+
+ cardp->usb_event_cause = le32_to_cpu(pkt[1]);
+
lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
- cardp->usb_event_cause);
+ cardp->usb_event_cause);
+
+ /* Icky undocumented magic special case */
if (cardp->usb_event_cause & 0xffff0000) {
lbs_send_tx_feedback(priv);
spin_unlock(&priv->driver_lock);
@@ -732,7 +676,7 @@ static void if_usb_receive(struct urb *urb)
goto rx_exit;
default:
lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
- recvtype);
+ recvtype);
kfree_skb(skb);
break;
}
@@ -751,55 +695,48 @@ rx_exit:
* @param len number of bytes
* @return 0 or -1
*/
-static int if_usb_host_to_card(struct lbs_private *priv,
- u8 type,
- u8 *payload,
- u16 nb)
+static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
+ uint8_t *payload, uint16_t nb)
{
- struct usb_card_rec *cardp = (struct usb_card_rec *)priv->card;
+ struct if_usb_card *cardp = priv->card;
lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
if (type == MVMS_CMD) {
- __le32 tmp = cpu_to_le32(CMD_TYPE_REQUEST);
+ *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
priv->dnld_sent = DNLD_CMD_SENT;
- memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
- MESSAGE_HEADER_LEN);
-
} else {
- __le32 tmp = cpu_to_le32(CMD_TYPE_DATA);
+ *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_DATA);
priv->dnld_sent = DNLD_DATA_SENT;
- memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
- MESSAGE_HEADER_LEN);
}
- memcpy((cardp->bulk_out_buffer + MESSAGE_HEADER_LEN), payload, nb);
+ memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
- return usb_tx_block(cardp, cardp->bulk_out_buffer,
- nb + MESSAGE_HEADER_LEN);
+ return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN);
}
/* called with priv->driver_lock held */
-static int if_usb_get_int_status(struct lbs_private *priv, u8 *ireg)
+static int if_usb_get_int_status(struct lbs_private *priv, uint8_t *ireg)
{
- struct usb_card_rec *cardp = priv->card;
+ struct if_usb_card *cardp = priv->card;
*ireg = cardp->usb_int_cause;
cardp->usb_int_cause = 0;
- lbs_deb_usbd(&cardp->udev->dev,"Int cause is 0x%X\n", *ireg);
+ lbs_deb_usbd(&cardp->udev->dev, "Int cause is 0x%X\n", *ireg);
return 0;
}
static int if_usb_read_event_cause(struct lbs_private *priv)
{
- struct usb_card_rec *cardp = priv->card;
+ struct if_usb_card *cardp = priv->card;
priv->eventcause = cardp->usb_event_cause;
/* Re-submit rx urb here to avoid event lost issue */
if_usb_submit_rx_urb(cardp);
+
return 0;
}
@@ -809,20 +746,17 @@ static int if_usb_read_event_cause(struct lbs_private *priv)
* 2:Boot from FW in EEPROM
* @return 0
*/
-static int if_usb_issue_boot_command(struct usb_card_rec *cardp, int ivalue)
+static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
{
- struct bootcmdstr sbootcmd;
- int i;
+ struct bootcmd *bootcmd = cardp->ep_out_buf;
/* Prepare command */
- sbootcmd.u32magicnumber = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
- sbootcmd.u8cmd_tag = ivalue;
- for (i=0; i<11; i++)
- sbootcmd.au8dumy[i]=0x00;
- memcpy(cardp->bulk_out_buffer, &sbootcmd, sizeof(struct bootcmdstr));
+ bootcmd->magic = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
+ bootcmd->cmd = ivalue;
+ memset(bootcmd->pad, 0, sizeof(bootcmd->pad));
/* Issue command */
- usb_tx_block(cardp, cardp->bulk_out_buffer, sizeof(struct bootcmdstr));
+ usb_tx_block(cardp, cardp->ep_out_buf, sizeof(*bootcmd));
return 0;
}
@@ -835,10 +769,10 @@ static int if_usb_issue_boot_command(struct usb_card_rec *cardp, int ivalue)
* len image length
* @return 0 or -1
*/
-static int check_fwfile_format(u8 *data, u32 totlen)
+static int check_fwfile_format(uint8_t *data, uint32_t totlen)
{
- u32 bincmd, exit;
- u32 blksize, offset, len;
+ uint32_t bincmd, exit;
+ uint32_t blksize, offset, len;
int ret;
ret = 1;
@@ -876,7 +810,7 @@ static int check_fwfile_format(u8 *data, u32 totlen)
}
-static int if_usb_prog_firmware(struct usb_card_rec *cardp)
+static int if_usb_prog_firmware(struct if_usb_card *cardp)
{
int i = 0;
static int reset_count = 10;
@@ -953,11 +887,11 @@ restart:
goto release_fw;
}
-release_fw:
+ release_fw:
release_firmware(cardp->fw);
cardp->fw = NULL;
-done:
+ done:
lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
return ret;
}
@@ -966,7 +900,7 @@ done:
#ifdef CONFIG_PM
static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
{
- struct usb_card_rec *cardp = usb_get_intfdata(intf);
+ struct if_usb_card *cardp = usb_get_intfdata(intf);
struct lbs_private *priv = cardp->priv;
int ret;
@@ -990,7 +924,7 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
static int if_usb_resume(struct usb_interface *intf)
{
- struct usb_card_rec *cardp = usb_get_intfdata(intf);
+ struct if_usb_card *cardp = usb_get_intfdata(intf);
struct lbs_private *priv = cardp->priv;
lbs_deb_enter(LBS_DEB_USB);
@@ -1041,5 +975,5 @@ module_init(if_usb_init_module);
module_exit(if_usb_exit_module);
MODULE_DESCRIPTION("8388 USB WLAN Driver");
-MODULE_AUTHOR("Marvell International Ltd.");
+MODULE_AUTHOR("Marvell International Ltd. and Red Hat, Inc.");
MODULE_LICENSE("GPL");
diff --git a/drivers/net/wireless/libertas/if_usb.h b/drivers/net/wireless/libertas/if_usb.h
index 668410f..7706691 100644
--- a/drivers/net/wireless/libertas/if_usb.h
+++ b/drivers/net/wireless/libertas/if_usb.h
@@ -9,72 +9,67 @@ struct lbs_private;
/**
* This file contains definition for USB interface.
*/
-#define CMD_TYPE_REQUEST 0xF00DFACE
-#define CMD_TYPE_DATA 0xBEADC0DE
-#define CMD_TYPE_INDICATION 0xBEEFFACE
+#define CMD_TYPE_REQUEST 0xF00DFACE
+#define CMD_TYPE_DATA 0xBEADC0DE
+#define CMD_TYPE_INDICATION 0xBEEFFACE
-#define IPFIELD_ALIGN_OFFSET 2
+#define IPFIELD_ALIGN_OFFSET 2
-#define BOOT_CMD_FW_BY_USB 0x01
-#define BOOT_CMD_FW_IN_EEPROM 0x02
-#define BOOT_CMD_UPDATE_BOOT2 0x03
-#define BOOT_CMD_UPDATE_FW 0x04
-#define BOOT_CMD_MAGIC_NUMBER 0x4C56524D /* M=>0x4D,R=>0x52,V=>0x56,L=>0x4C */
+#define BOOT_CMD_FW_BY_USB 0x01
+#define BOOT_CMD_FW_IN_EEPROM 0x02
+#define BOOT_CMD_UPDATE_BOOT2 0x03
+#define BOOT_CMD_UPDATE_FW 0x04
+#define BOOT_CMD_MAGIC_NUMBER 0x4C56524D /* LVRM */
-struct bootcmdstr
+struct bootcmd
{
- __le32 u32magicnumber;
- u8 u8cmd_tag;
- u8 au8dumy[11];
+ __le32 magic;
+ uint8_t cmd;
+ uint8_t pad[11];
};
-#define BOOT_CMD_RESP_OK 0x0001
-#define BOOT_CMD_RESP_FAIL 0x0000
+#define BOOT_CMD_RESP_OK 0x0001
+#define BOOT_CMD_RESP_FAIL 0x0000
-struct bootcmdrespStr
+struct bootcmdresp
{
- __le32 u32magicnumber;
- u8 u8cmd_tag;
- u8 u8result;
- u8 au8dumy[2];
-};
-
-/* read callback private data */
-struct read_cb_info {
- struct usb_card_rec *cardp;
- struct sk_buff *skb;
+ __le32 magic;
+ uint8_t cmd;
+ uint8_t result;
+ uint8_t pad[2];
};
/** USB card description structure*/
-struct usb_card_rec {
+struct if_usb_card {
struct usb_device *udev;
struct urb *rx_urb, *tx_urb;
struct lbs_private *priv;
- struct read_cb_info rinfo;
- int bulk_in_size;
- u8 bulk_in_endpointAddr;
+ struct sk_buff *rx_skb;
+ uint32_t usb_event_cause;
+ uint8_t usb_int_cause;
+
+ uint8_t ep_in;
+ uint8_t ep_out;
- u8 *bulk_out_buffer;
- int bulk_out_size;
- u8 bulk_out_endpointAddr;
+ int8_t bootcmdresp;
+
+ int ep_in_size;
+
+ void *ep_out_buf;
+ int ep_out_size;
const struct firmware *fw;
struct timer_list fw_timeout;
wait_queue_head_t fw_wq;
- u8 CRC_OK;
- u32 fwseqnum;
- u32 lastseqnum;
- u32 totalbytes;
- u32 fwlastblksent;
- u8 fwdnldover;
- u8 fwfinalblk;
- u8 surprise_removed;
-
- u32 usb_event_cause;
- u8 usb_int_cause;
-
- s8 bootcmdresp;
+ uint32_t fwseqnum;
+ uint32_t totalbytes;
+ uint32_t fwlastblksent;
+ uint8_t CRC_OK;
+ uint8_t fwdnldover;
+ uint8_t fwfinalblk;
+ uint8_t surprise_removed;
+
};
/** fwheader */
@@ -87,10 +82,10 @@ struct fwheader {
#define FW_MAX_DATA_BLK_SIZE 600
/** FWData */
-struct FWData {
- struct fwheader fwheader;
+struct fwdata {
+ struct fwheader hdr;
__le32 seqnum;
- u8 data[FW_MAX_DATA_BLK_SIZE];
+ uint8_t data[0];
};
/** fwsyncheader */
@@ -102,7 +97,5 @@ struct fwsyncheader {
#define FW_HAS_DATA_TO_RECV 0x00000001
#define FW_HAS_LAST_BLOCK 0x00000004
-#define FW_DATA_XMIT_SIZE \
- sizeof(struct fwheader) + le32_to_cpu(fwdata->fwheader.datalength) + sizeof(u32)
#endif
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 100/48] libertas: kill whitespace at end of lines
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (98 preceding siblings ...)
2007-12-16 22:58 ` [PATCH 99/48] libertas: clean up if_usb driver David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 101/48] libertas: kill unused wait_option field in struct cmd_ctrl_node David Woodhouse
` (33 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Fri, 14 Dec 2007 22:53:41 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 2 +-
drivers/net/wireless/libertas/cmd.h | 4 ++--
drivers/net/wireless/libertas/debugfs.c | 2 +-
drivers/net/wireless/libertas/if_sdio.c | 2 +-
drivers/net/wireless/libertas/if_usb.c | 4 ++--
drivers/net/wireless/libertas/main.c | 14 +++++++-------
drivers/net/wireless/libertas/tx.c | 4 ++--
7 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 171acc2..ffef721 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1122,7 +1122,7 @@ int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan)
cmd.action = cpu_to_le16(enable);
cmd.channel = cpu_to_le16(chan);
cmd.type = cpu_to_le16(priv->mesh_tlv);
-
+
if (enable) {
cmd.length = cpu_to_le16(priv->mesh_ssid_len);
memcpy(cmd.data, priv->mesh_ssid, priv->mesh_ssid_len);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index a4aaa6b..999fabe 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -11,9 +11,9 @@
#define lbs_cmd_with_response(priv, cmdnr, cmd) \
lbs_cmd(priv, cmdnr, cmd, lbs_cmd_copyback, (unsigned long) (cmd))
-
+
int __lbs_cmd(struct lbs_private *priv, uint16_t command,
- struct cmd_header *in_cmd, int in_cmd_size,
+ struct cmd_header *in_cmd, int in_cmd_size,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
unsigned long callback_arg);
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index f4858bd..226b183 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -295,7 +295,7 @@ static ssize_t lbs_setuserscan(struct file *file,
if (!buf)
return -ENOMEM;
-
+
buf_size = min(count, len - 1);
if (copy_from_user(buf, userbuf, buf_size)) {
res = -EFAULT;
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 85675c5..b24584d 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -19,7 +19,7 @@
* current block size.
*
* As SDIO is still new to the kernel, it is unfortunately common with
- * bugs in the host controllers related to that. One such bug is that
+ * bugs in the host controllers related to that. One such bug is that
* controllers cannot do transfers that aren't a multiple of 4 bytes.
* If you don't have time to fix the host controller driver, you can
* work around the problem by modifying if_sdio_host_to_card() and
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 9cb9e03..396ce67 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -152,7 +152,7 @@ static int if_usb_probe(struct usb_interface *intf,
setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
init_waitqueue_head(&cardp->fw_wq);
-
+
cardp->udev = udev;
iface_desc = intf->cur_altsetting;
@@ -871,7 +871,7 @@ restart:
/* ... and wait for the process to complete */
wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
-
+
del_timer_sync(&cardp->fw_timeout);
usb_kill_urb(cardp->rx_urb);
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index b51513f..0dc7de6 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -255,7 +255,7 @@ static int lbs_add_rtap(struct lbs_private *priv);
static void lbs_remove_rtap(struct lbs_private *priv);
static int lbs_add_mesh(struct lbs_private *priv);
static void lbs_remove_mesh(struct lbs_private *priv);
-
+
/**
* Get function for sysfs attribute rtap
@@ -347,7 +347,7 @@ static ssize_t lbs_mesh_set(struct device *dev,
ret = lbs_mesh_config(priv, enable, priv->curbssparams.channel);
if (ret)
return ret;
-
+
if (enable)
lbs_add_mesh(priv);
else
@@ -401,7 +401,7 @@ static int lbs_dev_open(struct net_device *dev)
netif_carrier_on(dev);
} else {
priv->infra_open = 1;
-
+
if (priv->connect_status == LBS_CONNECTED)
netif_carrier_on(dev);
else
@@ -433,7 +433,7 @@ static int lbs_mesh_stop(struct net_device *dev)
netif_stop_queue(dev);
netif_carrier_off(dev);
-
+
spin_unlock_irq(&priv->driver_lock);
return 0;
}
@@ -453,7 +453,7 @@ static int lbs_eth_stop(struct net_device *dev)
priv->infra_open = 0;
netif_stop_queue(dev);
-
+
spin_unlock_irq(&priv->driver_lock);
return 0;
}
@@ -850,7 +850,7 @@ int lbs_suspend(struct lbs_private *priv)
}
memset(&cmd, 0, sizeof(cmd));
-
+
ret = __lbs_cmd(priv, CMD_802_11_HOST_SLEEP_ACTIVATE, &cmd,
sizeof(cmd), lbs_suspend_callback, 0);
if (ret)
@@ -1180,7 +1180,7 @@ int lbs_start_card(struct lbs_private *priv)
/* Enable mesh, if supported, and work out which TLV it uses.
0x100 + 291 is an unofficial value used in 5.110.20.pXX
0x100 + 37 is the official value used in 5.110.21.pXX
- but we check them in that order because 20.pXX doesn't
+ but we check them in that order because 20.pXX doesn't
give an error -- it just silently fails. */
/* 5.110.20.pXX firmware will fail the command if the channel
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index 8a1a396..00d95f7 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -93,8 +93,8 @@ int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
netif_stop_queue(priv->mesh_dev);
if (priv->tx_pending_len) {
- /* This can happen if packets come in on the mesh and eth
- device simultaneously -- there's no mutual exclusion on
+ /* This can happen if packets come in on the mesh and eth
+ device simultaneously -- there's no mutual exclusion on
hard_start_xmit() calls between devices. */
lbs_deb_tx("Packet on %s while busy\n", dev->name);
ret = NETDEV_TX_BUSY;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 101/48] libertas: kill unused wait_option field in struct cmd_ctrl_node
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (99 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 100/48] libertas: kill whitespace at end of lines David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 102/48] libertas: rename and clean up DownloadcommandToStation David Woodhouse
` (32 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Fri, 14 Dec 2007 23:08:13 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 12 ++++--------
drivers/net/wireless/libertas/hostcmd.h | 2 --
2 files changed, 4 insertions(+), 10 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index ffef721..5ceb331 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -17,7 +17,7 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode);
static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
static void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
struct cmd_ctrl_node *ptempnode,
- u16 wait_option, void *pdata_buf);
+ void *pdata_buf);
/**
@@ -1392,7 +1392,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
goto done;
}
- lbs_set_cmd_ctrl_node(priv, cmdnode, wait_option, pdata_buf);
+ lbs_set_cmd_ctrl_node(priv, cmdnode, pdata_buf);
cmdptr = (struct cmd_ds_command *)cmdnode->cmdbuf;
@@ -1554,7 +1554,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
case CMD_802_11_INACTIVITY_TIMEOUT:
ret = lbs_cmd_802_11_inactivity_timeout(priv, cmdptr,
cmd_action, pdata_buf);
- lbs_set_cmd_ctrl_node(priv, cmdnode, 0, pdata_buf);
+ lbs_set_cmd_ctrl_node(priv, cmdnode, pdata_buf);
break;
case CMD_802_11_TPC_CFG:
@@ -1800,7 +1800,6 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *cmdnode)
return;
cmdnode->cmdwaitqwoken = 1;
wake_up_interruptible(&cmdnode->cmdwait_q);
- cmdnode->wait_option = 0;
cmdnode->pdata_buf = NULL;
cmdnode->callback = NULL;
cmdnode->callback_arg = 0;
@@ -1816,20 +1815,18 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *cmdnode)
*
* @param priv A pointer to struct lbs_private structure
* @param ptempnode A pointer to cmd_ctrl_node structure
- * @param wait_option wait option: wait response or not
* @param pdata_buf A pointer to informaion buffer
* @return 0 or -1
*/
static void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
struct cmd_ctrl_node *ptempnode,
- u16 wait_option, void *pdata_buf)
+ void *pdata_buf)
{
lbs_deb_enter(LBS_DEB_HOST);
if (!ptempnode)
return;
- ptempnode->wait_option = wait_option;
ptempnode->pdata_buf = pdata_buf;
ptempnode->callback = NULL;
ptempnode->callback_arg = 0;
@@ -2213,7 +2210,6 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
goto done;
}
- cmdnode->wait_option = CMD_OPTION_WAITFORRSP;
cmdnode->callback = callback;
cmdnode->callback_arg = callback_arg;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index aa4cea0..1b31250 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -74,8 +74,6 @@ struct cmd_header {
struct cmd_ctrl_node {
struct list_head list;
- /* wait for finish or not */
- u16 wait_option;
/* command response */
void *pdata_buf;
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 102/48] libertas: rename and clean up DownloadcommandToStation
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (100 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 101/48] libertas: kill unused wait_option field in struct cmd_ctrl_node David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 103/48] libertas: don't use __lbs_cmd() with empty callback in if_usb.c David Woodhouse
` (31 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 00:09:25 -0500
Call it lbs_submit_command(), remove a bunch of things which can be (or,
in the case of zeroing ->cmdwaitqwoken, already are) done elsewhere.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 36 ++++++++--------------------------
1 files changed, 9 insertions(+), 27 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 5ceb331..4dc6bbe 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1170,6 +1170,10 @@ void lbs_queue_cmd(struct lbs_private *priv,
lbs_deb_host("QUEUE_CMD: cmdnode or cmdbuf is NULL\n");
goto done;
}
+ if (!cmdnode->cmdbuf->size) {
+ lbs_deb_host("DNLD_CMD: cmd size is zero\n");
+ goto done;
+ }
/* Exit_PS command needs to be queued in the header always. */
if (le16_to_cpu(cmdnode->cmdbuf->command) == CMD_802_11_PS_MODE) {
@@ -1197,15 +1201,8 @@ done:
lbs_deb_leave(LBS_DEB_HOST);
}
-/*
- * TODO: Fix the issue when DownloadcommandToStation is being called the
- * second time when the command times out. All the cmdptr->xxx are in little
- * endian and therefore all the comparissions will fail.
- * For now - we are not performing the endian conversion the second time - but
- * for PS and DEEP_SLEEP we need to worry
- */
-static int DownloadcommandToStation(struct lbs_private *priv,
- struct cmd_ctrl_node *cmdnode)
+static int lbs_submit_command(struct lbs_private *priv,
+ struct cmd_ctrl_node *cmdnode)
{
unsigned long flags;
struct cmd_header *cmd;
@@ -1215,21 +1212,9 @@ static int DownloadcommandToStation(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_HOST);
- if (!priv || !cmdnode) {
- lbs_deb_host("DNLD_CMD: priv or cmdmode is NULL\n");
- goto done;
- }
-
cmd = cmdnode->cmdbuf;
spin_lock_irqsave(&priv->driver_lock, flags);
- if (!cmd || !cmd->size) {
- lbs_deb_host("DNLD_CMD: cmdptr is NULL or zero\n");
- __lbs_cleanup_and_insert_cmd(priv, cmdnode);
- spin_unlock_irqrestore(&priv->driver_lock, flags);
- goto done;
- }
-
priv->cur_cmd = cmdnode;
priv->cur_cmd_retcode = 0;
spin_unlock_irqrestore(&priv->driver_lock, flags);
@@ -1241,12 +1226,9 @@ static int DownloadcommandToStation(struct lbs_private *priv,
command, le16_to_cpu(cmd->seqnum), cmdsize, jiffies);
lbs_deb_hex(LBS_DEB_HOST, "DNLD_CMD", (void *) cmdnode->cmdbuf, cmdsize);
- cmdnode->cmdwaitqwoken = 0;
-
ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmd, cmdsize);
-
- if (ret != 0) {
- lbs_deb_host("DNLD_CMD: hw_host_to_card failed\n");
+ if (ret) {
+ lbs_pr_info("DNLD_CMD: hw_host_to_card failed: %d\n", ret);
spin_lock_irqsave(&priv->driver_lock, flags);
priv->cur_cmd_retcode = ret;
__lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
@@ -1952,7 +1934,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
list_del(&cmdnode->list);
lbs_deb_host("EXEC_NEXT_CMD: sending command 0x%04x\n",
le16_to_cpu(cmd->command));
- DownloadcommandToStation(priv, cmdnode);
+ lbs_submit_command(priv, cmdnode);
} else {
/*
* check if in power save mode, if yes, put the device back
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 103/48] libertas: don't use __lbs_cmd() with empty callback in if_usb.c
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (101 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 102/48] libertas: rename and clean up DownloadcommandToStation David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 104/48] libertas: remove some pointless checks for cmdnode buffer being present David Woodhouse
` (30 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 01:22:09 -0500
We're about to change semantics, leaving callers of
lbs_prepare_and_send_command() with the old broken priv->cur_cmd_retcode
crap. The existence of the callback command will be the trigger for the
new semantics when handling the response.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 396ce67..cf88251 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -109,7 +109,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;
- if (lbs_cmd(priv, CMD_SET_BOOT2_VER, &b2_cmd, NULL, 0))
+ if (lbs_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
lbs_deb_usb("Setting boot2 version failed\n");
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 104/48] libertas: remove some pointless checks for cmdnode buffer being present
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (102 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 103/48] libertas: don't use __lbs_cmd() with empty callback in if_usb.c David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 105/48] libertas: introduce and use lbs_complete_command() for command completion David Woodhouse
` (29 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 00:41:51 -0500
We allocate them all at the same time, at startup. If they go missing,
we have more serious things to worry about, and the resulting oops will
be a perfectly acceptable result.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 16 ++++------------
1 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 4dc6bbe..4ffb84a 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1166,8 +1166,8 @@ void lbs_queue_cmd(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_HOST);
- if (!cmdnode || !cmdnode->cmdbuf) {
- lbs_deb_host("QUEUE_CMD: cmdnode or cmdbuf is NULL\n");
+ if (!cmdnode) {
+ lbs_deb_host("QUEUE_CMD: cmdnode is NULL\n");
goto done;
}
if (!cmdnode->cmdbuf->size) {
@@ -1195,7 +1195,7 @@ void lbs_queue_cmd(struct lbs_private *priv,
spin_unlock_irqrestore(&priv->driver_lock, flags);
lbs_deb_host("QUEUE_CMD: inserted command 0x%04x into cmdpendingq\n",
- le16_to_cpu(cmdnode->cmdbuf->command));
+ le16_to_cpu(cmdnode->cmdbuf->command));
done:
lbs_deb_leave(LBS_DEB_HOST);
@@ -1380,13 +1380,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
lbs_deb_host("PREP_CMD: command 0x%04x\n", cmd_no);
- if (!cmdptr) {
- lbs_deb_host("PREP_CMD: cmdptr is NULL\n");
- lbs_cleanup_and_insert_cmd(priv, cmdnode);
- ret = -1;
- goto done;
- }
-
/* Set sequence number, command and INT option */
priv->seqnum++;
cmdptr->seqnum = cpu_to_le16(priv->seqnum);
@@ -1786,8 +1779,7 @@ static void cleanup_cmdnode(struct cmd_ctrl_node *cmdnode)
cmdnode->callback = NULL;
cmdnode->callback_arg = 0;
- if (cmdnode->cmdbuf != NULL)
- memset(cmdnode->cmdbuf, 0, LBS_CMD_BUFFER_SIZE);
+ memset(cmdnode->cmdbuf, 0, LBS_CMD_BUFFER_SIZE);
lbs_deb_leave(LBS_DEB_HOST);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 105/48] libertas: introduce and use lbs_complete_command() for command completion
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (103 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 104/48] libertas: remove some pointless checks for cmdnode buffer being present David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 106/48] libertas: don't re-initialise cmdnode when taking it off the free queue David Woodhouse
` (28 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 01:52:54 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 25 ++++++++++++++++++-------
drivers/net/wireless/libertas/cmdresp.c | 10 +++-------
drivers/net/wireless/libertas/decl.h | 5 ++---
3 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 4ffb84a..9c73902 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1230,9 +1230,7 @@ static int lbs_submit_command(struct lbs_private *priv,
if (ret) {
lbs_pr_info("DNLD_CMD: hw_host_to_card failed: %d\n", ret);
spin_lock_irqsave(&priv->driver_lock, flags);
- priv->cur_cmd_retcode = ret;
- __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
- priv->cur_cmd = NULL;
+ lbs_complete_command(priv, priv->cur_cmd, ret);
spin_unlock_irqrestore(&priv->driver_lock, flags);
goto done;
}
@@ -1275,8 +1273,8 @@ static int lbs_cmd_mac_control(struct lbs_private *priv,
* This function inserts command node to cmdfreeq
* after cleans it. Requires priv->driver_lock held.
*/
-void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
- struct cmd_ctrl_node *ptempcmd)
+static void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
+ struct cmd_ctrl_node *ptempcmd)
{
if (!ptempcmd)
@@ -1296,6 +1294,15 @@ static void lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
spin_unlock_irqrestore(&priv->driver_lock, flags);
}
+void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
+ int result)
+{
+ if (cmd == priv->cur_cmd)
+ priv->cur_cmd_retcode = result;
+ __lbs_cleanup_and_insert_cmd(priv, cmd);
+ priv->cur_cmd = NULL;
+}
+
int lbs_set_radio_control(struct lbs_private *priv)
{
int ret = 0;
@@ -1901,7 +1908,9 @@ int lbs_execute_next_command(struct lbs_private *priv)
lbs_deb_host(
"EXEC_NEXT_CMD: ignore ENTER_PS cmd\n");
list_del(&cmdnode->list);
- lbs_cleanup_and_insert_cmd(priv, cmdnode);
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ lbs_complete_command(priv, cmdnode, 0);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = 0;
goto done;
@@ -1912,7 +1921,9 @@ int lbs_execute_next_command(struct lbs_private *priv)
lbs_deb_host(
"EXEC_NEXT_CMD: ignore EXIT_PS cmd in sleep\n");
list_del(&cmdnode->list);
- lbs_cleanup_and_insert_cmd(priv, cmdnode);
+ spin_lock_irqsave(&priv->driver_lock, flags);
+ lbs_complete_command(priv, cmdnode, 0);
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
priv->needtowakeup = 1;
ret = 0;
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index a809f8f..89f8316 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -717,8 +717,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
lbs_deb_host("CMD_RESP: PS action 0x%X\n", action);
}
- __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
- priv->cur_cmd = NULL;
+ lbs_complete_command(priv, priv->cur_cmd, result);
spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = 0;
@@ -739,9 +738,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
break;
}
-
- __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
- priv->cur_cmd = NULL;
+ lbs_complete_command(priv, priv->cur_cmd, result);
spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = -1;
@@ -760,8 +757,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
if (priv->cur_cmd) {
/* Clean up and Put current command back to cmdfreeq */
- __lbs_cleanup_and_insert_cmd(priv, priv->cur_cmd);
- priv->cur_cmd = NULL;
+ lbs_complete_command(priv, priv->cur_cmd, result);
}
spin_unlock_irqrestore(&priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 45f081b..5dd5c9e 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -45,9 +45,8 @@ void lbs_get_fwversion(struct lbs_private *priv,
/** The proc fs interface */
int lbs_process_rx_command(struct lbs_private *priv);
-void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
- struct cmd_ctrl_node *ptempcmd);
-
+void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
+ int result);
int lbs_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
int lbs_set_regiontable(struct lbs_private *priv, u8 region, u8 band);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 106/48] libertas: don't re-initialise cmdnode when taking it off the free queue
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (104 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 105/48] libertas: introduce and use lbs_complete_command() for command completion David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 107/48] libertas: kill cleanup_cmdnode() David Woodhouse
` (27 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 01:57:12 -0500
We initialise it when we add it to the queue. No need to do it again.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 9c73902..fd321dd 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1761,9 +1761,6 @@ static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
spin_unlock_irqrestore(&priv->driver_lock, flags);
- if (tempnode)
- cleanup_cmdnode(tempnode);
-
lbs_deb_leave(LBS_DEB_HOST);
return tempnode;
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 107/48] libertas: kill cleanup_cmdnode()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (105 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 106/48] libertas: don't re-initialise cmdnode when taking it off the free queue David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 108/48] libertas: let __lbs_cmd() free its own cmdnode David Woodhouse
` (26 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 02:02:56 -0500
Move the wakeup into lbs_complete_command(), and leave the other bits
in __lbs_cleanup_and_insert_cmd() which was the only caller now anyway.
There are two remaining direct callers of lbs_cleanup_and_insert_cmd(),
and they are both fine without the wakeup.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 39 +++++++++++++++-------------------
1 files changed, 17 insertions(+), 22 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index fd321dd..4c0bd9f 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -13,7 +13,6 @@
#include "wext.h"
#include "cmd.h"
-static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode);
static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
static void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
struct cmd_ctrl_node *ptempnode,
@@ -1274,14 +1273,22 @@ static int lbs_cmd_mac_control(struct lbs_private *priv,
* after cleans it. Requires priv->driver_lock held.
*/
static void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
- struct cmd_ctrl_node *ptempcmd)
+ struct cmd_ctrl_node *cmdnode)
{
+ lbs_deb_enter(LBS_DEB_HOST);
- if (!ptempcmd)
- return;
+ if (!cmdnode)
+ goto out;
- cleanup_cmdnode(ptempcmd);
- list_add_tail(&ptempcmd->list, &priv->cmdfreeq);
+ cmdnode->pdata_buf = NULL;
+ cmdnode->callback = NULL;
+ cmdnode->callback_arg = 0;
+
+ memset(cmdnode->cmdbuf, 0, LBS_CMD_BUFFER_SIZE);
+
+ list_add_tail(&cmdnode->list, &priv->cmdfreeq);
+ out:
+ lbs_deb_leave(LBS_DEB_HOST);
}
static void lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
@@ -1299,6 +1306,10 @@ void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
{
if (cmd == priv->cur_cmd)
priv->cur_cmd_retcode = result;
+
+ cmd->cmdwaitqwoken = 1;
+ wake_up_interruptible(&cmd->cmdwait_q);
+
__lbs_cleanup_and_insert_cmd(priv, cmd);
priv->cur_cmd = NULL;
}
@@ -1771,22 +1782,6 @@ static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv)
* @param ptempnode A pointer to cmdCtrlNode structure
* @return n/a
*/
-static void cleanup_cmdnode(struct cmd_ctrl_node *cmdnode)
-{
- lbs_deb_enter(LBS_DEB_HOST);
-
- if (!cmdnode)
- return;
- cmdnode->cmdwaitqwoken = 1;
- wake_up_interruptible(&cmdnode->cmdwait_q);
- cmdnode->pdata_buf = NULL;
- cmdnode->callback = NULL;
- cmdnode->callback_arg = 0;
-
- memset(cmdnode->cmdbuf, 0, LBS_CMD_BUFFER_SIZE);
-
- lbs_deb_leave(LBS_DEB_HOST);
-}
/**
* @brief This function initializes the command node.
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 108/48] libertas: let __lbs_cmd() free its own cmdnode
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (106 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 107/48] libertas: kill cleanup_cmdnode() David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 109/48] libertas: kill pdata_buf member of struct cmd_ctrl_node David Woodhouse
` (25 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 02:06:16 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 4c0bd9f..e7f07c3 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1310,7 +1310,8 @@ void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
cmd->cmdwaitqwoken = 1;
wake_up_interruptible(&cmd->cmdwait_q);
- __lbs_cleanup_and_insert_cmd(priv, cmd);
+ if (!cmd->callback)
+ __lbs_cleanup_and_insert_cmd(priv, cmd);
priv->cur_cmd = NULL;
}
@@ -2219,6 +2220,7 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
priv->cur_cmd_retcode = 0;
ret = -1;
}
+ __lbs_cleanup_and_insert_cmd(priv, cmdnode);
spin_unlock_irqrestore(&priv->driver_lock, flags);
done:
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 109/48] libertas: kill pdata_buf member of struct cmd_ctrl_node
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (107 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 108/48] libertas: let __lbs_cmd() free its own cmdnode David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 110/48] libertas: store command result in cmdnode instead of priv->cur_cmd_retcode David Woodhouse
` (24 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 02:38:17 -0500
We can use the callback_arg for it; that's the way we're heading anyway...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 4 +---
drivers/net/wireless/libertas/cmdresp.c | 26 +++++++++++++-------------
drivers/net/wireless/libertas/hostcmd.h | 1 -
3 files changed, 14 insertions(+), 17 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index e7f07c3..f2e027b 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1280,7 +1280,6 @@ static void __lbs_cleanup_and_insert_cmd(struct lbs_private *priv,
if (!cmdnode)
goto out;
- cmdnode->pdata_buf = NULL;
cmdnode->callback = NULL;
cmdnode->callback_arg = 0;
@@ -1801,9 +1800,8 @@ static void lbs_set_cmd_ctrl_node(struct lbs_private *priv,
if (!ptempnode)
return;
- ptempnode->pdata_buf = pdata_buf;
ptempnode->callback = NULL;
- ptempnode->callback_arg = 0;
+ ptempnode->callback_arg = (unsigned long)pdata_buf;
lbs_deb_leave(LBS_DEB_HOST);
}
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 89f8316..4c22e78 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -399,13 +399,13 @@ static int lbs_ret_802_11_enable_rsn(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
struct cmd_ds_802_11_enable_rsn *enable_rsn = &resp->params.enbrsn;
- u32 * pdata_buf = priv->cur_cmd->pdata_buf;
+ uint32_t * pdata_buf = (uint32_t *)priv->cur_cmd->callback_arg;
lbs_deb_enter(LBS_DEB_CMD);
if (enable_rsn->action == cpu_to_le16(CMD_ACT_GET)) {
if (pdata_buf)
- *pdata_buf = (u32) le16_to_cpu(enable_rsn->enable);
+ *pdata_buf = (uint32_t) le16_to_cpu(enable_rsn->enable);
}
lbs_deb_leave(LBS_DEB_CMD);
@@ -435,7 +435,7 @@ static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
struct cmd_ds_802_11_subscribe_event *cmd_event =
&resp->params.subscribe_event;
struct cmd_ds_802_11_subscribe_event *dst_event =
- priv->cur_cmd->pdata_buf;
+ (void *)priv->cur_cmd->callback_arg;
lbs_deb_enter(LBS_DEB_CMD);
@@ -505,7 +505,7 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_SET_AFC):
case CMD_RET(CMD_802_11_GET_AFC):
spin_lock_irqsave(&priv->driver_lock, flags);
- memmove(priv->cur_cmd->pdata_buf, &resp->params.afc,
+ memmove((void *)priv->cur_cmd->callback_arg, &resp->params.afc,
sizeof(struct cmd_ds_802_11_afc));
spin_unlock_irqrestore(&priv->driver_lock, flags);
@@ -557,20 +557,20 @@ static inline int handle_cmd_response(struct lbs_private *priv,
break;
case CMD_RET(CMD_802_11_INACTIVITY_TIMEOUT):
spin_lock_irqsave(&priv->driver_lock, flags);
- *((u16 *) priv->cur_cmd->pdata_buf) =
+ *((uint16_t *) priv->cur_cmd->callback_arg) =
le16_to_cpu(resp->params.inactivity_timeout.timeout);
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_802_11_TPC_CFG):
spin_lock_irqsave(&priv->driver_lock, flags);
- memmove(priv->cur_cmd->pdata_buf, &resp->params.tpccfg,
+ memmove((void *)priv->cur_cmd->callback_arg, &resp->params.tpccfg,
sizeof(struct cmd_ds_802_11_tpc_cfg));
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_802_11_LED_GPIO_CTRL):
spin_lock_irqsave(&priv->driver_lock, flags);
- memmove(priv->cur_cmd->pdata_buf, &resp->params.ledgpio,
+ memmove((void *)priv->cur_cmd->callback_arg, &resp->params.ledgpio,
sizeof(struct cmd_ds_802_11_led_ctrl));
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
@@ -580,7 +580,7 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_PWR_CFG):
spin_lock_irqsave(&priv->driver_lock, flags);
- memmove(priv->cur_cmd->pdata_buf, &resp->params.pwrcfg,
+ memmove((void *)priv->cur_cmd->callback_arg, &resp->params.pwrcfg,
sizeof(struct cmd_ds_802_11_pwr_cfg));
spin_unlock_irqrestore(&priv->driver_lock, flags);
@@ -588,21 +588,21 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_GET_TSF):
spin_lock_irqsave(&priv->driver_lock, flags);
- memcpy(priv->cur_cmd->pdata_buf,
+ memcpy((void *)priv->cur_cmd->callback_arg,
&resp->params.gettsf.tsfvalue, sizeof(u64));
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_BT_ACCESS):
spin_lock_irqsave(&priv->driver_lock, flags);
- if (priv->cur_cmd->pdata_buf)
- memcpy(priv->cur_cmd->pdata_buf,
+ if (priv->cur_cmd->callback_arg)
+ memcpy((void *)priv->cur_cmd->callback_arg,
&resp->params.bt.addr1, 2 * ETH_ALEN);
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
case CMD_RET(CMD_FWT_ACCESS):
spin_lock_irqsave(&priv->driver_lock, flags);
- if (priv->cur_cmd->pdata_buf)
- memcpy(priv->cur_cmd->pdata_buf, &resp->params.fwt,
+ if (priv->cur_cmd->callback_arg)
+ memcpy((void *)priv->cur_cmd->callback_arg, &resp->params.fwt,
sizeof(resp->params.fwt));
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 1b31250..719da73 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -75,7 +75,6 @@ struct cmd_header {
struct cmd_ctrl_node {
struct list_head list;
/* command response */
- void *pdata_buf;
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *);
unsigned long callback_arg;
/* command data */
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 110/48] libertas: store command result in cmdnode instead of priv->cur_cmd_retcode
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (108 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 109/48] libertas: kill pdata_buf member of struct cmd_ctrl_node David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 111/48] libertas: add __lbs_cmd_async() for asynchronous command submission David Woodhouse
` (23 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 04:22:52 -0500
... at least for users of __lbs_cmd().
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 12 ++++++------
drivers/net/wireless/libertas/hostcmd.h | 1 +
drivers/net/wireless/libertas/main.c | 1 +
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index f2e027b..c8f1bd5 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1173,6 +1173,7 @@ void lbs_queue_cmd(struct lbs_private *priv,
lbs_deb_host("DNLD_CMD: cmd size is zero\n");
goto done;
}
+ cmdnode->result = 0;
/* Exit_PS command needs to be queued in the header always. */
if (le16_to_cpu(cmdnode->cmdbuf->command) == CMD_802_11_PS_MODE) {
@@ -1306,6 +1307,7 @@ void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
if (cmd == priv->cur_cmd)
priv->cur_cmd_retcode = result;
+ cmd->result = result;
cmd->cmdwaitqwoken = 1;
wake_up_interruptible(&cmd->cmdwait_q);
@@ -2212,12 +2214,10 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
wait_event_interruptible(cmdnode->cmdwait_q, cmdnode->cmdwaitqwoken);
spin_lock_irqsave(&priv->driver_lock, flags);
- if (priv->cur_cmd_retcode) {
- lbs_deb_host("PREP_CMD: command failed with return code %d\n",
- priv->cur_cmd_retcode);
- priv->cur_cmd_retcode = 0;
- ret = -1;
- }
+ ret = cmdnode->result;
+ if (ret)
+ lbs_pr_info("PREP_CMD: command 0x%04x failed: %d\n",
+ command, ret);
__lbs_cleanup_and_insert_cmd(priv, cmdnode);
spin_unlock_irqrestore(&priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 719da73..ea4d484 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -74,6 +74,7 @@ struct cmd_header {
struct cmd_ctrl_node {
struct list_head list;
+ int result;
/* command response */
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *);
unsigned long callback_arg;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 0dc7de6..839ffe8 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1237,6 +1237,7 @@ int lbs_stop_card(struct lbs_private *priv)
/* Flush pending command nodes */
spin_lock_irqsave(&priv->driver_lock, flags);
list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
+ cmdnode->result = -ENOENT;
cmdnode->cmdwaitqwoken = 1;
wake_up_interruptible(&cmdnode->cmdwait_q);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 111/48] libertas: add __lbs_cmd_async() for asynchronous command submission
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (109 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 110/48] libertas: store command result in cmdnode instead of priv->cur_cmd_retcode David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 112/48] libertas: ensure response buffer size is always set for lbs_cmd_with_response David Woodhouse
` (22 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 03:09:33 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 60 +++++++++++++++++-----------------
drivers/net/wireless/libertas/cmd.h | 6 +++
2 files changed, 36 insertions(+), 30 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index c8f1bd5..3079b3f 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -2139,42 +2139,18 @@ int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
}
EXPORT_SYMBOL_GPL(lbs_cmd_copyback);
-/**
- * @brief Simple way to call firmware functions
- *
- * @param priv A pointer to struct lbs_private structure
- * @param psmode one of the many CMD_802_11_xxxx
- * @param cmd pointer to the parameters structure for above command
- * (this should not include the command, size, sequence
- * and result fields from struct cmd_ds_gen)
- * @param cmd_size size structure pointed to by cmd
- * @param rsp pointer to an area where the result should be placed
- * @param rsp_size pointer to the size of the rsp area. If the firmware
- * returns fewer bytes, then this *rsp_size will be
- * changed to the actual size.
- * @return -1 in case of a higher level error, otherwise
- * the result code from the firmware
- */
-int __lbs_cmd(struct lbs_private *priv, uint16_t command,
- struct cmd_header *in_cmd, int in_cmd_size,
- int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
- unsigned long callback_arg)
+struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv, uint16_t command,
+ struct cmd_header *in_cmd, int in_cmd_size,
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
+ unsigned long callback_arg)
{
struct cmd_ctrl_node *cmdnode;
- unsigned long flags;
- int ret = 0;
lbs_deb_enter(LBS_DEB_HOST);
- if (!priv) {
- lbs_deb_host("PREP_CMD: priv is NULL\n");
- ret = -1;
- goto done;
- }
-
if (priv->surpriseremoved) {
lbs_deb_host("PREP_CMD: card removed\n");
- ret = -1;
+ cmdnode = ERR_PTR(-ENOENT);
goto done;
}
@@ -2184,7 +2160,7 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
/* Wake up main thread to execute next command */
wake_up_interruptible(&priv->waitq);
- ret = -1;
+ cmdnode = ERR_PTR(-ENOBUFS);
goto done;
}
@@ -2210,6 +2186,29 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
lbs_queue_cmd(priv, cmdnode, 1);
wake_up_interruptible(&priv->waitq);
+ done:
+ lbs_deb_leave_args(LBS_DEB_HOST, "ret %p", cmdnode);
+ return cmdnode;
+}
+
+int __lbs_cmd(struct lbs_private *priv, uint16_t command,
+ struct cmd_header *in_cmd, int in_cmd_size,
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
+ unsigned long callback_arg)
+{
+ struct cmd_ctrl_node *cmdnode;
+ unsigned long flags;
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_HOST);
+
+ cmdnode = __lbs_cmd_async(priv, command, in_cmd, in_cmd_size,
+ callback, callback_arg);
+ if (IS_ERR(cmdnode)) {
+ ret = PTR_ERR(cmdnode);
+ goto done;
+ }
+
might_sleep();
wait_event_interruptible(cmdnode->cmdwait_q, cmdnode->cmdwaitqwoken);
@@ -2218,6 +2217,7 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
if (ret)
lbs_pr_info("PREP_CMD: command 0x%04x failed: %d\n",
command, ret);
+
__lbs_cleanup_and_insert_cmd(priv, cmdnode);
spin_unlock_irqrestore(&priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 999fabe..2f4c1ec 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -12,6 +12,12 @@
#define lbs_cmd_with_response(priv, cmdnr, cmd) \
lbs_cmd(priv, cmdnr, cmd, lbs_cmd_copyback, (unsigned long) (cmd))
+/* __lbs_cmd() will free the cmdnode and return success/failure.
+ __lbs_cmd_async() requires that the callback free the cmdnode */
+struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv, uint16_t command,
+ struct cmd_header *in_cmd, int in_cmd_size,
+ int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
+ unsigned long callback_arg);
int __lbs_cmd(struct lbs_private *priv, uint16_t command,
struct cmd_header *in_cmd, int in_cmd_size,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 112/48] libertas: ensure response buffer size is always set for lbs_cmd_with_response
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (110 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 111/48] libertas: add __lbs_cmd_async() for asynchronous command submission David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 113/48] libertas: handle command timeout in main thread instead of directly in timer David Woodhouse
` (21 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 03:46:44 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 4 +++-
drivers/net/wireless/libertas/cmd.h | 4 ++++
drivers/net/wireless/libertas/if_usb.c | 1 +
3 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 3079b3f..c3d7f60 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -115,6 +115,7 @@ int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria)
struct cmd_ds_host_sleep cmd_config;
int ret;
+ cmd_config.hdr.size = cpu_to_le16(sizeof(cmd_config));
cmd_config.criteria = cpu_to_le32(criteria);
cmd_config.gpio = priv->wol_gpio;
cmd_config.gap = priv->wol_gap;
@@ -1101,7 +1102,7 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,
lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action);
cmd->hdr.command = cpu_to_le16(CMD_MESH_ACCESS);
- cmd->hdr.size = cpu_to_le16(sizeof(struct cmd_ds_mesh_access) + S_DS_GEN);
+ cmd->hdr.size = cpu_to_le16(sizeof(*cmd));
cmd->hdr.result = 0;
cmd->action = cpu_to_le16(cmd_action);
@@ -1121,6 +1122,7 @@ int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan)
cmd.action = cpu_to_le16(enable);
cmd.channel = cpu_to_le16(chan);
cmd.type = cpu_to_le16(priv->mesh_tlv);
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
if (enable) {
cmd.length = cpu_to_le16(priv->mesh_ssid_len);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 2f4c1ec..e334f0e 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -9,6 +9,10 @@
#define lbs_cmd(priv, cmdnr, cmd, cb, cb_arg) \
__lbs_cmd(priv, cmdnr, &(cmd)->hdr, sizeof(*(cmd)), cb, cb_arg)
+
+/* lbs_cmd_with_response() infers the size of the command to be _sent_
+ and requires that the caller sets cmd->size to the (LE) size of
+ the _response_ buffer. */
#define lbs_cmd_with_response(priv, cmdnr, cmd) \
lbs_cmd(priv, cmdnr, cmd, lbs_cmd_copyback, (unsigned long) (cmd))
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index cf88251..8bc23b3 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -106,6 +106,7 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
{
struct cmd_ds_set_boot2_ver b2_cmd;
+ b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
b2_cmd.action = 0;
b2_cmd.version = priv->boot2_version;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 113/48] libertas: handle command timeout in main thread instead of directly in timer
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (111 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 112/48] libertas: ensure response buffer size is always set for lbs_cmd_with_response David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 114/48] libertas: kill 'addtail' argument to lbs_queue_cmd() and make it static David Woodhouse
` (20 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 19:33:43 -0500
And handle the case where it times out more than once, too, instead of
locking up for ever.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 6 +++
drivers/net/wireless/libertas/dev.h | 2 +
drivers/net/wireless/libertas/main.c | 52 ++++++++++++++++++-------------
3 files changed, 38 insertions(+), 22 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 4c22e78..ef63c37 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -667,6 +667,12 @@ int lbs_process_rx_command(struct lbs_private *priv)
/* Now we got response from FW, cancel the command timer */
del_timer(&priv->command_timer);
+ priv->cmd_timed_out = 0;
+ if (priv->nr_retries) {
+ lbs_pr_info("Received result %x to command %x after %d retries\n",
+ result, curcmd, priv->nr_retries);
+ priv->nr_retries = 0;
+ }
/* Store the response code to cur_cmd_retcode. */
priv->cur_cmd_retcode = result;
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index e6f553d..465080f 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -201,6 +201,8 @@ struct lbs_private {
/** Timers */
struct timer_list command_timer;
+ int nr_retries;
+ int cmd_timed_out;
u8 hisregcpy;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 839ffe8..9677b0d 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -670,6 +670,8 @@ static int lbs_thread(void *data)
shouldsleep = 1; /* Sleep mode. Nothing we can do till it wakes */
else if (priv->intcounter)
shouldsleep = 0; /* Interrupt pending. Deal with it now */
+ else if (priv->cmd_timed_out)
+ shouldsleep = 0; /* Command timed out. Recover */
else if (!priv->fw_ready)
shouldsleep = 1; /* Firmware not ready. We're waiting for it */
else if (priv->dnld_sent)
@@ -740,6 +742,26 @@ static int lbs_thread(void *data)
spin_lock_irq(&priv->driver_lock);
}
+ if (priv->cmd_timed_out && priv->cur_cmd) {
+ struct cmd_ctrl_node *cmdnode = priv->cur_cmd;
+
+ if (++priv->nr_retries > 10) {
+ lbs_pr_info("Excessive timeouts submitting command %x\n",
+ le16_to_cpu(cmdnode->cmdbuf->command));
+ lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
+ priv->nr_retries = 0;
+ } else {
+ priv->cur_cmd = NULL;
+ lbs_pr_info("requeueing command %x due to timeout (#%d)\n",
+ le16_to_cpu(cmdnode->cmdbuf->command), priv->nr_retries);
+
+ /* Stick it back at the _top_ of the pending queue
+ for immediate resubmission */
+ list_add(&cmdnode->list, &priv->cmdpendingq);
+ }
+ }
+ priv->cmd_timed_out = 0;
+
/* Any Card Event */
if (priv->hisregcpy & MRVDRV_CARDEVENT) {
lbs_deb_thread("main-thread: Card Event Activity\n");
@@ -922,35 +944,21 @@ done:
static void command_timer_fn(unsigned long data)
{
struct lbs_private *priv = (struct lbs_private *)data;
- struct cmd_ctrl_node *node;
unsigned long flags;
- node = priv->cur_cmd;
- if (node == NULL) {
- lbs_deb_fw("ptempnode empty\n");
- return;
- }
+ spin_lock_irqsave(&priv->driver_lock, flags);
- if (!node->cmdbuf) {
- lbs_deb_fw("cmd is NULL\n");
- return;
+ if (!priv->cur_cmd) {
+ lbs_pr_info("Command timer expired; no pending command\n");
+ goto out;
}
- lbs_pr_info("command %x timed out\n", le16_to_cpu(node->cmdbuf->command));
-
- if (!priv->fw_ready)
- return;
-
- spin_lock_irqsave(&priv->driver_lock, flags);
- priv->cur_cmd = NULL;
- spin_unlock_irqrestore(&priv->driver_lock, flags);
-
- lbs_deb_fw("re-sending same command because of timeout\n");
- lbs_queue_cmd(priv, node, 0);
+ lbs_pr_info("Command %x timed out\n", le16_to_cpu(priv->cur_cmd->cmdbuf->command));
+ priv->cmd_timed_out = 1;
wake_up_interruptible(&priv->waitq);
-
- return;
+ out:
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
}
static int lbs_init_adapter(struct lbs_private *priv)
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 114/48] libertas: kill 'addtail' argument to lbs_queue_cmd() and make it static
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (112 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 113/48] libertas: handle command timeout in main thread instead of directly in timer David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-16 22:59 ` [PATCH 115/48] libertas: fix return from lbs_update_channel() David Woodhouse
` (19 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sat, 15 Dec 2007 20:04:54 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 14 +++++---------
drivers/net/wireless/libertas/decl.h | 4 ----
2 files changed, 5 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index c3d7f60..7682b9d 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1155,15 +1155,11 @@ static int lbs_cmd_bcn_ctrl(struct lbs_private * priv,
return 0;
}
-/*
- * Note: NEVER use lbs_queue_cmd() with addtail==0 other than for
- * the command timer, because it does not account for queued commands.
- */
-void lbs_queue_cmd(struct lbs_private *priv,
- struct cmd_ctrl_node *cmdnode,
- u8 addtail)
+static void lbs_queue_cmd(struct lbs_private *priv,
+ struct cmd_ctrl_node *cmdnode)
{
unsigned long flags;
+ int addtail = 1;
lbs_deb_enter(LBS_DEB_HOST);
@@ -1635,7 +1631,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
cmdnode->cmdwaitqwoken = 0;
- lbs_queue_cmd(priv, cmdnode, 1);
+ lbs_queue_cmd(priv, cmdnode);
wake_up_interruptible(&priv->waitq);
if (wait_option & CMD_OPTION_WAITFORRSP) {
@@ -2185,7 +2181,7 @@ struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv, uint16_t command
* because the caller of lbs_cmd() sets up all of *cmd for us. */
cmdnode->cmdwaitqwoken = 0;
- lbs_queue_cmd(priv, cmdnode, 1);
+ lbs_queue_cmd(priv, cmdnode);
wake_up_interruptible(&priv->waitq);
done:
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 5dd5c9e..aaacd9b 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -28,10 +28,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
u16 cmd_action,
u16 wait_option, u32 cmd_oid, void *pdata_buf);
-void lbs_queue_cmd(struct lbs_private *priv,
- struct cmd_ctrl_node *cmdnode,
- u8 addtail);
-
int lbs_allocate_cmd_buffer(struct lbs_private *priv);
int lbs_execute_next_command(struct lbs_private *priv);
int lbs_process_event(struct lbs_private *priv);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 115/48] libertas: fix return from lbs_update_channel()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (113 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 114/48] libertas: kill 'addtail' argument to lbs_queue_cmd() and make it static David Woodhouse
@ 2007-12-16 22:59 ` David Woodhouse
2007-12-19 15:31 ` [PATCH 116/48] libertas: add SLEEP_PERIOD and FW_WAKE_METHOD command definitions David Woodhouse
` (18 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-16 22:59 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 16 Dec 2007 17:21:00 -0500
If we return the channel number in a 'ret' variable where anything
non-zero is later interpreted as an error, that isn't nice. It breaks
WPA, for a start. OLPC trac #5485
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index cd8e043..882e51c 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -167,13 +167,14 @@ int lbs_update_channel(struct lbs_private *priv)
{
int ret;
- /* the channel in f/w could be out of sync, get the current channel */
+ /* the channel in f/w could be out of sync; get the current channel */
lbs_deb_enter(LBS_DEB_ASSOC);
ret = lbs_get_channel(priv);
- if (ret > 0)
- priv->curbssparams.channel = (u8) ret;
-
+ if (ret > 0) {
+ priv->curbssparams.channel = ret;
+ ret = 0;
+ }
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
return ret;
}
@@ -197,8 +198,9 @@ static int assoc_helper_channel(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_ASSOC);
ret = lbs_update_channel(priv);
- if (ret < 0) {
+ if (ret) {
lbs_deb_assoc("ASSOC: channel: error getting channel.\n");
+ goto done;
}
if (assoc_req->channel == priv->curbssparams.channel)
@@ -222,8 +224,10 @@ static int assoc_helper_channel(struct lbs_private *priv,
* it since the firmware is supposed to return the new channel, but
* whatever... */
ret = lbs_update_channel(priv);
- if (ret < 0)
+ if (ret) {
lbs_deb_assoc("ASSOC: channel: error getting channel.\n");
+ goto done;
+ }
if (assoc_req->channel != priv->curbssparams.channel) {
lbs_deb_assoc("ASSOC: channel: failed to update channel to %d\n",
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 116/48] libertas: add SLEEP_PERIOD and FW_WAKE_METHOD command definitions
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (114 preceding siblings ...)
2007-12-16 22:59 ` [PATCH 115/48] libertas: fix return from lbs_update_channel() David Woodhouse
@ 2007-12-19 15:31 ` David Woodhouse
2007-12-19 15:31 ` [PATCH 117/48] libertas: fix buffer handling of PS_MODE commands and responses David Woodhouse
` (17 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:31 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 16 Dec 2007 21:43:40 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/host.h | 2 ++
drivers/net/wireless/libertas/hostcmd.h | 14 ++++++++++++++
2 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index fe00081..bdf9017 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -84,8 +84,10 @@
#define CMD_802_11_KEY_MATERIAL 0x005e
#define CMD_802_11_SLEEP_PARAMS 0x0066
#define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
+#define CMD_802_11_SLEEP_PERIOD 0x0068
#define CMD_802_11_TPC_CFG 0x0072
#define CMD_802_11_PWR_CFG 0x0073
+#define CMD_802_11_FW_WAKE_METHOD 0x0074
#define CMD_802_11_SUBSCRIBE_EVENT 0x0075
#define CMD_802_11_RATE_ADAPT_RATESET 0x0076
#define CMD_802_11_TX_RATE_QUERY 0x007f
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index ea4d484..b38502f 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -439,6 +439,20 @@ struct cmd_ds_set_boot2_ver {
__le16 version;
};
+struct cmd_ds_802_11_fw_wake_method {
+ struct cmd_header hdr;
+
+ __le16 action;
+ __le16 method;
+};
+
+struct cmd_ds_802_11_sleep_period {
+ struct cmd_header hdr;
+
+ __le16 action;
+ __le16 period;
+};
+
struct cmd_ds_802_11_ps_mode {
__le16 action;
__le16 nullpktinterval;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 117/48] libertas: fix buffer handling of PS_MODE commands and responses
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (115 preceding siblings ...)
2007-12-19 15:31 ` [PATCH 116/48] libertas: add SLEEP_PERIOD and FW_WAKE_METHOD command definitions David Woodhouse
@ 2007-12-19 15:31 ` David Woodhouse
2007-12-19 15:32 ` [PATCH 118/48] libertas: don't clear priv->dnld_sent after sending sleep confirm David Woodhouse
` (16 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:31 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Sun, 16 Dec 2007 23:26:54 -0500
Commit 5b8845345e7385d2eb37fac22ba9ab6905988be5 (or, in case the git
workflow is broken and patches get recommitted, the commit entitled
'libertas: rename and re-type bufvirtualaddr to cmdbuf' by dcbw),
introduced a number of bugs where we once had a pointer to a command
_payload_, but now we use the pointer to the command header instead.
The fix isn't wonderfully pretty for now, but it'll get better when we
finish converting all commands so the structures include the header.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 4 ++--
drivers/net/wireless/libertas/cmdresp.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 7682b9d..2765b9c 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1175,7 +1175,7 @@ static void lbs_queue_cmd(struct lbs_private *priv,
/* Exit_PS command needs to be queued in the header always. */
if (le16_to_cpu(cmdnode->cmdbuf->command) == CMD_802_11_PS_MODE) {
- struct cmd_ds_802_11_ps_mode *psm = (void *) cmdnode->cmdbuf;
+ struct cmd_ds_802_11_ps_mode *psm = (void *) &cmdnode->cmdbuf[1];
if (psm->action == cpu_to_le16(CMD_SUBCMD_EXIT_PS)) {
if (priv->psstate != PS_STATE_FULL_POWER)
@@ -1889,7 +1889,7 @@ int lbs_execute_next_command(struct lbs_private *priv)
* PS command. Ignore it if it is not Exit_PS.
* otherwise send it down immediately.
*/
- struct cmd_ds_802_11_ps_mode *psm = (void *)cmd;
+ struct cmd_ds_802_11_ps_mode *psm = (void *)&cmd[1];
lbs_deb_host(
"EXEC_NEXT_CMD: PS cmd, action 0x%02x\n",
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index ef63c37..c05fef0 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -678,7 +678,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
priv->cur_cmd_retcode = result;
if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {
- struct cmd_ds_802_11_ps_mode *psmode = (void *) resp;
+ struct cmd_ds_802_11_ps_mode *psmode = (void *) &resp[1];
u16 action = le16_to_cpu(psmode->action);
lbs_deb_host(
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 118/48] libertas: don't clear priv->dnld_sent after sending sleep confirm
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (116 preceding siblings ...)
2007-12-19 15:31 ` [PATCH 117/48] libertas: fix buffer handling of PS_MODE commands and responses David Woodhouse
@ 2007-12-19 15:32 ` David Woodhouse
2007-12-19 15:32 ` [PATCH 119/48] libertas: handle HOST_AWAKE event by sending WAKEUP_CONFIRM command David Woodhouse
` (15 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:32 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 12:35:28 -0500
DNLD_RES_RECEIVED is a bit of a misnomer -- we never wait for the result
to be received; it's purely representing the state of the TX path, and
in this case the TX path is definitely busy.
Of course, that means that we don't actually care about DATA_SENT vs.
CMD_SENT either, but that's a can of worms for another day...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 2765b9c..10c60ba 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -2000,7 +2000,6 @@ static int sendconfirmsleep(struct lbs_private *priv, u8 *cmdptr, u16 size)
lbs_deb_hex(LBS_DEB_HOST, "sleep confirm command", cmdptr, size);
ret = priv->hw_host_to_card(priv, MVMS_CMD, cmdptr, size);
- priv->dnld_sent = DNLD_RES_RECEIVED;
spin_lock_irqsave(&priv->driver_lock, flags);
if (priv->intcounter || priv->currenttxskb)
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 119/48] libertas: handle HOST_AWAKE event by sending WAKEUP_CONFIRM command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (117 preceding siblings ...)
2007-12-19 15:32 ` [PATCH 118/48] libertas: don't clear priv->dnld_sent after sending sleep confirm David Woodhouse
@ 2007-12-19 15:32 ` David Woodhouse
2007-12-19 15:32 ` [PATCH 120/48] libertas: allow for PS mode to be disabled when firmware doesn't support it David Woodhouse
` (14 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:32 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 13:26:42 -0500
lbs_send_confirmwake() is a bit ugly but matches the way we confirm
sleep. We'll deal with that whole thing later.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 30 +++++++++++++++++++++++++++++-
drivers/net/wireless/libertas/dev.h | 1 +
drivers/net/wireless/libertas/host.h | 1 +
3 files changed, 31 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index c05fef0..8f9eda4 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -773,6 +773,30 @@ done:
return ret;
}
+static int lbs_send_confirmwake(struct lbs_private *priv)
+{
+ struct cmd_header *cmd = &priv->lbs_ps_confirm_wake;
+ int ret = 0;
+
+ lbs_deb_enter(LBS_DEB_HOST);
+
+ cmd->command = cpu_to_le16(CMD_802_11_WAKEUP_CONFIRM);
+ cmd->size = cpu_to_le16(sizeof(*cmd));
+ cmd->seqnum = cpu_to_le16(++priv->seqnum);
+ cmd->result = 0;
+
+ lbs_deb_host("SEND_WAKEC_CMD: before download\n");
+
+ lbs_deb_hex(LBS_DEB_HOST, "wake confirm command", (void *)cmd, sizeof(*cmd));
+
+ ret = priv->hw_host_to_card(priv, MVMS_CMD, (void *)cmd, sizeof(*cmd));
+ if (ret)
+ lbs_pr_alert("SEND_WAKEC_CMD: Host to Card failed for Confirm Wake\n");
+
+ lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
+ return ret;
+}
+
int lbs_process_event(struct lbs_private *priv)
{
int ret = 0;
@@ -821,9 +845,13 @@ int lbs_process_event(struct lbs_private *priv)
break;
+ case MACREG_INT_CODE_HOST_AWAKE:
+ lbs_deb_cmd("EVENT: HOST_AWAKE\n");
+ lbs_send_confirmwake(priv);
+ break;
+
case MACREG_INT_CODE_PS_AWAKE:
lbs_deb_cmd("EVENT: awake\n");
-
/* handle unexpected PS AWAKE event */
if (priv->psstate == PS_STATE_FULL_POWER) {
lbs_deb_cmd(
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 465080f..fe50457 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -263,6 +263,7 @@ struct lbs_private {
u8 needtowakeup;
struct PS_CMD_ConfirmSleep lbs_ps_confirm_sleep;
+ struct cmd_header lbs_ps_confirm_wake;
struct assoc_request * pending_assoc_req;
struct assoc_request * in_progress_assoc_req;
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index bdf9017..4c03e12 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -74,6 +74,7 @@
#define CMD_802_11_GET_AFC 0x003d
#define CMD_802_11_AD_HOC_STOP 0x0040
#define CMD_802_11_HOST_SLEEP_CFG 0x0043
+#define CMD_802_11_WAKEUP_CONFIRM 0x0044
#define CMD_802_11_HOST_SLEEP_ACTIVATE 0x0045
#define CMD_802_11_BEACON_STOP 0x0049
#define CMD_802_11_MAC_ADDRESS 0x004d
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 120/48] libertas: allow for PS mode to be disabled when firmware doesn't support it
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (118 preceding siblings ...)
2007-12-19 15:32 ` [PATCH 119/48] libertas: handle HOST_AWAKE event by sending WAKEUP_CONFIRM command David Woodhouse
@ 2007-12-19 15:32 ` David Woodhouse
2007-12-19 15:32 ` [PATCH 121/48] libertas: Check for PS mode support on USB devices David Woodhouse
` (13 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:32 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 14:41:13 -0500
Otherwise, we go into an endless busy loop trying to enable PS mode when
the command queue is empty, dealing with the error response, and then
trying to enable PS mode again because the command queue is empty.... it
doesn't really save much power.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/dev.h | 1 +
drivers/net/wireless/libertas/host.h | 5 +++++
drivers/net/wireless/libertas/wext.c | 7 +++++++
3 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index fe50457..1c6ec4d 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -260,6 +260,7 @@ struct lbs_private {
u16 psmode; /* Wlan802_11PowermodeCAM=disable
Wlan802_11PowermodeMAX_PSP=enable */
u32 psstate;
+ char ps_supported;
u8 needtowakeup;
struct PS_CMD_ConfirmSleep lbs_ps_confirm_sleep;
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index 4c03e12..1aa0407 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -209,6 +209,11 @@
#define CMD_TYPE_MAX_PSP 0x0001
#define CMD_TYPE_FAST_PSP 0x0002
+/* Options for CMD_802_11_FW_WAKE_METHOD */
+#define CMD_WAKE_METHOD_UNCHANGED 0x0000
+#define CMD_WAKE_METHOD_COMMAND_INT 0x0001
+#define CMD_WAKE_METHOD_GPIO 0x0002
+
/* Define action or option for CMD_BT_ACCESS */
enum cmd_bt_access_opts {
/* The bt commands start at 5 instead of 1 because the old dft commands
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index b1e2472..3e8d555 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -734,6 +734,13 @@ static int lbs_set_power(struct net_device *dev, struct iw_request_info *info,
lbs_deb_enter(LBS_DEB_WEXT);
+ if (!priv->ps_supported) {
+ if (vwrq->disabled)
+ return 0;
+ else
+ return -EINVAL;
+ }
+
/* PS is currently supported only in Infrastructure mode
* Remove this check if it is to be supported in IBSS mode also
*/
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 121/48] libertas: Check for PS mode support on USB devices
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (119 preceding siblings ...)
2007-12-19 15:32 ` [PATCH 120/48] libertas: allow for PS mode to be disabled when firmware doesn't support it David Woodhouse
@ 2007-12-19 15:32 ` David Woodhouse
2007-12-19 15:32 ` [PATCH 122/48] libertas: reduce explicit references to priv->cur_cmd->cmdbuf David Woodhouse
` (12 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:32 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 14:42:33 -0500
Move the various firmware setup bits into a separate function, which
used to do just boot2 version.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/if_usb.c | 28 ++++++++++++++++++++++------
1 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 8bc23b3..3931fe6 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -102,9 +102,10 @@ static void if_usb_free(struct if_usb_card *cardp)
lbs_deb_leave(LBS_DEB_USB);
}
-static void if_usb_set_boot2_ver(struct lbs_private *priv)
+static void if_usb_setup_firmware(struct lbs_private *priv)
{
struct cmd_ds_set_boot2_ver b2_cmd;
+ struct cmd_ds_802_11_fw_wake_method wake_method;
b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
b2_cmd.action = 0;
@@ -112,6 +113,25 @@ static void if_usb_set_boot2_ver(struct lbs_private *priv)
if (lbs_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
lbs_deb_usb("Setting boot2 version failed\n");
+
+ priv->wol_gpio = 2; /* Wake via GPIO2... */
+ priv->wol_gap = 20; /* ... after 20ms */
+ lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA);
+
+ wake_method.hdr.size = cpu_to_le16(sizeof(wake_method));
+ wake_method.action = cpu_to_le16(CMD_ACT_GET);
+ if (lbs_cmd_with_response(priv, CMD_802_11_FW_WAKE_METHOD, &wake_method)) {
+ lbs_pr_info("Firmware does not seem to support PS mode\n");
+ } else {
+ if (le16_to_cpu(wake_method.method) == CMD_WAKE_METHOD_COMMAND_INT) {
+ lbs_deb_usb("Firmware seems to support PS with wake-via-command\n");
+ priv->ps_supported = 1;
+ } else {
+ /* The versions which boot up this way don't seem to
+ work even if we set it to the command interrupt */
+ lbs_pr_info("Firmware doesn't wake via command interrupt; disabling PS mode\n");
+ }
+ }
}
static void if_usb_fw_timeo(unsigned long priv)
@@ -221,11 +241,7 @@ static int if_usb_probe(struct usb_interface *intf,
if (lbs_start_card(priv))
goto err_start_card;
- if_usb_set_boot2_ver(priv);
-
- priv->wol_gpio = 2; /* Wake via GPIO2... */
- priv->wol_gap = 20; /* ... after 20ms */
- lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA);
+ if_usb_setup_firmware(priv);
usb_get_dev(udev);
usb_set_intfdata(intf, cardp);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 122/48] libertas: reduce explicit references to priv->cur_cmd->cmdbuf
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (120 preceding siblings ...)
2007-12-19 15:32 ` [PATCH 121/48] libertas: Check for PS mode support on USB devices David Woodhouse
@ 2007-12-19 15:32 ` David Woodhouse
2007-12-19 15:32 ` [PATCH 123/48] libertas: use priv->upld_buf for command responses David Woodhouse
` (11 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:32 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 15:12:49 -0500
We have a local variable 'resp' which we use for this. So use it,
instead of typing the whole thing.
In preparation for actually using priv->upld_buf for the responses
instead...
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 8f9eda4..d305e98 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -639,10 +639,10 @@ int lbs_process_rx_command(struct lbs_private *priv)
goto done;
}
- curcmd = le16_to_cpu(priv->cur_cmd->cmdbuf->command);
-
resp = priv->cur_cmd->cmdbuf;
+ curcmd = le16_to_cpu(resp->command);
+
respcmd = le16_to_cpu(resp->command);
result = le16_to_cpu(resp->result);
@@ -650,9 +650,9 @@ int lbs_process_rx_command(struct lbs_private *priv)
respcmd, le16_to_cpu(resp->seqnum), priv->upld_len, jiffies);
lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", (void *) resp, priv->upld_len);
- if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) {
+ if (resp->seqnum != resp->seqnum) {
lbs_pr_info("Received CMD_RESP with invalid sequence %d (expected %d)\n",
- le16_to_cpu(resp->seqnum), le16_to_cpu(priv->cur_cmd->cmdbuf->seqnum));
+ le16_to_cpu(resp->seqnum), le16_to_cpu(resp->seqnum));
spin_unlock_irqrestore(&priv->driver_lock, flags);
ret = -1;
goto done;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 123/48] libertas: use priv->upld_buf for command responses
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (121 preceding siblings ...)
2007-12-19 15:32 ` [PATCH 122/48] libertas: reduce explicit references to priv->cur_cmd->cmdbuf David Woodhouse
@ 2007-12-19 15:32 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 124/48] libertas: discard DEFER responses to commands; let the timeout trigger David Woodhouse
` (10 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:32 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 15:22:43 -0500
If we don't scribble over the command we sent, then we can retry it when
the firmware responds with 0x0004 (which means -EAGAIN).
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 2 +-
drivers/net/wireless/libertas/if_cs.c | 10 +---------
drivers/net/wireless/libertas/if_sdio.c | 8 +-------
drivers/net/wireless/libertas/if_usb.c | 14 +-------------
4 files changed, 4 insertions(+), 30 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index d305e98..4d38461 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -639,7 +639,7 @@ int lbs_process_rx_command(struct lbs_private *priv)
goto done;
}
- resp = priv->cur_cmd->cmdbuf;
+ resp = (void *)priv->upld_buf;
curcmd = le16_to_cpu(resp->command);
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 5814363..4b5ab9a 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -647,7 +647,6 @@ static int if_cs_get_int_status(struct lbs_private *priv, u8 *ireg)
struct if_cs_card *card = (struct if_cs_card *)priv->card;
int ret = 0;
u16 int_cause;
- u8 *cmdbuf;
*ireg = 0;
lbs_deb_enter(LBS_DEB_CS);
@@ -679,14 +678,7 @@ sbi_get_int_status_exit:
/* Card has a command result for us */
if (*ireg & IF_CS_C_S_CMD_UPLD_RDY) {
spin_lock(&priv->driver_lock);
- if (!priv->cur_cmd) {
- cmdbuf = priv->upld_buf;
- priv->hisregcpy &= ~IF_CS_C_S_RX_UPLD_RDY;
- } else {
- cmdbuf = (u8 *) priv->cur_cmd->cmdbuf;
- }
-
- ret = if_cs_receive_cmdres(priv, cmdbuf, &priv->upld_len);
+ ret = if_cs_receive_cmdres(priv, priv->upld_buf, &priv->upld_len);
spin_unlock(&priv->driver_lock);
if (ret < 0)
lbs_pr_err("could not receive cmd from card\n");
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index b24584d..5a828c7 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -136,12 +136,6 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,
spin_lock_irqsave(&card->priv->driver_lock, flags);
- if (!card->priv->cur_cmd) {
- lbs_deb_sdio("discarding spurious response\n");
- ret = 0;
- goto out;
- }
-
if (size > LBS_CMD_BUFFER_SIZE) {
lbs_deb_sdio("response packet too large (%d bytes)\n",
(int)size);
@@ -149,7 +143,7 @@ static int if_sdio_handle_cmd(struct if_sdio_card *card,
goto out;
}
- memcpy(card->priv->cur_cmd->cmdbuf, buffer, size);
+ memcpy(card->priv->upld_buf, buffer, size);
card->priv->upld_len = size;
card->int_cause |= MRVDRV_CMD_UPLD_RDY;
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 3931fe6..7db8e6c 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -589,8 +589,6 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
struct if_usb_card *cardp,
struct lbs_private *priv)
{
- uint8_t *cmdbuf;
-
if (recvlength > LBS_CMD_BUFFER_SIZE) {
lbs_deb_usbd(&cardp->udev->dev,
"The receive buffer is too large\n");
@@ -602,19 +600,9 @@ static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
BUG();
spin_lock(&priv->driver_lock);
- /* take care of cur_cmd = NULL case by reading the
- * data to clear the interrupt */
- if (!priv->cur_cmd) {
- lbs_deb_hex(LBS_DEB_HOST, "Unsolicited CMD_RESP",
- (void *) recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
- cmdbuf = priv->upld_buf;
- priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
- } else
- cmdbuf = (uint8_t *) priv->cur_cmd->cmdbuf;
-
cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
- memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
+ memcpy(priv->upld_buf, recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
kfree_skb(skb);
lbs_interrupt(priv);
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 124/48] libertas: discard DEFER responses to commands; let the timeout trigger
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (122 preceding siblings ...)
2007-12-19 15:32 ` [PATCH 123/48] libertas: use priv->upld_buf for command responses David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 125/48] libertas: make lbs_submit_command always 'succeed' and set command timer David Woodhouse
` (9 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 15:41:30 -0500
When the firmware returns 0x0004, it wants us to try again later. We can
achieve that simply by throwing out the response and letting the command
timeout code kick in.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmdresp.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 4d38461..0cd9662 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -665,6 +665,16 @@ int lbs_process_rx_command(struct lbs_private *priv)
goto done;
}
+ if (resp->result == cpu_to_le16(0x0004)) {
+ /* 0x0004 means -EAGAIN. Drop the response, let it time out
+ and be resubmitted */
+ lbs_pr_info("Firmware returns DEFER to command %x. Will let it time out...\n",
+ le16_to_cpu(resp->command));
+ spin_unlock_irqrestore(&priv->driver_lock, flags);
+ ret = -1;
+ goto done;
+ }
+
/* Now we got response from FW, cancel the command timer */
del_timer(&priv->command_timer);
priv->cmd_timed_out = 0;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 125/48] libertas: make lbs_submit_command always 'succeed' and set command timer
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (123 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 124/48] libertas: discard DEFER responses to commands; let the timeout trigger David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 126/48] libertas: submit RSSI command on tx timeout, to check whether module is dead David Woodhouse
` (8 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 16:03:58 -0500
Even if it fails, we want to wait a while and try again, with an
ultimate timeout if it the condition persists. So again, just use the
standard command timeout behaviour.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 42 ++++++++++++++++------------------
1 files changed, 20 insertions(+), 22 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 10c60ba..0ae9851 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1199,14 +1199,15 @@ done:
lbs_deb_leave(LBS_DEB_HOST);
}
-static int lbs_submit_command(struct lbs_private *priv,
- struct cmd_ctrl_node *cmdnode)
+static void lbs_submit_command(struct lbs_private *priv,
+ struct cmd_ctrl_node *cmdnode)
{
unsigned long flags;
struct cmd_header *cmd;
- int ret = -1;
- u16 cmdsize;
- u16 command;
+ uint16_t cmdsize;
+ uint16_t command;
+ int timeo = 5 * HZ;
+ int ret;
lbs_deb_enter(LBS_DEB_HOST);
@@ -1220,33 +1221,30 @@ static int lbs_submit_command(struct lbs_private *priv,
cmdsize = le16_to_cpu(cmd->size);
command = le16_to_cpu(cmd->command);
+ /* These commands take longer */
+ if (command == CMD_802_11_SCAN || command == CMD_802_11_ASSOCIATE ||
+ command == CMD_802_11_AUTHENTICATE)
+ timeo = 10 * HZ;
+
lbs_deb_host("DNLD_CMD: command 0x%04x, seq %d, size %d, jiffies %lu\n",
command, le16_to_cpu(cmd->seqnum), cmdsize, jiffies);
lbs_deb_hex(LBS_DEB_HOST, "DNLD_CMD", (void *) cmdnode->cmdbuf, cmdsize);
ret = priv->hw_host_to_card(priv, MVMS_CMD, (u8 *) cmd, cmdsize);
+
if (ret) {
lbs_pr_info("DNLD_CMD: hw_host_to_card failed: %d\n", ret);
- spin_lock_irqsave(&priv->driver_lock, flags);
- lbs_complete_command(priv, priv->cur_cmd, ret);
- spin_unlock_irqrestore(&priv->driver_lock, flags);
- goto done;
- }
-
- lbs_deb_cmd("DNLD_CMD: sent command 0x%04x, jiffies %lu\n", command, jiffies);
+ /* Let the timer kick in and retry, and potentially reset
+ the whole thing if the condition persists */
+ timeo = HZ;
+ } else
+ lbs_deb_cmd("DNLD_CMD: sent command 0x%04x, jiffies %lu\n",
+ command, jiffies);
/* Setup the timer after transmit command */
- if (command == CMD_802_11_SCAN || command == CMD_802_11_AUTHENTICATE
- || command == CMD_802_11_ASSOCIATE)
- mod_timer(&priv->command_timer, jiffies + (10*HZ));
- else
- mod_timer(&priv->command_timer, jiffies + (5*HZ));
-
- ret = 0;
+ mod_timer(&priv->command_timer, jiffies + timeo);
-done:
- lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
- return ret;
+ lbs_deb_leave(LBS_DEB_HOST);
}
static int lbs_cmd_mac_control(struct lbs_private *priv,
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 126/48] libertas: submit RSSI command on tx timeout, to check whether module is dead
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (124 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 125/48] libertas: make lbs_submit_command always 'succeed' and set command timer David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 127/48] libertas: convert RADIO_CONTROL to a direct command David Woodhouse
` (7 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 19:22:40 -0500
We don't necessarily want to reset the device on a TX timeout. But more
often than not, the real cause is that the firmware has crapped itself,
not just that the network is busy. So submit any harmless command, and
if _that_ times out, then the error handling code will reset the module,
as appropriate.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 9677b0d..74353e1 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -476,6 +476,13 @@ static void lbs_tx_timeout(struct net_device *dev)
to kick it somehow? */
lbs_host_to_card_done(priv);
+ /* More often than not, this actually happens because the
+ firmware has crapped itself -- rather than just a very
+ busy medium. So send a harmless command, and if/when
+ _that_ times out, we'll kick it in the head. */
+ lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
+ 0, 0, NULL);
+
lbs_deb_leave(LBS_DEB_TX);
}
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 127/48] libertas: convert RADIO_CONTROL to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (125 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 126/48] libertas: submit RSSI command on tx timeout, to check whether module is dead David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 128/48] libertas: convert INACTIVITY_TIMEOUT " David Woodhouse
` (6 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 22:43:48 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 76 +++++++++++--------------------
drivers/net/wireless/libertas/cmdresp.c | 1 -
drivers/net/wireless/libertas/hostcmd.h | 4 +-
3 files changed, 29 insertions(+), 52 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 0ae9851..3a7b82f 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -603,45 +603,6 @@ static int lbs_cmd_802_11_snmp_mib(struct lbs_private *priv,
return 0;
}
-static int lbs_cmd_802_11_radio_control(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- int cmd_action)
-{
- struct cmd_ds_802_11_radio_control *pradiocontrol = &cmd->params.radio;
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- cmd->size =
- cpu_to_le16((sizeof(struct cmd_ds_802_11_radio_control)) +
- S_DS_GEN);
- cmd->command = cpu_to_le16(CMD_802_11_RADIO_CONTROL);
-
- pradiocontrol->action = cpu_to_le16(cmd_action);
-
- switch (priv->preamble) {
- case CMD_TYPE_SHORT_PREAMBLE:
- pradiocontrol->control = cpu_to_le16(SET_SHORT_PREAMBLE);
- break;
-
- case CMD_TYPE_LONG_PREAMBLE:
- pradiocontrol->control = cpu_to_le16(SET_LONG_PREAMBLE);
- break;
-
- case CMD_TYPE_AUTO_PREAMBLE:
- default:
- pradiocontrol->control = cpu_to_le16(SET_AUTO_PREAMBLE);
- break;
- }
-
- if (priv->radioon)
- pradiocontrol->control |= cpu_to_le16(TURN_ON_RF);
- else
- pradiocontrol->control &= cpu_to_le16(~TURN_ON_RF);
-
- lbs_deb_leave(LBS_DEB_CMD);
- return 0;
-}
-
static int lbs_cmd_802_11_rf_tx_power(struct lbs_private *priv,
struct cmd_ds_command *cmd,
u16 cmd_action, void *pdata_buf)
@@ -1315,16 +1276,37 @@ void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
int lbs_set_radio_control(struct lbs_private *priv)
{
int ret = 0;
+ struct cmd_ds_802_11_radio_control cmd;
lbs_deb_enter(LBS_DEB_CMD);
- ret = lbs_prepare_and_send_command(priv,
- CMD_802_11_RADIO_CONTROL,
- CMD_ACT_SET,
- CMD_OPTION_WAITFORRSP, 0, NULL);
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_ACT_SET);
+
+ switch (priv->preamble) {
+ case CMD_TYPE_SHORT_PREAMBLE:
+ cmd.control = cpu_to_le16(SET_SHORT_PREAMBLE);
+ break;
+
+ case CMD_TYPE_LONG_PREAMBLE:
+ cmd.control = cpu_to_le16(SET_LONG_PREAMBLE);
+ break;
+
+ case CMD_TYPE_AUTO_PREAMBLE:
+ default:
+ cmd.control = cpu_to_le16(SET_AUTO_PREAMBLE);
+ break;
+ }
- lbs_deb_cmd("RADIO_SET: radio %d, preamble %d\n",
- priv->radioon, priv->preamble);
+ if (priv->radioon)
+ cmd.control |= cpu_to_le16(TURN_ON_RF);
+ else
+ cmd.control &= cpu_to_le16(~TURN_ON_RF);
+
+ lbs_deb_cmd("RADIO_SET: radio %d, preamble %d\n", priv->radioon,
+ priv->preamble);
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_RADIO_CONTROL, &cmd);
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
@@ -1467,10 +1449,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
cmd_action, pdata_buf);
break;
- case CMD_802_11_RADIO_CONTROL:
- ret = lbs_cmd_802_11_radio_control(priv, cmdptr, cmd_action);
- break;
-
case CMD_802_11_RATE_ADAPT_RATESET:
ret = lbs_cmd_802_11_rate_adapt_rateset(priv,
cmdptr, cmd_action);
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 0cd9662..7c9ffc5 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -516,7 +516,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_SET_WEP):
case CMD_RET(CMD_802_11_RESET):
case CMD_RET(CMD_802_11_AUTHENTICATE):
- case CMD_RET(CMD_802_11_RADIO_CONTROL):
case CMD_RET(CMD_802_11_BEACON_STOP):
break;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index b38502f..8cc4d77 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -342,6 +342,8 @@ struct cmd_ds_rf_reg_access {
};
struct cmd_ds_802_11_radio_control {
+ struct cmd_header hdr;
+
__le16 action;
__le16 control;
};
@@ -697,8 +699,6 @@ struct cmd_ds_command {
struct cmd_ds_802_11_rate_adapt_rateset rateset;
struct cmd_ds_mac_multicast_adr madr;
struct cmd_ds_802_11_ad_hoc_join adj;
- struct cmd_ds_802_11_radio_control radio;
- struct cmd_ds_802_11_rf_channel rfchannel;
struct cmd_ds_802_11_rssi rssi;
struct cmd_ds_802_11_rssi_rsp rssirsp;
struct cmd_ds_802_11_disassociate dassociate;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 128/48] libertas: convert INACTIVITY_TIMEOUT to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (126 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 127/48] libertas: convert RADIO_CONTROL to a direct command David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 129/48] libertas: convert SLEEP_PARAMS " David Woodhouse
` (5 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 23:04:37 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 34 ++++++++++++++----------------
drivers/net/wireless/libertas/cmd.h | 3 ++
drivers/net/wireless/libertas/cmdresp.c | 7 ------
drivers/net/wireless/libertas/hostcmd.h | 3 +-
4 files changed, 21 insertions(+), 26 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 3a7b82f..57d1707 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -171,27 +171,30 @@ static int lbs_cmd_802_11_ps_mode(struct lbs_private *priv,
return 0;
}
-static int lbs_cmd_802_11_inactivity_timeout(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- u16 cmd_action, void *pdata_buf)
+int lbs_cmd_802_11_inactivity_timeout(struct lbs_private *priv,
+ uint16_t cmd_action, uint16_t *timeout)
{
- u16 *timeout = pdata_buf;
+ struct cmd_ds_802_11_inactivity_timeout cmd;
+ int ret;
lbs_deb_enter(LBS_DEB_CMD);
- cmd->command = cpu_to_le16(CMD_802_11_INACTIVITY_TIMEOUT);
- cmd->size =
- cpu_to_le16(sizeof(struct cmd_ds_802_11_inactivity_timeout)
- + S_DS_GEN);
+ cmd.hdr.command = cpu_to_le16(CMD_802_11_INACTIVITY_TIMEOUT);
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
- cmd->params.inactivity_timeout.action = cpu_to_le16(cmd_action);
+ cmd.action = cpu_to_le16(cmd_action);
- if (cmd_action)
- cmd->params.inactivity_timeout.timeout = cpu_to_le16(*timeout);
+ if (cmd_action == CMD_ACT_SET)
+ cmd.timeout = cpu_to_le16(*timeout);
else
- cmd->params.inactivity_timeout.timeout = 0;
+ cmd.timeout = 0;
- lbs_deb_leave(LBS_DEB_CMD);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_INACTIVITY_TIMEOUT, &cmd);
+
+ if (!ret)
+ *timeout = le16_to_cpu(cmd.timeout);
+
+ lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return 0;
}
@@ -1520,11 +1523,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
case CMD_802_11_SLEEP_PARAMS:
ret = lbs_cmd_802_11_sleep_params(priv, cmdptr, cmd_action);
break;
- case CMD_802_11_INACTIVITY_TIMEOUT:
- ret = lbs_cmd_802_11_inactivity_timeout(priv, cmdptr,
- cmd_action, pdata_buf);
- lbs_set_cmd_ctrl_node(priv, cmdnode, pdata_buf);
- break;
case CMD_802_11_TPC_CFG:
cmdptr->command = cpu_to_le16(CMD_802_11_TPC_CFG);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index e334f0e..50821e7 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -47,4 +47,7 @@ int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria);
int lbs_suspend(struct lbs_private *priv);
int lbs_resume(struct lbs_private *priv);
+int lbs_cmd_802_11_inactivity_timeout(struct lbs_private *priv,
+ uint16_t cmd_action, uint16_t *timeout);
+
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 7c9ffc5..f7fb8c7 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -554,13 +554,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_SLEEP_PARAMS):
ret = lbs_ret_802_11_sleep_params(priv, resp);
break;
- case CMD_RET(CMD_802_11_INACTIVITY_TIMEOUT):
- spin_lock_irqsave(&priv->driver_lock, flags);
- *((uint16_t *) priv->cur_cmd->callback_arg) =
- le16_to_cpu(resp->params.inactivity_timeout.timeout);
- spin_unlock_irqrestore(&priv->driver_lock, flags);
- break;
-
case CMD_RET(CMD_802_11_TPC_CFG):
spin_lock_irqsave(&priv->driver_lock, flags);
memmove((void *)priv->cur_cmd->callback_arg, &resp->params.tpccfg,
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 8cc4d77..2ad32bc 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -378,6 +378,8 @@ struct cmd_ds_802_11_sleep_params {
};
struct cmd_ds_802_11_inactivity_timeout {
+ struct cmd_header hdr;
+
/* ACT_GET/ACT_SET */
__le16 action;
@@ -714,7 +716,6 @@ struct cmd_ds_command {
struct cmd_ds_802_11d_domain_info domaininforesp;
struct cmd_ds_802_11_sleep_params sleep_params;
- struct cmd_ds_802_11_inactivity_timeout inactivity_timeout;
struct cmd_ds_802_11_tpc_cfg tpccfg;
struct cmd_ds_802_11_pwr_cfg pwrcfg;
struct cmd_ds_802_11_afc afc;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 129/48] libertas: convert SLEEP_PARAMS to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (127 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 128/48] libertas: convert INACTIVITY_TIMEOUT " David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 130/48] libertas: convert SET_WEP " David Woodhouse
` (4 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Mon, 17 Dec 2007 23:48:31 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 56 +++++++++++++++-----------
drivers/net/wireless/libertas/cmd.h | 2 +
drivers/net/wireless/libertas/cmdresp.c | 26 ------------
drivers/net/wireless/libertas/debugfs.c | 66 ++++++++++++++-----------------
drivers/net/wireless/libertas/dev.h | 15 +++----
drivers/net/wireless/libertas/hostcmd.h | 7 ++-
6 files changed, 74 insertions(+), 98 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 57d1707..3d9ad0e 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -198,33 +198,45 @@ int lbs_cmd_802_11_inactivity_timeout(struct lbs_private *priv,
return 0;
}
-static int lbs_cmd_802_11_sleep_params(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- u16 cmd_action)
+int lbs_cmd_802_11_sleep_params(struct lbs_private *priv, uint16_t cmd_action,
+ struct sleep_params *sp)
{
- struct cmd_ds_802_11_sleep_params *sp = &cmd->params.sleep_params;
+ struct cmd_ds_802_11_sleep_params cmd;
+ int ret;
lbs_deb_enter(LBS_DEB_CMD);
- cmd->size = cpu_to_le16((sizeof(struct cmd_ds_802_11_sleep_params)) +
- S_DS_GEN);
- cmd->command = cpu_to_le16(CMD_802_11_SLEEP_PARAMS);
-
if (cmd_action == CMD_ACT_GET) {
- memset(&priv->sp, 0, sizeof(struct sleep_params));
- memset(sp, 0, sizeof(struct cmd_ds_802_11_sleep_params));
- sp->action = cpu_to_le16(cmd_action);
- } else if (cmd_action == CMD_ACT_SET) {
- sp->action = cpu_to_le16(cmd_action);
- sp->error = cpu_to_le16(priv->sp.sp_error);
- sp->offset = cpu_to_le16(priv->sp.sp_offset);
- sp->stabletime = cpu_to_le16(priv->sp.sp_stabletime);
- sp->calcontrol = (u8) priv->sp.sp_calcontrol;
- sp->externalsleepclk = (u8) priv->sp.sp_extsleepclk;
- sp->reserved = cpu_to_le16(priv->sp.sp_reserved);
+ memset(&cmd, 0, sizeof(cmd));
+ } else {
+ cmd.error = cpu_to_le16(sp->sp_error);
+ cmd.offset = cpu_to_le16(sp->sp_offset);
+ cmd.stabletime = cpu_to_le16(sp->sp_stabletime);
+ cmd.calcontrol = sp->sp_calcontrol;
+ cmd.externalsleepclk = sp->sp_extsleepclk;
+ cmd.reserved = cpu_to_le16(sp->sp_reserved);
}
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(cmd_action);
- lbs_deb_leave(LBS_DEB_CMD);
+ ret = lbs_cmd_with_response(priv, CMD_802_11_SLEEP_PARAMS, &cmd);
+
+ if (!ret) {
+ lbs_deb_cmd("error 0x%x, offset 0x%x, stabletime 0x%x, "
+ "calcontrol 0x%x extsleepclk 0x%x\n",
+ le16_to_cpu(cmd.error), le16_to_cpu(cmd.offset),
+ le16_to_cpu(cmd.stabletime), cmd.calcontrol,
+ cmd.externalsleepclk);
+
+ sp->sp_error = le16_to_cpu(cmd.error);
+ sp->sp_offset = le16_to_cpu(cmd.offset);
+ sp->sp_stabletime = le16_to_cpu(cmd.stabletime);
+ sp->sp_calcontrol = cmd.calcontrol;
+ sp->sp_extsleepclk = cmd.externalsleepclk;
+ sp->sp_reserved = le16_to_cpu(cmd.reserved);
+ }
+
+ lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return 0;
}
@@ -1520,10 +1532,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
cmd_no, cmd_action);
break;
- case CMD_802_11_SLEEP_PARAMS:
- ret = lbs_cmd_802_11_sleep_params(priv, cmdptr, cmd_action);
- break;
-
case CMD_802_11_TPC_CFG:
cmdptr->command = cpu_to_le16(CMD_802_11_TPC_CFG);
cmdptr->size =
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 50821e7..ca09b18 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -49,5 +49,7 @@ int lbs_resume(struct lbs_private *priv);
int lbs_cmd_802_11_inactivity_timeout(struct lbs_private *priv,
uint16_t cmd_action, uint16_t *timeout);
+int lbs_cmd_802_11_sleep_params(struct lbs_private *priv, uint16_t cmd_action,
+ struct sleep_params *sp);
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index f7fb8c7..40615a8 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -146,29 +146,6 @@ static int lbs_ret_reg_access(struct lbs_private *priv,
return ret;
}
-static int lbs_ret_802_11_sleep_params(struct lbs_private *priv,
- struct cmd_ds_command *resp)
-{
- struct cmd_ds_802_11_sleep_params *sp = &resp->params.sleep_params;
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- lbs_deb_cmd("error 0x%x, offset 0x%x, stabletime 0x%x, calcontrol 0x%x "
- "extsleepclk 0x%x\n", le16_to_cpu(sp->error),
- le16_to_cpu(sp->offset), le16_to_cpu(sp->stabletime),
- sp->calcontrol, sp->externalsleepclk);
-
- priv->sp.sp_error = le16_to_cpu(sp->error);
- priv->sp.sp_offset = le16_to_cpu(sp->offset);
- priv->sp.sp_stabletime = le16_to_cpu(sp->stabletime);
- priv->sp.sp_calcontrol = sp->calcontrol;
- priv->sp.sp_extsleepclk = sp->externalsleepclk;
- priv->sp.sp_reserved = le16_to_cpu(sp->reserved);
-
- lbs_deb_enter(LBS_DEB_CMD);
- return 0;
-}
-
static int lbs_ret_802_11_stat(struct lbs_private *priv,
struct cmd_ds_command *resp)
{
@@ -551,9 +528,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
ret = lbs_ret_802_11d_domain_info(priv, resp);
break;
- case CMD_RET(CMD_802_11_SLEEP_PARAMS):
- ret = lbs_ret_802_11_sleep_params(priv, resp);
- break;
case CMD_RET(CMD_802_11_TPC_CFG):
spin_lock_irqsave(&priv->driver_lock, flags);
memmove((void *)priv->cur_cmd->callback_arg, &resp->params.tpccfg,
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index 226b183..fa6c594 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -10,6 +10,7 @@
#include "decl.h"
#include "host.h"
#include "debugfs.h"
+#include "cmd.h"
static struct dentry *lbs_dir;
static char *szStates[] = {
@@ -103,71 +104,64 @@ static ssize_t lbs_sleepparams_write(struct file *file,
loff_t *ppos)
{
struct lbs_private *priv = file->private_data;
- ssize_t buf_size, res;
+ ssize_t buf_size, ret;
+ struct sleep_params sp;
int p1, p2, p3, p4, p5, p6;
unsigned long addr = get_zeroed_page(GFP_KERNEL);
char *buf = (char *)addr;
buf_size = min(count, len - 1);
if (copy_from_user(buf, user_buf, buf_size)) {
- res = -EFAULT;
+ ret = -EFAULT;
goto out_unlock;
}
- res = sscanf(buf, "%d %d %d %d %d %d", &p1, &p2, &p3, &p4, &p5, &p6);
- if (res != 6) {
- res = -EFAULT;
+ ret = sscanf(buf, "%d %d %d %d %d %d", &p1, &p2, &p3, &p4, &p5, &p6);
+ if (ret != 6) {
+ ret = -EINVAL;
goto out_unlock;
}
- priv->sp.sp_error = p1;
- priv->sp.sp_offset = p2;
- priv->sp.sp_stabletime = p3;
- priv->sp.sp_calcontrol = p4;
- priv->sp.sp_extsleepclk = p5;
- priv->sp.sp_reserved = p6;
-
- res = lbs_prepare_and_send_command(priv,
- CMD_802_11_SLEEP_PARAMS,
- CMD_ACT_SET,
- CMD_OPTION_WAITFORRSP, 0, NULL);
-
- if (!res)
- res = count;
- else
- res = -EINVAL;
+ sp.sp_error = p1;
+ sp.sp_offset = p2;
+ sp.sp_stabletime = p3;
+ sp.sp_calcontrol = p4;
+ sp.sp_extsleepclk = p5;
+ sp.sp_reserved = p6;
+
+ ret = lbs_cmd_802_11_sleep_params(priv, CMD_ACT_SET, &sp);
+ if (!ret)
+ ret = count;
+ else if (ret > 0)
+ ret = -EINVAL;
out_unlock:
free_page(addr);
- return res;
+ return ret;
}
static ssize_t lbs_sleepparams_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct lbs_private *priv = file->private_data;
- ssize_t res;
+ ssize_t ret;
size_t pos = 0;
+ struct sleep_params sp;
unsigned long addr = get_zeroed_page(GFP_KERNEL);
char *buf = (char *)addr;
- res = lbs_prepare_and_send_command(priv,
- CMD_802_11_SLEEP_PARAMS,
- CMD_ACT_GET,
- CMD_OPTION_WAITFORRSP, 0, NULL);
- if (res) {
- res = -EFAULT;
+ ret = lbs_cmd_802_11_sleep_params(priv, CMD_ACT_GET, &sp);
+ if (ret)
goto out_unlock;
- }
- pos += snprintf(buf, len, "%d %d %d %d %d %d\n", priv->sp.sp_error,
- priv->sp.sp_offset, priv->sp.sp_stabletime,
- priv->sp.sp_calcontrol, priv->sp.sp_extsleepclk,
- priv->sp.sp_reserved);
+ pos += snprintf(buf, len, "%d %d %d %d %d %d\n", sp.sp_error,
+ sp.sp_offset, sp.sp_stabletime,
+ sp.sp_calcontrol, sp.sp_extsleepclk,
+ sp.sp_reserved);
- res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+ ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
out_unlock:
free_page(addr);
- return res;
+ return ret;
}
static ssize_t lbs_extscan(struct file *file, const char __user *userbuf,
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 1c6ec4d..3629751 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -77,12 +77,12 @@ struct current_bss_params {
/** sleep_params */
struct sleep_params {
- u16 sp_error;
- u16 sp_offset;
- u16 sp_stabletime;
- u8 sp_calcontrol;
- u8 sp_extsleepclk;
- u16 sp_reserved;
+ uint16_t sp_error;
+ uint16_t sp_offset;
+ uint16_t sp_stabletime;
+ uint8_t sp_calcontrol;
+ uint8_t sp_extsleepclk;
+ uint16_t sp_reserved;
};
/* Mesh statistics */
@@ -300,9 +300,6 @@ struct lbs_private {
u8 cur_rate;
u8 auto_rate;
- /** sleep_params */
- struct sleep_params sp;
-
/** RF calibration data */
#define MAX_REGION_CHANNEL_NUM 2
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 2ad32bc..855c2d0 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -355,6 +355,8 @@ struct cmd_ds_802_11_beacon_control {
};
struct cmd_ds_802_11_sleep_params {
+ struct cmd_header hdr;
+
/* ACT_GET/ACT_SET */
__le16 action;
@@ -368,10 +370,10 @@ struct cmd_ds_802_11_sleep_params {
__le16 stabletime;
/* control periodic calibration */
- u8 calcontrol;
+ uint8_t calcontrol;
/* control the use of external sleep clock */
- u8 externalsleepclk;
+ uint8_t externalsleepclk;
/* reserved field, should be set to zero */
__le16 reserved;
@@ -715,7 +717,6 @@ struct cmd_ds_command {
struct cmd_ds_802_11d_domain_info domaininfo;
struct cmd_ds_802_11d_domain_info domaininforesp;
- struct cmd_ds_802_11_sleep_params sleep_params;
struct cmd_ds_802_11_tpc_cfg tpccfg;
struct cmd_ds_802_11_pwr_cfg pwrcfg;
struct cmd_ds_802_11_afc afc;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 130/48] libertas: convert SET_WEP to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (128 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 129/48] libertas: convert SLEEP_PARAMS " David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 131/48] libertas: convert ENABLE_RSN " David Woodhouse
` (3 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 18 Dec 2007 00:18:05 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 26 ++++----------
drivers/net/wireless/libertas/cmd.c | 57 +++++++++++--------------------
drivers/net/wireless/libertas/cmd.h | 2 +
drivers/net/wireless/libertas/cmdresp.c | 1 -
drivers/net/wireless/libertas/hostcmd.h | 7 ++--
5 files changed, 34 insertions(+), 59 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index 882e51c..e91cd67 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -258,7 +258,7 @@ static int assoc_helper_channel(struct lbs_private *priv,
static int assoc_helper_wep_keys(struct lbs_private *priv,
- struct assoc_request * assoc_req)
+ struct assoc_request *assoc_req)
{
int i;
int ret = 0;
@@ -266,22 +266,11 @@ static int assoc_helper_wep_keys(struct lbs_private *priv,
lbs_deb_enter(LBS_DEB_ASSOC);
/* Set or remove WEP keys */
- if ( assoc_req->wep_keys[0].len
- || assoc_req->wep_keys[1].len
- || assoc_req->wep_keys[2].len
- || assoc_req->wep_keys[3].len) {
- ret = lbs_prepare_and_send_command(priv,
- CMD_802_11_SET_WEP,
- CMD_ACT_ADD,
- CMD_OPTION_WAITFORRSP,
- 0, assoc_req);
- } else {
- ret = lbs_prepare_and_send_command(priv,
- CMD_802_11_SET_WEP,
- CMD_ACT_REMOVE,
- CMD_OPTION_WAITFORRSP,
- 0, NULL);
- }
+ if (assoc_req->wep_keys[0].len || assoc_req->wep_keys[1].len ||
+ assoc_req->wep_keys[2].len || assoc_req->wep_keys[3].len)
+ ret = lbs_cmd_802_11_set_wep(priv, CMD_ACT_ADD, assoc_req);
+ else
+ ret = lbs_cmd_802_11_set_wep(priv, CMD_ACT_REMOVE, assoc_req);
if (ret)
goto out;
@@ -291,6 +280,7 @@ static int assoc_helper_wep_keys(struct lbs_private *priv,
priv->currentpacketfilter |= CMD_ACT_MAC_WEP_ENABLE;
else
priv->currentpacketfilter &= ~CMD_ACT_MAC_WEP_ENABLE;
+
ret = lbs_set_mac_packet_filter(priv);
if (ret)
goto out;
@@ -300,7 +290,7 @@ static int assoc_helper_wep_keys(struct lbs_private *priv,
/* Copy WEP keys into priv wep key fields */
for (i = 0; i < 4; i++) {
memcpy(&priv->wep_keys[i], &assoc_req->wep_keys[i],
- sizeof(struct enc_key));
+ sizeof(struct enc_key));
}
priv->wep_tx_keyidx = assoc_req->wep_tx_keyidx;
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 3d9ad0e..05e25ce 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -240,74 +240,61 @@ int lbs_cmd_802_11_sleep_params(struct lbs_private *priv, uint16_t cmd_action,
return 0;
}
-static int lbs_cmd_802_11_set_wep(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- u32 cmd_act,
- void * pdata_buf)
+int lbs_cmd_802_11_set_wep(struct lbs_private *priv, uint16_t cmd_action,
+ struct assoc_request *assoc)
{
- struct cmd_ds_802_11_set_wep *wep = &cmd->params.wep;
+ struct cmd_ds_802_11_set_wep cmd;
int ret = 0;
- struct assoc_request * assoc_req = pdata_buf;
lbs_deb_enter(LBS_DEB_CMD);
- cmd->command = cpu_to_le16(CMD_802_11_SET_WEP);
- cmd->size = cpu_to_le16(sizeof(*wep) + S_DS_GEN);
-
- if (cmd_act == CMD_ACT_ADD) {
- int i;
+ cmd.hdr.command = cpu_to_le16(CMD_802_11_SET_WEP);
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
- if (!assoc_req) {
- lbs_deb_cmd("Invalid association request!\n");
- ret = -1;
- goto done;
- }
+ cmd.action = cpu_to_le16(cmd_action);
- wep->action = cpu_to_le16(CMD_ACT_ADD);
+ if (cmd_action == CMD_ACT_ADD) {
+ int i;
/* default tx key index */
- wep->keyindex = cpu_to_le16((u16)(assoc_req->wep_tx_keyidx &
- (u32)CMD_WEP_KEY_INDEX_MASK));
+ cmd.keyindex = cpu_to_le16(assoc->wep_tx_keyidx &
+ CMD_WEP_KEY_INDEX_MASK);
/* Copy key types and material to host command structure */
for (i = 0; i < 4; i++) {
- struct enc_key * pkey = &assoc_req->wep_keys[i];
+ struct enc_key *pkey = &assoc->wep_keys[i];
switch (pkey->len) {
case KEY_LEN_WEP_40:
- wep->keytype[i] = CMD_TYPE_WEP_40_BIT;
- memmove(&wep->keymaterial[i], pkey->key,
- pkey->len);
+ cmd.keytype[i] = CMD_TYPE_WEP_40_BIT;
+ memmove(cmd.keymaterial[i], pkey->key, pkey->len);
lbs_deb_cmd("SET_WEP: add key %d (40 bit)\n", i);
break;
case KEY_LEN_WEP_104:
- wep->keytype[i] = CMD_TYPE_WEP_104_BIT;
- memmove(&wep->keymaterial[i], pkey->key,
- pkey->len);
+ cmd.keytype[i] = CMD_TYPE_WEP_104_BIT;
+ memmove(cmd.keymaterial[i], pkey->key, pkey->len);
lbs_deb_cmd("SET_WEP: add key %d (104 bit)\n", i);
break;
case 0:
break;
default:
lbs_deb_cmd("SET_WEP: invalid key %d, length %d\n",
- i, pkey->len);
+ i, pkey->len);
ret = -1;
goto done;
break;
}
}
- } else if (cmd_act == CMD_ACT_REMOVE) {
+ } else if (cmd_action == CMD_ACT_REMOVE) {
/* ACT_REMOVE clears _all_ WEP keys */
- wep->action = cpu_to_le16(CMD_ACT_REMOVE);
/* default tx key index */
- wep->keyindex = cpu_to_le16((u16)(priv->wep_tx_keyidx &
- (u32)CMD_WEP_KEY_INDEX_MASK));
+ cmd.keyindex = cpu_to_le16(priv->wep_tx_keyidx &
+ CMD_WEP_KEY_INDEX_MASK);
lbs_deb_cmd("SET_WEP: remove key %d\n", priv->wep_tx_keyidx);
}
- ret = 0;
-
+ ret = lbs_cmd_with_response(priv, CMD_802_11_SET_WEP, &cmd);
done:
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
@@ -1422,10 +1409,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_80211_deauthenticate(priv, cmdptr);
break;
- case CMD_802_11_SET_WEP:
- ret = lbs_cmd_802_11_set_wep(priv, cmdptr, cmd_action, pdata_buf);
- break;
-
case CMD_802_11_AD_HOC_START:
ret = lbs_cmd_80211_ad_hoc_start(priv, cmdptr, pdata_buf);
break;
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index ca09b18..d9947c3 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -51,5 +51,7 @@ int lbs_cmd_802_11_inactivity_timeout(struct lbs_private *priv,
uint16_t cmd_action, uint16_t *timeout);
int lbs_cmd_802_11_sleep_params(struct lbs_private *priv, uint16_t cmd_action,
struct sleep_params *sp);
+int lbs_cmd_802_11_set_wep(struct lbs_private *priv, uint16_t cmd_action,
+ struct assoc_request *assoc);
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 40615a8..d670a81 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -490,7 +490,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_MAC_MULTICAST_ADR):
case CMD_RET(CMD_MAC_CONTROL):
- case CMD_RET(CMD_802_11_SET_WEP):
case CMD_RET(CMD_802_11_RESET):
case CMD_RET(CMD_802_11_AUTHENTICATE):
case CMD_RET(CMD_802_11_BEACON_STOP):
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 855c2d0..6d76634 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -256,6 +256,8 @@ struct cmd_ds_802_11_ad_hoc_result {
};
struct cmd_ds_802_11_set_wep {
+ struct cmd_header hdr;
+
/* ACT_ADD, ACT_REMOVE or ACT_ENABLE */
__le16 action;
@@ -263,8 +265,8 @@ struct cmd_ds_802_11_set_wep {
__le16 keyindex;
/* 40, 128bit or TXWEP */
- u8 keytype[4];
- u8 keymaterial[4][16];
+ uint8_t keytype[4];
+ uint8_t keymaterial[4][16];
};
struct cmd_ds_802_3_get_stat {
@@ -688,7 +690,6 @@ struct cmd_ds_command {
struct cmd_ds_mac_control macctrl;
struct cmd_ds_802_11_associate associate;
struct cmd_ds_802_11_deauthenticate deauth;
- struct cmd_ds_802_11_set_wep wep;
struct cmd_ds_802_11_ad_hoc_start ads;
struct cmd_ds_802_11_reset reset;
struct cmd_ds_802_11_ad_hoc_result result;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 131/48] libertas: convert ENABLE_RSN to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (129 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 130/48] libertas: convert SET_WEP " David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 132/48] libertas: change inference about buffer size in lbs_cmd() David Woodhouse
` (2 subsequent siblings)
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 18 Dec 2007 00:47:17 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/assoc.c | 19 ++++-------------
drivers/net/wireless/libertas/cmd.c | 32 +++++++++++++-----------------
drivers/net/wireless/libertas/cmd.h | 2 +
drivers/net/wireless/libertas/cmdresp.c | 21 --------------------
drivers/net/wireless/libertas/hostcmd.h | 3 +-
5 files changed, 23 insertions(+), 54 deletions(-)
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
index e91cd67..c622e9b 100644
--- a/drivers/net/wireless/libertas/assoc.c
+++ b/drivers/net/wireless/libertas/assoc.c
@@ -305,8 +305,8 @@ static int assoc_helper_secinfo(struct lbs_private *priv,
struct assoc_request * assoc_req)
{
int ret = 0;
- u32 do_wpa;
- u32 rsn = 0;
+ uint16_t do_wpa;
+ uint16_t rsn = 0;
lbs_deb_enter(LBS_DEB_ASSOC);
@@ -323,28 +323,19 @@ static int assoc_helper_secinfo(struct lbs_private *priv,
*/
/* Get RSN enabled/disabled */
- ret = lbs_prepare_and_send_command(priv,
- CMD_802_11_ENABLE_RSN,
- CMD_ACT_GET,
- CMD_OPTION_WAITFORRSP,
- 0, &rsn);
+ ret = lbs_cmd_802_11_enable_rsn(priv, CMD_ACT_GET, &rsn);
if (ret) {
lbs_deb_assoc("Failed to get RSN status: %d\n", ret);
goto out;
}
/* Don't re-enable RSN if it's already enabled */
- do_wpa = (assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled);
+ do_wpa = assoc_req->secinfo.WPAenabled || assoc_req->secinfo.WPA2enabled;
if (do_wpa == rsn)
goto out;
/* Set RSN enabled/disabled */
- rsn = do_wpa;
- ret = lbs_prepare_and_send_command(priv,
- CMD_802_11_ENABLE_RSN,
- CMD_ACT_SET,
- CMD_OPTION_WAITFORRSP,
- 0, &rsn);
+ ret = lbs_cmd_802_11_enable_rsn(priv, CMD_ACT_SET, &do_wpa);
out:
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 05e25ce..5d2c928 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -300,30 +300,31 @@ done:
return ret;
}
-static int lbs_cmd_802_11_enable_rsn(struct lbs_private *priv,
- struct cmd_ds_command *cmd,
- u16 cmd_action,
- void * pdata_buf)
+int lbs_cmd_802_11_enable_rsn(struct lbs_private *priv, uint16_t cmd_action,
+ uint16_t *enable)
{
- struct cmd_ds_802_11_enable_rsn *penableRSN = &cmd->params.enbrsn;
- u32 * enable = pdata_buf;
+ struct cmd_ds_802_11_enable_rsn cmd;
+ int ret;
lbs_deb_enter(LBS_DEB_CMD);
- cmd->command = cpu_to_le16(CMD_802_11_ENABLE_RSN);
- cmd->size = cpu_to_le16(sizeof(*penableRSN) + S_DS_GEN);
- penableRSN->action = cpu_to_le16(cmd_action);
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(cmd_action);
if (cmd_action == CMD_ACT_SET) {
if (*enable)
- penableRSN->enable = cpu_to_le16(CMD_ENABLE_RSN);
+ cmd.enable = cpu_to_le16(CMD_ENABLE_RSN);
else
- penableRSN->enable = cpu_to_le16(CMD_DISABLE_RSN);
+ cmd.enable = cpu_to_le16(CMD_DISABLE_RSN);
lbs_deb_cmd("ENABLE_RSN: %d\n", *enable);
}
- lbs_deb_leave(LBS_DEB_CMD);
- return 0;
+ ret = lbs_cmd_with_response(priv, CMD_802_11_ENABLE_RSN, &cmd);
+ if (!ret && cmd_action == CMD_ACT_GET)
+ *enable = le16_to_cpu(cmd.enable);
+
+ lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+ return ret;
}
@@ -1473,11 +1474,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_80211_ad_hoc_stop(priv, cmdptr);
break;
- case CMD_802_11_ENABLE_RSN:
- ret = lbs_cmd_802_11_enable_rsn(priv, cmdptr, cmd_action,
- pdata_buf);
- break;
-
case CMD_802_11_KEY_MATERIAL:
ret = lbs_cmd_802_11_key_material(priv, cmdptr, cmd_action,
cmd_oid, pdata_buf);
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index d9947c3..6efb81e 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -53,5 +53,7 @@ int lbs_cmd_802_11_sleep_params(struct lbs_private *priv, uint16_t cmd_action,
struct sleep_params *sp);
int lbs_cmd_802_11_set_wep(struct lbs_private *priv, uint16_t cmd_action,
struct assoc_request *assoc);
+int lbs_cmd_802_11_enable_rsn(struct lbs_private *priv, uint16_t cmd_action,
+ uint16_t *enable);
#endif /* _LBS_CMD_H */
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index d670a81..8b71926 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -372,23 +372,6 @@ static int lbs_ret_get_log(struct lbs_private *priv,
return 0;
}
-static int lbs_ret_802_11_enable_rsn(struct lbs_private *priv,
- struct cmd_ds_command *resp)
-{
- struct cmd_ds_802_11_enable_rsn *enable_rsn = &resp->params.enbrsn;
- uint32_t * pdata_buf = (uint32_t *)priv->cur_cmd->callback_arg;
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- if (enable_rsn->action == cpu_to_le16(CMD_ACT_GET)) {
- if (pdata_buf)
- *pdata_buf = (uint32_t) le16_to_cpu(enable_rsn->enable);
- }
-
- lbs_deb_leave(LBS_DEB_CMD);
- return 0;
-}
-
static int lbs_ret_802_11_bcn_ctrl(struct lbs_private * priv,
struct cmd_ds_command *resp)
{
@@ -495,10 +478,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_BEACON_STOP):
break;
- case CMD_RET(CMD_802_11_ENABLE_RSN):
- ret = lbs_ret_802_11_enable_rsn(priv, resp);
- break;
-
case CMD_RET(CMD_802_11_RATE_ADAPT_RATESET):
ret = lbs_ret_802_11_rate_adapt_rateset(priv, resp);
break;
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index 6d76634..fffec11 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -536,6 +536,8 @@ struct cmd_ds_802_11_ad_hoc_join {
} __attribute__ ((packed));
struct cmd_ds_802_11_enable_rsn {
+ struct cmd_header hdr;
+
__le16 action;
__le16 enable;
} __attribute__ ((packed));
@@ -708,7 +710,6 @@ struct cmd_ds_command {
struct cmd_ds_802_11_rssi_rsp rssirsp;
struct cmd_ds_802_11_disassociate dassociate;
struct cmd_ds_802_11_mac_address macadd;
- struct cmd_ds_802_11_enable_rsn enbrsn;
struct cmd_ds_802_11_key_material keymaterial;
struct cmd_ds_mac_reg_access macreg;
struct cmd_ds_bbp_reg_access bbpreg;
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 132/48] libertas: change inference about buffer size in lbs_cmd()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (130 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 131/48] libertas: convert ENABLE_RSN " David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 133/48] libertas: convert SUBSCRIBE_EVENT to a direct command David Woodhouse
2007-12-19 15:33 ` [PATCH 134/48] libertas: remove check for driver_lock in lbs_interrupt() David Woodhouse
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Wed, 19 Dec 2007 13:03:19 +0000
sizeof(*cmd) is going to give the total size of the data structure that
we allocated, more often than not. But the size of the command to be
_sent_ could be a lot smaller, as it is in the KEY_MATERIAL and
SUBSCRIBE_EVENT commands for example. So swap them round; let the caller
set the _command_ size explicitly in the header, and infer the
maximum response size from the data structure.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.h | 14 ++++++++------
1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 6efb81e..b9ab85c 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -6,13 +6,15 @@
#include "hostcmd.h"
#include "dev.h"
-#define lbs_cmd(priv, cmdnr, cmd, cb, cb_arg) \
- __lbs_cmd(priv, cmdnr, &(cmd)->hdr, sizeof(*(cmd)), cb, cb_arg)
+/* lbs_cmd() infers the size of the buffer to copy data back into, from
+ the size of the target of the pointer. Since the command to be sent
+ may often be smaller, that size is set in cmd->size by the caller.*/
+#define lbs_cmd(priv, cmdnr, cmd, cb, cb_arg) ({ \
+ uint16_t __sz = le16_to_cpu((cmd)->hdr.size); \
+ (cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd))); \
+ __lbs_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg); \
+})
-
-/* lbs_cmd_with_response() infers the size of the command to be _sent_
- and requires that the caller sets cmd->size to the (LE) size of
- the _response_ buffer. */
#define lbs_cmd_with_response(priv, cmdnr, cmd) \
lbs_cmd(priv, cmdnr, cmd, lbs_cmd_copyback, (unsigned long) (cmd))
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 133/48] libertas: convert SUBSCRIBE_EVENT to a direct command
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (131 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 132/48] libertas: change inference about buffer size in lbs_cmd() David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
2007-12-19 15:33 ` [PATCH 134/48] libertas: remove check for driver_lock in lbs_interrupt() David Woodhouse
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 18 Dec 2007 02:01:37 -0500
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/cmd.c | 52 +------
drivers/net/wireless/libertas/cmdresp.c | 22 ---
drivers/net/wireless/libertas/debugfs.c | 282 ++++++++++++++-----------------
drivers/net/wireless/libertas/hostcmd.h | 5 +-
4 files changed, 135 insertions(+), 226 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 5d2c928..4d06dec 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -327,53 +327,6 @@ int lbs_cmd_802_11_enable_rsn(struct lbs_private *priv, uint16_t cmd_action,
return ret;
}
-
-static ssize_t lbs_tlv_size(const u8 *tlv, u16 size)
-{
- ssize_t pos = 0;
- struct mrvlietypesheader *tlv_h;
- while (pos < size) {
- u16 length;
- tlv_h = (struct mrvlietypesheader *) tlv;
- if (tlv_h->len == 0)
- return pos;
- length = le16_to_cpu(tlv_h->len) +
- sizeof(struct mrvlietypesheader);
- pos += length;
- tlv += length;
- }
- return pos;
-}
-
-
-static void lbs_cmd_802_11_subscribe_event(struct lbs_private *priv,
- struct cmd_ds_command *cmd, u16 cmd_action,
- void *pdata_buf)
-{
- struct cmd_ds_802_11_subscribe_event *events =
- (struct cmd_ds_802_11_subscribe_event *) pdata_buf;
-
- /* pdata_buf points to a struct cmd_ds_802_11_subscribe_event and room
- * for various Marvell TLVs */
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- cmd->size = cpu_to_le16(sizeof(*events)
- - sizeof(events->tlv)
- + S_DS_GEN);
- cmd->params.subscribe_event.action = cpu_to_le16(cmd_action);
- if (cmd_action == CMD_ACT_GET) {
- cmd->params.subscribe_event.events = 0;
- } else {
- ssize_t sz = lbs_tlv_size(events->tlv, sizeof(events->tlv));
- cmd->size = cpu_to_le16(le16_to_cpu(cmd->size) + sz);
- cmd->params.subscribe_event.events = events->events;
- memcpy(cmd->params.subscribe_event.tlv, events->tlv, sz);
- }
-
- lbs_deb_leave(LBS_DEB_CMD);
-}
-
static void set_one_wpa_key(struct MrvlIEtype_keyParamSet * pkeyparamset,
struct enc_key * pkey)
{
@@ -1545,10 +1498,7 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = 0;
break;
}
- case CMD_802_11_SUBSCRIBE_EVENT:
- lbs_cmd_802_11_subscribe_event(priv, cmdptr,
- cmd_action, pdata_buf);
- break;
+
case CMD_802_11_PWR_CFG:
cmdptr->command = cpu_to_le16(CMD_802_11_PWR_CFG);
cmdptr->size =
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c
index 8b71926..159216a 100644
--- a/drivers/net/wireless/libertas/cmdresp.c
+++ b/drivers/net/wireless/libertas/cmdresp.c
@@ -389,25 +389,6 @@ static int lbs_ret_802_11_bcn_ctrl(struct lbs_private * priv,
return 0;
}
-static int lbs_ret_802_11_subscribe_event(struct lbs_private *priv,
- struct cmd_ds_command *resp)
-{
- struct cmd_ds_802_11_subscribe_event *cmd_event =
- &resp->params.subscribe_event;
- struct cmd_ds_802_11_subscribe_event *dst_event =
- (void *)priv->cur_cmd->callback_arg;
-
- lbs_deb_enter(LBS_DEB_CMD);
-
- if (dst_event->action == cpu_to_le16(CMD_ACT_GET)) {
- dst_event->events = cmd_event->events;
- memcpy(dst_event->tlv, cmd_event->tlv, sizeof(dst_event->tlv));
- }
-
- lbs_deb_leave(LBS_DEB_CMD);
- return 0;
-}
-
static inline int handle_cmd_response(struct lbs_private *priv,
unsigned long dummy,
struct cmd_header *cmd_response)
@@ -518,9 +499,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
sizeof(struct cmd_ds_802_11_led_ctrl));
spin_unlock_irqrestore(&priv->driver_lock, flags);
break;
- case CMD_RET(CMD_802_11_SUBSCRIBE_EVENT):
- ret = lbs_ret_802_11_subscribe_event(priv, resp);
- break;
case CMD_RET(CMD_802_11_PWR_CFG):
spin_lock_irqsave(&priv->driver_lock, flags);
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index fa6c594..2174717 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -346,20 +346,19 @@ static ssize_t lbs_setuserscan(struct file *file,
* and returns a pointer to the first data byte of the TLV, or to NULL
* if the TLV hasn't been found.
*/
-static void *lbs_tlv_find(u16 tlv_type, const u8 *tlv, u16 size)
+static void *lbs_tlv_find(uint16_t tlv_type, const uint8_t *tlv, uint16_t size)
{
- __le16 le_type = cpu_to_le16(tlv_type);
- ssize_t pos = 0;
struct mrvlietypesheader *tlv_h;
+ uint16_t length;
+ ssize_t pos = 0;
+
while (pos < size) {
- u16 length;
tlv_h = (struct mrvlietypesheader *) tlv;
- if (tlv_h->type == le_type)
- return tlv_h;
- if (tlv_h->len == 0)
+ if (!tlv_h->len)
return NULL;
- length = le16_to_cpu(tlv_h->len) +
- sizeof(struct mrvlietypesheader);
+ if (tlv_h->type == cpu_to_le16(tlv_type))
+ return tlv_h;
+ length = le16_to_cpu(tlv_h->len) + sizeof(*tlv_h);
pos += length;
tlv += length;
}
@@ -367,100 +366,100 @@ static void *lbs_tlv_find(u16 tlv_type, const u8 *tlv, u16 size)
}
-/*
- * This just gets the bitmap of currently subscribed events. Used when
- * adding an additonal event subscription.
- */
-static u16 lbs_get_events_bitmap(struct lbs_private *priv)
-{
- ssize_t res;
-
- struct cmd_ds_802_11_subscribe_event *events = kzalloc(
- sizeof(struct cmd_ds_802_11_subscribe_event),
- GFP_KERNEL);
-
- res = lbs_prepare_and_send_command(priv,
- CMD_802_11_SUBSCRIBE_EVENT, CMD_ACT_GET,
- CMD_OPTION_WAITFORRSP, 0, events);
-
- if (res) {
- kfree(events);
- return 0;
- }
- return le16_to_cpu(events->events);
-}
-
-
-static ssize_t lbs_threshold_read(
- u16 tlv_type, u16 event_mask,
- struct file *file, char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_threshold_read(uint16_t tlv_type, uint16_t event_mask,
+ struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
+ struct cmd_ds_802_11_subscribe_event *subscribed;
+ struct mrvlietypes_thresholds *got;
struct lbs_private *priv = file->private_data;
- ssize_t res = 0;
+ ssize_t ret = 0;
size_t pos = 0;
- unsigned long addr = get_zeroed_page(GFP_KERNEL);
- char *buf = (char *)addr;
+ char *buf;
u8 value;
u8 freq;
int events = 0;
- struct cmd_ds_802_11_subscribe_event *subscribed = kzalloc(
- sizeof(struct cmd_ds_802_11_subscribe_event),
- GFP_KERNEL);
- struct mrvlietypes_thresholds *got;
+ buf = (char *)get_zeroed_page(GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
- res = lbs_prepare_and_send_command(priv,
- CMD_802_11_SUBSCRIBE_EVENT, CMD_ACT_GET,
- CMD_OPTION_WAITFORRSP, 0, subscribed);
- if (res) {
- kfree(subscribed);
- return res;
+ subscribed = kzalloc(sizeof(*subscribed), GFP_KERNEL);
+ if (!subscribed) {
+ ret = -ENOMEM;
+ goto out_page;
}
+ subscribed->hdr.size = cpu_to_le16(sizeof(*subscribed));
+ subscribed->action = cpu_to_le16(CMD_ACT_GET);
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_SUBSCRIBE_EVENT, subscribed);
+ if (ret)
+ goto out_cmd;
+
got = lbs_tlv_find(tlv_type, subscribed->tlv, sizeof(subscribed->tlv));
if (got) {
value = got->value;
freq = got->freq;
events = le16_to_cpu(subscribed->events);
- }
- kfree(subscribed);
- if (got)
pos += snprintf(buf, len, "%d %d %d\n", value, freq,
- !!(events & event_mask));
+ !!(events & event_mask));
+ }
- res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
+ ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos);
- free_page(addr);
- return res;
+ out_cmd:
+ kfree(subscribed);
+
+ out_page:
+ free_page((unsigned long)buf);
+ return ret;
}
-static ssize_t lbs_threshold_write(
- u16 tlv_type, u16 event_mask,
- struct file *file,
- const char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_threshold_write(uint16_t tlv_type, uint16_t event_mask,
+ struct file *file,
+ const char __user *userbuf, size_t count,
+ loff_t *ppos)
{
- struct lbs_private *priv = file->private_data;
- ssize_t res, buf_size;
- int value, freq, curr_mask, new_mask;
- unsigned long addr = get_zeroed_page(GFP_KERNEL);
- char *buf = (char *)addr;
struct cmd_ds_802_11_subscribe_event *events;
+ struct mrvlietypes_thresholds *tlv;
+ struct lbs_private *priv = file->private_data;
+ ssize_t buf_size;
+ int value, freq, new_mask;
+ uint16_t curr_mask;
+ char *buf;
+ int ret;
+
+ buf = (char *)get_zeroed_page(GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
buf_size = min(count, len - 1);
if (copy_from_user(buf, userbuf, buf_size)) {
- res = -EFAULT;
- goto out_unlock;
+ ret = -EFAULT;
+ goto out_page;
}
- res = sscanf(buf, "%d %d %d", &value, &freq, &new_mask);
- if (res != 3) {
- res = -EFAULT;
- goto out_unlock;
+ ret = sscanf(buf, "%d %d %d", &value, &freq, &new_mask);
+ if (ret != 3) {
+ ret = -EINVAL;
+ goto out_page;
}
- curr_mask = lbs_get_events_bitmap(priv);
+ events = kzalloc(sizeof(*events), GFP_KERNEL);
+ if (!events) {
+ ret = -ENOMEM;
+ goto out_page;
+ }
+
+ events->hdr.size = cpu_to_le16(sizeof(*events));
+ events->action = cpu_to_le16(CMD_ACT_GET);
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_SUBSCRIBE_EVENT, events);
+ if (ret)
+ goto out_events;
+
+ curr_mask = le16_to_cpu(events->events);
if (new_mask)
new_mask = curr_mask | event_mask;
@@ -468,147 +467,128 @@ static ssize_t lbs_threshold_write(
new_mask = curr_mask & ~event_mask;
/* Now everything is set and we can send stuff down to the firmware */
- events = kzalloc(
- sizeof(struct cmd_ds_802_11_subscribe_event),
- GFP_KERNEL);
- if (events) {
- struct mrvlietypes_thresholds *tlv =
- (struct mrvlietypes_thresholds *) events->tlv;
- events->action = cpu_to_le16(CMD_ACT_SET);
- events->events = cpu_to_le16(new_mask);
- tlv->header.type = cpu_to_le16(tlv_type);
- tlv->header.len = cpu_to_le16(
- sizeof(struct mrvlietypes_thresholds) -
- sizeof(struct mrvlietypesheader));
- tlv->value = value;
- if (tlv_type != TLV_TYPE_BCNMISS)
- tlv->freq = freq;
- lbs_prepare_and_send_command(priv,
- CMD_802_11_SUBSCRIBE_EVENT, CMD_ACT_SET,
- CMD_OPTION_WAITFORRSP, 0, events);
- kfree(events);
- }
- res = count;
-out_unlock:
- free_page(addr);
- return res;
+ tlv = (void *)events->tlv;
+
+ events->action = cpu_to_le16(CMD_ACT_SET);
+ events->events = cpu_to_le16(new_mask);
+ tlv->header.type = cpu_to_le16(tlv_type);
+ tlv->header.len = cpu_to_le16(sizeof(*tlv) - sizeof(tlv->header));
+ tlv->value = value;
+ if (tlv_type != TLV_TYPE_BCNMISS)
+ tlv->freq = freq;
+
+ /* The command header, the event mask, and the one TLV */
+ events->hdr.size = cpu_to_le16(sizeof(events->hdr) + 2 + sizeof(*tlv));
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_SUBSCRIBE_EVENT, events);
+
+ if (!ret)
+ ret = count;
+ out_events:
+ kfree(events);
+ out_page:
+ free_page((unsigned long)buf);
+ return ret;
}
-static ssize_t lbs_lowrssi_read(
- struct file *file, char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_lowrssi_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_read(TLV_TYPE_RSSI_LOW, CMD_SUBSCRIBE_RSSI_LOW,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_lowrssi_write(
- struct file *file, const char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_lowrssi_write(struct file *file, const char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_write(TLV_TYPE_RSSI_LOW, CMD_SUBSCRIBE_RSSI_LOW,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_lowsnr_read(
- struct file *file, char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_lowsnr_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_read(TLV_TYPE_SNR_LOW, CMD_SUBSCRIBE_SNR_LOW,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_lowsnr_write(
- struct file *file, const char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_lowsnr_write(struct file *file, const char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_write(TLV_TYPE_SNR_LOW, CMD_SUBSCRIBE_SNR_LOW,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_failcount_read(
- struct file *file, char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_failcount_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_read(TLV_TYPE_FAILCOUNT, CMD_SUBSCRIBE_FAILCOUNT,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_failcount_write(
- struct file *file, const char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_failcount_write(struct file *file, const char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_write(TLV_TYPE_FAILCOUNT, CMD_SUBSCRIBE_FAILCOUNT,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_highrssi_read(
- struct file *file, char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_highrssi_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_read(TLV_TYPE_RSSI_HIGH, CMD_SUBSCRIBE_RSSI_HIGH,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_highrssi_write(
- struct file *file, const char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_highrssi_write(struct file *file, const char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_write(TLV_TYPE_RSSI_HIGH, CMD_SUBSCRIBE_RSSI_HIGH,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_highsnr_read(
- struct file *file, char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_highsnr_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_read(TLV_TYPE_SNR_HIGH, CMD_SUBSCRIBE_SNR_HIGH,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_highsnr_write(
- struct file *file, const char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_highsnr_write(struct file *file, const char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_write(TLV_TYPE_SNR_HIGH, CMD_SUBSCRIBE_SNR_HIGH,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_bcnmiss_read(
- struct file *file, char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_bcnmiss_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_read(TLV_TYPE_BCNMISS, CMD_SUBSCRIBE_BCNMISS,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-static ssize_t lbs_bcnmiss_write(
- struct file *file, const char __user *userbuf,
- size_t count, loff_t *ppos)
+static ssize_t lbs_bcnmiss_write(struct file *file, const char __user *userbuf,
+ size_t count, loff_t *ppos)
{
return lbs_threshold_write(TLV_TYPE_BCNMISS, CMD_SUBSCRIBE_BCNMISS,
- file, userbuf, count, ppos);
+ file, userbuf, count, ppos);
}
-
-
-
-
-
static ssize_t lbs_rdmac_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index fffec11..be325ed 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -156,6 +156,8 @@ struct cmd_ds_802_11_reset {
};
struct cmd_ds_802_11_subscribe_event {
+ struct cmd_header hdr;
+
__le16 action;
__le16 events;
@@ -164,7 +166,7 @@ struct cmd_ds_802_11_subscribe_event {
* 40 bytes. However, future firmware might add additional TLVs, so I
* bump this up a bit.
*/
- u8 tlv[128];
+ uint8_t tlv[128];
};
/*
@@ -728,7 +730,6 @@ struct cmd_ds_command {
struct cmd_ds_bt_access bt;
struct cmd_ds_fwt_access fwt;
struct cmd_ds_get_tsf gettsf;
- struct cmd_ds_802_11_subscribe_event subscribe_event;
struct cmd_ds_802_11_beacon_control bcn_ctrl;
} params;
} __attribute__ ((packed));
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread* [PATCH 134/48] libertas: remove check for driver_lock in lbs_interrupt()
2007-12-10 15:45 [PATCH] [00/48] libertas update David Woodhouse
` (132 preceding siblings ...)
2007-12-19 15:33 ` [PATCH 133/48] libertas: convert SUBSCRIBE_EVENT to a direct command David Woodhouse
@ 2007-12-19 15:33 ` David Woodhouse
133 siblings, 0 replies; 141+ messages in thread
From: David Woodhouse @ 2007-12-19 15:33 UTC (permalink / raw)
To: John Linville; +Cc: Dan Williams, libertas-dev, linux-wireless
Date: Tue, 18 Dec 2007 11:41:43 +0000
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
---
drivers/net/wireless/libertas/main.c | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 74353e1..91b2f23 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -1435,11 +1435,6 @@ void lbs_interrupt(struct lbs_private *priv)
lbs_deb_thread("lbs_interrupt: intcounter=%d\n", priv->intcounter);
- if (!spin_is_locked(&priv->driver_lock)) {
- printk(KERN_CRIT "%s called without driver_lock held\n", __func__);
- WARN_ON(1);
- }
-
priv->intcounter++;
if (priv->psstate == PS_STATE_SLEEP)
--
1.5.3.4
^ permalink raw reply related [flat|nested] 141+ messages in thread