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

Commit d2292e87 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

mlxsw: pci: Implement LAG processing for received packets



Completion queue element for receive queue provides information if the
packet was received via LAG port. Extract this info and pass it along
to core.

Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8060646a
Loading
Loading
Loading
Loading
+8 −11
Original line number Original line Diff line number Diff line
@@ -686,12 +686,14 @@ static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
	if (q->consumer_counter++ != consumer_counter_limit)
	if (q->consumer_counter++ != consumer_counter_limit)
		dev_dbg_ratelimited(&pdev->dev, "Consumer counter does not match limit in RDQ\n");
		dev_dbg_ratelimited(&pdev->dev, "Consumer counter does not match limit in RDQ\n");


	/* We do not support lag now */
	if (mlxsw_pci_cqe_lag_get(cqe)) {
	if (mlxsw_pci_cqe_lag_get(cqe))
		rx_info.is_lag = true;
		goto drop;
		rx_info.u.lag_id = mlxsw_pci_cqe_lag_id_get(cqe);

		rx_info.lag_port_index = mlxsw_pci_cqe_lag_port_index_get(cqe);
	} else {
		rx_info.is_lag = false;
		rx_info.is_lag = false;
		rx_info.u.sys_port = mlxsw_pci_cqe_system_port_get(cqe);
		rx_info.u.sys_port = mlxsw_pci_cqe_system_port_get(cqe);
	}


	rx_info.trap_id = mlxsw_pci_cqe_trap_id_get(cqe);
	rx_info.trap_id = mlxsw_pci_cqe_trap_id_get(cqe);


@@ -701,7 +703,6 @@ static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
	skb_put(skb, byte_count);
	skb_put(skb, byte_count);
	mlxsw_core_skb_receive(mlxsw_pci->core, skb, &rx_info);
	mlxsw_core_skb_receive(mlxsw_pci->core, skb, &rx_info);


put_new_skb:
	memset(wqe, 0, q->elem_size);
	memset(wqe, 0, q->elem_size);
	err = mlxsw_pci_rdq_skb_alloc(mlxsw_pci, elem_info);
	err = mlxsw_pci_rdq_skb_alloc(mlxsw_pci, elem_info);
	if (err)
	if (err)
@@ -710,10 +711,6 @@ static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
	q->producer_counter++;
	q->producer_counter++;
	mlxsw_pci_queue_doorbell_producer_ring(mlxsw_pci, q);
	mlxsw_pci_queue_doorbell_producer_ring(mlxsw_pci, q);
	return;
	return;

drop:
	dev_kfree_skb_any(skb);
	goto put_new_skb;
}
}


static char *mlxsw_pci_cq_sw_cqe_get(struct mlxsw_pci_queue *q)
static char *mlxsw_pci_cq_sw_cqe_get(struct mlxsw_pci_queue *q)
+3 −1
Original line number Original line Diff line number Diff line
@@ -129,13 +129,15 @@ MLXSW_ITEM64_INDEXED(pci, wqe, address, 0x08, 0, 64, 0x8, 0x0, false);
 */
 */
MLXSW_ITEM32(pci, cqe, lag, 0x00, 23, 1);
MLXSW_ITEM32(pci, cqe, lag, 0x00, 23, 1);


/* pci_cqe_system_port
/* pci_cqe_system_port/lag_id
 * When lag=0: System port on which the packet was received
 * When lag=0: System port on which the packet was received
 * When lag=1:
 * When lag=1:
 * bits [15:4] LAG ID on which the packet was received
 * bits [15:4] LAG ID on which the packet was received
 * bits [3:0] sub_port on which the packet was received
 * bits [3:0] sub_port on which the packet was received
 */
 */
MLXSW_ITEM32(pci, cqe, system_port, 0x00, 0, 16);
MLXSW_ITEM32(pci, cqe, system_port, 0x00, 0, 16);
MLXSW_ITEM32(pci, cqe, lag_id, 0x00, 4, 12);
MLXSW_ITEM32(pci, cqe, lag_port_index, 0x00, 0, 4);


/* pci_cqe_wqe_counter
/* pci_cqe_wqe_counter
 * WQE count of the WQEs completed on the associated dqn
 * WQE count of the WQEs completed on the associated dqn