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@xxxxxxxxxxxxx> > --- > > 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 > - > : send the line "unsubscribe linux-scsi" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html - : send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html