Patchwork lsi: Properly initialize controller state on reset

login
register
mail settings
Submitter Jan Kiszka
Date April 29, 2010, 4:54 p.m.
Message ID <4BD9B9C4.5000702@siemens.com>
Download mbox | patch
Permalink /patch/51302/
State New
Headers show

Comments

Jan Kiszka - April 29, 2010, 4:54 p.m.
The LSI controller was lacking any system reset handler. This is an
attempt to fix it.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/lsi53c895a.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
Jan Kiszka - April 30, 2010, 10:57 a.m.
Jan Kiszka wrote:
> The LSI controller was lacking any system reset handler. This is an
> attempt to fix it.
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>  hw/lsi53c895a.c |   11 +++++++++++
>  1 files changed, 11 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
> index 98b7f54..f328057 100644
> --- a/hw/lsi53c895a.c
> +++ b/hw/lsi53c895a.c
> @@ -1996,6 +1996,16 @@ static void lsi_mmio_mapfunc(PCIDevice *pci_dev, int region_num,
>      cpu_register_physical_memory(addr + 0, 0x400, s->mmio_io_addr);
>  }
>  
> +static void lsi_scsi_reset(DeviceState *dev)
> +{
> +    LSIState *s = DO_UPCAST(LSIState, dev.qdev, dev);
> +
> +    s->dma_buf = NULL;
> +    s->current_dma_len = 0;
> +    s->active_commands = 0;

OK, this 0.12 patch obviously no longer applies. And purging the command
queue should not only be done on hard reset, but also when software
triggered it (ie. move it to lsi_soft_reset). Reworking...

Jan

> +    lsi_soft_reset(s);
> +}
> +
>  static void lsi_pre_save(void *opaque)
>  {
>      LSIState *s = opaque;
> @@ -2149,6 +2159,7 @@ static PCIDeviceInfo lsi_info = {
>      .qdev.name  = "lsi53c895a",
>      .qdev.alias = "lsi",
>      .qdev.size  = sizeof(LSIState),
> +    .qdev.reset = lsi_scsi_reset,
>      .qdev.vmsd  = &vmstate_lsi_scsi,
>      .init       = lsi_scsi_init,
>      .exit       = lsi_scsi_uninit,
> 
> 
>

Patch

diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
index 98b7f54..f328057 100644
--- a/hw/lsi53c895a.c
+++ b/hw/lsi53c895a.c
@@ -1996,6 +1996,16 @@  static void lsi_mmio_mapfunc(PCIDevice *pci_dev, int region_num,
     cpu_register_physical_memory(addr + 0, 0x400, s->mmio_io_addr);
 }
 
+static void lsi_scsi_reset(DeviceState *dev)
+{
+    LSIState *s = DO_UPCAST(LSIState, dev.qdev, dev);
+
+    s->dma_buf = NULL;
+    s->current_dma_len = 0;
+    s->active_commands = 0;
+    lsi_soft_reset(s);
+}
+
 static void lsi_pre_save(void *opaque)
 {
     LSIState *s = opaque;
@@ -2149,6 +2159,7 @@  static PCIDeviceInfo lsi_info = {
     .qdev.name  = "lsi53c895a",
     .qdev.alias = "lsi",
     .qdev.size  = sizeof(LSIState),
+    .qdev.reset = lsi_scsi_reset,
     .qdev.vmsd  = &vmstate_lsi_scsi,
     .init       = lsi_scsi_init,
     .exit       = lsi_scsi_uninit,