mlxsw: pci: Implement LAG processing for received packets
authorJiri Pirko <jiri@mellanox.com>
Thu, 3 Dec 2015 11:12:24 +0000 (12:12 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Dec 2015 16:49:28 +0000 (11:49 -0500)
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: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/pci.c
drivers/net/ethernet/mellanox/mlxsw/pci.h

index 8ca66a01b09734bbffa7bdaa0288003a85bbaa76..d2102e572b1d5075b133cbe8e11e4edd5d8f3e64 100644 (file)
@@ -686,12 +686,14 @@ static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
        if (q->consumer_counter++ != consumer_counter_limit)
                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))
-               goto drop;
-
-       rx_info.is_lag = false;
-       rx_info.u.sys_port = mlxsw_pci_cqe_system_port_get(cqe);
+       if (mlxsw_pci_cqe_lag_get(cqe)) {
+               rx_info.is_lag = true;
+               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.u.sys_port = mlxsw_pci_cqe_system_port_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);
        mlxsw_core_skb_receive(mlxsw_pci->core, skb, &rx_info);
 
-put_new_skb:
        memset(wqe, 0, q->elem_size);
        err = mlxsw_pci_rdq_skb_alloc(mlxsw_pci, elem_info);
        if (err)
@@ -710,10 +711,6 @@ put_new_skb:
        q->producer_counter++;
        mlxsw_pci_queue_doorbell_producer_ring(mlxsw_pci, q);
        return;
-
-drop:
-       dev_kfree_skb_any(skb);
-       goto put_new_skb;
 }
 
 static char *mlxsw_pci_cq_sw_cqe_get(struct mlxsw_pci_queue *q)
index 142f33d978c5f940fb3ebb0bd721adcab62d8bb0..912106054ff2701d29a805b8e31cb41dc939b5d4 100644 (file)
@@ -129,13 +129,15 @@ MLXSW_ITEM64_INDEXED(pci, wqe, address, 0x08, 0, 64, 0x8, 0x0, false);
  */
 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=1:
  * bits [15:4] LAG ID 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, lag_id, 0x00, 4, 12);
+MLXSW_ITEM32(pci, cqe, lag_port_index, 0x00, 0, 4);
 
 /* pci_cqe_wqe_counter
  * WQE count of the WQEs completed on the associated dqn