diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c index 336544cdeca65be1408580ecb7a82a747fd55070..7bc2124382592ef7a28164d02ddccadd61c14280 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 @@ static int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb) 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 @@ static int lbs_process_tx(struct lbs_private *priv, struct sk_buff *skb) 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.