scsi: pm80xx: Reset PI and CI memory during re-initialization
authorViswas G <Viswas.G@microchip.com>
Thu, 15 Apr 2021 10:33:51 +0000 (16:03 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 16 Apr 2021 02:29:00 +0000 (22:29 -0400)
Producer index(PI) outbound queue and consumer index(CI) for Outbound queue
are in DMA memory. During resume(), the stale PI and CI Values will lead to
unexpected behavior. These values should be reset to 0 during driver
reinitialization.

Link: https://lore.kernel.org/r/20210415103352.3580-8-Viswas.G@microchip.com
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/pm8001/pm8001_hwi.c
drivers/scsi/pm8001/pm80xx_hwi.c

index 8ed505051657d97c7dae558f0561cbf4f91bd747..ecd06d2d7e81624553b67f4da111d7603dca6341 100644 (file)
@@ -240,6 +240,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
                        pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
                pm8001_ha->inbnd_q_tbl[i].ci_virt               =
                        pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr;
+               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0);
                offsetib = i * 0x20;
                pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
                        get_pci_bar_index(pm8001_mr32(addressib,
@@ -268,6 +269,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
                        0 | (10 << 16) | (i << 24);
                pm8001_ha->outbnd_q_tbl[i].pi_virt              =
                        pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr;
+               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0);
                offsetob = i * 0x24;
                pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
                        get_pci_bar_index(pm8001_mr32(addressob,
index 1c8dcdd5642c4741128169a2dedfeb767d3e1679..771490223f8746114c8fb0c3bc1188a885347b60 100644 (file)
@@ -787,6 +787,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
                        pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
                pm8001_ha->inbnd_q_tbl[i].ci_virt               =
                        pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr;
+               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0);
                offsetib = i * 0x20;
                pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
                        get_pci_bar_index(pm8001_mr32(addressib,
@@ -820,6 +821,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
                pm8001_ha->outbnd_q_tbl[i].interrup_vec_cnt_delay = (i << 24);
                pm8001_ha->outbnd_q_tbl[i].pi_virt              =
                        pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr;
+               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0);
                offsetob = i * 0x24;
                pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
                        get_pci_bar_index(pm8001_mr32(addressob,