aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ipw2200.c
diff options
context:
space:
mode:
authorJames Ketrenos <jketreno@linux.intel.com>2006-02-13 20:10:51 -0500
committerJohn W. Linville <linville@tuxdriver.com>2006-03-17 15:08:02 -0500
commitf697014af90c1db3c7b299327bf5a9548945b8bf (patch)
tree983fd3e7a6c3c365a78f9d79cfdfd5761b60c7ea /drivers/net/wireless/ipw2200.c
parent48a847709f821b5eecd45ae7660add1869f9cd37 (diff)
[PATCH] ipw2200: stop netdev queue if h/w doesn't have space for new packets
The patch roll back the change we made to support for the ability to start/stop independent Tx queues within a single net device in order to support 802.11e QoS. We need to be able to indicate to the upper layers that packets of a given priority can not be sent any more without halting transmission of all packets, and without rescheduling high priority packets down to the next priority level. So we return NETDEV_TX_BUSY in this case and rely on the stack would take care of rescheduling... which it apparently does immediately and consumes the CPU. This caused the ksoftirqd kernel thread consuming almost all the CPU... To put the code back to the way it was before we made these changes we put the call netif_queue_stop back in ipw_tx_skb. This effectively disables multiple priority based transmit queues for 802.11e, but given that its broken anyway... Signed-off-by: James Ketrenos <jketreno@linux.intel.com> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ipw2200.c')
-rw-r--r--drivers/net/wireless/ipw2200.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index a7483809d872..4722de13f1db 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -9648,11 +9648,6 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
9648 u16 remaining_bytes; 9648 u16 remaining_bytes;
9649 int fc; 9649 int fc;
9650 9650
9651 /* If there isn't room in the queue, we return busy and let the
9652 * network stack requeue the packet for us */
9653 if (ipw_queue_space(q) < q->high_mark)
9654 return NETDEV_TX_BUSY;
9655
9656 switch (priv->ieee->iw_mode) { 9651 switch (priv->ieee->iw_mode) {
9657 case IW_MODE_ADHOC: 9652 case IW_MODE_ADHOC:
9658 hdr_len = IEEE80211_3ADDR_LEN; 9653 hdr_len = IEEE80211_3ADDR_LEN;
@@ -9818,6 +9813,9 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb,
9818 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd); 9813 q->first_empty = ipw_queue_inc_wrap(q->first_empty, q->n_bd);
9819 ipw_write32(priv, q->reg_w, q->first_empty); 9814 ipw_write32(priv, q->reg_w, q->first_empty);
9820 9815
9816 if (ipw_queue_space(q) < q->high_mark)
9817 netif_stop_queue(priv->net_dev);
9818
9821 return NETDEV_TX_OK; 9819 return NETDEV_TX_OK;
9822 9820
9823 drop: 9821 drop: