diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 30 |
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 | ||
731 | err_mem: | 734 | err_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 | |||
1699 | err_close: | 1714 | err_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 | |||
2568 | err_close: | 2591 | err_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); |