aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-02-09 17:35:57 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-09 17:35:57 -0500
commit2573beec56aa28a0e6d4430fb6796d0c76308bcf (patch)
tree15c902551b78a954d5138304b97a16a4d9968202 /drivers
parentfd3137cd33ae5590c45c81e9a46fe53b6ab5f66e (diff)
parent531c94a9681b8c253fd0490a4ca8bbe01a38c78b (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/arcnet/com20020-pci.c3
-rw-r--r--drivers/net/dsa/mv88e6131.c3
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-drv.c11
-rw-r--r--drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c57
-rw-r--r--drivers/net/vxlan.c2
5 files changed, 55 insertions, 21 deletions
diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c
index 6c99ff0b0bdd..945f532078e9 100644
--- a/drivers/net/arcnet/com20020-pci.c
+++ b/drivers/net/arcnet/com20020-pci.c
@@ -78,6 +78,9 @@ static int com20020pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
78 78
79 priv = devm_kzalloc(&pdev->dev, sizeof(struct com20020_priv), 79 priv = devm_kzalloc(&pdev->dev, sizeof(struct com20020_priv),
80 GFP_KERNEL); 80 GFP_KERNEL);
81 if (!priv)
82 return -ENOMEM;
83
81 ci = (struct com20020_pci_card_info *)id->driver_data; 84 ci = (struct com20020_pci_card_info *)id->driver_data;
82 priv->ci = ci; 85 priv->ci = ci;
83 86
diff --git a/drivers/net/dsa/mv88e6131.c b/drivers/net/dsa/mv88e6131.c
index 1230f52aa70e..2540ef0142af 100644
--- a/drivers/net/dsa/mv88e6131.c
+++ b/drivers/net/dsa/mv88e6131.c
@@ -139,7 +139,8 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)
139 int nexthop; 139 int nexthop;
140 140
141 nexthop = 0x1f; 141 nexthop = 0x1f;
142 if (i != ds->index && i < ds->dst->pd->nr_chips) 142 if (ds->pd->rtable &&
143 i != ds->index && i < ds->dst->pd->nr_chips)
143 nexthop = ds->pd->rtable[i] & 0x1f; 144 nexthop = ds->pd->rtable[i] & 0x1f;
144 145
145 REG_WRITE(REG_GLOBAL2, 0x06, 0x8000 | (i << 8) | nexthop); 146 REG_WRITE(REG_GLOBAL2, 0x06, 0x8000 | (i << 8) | nexthop);
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
index d41f9f468688..b93d4404d975 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
@@ -342,12 +342,13 @@ static irqreturn_t xgbe_isr(int irq, void *data)
342 dma_ch_isr = XGMAC_DMA_IOREAD(channel, DMA_CH_SR); 342 dma_ch_isr = XGMAC_DMA_IOREAD(channel, DMA_CH_SR);
343 DBGPR(" DMA_CH%u_ISR = %08x\n", i, dma_ch_isr); 343 DBGPR(" DMA_CH%u_ISR = %08x\n", i, dma_ch_isr);
344 344
345 /* If we get a TI or RI interrupt that means per channel DMA 345 /* The TI or RI interrupt bits may still be set even if using
346 * interrupts are not enabled, so we use the private data napi 346 * per channel DMA interrupts. Check to be sure those are not
347 * structure, not the per channel napi structure 347 * enabled before using the private data napi structure.
348 */ 348 */
349 if (XGMAC_GET_BITS(dma_ch_isr, DMA_CH_SR, TI) || 349 if (!pdata->per_channel_irq &&
350 XGMAC_GET_BITS(dma_ch_isr, DMA_CH_SR, RI)) { 350 (XGMAC_GET_BITS(dma_ch_isr, DMA_CH_SR, TI) ||
351 XGMAC_GET_BITS(dma_ch_isr, DMA_CH_SR, RI))) {
351 if (napi_schedule_prep(&pdata->napi)) { 352 if (napi_schedule_prep(&pdata->napi)) {
352 /* Disable Tx and Rx interrupts */ 353 /* Disable Tx and Rx interrupts */
353 xgbe_disable_rx_tx_ints(pdata); 354 xgbe_disable_rx_tx_ints(pdata);
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
index 11288d4fc85f..c8a01ee4d25e 100644
--- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
+++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c
@@ -364,6 +364,26 @@ static int sxgbe_init_rx_buffers(struct net_device *dev,
364 364
365 return 0; 365 return 0;
366} 366}
367
368/**
369 * sxgbe_free_rx_buffers - free what sxgbe_init_rx_buffers() allocated
370 * @dev: net device structure
371 * @rx_ring: ring to be freed
372 * @rx_rsize: ring size
373 * Description: this function initializes the DMA RX descriptor
374 */
375static void sxgbe_free_rx_buffers(struct net_device *dev,
376 struct sxgbe_rx_norm_desc *p, int i,
377 unsigned int dma_buf_sz,
378 struct sxgbe_rx_queue *rx_ring)
379{
380 struct sxgbe_priv_data *priv = netdev_priv(dev);
381
382 kfree_skb(rx_ring->rx_skbuff[i]);
383 dma_unmap_single(priv->device, rx_ring->rx_skbuff_dma[i],
384 dma_buf_sz, DMA_FROM_DEVICE);
385}
386
367/** 387/**
368 * init_tx_ring - init the TX descriptor ring 388 * init_tx_ring - init the TX descriptor ring
369 * @dev: net device structure 389 * @dev: net device structure
@@ -456,7 +476,7 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
456 /* RX ring is not allcoated */ 476 /* RX ring is not allcoated */
457 if (rx_ring == NULL) { 477 if (rx_ring == NULL) {
458 netdev_err(dev, "No memory for RX queue\n"); 478 netdev_err(dev, "No memory for RX queue\n");
459 goto error; 479 return -ENOMEM;
460 } 480 }
461 481
462 /* assign queue number */ 482 /* assign queue number */
@@ -468,23 +488,21 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
468 &rx_ring->dma_rx_phy, GFP_KERNEL); 488 &rx_ring->dma_rx_phy, GFP_KERNEL);
469 489
470 if (rx_ring->dma_rx == NULL) 490 if (rx_ring->dma_rx == NULL)
471 goto error; 491 return -ENOMEM;
472 492
473 /* allocate memory for RX skbuff array */ 493 /* allocate memory for RX skbuff array */
474 rx_ring->rx_skbuff_dma = kmalloc_array(rx_rsize, 494 rx_ring->rx_skbuff_dma = kmalloc_array(rx_rsize,
475 sizeof(dma_addr_t), GFP_KERNEL); 495 sizeof(dma_addr_t), GFP_KERNEL);
476 if (!rx_ring->rx_skbuff_dma) { 496 if (!rx_ring->rx_skbuff_dma) {
477 dma_free_coherent(priv->device, 497 ret = -ENOMEM;
478 rx_rsize * sizeof(struct sxgbe_rx_norm_desc), 498 goto err_free_dma_rx;
479 rx_ring->dma_rx, rx_ring->dma_rx_phy);
480 goto error;
481 } 499 }
482 500
483 rx_ring->rx_skbuff = kmalloc_array(rx_rsize, 501 rx_ring->rx_skbuff = kmalloc_array(rx_rsize,
484 sizeof(struct sk_buff *), GFP_KERNEL); 502 sizeof(struct sk_buff *), GFP_KERNEL);
485 if (!rx_ring->rx_skbuff) { 503 if (!rx_ring->rx_skbuff) {
486 kfree(rx_ring->rx_skbuff_dma); 504 ret = -ENOMEM;
487 goto error; 505 goto err_free_skbuff_dma;
488 } 506 }
489 507
490 /* initialise the buffers */ 508 /* initialise the buffers */
@@ -494,7 +512,7 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
494 ret = sxgbe_init_rx_buffers(dev, p, desc_index, 512 ret = sxgbe_init_rx_buffers(dev, p, desc_index,
495 bfsize, rx_ring); 513 bfsize, rx_ring);
496 if (ret) 514 if (ret)
497 goto err_init_rx_buffers; 515 goto err_free_rx_buffers;
498 } 516 }
499 517
500 /* initalise counters */ 518 /* initalise counters */
@@ -504,11 +522,22 @@ static int init_rx_ring(struct net_device *dev, u8 queue_no,
504 522
505 return 0; 523 return 0;
506 524
507err_init_rx_buffers: 525err_free_rx_buffers:
508 while (--desc_index >= 0) 526 while (--desc_index >= 0) {
509 free_rx_ring(priv->device, rx_ring, desc_index); 527 struct sxgbe_rx_norm_desc *p;
510error: 528
511 return -ENOMEM; 529 p = rx_ring->dma_rx + desc_index;
530 sxgbe_free_rx_buffers(dev, p, desc_index, bfsize, rx_ring);
531 }
532 kfree(rx_ring->rx_skbuff);
533err_free_skbuff_dma:
534 kfree(rx_ring->rx_skbuff_dma);
535err_free_dma_rx:
536 dma_free_coherent(priv->device,
537 rx_rsize * sizeof(struct sxgbe_rx_norm_desc),
538 rx_ring->dma_rx, rx_ring->dma_rx_phy);
539
540 return ret;
512} 541}
513/** 542/**
514 * free_tx_ring - free the TX descriptor ring 543 * free_tx_ring - free the TX descriptor ring
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index e6ed3e66964d..0e57e862c399 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -1009,7 +1009,7 @@ static bool vxlan_snoop(struct net_device *dev,
1009 if (net_ratelimit()) 1009 if (net_ratelimit())
1010 netdev_info(dev, 1010 netdev_info(dev,
1011 "%pM migrated from %pIS to %pIS\n", 1011 "%pM migrated from %pIS to %pIS\n",
1012 src_mac, &rdst->remote_ip, &src_ip); 1012 src_mac, &rdst->remote_ip.sa, &src_ip->sa);
1013 1013
1014 rdst->remote_ip = *src_ip; 1014 rdst->remote_ip = *src_ip;
1015 f->updated = jiffies; 1015 f->updated = jiffies;