Commit 852eb1aa authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky
Browse files

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: default avatarSteffen Maier <maier@linux.vnet.ibm.com>
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent d445a4e2
Loading
Loading
Loading
Loading
+21 −28
Original line number Original line Diff line number Diff line
@@ -14,27 +14,10 @@
#include "zfcp_ext.h"
#include "zfcp_ext.h"
#include "zfcp_qdio.h"
#include "zfcp_qdio.h"


#define QBUFF_PER_PAGE		(PAGE_SIZE / sizeof(struct qdio_buffer))

static bool enable_multibuffer = 1;
static bool enable_multibuffer = 1;
module_param_named(datarouter, enable_multibuffer, bool, 0400);
module_param_named(datarouter, enable_multibuffer, bool, 0400);
MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)");
MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)");


static int zfcp_qdio_buffers_enqueue(struct qdio_buffer **sbal)
{
	int pos;

	for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) {
		sbal[pos] = (struct qdio_buffer *) get_zeroed_page(GFP_KERNEL);
		if (!sbal[pos])
			return -ENOMEM;
	}
	for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos++)
		if (pos % QBUFF_PER_PAGE)
			sbal[pos] = sbal[pos - 1] + 1;
	return 0;
}

static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id,
static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id,
				    unsigned int qdio_err)
				    unsigned int qdio_err)
{
{
@@ -326,15 +309,30 @@ static void zfcp_qdio_setup_init_data(struct qdio_initialize *id,
static int zfcp_qdio_allocate(struct zfcp_qdio *qdio)
static int zfcp_qdio_allocate(struct zfcp_qdio *qdio)
{
{
	struct qdio_initialize init_data;
	struct qdio_initialize init_data;
	int ret;


	if (zfcp_qdio_buffers_enqueue(qdio->req_q) ||
	ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
	    zfcp_qdio_buffers_enqueue(qdio->res_q))
	if (ret)
		return -ENOMEM;
		return -ENOMEM;


	ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
	if (ret)
		goto free_req_q;

	zfcp_qdio_setup_init_data(&init_data, qdio);
	zfcp_qdio_setup_init_data(&init_data, qdio);
	init_waitqueue_head(&qdio->req_q_wq);
	init_waitqueue_head(&qdio->req_q_wq);


	return qdio_allocate(&init_data);
	ret = qdio_allocate(&init_data);
	if (ret)
		goto free_res_q;

	return 0;

free_res_q:
	qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
free_req_q:
	qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
	return ret;
}
}


/**
/**
@@ -448,19 +446,14 @@ int zfcp_qdio_open(struct zfcp_qdio *qdio)


void zfcp_qdio_destroy(struct zfcp_qdio *qdio)
void zfcp_qdio_destroy(struct zfcp_qdio *qdio)
{
{
	int p;

	if (!qdio)
	if (!qdio)
		return;
		return;


	if (qdio->adapter->ccw_device)
	if (qdio->adapter->ccw_device)
		qdio_free(qdio->adapter->ccw_device);
		qdio_free(qdio->adapter->ccw_device);


	for (p = 0; p < QDIO_MAX_BUFFERS_PER_Q; p += QBUFF_PER_PAGE) {
	qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
		free_page((unsigned long) qdio->req_q[p]);
	qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
		free_page((unsigned long) qdio->res_q[p]);
	}

	kfree(qdio);
	kfree(qdio);
}
}


@@ -475,7 +468,7 @@ int zfcp_qdio_setup(struct zfcp_adapter *adapter)
	qdio->adapter = adapter;
	qdio->adapter = adapter;


	if (zfcp_qdio_allocate(qdio)) {
	if (zfcp_qdio_allocate(qdio)) {
		zfcp_qdio_destroy(qdio);
		kfree(qdio);
		return -ENOMEM;
		return -ENOMEM;
	}
	}