diff options
Diffstat (limited to 'drivers/net/ntb_netdev.c')
-rw-r--r-- | drivers/net/ntb_netdev.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index 3cc316cb7e6b..d8757bf9ad75 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c | |||
@@ -102,6 +102,12 @@ static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data, | |||
102 | 102 | ||
103 | netdev_dbg(ndev, "%s: %d byte payload received\n", __func__, len); | 103 | netdev_dbg(ndev, "%s: %d byte payload received\n", __func__, len); |
104 | 104 | ||
105 | if (len < 0) { | ||
106 | ndev->stats.rx_errors++; | ||
107 | ndev->stats.rx_length_errors++; | ||
108 | goto enqueue_again; | ||
109 | } | ||
110 | |||
105 | skb_put(skb, len); | 111 | skb_put(skb, len); |
106 | skb->protocol = eth_type_trans(skb, ndev); | 112 | skb->protocol = eth_type_trans(skb, ndev); |
107 | skb->ip_summed = CHECKSUM_NONE; | 113 | skb->ip_summed = CHECKSUM_NONE; |
@@ -121,6 +127,7 @@ static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data, | |||
121 | return; | 127 | return; |
122 | } | 128 | } |
123 | 129 | ||
130 | enqueue_again: | ||
124 | rc = ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); | 131 | rc = ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); |
125 | if (rc) { | 132 | if (rc) { |
126 | dev_kfree_skb(skb); | 133 | dev_kfree_skb(skb); |
@@ -184,7 +191,7 @@ static int ntb_netdev_open(struct net_device *ndev) | |||
184 | 191 | ||
185 | rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data, | 192 | rc = ntb_transport_rx_enqueue(dev->qp, skb, skb->data, |
186 | ndev->mtu + ETH_HLEN); | 193 | ndev->mtu + ETH_HLEN); |
187 | if (rc == -EINVAL) { | 194 | if (rc) { |
188 | dev_kfree_skb(skb); | 195 | dev_kfree_skb(skb); |
189 | goto err; | 196 | goto err; |
190 | } | 197 | } |