unsigned int evtchn;
unsigned int irq;
+ int feature;
+
struct vscsiif_back_ring ring;
struct vm_struct *ring_area;
grant_handle_t shmem_handle;
#define VSCSIIF_TIMEOUT (900*HZ)
+#define VSCSI_TYPE_HOST 1
irqreturn_t scsiback_intr(int, void *, struct pt_regs *);
int scsiback_init_sring(struct vscsibk_info *info,
scsiback_print_status(sense_buffer, errors, pending_req);
}
- scsiback_rsp_emulation(pending_req);
+ /* The Host mode is through as for Emulation. */
+ if (pending_req->info->feature != VSCSI_TYPE_HOST)
+ scsiback_rsp_emulation(pending_req);
scsiback_fast_flush_area(pending_req);
scsiback_do_resp_with_sense(sense_buffer, errors, resid, pending_req);
}
if (pending_req->act == VSCSIIF_ACT_SCSI_CDB) {
- scsiback_req_emulation_or_cmdexec(pending_req);
+
+ /* The Host mode is through as for Emulation. */
+ if (info->feature == VSCSI_TYPE_HOST)
+ scsiback_cmd_exec(pending_req);
+ else
+ scsiback_req_emulation_or_cmdexec(pending_req);
+
} else if (pending_req->act == VSCSIIF_ACT_SCSI_RESET) {
scsiback_device_reset_exec(pending_req);
} else {
const struct xenbus_device_id *id)
{
int err;
+ unsigned val = 0;
struct backend_info *be = kzalloc(sizeof(struct backend_info),
GFP_KERNEL);
be->info->dev = dev;
be->info->irq = 0;
+ be->info->feature = 0; /*default not HOSTMODE.*/
scsiback_init_translation_table(be->info);
+ err = xenbus_scanf(XBT_NIL, dev->nodename,
+ "feature-host", "%d", &val);
+ if (XENBUS_EXIST_ERR(err))
+ val = 0;
+
+ if (val)
+ be->info->feature = VSCSI_TYPE_HOST;
+
err = xenbus_switch_state(dev, XenbusStateInitWait);
if (err)
goto fail;