scsi: hisi_sas: Drop hisi_sas_hw.get_free_slot
authorJohn Garry <john.garry@huawei.com>
Mon, 5 Aug 2019 13:47:59 +0000 (21:47 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 8 Aug 2019 02:13:14 +0000 (22:13 -0400)
In commit 1273d65f29045 ("scsi: hisi_sas: change queue depth from 512 to
4096"), the depth of each queue is the same as the max IPTT in the system.

As such, as long as we have an IPTT allocated, we will have enough space on
any delivery queue.

All .get_free_slot functions were checking for space on the queue by
reading the DQ read pointer. Drop this, and also raise the code into common
code, as there is nothing hw specific remaining.

Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas.h
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

index 1fa3e53e857d2b3bed09b9a3074850898a4c569e..c1b56b482a233ed221883bac446483091b80c2f6 100644 (file)
@@ -260,7 +260,6 @@ struct hisi_sas_hw {
                                struct domain_device *device);
        struct hisi_sas_device *(*alloc_dev)(struct domain_device *device);
        void (*sl_notify_ssp)(struct hisi_hba *hisi_hba, int phy_no);
-       int (*get_free_slot)(struct hisi_hba *hisi_hba, struct hisi_sas_dq *dq);
        void (*start_delivery)(struct hisi_sas_dq *dq);
        void (*prep_ssp)(struct hisi_hba *hisi_hba,
                        struct hisi_sas_slot *slot);
index 94c7c2b48b17ee40c79ef6d42786a98aa50b9725..54bbab7151c7169d33899d159d463d49a58d6a26 100644 (file)
@@ -519,13 +519,8 @@ static int hisi_sas_task_prep(struct sas_task *task,
        slot = &hisi_hba->slot_info[slot_idx];
 
        spin_lock_irqsave(&dq->lock, flags);
-       wr_q_index = hisi_hba->hw->get_free_slot(hisi_hba, dq);
-       if (wr_q_index < 0) {
-               spin_unlock_irqrestore(&dq->lock, flags);
-               rc = -EAGAIN;
-               goto err_out_tag;
-       }
-
+       wr_q_index = dq->wr_point;
+       dq->wr_point = (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS;
        list_add_tail(&slot->delivery, &dq->list);
        spin_unlock_irqrestore(&dq->lock, flags);
        spin_lock_irqsave(&sas_dev->lock, flags);
@@ -579,8 +574,6 @@ static int hisi_sas_task_prep(struct sas_task *task,
 
        return 0;
 
-err_out_tag:
-       hisi_sas_slot_index_free(hisi_hba, slot_idx);
 err_out_dif_dma_unmap:
        if (!sas_protocol_ata(task->task_proto))
                hisi_sas_dif_dma_unmap(hisi_hba, task, n_elem_dif);
@@ -1963,7 +1956,7 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
        struct asd_sas_port *sas_port = device->port;
        struct hisi_sas_cmd_hdr *cmd_hdr_base;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
-       unsigned long flags, flags_dq = 0;
+       unsigned long flags;
        int wr_q_index;
 
        if (unlikely(test_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags)))
@@ -1982,15 +1975,11 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
        slot_idx = rc;
        slot = &hisi_hba->slot_info[slot_idx];
 
-       spin_lock_irqsave(&dq->lock, flags_dq);
-       wr_q_index = hisi_hba->hw->get_free_slot(hisi_hba, dq);
-       if (wr_q_index < 0) {
-               spin_unlock_irqrestore(&dq->lock, flags_dq);
-               rc = -EAGAIN;
-               goto err_out_tag;
-       }
+       spin_lock_irqsave(&dq->lock, flags);
+       wr_q_index = dq->wr_point;
+       dq->wr_point = (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS;
        list_add_tail(&slot->delivery, &dq->list);
-       spin_unlock_irqrestore(&dq->lock, flags_dq);
+       spin_unlock_irqrestore(&dq->lock, flags);
        spin_lock_irqsave(&sas_dev->lock, flags);
        list_add_tail(&slot->entry, &sas_dev->list);
        spin_unlock_irqrestore(&sas_dev->lock, flags);
@@ -2027,8 +2016,6 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
 
        return 0;
 
-err_out_tag:
-       hisi_sas_slot_index_free(hisi_hba, slot_idx);
 err_out:
        dev_err(dev, "internal abort task prep: failed[%d]!\n", rc);
 
index afdbaccbbc5eebe34849994c680a762f115ce492..b13cbc64d2a9fc69df9296c755b65b8478457595 100644 (file)
@@ -416,13 +416,6 @@ static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
        return readl(regs);
 }
 
-static u32 hisi_sas_read32_relaxed(struct hisi_hba *hisi_hba, u32 off)
-{
-       void __iomem *regs = hisi_hba->regs + off;
-
-       return readl_relaxed(regs);
-}
-
 static void hisi_sas_write32(struct hisi_hba *hisi_hba,
                                    u32 off, u32 val)
 {
@@ -864,30 +857,6 @@ static int get_wideport_bitmap_v1_hw(struct hisi_hba *hisi_hba, int port_id)
        return bitmap;
 }
 
-/*
- * The callpath to this function and upto writing the write
- * queue pointer should be safe from interruption.
- */
-static int
-get_free_slot_v1_hw(struct hisi_hba *hisi_hba, struct hisi_sas_dq *dq)
-{
-       struct device *dev = hisi_hba->dev;
-       int queue = dq->id;
-       u32 r, w;
-
-       w = dq->wr_point;
-       r = hisi_sas_read32_relaxed(hisi_hba,
-                               DLVRY_Q_0_RD_PTR + (queue * 0x14));
-       if (r == (w+1) % HISI_SAS_QUEUE_SLOTS) {
-               dev_warn(dev, "could not find free slot\n");
-               return -EAGAIN;
-       }
-
-       dq->wr_point = (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS;
-
-       return w;
-}
-
 /* DQ lock must be taken here */
 static void start_delivery_v1_hw(struct hisi_sas_dq *dq)
 {
@@ -1818,7 +1787,6 @@ static const struct hisi_sas_hw hisi_sas_v1_hw = {
        .clear_itct = clear_itct_v1_hw,
        .prep_smp = prep_smp_v1_hw,
        .prep_ssp = prep_ssp_v1_hw,
-       .get_free_slot = get_free_slot_v1_hw,
        .start_delivery = start_delivery_v1_hw,
        .slot_complete = slot_complete_v1_hw,
        .phys_init = phys_init_v1_hw,
index fc98bd9e5588ba0cf5cbd6bc25fbb9a61d9c80e5..de33e31cd88a4b9ab2544f3f590ca0953e9fc1e4 100644 (file)
@@ -1637,31 +1637,6 @@ static int get_wideport_bitmap_v2_hw(struct hisi_hba *hisi_hba, int port_id)
        return bitmap;
 }
 
-/*
- * The callpath to this function and upto writing the write
- * queue pointer should be safe from interruption.
- */
-static int
-get_free_slot_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_dq *dq)
-{
-       struct device *dev = hisi_hba->dev;
-       int queue = dq->id;
-       u32 r, w;
-
-       w = dq->wr_point;
-       r = hisi_sas_read32_relaxed(hisi_hba,
-                               DLVRY_Q_0_RD_PTR + (queue * 0x14));
-       if (r == (w+1) % HISI_SAS_QUEUE_SLOTS) {
-               dev_warn(dev, "full queue=%d r=%d w=%d\n",
-                               queue, r, w);
-               return -EAGAIN;
-       }
-
-       dq->wr_point = (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS;
-
-       return w;
-}
-
 /* DQ lock must be taken here */
 static void start_delivery_v2_hw(struct hisi_sas_dq *dq)
 {
@@ -3606,7 +3581,6 @@ static const struct hisi_sas_hw hisi_sas_v2_hw = {
        .prep_ssp = prep_ssp_v2_hw,
        .prep_stp = prep_ata_v2_hw,
        .prep_abort = prep_abort_v2_hw,
-       .get_free_slot = get_free_slot_v2_hw,
        .start_delivery = start_delivery_v2_hw,
        .slot_complete = slot_complete_v2_hw,
        .phys_init = phys_init_v2_hw,
index 0171cdb4da81c89fb2a6baf9de3581087c341a49..b99abc788487c40d7aecfa2979a5d353bcdbacb0 100644 (file)
@@ -499,13 +499,6 @@ static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
        return readl(regs);
 }
 
-static u32 hisi_sas_read32_relaxed(struct hisi_hba *hisi_hba, u32 off)
-{
-       void __iomem *regs = hisi_hba->regs + off;
-
-       return readl_relaxed(regs);
-}
-
 static void hisi_sas_write32(struct hisi_hba *hisi_hba, u32 off, u32 val)
 {
        void __iomem *regs = hisi_hba->regs + off;
@@ -1006,31 +999,6 @@ static int get_wideport_bitmap_v3_hw(struct hisi_hba *hisi_hba, int port_id)
        return bitmap;
 }
 
-/**
- * The callpath to this function and upto writing the write
- * queue pointer should be safe from interruption.
- */
-static int
-get_free_slot_v3_hw(struct hisi_hba *hisi_hba, struct hisi_sas_dq *dq)
-{
-       struct device *dev = hisi_hba->dev;
-       int queue = dq->id;
-       u32 r, w;
-
-       w = dq->wr_point;
-       r = hisi_sas_read32_relaxed(hisi_hba,
-                               DLVRY_Q_0_RD_PTR + (queue * 0x14));
-       if (r == (w+1) % HISI_SAS_QUEUE_SLOTS) {
-               dev_warn(dev, "full queue=%d r=%d w=%d\n",
-                        queue, r, w);
-               return -EAGAIN;
-       }
-
-       dq->wr_point = (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS;
-
-       return w;
-}
-
 static void start_delivery_v3_hw(struct hisi_sas_dq *dq)
 {
        struct hisi_hba *hisi_hba = dq->hisi_hba;
@@ -2943,7 +2911,6 @@ static const struct hisi_sas_hw hisi_sas_v3_hw = {
        .prep_smp = prep_smp_v3_hw,
        .prep_stp = prep_ata_v3_hw,
        .prep_abort = prep_abort_v3_hw,
-       .get_free_slot = get_free_slot_v3_hw,
        .start_delivery = start_delivery_v3_hw,
        .slot_complete = slot_complete_v3_hw,
        .phys_init = phys_init_v3_hw,