aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wan
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wan')
-rw-r--r--drivers/net/wan/dlci.c43
-rw-r--r--drivers/net/wan/sdla.c8
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
189static netdev_tx_t dlci_transmit(struct sk_buff *skb, 189static 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
231static int dlci_config(struct net_device *dev, struct dlci_conf __user *conf, int get) 198static 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!! */
654static netdev_tx_t sdla_transmit(struct sk_buff *skb, 654static 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