]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
scsi: hisi_sas: change ncq process for v3 hw
authorXiang Chen <chenxiang66@hisilicon.com>
Fri, 8 Dec 2017 17:16:39 +0000 (01:16 +0800)
committerSeth Forshee <seth.forshee@canonical.com>
Fri, 16 Mar 2018 15:42:58 +0000 (10:42 -0500)
BugLink: http://bugs.launchpad.net/bugs/1756094
For v3 hw, each NCQ will return a CQ, so it is no need to acquire IPTT from
ITCT, just acquire it from IPTT field of CQ.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
(cherry picked from commit 9f347b2face51d782d1e03f2f05b7c3f93a6dc9a)
Signed-off-by: Manoj Iyer <manoj.iyer@canonical.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

index 44f07bc37177e4db2c02b4cf5be5946fd78722be..69aa7bc1578324d96fb67807b8ffd2168cf1d033 100644 (file)
@@ -1653,9 +1653,8 @@ static void cq_tasklet_v3_hw(unsigned long val)
        struct hisi_sas_cq *cq = (struct hisi_sas_cq *)val;
        struct hisi_hba *hisi_hba = cq->hisi_hba;
        struct hisi_sas_slot *slot;
-       struct hisi_sas_itct *itct;
        struct hisi_sas_complete_v3_hdr *complete_queue;
-       u32 rd_point = cq->rd_point, wr_point, dev_id;
+       u32 rd_point = cq->rd_point, wr_point;
        int queue = cq->id;
        struct hisi_sas_dq *dq = &hisi_hba->dq[queue];
 
@@ -1671,38 +1670,11 @@ static void cq_tasklet_v3_hw(unsigned long val)
 
                complete_hdr = &complete_queue[rd_point];
 
-               /* Check for NCQ completion */
-               if (complete_hdr->act) {
-                       u32 act_tmp = complete_hdr->act;
-                       int ncq_tag_count = ffs(act_tmp);
-
-                       dev_id = (complete_hdr->dw1 & CMPLT_HDR_DEV_ID_MSK) >>
-                                CMPLT_HDR_DEV_ID_OFF;
-                       itct = &hisi_hba->itct[dev_id];
-
-                       /* The NCQ tags are held in the itct header */
-                       while (ncq_tag_count) {
-                               __le64 *ncq_tag = &itct->qw4_15[0];
-
-                               ncq_tag_count -= 1;
-                               iptt = (ncq_tag[ncq_tag_count / 5]
-                                       >> (ncq_tag_count % 5) * 12) & 0xfff;
-
-                               slot = &hisi_hba->slot_info[iptt];
-                               slot->cmplt_queue_slot = rd_point;
-                               slot->cmplt_queue = queue;
-                               slot_complete_v3_hw(hisi_hba, slot);
-
-                               act_tmp &= ~(1 << ncq_tag_count);
-                               ncq_tag_count = ffs(act_tmp);
-                       }
-               } else {
-                       iptt = (complete_hdr->dw1) & CMPLT_HDR_IPTT_MSK;
-                       slot = &hisi_hba->slot_info[iptt];
-                       slot->cmplt_queue_slot = rd_point;
-                       slot->cmplt_queue = queue;
-                       slot_complete_v3_hw(hisi_hba, slot);
-               }
+               iptt = (complete_hdr->dw1) & CMPLT_HDR_IPTT_MSK;
+               slot = &hisi_hba->slot_info[iptt];
+               slot->cmplt_queue_slot = rd_point;
+               slot->cmplt_queue = queue;
+               slot_complete_v3_hw(hisi_hba, slot);
 
                if (++rd_point >= HISI_SAS_QUEUE_SLOTS)
                        rd_point = 0;