diff mbox

[3/4] libertas: only enable mesh when interface is active

Message ID 20110717170339.BA1BB9D401D@zog.reactivated.net (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Daniel Drake July 17, 2011, 5:03 p.m. UTC
Previously, the mesh was running whenever the appropriate hardware
and firmware was present.

Now we only run the mesh when the interface is running.

Also simplifies interface management a little.

Signed-off-by: Daniel Drake <dsd@laptop.org>
---
 drivers/net/wireless/libertas/dev.h  |    2 --
 drivers/net/wireless/libertas/main.c |    2 +-
 drivers/net/wireless/libertas/mesh.c |   23 +++++++++--------------
 drivers/net/wireless/libertas/mesh.h |    7 -------
 drivers/net/wireless/libertas/tx.c   |    2 +-
 5 files changed, 11 insertions(+), 25 deletions(-)

Comments

Dan Williams July 19, 2011, 3:31 p.m. UTC | #1
On Sun, 2011-07-17 at 18:03 +0100, Daniel Drake wrote:
> Previously, the mesh was running whenever the appropriate hardware
> and firmware was present.
> 
> Now we only run the mesh when the interface is running.
> 
> Also simplifies interface management a little.
> 
> Signed-off-by: Daniel Drake <dsd@laptop.org>

Acked-by: Dan Williams <dcbw@redhat.com>

> ---
>  drivers/net/wireless/libertas/dev.h  |    2 --
>  drivers/net/wireless/libertas/main.c |    2 +-
>  drivers/net/wireless/libertas/mesh.c |   23 +++++++++--------------
>  drivers/net/wireless/libertas/mesh.h |    7 -------
>  drivers/net/wireless/libertas/tx.c   |    2 +-
>  5 files changed, 11 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
> index 094e1f2..8a43ec0 100644
> --- a/drivers/net/wireless/libertas/dev.h
> +++ b/drivers/net/wireless/libertas/dev.h
> @@ -44,9 +44,7 @@ struct lbs_private {
>  	/* Mesh */
>  	struct net_device *mesh_dev; /* Virtual device */
>  #ifdef CONFIG_LIBERTAS_MESH
> -	u32 mesh_connect_status;
>  	struct lbs_mesh_stats mstats;
> -	int mesh_open;
>  	uint16_t mesh_tlv;
>  	u8 mesh_ssid[IEEE80211_MAX_SSID_LEN + 1];
>  	u8 mesh_ssid_len;
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index 4b086cd..6723c67 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -512,7 +512,7 @@ static int lbs_thread(void *data)
>  				if (priv->connect_status == LBS_CONNECTED)
>  					netif_wake_queue(priv->dev);
>  				if (priv->mesh_dev &&
> -				    lbs_mesh_connected(priv))
> +				    netif_running(priv->mesh_dev))
>  					netif_wake_queue(priv->mesh_dev);
>  			}
>  		}
> diff --git a/drivers/net/wireless/libertas/mesh.c b/drivers/net/wireless/libertas/mesh.c
> index a20419d..be72c08 100644
> --- a/drivers/net/wireless/libertas/mesh.c
> +++ b/drivers/net/wireless/libertas/mesh.c
> @@ -270,17 +270,11 @@ static ssize_t lbs_mesh_set(struct device *dev,
>  {
>  	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
>  	int enable;
> -	int ret, action = CMD_ACT_MESH_CONFIG_STOP;
>  
>  	sscanf(buf, "%x", &enable);
>  	enable = !!enable;
>  	if (enable == !!priv->mesh_dev)
>  		return count;
> -	if (enable)
> -		action = CMD_ACT_MESH_CONFIG_START;
> -	ret = lbs_mesh_config(priv, action, priv->channel);
> -	if (ret)
> -		return ret;
>  
>  	if (enable)
>  		lbs_add_mesh(priv);
> @@ -823,8 +817,6 @@ int lbs_init_mesh(struct lbs_private *priv)
>  
>  	lbs_deb_enter(LBS_DEB_MESH);
>  
> -	priv->mesh_connect_status = LBS_DISCONNECTED;
> -
>  	/* Determine mesh_fw_ver from fwrelease and fwcapinfo */
>  	/* 5.0.16p0 9.0.0.p0 is known to NOT support any mesh */
>  	/* 5.110.22 have mesh command with 0xa3 command id */
> @@ -864,6 +856,8 @@ int lbs_init_mesh(struct lbs_private *priv)
>  			priv->mesh_tlv = 0;
>  	}
>  
> +	/* Stop meshing until interface is brought up */
> +	lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_STOP, priv->channel);
>  
>  	if (priv->mesh_tlv) {
>  		sprintf(priv->mesh_ssid, "mesh");
> @@ -910,10 +904,9 @@ static int lbs_mesh_stop(struct net_device *dev)
>  	struct lbs_private *priv = dev->ml_priv;
>  
>  	lbs_deb_enter(LBS_DEB_MESH);
> -	spin_lock_irq(&priv->driver_lock);
> +	lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_STOP, priv->channel);
>  
> -	priv->mesh_open = 0;
> -	priv->mesh_connect_status = LBS_DISCONNECTED;
> +	spin_lock_irq(&priv->driver_lock);
>  
>  	netif_stop_queue(dev);
>  	netif_carrier_off(dev);
> @@ -943,18 +936,20 @@ static int lbs_mesh_dev_open(struct net_device *dev)
>  
>  	if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR) {
>  		ret = -EBUSY;
> +		spin_unlock_irq(&priv->driver_lock);
>  		goto out;
>  	}
>  
> -	priv->mesh_open = 1;
> -	priv->mesh_connect_status = LBS_CONNECTED;
>  	netif_carrier_on(dev);
>  
>  	if (!priv->tx_pending_len)
>  		netif_wake_queue(dev);
> - out:
>  
>  	spin_unlock_irq(&priv->driver_lock);
> +
> +	ret = lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_START, priv->channel);
> +
> +out:
>  	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
>  	return ret;
>  }
> diff --git a/drivers/net/wireless/libertas/mesh.h b/drivers/net/wireless/libertas/mesh.h
> index 7d3dd81..5014491 100644
> --- a/drivers/net/wireless/libertas/mesh.h
> +++ b/drivers/net/wireless/libertas/mesh.h
> @@ -63,11 +63,6 @@ void lbs_mesh_ethtool_get_strings(struct net_device *dev,
>  	uint32_t stringset, uint8_t *s);
>  
> 
> -/* Accessors */
> -
> -#define lbs_mesh_open(priv) (priv->mesh_open)
> -#define lbs_mesh_connected(priv) (priv->mesh_connect_status == LBS_CONNECTED)
> -
>  #else
>  
>  #define lbs_init_mesh(priv)
> @@ -77,8 +72,6 @@ void lbs_mesh_ethtool_get_strings(struct net_device *dev,
>  #define lbs_mesh_set_dev(priv, dev, rxpd) (dev)
>  #define lbs_mesh_set_txpd(priv, dev, txpd)
>  #define lbs_mesh_config(priv, enable, chan)
> -#define lbs_mesh_open(priv) (0)
> -#define lbs_mesh_connected(priv) (0)
>  
>  #endif
>  
> diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
> index f19495b..a6e8513 100644
> --- a/drivers/net/wireless/libertas/tx.c
> +++ b/drivers/net/wireless/libertas/tx.c
> @@ -199,7 +199,7 @@ void lbs_send_tx_feedback(struct lbs_private *priv, u32 try_count)
>  	if (priv->connect_status == LBS_CONNECTED)
>  		netif_wake_queue(priv->dev);
>  
> -	if (priv->mesh_dev && lbs_mesh_connected(priv))
> +	if (priv->mesh_dev && netif_running(priv->mesh_dev))
>  		netif_wake_queue(priv->mesh_dev);
>  }
>  EXPORT_SYMBOL_GPL(lbs_send_tx_feedback);


--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index 094e1f2..8a43ec0 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -44,9 +44,7 @@  struct lbs_private {
 	/* Mesh */
 	struct net_device *mesh_dev; /* Virtual device */
 #ifdef CONFIG_LIBERTAS_MESH
-	u32 mesh_connect_status;
 	struct lbs_mesh_stats mstats;
-	int mesh_open;
 	uint16_t mesh_tlv;
 	u8 mesh_ssid[IEEE80211_MAX_SSID_LEN + 1];
 	u8 mesh_ssid_len;
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 4b086cd..6723c67 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -512,7 +512,7 @@  static int lbs_thread(void *data)
 				if (priv->connect_status == LBS_CONNECTED)
 					netif_wake_queue(priv->dev);
 				if (priv->mesh_dev &&
-				    lbs_mesh_connected(priv))
+				    netif_running(priv->mesh_dev))
 					netif_wake_queue(priv->mesh_dev);
 			}
 		}
diff --git a/drivers/net/wireless/libertas/mesh.c b/drivers/net/wireless/libertas/mesh.c
index a20419d..be72c08 100644
--- a/drivers/net/wireless/libertas/mesh.c
+++ b/drivers/net/wireless/libertas/mesh.c
@@ -270,17 +270,11 @@  static ssize_t lbs_mesh_set(struct device *dev,
 {
 	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
 	int enable;
-	int ret, action = CMD_ACT_MESH_CONFIG_STOP;
 
 	sscanf(buf, "%x", &enable);
 	enable = !!enable;
 	if (enable == !!priv->mesh_dev)
 		return count;
-	if (enable)
-		action = CMD_ACT_MESH_CONFIG_START;
-	ret = lbs_mesh_config(priv, action, priv->channel);
-	if (ret)
-		return ret;
 
 	if (enable)
 		lbs_add_mesh(priv);
@@ -823,8 +817,6 @@  int lbs_init_mesh(struct lbs_private *priv)
 
 	lbs_deb_enter(LBS_DEB_MESH);
 
-	priv->mesh_connect_status = LBS_DISCONNECTED;
-
 	/* Determine mesh_fw_ver from fwrelease and fwcapinfo */
 	/* 5.0.16p0 9.0.0.p0 is known to NOT support any mesh */
 	/* 5.110.22 have mesh command with 0xa3 command id */
@@ -864,6 +856,8 @@  int lbs_init_mesh(struct lbs_private *priv)
 			priv->mesh_tlv = 0;
 	}
 
+	/* Stop meshing until interface is brought up */
+	lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_STOP, priv->channel);
 
 	if (priv->mesh_tlv) {
 		sprintf(priv->mesh_ssid, "mesh");
@@ -910,10 +904,9 @@  static int lbs_mesh_stop(struct net_device *dev)
 	struct lbs_private *priv = dev->ml_priv;
 
 	lbs_deb_enter(LBS_DEB_MESH);
-	spin_lock_irq(&priv->driver_lock);
+	lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_STOP, priv->channel);
 
-	priv->mesh_open = 0;
-	priv->mesh_connect_status = LBS_DISCONNECTED;
+	spin_lock_irq(&priv->driver_lock);
 
 	netif_stop_queue(dev);
 	netif_carrier_off(dev);
@@ -943,18 +936,20 @@  static int lbs_mesh_dev_open(struct net_device *dev)
 
 	if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR) {
 		ret = -EBUSY;
+		spin_unlock_irq(&priv->driver_lock);
 		goto out;
 	}
 
-	priv->mesh_open = 1;
-	priv->mesh_connect_status = LBS_CONNECTED;
 	netif_carrier_on(dev);
 
 	if (!priv->tx_pending_len)
 		netif_wake_queue(dev);
- out:
 
 	spin_unlock_irq(&priv->driver_lock);
+
+	ret = lbs_mesh_config(priv, CMD_ACT_MESH_CONFIG_START, priv->channel);
+
+out:
 	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
 	return ret;
 }
diff --git a/drivers/net/wireless/libertas/mesh.h b/drivers/net/wireless/libertas/mesh.h
index 7d3dd81..5014491 100644
--- a/drivers/net/wireless/libertas/mesh.h
+++ b/drivers/net/wireless/libertas/mesh.h
@@ -63,11 +63,6 @@  void lbs_mesh_ethtool_get_strings(struct net_device *dev,
 	uint32_t stringset, uint8_t *s);
 
 
-/* Accessors */
-
-#define lbs_mesh_open(priv) (priv->mesh_open)
-#define lbs_mesh_connected(priv) (priv->mesh_connect_status == LBS_CONNECTED)
-
 #else
 
 #define lbs_init_mesh(priv)
@@ -77,8 +72,6 @@  void lbs_mesh_ethtool_get_strings(struct net_device *dev,
 #define lbs_mesh_set_dev(priv, dev, rxpd) (dev)
 #define lbs_mesh_set_txpd(priv, dev, txpd)
 #define lbs_mesh_config(priv, enable, chan)
-#define lbs_mesh_open(priv) (0)
-#define lbs_mesh_connected(priv) (0)
 
 #endif
 
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index f19495b..a6e8513 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -199,7 +199,7 @@  void lbs_send_tx_feedback(struct lbs_private *priv, u32 try_count)
 	if (priv->connect_status == LBS_CONNECTED)
 		netif_wake_queue(priv->dev);
 
-	if (priv->mesh_dev && lbs_mesh_connected(priv))
+	if (priv->mesh_dev && netif_running(priv->mesh_dev))
 		netif_wake_queue(priv->mesh_dev);
 }
 EXPORT_SYMBOL_GPL(lbs_send_tx_feedback);