[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 12/15] scsi: Implement 'get_sense' callback
From: |
Hannes Reinecke |
Subject: |
[Qemu-devel] [PATCH 12/15] scsi: Implement 'get_sense' callback |
Date: |
Wed, 24 Nov 2010 12:16:07 +0100 |
The get_sense callback copies existing sense information into
the provided buffer. This is required if sense information
should be transferred together with the command response.
Signed-off-by: Hannes Reinecke <address@hidden>
---
hw/scsi-disk.c | 9 +++++++++
hw/scsi-generic.c | 18 ++++++++++++++++++
hw/scsi.h | 1 +
3 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index a4f387d..68b8667 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -373,6 +373,14 @@ static uint8_t *scsi_get_buf(SCSIRequest *req)
return r->iov_buf;
}
+/* Copy sense information into the provided buffer */
+static int scsi_get_sense(SCSIRequest *req, uint8_t *outbuf, int len)
+{
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
+
+ return scsi_build_sense(s->sense, outbuf, len, len > 14);
+}
+
static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
@@ -1218,6 +1226,7 @@ static SCSIDeviceInfo scsi_disk_info = {
.write_data = scsi_write_data,
.cancel_io = scsi_cancel_io,
.get_buf = scsi_get_buf,
+ .get_sense = scsi_get_sense,
.qdev.props = (Property[]) {
DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
DEFINE_PROP_STRING("ver", SCSIDiskState, version),
diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
index d4edc48..949b4cc 100644
--- a/hw/scsi-generic.c
+++ b/hw/scsi-generic.c
@@ -83,6 +83,23 @@ static void scsi_clear_sense(SCSIGenericState *s)
s->driver_status = 0;
}
+static int scsi_get_sense(SCSIRequest *req, uint8_t *outbuf, int len)
+{
+ SCSIGenericState *s = DO_UPCAST(SCSIGenericState, qdev, req->dev);
+ int size = SCSI_SENSE_BUF_SIZE;
+
+ if (!(s->driver_status & SG_ERR_DRIVER_SENSE)) {
+ size = scsi_build_sense(SENSE_CODE(NO_SENSE), s->sensebuf,
+ SCSI_SENSE_BUF_SIZE, 0);
+ }
+ if (size > len) {
+ size = len;
+ }
+ memcpy(outbuf, s->sensebuf, size);
+
+ return size;
+}
+
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun)
{
SCSIRequest *req;
@@ -550,6 +567,7 @@ static SCSIDeviceInfo scsi_generic_info = {
.write_data = scsi_write_data,
.cancel_io = scsi_cancel_io,
.get_buf = scsi_get_buf,
+ .get_sense = scsi_get_sense,
.qdev.props = (Property[]) {
DEFINE_BLOCK_PROPERTIES(SCSIGenericState, qdev.conf),
DEFINE_PROP_END_OF_LIST(),
diff --git a/hw/scsi.h b/hw/scsi.h
index c2d3300..cc96f85 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -78,6 +78,7 @@ struct SCSIDeviceInfo {
int (*write_data)(SCSIRequest *req);
void (*cancel_io)(SCSIRequest *req);
uint8_t *(*get_buf)(SCSIRequest *req);
+ int (*get_sense)(SCSIRequest *req, uint8_t *buf, int len);
};
typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
--
1.6.0.2
- [Qemu-devel] [PATCH 00/15] Megasas HBA emulation and SCSI update v.3, Hannes Reinecke, 2010/11/24
- [Qemu-devel] [PATCH 03/15] scsi: INQUIRY VPD fixes, Hannes Reinecke, 2010/11/24
- [Qemu-devel] [PATCH 07/15] lsi53c895a: Rename 'sense' to 'status', Hannes Reinecke, 2010/11/24
- [Qemu-devel] [PATCH 05/15] scsi-disk: Remove duplicate cdb parsing, Hannes Reinecke, 2010/11/24
- [Qemu-devel] [PATCH 02/15] scsi: Return SAM status codes, Hannes Reinecke, 2010/11/24
- [Qemu-devel] [PATCH 01/15] scsi: Increase the number of possible devices, Hannes Reinecke, 2010/11/24
- [Qemu-devel] [PATCH 08/15] scsi-disk: Allocate iovec dynamically, Hannes Reinecke, 2010/11/24
- [Qemu-devel] [PATCH 12/15] scsi: Implement 'get_sense' callback,
Hannes Reinecke <=
- [Qemu-devel] [PATCH 13/15] scsi: Implement alloc_req_iov callback, Hannes Reinecke, 2010/11/24
[Qemu-devel] [PATCH 04/15] scsi: Move sense handling into the driver, Hannes Reinecke, 2010/11/24
[Qemu-devel] [PATCH 15/15] Make SCSI HBA configurable, Hannes Reinecke, 2010/11/24
[Qemu-devel] [PATCH 10/15] scsi-disk: add data direction checking, Hannes Reinecke, 2010/11/24
[Qemu-devel] [PATCH 09/15] scsi: Use 'SCSIRequest' directly, Hannes Reinecke, 2010/11/24