scsi: be2iscsi: Set WRB invalid bit for SkyHawk
authorJitendra Bhivare <jitendra.bhivare@broadcom.com>
Tue, 13 Dec 2016 10:25:57 +0000 (15:55 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 5 Jan 2017 05:21:13 +0000 (00:21 -0500)
invalid bit in WRB indicates to FW that IO was invalidated before WRB
was fetched from host memory.

For SkyHawk, this invalid bit in WRB is at a different offset.
Use amap_iscsi_wrb_v2 to mark invalid bit for SkyHawk.

Signed-off-by: Jitendra Bhivare <jitendra.bhivare@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/be2iscsi/be_main.c
drivers/scsi/be2iscsi/be_main.h

index 260842a1f14ee56e251800d5a6d1c915c186584b..b509acd33772b96a797853b18a1b9b7186d3faf7 100644 (file)
@@ -244,8 +244,13 @@ static int beiscsi_eh_abort(struct scsi_cmnd *sc)
        beiscsi_conn = conn->dd_data;
        phba = beiscsi_conn->phba;
        /* mark WRB invalid which have been not processed by FW yet */
-       AMAP_SET_BITS(struct amap_iscsi_wrb, invld,
-                     abrt_io_task->pwrb_handle->pwrb, 1);
+       if (is_chip_be2_be3r(phba)) {
+               AMAP_SET_BITS(struct amap_iscsi_wrb, invld,
+                             abrt_io_task->pwrb_handle->pwrb, 1);
+       } else {
+               AMAP_SET_BITS(struct amap_iscsi_wrb_v2, invld,
+                             abrt_io_task->pwrb_handle->pwrb, 1);
+       }
        inv_tbl.cid = beiscsi_conn->beiscsi_conn_cid;
        inv_tbl.icd = abrt_io_task->psgl_handle->sgl_index;
        spin_unlock_bh(&session->back_lock);
@@ -321,9 +326,13 @@ static int beiscsi_eh_device_reset(struct scsi_cmnd *sc)
                __iscsi_get_task(task);
                io_task = task->dd_data;
                /* mark WRB invalid which have been not processed by FW yet */
-               AMAP_SET_BITS(struct amap_iscsi_wrb, invld,
-                             io_task->pwrb_handle->pwrb,
-                             1);
+               if (is_chip_be2_be3r(phba)) {
+                       AMAP_SET_BITS(struct amap_iscsi_wrb, invld,
+                                     io_task->pwrb_handle->pwrb, 1);
+               } else {
+                       AMAP_SET_BITS(struct amap_iscsi_wrb_v2, invld,
+                                     io_task->pwrb_handle->pwrb, 1);
+               }
 
                inv_tbl->tbl[nents].cid = beiscsi_conn->beiscsi_conn_cid;
                inv_tbl->tbl[nents].icd = io_task->psgl_handle->sgl_index;
index f869e3734c02b3be415fb7a67fafd94202c2e17f..8ba8c12159227f62fb93e1a8e12708f0d09d6b90 100644 (file)
@@ -840,7 +840,7 @@ struct amap_iscsi_wrb_v2 {
        u8 diff_enbl;   /* DWORD 11 */
        u8 u_run;       /* DWORD 11 */
        u8 o_run;       /* DWORD 11 */
-       u8 invalid;     /* DWORD 11 */
+       u8 invld;     /* DWORD 11 */
        u8 dsp;         /* DWORD 11 */
        u8 dmsg;        /* DWORD 11 */
        u8 rsvd4;       /* DWORD 11 */