aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-05-08 18:29:48 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-05-08 18:29:48 -0400
commite0fd9affeb64088eff407dfc98bbd3a5c17ea479 (patch)
tree94ee7e3410fffb305aa6901053b85245686444a2 /drivers/net/ethernet/mellanox
parent3d15b798eafd3b6b3cc25f20747008ab9401a57f (diff)
parentea9627c800e99a902e2668ac8e6377f02d6f720a (diff)
Merge tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
Pull InfiniBand/RDMA changes from Roland Dreier: - XRC transport fixes - Fix DHCP on IPoIB - mlx4 preparations for flow steering - iSER fixes - miscellaneous other fixes * tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (23 commits) IB/iser: Add support for iser CM REQ additional info IB/iser: Return error to upper layers on EAGAIN registration failures IB/iser: Move informational messages from error to info level IB/iser: Add module version mlx4_core: Expose a few helpers to fill DMFS HW strucutures mlx4_core: Directly expose fields of DMFS HW rule control segment mlx4_core: Change a few DMFS fields names to match firmare spec mlx4: Match DMFS promiscuous field names to firmware spec mlx4_core: Move DMFS HW structs to common header file IB/mlx4: Set link type for RAW PACKET QPs in the QP context IB/mlx4: Disable VLAN stripping for RAW PACKET QPs mlx4_core: Reduce warning message for SRQ_LIMIT event to debug level RDMA/iwcm: Don't touch cmid after dropping reference IB/qib: Correct qib_verbs_register_sysfs() error handling IB/ipath: Correct ipath_verbs_register_sysfs() error handling RDMA/cxgb4: Fix SQ allocation when on-chip SQ is disabled SRPT: Fix odd use of WARN_ON() IPoIB: Fix ipoib_hard_header() return value RDMA: Rename random32() to prandom_u32() RDMA/cxgb3: Fix uninitialized variable ...
Diffstat (limited to 'drivers/net/ethernet/mellanox')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_ethtool.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c16
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/eq.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mcg.c120
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h79
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/srq.c15
6 files changed, 102 insertions, 134 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index bcf4d118e98c..c9e6b62dd000 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -889,7 +889,7 @@ static int mlx4_en_flow_replace(struct net_device *dev,
889 .queue_mode = MLX4_NET_TRANS_Q_FIFO, 889 .queue_mode = MLX4_NET_TRANS_Q_FIFO,
890 .exclusive = 0, 890 .exclusive = 0,
891 .allow_loopback = 1, 891 .allow_loopback = 1,
892 .promisc_mode = MLX4_FS_PROMISC_NONE, 892 .promisc_mode = MLX4_FS_REGULAR,
893 }; 893 };
894 894
895 rule.port = priv->port; 895 rule.port = priv->port;
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index a69a908614e6..b35f94700093 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -127,7 +127,7 @@ static void mlx4_en_filter_work(struct work_struct *work)
127 .queue_mode = MLX4_NET_TRANS_Q_LIFO, 127 .queue_mode = MLX4_NET_TRANS_Q_LIFO,
128 .exclusive = 1, 128 .exclusive = 1,
129 .allow_loopback = 1, 129 .allow_loopback = 1,
130 .promisc_mode = MLX4_FS_PROMISC_NONE, 130 .promisc_mode = MLX4_FS_REGULAR,
131 .port = priv->port, 131 .port = priv->port,
132 .priority = MLX4_DOMAIN_RFS, 132 .priority = MLX4_DOMAIN_RFS,
133 }; 133 };
@@ -448,7 +448,7 @@ static int mlx4_en_uc_steer_add(struct mlx4_en_priv *priv,
448 .queue_mode = MLX4_NET_TRANS_Q_FIFO, 448 .queue_mode = MLX4_NET_TRANS_Q_FIFO,
449 .exclusive = 0, 449 .exclusive = 0,
450 .allow_loopback = 1, 450 .allow_loopback = 1,
451 .promisc_mode = MLX4_FS_PROMISC_NONE, 451 .promisc_mode = MLX4_FS_REGULAR,
452 .priority = MLX4_DOMAIN_NIC, 452 .priority = MLX4_DOMAIN_NIC,
453 }; 453 };
454 454
@@ -795,7 +795,7 @@ static void mlx4_en_set_promisc_mode(struct mlx4_en_priv *priv,
795 err = mlx4_flow_steer_promisc_add(mdev->dev, 795 err = mlx4_flow_steer_promisc_add(mdev->dev,
796 priv->port, 796 priv->port,
797 priv->base_qpn, 797 priv->base_qpn,
798 MLX4_FS_PROMISC_UPLINK); 798 MLX4_FS_ALL_DEFAULT);
799 if (err) 799 if (err)
800 en_err(priv, "Failed enabling promiscuous mode\n"); 800 en_err(priv, "Failed enabling promiscuous mode\n");
801 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; 801 priv->flags |= MLX4_EN_FLAG_MC_PROMISC;
@@ -858,7 +858,7 @@ static void mlx4_en_clear_promisc_mode(struct mlx4_en_priv *priv,
858 case MLX4_STEERING_MODE_DEVICE_MANAGED: 858 case MLX4_STEERING_MODE_DEVICE_MANAGED:
859 err = mlx4_flow_steer_promisc_remove(mdev->dev, 859 err = mlx4_flow_steer_promisc_remove(mdev->dev,
860 priv->port, 860 priv->port,
861 MLX4_FS_PROMISC_UPLINK); 861 MLX4_FS_ALL_DEFAULT);
862 if (err) 862 if (err)
863 en_err(priv, "Failed disabling promiscuous mode\n"); 863 en_err(priv, "Failed disabling promiscuous mode\n");
864 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; 864 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC;
@@ -919,7 +919,7 @@ static void mlx4_en_do_multicast(struct mlx4_en_priv *priv,
919 err = mlx4_flow_steer_promisc_add(mdev->dev, 919 err = mlx4_flow_steer_promisc_add(mdev->dev,
920 priv->port, 920 priv->port,
921 priv->base_qpn, 921 priv->base_qpn,
922 MLX4_FS_PROMISC_ALL_MULTI); 922 MLX4_FS_MC_DEFAULT);
923 break; 923 break;
924 924
925 case MLX4_STEERING_MODE_B0: 925 case MLX4_STEERING_MODE_B0:
@@ -942,7 +942,7 @@ static void mlx4_en_do_multicast(struct mlx4_en_priv *priv,
942 case MLX4_STEERING_MODE_DEVICE_MANAGED: 942 case MLX4_STEERING_MODE_DEVICE_MANAGED:
943 err = mlx4_flow_steer_promisc_remove(mdev->dev, 943 err = mlx4_flow_steer_promisc_remove(mdev->dev,
944 priv->port, 944 priv->port,
945 MLX4_FS_PROMISC_ALL_MULTI); 945 MLX4_FS_MC_DEFAULT);
946 break; 946 break;
947 947
948 case MLX4_STEERING_MODE_B0: 948 case MLX4_STEERING_MODE_B0:
@@ -1621,10 +1621,10 @@ void mlx4_en_stop_port(struct net_device *dev, int detach)
1621 MLX4_EN_FLAG_MC_PROMISC); 1621 MLX4_EN_FLAG_MC_PROMISC);
1622 mlx4_flow_steer_promisc_remove(mdev->dev, 1622 mlx4_flow_steer_promisc_remove(mdev->dev,
1623 priv->port, 1623 priv->port,
1624 MLX4_FS_PROMISC_UPLINK); 1624 MLX4_FS_ALL_DEFAULT);
1625 mlx4_flow_steer_promisc_remove(mdev->dev, 1625 mlx4_flow_steer_promisc_remove(mdev->dev,
1626 priv->port, 1626 priv->port,
1627 MLX4_FS_PROMISC_ALL_MULTI); 1627 MLX4_FS_MC_DEFAULT);
1628 } else if (priv->flags & MLX4_EN_FLAG_PROMISC) { 1628 } else if (priv->flags & MLX4_EN_FLAG_PROMISC) {
1629 priv->flags &= ~MLX4_EN_FLAG_PROMISC; 1629 priv->flags &= ~MLX4_EN_FLAG_PROMISC;
1630 1630
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c
index 8e3123a1df88..6000342f9725 100644
--- a/drivers/net/ethernet/mellanox/mlx4/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx4/eq.c
@@ -497,8 +497,8 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
497 break; 497 break;
498 498
499 case MLX4_EVENT_TYPE_SRQ_LIMIT: 499 case MLX4_EVENT_TYPE_SRQ_LIMIT:
500 mlx4_warn(dev, "%s: MLX4_EVENT_TYPE_SRQ_LIMIT\n", 500 mlx4_dbg(dev, "%s: MLX4_EVENT_TYPE_SRQ_LIMIT\n",
501 __func__); 501 __func__);
502 case MLX4_EVENT_TYPE_SRQ_CATAS_ERROR: 502 case MLX4_EVENT_TYPE_SRQ_CATAS_ERROR:
503 if (mlx4_is_master(dev)) { 503 if (mlx4_is_master(dev)) {
504 /* forward only to slave owning the SRQ */ 504 /* forward only to slave owning the SRQ */
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c
index ffc78d2cb0cf..f3e804f2a35f 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mcg.c
+++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c
@@ -645,25 +645,37 @@ 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[] = { 670 u8 flags = 0;
652 [MLX4_FS_PROMISC_NONE] = 0x0, 671
653 [MLX4_FS_PROMISC_UPLINK] = 0x1, 672 flags = ctrl->queue_mode == MLX4_NET_TRANS_Q_LIFO ? 1 : 0;
654 [MLX4_FS_PROMISC_FUNCTION_PORT] = 0x2, 673 flags |= ctrl->exclusive ? (1 << 2) : 0;
655 [MLX4_FS_PROMISC_ALL_MULTI] = 0x3, 674 flags |= ctrl->allow_loopback ? (1 << 3) : 0;
656 }; 675
657 676 hw->flags = flags;
658 u32 dw = 0; 677 hw->type = __promisc_mode[ctrl->promisc_mode];
659 678 hw->prio = cpu_to_be16(ctrl->priority);
660 dw = ctrl->queue_mode == MLX4_NET_TRANS_Q_LIFO ? 1 : 0;
661 dw |= ctrl->exclusive ? (1 << 2) : 0;
662 dw |= ctrl->allow_loopback ? (1 << 3) : 0;
663 dw |= __promisc_mode[ctrl->promisc_mode] << 8;
664 dw |= ctrl->priority << 16;
665
666 hw->ctrl = cpu_to_be32(dw);
667 hw->port = ctrl->port; 679 hw->port = ctrl->port;
668 hw->qpn = cpu_to_be32(ctrl->qpn); 680 hw->qpn = cpu_to_be32(ctrl->qpn);
669} 681}
@@ -677,29 +689,51 @@ const u16 __sw_id_hw[] = {
677 [MLX4_NET_TRANS_RULE_ID_UDP] = 0xE006 689 [MLX4_NET_TRANS_RULE_ID_UDP] = 0xE006
678}; 690};
679 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
680static 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,
681 struct _rule_hw *rule_hw) 730 struct _rule_hw *rule_hw)
682{ 731{
683 static const size_t __rule_hw_sz[] = { 732 if (mlx4_hw_rule_sz(dev, spec->id) < 0)
684 [MLX4_NET_TRANS_RULE_ID_ETH] =
685 sizeof(struct mlx4_net_trans_rule_hw_eth),
686 [MLX4_NET_TRANS_RULE_ID_IB] =
687 sizeof(struct mlx4_net_trans_rule_hw_ib),
688 [MLX4_NET_TRANS_RULE_ID_IPV6] = 0,
689 [MLX4_NET_TRANS_RULE_ID_IPV4] =
690 sizeof(struct mlx4_net_trans_rule_hw_ipv4),
691 [MLX4_NET_TRANS_RULE_ID_TCP] =
692 sizeof(struct mlx4_net_trans_rule_hw_tcp_udp),
693 [MLX4_NET_TRANS_RULE_ID_UDP] =
694 sizeof(struct mlx4_net_trans_rule_hw_tcp_udp)
695 };
696 if (spec->id >= MLX4_NET_TRANS_RULE_NUM) {
697 mlx4_err(dev, "Invalid network rule id. id = %d\n", spec->id);
698 return -EINVAL; 733 return -EINVAL;
699 } 734 memset(rule_hw, 0, mlx4_hw_rule_sz(dev, spec->id));
700 memset(rule_hw, 0, __rule_hw_sz[spec->id]);
701 rule_hw->id = cpu_to_be16(__sw_id_hw[spec->id]); 735 rule_hw->id = cpu_to_be16(__sw_id_hw[spec->id]);
702 rule_hw->size = __rule_hw_sz[spec->id] >> 2; 736 rule_hw->size = mlx4_hw_rule_sz(dev, spec->id) >> 2;
703 737
704 switch (spec->id) { 738 switch (spec->id) {
705 case MLX4_NET_TRANS_RULE_ID_ETH: 739 case MLX4_NET_TRANS_RULE_ID_ETH:
@@ -713,12 +747,12 @@ static int parse_trans_rule(struct mlx4_dev *dev, struct mlx4_spec_list *spec,
713 rule_hw->eth.ether_type_enable = 1; 747 rule_hw->eth.ether_type_enable = 1;
714 rule_hw->eth.ether_type = spec->eth.ether_type; 748 rule_hw->eth.ether_type = spec->eth.ether_type;
715 } 749 }
716 rule_hw->eth.vlan_id = spec->eth.vlan_id; 750 rule_hw->eth.vlan_tag = spec->eth.vlan_id;
717 rule_hw->eth.vlan_id_msk = spec->eth.vlan_id_msk; 751 rule_hw->eth.vlan_tag_msk = spec->eth.vlan_id_msk;
718 break; 752 break;
719 753
720 case MLX4_NET_TRANS_RULE_ID_IB: 754 case MLX4_NET_TRANS_RULE_ID_IB:
721 rule_hw->ib.qpn = spec->ib.r_qpn; 755 rule_hw->ib.l3_qpn = spec->ib.l3_qpn;
722 rule_hw->ib.qpn_mask = spec->ib.qpn_msk; 756 rule_hw->ib.qpn_mask = spec->ib.qpn_msk;
723 memcpy(&rule_hw->ib.dst_gid, &spec->ib.dst_gid, 16); 757 memcpy(&rule_hw->ib.dst_gid, &spec->ib.dst_gid, 16);
724 memcpy(&rule_hw->ib.dst_gid_msk, &spec->ib.dst_gid_msk, 16); 758 memcpy(&rule_hw->ib.dst_gid_msk, &spec->ib.dst_gid_msk, 16);
@@ -1136,7 +1170,7 @@ int mlx4_trans_to_dmfs_attach(struct mlx4_dev *dev, struct mlx4_qp *qp,
1136 struct mlx4_net_trans_rule rule = { 1170 struct mlx4_net_trans_rule rule = {
1137 .queue_mode = MLX4_NET_TRANS_Q_FIFO, 1171 .queue_mode = MLX4_NET_TRANS_Q_FIFO,
1138 .exclusive = 0, 1172 .exclusive = 0,
1139 .promisc_mode = MLX4_FS_PROMISC_NONE, 1173 .promisc_mode = MLX4_FS_REGULAR,
1140 .priority = MLX4_DOMAIN_NIC, 1174 .priority = MLX4_DOMAIN_NIC,
1141 }; 1175 };
1142 1176
@@ -1229,11 +1263,10 @@ int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port,
1229 u64 *regid_p; 1263 u64 *regid_p;
1230 1264
1231 switch (mode) { 1265 switch (mode) {
1232 case MLX4_FS_PROMISC_UPLINK: 1266 case MLX4_FS_ALL_DEFAULT:
1233 case MLX4_FS_PROMISC_FUNCTION_PORT:
1234 regid_p = &dev->regid_promisc_array[port]; 1267 regid_p = &dev->regid_promisc_array[port];
1235 break; 1268 break;
1236 case MLX4_FS_PROMISC_ALL_MULTI: 1269 case MLX4_FS_MC_DEFAULT:
1237 regid_p = &dev->regid_allmulti_array[port]; 1270 regid_p = &dev->regid_allmulti_array[port];
1238 break; 1271 break;
1239 default: 1272 default:
@@ -1260,11 +1293,10 @@ int mlx4_flow_steer_promisc_remove(struct mlx4_dev *dev, u8 port,
1260 u64 *regid_p; 1293 u64 *regid_p;
1261 1294
1262 switch (mode) { 1295 switch (mode) {
1263 case MLX4_FS_PROMISC_UPLINK: 1296 case MLX4_FS_ALL_DEFAULT:
1264 case MLX4_FS_PROMISC_FUNCTION_PORT:
1265 regid_p = &dev->regid_promisc_array[port]; 1297 regid_p = &dev->regid_promisc_array[port];
1266 break; 1298 break;
1267 case MLX4_FS_PROMISC_ALL_MULTI: 1299 case MLX4_FS_MC_DEFAULT:
1268 regid_p = &dev->regid_allmulti_array[port]; 1300 regid_p = &dev->regid_allmulti_array[port];
1269 break; 1301 break;
1270 default: 1302 default:
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index eac3dae10efe..df15bb6631cc 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -730,85 +730,6 @@ struct mlx4_steer {
730 struct list_head steer_entries[MLX4_NUM_STEERS]; 730 struct list_head steer_entries[MLX4_NUM_STEERS];
731}; 731};
732 732
733struct mlx4_net_trans_rule_hw_ctrl {
734 __be32 ctrl;
735 u8 rsvd1;
736 u8 funcid;
737 u8 vep;
738 u8 port;
739 __be32 qpn;
740 __be32 rsvd2;
741};
742
743struct mlx4_net_trans_rule_hw_ib {
744 u8 size;
745 u8 rsvd1;
746 __be16 id;
747 u32 rsvd2;
748 __be32 qpn;
749 __be32 qpn_mask;
750 u8 dst_gid[16];
751 u8 dst_gid_msk[16];
752} __packed;
753
754struct mlx4_net_trans_rule_hw_eth {
755 u8 size;
756 u8 rsvd;
757 __be16 id;
758 u8 rsvd1[6];
759 u8 dst_mac[6];
760 u16 rsvd2;
761 u8 dst_mac_msk[6];
762 u16 rsvd3;
763 u8 src_mac[6];
764 u16 rsvd4;
765 u8 src_mac_msk[6];
766 u8 rsvd5;
767 u8 ether_type_enable;
768 __be16 ether_type;
769 __be16 vlan_id_msk;
770 __be16 vlan_id;
771} __packed;
772
773struct mlx4_net_trans_rule_hw_tcp_udp {
774 u8 size;
775 u8 rsvd;
776 __be16 id;
777 __be16 rsvd1[3];
778 __be16 dst_port;
779 __be16 rsvd2;
780 __be16 dst_port_msk;
781 __be16 rsvd3;
782 __be16 src_port;
783 __be16 rsvd4;
784 __be16 src_port_msk;
785} __packed;
786
787struct mlx4_net_trans_rule_hw_ipv4 {
788 u8 size;
789 u8 rsvd;
790 __be16 id;
791 __be32 rsvd1;
792 __be32 dst_ip;
793 __be32 dst_ip_msk;
794 __be32 src_ip;
795 __be32 src_ip_msk;
796} __packed;
797
798struct _rule_hw {
799 union {
800 struct {
801 u8 size;
802 u8 rsvd;
803 __be16 id;
804 };
805 struct mlx4_net_trans_rule_hw_eth eth;
806 struct mlx4_net_trans_rule_hw_ib ib;
807 struct mlx4_net_trans_rule_hw_ipv4 ipv4;
808 struct mlx4_net_trans_rule_hw_tcp_udp tcp_udp;
809 };
810};
811
812enum { 733enum {
813 MLX4_PCI_DEV_IS_VF = 1 << 0, 734 MLX4_PCI_DEV_IS_VF = 1 << 0,
814 MLX4_PCI_DEV_FORCE_SENSE_PORT = 1 << 1, 735 MLX4_PCI_DEV_FORCE_SENSE_PORT = 1 << 1,
diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c
index e329fe1f11b7..79fd269e2c54 100644
--- a/drivers/net/ethernet/mellanox/mlx4/srq.c
+++ b/drivers/net/ethernet/mellanox/mlx4/srq.c
@@ -298,3 +298,18 @@ void mlx4_cleanup_srq_table(struct mlx4_dev *dev)
298 return; 298 return;
299 mlx4_bitmap_cleanup(&mlx4_priv(dev)->srq_table.bitmap); 299 mlx4_bitmap_cleanup(&mlx4_priv(dev)->srq_table.bitmap);
300} 300}
301
302struct mlx4_srq *mlx4_srq_lookup(struct mlx4_dev *dev, u32 srqn)
303{
304 struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table;
305 struct mlx4_srq *srq;
306 unsigned long flags;
307
308 spin_lock_irqsave(&srq_table->lock, flags);
309 srq = radix_tree_lookup(&srq_table->tree,
310 srqn & (dev->caps.num_srqs - 1));
311 spin_unlock_irqrestore(&srq_table->lock, flags);
312
313 return srq;
314}
315EXPORT_SYMBOL_GPL(mlx4_srq_lookup);