diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wan/dlci.c | 43 | ||||
-rw-r--r-- | drivers/net/wan/sdla.c | 8 |
2 files changed, 9 insertions, 42 deletions
diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c index 69d269d32b5b..15d353f268b5 100644 --- a/drivers/net/wan/dlci.c +++ b/drivers/net/wan/dlci.c | |||
@@ -186,46 +186,13 @@ static void dlci_receive(struct sk_buff *skb, struct net_device *dev) | |||
186 | dev_kfree_skb(skb); | 186 | dev_kfree_skb(skb); |
187 | } | 187 | } |
188 | 188 | ||
189 | static netdev_tx_t dlci_transmit(struct sk_buff *skb, | 189 | static netdev_tx_t dlci_transmit(struct sk_buff *skb, struct net_device *dev) |
190 | struct net_device *dev) | ||
191 | { | 190 | { |
192 | struct dlci_local *dlp; | 191 | struct dlci_local *dlp = netdev_priv(dev); |
193 | netdev_tx_t ret; | ||
194 | |||
195 | if (!skb || !dev) | ||
196 | return NETDEV_TX_OK; | ||
197 | |||
198 | dlp = netdev_priv(dev); | ||
199 | |||
200 | netif_stop_queue(dev); | ||
201 | |||
202 | /* This is hackish, overloads driver specific return values | ||
203 | on top of normal transmit return! */ | ||
204 | ret = dlp->slave->netdev_ops->ndo_start_xmit(skb, dlp->slave); | ||
205 | switch (ret) | ||
206 | { | ||
207 | case DLCI_RET_OK: | ||
208 | dev->stats.tx_packets++; | ||
209 | ret = NETDEV_TX_OK; | ||
210 | break; | ||
211 | case DLCI_RET_ERR: | ||
212 | dev->stats.tx_errors++; | ||
213 | ret = NETDEV_TX_OK; | ||
214 | break; | ||
215 | case DLCI_RET_DROP: | ||
216 | dev->stats.tx_dropped++; | ||
217 | ret = NETDEV_TX_BUSY; | ||
218 | break; | ||
219 | } | ||
220 | /* Alan Cox recommends always returning 0, and always freeing the packet */ | ||
221 | /* experience suggest a slightly more conservative approach */ | ||
222 | 192 | ||
223 | if (ret == NETDEV_TX_OK) | 193 | if (skb) |
224 | { | 194 | dlp->slave->netdev_ops->ndo_start_xmit(skb, dlp->slave); |
225 | dev_kfree_skb(skb); | 195 | return NETDEV_TX_OK; |
226 | netif_wake_queue(dev); | ||
227 | } | ||
228 | return(ret); | ||
229 | } | 196 | } |
230 | 197 | ||
231 | static int dlci_config(struct net_device *dev, struct dlci_conf __user *conf, int get) | 198 | static int dlci_config(struct net_device *dev, struct dlci_conf __user *conf, int get) |
diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index 63c76458431c..2b15a7e40d5b 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c | |||
@@ -652,7 +652,7 @@ static int sdla_dlci_conf(struct net_device *slave, struct net_device *master, i | |||
652 | 652 | ||
653 | /* NOTE: the DLCI driver deals with freeing the SKB!! */ | 653 | /* NOTE: the DLCI driver deals with freeing the SKB!! */ |
654 | static netdev_tx_t sdla_transmit(struct sk_buff *skb, | 654 | static netdev_tx_t sdla_transmit(struct sk_buff *skb, |
655 | struct net_device *dev) | 655 | struct net_device *dev) |
656 | { | 656 | { |
657 | struct frad_local *flp; | 657 | struct frad_local *flp; |
658 | int ret, addr, accept, i; | 658 | int ret, addr, accept, i; |
@@ -712,23 +712,21 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, | |||
712 | } | 712 | } |
713 | break; | 713 | break; |
714 | } | 714 | } |
715 | |||
715 | switch (ret) | 716 | switch (ret) |
716 | { | 717 | { |
717 | case SDLA_RET_OK: | 718 | case SDLA_RET_OK: |
718 | dev->stats.tx_packets++; | 719 | dev->stats.tx_packets++; |
719 | ret = DLCI_RET_OK; | ||
720 | break; | 720 | break; |
721 | 721 | ||
722 | case SDLA_RET_CIR_OVERFLOW: | 722 | case SDLA_RET_CIR_OVERFLOW: |
723 | case SDLA_RET_BUF_OVERSIZE: | 723 | case SDLA_RET_BUF_OVERSIZE: |
724 | case SDLA_RET_NO_BUFS: | 724 | case SDLA_RET_NO_BUFS: |
725 | dev->stats.tx_dropped++; | 725 | dev->stats.tx_dropped++; |
726 | ret = DLCI_RET_DROP; | ||
727 | break; | 726 | break; |
728 | 727 | ||
729 | default: | 728 | default: |
730 | dev->stats.tx_errors++; | 729 | dev->stats.tx_errors++; |
731 | ret = DLCI_RET_ERR; | ||
732 | break; | 730 | break; |
733 | } | 731 | } |
734 | } | 732 | } |
@@ -738,6 +736,8 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb, | |||
738 | if(flp->master[i]!=NULL) | 736 | if(flp->master[i]!=NULL) |
739 | netif_wake_queue(flp->master[i]); | 737 | netif_wake_queue(flp->master[i]); |
740 | } | 738 | } |
739 | |||
740 | dev_kfree_skb(skb); | ||
741 | return NETDEV_TX_OK; | 741 | return NETDEV_TX_OK; |
742 | } | 742 | } |
743 | 743 | ||