aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 7cf9dadcb471..908326876ab5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -666,13 +666,15 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
666 return -ENODEV; 666 return -ENODEV;
667 } 667 }
668 668
669 dev->caps.qp0_qkey = kcalloc(dev->caps.num_ports, sizeof(u32), GFP_KERNEL);
669 dev->caps.qp0_tunnel = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 670 dev->caps.qp0_tunnel = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL);
670 dev->caps.qp0_proxy = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 671 dev->caps.qp0_proxy = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL);
671 dev->caps.qp1_tunnel = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 672 dev->caps.qp1_tunnel = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL);
672 dev->caps.qp1_proxy = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 673 dev->caps.qp1_proxy = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL);
673 674
674 if (!dev->caps.qp0_tunnel || !dev->caps.qp0_proxy || 675 if (!dev->caps.qp0_tunnel || !dev->caps.qp0_proxy ||
675 !dev->caps.qp1_tunnel || !dev->caps.qp1_proxy) { 676 !dev->caps.qp1_tunnel || !dev->caps.qp1_proxy ||
677 !dev->caps.qp0_qkey) {
676 err = -ENOMEM; 678 err = -ENOMEM;
677 goto err_mem; 679 goto err_mem;
678 } 680 }
@@ -684,6 +686,7 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
684 " port %d, aborting (%d).\n", i, err); 686 " port %d, aborting (%d).\n", i, err);
685 goto err_mem; 687 goto err_mem;
686 } 688 }
689 dev->caps.qp0_qkey[i - 1] = func_cap.qp0_qkey;
687 dev->caps.qp0_tunnel[i - 1] = func_cap.qp0_tunnel_qpn; 690 dev->caps.qp0_tunnel[i - 1] = func_cap.qp0_tunnel_qpn;
688 dev->caps.qp0_proxy[i - 1] = func_cap.qp0_proxy_qpn; 691 dev->caps.qp0_proxy[i - 1] = func_cap.qp0_proxy_qpn;
689 dev->caps.qp1_tunnel[i - 1] = func_cap.qp1_tunnel_qpn; 692 dev->caps.qp1_tunnel[i - 1] = func_cap.qp1_tunnel_qpn;
@@ -729,12 +732,16 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
729 return 0; 732 return 0;
730 733
731err_mem: 734err_mem:
735 kfree(dev->caps.qp0_qkey);
732 kfree(dev->caps.qp0_tunnel); 736 kfree(dev->caps.qp0_tunnel);
733 kfree(dev->caps.qp0_proxy); 737 kfree(dev->caps.qp0_proxy);
734 kfree(dev->caps.qp1_tunnel); 738 kfree(dev->caps.qp1_tunnel);
735 kfree(dev->caps.qp1_proxy); 739 kfree(dev->caps.qp1_proxy);
736 dev->caps.qp0_tunnel = dev->caps.qp0_proxy = 740 dev->caps.qp0_qkey = NULL;
737 dev->caps.qp1_tunnel = dev->caps.qp1_proxy = NULL; 741 dev->caps.qp0_tunnel = NULL;
742 dev->caps.qp0_proxy = NULL;
743 dev->caps.qp1_tunnel = NULL;
744 dev->caps.qp1_proxy = NULL;
738 745
739 return err; 746 return err;
740} 747}
@@ -1696,6 +1703,14 @@ unmap_bf:
1696 unmap_internal_clock(dev); 1703 unmap_internal_clock(dev);
1697 unmap_bf_area(dev); 1704 unmap_bf_area(dev);
1698 1705
1706 if (mlx4_is_slave(dev)) {
1707 kfree(dev->caps.qp0_qkey);
1708 kfree(dev->caps.qp0_tunnel);
1709 kfree(dev->caps.qp0_proxy);
1710 kfree(dev->caps.qp1_tunnel);
1711 kfree(dev->caps.qp1_proxy);
1712 }
1713
1699err_close: 1714err_close:
1700 if (mlx4_is_slave(dev)) 1715 if (mlx4_is_slave(dev))
1701 mlx4_slave_exit(dev); 1716 mlx4_slave_exit(dev);
@@ -2565,6 +2580,14 @@ err_master_mfunc:
2565 if (mlx4_is_master(dev)) 2580 if (mlx4_is_master(dev))
2566 mlx4_multi_func_cleanup(dev); 2581 mlx4_multi_func_cleanup(dev);
2567 2582
2583 if (mlx4_is_slave(dev)) {
2584 kfree(dev->caps.qp0_qkey);
2585 kfree(dev->caps.qp0_tunnel);
2586 kfree(dev->caps.qp0_proxy);
2587 kfree(dev->caps.qp1_tunnel);
2588 kfree(dev->caps.qp1_proxy);
2589 }
2590
2568err_close: 2591err_close:
2569 if (dev->flags & MLX4_FLAG_MSI_X) 2592 if (dev->flags & MLX4_FLAG_MSI_X)
2570 pci_disable_msix(pdev); 2593 pci_disable_msix(pdev);
@@ -2688,6 +2711,7 @@ static void __mlx4_remove_one(struct pci_dev *pdev)
2688 if (!mlx4_is_slave(dev)) 2711 if (!mlx4_is_slave(dev))
2689 mlx4_free_ownership(dev); 2712 mlx4_free_ownership(dev);
2690 2713
2714 kfree(dev->caps.qp0_qkey);
2691 kfree(dev->caps.qp0_tunnel); 2715 kfree(dev->caps.qp0_tunnel);
2692 kfree(dev->caps.qp0_proxy); 2716 kfree(dev->caps.qp0_proxy);
2693 kfree(dev->caps.qp1_tunnel); 2717 kfree(dev->caps.qp1_tunnel);