IB/mthca: Fix reserved MTTs calculation on mem-free HCAs
authorMichael S. Tsirkin <mst@mellanox.co.il>
Sat, 10 Feb 2007 21:17:26 +0000 (23:17 +0200)
committerRoland Dreier <rolandd@cisco.com>
Tue, 13 Feb 2007 00:16:29 +0000 (16:16 -0800)
The reserved_mtts field has different meaning in Tavor and Arbel, so
we are wasting mtt entries on memfree. Fix the Arbel case to match
Tavor semantics.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/mthca/mthca_cmd.c

index 968d1519761c50f64f28ed03e4f5ff8fd6d1e0b1..71314460b11e63b649c9ad55c423b5de3845ef4c 100644 (file)
@@ -1051,7 +1051,11 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev,
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_EQ_OFFSET);
        dev_lim->max_eqs = 1 << (field & 0x7);
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_RSVD_MTT_OFFSET);
-       dev_lim->reserved_mtts = 1 << (field >> 4);
+       if (mthca_is_memfree(dev))
+               dev_lim->reserved_mtts = ALIGN((1 << (field >> 4)) * sizeof(u64),
+                                              MTHCA_MTT_SEG_SIZE) / MTHCA_MTT_SEG_SIZE;
+       else
+               dev_lim->reserved_mtts = 1 << (field >> 4);
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_MRW_SZ_OFFSET);
        dev_lim->max_mrw_sz = 1 << field;
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_RSVD_MRW_OFFSET);