lsi: Properly initialize controller state on reset

Submitted by Jan Kiszka on April 29, 2010, 4:54 p.m.

Details

Message ID 4BD9B9C4.5000702@siemens.com
State New
Headers show

Commit Message

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(-)

Comments

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 hide | download patch | download mbox

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,