diff options
author | Yevgeny Petrilin <yevgenyp@mellanox.com> | 2013-07-28 11:54:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-29 04:12:40 -0400 |
commit | fe6f700d6cbb7e8a61711e325f53d9c9e0a42a4c (patch) | |
tree | 1a3d5b95434519950cb10ed9e51b50c2583e53fd /drivers/net/ethernet/mellanox/mlx4/main.c | |
parent | 2d4b646613d6b12175b017aca18113945af1faf3 (diff) |
net/mlx4_core: Respond to operation request by firmware
This commit adds new firmware command and new firmware event. The firmware
raises the MLX4_EVENT_TYPE_OP_REQUIRED event in order to signal the driver it
needs to perform an administrative operation throughout the MLX4_CMD_GET_OP_REQ
command. At the moment the supported operation is adding/removing multicast
entries which are used by the firmware for handling NCSI traffic in B0
steering mode.
Also, had to swap the order of mlx4_init_mcg_table() and
mlx4_init_eq_table() to make sure that driver will get events only after
resources are initialized to handle it.
Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.com>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.com>
Signed-off-by: Eugenia Emantayev <eugenia@mellanox.com>
Signed-off-by: Amir Vadai <amirv@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 | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index e85af922dcdc..f1d818f9bb01 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
@@ -1692,11 +1692,19 @@ static int mlx4_setup_hca(struct mlx4_dev *dev) | |||
1692 | goto err_xrcd_table_free; | 1692 | goto err_xrcd_table_free; |
1693 | } | 1693 | } |
1694 | 1694 | ||
1695 | if (!mlx4_is_slave(dev)) { | ||
1696 | err = mlx4_init_mcg_table(dev); | ||
1697 | if (err) { | ||
1698 | mlx4_err(dev, "Failed to initialize multicast group table, aborting.\n"); | ||
1699 | goto err_mr_table_free; | ||
1700 | } | ||
1701 | } | ||
1702 | |||
1695 | err = mlx4_init_eq_table(dev); | 1703 | err = mlx4_init_eq_table(dev); |
1696 | if (err) { | 1704 | if (err) { |
1697 | mlx4_err(dev, "Failed to initialize " | 1705 | mlx4_err(dev, "Failed to initialize " |
1698 | "event queue table, aborting.\n"); | 1706 | "event queue table, aborting.\n"); |
1699 | goto err_mr_table_free; | 1707 | goto err_mcg_table_free; |
1700 | } | 1708 | } |
1701 | 1709 | ||
1702 | err = mlx4_cmd_use_events(dev); | 1710 | err = mlx4_cmd_use_events(dev); |
@@ -1746,19 +1754,10 @@ static int mlx4_setup_hca(struct mlx4_dev *dev) | |||
1746 | goto err_srq_table_free; | 1754 | goto err_srq_table_free; |
1747 | } | 1755 | } |
1748 | 1756 | ||
1749 | if (!mlx4_is_slave(dev)) { | ||
1750 | err = mlx4_init_mcg_table(dev); | ||
1751 | if (err) { | ||
1752 | mlx4_err(dev, "Failed to initialize " | ||
1753 | "multicast group table, aborting.\n"); | ||
1754 | goto err_qp_table_free; | ||
1755 | } | ||
1756 | } | ||
1757 | |||
1758 | err = mlx4_init_counters_table(dev); | 1757 | err = mlx4_init_counters_table(dev); |
1759 | if (err && err != -ENOENT) { | 1758 | if (err && err != -ENOENT) { |
1760 | mlx4_err(dev, "Failed to initialize counters table, aborting.\n"); | 1759 | mlx4_err(dev, "Failed to initialize counters table, aborting.\n"); |
1761 | goto err_mcg_table_free; | 1760 | goto err_qp_table_free; |
1762 | } | 1761 | } |
1763 | 1762 | ||
1764 | if (!mlx4_is_slave(dev)) { | 1763 | if (!mlx4_is_slave(dev)) { |
@@ -1803,9 +1802,6 @@ static int mlx4_setup_hca(struct mlx4_dev *dev) | |||
1803 | err_counters_table_free: | 1802 | err_counters_table_free: |
1804 | mlx4_cleanup_counters_table(dev); | 1803 | mlx4_cleanup_counters_table(dev); |
1805 | 1804 | ||
1806 | err_mcg_table_free: | ||
1807 | mlx4_cleanup_mcg_table(dev); | ||
1808 | |||
1809 | err_qp_table_free: | 1805 | err_qp_table_free: |
1810 | mlx4_cleanup_qp_table(dev); | 1806 | mlx4_cleanup_qp_table(dev); |
1811 | 1807 | ||
@@ -1821,6 +1817,10 @@ err_cmd_poll: | |||
1821 | err_eq_table_free: | 1817 | err_eq_table_free: |
1822 | mlx4_cleanup_eq_table(dev); | 1818 | mlx4_cleanup_eq_table(dev); |
1823 | 1819 | ||
1820 | err_mcg_table_free: | ||
1821 | if (!mlx4_is_slave(dev)) | ||
1822 | mlx4_cleanup_mcg_table(dev); | ||
1823 | |||
1824 | err_mr_table_free: | 1824 | err_mr_table_free: |
1825 | mlx4_cleanup_mr_table(dev); | 1825 | mlx4_cleanup_mr_table(dev); |
1826 | 1826 | ||
@@ -2197,6 +2197,9 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) | |||
2197 | } | 2197 | } |
2198 | } | 2198 | } |
2199 | 2199 | ||
2200 | atomic_set(&priv->opreq_count, 0); | ||
2201 | INIT_WORK(&priv->opreq_task, mlx4_opreq_action); | ||
2202 | |||
2200 | /* | 2203 | /* |
2201 | * Now reset the HCA before we touch the PCI capabilities or | 2204 | * Now reset the HCA before we touch the PCI capabilities or |
2202 | * attempt a firmware command, since a boot ROM may have left | 2205 | * attempt a firmware command, since a boot ROM may have left |
@@ -2315,12 +2318,12 @@ err_port: | |||
2315 | mlx4_cleanup_port_info(&priv->port[port]); | 2318 | mlx4_cleanup_port_info(&priv->port[port]); |
2316 | 2319 | ||
2317 | mlx4_cleanup_counters_table(dev); | 2320 | mlx4_cleanup_counters_table(dev); |
2318 | mlx4_cleanup_mcg_table(dev); | ||
2319 | mlx4_cleanup_qp_table(dev); | 2321 | mlx4_cleanup_qp_table(dev); |
2320 | mlx4_cleanup_srq_table(dev); | 2322 | mlx4_cleanup_srq_table(dev); |
2321 | mlx4_cleanup_cq_table(dev); | 2323 | mlx4_cleanup_cq_table(dev); |
2322 | mlx4_cmd_use_polling(dev); | 2324 | mlx4_cmd_use_polling(dev); |
2323 | mlx4_cleanup_eq_table(dev); | 2325 | mlx4_cleanup_eq_table(dev); |
2326 | mlx4_cleanup_mcg_table(dev); | ||
2324 | mlx4_cleanup_mr_table(dev); | 2327 | mlx4_cleanup_mr_table(dev); |
2325 | mlx4_cleanup_xrcd_table(dev); | 2328 | mlx4_cleanup_xrcd_table(dev); |
2326 | mlx4_cleanup_pd_table(dev); | 2329 | mlx4_cleanup_pd_table(dev); |
@@ -2403,12 +2406,12 @@ static void mlx4_remove_one(struct pci_dev *pdev) | |||
2403 | RES_TR_FREE_SLAVES_ONLY); | 2406 | RES_TR_FREE_SLAVES_ONLY); |
2404 | 2407 | ||
2405 | mlx4_cleanup_counters_table(dev); | 2408 | mlx4_cleanup_counters_table(dev); |
2406 | mlx4_cleanup_mcg_table(dev); | ||
2407 | mlx4_cleanup_qp_table(dev); | 2409 | mlx4_cleanup_qp_table(dev); |
2408 | mlx4_cleanup_srq_table(dev); | 2410 | mlx4_cleanup_srq_table(dev); |
2409 | mlx4_cleanup_cq_table(dev); | 2411 | mlx4_cleanup_cq_table(dev); |
2410 | mlx4_cmd_use_polling(dev); | 2412 | mlx4_cmd_use_polling(dev); |
2411 | mlx4_cleanup_eq_table(dev); | 2413 | mlx4_cleanup_eq_table(dev); |
2414 | mlx4_cleanup_mcg_table(dev); | ||
2412 | mlx4_cleanup_mr_table(dev); | 2415 | mlx4_cleanup_mr_table(dev); |
2413 | mlx4_cleanup_xrcd_table(dev); | 2416 | mlx4_cleanup_xrcd_table(dev); |
2414 | mlx4_cleanup_pd_table(dev); | 2417 | mlx4_cleanup_pd_table(dev); |