@@ -1031,3 +1031,81 @@ void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq)
1031
1031
mlx5e_page_release (rq , di , false);
1032
1032
}
1033
1033
}
1034
+
1035
+ #ifdef CONFIG_MLX5_CORE_IPOIB
1036
+
1037
+ #define MLX5_IB_GRH_DGID_OFFSET 24
1038
+ #define MLX5_IB_GRH_BYTES 40
1039
+ #define MLX5_IPOIB_ENCAP_LEN 4
1040
+ #define MLX5_GID_SIZE 16
1041
+
1042
+ static inline void mlx5i_complete_rx_cqe (struct mlx5e_rq * rq ,
1043
+ struct mlx5_cqe64 * cqe ,
1044
+ u32 cqe_bcnt ,
1045
+ struct sk_buff * skb )
1046
+ {
1047
+ struct net_device * netdev = rq -> netdev ;
1048
+ u8 * dgid ;
1049
+ u8 g ;
1050
+
1051
+ g = (be32_to_cpu (cqe -> flags_rqpn ) >> 28 ) & 3 ;
1052
+ dgid = skb -> data + MLX5_IB_GRH_DGID_OFFSET ;
1053
+ if ((!g ) || dgid [0 ] != 0xff )
1054
+ skb -> pkt_type = PACKET_HOST ;
1055
+ else if (memcmp (dgid , netdev -> broadcast + 4 , MLX5_GID_SIZE ) == 0 )
1056
+ skb -> pkt_type = PACKET_BROADCAST ;
1057
+ else
1058
+ skb -> pkt_type = PACKET_MULTICAST ;
1059
+
1060
+ /* TODO: IB/ipoib: Allow mcast packets from other VFs
1061
+ * 68996a6e760e5c74654723eeb57bf65628ae87f4
1062
+ */
1063
+
1064
+ skb_pull (skb , MLX5_IB_GRH_BYTES );
1065
+
1066
+ skb -> protocol = * ((__be16 * )(skb -> data ));
1067
+
1068
+ skb -> ip_summed = CHECKSUM_COMPLETE ;
1069
+ skb -> csum = csum_unfold ((__force __sum16 )cqe -> check_sum );
1070
+
1071
+ skb_record_rx_queue (skb , rq -> ix );
1072
+
1073
+ if (likely (netdev -> features & NETIF_F_RXHASH ))
1074
+ mlx5e_skb_set_hash (cqe , skb );
1075
+
1076
+ skb_reset_mac_header (skb );
1077
+ skb_pull (skb , MLX5_IPOIB_ENCAP_LEN );
1078
+
1079
+ skb -> dev = netdev ;
1080
+
1081
+ rq -> stats .csum_complete ++ ;
1082
+ rq -> stats .packets ++ ;
1083
+ rq -> stats .bytes += cqe_bcnt ;
1084
+ }
1085
+
1086
+ void mlx5i_handle_rx_cqe (struct mlx5e_rq * rq , struct mlx5_cqe64 * cqe )
1087
+ {
1088
+ struct mlx5e_rx_wqe * wqe ;
1089
+ __be16 wqe_counter_be ;
1090
+ struct sk_buff * skb ;
1091
+ u16 wqe_counter ;
1092
+ u32 cqe_bcnt ;
1093
+
1094
+ wqe_counter_be = cqe -> wqe_counter ;
1095
+ wqe_counter = be16_to_cpu (wqe_counter_be );
1096
+ wqe = mlx5_wq_ll_get_wqe (& rq -> wq , wqe_counter );
1097
+ cqe_bcnt = be32_to_cpu (cqe -> byte_cnt );
1098
+
1099
+ skb = skb_from_cqe (rq , cqe , wqe_counter , cqe_bcnt );
1100
+ if (!skb )
1101
+ goto wq_ll_pop ;
1102
+
1103
+ mlx5i_complete_rx_cqe (rq , cqe , cqe_bcnt , skb );
1104
+ napi_gro_receive (rq -> cq .napi , skb );
1105
+
1106
+ wq_ll_pop :
1107
+ mlx5_wq_ll_pop (& rq -> wq , wqe_counter_be ,
1108
+ & wqe -> next .next_wqe_index );
1109
+ }
1110
+
1111
+ #endif /* CONFIG_MLX5_CORE_IPOIB */
0 commit comments