scsi: lpfc: Rework sli4 doorbell infrastructure
authorJames Smart <jsmart2021@gmail.com>
Thu, 22 Feb 2018 16:18:41 +0000 (08:18 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 23 Feb 2018 01:39:28 +0000 (20:39 -0500)
Up until now, all SLI-4 devices had the same doorbells at the same
bar locations. With newer hardware, there are now independent EQ and
CQ doorbells and the bar locations differ.

Prepare the code for new hardware by separating the eq/cq doorbell into
separate components. The components can be set based on if_type.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_debugfs.c
drivers/scsi/lpfc/lpfc_debugfs.h
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/lpfc/lpfc_sli4.h

index 17ea3bb04266bdf098e0f615a48410df90452a00..308303d501cf29141e2ee6e1b7367c06629a3ad2 100644 (file)
@@ -3944,10 +3944,15 @@ lpfc_idiag_drbacc_read_reg(struct lpfc_hba *phba, char *pbuffer,
                return 0;
 
        switch (drbregid) {
-       case LPFC_DRB_EQCQ:
-               len += snprintf(pbuffer+len, LPFC_DRB_ACC_BUF_SIZE-len,
-                               "EQCQ-DRB-REG: 0x%08x\n",
-                               readl(phba->sli4_hba.EQCQDBregaddr));
+       case LPFC_DRB_EQ:
+               len += snprintf(pbuffer + len, LPFC_DRB_ACC_BUF_SIZE-len,
+                               "EQ-DRB-REG: 0x%08x\n",
+                               readl(phba->sli4_hba.EQDBregaddr));
+               break;
+       case LPFC_DRB_CQ:
+               len += snprintf(pbuffer + len, LPFC_DRB_ACC_BUF_SIZE - len,
+                               "CQ-DRB-REG: 0x%08x\n",
+                               readl(phba->sli4_hba.CQDBregaddr));
                break;
        case LPFC_DRB_MQ:
                len += snprintf(pbuffer+len, LPFC_DRB_ACC_BUF_SIZE-len,
@@ -4086,8 +4091,11 @@ lpfc_idiag_drbacc_write(struct file *file, const char __user *buf,
            idiag.cmd.opcode == LPFC_IDIAG_CMD_DRBACC_ST ||
            idiag.cmd.opcode == LPFC_IDIAG_CMD_DRBACC_CL) {
                switch (drb_reg_id) {
-               case LPFC_DRB_EQCQ:
-                       drb_reg = phba->sli4_hba.EQCQDBregaddr;
+               case LPFC_DRB_EQ:
+                       drb_reg = phba->sli4_hba.EQDBregaddr;
+                       break;
+               case LPFC_DRB_CQ:
+                       drb_reg = phba->sli4_hba.CQDBregaddr;
                        break;
                case LPFC_DRB_MQ:
                        drb_reg = phba->sli4_hba.MQDBregaddr;
index c4edd87bfc658e5e4d2511031c87044b44f22d59..12fbf498a7ce673fa51b2e6475df10b8b1fdf264 100644 (file)
 #define LPFC_DRB_ACC_WR_CMD_ARG 2
 #define LPFC_DRB_ACC_BUF_SIZE 256
 
-#define LPFC_DRB_EQCQ 1
-#define LPFC_DRB_MQ   2
-#define LPFC_DRB_WQ   3
-#define LPFC_DRB_RQ   4
+#define LPFC_DRB_EQ   1
+#define LPFC_DRB_CQ   2
+#define LPFC_DRB_MQ   3
+#define LPFC_DRB_WQ   4
+#define LPFC_DRB_RQ   5
 
-#define LPFC_DRB_MAX  4
+#define LPFC_DRB_MAX  5
 
 #define IDIAG_DRBACC_REGID_INDX 0
 #define IDIAG_DRBACC_VALUE_INDX 1
index e24dca2b3f2fb06786c51f6d54c2c5556cd020f9..b2cf8eb99008aefa13b20de6e367cdfd7cdb2d6a 100644 (file)
@@ -7430,8 +7430,9 @@ lpfc_sli4_bar0_register_memmap(struct lpfc_hba *phba, uint32_t if_type)
                phba->sli4_hba.WQDBregaddr =
                        phba->sli4_hba.conf_regs_memmap_p +
                                                LPFC_ULP0_WQ_DOORBELL;
-               phba->sli4_hba.EQCQDBregaddr =
+               phba->sli4_hba.CQDBregaddr =
                        phba->sli4_hba.conf_regs_memmap_p + LPFC_EQCQ_DOORBELL;
+               phba->sli4_hba.EQDBregaddr = phba->sli4_hba.CQDBregaddr;
                phba->sli4_hba.MQDBregaddr =
                        phba->sli4_hba.conf_regs_memmap_p + LPFC_MQ_DOORBELL;
                phba->sli4_hba.BMBXregaddr =
@@ -7488,8 +7489,10 @@ lpfc_sli4_bar2_register_memmap(struct lpfc_hba *phba, uint32_t vf)
        phba->sli4_hba.WQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p +
                                vf * LPFC_VFR_PAGE_SIZE +
                                        LPFC_ULP0_WQ_DOORBELL);
-       phba->sli4_hba.EQCQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p +
-                               vf * LPFC_VFR_PAGE_SIZE + LPFC_EQCQ_DOORBELL);
+       phba->sli4_hba.CQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p +
+                               vf * LPFC_VFR_PAGE_SIZE +
+                                       LPFC_EQCQ_DOORBELL);
+       phba->sli4_hba.EQDBregaddr = phba->sli4_hba.CQDBregaddr;
        phba->sli4_hba.MQDBregaddr = (phba->sli4_hba.drbl_regs_memmap_p +
                                vf * LPFC_VFR_PAGE_SIZE + LPFC_MQ_DOORBELL);
        phba->sli4_hba.BMBXregaddr = (phba->sli4_hba.drbl_regs_memmap_p +
index f91caae6489a280595dcbe80fcdd0ab284a46aea..f4db7d4864315dd24f203002af55ea7d225e1620 100644 (file)
@@ -310,7 +310,7 @@ lpfc_sli4_eq_clr_intr(struct lpfc_queue *q)
        bf_set(lpfc_eqcq_doorbell_eqid_hi, &doorbell,
                (q->queue_id >> LPFC_EQID_HI_FIELD_SHIFT));
        bf_set(lpfc_eqcq_doorbell_eqid_lo, &doorbell, q->queue_id);
-       writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
+       writel(doorbell.word0, q->phba->sli4_hba.EQDBregaddr);
 }
 
 /**
@@ -360,10 +360,10 @@ lpfc_sli4_eq_release(struct lpfc_queue *q, bool arm)
        bf_set(lpfc_eqcq_doorbell_eqid_hi, &doorbell,
                        (q->queue_id >> LPFC_EQID_HI_FIELD_SHIFT));
        bf_set(lpfc_eqcq_doorbell_eqid_lo, &doorbell, q->queue_id);
-       writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
+       writel(doorbell.word0, q->phba->sli4_hba.EQDBregaddr);
        /* PCI read to flush PCI pipeline on re-arming for INTx mode */
        if ((q->phba->intr_type == INTx) && (arm == LPFC_QUEUE_REARM))
-               readl(q->phba->sli4_hba.EQCQDBregaddr);
+               readl(q->phba->sli4_hba.EQDBregaddr);
        return released;
 }
 
@@ -453,7 +453,7 @@ lpfc_sli4_cq_release(struct lpfc_queue *q, bool arm)
        bf_set(lpfc_eqcq_doorbell_cqid_hi, &doorbell,
                        (q->queue_id >> LPFC_CQID_HI_FIELD_SHIFT));
        bf_set(lpfc_eqcq_doorbell_cqid_lo, &doorbell, q->queue_id);
-       writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
+       writel(doorbell.word0, q->phba->sli4_hba.CQDBregaddr);
        return released;
 }
 
index 0c0cbe296fed6b01238c77fc02c789f3c023f141..e2f06c92c4dd9eff256520ea7152b5ae64d7fe9a 100644 (file)
@@ -569,7 +569,8 @@ struct lpfc_sli4_hba {
        /* IF type 0, BAR 0 and if type 2, BAR 0 doorbell register memory map */
        void __iomem *RQDBregaddr;      /* RQ_DOORBELL register */
        void __iomem *WQDBregaddr;      /* WQ_DOORBELL register */
-       void __iomem *EQCQDBregaddr;    /* EQCQ_DOORBELL register */
+       void __iomem *CQDBregaddr;      /* CQ_DOORBELL register */
+       void __iomem *EQDBregaddr;      /* EQ_DOORBELL register */
        void __iomem *MQDBregaddr;      /* MQ_DOORBELL register */
        void __iomem *BMBXregaddr;      /* BootStrap MBX register */