OSDN Git Service

scsi: lpfc: Fix driver not setting dpp bits correctly in doorbell word
authorJames Smart <jsmart2021@gmail.com>
Tue, 26 Jun 2018 15:24:23 +0000 (08:24 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 11 Jul 2018 02:15:08 +0000 (22:15 -0400)
Driver is incorrectly formatting a register on new hardware, using a format
for an older chip. This can result in non-deterministic behavior.

Ensure driver is not setting "workqueue index" in the WQ doorbell when
making a non-dpp doorbell write. The field must be zero when non-dpp.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_sli.c

index e6786a5..89ebb07 100644 (file)
@@ -145,6 +145,7 @@ lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe128 *wqe)
        uint32_t idx;
        uint32_t i = 0;
        uint8_t *tmp;
+       u32 if_type;
 
        /* sanity check on queue memory */
        if (unlikely(!q))
@@ -199,8 +200,14 @@ lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe128 *wqe)
                            q->queue_id);
                } else {
                        bf_set(lpfc_wq_db_list_fm_num_posted, &doorbell, 1);
-                       bf_set(lpfc_wq_db_list_fm_index, &doorbell, host_index);
                        bf_set(lpfc_wq_db_list_fm_id, &doorbell, q->queue_id);
+
+                       /* Leave bits <23:16> clear for if_type 6 dpp */
+                       if_type = bf_get(lpfc_sli_intf_if_type,
+                                        &q->phba->sli4_hba.sli_intf);
+                       if (if_type != LPFC_SLI_INTF_IF_TYPE_6)
+                               bf_set(lpfc_wq_db_list_fm_index, &doorbell,
+                                      host_index);
                }
        } else if (q->db_format == LPFC_DB_RING_FORMAT) {
                bf_set(lpfc_wq_db_ring_fm_num_posted, &doorbell, 1);