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.c106
1 files changed, 66 insertions, 40 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 03e9eb0dc761..abcee61f8a47 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -318,10 +318,11 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
318 return -ENODEV; 318 return -ENODEV;
319 } 319 }
320 320
321 if (dev_cap->uar_size > pci_resource_len(dev->pdev, 2)) { 321 if (dev_cap->uar_size > pci_resource_len(dev->persist->pdev, 2)) {
322 mlx4_err(dev, "HCA reported UAR size of 0x%x bigger than PCI resource 2 size of 0x%llx, aborting\n", 322 mlx4_err(dev, "HCA reported UAR size of 0x%x bigger than PCI resource 2 size of 0x%llx, aborting\n",
323 dev_cap->uar_size, 323 dev_cap->uar_size,
324 (unsigned long long) pci_resource_len(dev->pdev, 2)); 324 (unsigned long long)
325 pci_resource_len(dev->persist->pdev, 2));
325 return -ENODEV; 326 return -ENODEV;
326 } 327 }
327 328
@@ -541,8 +542,10 @@ static int mlx4_get_pcie_dev_link_caps(struct mlx4_dev *dev,
541 *speed = PCI_SPEED_UNKNOWN; 542 *speed = PCI_SPEED_UNKNOWN;
542 *width = PCIE_LNK_WIDTH_UNKNOWN; 543 *width = PCIE_LNK_WIDTH_UNKNOWN;
543 544
544 err1 = pcie_capability_read_dword(dev->pdev, PCI_EXP_LNKCAP, &lnkcap1); 545 err1 = pcie_capability_read_dword(dev->persist->pdev, PCI_EXP_LNKCAP,
545 err2 = pcie_capability_read_dword(dev->pdev, PCI_EXP_LNKCAP2, &lnkcap2); 546 &lnkcap1);
547 err2 = pcie_capability_read_dword(dev->persist->pdev, PCI_EXP_LNKCAP2,
548 &lnkcap2);
546 if (!err2 && lnkcap2) { /* PCIe r3.0-compliant */ 549 if (!err2 && lnkcap2) { /* PCIe r3.0-compliant */
547 if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_8_0GB) 550 if (lnkcap2 & PCI_EXP_LNKCAP2_SLS_8_0GB)
548 *speed = PCIE_SPEED_8_0GT; 551 *speed = PCIE_SPEED_8_0GT;
@@ -587,7 +590,7 @@ static void mlx4_check_pcie_caps(struct mlx4_dev *dev)
587 return; 590 return;
588 } 591 }
589 592
590 err = pcie_get_minimum_link(dev->pdev, &speed, &width); 593 err = pcie_get_minimum_link(dev->persist->pdev, &speed, &width);
591 if (err || speed == PCI_SPEED_UNKNOWN || 594 if (err || speed == PCI_SPEED_UNKNOWN ||
592 width == PCIE_LNK_WIDTH_UNKNOWN) { 595 width == PCIE_LNK_WIDTH_UNKNOWN) {
593 mlx4_warn(dev, 596 mlx4_warn(dev,
@@ -837,10 +840,12 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
837 840
838 if (dev->caps.uar_page_size * (dev->caps.num_uars - 841 if (dev->caps.uar_page_size * (dev->caps.num_uars -
839 dev->caps.reserved_uars) > 842 dev->caps.reserved_uars) >
840 pci_resource_len(dev->pdev, 2)) { 843 pci_resource_len(dev->persist->pdev,
844 2)) {
841 mlx4_err(dev, "HCA reported UAR region size of 0x%x bigger than PCI resource 2 size of 0x%llx, aborting\n", 845 mlx4_err(dev, "HCA reported UAR region size of 0x%x bigger than PCI resource 2 size of 0x%llx, aborting\n",
842 dev->caps.uar_page_size * dev->caps.num_uars, 846 dev->caps.uar_page_size * dev->caps.num_uars,
843 (unsigned long long) pci_resource_len(dev->pdev, 2)); 847 (unsigned long long)
848 pci_resource_len(dev->persist->pdev, 2));
844 goto err_mem; 849 goto err_mem;
845 } 850 }
846 851
@@ -1492,9 +1497,9 @@ static int map_bf_area(struct mlx4_dev *dev)
1492 if (!dev->caps.bf_reg_size) 1497 if (!dev->caps.bf_reg_size)
1493 return -ENXIO; 1498 return -ENXIO;
1494 1499
1495 bf_start = pci_resource_start(dev->pdev, 2) + 1500 bf_start = pci_resource_start(dev->persist->pdev, 2) +
1496 (dev->caps.num_uars << PAGE_SHIFT); 1501 (dev->caps.num_uars << PAGE_SHIFT);
1497 bf_len = pci_resource_len(dev->pdev, 2) - 1502 bf_len = pci_resource_len(dev->persist->pdev, 2) -
1498 (dev->caps.num_uars << PAGE_SHIFT); 1503 (dev->caps.num_uars << PAGE_SHIFT);
1499 priv->bf_mapping = io_mapping_create_wc(bf_start, bf_len); 1504 priv->bf_mapping = io_mapping_create_wc(bf_start, bf_len);
1500 if (!priv->bf_mapping) 1505 if (!priv->bf_mapping)
@@ -1536,7 +1541,8 @@ static int map_internal_clock(struct mlx4_dev *dev)
1536 struct mlx4_priv *priv = mlx4_priv(dev); 1541 struct mlx4_priv *priv = mlx4_priv(dev);
1537 1542
1538 priv->clock_mapping = 1543 priv->clock_mapping =
1539 ioremap(pci_resource_start(dev->pdev, priv->fw.clock_bar) + 1544 ioremap(pci_resource_start(dev->persist->pdev,
1545 priv->fw.clock_bar) +
1540 priv->fw.clock_offset, MLX4_CLOCK_SIZE); 1546 priv->fw.clock_offset, MLX4_CLOCK_SIZE);
1541 1547
1542 if (!priv->clock_mapping) 1548 if (!priv->clock_mapping)
@@ -1705,7 +1711,8 @@ static void choose_steering_mode(struct mlx4_dev *dev,
1705 if (mlx4_log_num_mgm_entry_size <= 0 && 1711 if (mlx4_log_num_mgm_entry_size <= 0 &&
1706 dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_FS_EN && 1712 dev_cap->flags2 & MLX4_DEV_CAP_FLAG2_FS_EN &&
1707 (!mlx4_is_mfunc(dev) || 1713 (!mlx4_is_mfunc(dev) ||
1708 (dev_cap->fs_max_num_qp_per_entry >= (dev->num_vfs + 1))) && 1714 (dev_cap->fs_max_num_qp_per_entry >=
1715 (dev->persist->num_vfs + 1))) &&
1709 choose_log_fs_mgm_entry_size(dev_cap->fs_max_num_qp_per_entry) >= 1716 choose_log_fs_mgm_entry_size(dev_cap->fs_max_num_qp_per_entry) >=
1710 MLX4_MIN_MGM_LOG_ENTRY_SIZE) { 1717 MLX4_MIN_MGM_LOG_ENTRY_SIZE) {
1711 dev->oper_log_mgm_entry_size = 1718 dev->oper_log_mgm_entry_size =
@@ -2288,7 +2295,8 @@ static void mlx4_enable_msi_x(struct mlx4_dev *dev)
2288 for (i = 0; i < nreq; ++i) 2295 for (i = 0; i < nreq; ++i)
2289 entries[i].entry = i; 2296 entries[i].entry = i;
2290 2297
2291 nreq = pci_enable_msix_range(dev->pdev, entries, 2, nreq); 2298 nreq = pci_enable_msix_range(dev->persist->pdev, entries, 2,
2299 nreq);
2292 2300
2293 if (nreq < 0) { 2301 if (nreq < 0) {
2294 kfree(entries); 2302 kfree(entries);
@@ -2316,7 +2324,7 @@ no_msi:
2316 dev->caps.comp_pool = 0; 2324 dev->caps.comp_pool = 0;
2317 2325
2318 for (i = 0; i < 2; ++i) 2326 for (i = 0; i < 2; ++i)
2319 priv->eq_table.eq[i].irq = dev->pdev->irq; 2327 priv->eq_table.eq[i].irq = dev->persist->pdev->irq;
2320} 2328}
2321 2329
2322static int mlx4_init_port_info(struct mlx4_dev *dev, int port) 2330static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
@@ -2344,7 +2352,7 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
2344 info->port_attr.show = show_port_type; 2352 info->port_attr.show = show_port_type;
2345 sysfs_attr_init(&info->port_attr.attr); 2353 sysfs_attr_init(&info->port_attr.attr);
2346 2354
2347 err = device_create_file(&dev->pdev->dev, &info->port_attr); 2355 err = device_create_file(&dev->persist->pdev->dev, &info->port_attr);
2348 if (err) { 2356 if (err) {
2349 mlx4_err(dev, "Failed to create file for port %d\n", port); 2357 mlx4_err(dev, "Failed to create file for port %d\n", port);
2350 info->port = -1; 2358 info->port = -1;
@@ -2361,10 +2369,12 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port)
2361 info->port_mtu_attr.show = show_port_ib_mtu; 2369 info->port_mtu_attr.show = show_port_ib_mtu;
2362 sysfs_attr_init(&info->port_mtu_attr.attr); 2370 sysfs_attr_init(&info->port_mtu_attr.attr);
2363 2371
2364 err = device_create_file(&dev->pdev->dev, &info->port_mtu_attr); 2372 err = device_create_file(&dev->persist->pdev->dev,
2373 &info->port_mtu_attr);
2365 if (err) { 2374 if (err) {
2366 mlx4_err(dev, "Failed to create mtu file for port %d\n", port); 2375 mlx4_err(dev, "Failed to create mtu file for port %d\n", port);
2367 device_remove_file(&info->dev->pdev->dev, &info->port_attr); 2376 device_remove_file(&info->dev->persist->pdev->dev,
2377 &info->port_attr);
2368 info->port = -1; 2378 info->port = -1;
2369 } 2379 }
2370 2380
@@ -2376,8 +2386,9 @@ static void mlx4_cleanup_port_info(struct mlx4_port_info *info)
2376 if (info->port < 0) 2386 if (info->port < 0)
2377 return; 2387 return;
2378 2388
2379 device_remove_file(&info->dev->pdev->dev, &info->port_attr); 2389 device_remove_file(&info->dev->persist->pdev->dev, &info->port_attr);
2380 device_remove_file(&info->dev->pdev->dev, &info->port_mtu_attr); 2390 device_remove_file(&info->dev->persist->pdev->dev,
2391 &info->port_mtu_attr);
2381} 2392}
2382 2393
2383static int mlx4_init_steering(struct mlx4_dev *dev) 2394static int mlx4_init_steering(struct mlx4_dev *dev)
@@ -2444,10 +2455,11 @@ static int mlx4_get_ownership(struct mlx4_dev *dev)
2444 void __iomem *owner; 2455 void __iomem *owner;
2445 u32 ret; 2456 u32 ret;
2446 2457
2447 if (pci_channel_offline(dev->pdev)) 2458 if (pci_channel_offline(dev->persist->pdev))
2448 return -EIO; 2459 return -EIO;
2449 2460
2450 owner = ioremap(pci_resource_start(dev->pdev, 0) + MLX4_OWNER_BASE, 2461 owner = ioremap(pci_resource_start(dev->persist->pdev, 0) +
2462 MLX4_OWNER_BASE,
2451 MLX4_OWNER_SIZE); 2463 MLX4_OWNER_SIZE);
2452 if (!owner) { 2464 if (!owner) {
2453 mlx4_err(dev, "Failed to obtain ownership bit\n"); 2465 mlx4_err(dev, "Failed to obtain ownership bit\n");
@@ -2463,10 +2475,11 @@ static void mlx4_free_ownership(struct mlx4_dev *dev)
2463{ 2475{
2464 void __iomem *owner; 2476 void __iomem *owner;
2465 2477
2466 if (pci_channel_offline(dev->pdev)) 2478 if (pci_channel_offline(dev->persist->pdev))
2467 return; 2479 return;
2468 2480
2469 owner = ioremap(pci_resource_start(dev->pdev, 0) + MLX4_OWNER_BASE, 2481 owner = ioremap(pci_resource_start(dev->persist->pdev, 0) +
2482 MLX4_OWNER_BASE,
2470 MLX4_OWNER_SIZE); 2483 MLX4_OWNER_SIZE);
2471 if (!owner) { 2484 if (!owner) {
2472 mlx4_err(dev, "Failed to obtain ownership bit\n"); 2485 mlx4_err(dev, "Failed to obtain ownership bit\n");
@@ -2514,13 +2527,13 @@ static u64 mlx4_enable_sriov(struct mlx4_dev *dev, struct pci_dev *pdev,
2514 dev_flags |= MLX4_FLAG_SRIOV | 2527 dev_flags |= MLX4_FLAG_SRIOV |
2515 MLX4_FLAG_MASTER; 2528 MLX4_FLAG_MASTER;
2516 dev_flags &= ~MLX4_FLAG_SLAVE; 2529 dev_flags &= ~MLX4_FLAG_SLAVE;
2517 dev->num_vfs = total_vfs; 2530 dev->persist->num_vfs = total_vfs;
2518 } 2531 }
2519 return dev_flags; 2532 return dev_flags;
2520 2533
2521disable_sriov: 2534disable_sriov:
2522 atomic_dec(&pf_loading); 2535 atomic_dec(&pf_loading);
2523 dev->num_vfs = 0; 2536 dev->persist->num_vfs = 0;
2524 kfree(dev->dev_vfs); 2537 kfree(dev->dev_vfs);
2525 return dev_flags & ~MLX4_FLAG_MASTER; 2538 return dev_flags & ~MLX4_FLAG_MASTER;
2526} 2539}
@@ -2607,7 +2620,7 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
2607 existing_vfs = pci_num_vf(pdev); 2620 existing_vfs = pci_num_vf(pdev);
2608 if (existing_vfs) 2621 if (existing_vfs)
2609 dev->flags |= MLX4_FLAG_SRIOV; 2622 dev->flags |= MLX4_FLAG_SRIOV;
2610 dev->num_vfs = total_vfs; 2623 dev->persist->num_vfs = total_vfs;
2611 } 2624 }
2612 } 2625 }
2613 2626
@@ -2771,12 +2784,14 @@ slave_start:
2771 dev->caps.num_ports); 2784 dev->caps.num_ports);
2772 goto err_close; 2785 goto err_close;
2773 } 2786 }
2774 memcpy(dev->nvfs, nvfs, sizeof(dev->nvfs)); 2787 memcpy(dev->persist->nvfs, nvfs, sizeof(dev->persist->nvfs));
2775 2788
2776 for (i = 0; i < sizeof(dev->nvfs)/sizeof(dev->nvfs[0]); i++) { 2789 for (i = 0;
2790 i < sizeof(dev->persist->nvfs)/
2791 sizeof(dev->persist->nvfs[0]); i++) {
2777 unsigned j; 2792 unsigned j;
2778 2793
2779 for (j = 0; j < dev->nvfs[i]; ++sum, ++j) { 2794 for (j = 0; j < dev->persist->nvfs[i]; ++sum, ++j) {
2780 dev->dev_vfs[sum].min_port = i < 2 ? i + 1 : 1; 2795 dev->dev_vfs[sum].min_port = i < 2 ? i + 1 : 1;
2781 dev->dev_vfs[sum].n_ports = i < 2 ? 1 : 2796 dev->dev_vfs[sum].n_ports = i < 2 ? 1 :
2782 dev->caps.num_ports; 2797 dev->caps.num_ports;
@@ -2846,7 +2861,7 @@ slave_start:
2846 2861
2847 priv->removed = 0; 2862 priv->removed = 0;
2848 2863
2849 if (mlx4_is_master(dev) && dev->num_vfs) 2864 if (mlx4_is_master(dev) && dev->persist->num_vfs)
2850 atomic_dec(&pf_loading); 2865 atomic_dec(&pf_loading);
2851 2866
2852 kfree(dev_cap); 2867 kfree(dev_cap);
@@ -2908,7 +2923,7 @@ err_sriov:
2908 if (dev->flags & MLX4_FLAG_SRIOV && !existing_vfs) 2923 if (dev->flags & MLX4_FLAG_SRIOV && !existing_vfs)
2909 pci_disable_sriov(pdev); 2924 pci_disable_sriov(pdev);
2910 2925
2911 if (mlx4_is_master(dev) && dev->num_vfs) 2926 if (mlx4_is_master(dev) && dev->persist->num_vfs)
2912 atomic_dec(&pf_loading); 2927 atomic_dec(&pf_loading);
2913 2928
2914 kfree(priv->dev.dev_vfs); 2929 kfree(priv->dev.dev_vfs);
@@ -3076,20 +3091,28 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
3076 return -ENOMEM; 3091 return -ENOMEM;
3077 3092
3078 dev = &priv->dev; 3093 dev = &priv->dev;
3079 dev->pdev = pdev; 3094 dev->persist = kzalloc(sizeof(*dev->persist), GFP_KERNEL);
3080 pci_set_drvdata(pdev, dev); 3095 if (!dev->persist) {
3096 kfree(priv);
3097 return -ENOMEM;
3098 }
3099 dev->persist->pdev = pdev;
3100 dev->persist->dev = dev;
3101 pci_set_drvdata(pdev, dev->persist);
3081 priv->pci_dev_data = id->driver_data; 3102 priv->pci_dev_data = id->driver_data;
3082 3103
3083 ret = __mlx4_init_one(pdev, id->driver_data, priv); 3104 ret = __mlx4_init_one(pdev, id->driver_data, priv);
3084 if (ret) 3105 if (ret) {
3106 kfree(dev->persist);
3085 kfree(priv); 3107 kfree(priv);
3086 3108 }
3087 return ret; 3109 return ret;
3088} 3110}
3089 3111
3090static void mlx4_unload_one(struct pci_dev *pdev) 3112static void mlx4_unload_one(struct pci_dev *pdev)
3091{ 3113{
3092 struct mlx4_dev *dev = pci_get_drvdata(pdev); 3114 struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
3115 struct mlx4_dev *dev = persist->dev;
3093 struct mlx4_priv *priv = mlx4_priv(dev); 3116 struct mlx4_priv *priv = mlx4_priv(dev);
3094 int pci_dev_data; 3117 int pci_dev_data;
3095 int p; 3118 int p;
@@ -3155,7 +3178,7 @@ static void mlx4_unload_one(struct pci_dev *pdev)
3155 mlx4_warn(dev, "Disabling SR-IOV\n"); 3178 mlx4_warn(dev, "Disabling SR-IOV\n");
3156 pci_disable_sriov(pdev); 3179 pci_disable_sriov(pdev);
3157 dev->flags &= ~MLX4_FLAG_SRIOV; 3180 dev->flags &= ~MLX4_FLAG_SRIOV;
3158 dev->num_vfs = 0; 3181 dev->persist->num_vfs = 0;
3159 } 3182 }
3160 3183
3161 if (!mlx4_is_slave(dev)) 3184 if (!mlx4_is_slave(dev))
@@ -3175,26 +3198,29 @@ static void mlx4_unload_one(struct pci_dev *pdev)
3175 3198
3176static void mlx4_remove_one(struct pci_dev *pdev) 3199static void mlx4_remove_one(struct pci_dev *pdev)
3177{ 3200{
3178 struct mlx4_dev *dev = pci_get_drvdata(pdev); 3201 struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
3202 struct mlx4_dev *dev = persist->dev;
3179 struct mlx4_priv *priv = mlx4_priv(dev); 3203 struct mlx4_priv *priv = mlx4_priv(dev);
3180 3204
3181 mlx4_unload_one(pdev); 3205 mlx4_unload_one(pdev);
3182 pci_release_regions(pdev); 3206 pci_release_regions(pdev);
3183 pci_disable_device(pdev); 3207 pci_disable_device(pdev);
3208 kfree(dev->persist);
3184 kfree(priv); 3209 kfree(priv);
3185 pci_set_drvdata(pdev, NULL); 3210 pci_set_drvdata(pdev, NULL);
3186} 3211}
3187 3212
3188int mlx4_restart_one(struct pci_dev *pdev) 3213int mlx4_restart_one(struct pci_dev *pdev)
3189{ 3214{
3190 struct mlx4_dev *dev = pci_get_drvdata(pdev); 3215 struct mlx4_dev_persistent *persist = pci_get_drvdata(pdev);
3216 struct mlx4_dev *dev = persist->dev;
3191 struct mlx4_priv *priv = mlx4_priv(dev); 3217 struct mlx4_priv *priv = mlx4_priv(dev);
3192 int nvfs[MLX4_MAX_PORTS + 1] = {0, 0, 0}; 3218 int nvfs[MLX4_MAX_PORTS + 1] = {0, 0, 0};
3193 int pci_dev_data, err, total_vfs; 3219 int pci_dev_data, err, total_vfs;
3194 3220
3195 pci_dev_data = priv->pci_dev_data; 3221 pci_dev_data = priv->pci_dev_data;
3196 total_vfs = dev->num_vfs; 3222 total_vfs = dev->persist->num_vfs;
3197 memcpy(nvfs, dev->nvfs, sizeof(dev->nvfs)); 3223 memcpy(nvfs, dev->persist->nvfs, sizeof(dev->persist->nvfs));
3198 3224
3199 mlx4_unload_one(pdev); 3225 mlx4_unload_one(pdev);
3200 err = mlx4_load_one(pdev, pci_dev_data, total_vfs, nvfs, priv); 3226 err = mlx4_load_one(pdev, pci_dev_data, total_vfs, nvfs, priv);