diff --git a/ibmvstgt/src/Makefile b/ibmvstgt/src/Makefile index 1bb205398..a202c43c7 100644 --- a/ibmvstgt/src/Makefile +++ b/ibmvstgt/src/Makefile @@ -1,6 +1,6 @@ -IBMVSTGT_INC_DIR := $(SUBDIRS)/../../scst/include/ +IBMVSTGT_INC_DIR := $(SUBDIRS)/../../scst/include -EXTRA_CFLAGS += -I$(IBMVSTGT_INC_DIR) +EXTRA_CFLAGS += -I$(IBMVSTGT_INC_DIR) #EXTRA_CFLAGS += -DCONFIG_SCST_TRACING #EXTRA_CFLAGS += -DCONFIG_SCST_DEBUG #EXTRA_CFLAGS += -g -fno-inline -fno-inline-functions @@ -8,5 +8,5 @@ EXTRA_CFLAGS += -I$(IBMVSTGT_INC_DIR) #EXTRA_CFLAGS += -Wextra -Wno-unused-parameter obj-m := ibmvstgt.o -ibmvstgt-y += libsrp.o +ibmvstgt-y += libsrpnew.o ibmvstgt-y += ibmvstgt.o diff --git a/ibmvstgt/src/ibmvstgt.c b/ibmvstgt/src/ibmvstgt.c index a3585c1e4..e1995e7f7 100644 --- a/ibmvstgt/src/ibmvstgt.c +++ b/ibmvstgt/src/ibmvstgt.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include "scst.h" #include #include #ifdef __powerpc__ @@ -198,7 +198,7 @@ static int send_rsp(struct iu_entry *iue, struct scsi_cmnd *sc, static void handle_cmd_queue(struct srp_target *target) { - struct Scsi_Host *shost = target->shost; + struct scst_session *sess = target->sess; struct srp_rport *rport = target_to_port(target)->rport; struct iu_entry *iue; struct srp_cmd *cmd; @@ -212,8 +212,8 @@ retry: if (!test_and_set_bit(V_FLYING, &iue->flags)) { spin_unlock_irqrestore(&target->lock, flags); cmd = iue->sbuf->buf; - err = srp_cmd_queue(shost, cmd, iue, - (unsigned long)rport, 0); + err = srp_cmd_queue(sess, cmd, iue, + (unsigned long)rport); if (err) { eprintk("cannot queue cmd %p %d\n", cmd, err); srp_iu_put(iue); @@ -323,7 +323,7 @@ int send_adapter_info(struct iu_entry *iue, { struct srp_target *target = iue->target; struct vio_port *vport = target_to_port(target); - struct Scsi_Host *shost = target->shost; + struct scst_session *sess = target->sess; dma_addr_t data_token; struct mad_adapter_info_data *info; int err; @@ -351,7 +351,7 @@ int send_adapter_info(struct iu_entry *iue, info->partition_number = partition_number; info->mad_version = 1; info->os_type = 2; - info->port_max_txu[0] = shost->hostt->max_sectors << 9; + info->port_max_txu[0] = sess->hostt->max_sectors << 9; /* Send our info to remote */ err = h_copy_rdma(sizeof(*info), vport->liobn, data_token, @@ -372,8 +372,8 @@ static void process_login(struct iu_entry *iue) union viosrp_iu *iu = vio_iu(iue); struct srp_login_rsp *rsp = &iu->srp.login_rsp; uint64_t tag = iu->srp.rsp.tag; - struct Scsi_Host *shost = iue->target->shost; - struct srp_target *target = host_to_srp_target(shost); + struct scst_session *sess = iue->target->sess; + struct srp_target *target = host_to_srp_target(sess); struct vio_port *vport = target_to_port(target); struct srp_rport_identifiers ids; @@ -381,7 +381,7 @@ static void process_login(struct iu_entry *iue) sprintf(ids.port_id, "%x", vport->dma_dev->unit_address); ids.roles = SRP_RPORT_ROLE_INITIATOR; if (!vport->rport) - vport->rport = srp_rport_add(shost, &ids); + vport->rport = srp_rport_add(sess, &ids); /* TODO handle case that requested size is wrong and * buffer format is wrong @@ -411,6 +411,7 @@ static inline void queue_cmd(struct iu_entry *iue) static int process_tsk_mgmt(struct iu_entry *iue) { union viosrp_iu *iu = vio_iu(iue); + struct scst_session *sess = iue->target->sess; int fn; dprintk("%p %u\n", iue, iu->srp.tsk_mgmt.tsk_mgmt_func); @@ -435,8 +436,8 @@ static int process_tsk_mgmt(struct iu_entry *iue) fn = 0; } if (fn) - scsi_tgt_tsk_mgmt_request(iue->target->shost, - (unsigned long)iue->target->shost, + scsi_tgt_tsk_mgmt_request(sess, + (unsigned long)sess, fn, iu->srp.tsk_mgmt.task_tag, (struct scsi_lun *) &iu->srp.tsk_mgmt.lun, @@ -746,7 +747,7 @@ static int ibmvstgt_eh_abort_handler(struct scsi_cmnd *sc) return 0; } -static int ibmvstgt_tsk_mgmt_response(struct Scsi_Host *shost, +static int ibmvstgt_tsk_mgmt_response(struct scst_session *sess, u64 itn_id, u64 mid, int result) { struct iu_entry *iue = (struct iu_entry *) ((void *) mid); @@ -773,14 +774,14 @@ static int ibmvstgt_tsk_mgmt_response(struct Scsi_Host *shost, return 0; } -static int ibmvstgt_it_nexus_response(struct Scsi_Host *shost, u64 itn_id, +static int ibmvstgt_it_nexus_response(struct scst_session *sess, u64 itn_id, int result) { - struct srp_target *target = host_to_srp_target(shost); + struct srp_target *target = host_to_srp_target(sess); struct vio_port *vport = target_to_port(target); if (result) { - eprintk("%p %d\n", shost, result); + eprintk("%p %d\n", sess, result); srp_rport_del(vport->rport); vport->rport = NULL; } @@ -802,8 +803,8 @@ static ssize_t partition_number_show(struct device *dev, static ssize_t unit_address_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct Scsi_Host *shost = class_to_shost(dev); - struct srp_target *target = host_to_srp_target(shost); + struct scst_session *sess = class_to_shost(dev); + struct srp_target *target = host_to_srp_target(sess); struct vio_port *vport = target_to_port(target); return snprintf(buf, PAGE_SIZE, "%x\n", vport->dma_dev->unit_address); } @@ -835,7 +836,7 @@ static struct scsi_host_template ibmvstgt_sht = { static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) { - struct Scsi_Host *shost; + struct scst_session *sess; struct srp_target *target; struct vio_port *vport; unsigned int *dma, dma_size; @@ -844,13 +845,13 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) vport = kzalloc(sizeof(struct vio_port), GFP_KERNEL); if (!vport) return err; - shost = scsi_host_alloc(&ibmvstgt_sht, sizeof(struct srp_target)); - if (!shost) + sess = scsi_host_alloc(&ibmvstgt_sht, sizeof(struct srp_target)); + if (!sess) goto free_vport; - shost->transportt = ibmvstgt_transport_template; + sess->transportt = ibmvstgt_transport_template; - target = host_to_srp_target(shost); - target->shost = shost; + target = host_to_srp_target(sess); + target->sess = sess; vport->dma_dev = dev; target->ldata = vport; vport->target = target; @@ -871,13 +872,15 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) INIT_WORK(&vport->crq_work, handle_crq); - err = scsi_add_host(shost, target->dev); + err = scsi_add_host(sess, target->dev); if (err) goto free_srp_target; - err = scsi_tgt_alloc_queue(shost); +#if 0 + err = scsi_tgt_alloc_queue(sess); if (err) goto remove_host; +#endif err = crq_queue_create(&vport->crq_queue, target); if (err) @@ -885,13 +888,15 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) return 0; free_queue: - scsi_tgt_free_queue(shost); +#if 0 + scsi_tgt_free_queue(sess); remove_host: - scsi_remove_host(shost); +#endif + scsi_remove_host(sess); free_srp_target: srp_target_free(target); put_host: - scsi_host_put(shost); + scsi_host_put(sess); free_vport: kfree(vport); return err; @@ -900,16 +905,18 @@ free_vport: static int ibmvstgt_remove(struct vio_dev *dev) { struct srp_target *target = dev_get_drvdata(&dev->dev); - struct Scsi_Host *shost = target->shost; + struct scst_session *sess = target->sess; struct vio_port *vport = target->ldata; crq_queue_destroy(target); - srp_remove_host(shost); - scsi_remove_host(shost); - scsi_tgt_free_queue(shost); + srp_remove_host(sess); + scsi_remove_host(sess); +#if 0 + scsi_tgt_free_queue(sess); +#endif srp_target_free(target); kfree(vport); - scsi_host_put(shost); + scsi_host_put(sess); return 0; } diff --git a/ibmvstgt/src/libsrpnew.c b/ibmvstgt/src/libsrpnew.c index ff6a28ce9..ec58a5fb6 100644 --- a/ibmvstgt/src/libsrpnew.c +++ b/ibmvstgt/src/libsrpnew.c @@ -28,7 +28,8 @@ #include #include #include -#include +#include "libsrpnew.h" +#include "scst.h" enum srp_task_attributes { SRP_SIMPLE_TASK = 0, @@ -395,26 +396,29 @@ static int vscsis_data_length(struct srp_cmd *cmd, enum dma_data_direction dir) return len; } -int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info, - u64 itn_id, u64 addr) +int srp_cmd_queue(struct scst_session *sess, struct srp_cmd *cmd, void *info, + u64 itn_id) { enum dma_data_direction dir; - struct scsi_cmnd *sc; - int tag, len, err; + struct scst_cmd *sc; + int tag, len; switch (cmd->task_attr) { case SRP_SIMPLE_TASK: - tag = MSG_SIMPLE_TAG; + tag = SCST_CMD_QUEUE_SIMPLE; break; case SRP_ORDERED_TASK: - tag = MSG_ORDERED_TAG; + tag = SCST_CMD_QUEUE_ORDERED; break; case SRP_HEAD_TASK: - tag = MSG_HEAD_TAG; + tag = SCST_CMD_QUEUE_HEAD_OF_QUEUE; + break; + case SRP_ACA_TASK: + tag = SCST_CMD_QUEUE_ACA; break; default: eprintk("Task attribute %d not supported\n", cmd->task_attr); - tag = MSG_ORDERED_TAG; + tag = SCST_CMD_QUEUE_ORDERED; } dir = srp_cmd_direction(cmd); @@ -423,21 +427,19 @@ int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info, dprintk("%p %x %lx %d %d %d %llx\n", info, cmd->cdb[0], cmd->lun, dir, len, tag, (unsigned long long) cmd->tag); - sc = scsi_host_get_command(shost, dir, GFP_KERNEL); + sc = scst_rx_cmd(sess, (u8 *) &cmd->lun, sizeof(cmd->lun), + cmd->cdb, 16, SCST_CONTEXT_THREAD); if (!sc) return -ENOMEM; - sc->SCp.ptr = info; - memcpy(sc->cmnd, cmd->cdb, MAX_COMMAND_SIZE); - sc->sdb.length = len; - sc->sdb.table.sgl = (void *) (unsigned long) addr; - sc->tag = tag; - err = scsi_tgt_queue_command(sc, itn_id, (struct scsi_lun *)&cmd->lun, - cmd->tag); - if (err) - scsi_host_put_command(shost, sc); + scst_cmd_set_queue_type(sc, tag); + scst_cmd_set_expected(sc, dir == DMA_TO_DEVICE + ? SCST_DATA_WRITE : SCST_DATA_READ, len); + scst_cmd_set_tgt_priv(sc, info); + scst_cmd_set_tag(sc, itn_id); + scst_cmd_init_done(sc, SCST_CONTEXT_THREAD); - return err; + return 0; } EXPORT_SYMBOL_GPL(srp_cmd_queue); diff --git a/ibmvstgt/src/libsrpnew.h b/ibmvstgt/src/libsrpnew.h index f4105c91a..2ce0d2444 100644 --- a/ibmvstgt/src/libsrpnew.h +++ b/ibmvstgt/src/libsrpnew.h @@ -14,6 +14,8 @@ enum iue_flags { V_FLYING, }; +struct scst_session; + struct srp_buf { dma_addr_t dma; void *buf; @@ -27,7 +29,7 @@ struct srp_queue { }; struct srp_target { - struct Scsi_Host *shost; + struct scst_session *sess; struct device *dev; spinlock_t lock; @@ -60,7 +62,7 @@ extern void srp_target_free(struct srp_target *); extern struct iu_entry *srp_iu_get(struct srp_target *); extern void srp_iu_put(struct iu_entry *); -extern int srp_cmd_queue(struct Scsi_Host *, struct srp_cmd *, void *, u64, u64); +extern int srp_cmd_queue(struct scst_session *, struct srp_cmd *, void *, u64); extern int srp_transfer_data(struct scsi_cmnd *, struct srp_cmd *, srp_rdma_t, int, int);