]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/mellanox/mlx4/cmd.c
net/mlx4: Add structures to keep VF Ethernet ports information
[karo-tx-linux.git] / drivers / net / ethernet / mellanox / mlx4 / cmd.c
index 05267d716e8687883eaedff07b875bec57181e33..0a301e1a063510b8df7ad492c3df568dae250aad 100644 (file)
@@ -1490,6 +1490,16 @@ out:
        return ret;
 }
 
+static int mlx4_master_activate_admin_state(struct mlx4_priv *priv, int slave)
+{
+       int port;
+       for (port = 1; port <= MLX4_MAX_PORTS; port++) {
+               priv->mfunc.master.vf_oper[slave].vport[port].state =
+                               priv->mfunc.master.vf_admin[slave].vport[port];
+       }
+       return 0;
+}
+
 static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd,
                               u16 param, u8 toggle)
 {
@@ -1556,6 +1566,7 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd,
                if (slave_state[slave].last_cmd != MLX4_COMM_CMD_VHCR2)
                        goto reset_slave;
                slave_state[slave].vhcr_dma |= param;
+               mlx4_master_activate_admin_state(priv, slave);
                slave_state[slave].active = true;
                mlx4_dispatch_event(dev, MLX4_DEV_EVENT_SLAVE_INIT, slave);
                break;
@@ -1732,6 +1743,18 @@ int mlx4_multi_func_init(struct mlx4_dev *dev)
                if (!priv->mfunc.master.slave_state)
                        goto err_comm;
 
+               priv->mfunc.master.vf_admin =
+                       kzalloc(dev->num_slaves *
+                               sizeof(struct mlx4_vf_admin_state), GFP_KERNEL);
+               if (!priv->mfunc.master.vf_admin)
+                       goto err_comm_admin;
+
+               priv->mfunc.master.vf_oper =
+                       kzalloc(dev->num_slaves *
+                               sizeof(struct mlx4_vf_oper_state), GFP_KERNEL);
+               if (!priv->mfunc.master.vf_oper)
+                       goto err_comm_oper;
+
                for (i = 0; i < dev->num_slaves; ++i) {
                        s_state = &priv->mfunc.master.slave_state[i];
                        s_state->last_cmd = MLX4_COMM_CMD_RESET;
@@ -1752,6 +1775,9 @@ int mlx4_multi_func_init(struct mlx4_dev *dev)
                                        goto err_slaves;
                                }
                                INIT_LIST_HEAD(&s_state->mcast_filters[port]);
+                               priv->mfunc.master.vf_admin[i].vport[port].default_vlan = MLX4_VGT;
+                               priv->mfunc.master.vf_oper[i].vport[port].vlan_idx = NO_INDX;
+                               priv->mfunc.master.vf_oper[i].vport[port].mac_idx = NO_INDX;
                        }
                        spin_lock_init(&s_state->lock);
                }
@@ -1800,6 +1826,10 @@ err_slaves:
                for (port = 1; port <= MLX4_MAX_PORTS; port++)
                        kfree(priv->mfunc.master.slave_state[i].vlan_filter[port]);
        }
+       kfree(priv->mfunc.master.vf_oper);
+err_comm_oper:
+       kfree(priv->mfunc.master.vf_admin);
+err_comm_admin:
        kfree(priv->mfunc.master.slave_state);
 err_comm:
        iounmap(priv->mfunc.comm);
@@ -1874,6 +1904,8 @@ void mlx4_multi_func_cleanup(struct mlx4_dev *dev)
                                kfree(priv->mfunc.master.slave_state[i].vlan_filter[port]);
                }
                kfree(priv->mfunc.master.slave_state);
+               kfree(priv->mfunc.master.vf_admin);
+               kfree(priv->mfunc.master.vf_oper);
        }
 
        iounmap(priv->mfunc.comm);