aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2014-06-27 11:11:38 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2014-07-22 03:26:16 -0400
commit852eb1aa2bd342dede0126f50d4fde7d963db32e (patch)
tree878c9e623d2bb078b1232ab071479c6e72a7a27a /drivers/s390
parentd445a4e28c0ff740e946ae22860be85428814c39 (diff)
s390/zfcp: use qdio buffer helpers
Use qdio buffer helpers to manage the buffers used for the request and response queues. No functional change. Reviewed-by: Steffen Maier <maier@linux.vnet.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/scsi/zfcp_qdio.c49
1 files changed, 21 insertions, 28 deletions
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c
index 06025cdaa4ad..495e1cb3afa6 100644
--- a/drivers/s390/scsi/zfcp_qdio.c
+++ b/drivers/s390/scsi/zfcp_qdio.c
@@ -14,27 +14,10 @@
14#include "zfcp_ext.h" 14#include "zfcp_ext.h"
15#include "zfcp_qdio.h" 15#include "zfcp_qdio.h"
16 16
17#define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer))
18
19static bool enable_multibuffer = 1; 17static bool enable_multibuffer = 1;
20module_param_named(datarouter, enable_multibuffer, bool, 0400); 18module_param_named(datarouter, enable_multibuffer, bool, 0400);
21MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)"); 19MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)");
22 20
23static int zfcp_qdio_buffers_enqueue(struct qdio_buffer **sbal)
24{
25 int pos;
26
27 for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) {
28 sbal[pos] = (struct qdio_buffer *) get_zeroed_page(GFP_KERNEL);
29 if (!sbal[pos])
30 return -ENOMEM;
31 }
32 for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos++)
33 if (pos % QBUFF_PER_PAGE)
34 sbal[pos] = sbal[pos - 1] + 1;
35 return 0;
36}
37
38static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id, 21static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id,
39 unsigned int qdio_err) 22 unsigned int qdio_err)
40{ 23{
@@ -326,15 +309,30 @@ static void zfcp_qdio_setup_init_data(struct qdio_initialize *id,
326static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) 309static int zfcp_qdio_allocate(struct zfcp_qdio *qdio)
327{ 310{
328 struct qdio_initialize init_data; 311 struct qdio_initialize init_data;
312 int ret;
329 313
330 if (zfcp_qdio_buffers_enqueue(qdio->req_q) || 314 ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
331 zfcp_qdio_buffers_enqueue(qdio->res_q)) 315 if (ret)
332 return -ENOMEM; 316 return -ENOMEM;
333 317
318 ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
319 if (ret)
320 goto free_req_q;
321
334 zfcp_qdio_setup_init_data(&init_data, qdio); 322 zfcp_qdio_setup_init_data(&init_data, qdio);
335 init_waitqueue_head(&qdio->req_q_wq); 323 init_waitqueue_head(&qdio->req_q_wq);
336 324
337 return qdio_allocate(&init_data); 325 ret = qdio_allocate(&init_data);
326 if (ret)
327 goto free_res_q;
328
329 return 0;
330
331free_res_q:
332 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
333free_req_q:
334 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
335 return ret;
338} 336}
339 337
340/** 338/**
@@ -448,19 +446,14 @@ failed_establish:
448 446
449void zfcp_qdio_destroy(struct zfcp_qdio *qdio) 447void zfcp_qdio_destroy(struct zfcp_qdio *qdio)
450{ 448{
451 int p;
452
453 if (!qdio) 449 if (!qdio)
454 return; 450 return;
455 451
456 if (qdio->adapter->ccw_device) 452 if (qdio->adapter->ccw_device)
457 qdio_free(qdio->adapter->ccw_device); 453 qdio_free(qdio->adapter->ccw_device);
458 454
459 for (p = 0; p < QDIO_MAX_BUFFERS_PER_Q; p += QBUFF_PER_PAGE) { 455 qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
460 free_page((unsigned long) qdio->req_q[p]); 456 qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
461 free_page((unsigned long) qdio->res_q[p]);
462 }
463
464 kfree(qdio); 457 kfree(qdio);
465} 458}
466 459
@@ -475,7 +468,7 @@ int zfcp_qdio_setup(struct zfcp_adapter *adapter)
475 qdio->adapter = adapter; 468 qdio->adapter = adapter;
476 469
477 if (zfcp_qdio_allocate(qdio)) { 470 if (zfcp_qdio_allocate(qdio)) {
478 zfcp_qdio_destroy(qdio); 471 kfree(qdio);
479 return -ENOMEM; 472 return -ENOMEM;
480 } 473 }
481 474