aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/mellanox')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c32
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h26
3 files changed, 62 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index 05267d716e86..0a301e1a0635 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -1490,6 +1490,16 @@ out:
1490 return ret; 1490 return ret;
1491} 1491}
1492 1492
1493static int mlx4_master_activate_admin_state(struct mlx4_priv *priv, int slave)
1494{
1495 int port;
1496 for (port = 1; port <= MLX4_MAX_PORTS; port++) {
1497 priv->mfunc.master.vf_oper[slave].vport[port].state =
1498 priv->mfunc.master.vf_admin[slave].vport[port];
1499 }
1500 return 0;
1501}
1502
1493static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, 1503static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd,
1494 u16 param, u8 toggle) 1504 u16 param, u8 toggle)
1495{ 1505{
@@ -1556,6 +1566,7 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd,
1556 if (slave_state[slave].last_cmd != MLX4_COMM_CMD_VHCR2) 1566 if (slave_state[slave].last_cmd != MLX4_COMM_CMD_VHCR2)
1557 goto reset_slave; 1567 goto reset_slave;
1558 slave_state[slave].vhcr_dma |= param; 1568 slave_state[slave].vhcr_dma |= param;
1569 mlx4_master_activate_admin_state(priv, slave);
1559 slave_state[slave].active = true; 1570 slave_state[slave].active = true;
1560 mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_INIT, slave); 1571 mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_INIT, slave);
1561 break; 1572 break;
@@ -1732,6 +1743,18 @@ int mlx4_multi_func_init(struct mlx4_dev *dev)
1732 if (!priv->mfunc.master.slave_state) 1743 if (!priv->mfunc.master.slave_state)
1733 goto err_comm; 1744 goto err_comm;
1734 1745
1746 priv->mfunc.master.vf_admin =
1747 kzalloc(dev->num_slaves *
1748 sizeof(struct mlx4_vf_admin_state), GFP_KERNEL);
1749 if (!priv->mfunc.master.vf_admin)
1750 goto err_comm_admin;
1751
1752 priv->mfunc.master.vf_oper =
1753 kzalloc(dev->num_slaves *
1754 sizeof(struct mlx4_vf_oper_state), GFP_KERNEL);
1755 if (!priv->mfunc.master.vf_oper)
1756 goto err_comm_oper;
1757
1735 for (i = 0; i < dev->num_slaves; ++i) { 1758 for (i = 0; i < dev->num_slaves; ++i) {
1736 s_state = &priv->mfunc.master.slave_state[i]; 1759 s_state = &priv->mfunc.master.slave_state[i];
1737 s_state->last_cmd = MLX4_COMM_CMD_RESET; 1760 s_state->last_cmd = MLX4_COMM_CMD_RESET;
@@ -1752,6 +1775,9 @@ int mlx4_multi_func_init(struct mlx4_dev *dev)
1752 goto err_slaves; 1775 goto err_slaves;
1753 } 1776 }
1754 INIT_LIST_HEAD(&s_state->mcast_filters[port]); 1777 INIT_LIST_HEAD(&s_state->mcast_filters[port]);
1778 priv->mfunc.master.vf_admin[i].vport[port].default_vlan = MLX4_VGT;
1779 priv->mfunc.master.vf_oper[i].vport[port].vlan_idx = NO_INDX;
1780 priv->mfunc.master.vf_oper[i].vport[port].mac_idx = NO_INDX;
1755 } 1781 }
1756 spin_lock_init(&s_state->lock); 1782 spin_lock_init(&s_state->lock);
1757 } 1783 }
@@ -1800,6 +1826,10 @@ err_slaves:
1800 for (port = 1; port <= MLX4_MAX_PORTS; port++) 1826 for (port = 1; port <= MLX4_MAX_PORTS; port++)
1801 kfree(priv->mfunc.master.slave_state[i].vlan_filter[port]); 1827 kfree(priv->mfunc.master.slave_state[i].vlan_filter[port]);
1802 } 1828 }
1829 kfree(priv->mfunc.master.vf_oper);
1830err_comm_oper:
1831 kfree(priv->mfunc.master.vf_admin);
1832err_comm_admin:
1803 kfree(priv->mfunc.master.slave_state); 1833 kfree(priv->mfunc.master.slave_state);
1804err_comm: 1834err_comm:
1805 iounmap(priv->mfunc.comm); 1835 iounmap(priv->mfunc.comm);
@@ -1874,6 +1904,8 @@ void mlx4_multi_func_cleanup(struct mlx4_dev *dev)
1874 kfree(priv->mfunc.master.slave_state[i].vlan_filter[port]); 1904 kfree(priv->mfunc.master.slave_state[i].vlan_filter[port]);
1875 } 1905 }
1876 kfree(priv->mfunc.master.slave_state); 1906 kfree(priv->mfunc.master.slave_state);
1907 kfree(priv->mfunc.master.vf_admin);
1908 kfree(priv->mfunc.master.vf_oper);
1877 } 1909 }
1878 1910
1879 iounmap(priv->mfunc.comm); 1911 iounmap(priv->mfunc.comm);
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 1f6c3e9128ef..70d44adddc39 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -816,6 +816,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
816 struct mlx4_cmd_mailbox *outbox, 816 struct mlx4_cmd_mailbox *outbox,
817 struct mlx4_cmd_info *cmd) 817 struct mlx4_cmd_info *cmd)
818{ 818{
819 struct mlx4_priv *priv = mlx4_priv(dev);
819 u64 def_mac; 820 u64 def_mac;
820 u8 port_type; 821 u8 port_type;
821 u16 short_field; 822 u16 short_field;
@@ -833,6 +834,9 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
833 /* set slave default_mac address */ 834 /* set slave default_mac address */
834 MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET); 835 MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET);
835 def_mac += slave << 8; 836 def_mac += slave << 8;
837 /* if config MAC in DB use it */
838 if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac)
839 def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac;
836 MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); 840 MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET);
837 841
838 /* get port type - currently only eth is enabled */ 842 /* get port type - currently only eth is enabled */
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index 0567f01938ed..7e1d10059eda 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -473,6 +473,30 @@ struct mlx4_slave_state {
473 enum slave_port_state port_state[MLX4_MAX_PORTS + 1]; 473 enum slave_port_state port_state[MLX4_MAX_PORTS + 1];
474}; 474};
475 475
476#define MLX4_VGT 4095
477#define NO_INDX (-1)
478
479struct mlx4_vport_state {
480 u64 mac;
481 u16 default_vlan;
482 u8 default_qos;
483 u32 tx_rate;
484 bool spoofchk;
485};
486
487struct mlx4_vf_admin_state {
488 struct mlx4_vport_state vport[MLX4_MAX_PORTS + 1];
489};
490
491struct mlx4_vport_oper_state {
492 struct mlx4_vport_state state;
493 int mac_idx;
494 int vlan_idx;
495};
496struct mlx4_vf_oper_state {
497 struct mlx4_vport_oper_state vport[MLX4_MAX_PORTS + 1];
498};
499
476struct slave_list { 500struct slave_list {
477 struct mutex mutex; 501 struct mutex mutex;
478 struct list_head res_list[MLX4_NUM_OF_RESOURCE_TYPE]; 502 struct list_head res_list[MLX4_NUM_OF_RESOURCE_TYPE];
@@ -503,6 +527,8 @@ struct mlx4_master_qp0_state {
503 527
504struct mlx4_mfunc_master_ctx { 528struct mlx4_mfunc_master_ctx {
505 struct mlx4_slave_state *slave_state; 529 struct mlx4_slave_state *slave_state;
530 struct mlx4_vf_admin_state *vf_admin;
531 struct mlx4_vf_oper_state *vf_oper;
506 struct mlx4_master_qp0_state qp0_state[MLX4_MAX_PORTS + 1]; 532 struct mlx4_master_qp0_state qp0_state[MLX4_MAX_PORTS + 1];
507 int init_port_ref[MLX4_MAX_PORTS + 1]; 533 int init_port_ref[MLX4_MAX_PORTS + 1];
508 u16 max_mtu[MLX4_MAX_PORTS + 1]; 534 u16 max_mtu[MLX4_MAX_PORTS + 1];