Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ffe455ad authored by Eugenia Emantayev's avatar Eugenia Emantayev Committed by David S. Miller
Browse files

mlx4: Ethernet port management modifications



The physical port is now common to the PF and VFs.
The port resources and configuration is managed by the PF, VFs can
only influence the MTU of the port, it is set as max among all functions,
Each function allocates RX buffers of required size to meet it's MTU enforcement.
Port management code was moved to mlx4_core, as the mlx4_en module is
virtualization unaware

Move handling qp functionality to mlx4_get_eth_qp/mlx4_put_eth_qp
including reserve/release range and add/release unicast steering.
Let mlx4_register/unregister_mac deal only with MAC (un)registration.

Signed-off-by: default avatarEugenia Emantayev <eugenia@mellanox.co.il>
Signed-off-by: default avatarYevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0ec2c0f8
Loading
Loading
Loading
Loading
+37 −0
Original line number Original line Diff line number Diff line
@@ -653,6 +653,15 @@ static struct mlx4_cmd_info cmd_info[] = {
		.verify = NULL,
		.verify = NULL,
		.wrapper = mlx4_QUERY_PORT_wrapper
		.wrapper = mlx4_QUERY_PORT_wrapper
	},
	},
	{
		.opcode = MLX4_CMD_SET_PORT,
		.has_inbox = true,
		.has_outbox = false,
		.out_is_imm = false,
		.encode_slave_id = false,
		.verify = NULL,
		.wrapper = mlx4_SET_PORT_wrapper
	},
	{
	{
		.opcode = MLX4_CMD_MAP_EQ,
		.opcode = MLX4_CMD_MAP_EQ,
		.has_inbox = false,
		.has_inbox = false,
@@ -1005,6 +1014,34 @@ static struct mlx4_cmd_info cmd_info[] = {
		.verify = NULL,
		.verify = NULL,
		.wrapper = mlx4_PROMISC_wrapper
		.wrapper = mlx4_PROMISC_wrapper
	},
	},
	/* Ethernet specific commands */
	{
		.opcode = MLX4_CMD_SET_VLAN_FLTR,
		.has_inbox = true,
		.has_outbox = false,
		.out_is_imm = false,
		.encode_slave_id = false,
		.verify = NULL,
		.wrapper = mlx4_SET_VLAN_FLTR_wrapper
	},
	{
		.opcode = MLX4_CMD_SET_MCAST_FLTR,
		.has_inbox = false,
		.has_outbox = false,
		.out_is_imm = false,
		.encode_slave_id = false,
		.verify = NULL,
		.wrapper = mlx4_SET_MCAST_FLTR_wrapper
	},
	{
		.opcode = MLX4_CMD_DUMP_ETH_STATS,
		.has_inbox = false,
		.has_outbox = true,
		.out_is_imm = false,
		.encode_slave_id = false,
		.verify = NULL,
		.wrapper = mlx4_DUMP_ETH_STATS_wrapper
	},
	{
	{
		.opcode = MLX4_CMD_INFORM_FLR_DONE,
		.opcode = MLX4_CMD_INFORM_FLR_DONE,
		.has_inbox = false,
		.has_inbox = false,
+21 −11
Original line number Original line Diff line number Diff line
@@ -136,7 +136,7 @@ static void mlx4_en_do_set_mac(struct work_struct *work)
	if (priv->port_up) {
	if (priv->port_up) {
		/* Remove old MAC and insert the new one */
		/* Remove old MAC and insert the new one */
		err = mlx4_replace_mac(mdev->dev, priv->port,
		err = mlx4_replace_mac(mdev->dev, priv->port,
				       priv->base_qpn, priv->mac, 0);
				       priv->base_qpn, priv->mac);
		if (err)
		if (err)
			en_err(priv, "Failed changing HW MAC address\n");
			en_err(priv, "Failed changing HW MAC address\n");
	} else
	} else
@@ -207,6 +207,16 @@ static void mlx4_en_do_set_multicast(struct work_struct *work)
		goto out;
		goto out;
	}
	}


	if (!netif_carrier_ok(dev)) {
		if (!mlx4_en_QUERY_PORT(mdev, priv->port)) {
			if (priv->port_state.link_state) {
				priv->last_link_state = MLX4_DEV_EVENT_PORT_UP;
				netif_carrier_on(dev);
				en_dbg(LINK, priv, "Link Up\n");
			}
		}
	}

	/*
	/*
	 * Promsicuous mode: disable all filters
	 * Promsicuous mode: disable all filters
	 */
	 */
@@ -602,12 +612,12 @@ int mlx4_en_start_port(struct net_device *dev)
		++rx_index;
		++rx_index;
	}
	}


	/* Set port mac number */
	/* Set qp number */
	en_dbg(DRV, priv, "Setting mac for port %d\n", priv->port);
	en_dbg(DRV, priv, "Getting qp number for port %d\n", priv->port);
	err = mlx4_register_mac(mdev->dev, priv->port,
	err = mlx4_get_eth_qp(mdev->dev, priv->port,
				priv->mac, &priv->base_qpn, 0);
				priv->mac, &priv->base_qpn);
	if (err) {
	if (err) {
		en_err(priv, "Failed setting port mac\n");
		en_err(priv, "Failed getting eth qp\n");
		goto cq_err;
		goto cq_err;
	}
	}
	mdev->mac_removed[priv->port] = 0;
	mdev->mac_removed[priv->port] = 0;
@@ -702,7 +712,7 @@ int mlx4_en_start_port(struct net_device *dev)


	mlx4_en_release_rss_steer(priv);
	mlx4_en_release_rss_steer(priv);
mac_err:
mac_err:
	mlx4_unregister_mac(mdev->dev, priv->port, priv->base_qpn);
	mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
cq_err:
cq_err:
	while (rx_index--)
	while (rx_index--)
		mlx4_en_deactivate_cq(priv, &priv->rx_cq[rx_index]);
		mlx4_en_deactivate_cq(priv, &priv->rx_cq[rx_index]);
@@ -748,10 +758,6 @@ void mlx4_en_stop_port(struct net_device *dev)
	/* Flush multicast filter */
	/* Flush multicast filter */
	mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 1, MLX4_MCAST_CONFIG);
	mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 1, MLX4_MCAST_CONFIG);


	/* Unregister Mac address for the port */
	mlx4_unregister_mac(mdev->dev, priv->port, priv->base_qpn);
	mdev->mac_removed[priv->port] = 1;

	/* Free TX Rings */
	/* Free TX Rings */
	for (i = 0; i < priv->tx_ring_num; i++) {
	for (i = 0; i < priv->tx_ring_num; i++) {
		mlx4_en_deactivate_tx_ring(priv, &priv->tx_ring[i]);
		mlx4_en_deactivate_tx_ring(priv, &priv->tx_ring[i]);
@@ -765,6 +771,10 @@ void mlx4_en_stop_port(struct net_device *dev)
	/* Free RSS qps */
	/* Free RSS qps */
	mlx4_en_release_rss_steer(priv);
	mlx4_en_release_rss_steer(priv);


	/* Unregister Mac address for the port */
	mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
	mdev->mac_removed[priv->port] = 1;

	/* Free RX Rings */
	/* Free RX Rings */
	for (i = 0; i < priv->rx_ring_num; i++) {
	for (i = 0; i < priv->rx_ring_num; i++) {
		mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
		mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
+0 −77
Original line number Original line Diff line number Diff line
@@ -41,14 +41,6 @@
#include "mlx4_en.h"
#include "mlx4_en.h"




int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port,
			u64 mac, u64 clear, u8 mode)
{
	return mlx4_cmd(dev, (mac | (clear << 63)), port, mode,
			MLX4_CMD_SET_MCAST_FLTR, MLX4_CMD_TIME_CLASS_B,
			MLX4_CMD_WRAPPED);
}

int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv)
int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv)
{
{
	struct mlx4_cmd_mailbox *mailbox;
	struct mlx4_cmd_mailbox *mailbox;
@@ -78,75 +70,6 @@ int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv)
	return err;
	return err;
}
}



int mlx4_SET_PORT_general(struct mlx4_dev *dev, u8 port, int mtu,
			  u8 pptx, u8 pfctx, u8 pprx, u8 pfcrx)
{
	struct mlx4_cmd_mailbox *mailbox;
	struct mlx4_set_port_general_context *context;
	int err;
	u32 in_mod;

	mailbox = mlx4_alloc_cmd_mailbox(dev);
	if (IS_ERR(mailbox))
		return PTR_ERR(mailbox);
	context = mailbox->buf;
	memset(context, 0, sizeof *context);

	context->flags = SET_PORT_GEN_ALL_VALID;
	context->mtu = cpu_to_be16(mtu);
	context->pptx = (pptx * (!pfctx)) << 7;
	context->pfctx = pfctx;
	context->pprx = (pprx * (!pfcrx)) << 7;
	context->pfcrx = pfcrx;

	in_mod = MLX4_SET_PORT_GENERAL << 8 | port;
	err = mlx4_cmd(dev, mailbox->dma, in_mod, 1, MLX4_CMD_SET_PORT,
		       MLX4_CMD_TIME_CLASS_B, MLX4_CMD_WRAPPED);

	mlx4_free_cmd_mailbox(dev, mailbox);
	return err;
}

int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn,
			   u8 promisc)
{
	struct mlx4_cmd_mailbox *mailbox;
	struct mlx4_set_port_rqp_calc_context *context;
	int err;
	u32 in_mod;
	u32 m_promisc = (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER) ?
						MCAST_DIRECT : MCAST_DEFAULT;

	if (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER  &&
			dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_UC_STEER)
		return 0;

	mailbox = mlx4_alloc_cmd_mailbox(dev);
	if (IS_ERR(mailbox))
		return PTR_ERR(mailbox);
	context = mailbox->buf;
	memset(context, 0, sizeof *context);

	context->base_qpn = cpu_to_be32(base_qpn);
	context->n_mac = dev->caps.log_num_macs;
	context->promisc = cpu_to_be32(promisc << SET_PORT_PROMISC_SHIFT |
				       base_qpn);
	context->mcast = cpu_to_be32(m_promisc << SET_PORT_MC_PROMISC_SHIFT |
				     base_qpn);
	context->intra_no_vlan = 0;
	context->no_vlan = MLX4_NO_VLAN_IDX;
	context->intra_vlan_miss = 0;
	context->vlan_miss = MLX4_VLAN_MISS_IDX;

	in_mod = MLX4_SET_PORT_RQP_CALC << 8 | port;
	err = mlx4_cmd(dev, mailbox->dma, in_mod, 1, MLX4_CMD_SET_PORT,
		       MLX4_CMD_TIME_CLASS_B, MLX4_CMD_WRAPPED);

	mlx4_free_cmd_mailbox(dev, mailbox);
	return err;
}

int mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port)
int mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port)
{
{
	struct mlx4_en_query_port_context *qport_context;
	struct mlx4_en_query_port_context *qport_context;
+0 −37
Original line number Original line Diff line number Diff line
@@ -39,43 +39,6 @@
#define SET_PORT_PROMISC_SHIFT	31
#define SET_PORT_PROMISC_SHIFT	31
#define SET_PORT_MC_PROMISC_SHIFT	30
#define SET_PORT_MC_PROMISC_SHIFT	30


enum {
	MCAST_DIRECT_ONLY       = 0,
	MCAST_DIRECT            = 1,
	MCAST_DEFAULT           = 2
};

struct mlx4_set_port_general_context {
	u8 reserved[3];
	u8 flags;
	u16 reserved2;
	__be16 mtu;
	u8 pptx;
	u8 pfctx;
	u16 reserved3;
	u8 pprx;
	u8 pfcrx;
	u16 reserved4;
};

struct mlx4_set_port_rqp_calc_context {
	__be32 base_qpn;
	u8 rererved;
	u8 n_mac;
	u8 n_vlan;
	u8 n_prio;
	u8 reserved2[3];
	u8 mac_miss;
	u8 intra_no_vlan;
	u8 no_vlan;
	u8 intra_vlan_miss;
	u8 vlan_miss;
	u8 reserved3[3];
	u8 no_vlan_prio;
	__be32 promisc;
	__be32 mcast;
};

#define VLAN_FLTR_SIZE	128
#define VLAN_FLTR_SIZE	128
struct mlx4_set_vlan_fltr_mbox {
struct mlx4_set_vlan_fltr_mbox {
	__be32 entry[VLAN_FLTR_SIZE];
	__be32 entry[VLAN_FLTR_SIZE];
+2 −2
Original line number Original line Diff line number Diff line
@@ -913,7 +913,7 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
}
}
EXPORT_SYMBOL_GPL(mlx4_multicast_detach);
EXPORT_SYMBOL_GPL(mlx4_multicast_detach);


static int mlx4_unicast_attach(struct mlx4_dev *dev,
int mlx4_unicast_attach(struct mlx4_dev *dev,
			struct mlx4_qp *qp, u8 gid[16],
			struct mlx4_qp *qp, u8 gid[16],
			int block_mcast_loopback, enum mlx4_protocol prot)
			int block_mcast_loopback, enum mlx4_protocol prot)
{
{
@@ -933,7 +933,7 @@ static int mlx4_unicast_attach(struct mlx4_dev *dev,
}
}
EXPORT_SYMBOL_GPL(mlx4_unicast_attach);
EXPORT_SYMBOL_GPL(mlx4_unicast_attach);


static int mlx4_unicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp,
int mlx4_unicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp,
			       u8 gid[16], enum mlx4_protocol prot)
			       u8 gid[16], enum mlx4_protocol prot)
{
{
	if (prot == MLX4_PROT_ETH &&
	if (prot == MLX4_PROT_ETH &&
Loading