diff options
author | Joachim Fenkes <fenkes@de.ibm.com> | 2007-10-16 11:31:14 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-10-18 00:47:24 -0400 |
commit | abc39d3672d8af4bf6c943faf85fa8877caccf7e (patch) | |
tree | c90456ddae53b1ce39cd604404d3810e3b499a27 /drivers/infiniband/hw/ehca/ehca_main.c | |
parent | 8c08d50d4fc52a9367c356ebbeb194c30fbc7ac8 (diff) |
IB/ehca: Change meaning of hca_cap_mr_pgsize
ehca_shca.hca_cap_mr_pgsize now contains all supported page sizes ORed
together. This makes some checks easier to code and understand, plus
we can return this value verbatim in query_hca(), fixing a problem
with SRP (reported by Anton Blanchard -- thanks!).
Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/ehca/ehca_main.c')
-rw-r--r-- | drivers/infiniband/hw/ehca/ehca_main.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index 403467f66fe6..d477dc3b4760 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
@@ -260,13 +260,20 @@ static struct cap_descr { | |||
260 | { HCA_CAP_MINI_QP, "HCA_CAP_MINI_QP" }, | 260 | { HCA_CAP_MINI_QP, "HCA_CAP_MINI_QP" }, |
261 | }; | 261 | }; |
262 | 262 | ||
263 | int ehca_sense_attributes(struct ehca_shca *shca) | 263 | static int ehca_sense_attributes(struct ehca_shca *shca) |
264 | { | 264 | { |
265 | int i, ret = 0; | 265 | int i, ret = 0; |
266 | u64 h_ret; | 266 | u64 h_ret; |
267 | struct hipz_query_hca *rblock; | 267 | struct hipz_query_hca *rblock; |
268 | struct hipz_query_port *port; | 268 | struct hipz_query_port *port; |
269 | 269 | ||
270 | static const u32 pgsize_map[] = { | ||
271 | HCA_CAP_MR_PGSIZE_4K, 0x1000, | ||
272 | HCA_CAP_MR_PGSIZE_64K, 0x10000, | ||
273 | HCA_CAP_MR_PGSIZE_1M, 0x100000, | ||
274 | HCA_CAP_MR_PGSIZE_16M, 0x1000000, | ||
275 | }; | ||
276 | |||
270 | rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); | 277 | rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL); |
271 | if (!rblock) { | 278 | if (!rblock) { |
272 | ehca_gen_err("Cannot allocate rblock memory."); | 279 | ehca_gen_err("Cannot allocate rblock memory."); |
@@ -329,8 +336,15 @@ int ehca_sense_attributes(struct ehca_shca *shca) | |||
329 | if (EHCA_BMASK_GET(hca_cap_descr[i].mask, shca->hca_cap)) | 336 | if (EHCA_BMASK_GET(hca_cap_descr[i].mask, shca->hca_cap)) |
330 | ehca_gen_dbg(" %s", hca_cap_descr[i].descr); | 337 | ehca_gen_dbg(" %s", hca_cap_descr[i].descr); |
331 | 338 | ||
332 | shca->hca_cap_mr_pgsize = rblock->memory_page_size_supported; | 339 | /* translate supported MR page sizes; always support 4K */ |
340 | shca->hca_cap_mr_pgsize = EHCA_PAGESIZE; | ||
341 | if (ehca_mr_largepage) { /* support extra sizes only if enabled */ | ||
342 | for (i = 0; i < ARRAY_SIZE(pgsize_map); i += 2) | ||
343 | if (rblock->memory_page_size_supported & pgsize_map[i]) | ||
344 | shca->hca_cap_mr_pgsize |= pgsize_map[i + 1]; | ||
345 | } | ||
333 | 346 | ||
347 | /* query max MTU from first port -- it's the same for all ports */ | ||
334 | port = (struct hipz_query_port *)rblock; | 348 | port = (struct hipz_query_port *)rblock; |
335 | h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port); | 349 | h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port); |
336 | if (h_ret != H_SUCCESS) { | 350 | if (h_ret != H_SUCCESS) { |