diff options
author | Yishai Hadas <yishaih@mellanox.com> | 2015-01-25 09:59:35 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-25 17:43:13 -0500 |
commit | 872bf2fb69d90e3619befee842fc26db39d8e475 (patch) | |
tree | cd57553d6b75b48bf75a9aa6c4358fbed88e7b4a /drivers/net/ethernet/mellanox/mlx4/main.c | |
parent | 7aee42c6764bae75d0eb2f674f0874193de90c05 (diff) |
net/mlx4_core: Maintain a persistent memory for mlx4 device
Maintain a persistent memory that should survive reset flow/PCI error.
This comes as a preparation for coming series to support above flows.
Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 106 |
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 | ||
2322 | static int mlx4_init_port_info(struct mlx4_dev *dev, int port) | 2330 | static 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 | ||
2383 | static int mlx4_init_steering(struct mlx4_dev *dev) | 2394 | static 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 | ||
2521 | disable_sriov: | 2534 | disable_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 | ||
3090 | static void mlx4_unload_one(struct pci_dev *pdev) | 3112 | static 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 | ||
3176 | static void mlx4_remove_one(struct pci_dev *pdev) | 3199 | static 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 | ||
3188 | int mlx4_restart_one(struct pci_dev *pdev) | 3213 | int 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); |