|
@@ -645,17 +645,28 @@ static int find_entry(struct mlx4_dev *dev, u8 port,
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static const u8 __promisc_mode[] = {
|
|
|
+ [MLX4_FS_REGULAR] = 0x0,
|
|
|
+ [MLX4_FS_ALL_DEFAULT] = 0x1,
|
|
|
+ [MLX4_FS_MC_DEFAULT] = 0x3,
|
|
|
+ [MLX4_FS_UC_SNIFFER] = 0x4,
|
|
|
+ [MLX4_FS_MC_SNIFFER] = 0x5,
|
|
|
+};
|
|
|
+
|
|
|
+int mlx4_map_sw_to_hw_steering_mode(struct mlx4_dev *dev,
|
|
|
+ enum mlx4_net_trans_promisc_mode flow_type)
|
|
|
+{
|
|
|
+ if (flow_type >= MLX4_FS_MODE_NUM || flow_type < 0) {
|
|
|
+ mlx4_err(dev, "Invalid flow type. type = %d\n", flow_type);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ return __promisc_mode[flow_type];
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(mlx4_map_sw_to_hw_steering_mode);
|
|
|
+
|
|
|
static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl,
|
|
|
struct mlx4_net_trans_rule_hw_ctrl *hw)
|
|
|
{
|
|
|
- static const u8 __promisc_mode[] = {
|
|
|
- [MLX4_FS_REGULAR] = 0x0,
|
|
|
- [MLX4_FS_ALL_DEFAULT] = 0x1,
|
|
|
- [MLX4_FS_MC_DEFAULT] = 0x3,
|
|
|
- [MLX4_FS_UC_SNIFFER] = 0x4,
|
|
|
- [MLX4_FS_MC_SNIFFER] = 0x5,
|
|
|
- };
|
|
|
-
|
|
|
u8 flags = 0;
|
|
|
|
|
|
flags = ctrl->queue_mode == MLX4_NET_TRANS_Q_LIFO ? 1 : 0;
|
|
@@ -678,29 +689,51 @@ const u16 __sw_id_hw[] = {
|
|
|
[MLX4_NET_TRANS_RULE_ID_UDP] = 0xE006
|
|
|
};
|
|
|
|
|
|
+int mlx4_map_sw_to_hw_steering_id(struct mlx4_dev *dev,
|
|
|
+ enum mlx4_net_trans_rule_id id)
|
|
|
+{
|
|
|
+ if (id >= MLX4_NET_TRANS_RULE_NUM || id < 0) {
|
|
|
+ mlx4_err(dev, "Invalid network rule id. id = %d\n", id);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ return __sw_id_hw[id];
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(mlx4_map_sw_to_hw_steering_id);
|
|
|
+
|
|
|
+static const int __rule_hw_sz[] = {
|
|
|
+ [MLX4_NET_TRANS_RULE_ID_ETH] =
|
|
|
+ sizeof(struct mlx4_net_trans_rule_hw_eth),
|
|
|
+ [MLX4_NET_TRANS_RULE_ID_IB] =
|
|
|
+ sizeof(struct mlx4_net_trans_rule_hw_ib),
|
|
|
+ [MLX4_NET_TRANS_RULE_ID_IPV6] = 0,
|
|
|
+ [MLX4_NET_TRANS_RULE_ID_IPV4] =
|
|
|
+ sizeof(struct mlx4_net_trans_rule_hw_ipv4),
|
|
|
+ [MLX4_NET_TRANS_RULE_ID_TCP] =
|
|
|
+ sizeof(struct mlx4_net_trans_rule_hw_tcp_udp),
|
|
|
+ [MLX4_NET_TRANS_RULE_ID_UDP] =
|
|
|
+ sizeof(struct mlx4_net_trans_rule_hw_tcp_udp)
|
|
|
+};
|
|
|
+
|
|
|
+int mlx4_hw_rule_sz(struct mlx4_dev *dev,
|
|
|
+ enum mlx4_net_trans_rule_id id)
|
|
|
+{
|
|
|
+ if (id >= MLX4_NET_TRANS_RULE_NUM || id < 0) {
|
|
|
+ mlx4_err(dev, "Invalid network rule id. id = %d\n", id);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return __rule_hw_sz[id];
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(mlx4_hw_rule_sz);
|
|
|
+
|
|
|
static int parse_trans_rule(struct mlx4_dev *dev, struct mlx4_spec_list *spec,
|
|
|
struct _rule_hw *rule_hw)
|
|
|
{
|
|
|
- static const size_t __rule_hw_sz[] = {
|
|
|
- [MLX4_NET_TRANS_RULE_ID_ETH] =
|
|
|
- sizeof(struct mlx4_net_trans_rule_hw_eth),
|
|
|
- [MLX4_NET_TRANS_RULE_ID_IB] =
|
|
|
- sizeof(struct mlx4_net_trans_rule_hw_ib),
|
|
|
- [MLX4_NET_TRANS_RULE_ID_IPV6] = 0,
|
|
|
- [MLX4_NET_TRANS_RULE_ID_IPV4] =
|
|
|
- sizeof(struct mlx4_net_trans_rule_hw_ipv4),
|
|
|
- [MLX4_NET_TRANS_RULE_ID_TCP] =
|
|
|
- sizeof(struct mlx4_net_trans_rule_hw_tcp_udp),
|
|
|
- [MLX4_NET_TRANS_RULE_ID_UDP] =
|
|
|
- sizeof(struct mlx4_net_trans_rule_hw_tcp_udp)
|
|
|
- };
|
|
|
- if (spec->id >= MLX4_NET_TRANS_RULE_NUM) {
|
|
|
- mlx4_err(dev, "Invalid network rule id. id = %d\n", spec->id);
|
|
|
+ if (mlx4_hw_rule_sz(dev, spec->id) < 0)
|
|
|
return -EINVAL;
|
|
|
- }
|
|
|
- memset(rule_hw, 0, __rule_hw_sz[spec->id]);
|
|
|
+ memset(rule_hw, 0, mlx4_hw_rule_sz(dev, spec->id));
|
|
|
rule_hw->id = cpu_to_be16(__sw_id_hw[spec->id]);
|
|
|
- rule_hw->size = __rule_hw_sz[spec->id] >> 2;
|
|
|
+ rule_hw->size = mlx4_hw_rule_sz(dev, spec->id) >> 2;
|
|
|
|
|
|
switch (spec->id) {
|
|
|
case MLX4_NET_TRANS_RULE_ID_ETH:
|