spin_unlock(&q->lock);
 }
 
+static void mlxsw_pci_cqe_rdq_md_tx_port_init(struct sk_buff *skb,
+                                             const char *cqe)
+{
+       struct mlxsw_skb_cb *cb = mlxsw_skb_cb(skb);
+
+       if (mlxsw_pci_cqe2_tx_lag_get(cqe)) {
+               cb->rx_md_info.tx_port_is_lag = true;
+               cb->rx_md_info.tx_lag_id = mlxsw_pci_cqe2_tx_lag_id_get(cqe);
+               cb->rx_md_info.tx_lag_port_index =
+                       mlxsw_pci_cqe2_tx_lag_subport_get(cqe);
+       } else {
+               cb->rx_md_info.tx_port_is_lag = false;
+               cb->rx_md_info.tx_sys_port =
+                       mlxsw_pci_cqe2_tx_system_port_get(cqe);
+       }
+
+       if (cb->rx_md_info.tx_sys_port != MLXSW_PCI_CQE2_TX_PORT_MULTI_PORT &&
+           cb->rx_md_info.tx_sys_port != MLXSW_PCI_CQE2_TX_PORT_INVALID)
+               cb->rx_md_info.tx_port_valid = 1;
+       else
+               cb->rx_md_info.tx_port_valid = 0;
+}
+
+static void mlxsw_pci_cqe_rdq_md_init(struct sk_buff *skb, const char *cqe)
+{
+       struct mlxsw_skb_cb *cb = mlxsw_skb_cb(skb);
+
+       cb->rx_md_info.tx_congestion = mlxsw_pci_cqe2_mirror_cong_get(cqe);
+       if (cb->rx_md_info.tx_congestion != MLXSW_PCI_CQE2_MIRROR_CONG_INVALID)
+               cb->rx_md_info.tx_congestion_valid = 1;
+       else
+               cb->rx_md_info.tx_congestion_valid = 0;
+       cb->rx_md_info.tx_congestion <<= MLXSW_PCI_CQE2_MIRROR_CONG_SHIFT;
+
+       cb->rx_md_info.latency = mlxsw_pci_cqe2_mirror_latency_get(cqe);
+       if (cb->rx_md_info.latency != MLXSW_PCI_CQE2_MIRROR_LATENCY_INVALID)
+               cb->rx_md_info.latency_valid = 1;
+       else
+               cb->rx_md_info.latency_valid = 0;
+
+       cb->rx_md_info.tx_tc = mlxsw_pci_cqe2_mirror_tclass_get(cqe);
+       if (cb->rx_md_info.tx_tc != MLXSW_PCI_CQE2_MIRROR_TCLASS_INVALID)
+               cb->rx_md_info.tx_tc_valid = 1;
+       else
+               cb->rx_md_info.tx_tc_valid = 0;
+
+       mlxsw_pci_cqe_rdq_md_tx_port_init(skb, cqe);
+}
+
 static void mlxsw_pci_cqe_rdq_handle(struct mlxsw_pci *mlxsw_pci,
                                     struct mlxsw_pci_queue *q,
                                     u16 consumer_counter_limit,
                   rx_info.trap_id <= MLXSW_TRAP_ID_MIRROR_SESSION7 &&
                   mlxsw_pci->max_cqe_ver >= MLXSW_PCI_CQE_V2) {
                rx_info.mirror_reason = mlxsw_pci_cqe2_mirror_reason_get(cqe);
+               mlxsw_pci_cqe_rdq_md_init(skb, cqe);
+       } else if (rx_info.trap_id == MLXSW_TRAP_ID_PKT_SAMPLE &&
+                  mlxsw_pci->max_cqe_ver >= MLXSW_PCI_CQE_V2) {
+               mlxsw_pci_cqe_rdq_md_tx_port_init(skb, cqe);
        }
 
        byte_count = mlxsw_pci_cqe_byte_count_get(cqe);