aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mthca/mthca_cmd.c
diff options
context:
space:
mode:
authorRoland Dreier <roland@topspin.com>2005-04-16 18:26:24 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:26:24 -0400
commit44ea66879d5638cfed5b5ecf628badfd8ec26f36 (patch)
tree987bb5368a8e4a058cffc2eef4752d7cca4335e5 /drivers/infiniband/hw/mthca/mthca_cmd.c
parentddb934e0eead2feadc7467b1f7bf9c81aa241232 (diff)
[PATCH] IB/mthca: fix MTT allocation in mem-free mode
Fix bug in MTT allocation in mem-free mode. I misunderstood the MTT size value returned by the firmware -- it is really the size of a single MTT entry, since mem-free mode does not segment the MTT as the original firmware did. This meant that our MTT addresses ended up being off by a factor of 8. This meant that our MTT allocations might overlap, and so we could overwrite and corrupt earlier memory regions when writing new MTT entries. We fix this by always using our 64-byte MTT segment size. This allows some simplification of the code as well, since there's no reason to put the MTT segment size in a variable -- we can always use our enum value directly. Signed-off-by: Roland Dreier <roland@topspin.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_cmd.c')
-rw-r--r--drivers/infiniband/hw/mthca/mthca_cmd.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c
index 1bc1ce758165..244d37c5bf6a 100644
--- a/drivers/infiniband/hw/mthca/mthca_cmd.c
+++ b/drivers/infiniband/hw/mthca/mthca_cmd.c
@@ -990,7 +990,6 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev,
990 MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_SG_RQ_OFFSET); 990 MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_SG_RQ_OFFSET);
991 dev_lim->max_sg = min_t(int, field, dev_lim->max_sg); 991 dev_lim->max_sg = min_t(int, field, dev_lim->max_sg);
992 MTHCA_GET(size, outbox, QUERY_DEV_LIM_MTT_ENTRY_SZ_OFFSET); 992 MTHCA_GET(size, outbox, QUERY_DEV_LIM_MTT_ENTRY_SZ_OFFSET);
993 dev_lim->mtt_seg_sz = size;
994 MTHCA_GET(size, outbox, QUERY_DEV_LIM_MPT_ENTRY_SZ_OFFSET); 993 MTHCA_GET(size, outbox, QUERY_DEV_LIM_MPT_ENTRY_SZ_OFFSET);
995 dev_lim->mpt_entry_sz = size; 994 dev_lim->mpt_entry_sz = size;
996 MTHCA_GET(field, outbox, QUERY_DEV_LIM_PBL_SZ_OFFSET); 995 MTHCA_GET(field, outbox, QUERY_DEV_LIM_PBL_SZ_OFFSET);
@@ -1018,7 +1017,6 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev,
1018 } else { 1017 } else {
1019 MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_AV_OFFSET); 1018 MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_AV_OFFSET);
1020 dev_lim->hca.tavor.max_avs = 1 << (field & 0x3f); 1019 dev_lim->hca.tavor.max_avs = 1 << (field & 0x3f);
1021 dev_lim->mtt_seg_sz = MTHCA_MTT_SEG_SIZE;
1022 dev_lim->mpt_entry_sz = MTHCA_MPT_ENTRY_SIZE; 1020 dev_lim->mpt_entry_sz = MTHCA_MPT_ENTRY_SIZE;
1023 } 1021 }
1024 1022