Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 79129
b: refs/heads/master
c: f86a93e
h: refs/heads/master
i:
  79127: b17d8aa
v: v3
  • Loading branch information
David Woodhouse authored and David S. Miller committed Jan 28, 2008
1 parent 3e60a69 commit 72f7358
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e7deced05f15693cca71bfae747b8d57eadeb1b2
refs/heads/master: f86a93e1b2d05a7a38a48c91f8fb8fc7e8f1c734
1 change: 0 additions & 1 deletion trunk/drivers/net/wireless/libertas/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
25 changes: 22 additions & 3 deletions trunk/drivers/net/wireless/libertas/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);

Expand Down
9 changes: 3 additions & 6 deletions trunk/drivers/net/wireless/libertas/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -152,11 +152,11 @@ static int SendSinglePacket(struct lbs_private *priv, struct sk_buff *skb)
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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 72f7358

Please sign in to comment.