Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / sis / sis900.c
index efca14eaefa9324487e3a0aa496730145920795d..eb4aea3fe793a8372292023877eecae57c5b5acd 100644 (file)
@@ -1187,8 +1187,14 @@ sis900_init_rx_ring(struct net_device *net_dev)
                }
                sis_priv->rx_skbuff[i] = skb;
                sis_priv->rx_ring[i].cmdsts = RX_BUF_SIZE;
-                sis_priv->rx_ring[i].bufptr = pci_map_single(sis_priv->pci_dev,
-                        skb->data, RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
+               sis_priv->rx_ring[i].bufptr = pci_map_single(sis_priv->pci_dev,
+                               skb->data, RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
+               if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
+                               sis_priv->rx_ring[i].bufptr))) {
+                       dev_kfree_skb(skb);
+                       sis_priv->rx_skbuff[i] = NULL;
+                       break;
+               }
        }
        sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC);
 
@@ -1621,6 +1627,14 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
        /* set the transmit buffer descriptor and enable Transmit State Machine */
        sis_priv->tx_ring[entry].bufptr = pci_map_single(sis_priv->pci_dev,
                skb->data, skb->len, PCI_DMA_TODEVICE);
+       if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
+               sis_priv->tx_ring[entry].bufptr))) {
+                       dev_kfree_skb(skb);
+                       sis_priv->tx_skbuff[entry] = NULL;
+                       net_dev->stats.tx_dropped++;
+                       spin_unlock_irqrestore(&sis_priv->lock, flags);
+                       return NETDEV_TX_OK;
+       }
        sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len);
        sw32(cr, TxENA | sr32(cr));
 
@@ -1824,9 +1838,15 @@ static int sis900_rx(struct net_device *net_dev)
 refill_rx_ring:
                        sis_priv->rx_skbuff[entry] = skb;
                        sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE;
-                       sis_priv->rx_ring[entry].bufptr =
+                       sis_priv->rx_ring[entry].bufptr =
                                pci_map_single(sis_priv->pci_dev, skb->data,
                                        RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
+                       if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
+                               sis_priv->rx_ring[entry].bufptr))) {
+                               dev_kfree_skb_irq(skb);
+                               sis_priv->rx_skbuff[entry] = NULL;
+                               break;
+                       }
                }
                sis_priv->cur_rx++;
                entry = sis_priv->cur_rx % NUM_RX_DESC;
@@ -1841,23 +1861,26 @@ refill_rx_ring:
                entry = sis_priv->dirty_rx % NUM_RX_DESC;
 
                if (sis_priv->rx_skbuff[entry] == NULL) {
-                       if ((skb = netdev_alloc_skb(net_dev, RX_BUF_SIZE)) == NULL) {
+                       skb = netdev_alloc_skb(net_dev, RX_BUF_SIZE);
+                       if (skb == NULL) {
                                /* not enough memory for skbuff, this makes a
                                 * "hole" on the buffer ring, it is not clear
                                 * how the hardware will react to this kind
                                 * of degenerated buffer */
-                               if (netif_msg_rx_err(sis_priv))
-                                       printk(KERN_INFO "%s: Memory squeeze, "
-                                               "deferring packet.\n",
-                                               net_dev->name);
                                net_dev->stats.rx_dropped++;
                                break;
                        }
                        sis_priv->rx_skbuff[entry] = skb;
                        sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE;
-                       sis_priv->rx_ring[entry].bufptr =
+                       sis_priv->rx_ring[entry].bufptr =
                                pci_map_single(sis_priv->pci_dev, skb->data,
                                        RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
+                       if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
+                                       sis_priv->rx_ring[entry].bufptr))) {
+                               dev_kfree_skb_irq(skb);
+                               sis_priv->rx_skbuff[entry] = NULL;
+                               break;
+                       }
                }
        }
        /* re-enable the potentially idle receive state matchine */