Skip to content

Commit

Permalink
libertas: only enable mesh when interface is active
Browse files Browse the repository at this point in the history
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>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Daniel Drake authored and John W. Linville committed Jul 20, 2011
1 parent 3db4f98 commit d931998
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 25 deletions.
2 changes: 0 additions & 2 deletions drivers/net/wireless/libertas/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/libertas/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,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);
}
}
Expand Down
23 changes: 9 additions & 14 deletions drivers/net/wireless/libertas/mesh.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,17 +269,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);
Expand Down Expand Up @@ -822,8 +816,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 */
Expand Down Expand Up @@ -863,6 +855,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");
Expand Down Expand Up @@ -909,10 +903,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);
Expand Down Expand Up @@ -942,18 +935,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;
}
Expand Down
7 changes: 0 additions & 7 deletions drivers/net/wireless/libertas/mesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/libertas/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,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);

0 comments on commit d931998

Please sign in to comment.