From 3b5b40fffae4ae4302b4b0011ef0b0a17202923b Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Wed, 12 Dec 2007 00:41:51 -0500 Subject: [PATCH] --- yaml --- r: 79187 b: refs/heads/master c: a27b9f96f21a2f15c423cca745f65de3db61e364 h: refs/heads/master i: 79185: 09a2cd9c484e347a10bb27f9c2cd071e4bc134f0 79183: 08a74ac4dd5eb599e7e0e9dedffa60c00386df32 v: v3 --- [refs] | 2 +- trunk/drivers/net/wireless/libertas/cmdresp.c | 14 ++++++++------ trunk/drivers/net/wireless/libertas/join.c | 7 ++++--- trunk/drivers/net/wireless/libertas/main.c | 12 +----------- trunk/drivers/net/wireless/libertas/scan.c | 12 +++++++----- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/[refs] b/[refs] index c6e295af2a36..9c38a0f2c58e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 23d36eec263d2c913ee651dc43472524397e4a0b +refs/heads/master: a27b9f96f21a2f15c423cca745f65de3db61e364 diff --git a/trunk/drivers/net/wireless/libertas/cmdresp.c b/trunk/drivers/net/wireless/libertas/cmdresp.c index 53f73c4abdd0..a809f8f9997b 100644 --- a/trunk/drivers/net/wireless/libertas/cmdresp.c +++ b/trunk/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/trunk/drivers/net/wireless/libertas/join.c b/trunk/drivers/net/wireless/libertas/join.c index 14425d9a198a..2d4508048b68 100644 --- a/trunk/drivers/net/wireless/libertas/join.c +++ b/trunk/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/trunk/drivers/net/wireless/libertas/main.c b/trunk/drivers/net/wireless/libertas/main.c index cdf5934aaf8b..f9bdd123ec45 100644 --- a/trunk/drivers/net/wireless/libertas/main.c +++ b/trunk/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/trunk/drivers/net/wireless/libertas/scan.c b/trunk/drivers/net/wireless/libertas/scan.c index 92d84c72e2a9..9a61188b62e9 100644 --- a/trunk/drivers/net/wireless/libertas/scan.c +++ b/trunk/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 @@ int lbs_scan_networks(struct lbs_private *priv, 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);