diff options
author | Patrick McHardy <kaber@trash.net> | 2009-06-12 00:08:02 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-06-13 04:18:37 -0400 |
commit | 4153e77596c4caaf52293b0c6b2207d73ed8f1eb (patch) | |
tree | 5920561315cfea1b89e287d264fdac6314c670ec | |
parent | 4bd73ae2682d9069746bb049a416d9ab90c6684b (diff) |
net: fix network drivers ndo_start_xmit() return values (part 3)
net: fix network drivers ndo_start_xmit() return values (part 3)
Fix up wireless drivers that return an errno value to qdisc_restart(), causing
qdisc_restart() to print a warning an requeue/retransmit the skb.
- airo: transmission not implemented for chip, intention is to free and abort
- ipw2200: transmission not implemented for promiscous mode, intention is to
drop
- prism54: intention is to drop
- wl3501_cs: intention appears to be to drop
- zd1201: error counter indicates intention is to drop
All drivers compile tested.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/wireless/airo.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/prism54/islpci_eth.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/wl3501_cs.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/zd1201.c | 8 |
5 files changed, 10 insertions, 13 deletions
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 9eabf4d1f2e7..dfb30b9c4267 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
@@ -2193,7 +2193,8 @@ static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) { | |||
2193 | if (test_bit(FLAG_MPI, &priv->flags)) { | 2193 | if (test_bit(FLAG_MPI, &priv->flags)) { |
2194 | /* Not implemented yet for MPI350 */ | 2194 | /* Not implemented yet for MPI350 */ |
2195 | netif_stop_queue(dev); | 2195 | netif_stop_queue(dev); |
2196 | return -ENETDOWN; | 2196 | dev_kfree_skb_any(skb); |
2197 | return NETDEV_TX_OK; | ||
2197 | } | 2198 | } |
2198 | 2199 | ||
2199 | if ( skb == NULL ) { | 2200 | if ( skb == NULL ) { |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index c3b3dfe43d1a..44c29b3f6728 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
@@ -11524,7 +11524,8 @@ static int ipw_prom_stop(struct net_device *dev) | |||
11524 | static int ipw_prom_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | 11524 | static int ipw_prom_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) |
11525 | { | 11525 | { |
11526 | IPW_DEBUG_INFO("prom dev->xmit\n"); | 11526 | IPW_DEBUG_INFO("prom dev->xmit\n"); |
11527 | return -EOPNOTSUPP; | 11527 | dev_kfree_skb(skb); |
11528 | return NETDEV_TX_OK; | ||
11528 | } | 11529 | } |
11529 | 11530 | ||
11530 | static const struct net_device_ops ipw_prom_netdev_ops = { | 11531 | static const struct net_device_ops ipw_prom_netdev_ops = { |
diff --git a/drivers/net/wireless/prism54/islpci_eth.c b/drivers/net/wireless/prism54/islpci_eth.c index ef3ef4551b31..8f6210993448 100644 --- a/drivers/net/wireless/prism54/islpci_eth.c +++ b/drivers/net/wireless/prism54/islpci_eth.c | |||
@@ -87,7 +87,6 @@ islpci_eth_transmit(struct sk_buff *skb, struct net_device *ndev) | |||
87 | unsigned long flags; | 87 | unsigned long flags; |
88 | unsigned char wds_mac[6]; | 88 | unsigned char wds_mac[6]; |
89 | u32 curr_frag; | 89 | u32 curr_frag; |
90 | int err = 0; | ||
91 | 90 | ||
92 | #if VERBOSE > SHOW_ERROR_MESSAGES | 91 | #if VERBOSE > SHOW_ERROR_MESSAGES |
93 | DEBUG(SHOW_FUNCTION_CALLS, "islpci_eth_transmit \n"); | 92 | DEBUG(SHOW_FUNCTION_CALLS, "islpci_eth_transmit \n"); |
@@ -107,8 +106,6 @@ islpci_eth_transmit(struct sk_buff *skb, struct net_device *ndev) | |||
107 | isl38xx_w32_flush(priv->device_base, ISL38XX_DEV_INT_UPDATE, | 106 | isl38xx_w32_flush(priv->device_base, ISL38XX_DEV_INT_UPDATE, |
108 | ISL38XX_DEV_INT_REG); | 107 | ISL38XX_DEV_INT_REG); |
109 | udelay(ISL38XX_WRITEIO_DELAY); | 108 | udelay(ISL38XX_WRITEIO_DELAY); |
110 | |||
111 | err = -EBUSY; | ||
112 | goto drop_free; | 109 | goto drop_free; |
113 | } | 110 | } |
114 | /* Check alignment and WDS frame formatting. The start of the packet should | 111 | /* Check alignment and WDS frame formatting. The start of the packet should |
@@ -152,7 +149,6 @@ islpci_eth_transmit(struct sk_buff *skb, struct net_device *ndev) | |||
152 | if (unlikely(newskb == NULL)) { | 149 | if (unlikely(newskb == NULL)) { |
153 | printk(KERN_ERR "%s: Cannot allocate skb\n", | 150 | printk(KERN_ERR "%s: Cannot allocate skb\n", |
154 | ndev->name); | 151 | ndev->name); |
155 | err = -ENOMEM; | ||
156 | goto drop_free; | 152 | goto drop_free; |
157 | } | 153 | } |
158 | newskb_offset = (4 - (long) newskb->data) & 0x03; | 154 | newskb_offset = (4 - (long) newskb->data) & 0x03; |
@@ -197,8 +193,6 @@ islpci_eth_transmit(struct sk_buff *skb, struct net_device *ndev) | |||
197 | if (unlikely(pci_map_address == 0)) { | 193 | if (unlikely(pci_map_address == 0)) { |
198 | printk(KERN_WARNING "%s: cannot map buffer to PCI\n", | 194 | printk(KERN_WARNING "%s: cannot map buffer to PCI\n", |
199 | ndev->name); | 195 | ndev->name); |
200 | |||
201 | err = -EIO; | ||
202 | goto drop_free; | 196 | goto drop_free; |
203 | } | 197 | } |
204 | /* Place the fragment in the control block structure. */ | 198 | /* Place the fragment in the control block structure. */ |
@@ -246,7 +240,7 @@ islpci_eth_transmit(struct sk_buff *skb, struct net_device *ndev) | |||
246 | ndev->stats.tx_dropped++; | 240 | ndev->stats.tx_dropped++; |
247 | spin_unlock_irqrestore(&priv->slock, flags); | 241 | spin_unlock_irqrestore(&priv->slock, flags); |
248 | dev_kfree_skb(skb); | 242 | dev_kfree_skb(skb); |
249 | return err; | 243 | return NETDEV_TX_OK; |
250 | } | 244 | } |
251 | 245 | ||
252 | static inline int | 246 | static inline int |
diff --git a/drivers/net/wireless/wl3501_cs.c b/drivers/net/wireless/wl3501_cs.c index 1f64d6033ab5..e3e96bb2c246 100644 --- a/drivers/net/wireless/wl3501_cs.c +++ b/drivers/net/wireless/wl3501_cs.c | |||
@@ -1348,6 +1348,7 @@ static int wl3501_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1348 | if (rc) { | 1348 | if (rc) { |
1349 | ++dev->stats.tx_dropped; | 1349 | ++dev->stats.tx_dropped; |
1350 | netif_stop_queue(dev); | 1350 | netif_stop_queue(dev); |
1351 | rc = NETDEV_TX_OK; | ||
1351 | } else { | 1352 | } else { |
1352 | ++dev->stats.tx_packets; | 1353 | ++dev->stats.tx_packets; |
1353 | dev->stats.tx_bytes += skb->len; | 1354 | dev->stats.tx_bytes += skb->len; |
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c index 5fabd9c0f07a..4430b8d92e21 100644 --- a/drivers/net/wireless/zd1201.c +++ b/drivers/net/wireless/zd1201.c | |||
@@ -819,11 +819,11 @@ static int zd1201_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
819 | if (err) { | 819 | if (err) { |
820 | dev->stats.tx_errors++; | 820 | dev->stats.tx_errors++; |
821 | netif_start_queue(dev); | 821 | netif_start_queue(dev); |
822 | return err; | 822 | } else { |
823 | dev->stats.tx_packets++; | ||
824 | dev->stats.tx_bytes += skb->len; | ||
825 | dev->trans_start = jiffies; | ||
823 | } | 826 | } |
824 | dev->stats.tx_packets++; | ||
825 | dev->stats.tx_bytes += skb->len; | ||
826 | dev->trans_start = jiffies; | ||
827 | kfree_skb(skb); | 827 | kfree_skb(skb); |
828 | 828 | ||
829 | return 0; | 829 | return 0; |