aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHadar Hen Zion <hadarh@mellanox.com>2013-04-24 09:58:48 -0400
committerRoland Dreier <roland@purestorage.com>2013-04-24 20:51:30 -0400
commitc2c19dc3c9a1585e58804041e5a328cde425403a (patch)
tree9d869a0721ea8bae67f604aab06038eb5363e0e9
parentbcf372971d471f6cb4070adb7bfc987d8b3d21f2 (diff)
mlx4_core: Expose a few helpers to fill DMFS HW strucutures
Re-arrange some of code which fills DMFS HW structures so we can use it from within the core driver and from the IB driver too, e.g when verbs DMFS structures are transformed into mlx4 hardware structs. Also, add struct mlx4_flow_handle struct which will be of use by the DMFS verbs flow in the IB driver. Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mcg.c85
-rw-r--r--include/linux/mlx4/device.h12
2 files changed, 70 insertions, 27 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c
index 07712f976c8f..00b4e7be7c7e 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mcg.c
+++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c
@@ -645,17 +645,28 @@ static int find_entry(struct mlx4_dev *dev, u8 port,
645 return err; 645 return err;
646} 646}
647 647
648static const u8 __promisc_mode[] = {
649 [MLX4_FS_REGULAR] = 0x0,
650 [MLX4_FS_ALL_DEFAULT] = 0x1,
651 [MLX4_FS_MC_DEFAULT] = 0x3,
652 [MLX4_FS_UC_SNIFFER] = 0x4,
653 [MLX4_FS_MC_SNIFFER] = 0x5,
654};
655
656int mlx4_map_sw_to_hw_steering_mode(struct mlx4_dev *dev,
657 enum mlx4_net_trans_promisc_mode flow_type)
658{
659 if (flow_type >= MLX4_FS_MODE_NUM || flow_type < 0) {
660 mlx4_err(dev, "Invalid flow type. type = %d\n", flow_type);
661 return -EINVAL;
662 }
663 return __promisc_mode[flow_type];
664}
665EXPORT_SYMBOL_GPL(mlx4_map_sw_to_hw_steering_mode);
666
648static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl, 667static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl,
649 struct mlx4_net_trans_rule_hw_ctrl *hw) 668 struct mlx4_net_trans_rule_hw_ctrl *hw)
650{ 669{
651 static const u8 __promisc_mode[] = {
652 [MLX4_FS_REGULAR] = 0x0,
653 [MLX4_FS_ALL_DEFAULT] = 0x1,
654 [MLX4_FS_MC_DEFAULT] = 0x3,
655 [MLX4_FS_UC_SNIFFER] = 0x4,
656 [MLX4_FS_MC_SNIFFER] = 0x5,
657 };
658
659 u8 flags = 0; 670 u8 flags = 0;
660 671
661 flags = ctrl->queue_mode == MLX4_NET_TRANS_Q_LIFO ? 1 : 0; 672 flags = ctrl->queue_mode == MLX4_NET_TRANS_Q_LIFO ? 1 : 0;
@@ -678,29 +689,51 @@ const u16 __sw_id_hw[] = {
678 [MLX4_NET_TRANS_RULE_ID_UDP] = 0xE006 689 [MLX4_NET_TRANS_RULE_ID_UDP] = 0xE006
679}; 690};
680 691
692int mlx4_map_sw_to_hw_steering_id(struct mlx4_dev *dev,
693 enum mlx4_net_trans_rule_id id)
694{
695 if (id >= MLX4_NET_TRANS_RULE_NUM || id < 0) {
696 mlx4_err(dev, "Invalid network rule id. id = %d\n", id);
697 return -EINVAL;
698 }
699 return __sw_id_hw[id];
700}
701EXPORT_SYMBOL_GPL(mlx4_map_sw_to_hw_steering_id);
702
703static const int __rule_hw_sz[] = {
704 [MLX4_NET_TRANS_RULE_ID_ETH] =
705 sizeof(struct mlx4_net_trans_rule_hw_eth),
706 [MLX4_NET_TRANS_RULE_ID_IB] =
707 sizeof(struct mlx4_net_trans_rule_hw_ib),
708 [MLX4_NET_TRANS_RULE_ID_IPV6] = 0,
709 [MLX4_NET_TRANS_RULE_ID_IPV4] =
710 sizeof(struct mlx4_net_trans_rule_hw_ipv4),
711 [MLX4_NET_TRANS_RULE_ID_TCP] =
712 sizeof(struct mlx4_net_trans_rule_hw_tcp_udp),
713 [MLX4_NET_TRANS_RULE_ID_UDP] =
714 sizeof(struct mlx4_net_trans_rule_hw_tcp_udp)
715};
716
717int mlx4_hw_rule_sz(struct mlx4_dev *dev,
718 enum mlx4_net_trans_rule_id id)
719{
720 if (id >= MLX4_NET_TRANS_RULE_NUM || id < 0) {
721 mlx4_err(dev, "Invalid network rule id. id = %d\n", id);
722 return -EINVAL;
723 }
724
725 return __rule_hw_sz[id];
726}
727EXPORT_SYMBOL_GPL(mlx4_hw_rule_sz);
728
681static int parse_trans_rule(struct mlx4_dev *dev, struct mlx4_spec_list *spec, 729static int parse_trans_rule(struct mlx4_dev *dev, struct mlx4_spec_list *spec,
682 struct _rule_hw *rule_hw) 730 struct _rule_hw *rule_hw)
683{ 731{
684 static const size_t __rule_hw_sz[] = { 732 if (mlx4_hw_rule_sz(dev, spec->id) < 0)
685 [MLX4_NET_TRANS_RULE_ID_ETH] =
686 sizeof(struct mlx4_net_trans_rule_hw_eth),
687 [MLX4_NET_TRANS_RULE_ID_IB] =
688 sizeof(struct mlx4_net_trans_rule_hw_ib),
689 [MLX4_NET_TRANS_RULE_ID_IPV6] = 0,
690 [MLX4_NET_TRANS_RULE_ID_IPV4] =
691 sizeof(struct mlx4_net_trans_rule_hw_ipv4),
692 [MLX4_NET_TRANS_RULE_ID_TCP] =
693 sizeof(struct mlx4_net_trans_rule_hw_tcp_udp),
694 [MLX4_NET_TRANS_RULE_ID_UDP] =
695 sizeof(struct mlx4_net_trans_rule_hw_tcp_udp)
696 };
697 if (spec->id >= MLX4_NET_TRANS_RULE_NUM) {
698 mlx4_err(dev, "Invalid network rule id. id = %d\n", spec->id);
699 return -EINVAL; 733 return -EINVAL;
700 } 734 memset(rule_hw, 0, mlx4_hw_rule_sz(dev, spec->id));
701 memset(rule_hw, 0, __rule_hw_sz[spec->id]);
702 rule_hw->id = cpu_to_be16(__sw_id_hw[spec->id]); 735 rule_hw->id = cpu_to_be16(__sw_id_hw[spec->id]);
703 rule_hw->size = __rule_hw_sz[spec->id] >> 2; 736 rule_hw->size = mlx4_hw_rule_sz(dev, spec->id) >> 2;
704 737
705 switch (spec->id) { 738 switch (spec->id) {
706 case MLX4_NET_TRANS_RULE_ID_ETH: 739 case MLX4_NET_TRANS_RULE_ID_ETH:
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 08e5bc1387e1..ad4a53fbdddf 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -901,7 +901,7 @@ enum mlx4_net_trans_promisc_mode {
901 MLX4_FS_MC_DEFAULT, 901 MLX4_FS_MC_DEFAULT,
902 MLX4_FS_UC_SNIFFER, 902 MLX4_FS_UC_SNIFFER,
903 MLX4_FS_MC_SNIFFER, 903 MLX4_FS_MC_SNIFFER,
904 904 MLX4_FS_MODE_NUM, /* should be last */
905}; 905};
906 906
907struct mlx4_spec_eth { 907struct mlx4_spec_eth {
@@ -1044,6 +1044,11 @@ struct _rule_hw {
1044 }; 1044 };
1045}; 1045};
1046 1046
1047/* translating DMFS verbs sniffer rule to the FW API would need two reg IDs */
1048struct mlx4_flow_handle {
1049 u64 reg_id[2];
1050};
1051
1047int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port, u32 qpn, 1052int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port, u32 qpn,
1048 enum mlx4_net_trans_promisc_mode mode); 1053 enum mlx4_net_trans_promisc_mode mode);
1049int mlx4_flow_steer_promisc_remove(struct mlx4_dev *dev, u8 port, 1054int mlx4_flow_steer_promisc_remove(struct mlx4_dev *dev, u8 port,
@@ -1093,6 +1098,11 @@ void mlx4_counter_free(struct mlx4_dev *dev, u32 idx);
1093int mlx4_flow_attach(struct mlx4_dev *dev, 1098int mlx4_flow_attach(struct mlx4_dev *dev,
1094 struct mlx4_net_trans_rule *rule, u64 *reg_id); 1099 struct mlx4_net_trans_rule *rule, u64 *reg_id);
1095int mlx4_flow_detach(struct mlx4_dev *dev, u64 reg_id); 1100int mlx4_flow_detach(struct mlx4_dev *dev, u64 reg_id);
1101int mlx4_map_sw_to_hw_steering_mode(struct mlx4_dev *dev,
1102 enum mlx4_net_trans_promisc_mode flow_type);
1103int mlx4_map_sw_to_hw_steering_id(struct mlx4_dev *dev,
1104 enum mlx4_net_trans_rule_id id);
1105int mlx4_hw_rule_sz(struct mlx4_dev *dev, enum mlx4_net_trans_rule_id id);
1096 1106
1097void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port, 1107void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port,
1098 int i, int val); 1108 int i, int val);