[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 06/21] lsi: extract lsi_find_by_tag
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v2 06/21] lsi: extract lsi_find_by_tag |
Date: |
Mon, 16 May 2011 14:16:22 +0200 |
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/lsi53c895a.c | 63 +++++++++++++++++++++++++++++++++---------------------
1 files changed, 38 insertions(+), 25 deletions(-)
diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
index ccea6ad..3b67155 100644
--- a/hw/lsi53c895a.c
+++ b/hw/lsi53c895a.c
@@ -652,38 +652,51 @@ static void lsi_reselect(LSIState *s, lsi_request *p)
}
}
-/* Record that data is available for a queued command. Returns zero if
- the device was reselected, nonzero if the IO is deferred. */
-static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg)
+static lsi_request *lsi_find_by_tag(LSIState *s, uint32_t tag)
{
lsi_request *p;
QTAILQ_FOREACH(p, &s->queue, next) {
if (p->tag == tag) {
- if (p->pending) {
- BADF("Multiple IO pending for tag %d\n", tag);
- }
- p->pending = arg;
- /* Reselect if waiting for it, or if reselection triggers an IRQ
- and the bus is free.
- Since no interrupt stacking is implemented in the emulation, it
- is also required that there are no pending interrupts waiting
- for service from the device driver. */
- if (s->waiting == 1 ||
- (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON) &&
- !(s->istat0 & (LSI_ISTAT0_SIP | LSI_ISTAT0_DIP)))) {
- /* Reselect device. */
- lsi_reselect(s, p);
- return 0;
- } else {
- DPRINTF("Queueing IO tag=0x%x\n", tag);
- p->pending = arg;
- return 1;
- }
+ return p;
}
}
- BADF("IO with unknown tag %d\n", tag);
- return 1;
+
+ return NULL;
+}
+
+/* Record that data is available for a queued command. Returns zero if
+ the device was reselected, nonzero if the IO is deferred. */
+static int lsi_queue_tag(LSIState *s, uint32_t tag, uint32_t arg)
+{
+ lsi_request *p;
+
+ p = lsi_find_by_tag(s, tag);
+ if (!p) {
+ BADF("IO with unknown tag %d\n", tag);
+ return 1;
+ }
+
+ if (p->pending) {
+ BADF("Multiple IO pending for tag %d\n", tag);
+ }
+ p->pending = arg;
+ /* Reselect if waiting for it, or if reselection triggers an IRQ
+ and the bus is free.
+ Since no interrupt stacking is implemented in the emulation, it
+ is also required that there are no pending interrupts waiting
+ for service from the device driver. */
+ if (s->waiting == 1 ||
+ (lsi_irq_on_rsl(s) && !(s->scntl1 & LSI_SCNTL1_CON) &&
+ !(s->istat0 & (LSI_ISTAT0_SIP | LSI_ISTAT0_DIP)))) {
+ /* Reselect device. */
+ lsi_reselect(s, p);
+ return 0;
+ } else {
+ DPRINTF("Queueing IO tag=0x%x\n", tag);
+ p->pending = arg;
+ return 1;
+ }
}
/* Callback to indicate that the SCSI layer has completed a transfer. */
--
1.7.4.4
- [Qemu-devel] [PATCH v2 00/21] SCSI subsystem improvements, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 01/21] scsi: add tracing of scsi requests, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 02/21] scsi-generic: Remove bogus double complete, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 03/21] scsi: introduce scsi_req_data, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 04/21] scsi: introduce SCSIBusOps, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 05/21] scsi: reference-count requests, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 06/21] lsi: extract lsi_find_by_tag,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v2 07/21] scsi: Use 'SCSIRequest' directly, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 09/21] scsi: introduce scsi_req_abort, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 08/21] scsi: commonize purging requests, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 10/21] scsi: introduce scsi_req_cancel, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 11/21] scsi: use scsi_req_complete, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 12/21] scsi: Update sense code handling, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 13/21] scsi: do not call send_command directly, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 14/21] scsi: introduce scsi_req_new, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 16/21] scsi: introduce scsi_req_get_buf, Paolo Bonzini, 2011/05/16
- [Qemu-devel] [PATCH v2 15/21] scsi: introduce scsi_req_kick, Paolo Bonzini, 2011/05/16