* [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
@ 2006-03-25 18:57 FUJITA Tomonori
2006-03-25 19:12 ` Roland Dreier
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: FUJITA Tomonori @ 2006-03-25 18:57 UTC (permalink / raw)
To: boutcher; +Cc: rdreier, linux-scsi
Dave, can you take a look at this please?
Seems to work though it has not been tested heavily.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---
drivers/scsi/ibmvscsi/ibmvscsi.c | 247 +++++++++++++++++++------------------
drivers/scsi/ibmvscsi/ibmvscsi.h | 2
drivers/scsi/ibmvscsi/rpa_vscsi.c | 1
drivers/scsi/ibmvscsi/viosrp.h | 17 ++-
4 files changed, 142 insertions(+), 125 deletions(-)
e0b68841ba2fdb63ab587c43258d1b16c64bf9ee
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index eaefedd..e7bd028 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -168,7 +168,7 @@ static void release_event_pool(struct ev
++in_use;
if (pool->events[i].ext_list) {
dma_free_coherent(hostdata->dev,
- SG_ALL * sizeof(struct memory_descriptor),
+ SG_ALL * sizeof(struct srp_direct_buf),
pool->events[i].ext_list,
pool->events[i].ext_list_token);
}
@@ -284,40 +284,37 @@ static void set_srp_direction(struct scs
struct srp_cmd *srp_cmd,
int numbuf)
{
+ u8 fmt;
+
if (numbuf == 0)
return;
- if (numbuf == 1) {
+ if (numbuf == 1)
+ fmt = SRP_DATA_DESC_DIRECT;
+ else {
+ fmt = SRP_DATA_DESC_INDIRECT;
+ numbuf = min(numbuf, MAX_INDIRECT_BUFS);
+
if (cmd->sc_data_direction == DMA_TO_DEVICE)
- srp_cmd->data_out_format = SRP_DIRECT_BUFFER;
- else
- srp_cmd->data_in_format = SRP_DIRECT_BUFFER;
- } else {
- if (cmd->sc_data_direction == DMA_TO_DEVICE) {
- srp_cmd->data_out_format = SRP_INDIRECT_BUFFER;
- srp_cmd->data_out_count =
- numbuf < MAX_INDIRECT_BUFS ?
- numbuf: MAX_INDIRECT_BUFS;
- } else {
- srp_cmd->data_in_format = SRP_INDIRECT_BUFFER;
- srp_cmd->data_in_count =
- numbuf < MAX_INDIRECT_BUFS ?
- numbuf: MAX_INDIRECT_BUFS;
- }
+ srp_cmd->data_out_desc_cnt = numbuf;
+ else
+ srp_cmd->data_in_desc_cnt = numbuf;
}
+
+ if (cmd->sc_data_direction == DMA_TO_DEVICE)
+ srp_cmd->buf_fmt = fmt << 4;
+ else
+ srp_cmd->buf_fmt = fmt;
}
-static void unmap_sg_list(int num_entries,
+static void unmap_sg_list(int num_entries,
struct device *dev,
- struct memory_descriptor *md)
-{
+ struct srp_direct_buf *md)
+{
int i;
- for (i = 0; i < num_entries; ++i) {
- dma_unmap_single(dev,
- md[i].virtual_address,
- md[i].length, DMA_BIDIRECTIONAL);
- }
+ for (i = 0; i < num_entries; ++i)
+ dma_unmap_single(dev, md[i].va, md[i].len, DMA_BIDIRECTIONAL);
}
/**
@@ -330,23 +327,26 @@ static void unmap_cmd_data(struct srp_cm
struct srp_event_struct *evt_struct,
struct device *dev)
{
- if ((cmd->data_out_format == SRP_NO_BUFFER) &&
- (cmd->data_in_format == SRP_NO_BUFFER))
+ u8 out_fmt, in_fmt;
+
+ out_fmt = cmd->buf_fmt >> 4;
+ in_fmt = cmd->buf_fmt & ((1U << 4) - 1);
+
+ if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC)
return;
- else if ((cmd->data_out_format == SRP_DIRECT_BUFFER) ||
- (cmd->data_in_format == SRP_DIRECT_BUFFER)) {
- struct memory_descriptor *data =
- (struct memory_descriptor *)cmd->additional_data;
- dma_unmap_single(dev, data->virtual_address, data->length,
- DMA_BIDIRECTIONAL);
+ else if (out_fmt == SRP_DATA_DESC_DIRECT ||
+ in_fmt == SRP_DATA_DESC_DIRECT) {
+ struct srp_direct_buf *data =
+ (struct srp_direct_buf *) cmd->add_data;
+ dma_unmap_single(dev, data->va, data->len, DMA_BIDIRECTIONAL);
} else {
- struct indirect_descriptor *indirect =
- (struct indirect_descriptor *)cmd->additional_data;
- int num_mapped = indirect->head.length /
- sizeof(indirect->list[0]);
+ struct srp_indirect_buf *indirect =
+ (struct srp_indirect_buf *) cmd->add_data;
+ int num_mapped = indirect->table_desc.len /
+ sizeof(struct srp_direct_buf);
if (num_mapped <= MAX_INDIRECT_BUFS) {
- unmap_sg_list(num_mapped, dev, &indirect->list[0]);
+ unmap_sg_list(num_mapped, dev, &indirect->desc_list[0]);
return;
}
@@ -356,17 +356,17 @@ static void unmap_cmd_data(struct srp_cm
static int map_sg_list(int num_entries,
struct scatterlist *sg,
- struct memory_descriptor *md)
+ struct srp_direct_buf *md)
{
int i;
u64 total_length = 0;
for (i = 0; i < num_entries; ++i) {
- struct memory_descriptor *descr = md + i;
+ struct srp_direct_buf *descr = md + i;
struct scatterlist *sg_entry = &sg[i];
- descr->virtual_address = sg_dma_address(sg_entry);
- descr->length = sg_dma_len(sg_entry);
- descr->memory_handle = 0;
+ descr->va = sg_dma_address(sg_entry);
+ descr->len = sg_dma_len(sg_entry);
+ descr->key = 0;
total_length += sg_dma_len(sg_entry);
}
return total_length;
@@ -389,10 +389,10 @@ static int map_sg_data(struct scsi_cmnd
int sg_mapped;
u64 total_length = 0;
struct scatterlist *sg = cmd->request_buffer;
- struct memory_descriptor *data =
- (struct memory_descriptor *)srp_cmd->additional_data;
- struct indirect_descriptor *indirect =
- (struct indirect_descriptor *)data;
+ struct srp_direct_buf *data =
+ (struct srp_direct_buf *) srp_cmd->add_data;
+ struct srp_indirect_buf *indirect =
+ (struct srp_indirect_buf *) data;
sg_mapped = dma_map_sg(dev, sg, cmd->use_sg, DMA_BIDIRECTIONAL);
@@ -403,9 +403,9 @@ static int map_sg_data(struct scsi_cmnd
/* special case; we can use a single direct descriptor */
if (sg_mapped == 1) {
- data->virtual_address = sg_dma_address(&sg[0]);
- data->length = sg_dma_len(&sg[0]);
- data->memory_handle = 0;
+ data->va = sg_dma_address(&sg[0]);
+ data->len = sg_dma_len(&sg[0]);
+ data->key = 0;
return 1;
}
@@ -416,25 +416,26 @@ static int map_sg_data(struct scsi_cmnd
return 0;
}
- indirect->head.virtual_address = 0;
- indirect->head.length = sg_mapped * sizeof(indirect->list[0]);
- indirect->head.memory_handle = 0;
+ indirect->table_desc.va = 0;
+ indirect->table_desc.len = sg_mapped * sizeof(struct srp_direct_buf);
+ indirect->table_desc.key = 0;
if (sg_mapped <= MAX_INDIRECT_BUFS) {
- total_length = map_sg_list(sg_mapped, sg, &indirect->list[0]);
- indirect->total_length = total_length;
+ total_length = map_sg_list(sg_mapped, sg,
+ &indirect->desc_list[0]);
+ indirect->len = total_length;
return 1;
}
/* get indirect table */
if (!evt_struct->ext_list) {
- evt_struct->ext_list =(struct memory_descriptor*)
+ evt_struct->ext_list = (struct srp_direct_buf *)
dma_alloc_coherent(dev,
- SG_ALL * sizeof(struct memory_descriptor),
- &evt_struct->ext_list_token, 0);
+ SG_ALL * sizeof(struct srp_direct_buf),
+ &evt_struct->ext_list_token, 0);
if (!evt_struct->ext_list) {
- printk(KERN_ERR
- "ibmvscsi: Can't allocate memory for indirect table\n");
+ printk(KERN_ERR
+ "ibmvscsi: Can't allocate memory for indirect table\n");
return 0;
}
@@ -442,11 +443,11 @@ static int map_sg_data(struct scsi_cmnd
total_length = map_sg_list(sg_mapped, sg, evt_struct->ext_list);
- indirect->total_length = total_length;
- indirect->head.virtual_address = evt_struct->ext_list_token;
- indirect->head.length = sg_mapped * sizeof(indirect->list[0]);
- memcpy(indirect->list, evt_struct->ext_list,
- MAX_INDIRECT_BUFS * sizeof(struct memory_descriptor));
+ indirect->len = total_length;
+ indirect->table_desc.va = evt_struct->ext_list_token;
+ indirect->table_desc.len = sg_mapped * sizeof(indirect->desc_list[0]);
+ memcpy(indirect->desc_list, evt_struct->ext_list,
+ MAX_INDIRECT_BUFS * sizeof(struct srp_direct_buf));
return 1;
}
@@ -463,20 +464,20 @@ static int map_sg_data(struct scsi_cmnd
static int map_single_data(struct scsi_cmnd *cmd,
struct srp_cmd *srp_cmd, struct device *dev)
{
- struct memory_descriptor *data =
- (struct memory_descriptor *)srp_cmd->additional_data;
+ struct srp_direct_buf *data =
+ (struct srp_direct_buf *) srp_cmd->add_data;
- data->virtual_address =
+ data->va =
dma_map_single(dev, cmd->request_buffer,
cmd->request_bufflen,
DMA_BIDIRECTIONAL);
- if (dma_mapping_error(data->virtual_address)) {
+ if (dma_mapping_error(data->va)) {
printk(KERN_ERR
"ibmvscsi: Unable to map request_buffer for command!\n");
return 0;
}
- data->length = cmd->request_bufflen;
- data->memory_handle = 0;
+ data->len = cmd->request_bufflen;
+ data->key = 0;
set_srp_direction(cmd, srp_cmd, 1);
@@ -548,7 +549,7 @@ static int ibmvscsi_send_srp_event(struc
/* Copy the IU into the transfer area */
*evt_struct->xfer_iu = evt_struct->iu;
- evt_struct->xfer_iu->srp.generic.tag = (u64)evt_struct;
+ evt_struct->xfer_iu->srp.rsp.tag = (u64)evt_struct;
/* Add this to the sent list. We need to do this
* before we actually send
@@ -586,27 +587,27 @@ static void handle_cmd_rsp(struct srp_ev
struct srp_rsp *rsp = &evt_struct->xfer_iu->srp.rsp;
struct scsi_cmnd *cmnd = evt_struct->cmnd;
- if (unlikely(rsp->type != SRP_RSP_TYPE)) {
+ if (unlikely(rsp->opcode != SRP_RSP)) {
if (printk_ratelimit())
printk(KERN_WARNING
"ibmvscsi: bad SRP RSP type %d\n",
- rsp->type);
+ rsp->opcode);
}
if (cmnd) {
cmnd->result = rsp->status;
if (((cmnd->result >> 1) & 0x1f) == CHECK_CONDITION)
memcpy(cmnd->sense_buffer,
- rsp->sense_and_response_data,
- rsp->sense_data_list_length);
+ rsp->data,
+ rsp->sense_data_len);
unmap_cmd_data(&evt_struct->iu.srp.cmd,
evt_struct,
evt_struct->hostdata->dev);
- if (rsp->doover)
- cmnd->resid = rsp->data_out_residual_count;
- else if (rsp->diover)
- cmnd->resid = rsp->data_in_residual_count;
+ if (rsp->flags & SRP_RSP_FLAG_DOOVER)
+ cmnd->resid = rsp->data_out_res_cnt;
+ else if (rsp->flags & SRP_RSP_FLAG_DIOVER)
+ cmnd->resid = rsp->data_in_res_cnt;
}
if (evt_struct->cmnd_done)
@@ -633,10 +634,11 @@ static int ibmvscsi_queuecommand(struct
{
struct srp_cmd *srp_cmd;
struct srp_event_struct *evt_struct;
- struct indirect_descriptor *indirect;
+ struct srp_indirect_buf *indirect;
struct ibmvscsi_host_data *hostdata =
(struct ibmvscsi_host_data *)&cmnd->device->host->hostdata;
u16 lun = lun_from_dev(cmnd->device);
+ u8 out_fmt, in_fmt;
evt_struct = get_event_struct(&hostdata->pool);
if (!evt_struct)
@@ -644,8 +646,8 @@ static int ibmvscsi_queuecommand(struct
/* Set up the actual SRP IU */
srp_cmd = &evt_struct->iu.srp.cmd;
- memset(srp_cmd, 0x00, sizeof(*srp_cmd));
- srp_cmd->type = SRP_CMD_TYPE;
+ memset(srp_cmd, 0x00, SRP_MAX_IU_LEN);
+ srp_cmd->opcode = SRP_CMD;
memcpy(srp_cmd->cdb, cmnd->cmnd, sizeof(cmnd->cmnd));
srp_cmd->lun = ((u64) lun) << 48;
@@ -664,13 +666,15 @@ static int ibmvscsi_queuecommand(struct
evt_struct->cmnd_done = done;
/* Fix up dma address of the buffer itself */
- indirect = (struct indirect_descriptor *)srp_cmd->additional_data;
- if (((srp_cmd->data_out_format == SRP_INDIRECT_BUFFER) ||
- (srp_cmd->data_in_format == SRP_INDIRECT_BUFFER)) &&
- (indirect->head.virtual_address == 0)) {
- indirect->head.virtual_address = evt_struct->crq.IU_data_ptr +
- offsetof(struct srp_cmd, additional_data) +
- offsetof(struct indirect_descriptor, list);
+ indirect = (struct srp_indirect_buf *) srp_cmd->add_data;
+ out_fmt = srp_cmd->buf_fmt >> 4;
+ in_fmt = srp_cmd->buf_fmt & ((1U << 4) - 1);
+ if ((in_fmt == SRP_DATA_DESC_INDIRECT ||
+ out_fmt == SRP_DATA_DESC_INDIRECT) &&
+ indirect->table_desc.va == 0) {
+ indirect->table_desc.va = evt_struct->crq.IU_data_ptr +
+ offsetof(struct srp_cmd, add_data) +
+ offsetof(struct srp_indirect_buf, desc_list);
}
return ibmvscsi_send_srp_event(evt_struct, hostdata);
@@ -780,10 +784,10 @@ static void send_mad_adapter_info(struct
static void login_rsp(struct srp_event_struct *evt_struct)
{
struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
- switch (evt_struct->xfer_iu->srp.generic.type) {
- case SRP_LOGIN_RSP_TYPE: /* it worked! */
+ switch (evt_struct->xfer_iu->srp.login_rsp.opcode) {
+ case SRP_LOGIN_RSP: /* it worked! */
break;
- case SRP_LOGIN_REJ_TYPE: /* refused! */
+ case SRP_LOGIN_REJ: /* refused! */
printk(KERN_INFO "ibmvscsi: SRP_LOGIN_REJ reason %u\n",
evt_struct->xfer_iu->srp.login_rej.reason);
/* Login failed. */
@@ -792,7 +796,7 @@ static void login_rsp(struct srp_event_s
default:
printk(KERN_ERR
"ibmvscsi: Invalid login response typecode 0x%02x!\n",
- evt_struct->xfer_iu->srp.generic.type);
+ evt_struct->xfer_iu->srp.login_rsp.opcode);
/* Login failed. */
atomic_set(&hostdata->request_limit, -1);
return;
@@ -800,17 +804,17 @@ static void login_rsp(struct srp_event_s
printk(KERN_INFO "ibmvscsi: SRP_LOGIN succeeded\n");
- if (evt_struct->xfer_iu->srp.login_rsp.request_limit_delta >
+ if (evt_struct->xfer_iu->srp.login_rsp.req_lim_delta >
(max_requests - 2))
- evt_struct->xfer_iu->srp.login_rsp.request_limit_delta =
+ evt_struct->xfer_iu->srp.login_rsp.req_lim_delta =
max_requests - 2;
/* Now we know what the real request-limit is */
atomic_set(&hostdata->request_limit,
- evt_struct->xfer_iu->srp.login_rsp.request_limit_delta);
+ evt_struct->xfer_iu->srp.login_rsp.req_lim_delta);
hostdata->host->can_queue =
- evt_struct->xfer_iu->srp.login_rsp.request_limit_delta - 2;
+ evt_struct->xfer_iu->srp.login_rsp.req_lim_delta - 2;
if (hostdata->host->can_queue < 1) {
printk(KERN_ERR "ibmvscsi: Invalid request_limit_delta\n");
@@ -849,9 +853,9 @@ static int send_srp_login(struct ibmvscs
login = &evt_struct->iu.srp.login_req;
memset(login, 0x00, sizeof(struct srp_login_req));
- login->type = SRP_LOGIN_REQ_TYPE;
- login->max_requested_initiator_to_target_iulen = sizeof(union srp_iu);
- login->required_buffer_formats = 0x0006;
+ login->opcode = SRP_LOGIN_REQ;
+ login->req_it_iu_len = sizeof(union srp_iu);
+ login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT;
/* Start out with a request limit of 1, since this is negotiated in
* the login request we are just sending
@@ -928,13 +932,13 @@ static int ibmvscsi_eh_abort_handler(str
/* Set up an abort SRP command */
memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
- tsk_mgmt->type = SRP_TSK_MGMT_TYPE;
+ tsk_mgmt->opcode = SRP_TSK_MGMT;
tsk_mgmt->lun = ((u64) lun) << 48;
- tsk_mgmt->task_mgmt_flags = 0x01; /* ABORT TASK */
- tsk_mgmt->managed_task_tag = (u64) found_evt;
+ tsk_mgmt->tsk_mgmt_func = SRP_TSK_ABORT_TASK;
+ tsk_mgmt->task_tag = (u64) found_evt;
printk(KERN_INFO "ibmvscsi: aborting command. lun 0x%lx, tag 0x%lx\n",
- tsk_mgmt->lun, tsk_mgmt->managed_task_tag);
+ tsk_mgmt->lun, tsk_mgmt->task_tag);
evt->sync_srp = &srp_rsp;
init_completion(&evt->comp);
@@ -948,25 +952,25 @@ static int ibmvscsi_eh_abort_handler(str
wait_for_completion(&evt->comp);
/* make sure we got a good response */
- if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
+ if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) {
if (printk_ratelimit())
printk(KERN_WARNING
"ibmvscsi: abort bad SRP RSP type %d\n",
- srp_rsp.srp.generic.type);
+ srp_rsp.srp.rsp.opcode);
return FAILED;
}
- if (srp_rsp.srp.rsp.rspvalid)
- rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data);
+ if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID)
+ rsp_rc = *((int *)srp_rsp.srp.rsp.data);
else
rsp_rc = srp_rsp.srp.rsp.status;
if (rsp_rc) {
if (printk_ratelimit())
printk(KERN_WARNING
- "ibmvscsi: abort code %d for task tag 0x%lx\n",
+ "ibmvscsi: abort code %d for task tag 0x%lx\n",
rsp_rc,
- tsk_mgmt->managed_task_tag);
+ tsk_mgmt->task_tag);
return FAILED;
}
@@ -987,13 +991,13 @@ static int ibmvscsi_eh_abort_handler(str
spin_unlock_irqrestore(hostdata->host->host_lock, flags);
printk(KERN_INFO
"ibmvscsi: aborted task tag 0x%lx completed\n",
- tsk_mgmt->managed_task_tag);
+ tsk_mgmt->task_tag);
return SUCCESS;
}
printk(KERN_INFO
"ibmvscsi: successfully aborted task tag 0x%lx\n",
- tsk_mgmt->managed_task_tag);
+ tsk_mgmt->task_tag);
cmd->result = (DID_ABORT << 16);
list_del(&found_evt->list);
@@ -1040,9 +1044,9 @@ static int ibmvscsi_eh_device_reset_hand
/* Set up a lun reset SRP command */
memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
- tsk_mgmt->type = SRP_TSK_MGMT_TYPE;
+ tsk_mgmt->opcode = SRP_TSK_MGMT;
tsk_mgmt->lun = ((u64) lun) << 48;
- tsk_mgmt->task_mgmt_flags = 0x08; /* LUN RESET */
+ tsk_mgmt->tsk_mgmt_func = SRP_TSK_LUN_RESET;
printk(KERN_INFO "ibmvscsi: resetting device. lun 0x%lx\n",
tsk_mgmt->lun);
@@ -1059,16 +1063,16 @@ static int ibmvscsi_eh_device_reset_hand
wait_for_completion(&evt->comp);
/* make sure we got a good response */
- if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
+ if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) {
if (printk_ratelimit())
printk(KERN_WARNING
"ibmvscsi: reset bad SRP RSP type %d\n",
- srp_rsp.srp.generic.type);
+ srp_rsp.srp.rsp.opcode);
return FAILED;
}
- if (srp_rsp.srp.rsp.rspvalid)
- rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data);
+ if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID)
+ rsp_rc = *((int *)srp_rsp.srp.rsp.data);
else
rsp_rc = srp_rsp.srp.rsp.status;
@@ -1076,8 +1080,7 @@ static int ibmvscsi_eh_device_reset_hand
if (printk_ratelimit())
printk(KERN_WARNING
"ibmvscsi: reset code %d for task tag 0x%lx\n",
- rsp_rc,
- tsk_mgmt->managed_task_tag);
+ rsp_rc, tsk_mgmt->task_tag);
return FAILED;
}
@@ -1226,7 +1229,7 @@ void ibmvscsi_handle_crq(struct viosrp_c
}
if (crq->format == VIOSRP_SRP_FORMAT)
- atomic_add(evt_struct->xfer_iu->srp.rsp.request_limit_delta,
+ atomic_add(evt_struct->xfer_iu->srp.rsp.req_lim_delta,
&hostdata->request_limit);
if (evt_struct->done)
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.h b/drivers/scsi/ibmvscsi/ibmvscsi.h
index 4550d71..5c6d935 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.h
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.h
@@ -68,7 +68,7 @@ struct srp_event_struct {
void (*cmnd_done) (struct scsi_cmnd *);
struct completion comp;
union viosrp_iu *sync_srp;
- struct memory_descriptor *ext_list;
+ struct srp_direct_buf *ext_list;
dma_addr_t ext_list_token;
};
diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c
index f47dd87..58aa530 100644
--- a/drivers/scsi/ibmvscsi/rpa_vscsi.c
+++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c
@@ -34,7 +34,6 @@
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include "ibmvscsi.h"
-#include "srp.h"
static char partition_name[97] = "UNKNOWN";
static unsigned int partition_number = -1;
diff --git a/drivers/scsi/ibmvscsi/viosrp.h b/drivers/scsi/ibmvscsi/viosrp.h
index 6a6bba8..90f1a61 100644
--- a/drivers/scsi/ibmvscsi/viosrp.h
+++ b/drivers/scsi/ibmvscsi/viosrp.h
@@ -33,7 +33,22 @@
/*****************************************************************************/
#ifndef VIOSRP_H
#define VIOSRP_H
-#include "srp.h"
+#include <scsi/srp.h>
+
+#define SRP_VERSION "16.a"
+#define SRP_MAX_IU_LEN 256
+
+union srp_iu {
+ struct srp_login_req login_req;
+ struct srp_login_rsp login_rsp;
+ struct srp_login_rej login_rej;
+ struct srp_i_logout i_logout;
+ struct srp_t_logout t_logout;
+ struct srp_tsk_mgmt tsk_mgmt;
+ struct srp_cmd cmd;
+ struct srp_rsp rsp;
+ u8 reserved[SRP_MAX_IU_LEN];
+};
enum viosrp_crq_formats {
VIOSRP_SRP_FORMAT = 0x01,
--
1.1.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-03-25 18:57 [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h FUJITA Tomonori
@ 2006-03-25 19:12 ` Roland Dreier
2006-03-26 1:19 ` FUJITA Tomonori
2006-03-26 0:15 ` Anton Blanchard
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Roland Dreier @ 2006-03-25 19:12 UTC (permalink / raw)
To: FUJITA Tomonori; +Cc: boutcher, linux-scsi
Thanks for doing this work.
It seems like you can completely delete drivers/scsi/ibmvscsi/srp.h as
part of this patch, right?
- R.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-03-25 18:57 [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h FUJITA Tomonori
2006-03-25 19:12 ` Roland Dreier
@ 2006-03-26 0:15 ` Anton Blanchard
2006-03-26 6:09 ` FUJITA Tomonori
2006-04-11 2:30 ` Dave C Boutcher
2006-04-14 0:23 ` Dave C Boutcher
3 siblings, 1 reply; 9+ messages in thread
From: Anton Blanchard @ 2006-03-26 0:15 UTC (permalink / raw)
To: FUJITA Tomonori; +Cc: boutcher, rdreier, linux-scsi
Hi,
> Dave, can you take a look at this please?
>
> Seems to work though it has not been tested heavily.
Cool, survives a dbench run here.
Anton
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
> ---
>
> drivers/scsi/ibmvscsi/ibmvscsi.c | 247 +++++++++++++++++++------------------
> drivers/scsi/ibmvscsi/ibmvscsi.h | 2
> drivers/scsi/ibmvscsi/rpa_vscsi.c | 1
> drivers/scsi/ibmvscsi/viosrp.h | 17 ++-
> 4 files changed, 142 insertions(+), 125 deletions(-)
>
> e0b68841ba2fdb63ab587c43258d1b16c64bf9ee
> diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
> index eaefedd..e7bd028 100644
> --- a/drivers/scsi/ibmvscsi/ibmvscsi.c
> +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
> @@ -168,7 +168,7 @@ static void release_event_pool(struct ev
> ++in_use;
> if (pool->events[i].ext_list) {
> dma_free_coherent(hostdata->dev,
> - SG_ALL * sizeof(struct memory_descriptor),
> + SG_ALL * sizeof(struct srp_direct_buf),
> pool->events[i].ext_list,
> pool->events[i].ext_list_token);
> }
> @@ -284,40 +284,37 @@ static void set_srp_direction(struct scs
> struct srp_cmd *srp_cmd,
> int numbuf)
> {
> + u8 fmt;
> +
> if (numbuf == 0)
> return;
>
> - if (numbuf == 1) {
> + if (numbuf == 1)
> + fmt = SRP_DATA_DESC_DIRECT;
> + else {
> + fmt = SRP_DATA_DESC_INDIRECT;
> + numbuf = min(numbuf, MAX_INDIRECT_BUFS);
> +
> if (cmd->sc_data_direction == DMA_TO_DEVICE)
> - srp_cmd->data_out_format = SRP_DIRECT_BUFFER;
> - else
> - srp_cmd->data_in_format = SRP_DIRECT_BUFFER;
> - } else {
> - if (cmd->sc_data_direction == DMA_TO_DEVICE) {
> - srp_cmd->data_out_format = SRP_INDIRECT_BUFFER;
> - srp_cmd->data_out_count =
> - numbuf < MAX_INDIRECT_BUFS ?
> - numbuf: MAX_INDIRECT_BUFS;
> - } else {
> - srp_cmd->data_in_format = SRP_INDIRECT_BUFFER;
> - srp_cmd->data_in_count =
> - numbuf < MAX_INDIRECT_BUFS ?
> - numbuf: MAX_INDIRECT_BUFS;
> - }
> + srp_cmd->data_out_desc_cnt = numbuf;
> + else
> + srp_cmd->data_in_desc_cnt = numbuf;
> }
> +
> + if (cmd->sc_data_direction == DMA_TO_DEVICE)
> + srp_cmd->buf_fmt = fmt << 4;
> + else
> + srp_cmd->buf_fmt = fmt;
> }
>
> -static void unmap_sg_list(int num_entries,
> +static void unmap_sg_list(int num_entries,
> struct device *dev,
> - struct memory_descriptor *md)
> -{
> + struct srp_direct_buf *md)
> +{
> int i;
>
> - for (i = 0; i < num_entries; ++i) {
> - dma_unmap_single(dev,
> - md[i].virtual_address,
> - md[i].length, DMA_BIDIRECTIONAL);
> - }
> + for (i = 0; i < num_entries; ++i)
> + dma_unmap_single(dev, md[i].va, md[i].len, DMA_BIDIRECTIONAL);
> }
>
> /**
> @@ -330,23 +327,26 @@ static void unmap_cmd_data(struct srp_cm
> struct srp_event_struct *evt_struct,
> struct device *dev)
> {
> - if ((cmd->data_out_format == SRP_NO_BUFFER) &&
> - (cmd->data_in_format == SRP_NO_BUFFER))
> + u8 out_fmt, in_fmt;
> +
> + out_fmt = cmd->buf_fmt >> 4;
> + in_fmt = cmd->buf_fmt & ((1U << 4) - 1);
> +
> + if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC)
> return;
> - else if ((cmd->data_out_format == SRP_DIRECT_BUFFER) ||
> - (cmd->data_in_format == SRP_DIRECT_BUFFER)) {
> - struct memory_descriptor *data =
> - (struct memory_descriptor *)cmd->additional_data;
> - dma_unmap_single(dev, data->virtual_address, data->length,
> - DMA_BIDIRECTIONAL);
> + else if (out_fmt == SRP_DATA_DESC_DIRECT ||
> + in_fmt == SRP_DATA_DESC_DIRECT) {
> + struct srp_direct_buf *data =
> + (struct srp_direct_buf *) cmd->add_data;
> + dma_unmap_single(dev, data->va, data->len, DMA_BIDIRECTIONAL);
> } else {
> - struct indirect_descriptor *indirect =
> - (struct indirect_descriptor *)cmd->additional_data;
> - int num_mapped = indirect->head.length /
> - sizeof(indirect->list[0]);
> + struct srp_indirect_buf *indirect =
> + (struct srp_indirect_buf *) cmd->add_data;
> + int num_mapped = indirect->table_desc.len /
> + sizeof(struct srp_direct_buf);
>
> if (num_mapped <= MAX_INDIRECT_BUFS) {
> - unmap_sg_list(num_mapped, dev, &indirect->list[0]);
> + unmap_sg_list(num_mapped, dev, &indirect->desc_list[0]);
> return;
> }
>
> @@ -356,17 +356,17 @@ static void unmap_cmd_data(struct srp_cm
>
> static int map_sg_list(int num_entries,
> struct scatterlist *sg,
> - struct memory_descriptor *md)
> + struct srp_direct_buf *md)
> {
> int i;
> u64 total_length = 0;
>
> for (i = 0; i < num_entries; ++i) {
> - struct memory_descriptor *descr = md + i;
> + struct srp_direct_buf *descr = md + i;
> struct scatterlist *sg_entry = &sg[i];
> - descr->virtual_address = sg_dma_address(sg_entry);
> - descr->length = sg_dma_len(sg_entry);
> - descr->memory_handle = 0;
> + descr->va = sg_dma_address(sg_entry);
> + descr->len = sg_dma_len(sg_entry);
> + descr->key = 0;
> total_length += sg_dma_len(sg_entry);
> }
> return total_length;
> @@ -389,10 +389,10 @@ static int map_sg_data(struct scsi_cmnd
> int sg_mapped;
> u64 total_length = 0;
> struct scatterlist *sg = cmd->request_buffer;
> - struct memory_descriptor *data =
> - (struct memory_descriptor *)srp_cmd->additional_data;
> - struct indirect_descriptor *indirect =
> - (struct indirect_descriptor *)data;
> + struct srp_direct_buf *data =
> + (struct srp_direct_buf *) srp_cmd->add_data;
> + struct srp_indirect_buf *indirect =
> + (struct srp_indirect_buf *) data;
>
> sg_mapped = dma_map_sg(dev, sg, cmd->use_sg, DMA_BIDIRECTIONAL);
>
> @@ -403,9 +403,9 @@ static int map_sg_data(struct scsi_cmnd
>
> /* special case; we can use a single direct descriptor */
> if (sg_mapped == 1) {
> - data->virtual_address = sg_dma_address(&sg[0]);
> - data->length = sg_dma_len(&sg[0]);
> - data->memory_handle = 0;
> + data->va = sg_dma_address(&sg[0]);
> + data->len = sg_dma_len(&sg[0]);
> + data->key = 0;
> return 1;
> }
>
> @@ -416,25 +416,26 @@ static int map_sg_data(struct scsi_cmnd
> return 0;
> }
>
> - indirect->head.virtual_address = 0;
> - indirect->head.length = sg_mapped * sizeof(indirect->list[0]);
> - indirect->head.memory_handle = 0;
> + indirect->table_desc.va = 0;
> + indirect->table_desc.len = sg_mapped * sizeof(struct srp_direct_buf);
> + indirect->table_desc.key = 0;
>
> if (sg_mapped <= MAX_INDIRECT_BUFS) {
> - total_length = map_sg_list(sg_mapped, sg, &indirect->list[0]);
> - indirect->total_length = total_length;
> + total_length = map_sg_list(sg_mapped, sg,
> + &indirect->desc_list[0]);
> + indirect->len = total_length;
> return 1;
> }
>
> /* get indirect table */
> if (!evt_struct->ext_list) {
> - evt_struct->ext_list =(struct memory_descriptor*)
> + evt_struct->ext_list = (struct srp_direct_buf *)
> dma_alloc_coherent(dev,
> - SG_ALL * sizeof(struct memory_descriptor),
> - &evt_struct->ext_list_token, 0);
> + SG_ALL * sizeof(struct srp_direct_buf),
> + &evt_struct->ext_list_token, 0);
> if (!evt_struct->ext_list) {
> - printk(KERN_ERR
> - "ibmvscsi: Can't allocate memory for indirect table\n");
> + printk(KERN_ERR
> + "ibmvscsi: Can't allocate memory for indirect table\n");
> return 0;
>
> }
> @@ -442,11 +443,11 @@ static int map_sg_data(struct scsi_cmnd
>
> total_length = map_sg_list(sg_mapped, sg, evt_struct->ext_list);
>
> - indirect->total_length = total_length;
> - indirect->head.virtual_address = evt_struct->ext_list_token;
> - indirect->head.length = sg_mapped * sizeof(indirect->list[0]);
> - memcpy(indirect->list, evt_struct->ext_list,
> - MAX_INDIRECT_BUFS * sizeof(struct memory_descriptor));
> + indirect->len = total_length;
> + indirect->table_desc.va = evt_struct->ext_list_token;
> + indirect->table_desc.len = sg_mapped * sizeof(indirect->desc_list[0]);
> + memcpy(indirect->desc_list, evt_struct->ext_list,
> + MAX_INDIRECT_BUFS * sizeof(struct srp_direct_buf));
>
> return 1;
> }
> @@ -463,20 +464,20 @@ static int map_sg_data(struct scsi_cmnd
> static int map_single_data(struct scsi_cmnd *cmd,
> struct srp_cmd *srp_cmd, struct device *dev)
> {
> - struct memory_descriptor *data =
> - (struct memory_descriptor *)srp_cmd->additional_data;
> + struct srp_direct_buf *data =
> + (struct srp_direct_buf *) srp_cmd->add_data;
>
> - data->virtual_address =
> + data->va =
> dma_map_single(dev, cmd->request_buffer,
> cmd->request_bufflen,
> DMA_BIDIRECTIONAL);
> - if (dma_mapping_error(data->virtual_address)) {
> + if (dma_mapping_error(data->va)) {
> printk(KERN_ERR
> "ibmvscsi: Unable to map request_buffer for command!\n");
> return 0;
> }
> - data->length = cmd->request_bufflen;
> - data->memory_handle = 0;
> + data->len = cmd->request_bufflen;
> + data->key = 0;
>
> set_srp_direction(cmd, srp_cmd, 1);
>
> @@ -548,7 +549,7 @@ static int ibmvscsi_send_srp_event(struc
>
> /* Copy the IU into the transfer area */
> *evt_struct->xfer_iu = evt_struct->iu;
> - evt_struct->xfer_iu->srp.generic.tag = (u64)evt_struct;
> + evt_struct->xfer_iu->srp.rsp.tag = (u64)evt_struct;
>
> /* Add this to the sent list. We need to do this
> * before we actually send
> @@ -586,27 +587,27 @@ static void handle_cmd_rsp(struct srp_ev
> struct srp_rsp *rsp = &evt_struct->xfer_iu->srp.rsp;
> struct scsi_cmnd *cmnd = evt_struct->cmnd;
>
> - if (unlikely(rsp->type != SRP_RSP_TYPE)) {
> + if (unlikely(rsp->opcode != SRP_RSP)) {
> if (printk_ratelimit())
> printk(KERN_WARNING
> "ibmvscsi: bad SRP RSP type %d\n",
> - rsp->type);
> + rsp->opcode);
> }
>
> if (cmnd) {
> cmnd->result = rsp->status;
> if (((cmnd->result >> 1) & 0x1f) == CHECK_CONDITION)
> memcpy(cmnd->sense_buffer,
> - rsp->sense_and_response_data,
> - rsp->sense_data_list_length);
> + rsp->data,
> + rsp->sense_data_len);
> unmap_cmd_data(&evt_struct->iu.srp.cmd,
> evt_struct,
> evt_struct->hostdata->dev);
>
> - if (rsp->doover)
> - cmnd->resid = rsp->data_out_residual_count;
> - else if (rsp->diover)
> - cmnd->resid = rsp->data_in_residual_count;
> + if (rsp->flags & SRP_RSP_FLAG_DOOVER)
> + cmnd->resid = rsp->data_out_res_cnt;
> + else if (rsp->flags & SRP_RSP_FLAG_DIOVER)
> + cmnd->resid = rsp->data_in_res_cnt;
> }
>
> if (evt_struct->cmnd_done)
> @@ -633,10 +634,11 @@ static int ibmvscsi_queuecommand(struct
> {
> struct srp_cmd *srp_cmd;
> struct srp_event_struct *evt_struct;
> - struct indirect_descriptor *indirect;
> + struct srp_indirect_buf *indirect;
> struct ibmvscsi_host_data *hostdata =
> (struct ibmvscsi_host_data *)&cmnd->device->host->hostdata;
> u16 lun = lun_from_dev(cmnd->device);
> + u8 out_fmt, in_fmt;
>
> evt_struct = get_event_struct(&hostdata->pool);
> if (!evt_struct)
> @@ -644,8 +646,8 @@ static int ibmvscsi_queuecommand(struct
>
> /* Set up the actual SRP IU */
> srp_cmd = &evt_struct->iu.srp.cmd;
> - memset(srp_cmd, 0x00, sizeof(*srp_cmd));
> - srp_cmd->type = SRP_CMD_TYPE;
> + memset(srp_cmd, 0x00, SRP_MAX_IU_LEN);
> + srp_cmd->opcode = SRP_CMD;
> memcpy(srp_cmd->cdb, cmnd->cmnd, sizeof(cmnd->cmnd));
> srp_cmd->lun = ((u64) lun) << 48;
>
> @@ -664,13 +666,15 @@ static int ibmvscsi_queuecommand(struct
> evt_struct->cmnd_done = done;
>
> /* Fix up dma address of the buffer itself */
> - indirect = (struct indirect_descriptor *)srp_cmd->additional_data;
> - if (((srp_cmd->data_out_format == SRP_INDIRECT_BUFFER) ||
> - (srp_cmd->data_in_format == SRP_INDIRECT_BUFFER)) &&
> - (indirect->head.virtual_address == 0)) {
> - indirect->head.virtual_address = evt_struct->crq.IU_data_ptr +
> - offsetof(struct srp_cmd, additional_data) +
> - offsetof(struct indirect_descriptor, list);
> + indirect = (struct srp_indirect_buf *) srp_cmd->add_data;
> + out_fmt = srp_cmd->buf_fmt >> 4;
> + in_fmt = srp_cmd->buf_fmt & ((1U << 4) - 1);
> + if ((in_fmt == SRP_DATA_DESC_INDIRECT ||
> + out_fmt == SRP_DATA_DESC_INDIRECT) &&
> + indirect->table_desc.va == 0) {
> + indirect->table_desc.va = evt_struct->crq.IU_data_ptr +
> + offsetof(struct srp_cmd, add_data) +
> + offsetof(struct srp_indirect_buf, desc_list);
> }
>
> return ibmvscsi_send_srp_event(evt_struct, hostdata);
> @@ -780,10 +784,10 @@ static void send_mad_adapter_info(struct
> static void login_rsp(struct srp_event_struct *evt_struct)
> {
> struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
> - switch (evt_struct->xfer_iu->srp.generic.type) {
> - case SRP_LOGIN_RSP_TYPE: /* it worked! */
> + switch (evt_struct->xfer_iu->srp.login_rsp.opcode) {
> + case SRP_LOGIN_RSP: /* it worked! */
> break;
> - case SRP_LOGIN_REJ_TYPE: /* refused! */
> + case SRP_LOGIN_REJ: /* refused! */
> printk(KERN_INFO "ibmvscsi: SRP_LOGIN_REJ reason %u\n",
> evt_struct->xfer_iu->srp.login_rej.reason);
> /* Login failed. */
> @@ -792,7 +796,7 @@ static void login_rsp(struct srp_event_s
> default:
> printk(KERN_ERR
> "ibmvscsi: Invalid login response typecode 0x%02x!\n",
> - evt_struct->xfer_iu->srp.generic.type);
> + evt_struct->xfer_iu->srp.login_rsp.opcode);
> /* Login failed. */
> atomic_set(&hostdata->request_limit, -1);
> return;
> @@ -800,17 +804,17 @@ static void login_rsp(struct srp_event_s
>
> printk(KERN_INFO "ibmvscsi: SRP_LOGIN succeeded\n");
>
> - if (evt_struct->xfer_iu->srp.login_rsp.request_limit_delta >
> + if (evt_struct->xfer_iu->srp.login_rsp.req_lim_delta >
> (max_requests - 2))
> - evt_struct->xfer_iu->srp.login_rsp.request_limit_delta =
> + evt_struct->xfer_iu->srp.login_rsp.req_lim_delta =
> max_requests - 2;
>
> /* Now we know what the real request-limit is */
> atomic_set(&hostdata->request_limit,
> - evt_struct->xfer_iu->srp.login_rsp.request_limit_delta);
> + evt_struct->xfer_iu->srp.login_rsp.req_lim_delta);
>
> hostdata->host->can_queue =
> - evt_struct->xfer_iu->srp.login_rsp.request_limit_delta - 2;
> + evt_struct->xfer_iu->srp.login_rsp.req_lim_delta - 2;
>
> if (hostdata->host->can_queue < 1) {
> printk(KERN_ERR "ibmvscsi: Invalid request_limit_delta\n");
> @@ -849,9 +853,9 @@ static int send_srp_login(struct ibmvscs
>
> login = &evt_struct->iu.srp.login_req;
> memset(login, 0x00, sizeof(struct srp_login_req));
> - login->type = SRP_LOGIN_REQ_TYPE;
> - login->max_requested_initiator_to_target_iulen = sizeof(union srp_iu);
> - login->required_buffer_formats = 0x0006;
> + login->opcode = SRP_LOGIN_REQ;
> + login->req_it_iu_len = sizeof(union srp_iu);
> + login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT;
>
> /* Start out with a request limit of 1, since this is negotiated in
> * the login request we are just sending
> @@ -928,13 +932,13 @@ static int ibmvscsi_eh_abort_handler(str
>
> /* Set up an abort SRP command */
> memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
> - tsk_mgmt->type = SRP_TSK_MGMT_TYPE;
> + tsk_mgmt->opcode = SRP_TSK_MGMT;
> tsk_mgmt->lun = ((u64) lun) << 48;
> - tsk_mgmt->task_mgmt_flags = 0x01; /* ABORT TASK */
> - tsk_mgmt->managed_task_tag = (u64) found_evt;
> + tsk_mgmt->tsk_mgmt_func = SRP_TSK_ABORT_TASK;
> + tsk_mgmt->task_tag = (u64) found_evt;
>
> printk(KERN_INFO "ibmvscsi: aborting command. lun 0x%lx, tag 0x%lx\n",
> - tsk_mgmt->lun, tsk_mgmt->managed_task_tag);
> + tsk_mgmt->lun, tsk_mgmt->task_tag);
>
> evt->sync_srp = &srp_rsp;
> init_completion(&evt->comp);
> @@ -948,25 +952,25 @@ static int ibmvscsi_eh_abort_handler(str
> wait_for_completion(&evt->comp);
>
> /* make sure we got a good response */
> - if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
> + if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) {
> if (printk_ratelimit())
> printk(KERN_WARNING
> "ibmvscsi: abort bad SRP RSP type %d\n",
> - srp_rsp.srp.generic.type);
> + srp_rsp.srp.rsp.opcode);
> return FAILED;
> }
>
> - if (srp_rsp.srp.rsp.rspvalid)
> - rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data);
> + if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID)
> + rsp_rc = *((int *)srp_rsp.srp.rsp.data);
> else
> rsp_rc = srp_rsp.srp.rsp.status;
>
> if (rsp_rc) {
> if (printk_ratelimit())
> printk(KERN_WARNING
> - "ibmvscsi: abort code %d for task tag 0x%lx\n",
> + "ibmvscsi: abort code %d for task tag 0x%lx\n",
> rsp_rc,
> - tsk_mgmt->managed_task_tag);
> + tsk_mgmt->task_tag);
> return FAILED;
> }
>
> @@ -987,13 +991,13 @@ static int ibmvscsi_eh_abort_handler(str
> spin_unlock_irqrestore(hostdata->host->host_lock, flags);
> printk(KERN_INFO
> "ibmvscsi: aborted task tag 0x%lx completed\n",
> - tsk_mgmt->managed_task_tag);
> + tsk_mgmt->task_tag);
> return SUCCESS;
> }
>
> printk(KERN_INFO
> "ibmvscsi: successfully aborted task tag 0x%lx\n",
> - tsk_mgmt->managed_task_tag);
> + tsk_mgmt->task_tag);
>
> cmd->result = (DID_ABORT << 16);
> list_del(&found_evt->list);
> @@ -1040,9 +1044,9 @@ static int ibmvscsi_eh_device_reset_hand
>
> /* Set up a lun reset SRP command */
> memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
> - tsk_mgmt->type = SRP_TSK_MGMT_TYPE;
> + tsk_mgmt->opcode = SRP_TSK_MGMT;
> tsk_mgmt->lun = ((u64) lun) << 48;
> - tsk_mgmt->task_mgmt_flags = 0x08; /* LUN RESET */
> + tsk_mgmt->tsk_mgmt_func = SRP_TSK_LUN_RESET;
>
> printk(KERN_INFO "ibmvscsi: resetting device. lun 0x%lx\n",
> tsk_mgmt->lun);
> @@ -1059,16 +1063,16 @@ static int ibmvscsi_eh_device_reset_hand
> wait_for_completion(&evt->comp);
>
> /* make sure we got a good response */
> - if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
> + if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) {
> if (printk_ratelimit())
> printk(KERN_WARNING
> "ibmvscsi: reset bad SRP RSP type %d\n",
> - srp_rsp.srp.generic.type);
> + srp_rsp.srp.rsp.opcode);
> return FAILED;
> }
>
> - if (srp_rsp.srp.rsp.rspvalid)
> - rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data);
> + if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID)
> + rsp_rc = *((int *)srp_rsp.srp.rsp.data);
> else
> rsp_rc = srp_rsp.srp.rsp.status;
>
> @@ -1076,8 +1080,7 @@ static int ibmvscsi_eh_device_reset_hand
> if (printk_ratelimit())
> printk(KERN_WARNING
> "ibmvscsi: reset code %d for task tag 0x%lx\n",
> - rsp_rc,
> - tsk_mgmt->managed_task_tag);
> + rsp_rc, tsk_mgmt->task_tag);
> return FAILED;
> }
>
> @@ -1226,7 +1229,7 @@ void ibmvscsi_handle_crq(struct viosrp_c
> }
>
> if (crq->format == VIOSRP_SRP_FORMAT)
> - atomic_add(evt_struct->xfer_iu->srp.rsp.request_limit_delta,
> + atomic_add(evt_struct->xfer_iu->srp.rsp.req_lim_delta,
> &hostdata->request_limit);
>
> if (evt_struct->done)
> diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.h b/drivers/scsi/ibmvscsi/ibmvscsi.h
> index 4550d71..5c6d935 100644
> --- a/drivers/scsi/ibmvscsi/ibmvscsi.h
> +++ b/drivers/scsi/ibmvscsi/ibmvscsi.h
> @@ -68,7 +68,7 @@ struct srp_event_struct {
> void (*cmnd_done) (struct scsi_cmnd *);
> struct completion comp;
> union viosrp_iu *sync_srp;
> - struct memory_descriptor *ext_list;
> + struct srp_direct_buf *ext_list;
> dma_addr_t ext_list_token;
> };
>
> diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c
> index f47dd87..58aa530 100644
> --- a/drivers/scsi/ibmvscsi/rpa_vscsi.c
> +++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c
> @@ -34,7 +34,6 @@
> #include <linux/dma-mapping.h>
> #include <linux/interrupt.h>
> #include "ibmvscsi.h"
> -#include "srp.h"
>
> static char partition_name[97] = "UNKNOWN";
> static unsigned int partition_number = -1;
> diff --git a/drivers/scsi/ibmvscsi/viosrp.h b/drivers/scsi/ibmvscsi/viosrp.h
> index 6a6bba8..90f1a61 100644
> --- a/drivers/scsi/ibmvscsi/viosrp.h
> +++ b/drivers/scsi/ibmvscsi/viosrp.h
> @@ -33,7 +33,22 @@
> /*****************************************************************************/
> #ifndef VIOSRP_H
> #define VIOSRP_H
> -#include "srp.h"
> +#include <scsi/srp.h>
> +
> +#define SRP_VERSION "16.a"
> +#define SRP_MAX_IU_LEN 256
> +
> +union srp_iu {
> + struct srp_login_req login_req;
> + struct srp_login_rsp login_rsp;
> + struct srp_login_rej login_rej;
> + struct srp_i_logout i_logout;
> + struct srp_t_logout t_logout;
> + struct srp_tsk_mgmt tsk_mgmt;
> + struct srp_cmd cmd;
> + struct srp_rsp rsp;
> + u8 reserved[SRP_MAX_IU_LEN];
> +};
>
> enum viosrp_crq_formats {
> VIOSRP_SRP_FORMAT = 0x01,
> --
> 1.1.3
> -
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-03-25 19:12 ` Roland Dreier
@ 2006-03-26 1:19 ` FUJITA Tomonori
2006-04-07 10:10 ` FUJITA Tomonori
0 siblings, 1 reply; 9+ messages in thread
From: FUJITA Tomonori @ 2006-03-26 1:19 UTC (permalink / raw)
To: rdreier; +Cc: boutcher, linux-scsi
From: Roland Dreier <rdreier@cisco.com>
Subject: Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
Date: Sat, 25 Mar 2006 11:12:28 -0800
> Thanks for doing this work.
No problem. I need this for the target mode driver.
> It seems like you can completely delete drivers/scsi/ibmvscsi/srp.h as
> part of this patch, right?
Yes. We can get rid of it.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-03-26 0:15 ` Anton Blanchard
@ 2006-03-26 6:09 ` FUJITA Tomonori
0 siblings, 0 replies; 9+ messages in thread
From: FUJITA Tomonori @ 2006-03-26 6:09 UTC (permalink / raw)
To: anton; +Cc: boutcher, rdreier, linux-scsi
From: Anton Blanchard <anton@samba.org>
Subject: Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
Date: Sun, 26 Mar 2006 11:15:06 +1100
> > Dave, can you take a look at this please?
> >
> > Seems to work though it has not been tested heavily.
>
> Cool, survives a dbench run here.
Nice. Thanks for testing.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-03-26 1:19 ` FUJITA Tomonori
@ 2006-04-07 10:10 ` FUJITA Tomonori
2006-04-14 0:24 ` Dave C Boutcher
0 siblings, 1 reply; 9+ messages in thread
From: FUJITA Tomonori @ 2006-04-07 10:10 UTC (permalink / raw)
To: rdreier, boutcher; +Cc: linux-scsi
From: FUJITA Tomonori <tomof@acm.org>
Subject: Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
Date: Sun, 26 Mar 2006 10:19:10 +0900
> > It seems like you can completely delete drivers/scsi/ibmvscsi/srp.h as
> > part of this patch, right?
>
> Yes. We can get rid of it.
This can go into scsi-misc.
ibmvscsi: remove drivers/scsi/ibmvscsi/srp.h
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---
drivers/scsi/ibmvscsi/srp.h | 227 -------------------------------------------
1 files changed, 0 insertions(+), 227 deletions(-)
delete mode 100644 drivers/scsi/ibmvscsi/srp.h
acbd74e89dc7bcf4e2596800e46a19378db44641
diff --git a/drivers/scsi/ibmvscsi/srp.h b/drivers/scsi/ibmvscsi/srp.h
deleted file mode 100644
index 7d8e4c4..0000000
--- a/drivers/scsi/ibmvscsi/srp.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*****************************************************************************/
-/* srp.h -- SCSI RDMA Protocol definitions */
-/* */
-/* Written By: Colin Devilbis, IBM Corporation */
-/* */
-/* Copyright (C) 2003 IBM Corporation */
-/* */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation; either version 2 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU General Public License */
-/* along with this program; if not, write to the Free Software */
-/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-/* */
-/* */
-/* This file contains structures and definitions for the SCSI RDMA Protocol */
-/* (SRP) as defined in the T10 standard available at www.t10.org. This */
-/* file was based on the 16a version of the standard */
-/* */
-/*****************************************************************************/
-#ifndef SRP_H
-#define SRP_H
-
-#define SRP_VERSION "16.a"
-
-#define PACKED __attribute__((packed))
-
-enum srp_types {
- SRP_LOGIN_REQ_TYPE = 0x00,
- SRP_LOGIN_RSP_TYPE = 0xC0,
- SRP_LOGIN_REJ_TYPE = 0xC2,
- SRP_I_LOGOUT_TYPE = 0x03,
- SRP_T_LOGOUT_TYPE = 0x80,
- SRP_TSK_MGMT_TYPE = 0x01,
- SRP_CMD_TYPE = 0x02,
- SRP_RSP_TYPE = 0xC1,
- SRP_CRED_REQ_TYPE = 0x81,
- SRP_CRED_RSP_TYPE = 0x41,
- SRP_AER_REQ_TYPE = 0x82,
- SRP_AER_RSP_TYPE = 0x42
-};
-
-enum srp_descriptor_formats {
- SRP_NO_BUFFER = 0x00,
- SRP_DIRECT_BUFFER = 0x01,
- SRP_INDIRECT_BUFFER = 0x02
-};
-
-struct memory_descriptor {
- u64 virtual_address;
- u32 memory_handle;
- u32 length;
-};
-
-struct indirect_descriptor {
- struct memory_descriptor head;
- u32 total_length;
- struct memory_descriptor list[1] PACKED;
-};
-
-struct srp_generic {
- u8 type;
- u8 reserved1[7];
- u64 tag;
-};
-
-struct srp_login_req {
- u8 type;
- u8 reserved1[7];
- u64 tag;
- u32 max_requested_initiator_to_target_iulen;
- u32 reserved2;
- u16 required_buffer_formats;
- u8 reserved3:6;
- u8 multi_channel_action:2;
- u8 reserved4;
- u32 reserved5;
- u8 initiator_port_identifier[16];
- u8 target_port_identifier[16];
-};
-
-struct srp_login_rsp {
- u8 type;
- u8 reserved1[3];
- u32 request_limit_delta;
- u64 tag;
- u32 max_initiator_to_target_iulen;
- u32 max_target_to_initiator_iulen;
- u16 supported_buffer_formats;
- u8 reserved2:6;
- u8 multi_channel_result:2;
- u8 reserved3;
- u8 reserved4[24];
-};
-
-struct srp_login_rej {
- u8 type;
- u8 reserved1[3];
- u32 reason;
- u64 tag;
- u64 reserved2;
- u16 supported_buffer_formats;
- u8 reserved3[6];
-};
-
-struct srp_i_logout {
- u8 type;
- u8 reserved1[7];
- u64 tag;
-};
-
-struct srp_t_logout {
- u8 type;
- u8 reserved1[3];
- u32 reason;
- u64 tag;
-};
-
-struct srp_tsk_mgmt {
- u8 type;
- u8 reserved1[7];
- u64 tag;
- u32 reserved2;
- u64 lun PACKED;
- u8 reserved3;
- u8 reserved4;
- u8 task_mgmt_flags;
- u8 reserved5;
- u64 managed_task_tag;
- u64 reserved6;
-};
-
-struct srp_cmd {
- u8 type;
- u32 reserved1 PACKED;
- u8 data_out_format:4;
- u8 data_in_format:4;
- u8 data_out_count;
- u8 data_in_count;
- u64 tag;
- u32 reserved2;
- u64 lun PACKED;
- u8 reserved3;
- u8 reserved4:5;
- u8 task_attribute:3;
- u8 reserved5;
- u8 additional_cdb_len;
- u8 cdb[16];
- u8 additional_data[0x100 - 0x30];
-};
-
-struct srp_rsp {
- u8 type;
- u8 reserved1[3];
- u32 request_limit_delta;
- u64 tag;
- u16 reserved2;
- u8 reserved3:2;
- u8 diunder:1;
- u8 diover:1;
- u8 dounder:1;
- u8 doover:1;
- u8 snsvalid:1;
- u8 rspvalid:1;
- u8 status;
- u32 data_in_residual_count;
- u32 data_out_residual_count;
- u32 sense_data_list_length;
- u32 response_data_list_length;
- u8 sense_and_response_data[18];
-};
-
-struct srp_cred_req {
- u8 type;
- u8 reserved1[3];
- u32 request_limit_delta;
- u64 tag;
-};
-
-struct srp_cred_rsp {
- u8 type;
- u8 reserved1[7];
- u64 tag;
-};
-
-struct srp_aer_req {
- u8 type;
- u8 reserved1[3];
- u32 request_limit_delta;
- u64 tag;
- u32 reserved2;
- u64 lun;
- u32 sense_data_list_length;
- u32 reserved3;
- u8 sense_data[20];
-};
-
-struct srp_aer_rsp {
- u8 type;
- u8 reserved1[7];
- u64 tag;
-};
-
-union srp_iu {
- struct srp_generic generic;
- struct srp_login_req login_req;
- struct srp_login_rsp login_rsp;
- struct srp_login_rej login_rej;
- struct srp_i_logout i_logout;
- struct srp_t_logout t_logout;
- struct srp_tsk_mgmt tsk_mgmt;
- struct srp_cmd cmd;
- struct srp_rsp rsp;
- struct srp_cred_req cred_req;
- struct srp_cred_rsp cred_rsp;
- struct srp_aer_req aer_req;
- struct srp_aer_rsp aer_rsp;
-};
-
-#endif
--
1.1.3
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-03-25 18:57 [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h FUJITA Tomonori
2006-03-25 19:12 ` Roland Dreier
2006-03-26 0:15 ` Anton Blanchard
@ 2006-04-11 2:30 ` Dave C Boutcher
2006-04-14 0:23 ` Dave C Boutcher
3 siblings, 0 replies; 9+ messages in thread
From: Dave C Boutcher @ 2006-04-11 2:30 UTC (permalink / raw)
To: FUJITA Tomonori; +Cc: boutcher, rdreier, linux-scsi
On Sun, 26 Mar 2006 03:57:14 +0900, FUJITA Tomonori <tomof@acm.org> said:
>
> Dave, can you take a look at this please?
> Seems to work though it has not been tested heavily.
>
>
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
I don't want you to think I'm ignoring this...I was out of the country
for a week and now its taking me way longer than it should to set up
an AIX VIO target to test against....tomorrow hopefully.
Thanks a lot for doing this merge.
Dave B
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-03-25 18:57 [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h FUJITA Tomonori
` (2 preceding siblings ...)
2006-04-11 2:30 ` Dave C Boutcher
@ 2006-04-14 0:23 ` Dave C Boutcher
3 siblings, 0 replies; 9+ messages in thread
From: Dave C Boutcher @ 2006-04-14 0:23 UTC (permalink / raw)
To: FUJITA Tomonori; +Cc: boutcher, rdreier, linux-scsi
On Sun, 26 Mar 2006 03:57:14 +0900, FUJITA Tomonori <tomof@acm.org> said:
>
> Dave, can you take a look at this please?
> Seems to work though it has not been tested heavily.
>
>
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
James, I reviewed and tested this exellent merge. Can you queue
it up? I'm guessing I hung onto this past the 2.6.17 window.
Acked-by: Dave Boutcher <sleddog@us.ibm.com>
--
Dave Boutcher
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
2006-04-07 10:10 ` FUJITA Tomonori
@ 2006-04-14 0:24 ` Dave C Boutcher
0 siblings, 0 replies; 9+ messages in thread
From: Dave C Boutcher @ 2006-04-14 0:24 UTC (permalink / raw)
To: FUJITA Tomonori; +Cc: rdreier, boutcher, linux-scsi
On Fri, 07 Apr 2006 19:10:16 +0900, FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> said:
>
> From: FUJITA Tomonori <tomof@acm.org>
> Subject: Re: [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h
> Date: Sun, 26 Mar 2006 10:19:10 +0900
>
>> > It seems like you can completely delete drivers/scsi/ibmvscsi/srp.h as
>> > part of this patch, right?
>>
>> Yes. We can get rid of it.
>
> This can go into scsi-misc.
>
> ibmvscsi: remove drivers/scsi/ibmvscsi/srp.h
>
> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Acked-by: Dave Boutcher <sleddog@us.ibm.com>
Dave Boutcher
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2006-04-14 0:25 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-03-25 18:57 [PATCH] ibmvscsi: convert the ibmvscsi driver to use include/scsi/srp.h FUJITA Tomonori
2006-03-25 19:12 ` Roland Dreier
2006-03-26 1:19 ` FUJITA Tomonori
2006-04-07 10:10 ` FUJITA Tomonori
2006-04-14 0:24 ` Dave C Boutcher
2006-03-26 0:15 ` Anton Blanchard
2006-03-26 6:09 ` FUJITA Tomonori
2006-04-11 2:30 ` Dave C Boutcher
2006-04-14 0:23 ` Dave C Boutcher
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).