|
@@ -45,6 +45,7 @@
|
|
|
#include "mthca_cmd.h"
|
|
|
#include "mthca_profile.h"
|
|
|
#include "mthca_memfree.h"
|
|
|
+#include "mthca_wqe.h"
|
|
|
|
|
|
MODULE_AUTHOR("Roland Dreier");
|
|
|
MODULE_DESCRIPTION("Mellanox InfiniBand HCA low-level driver");
|
|
@@ -200,7 +201,18 @@ static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)
|
|
|
mdev->limits.gid_table_len = dev_lim->max_gids;
|
|
|
mdev->limits.pkey_table_len = dev_lim->max_pkeys;
|
|
|
mdev->limits.local_ca_ack_delay = dev_lim->local_ca_ack_delay;
|
|
|
- mdev->limits.max_sg = dev_lim->max_sg;
|
|
|
+ /*
|
|
|
+ * Need to allow for worst case send WQE overhead and check
|
|
|
+ * whether max_desc_sz imposes a lower limit than max_sg; UD
|
|
|
+ * send has the biggest overhead.
|
|
|
+ */
|
|
|
+ mdev->limits.max_sg = min_t(int, dev_lim->max_sg,
|
|
|
+ (dev_lim->max_desc_sz -
|
|
|
+ sizeof (struct mthca_next_seg) -
|
|
|
+ (mthca_is_memfree(mdev) ?
|
|
|
+ sizeof (struct mthca_arbel_ud_seg) :
|
|
|
+ sizeof (struct mthca_tavor_ud_seg))) /
|
|
|
+ sizeof (struct mthca_data_seg));
|
|
|
mdev->limits.max_wqes = dev_lim->max_qp_sz;
|
|
|
mdev->limits.max_qp_init_rdma = dev_lim->max_requester_per_qp;
|
|
|
mdev->limits.reserved_qps = dev_lim->reserved_qps;
|