aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/main.c
diff options
context:
space:
mode:
authorYevgeny Petrilin <yevgenyp@mellanox.com>2013-07-28 11:54:21 -0400
committerDavid S. Miller <davem@davemloft.net>2013-07-29 04:12:40 -0400
commitfe6f700d6cbb7e8a61711e325f53d9c9e0a42a4c (patch)
tree1a3d5b95434519950cb10ed9e51b50c2583e53fd /drivers/net/ethernet/mellanox/mlx4/main.c
parent2d4b646613d6b12175b017aca18113945af1faf3 (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.c35
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)
1803err_counters_table_free: 1802err_counters_table_free:
1804 mlx4_cleanup_counters_table(dev); 1803 mlx4_cleanup_counters_table(dev);
1805 1804
1806err_mcg_table_free:
1807 mlx4_cleanup_mcg_table(dev);
1808
1809err_qp_table_free: 1805err_qp_table_free:
1810 mlx4_cleanup_qp_table(dev); 1806 mlx4_cleanup_qp_table(dev);
1811 1807
@@ -1821,6 +1817,10 @@ err_cmd_poll:
1821err_eq_table_free: 1817err_eq_table_free:
1822 mlx4_cleanup_eq_table(dev); 1818 mlx4_cleanup_eq_table(dev);
1823 1819
1820err_mcg_table_free:
1821 if (!mlx4_is_slave(dev))
1822 mlx4_cleanup_mcg_table(dev);
1823
1824err_mr_table_free: 1824err_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);