Commit 897cc769 authored by John Garry's avatar John Garry Committed by Martin K. Petersen

scsi: hisi_sas: Drop hisi_sas_hw.get_free_slot

In commit 1273d65f ("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: default avatarJohn Garry <john.garry@huawei.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 93352abc
...@@ -260,7 +260,6 @@ struct hisi_sas_hw { ...@@ -260,7 +260,6 @@ struct hisi_sas_hw {
struct domain_device *device); struct domain_device *device);
struct hisi_sas_device *(*alloc_dev)(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); 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 (*start_delivery)(struct hisi_sas_dq *dq);
void (*prep_ssp)(struct hisi_hba *hisi_hba, void (*prep_ssp)(struct hisi_hba *hisi_hba,
struct hisi_sas_slot *slot); struct hisi_sas_slot *slot);
......
...@@ -519,13 +519,8 @@ static int hisi_sas_task_prep(struct sas_task *task, ...@@ -519,13 +519,8 @@ static int hisi_sas_task_prep(struct sas_task *task,
slot = &hisi_hba->slot_info[slot_idx]; slot = &hisi_hba->slot_info[slot_idx];
spin_lock_irqsave(&dq->lock, flags); spin_lock_irqsave(&dq->lock, flags);
wr_q_index = hisi_hba->hw->get_free_slot(hisi_hba, dq); wr_q_index = dq->wr_point;
if (wr_q_index < 0) { dq->wr_point = (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS;
spin_unlock_irqrestore(&dq->lock, flags);
rc = -EAGAIN;
goto err_out_tag;
}
list_add_tail(&slot->delivery, &dq->list); list_add_tail(&slot->delivery, &dq->list);
spin_unlock_irqrestore(&dq->lock, flags); spin_unlock_irqrestore(&dq->lock, flags);
spin_lock_irqsave(&sas_dev->lock, flags); spin_lock_irqsave(&sas_dev->lock, flags);
...@@ -579,8 +574,6 @@ static int hisi_sas_task_prep(struct sas_task *task, ...@@ -579,8 +574,6 @@ static int hisi_sas_task_prep(struct sas_task *task,
return 0; return 0;
err_out_tag:
hisi_sas_slot_index_free(hisi_hba, slot_idx);
err_out_dif_dma_unmap: err_out_dif_dma_unmap:
if (!sas_protocol_ata(task->task_proto)) if (!sas_protocol_ata(task->task_proto))
hisi_sas_dif_dma_unmap(hisi_hba, task, n_elem_dif); 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, ...@@ -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 asd_sas_port *sas_port = device->port;
struct hisi_sas_cmd_hdr *cmd_hdr_base; struct hisi_sas_cmd_hdr *cmd_hdr_base;
int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx; 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; int wr_q_index;
if (unlikely(test_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags))) 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, ...@@ -1982,15 +1975,11 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
slot_idx = rc; slot_idx = rc;
slot = &hisi_hba->slot_info[slot_idx]; slot = &hisi_hba->slot_info[slot_idx];
spin_lock_irqsave(&dq->lock, flags_dq); spin_lock_irqsave(&dq->lock, flags);
wr_q_index = hisi_hba->hw->get_free_slot(hisi_hba, dq); wr_q_index = dq->wr_point;
if (wr_q_index < 0) { dq->wr_point = (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS;
spin_unlock_irqrestore(&dq->lock, flags_dq);
rc = -EAGAIN;
goto err_out_tag;
}
list_add_tail(&slot->delivery, &dq->list); 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); spin_lock_irqsave(&sas_dev->lock, flags);
list_add_tail(&slot->entry, &sas_dev->list); list_add_tail(&slot->entry, &sas_dev->list);
spin_unlock_irqrestore(&sas_dev->lock, flags); 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, ...@@ -2027,8 +2016,6 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
return 0; return 0;
err_out_tag:
hisi_sas_slot_index_free(hisi_hba, slot_idx);
err_out: err_out:
dev_err(dev, "internal abort task prep: failed[%d]!\n", rc); dev_err(dev, "internal abort task prep: failed[%d]!\n", rc);
......
...@@ -416,13 +416,6 @@ static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off) ...@@ -416,13 +416,6 @@ static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
return readl(regs); 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, static void hisi_sas_write32(struct hisi_hba *hisi_hba,
u32 off, u32 val) u32 off, u32 val)
{ {
...@@ -864,30 +857,6 @@ static int get_wideport_bitmap_v1_hw(struct hisi_hba *hisi_hba, int port_id) ...@@ -864,30 +857,6 @@ static int get_wideport_bitmap_v1_hw(struct hisi_hba *hisi_hba, int port_id)
return bitmap; 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 */ /* DQ lock must be taken here */
static void start_delivery_v1_hw(struct hisi_sas_dq *dq) 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 = { ...@@ -1818,7 +1787,6 @@ static const struct hisi_sas_hw hisi_sas_v1_hw = {
.clear_itct = clear_itct_v1_hw, .clear_itct = clear_itct_v1_hw,
.prep_smp = prep_smp_v1_hw, .prep_smp = prep_smp_v1_hw,
.prep_ssp = prep_ssp_v1_hw, .prep_ssp = prep_ssp_v1_hw,
.get_free_slot = get_free_slot_v1_hw,
.start_delivery = start_delivery_v1_hw, .start_delivery = start_delivery_v1_hw,
.slot_complete = slot_complete_v1_hw, .slot_complete = slot_complete_v1_hw,
.phys_init = phys_init_v1_hw, .phys_init = phys_init_v1_hw,
......
...@@ -1637,31 +1637,6 @@ static int get_wideport_bitmap_v2_hw(struct hisi_hba *hisi_hba, int port_id) ...@@ -1637,31 +1637,6 @@ static int get_wideport_bitmap_v2_hw(struct hisi_hba *hisi_hba, int port_id)
return bitmap; 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 */ /* DQ lock must be taken here */
static void start_delivery_v2_hw(struct hisi_sas_dq *dq) 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 = { ...@@ -3606,7 +3581,6 @@ static const struct hisi_sas_hw hisi_sas_v2_hw = {
.prep_ssp = prep_ssp_v2_hw, .prep_ssp = prep_ssp_v2_hw,
.prep_stp = prep_ata_v2_hw, .prep_stp = prep_ata_v2_hw,
.prep_abort = prep_abort_v2_hw, .prep_abort = prep_abort_v2_hw,
.get_free_slot = get_free_slot_v2_hw,
.start_delivery = start_delivery_v2_hw, .start_delivery = start_delivery_v2_hw,
.slot_complete = slot_complete_v2_hw, .slot_complete = slot_complete_v2_hw,
.phys_init = phys_init_v2_hw, .phys_init = phys_init_v2_hw,
......
...@@ -499,13 +499,6 @@ static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off) ...@@ -499,13 +499,6 @@ static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
return readl(regs); 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) static void hisi_sas_write32(struct hisi_hba *hisi_hba, u32 off, u32 val)
{ {
void __iomem *regs = hisi_hba->regs + off; 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) ...@@ -1006,31 +999,6 @@ static int get_wideport_bitmap_v3_hw(struct hisi_hba *hisi_hba, int port_id)
return bitmap; 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) static void start_delivery_v3_hw(struct hisi_sas_dq *dq)
{ {
struct hisi_hba *hisi_hba = dq->hisi_hba; struct hisi_hba *hisi_hba = dq->hisi_hba;
...@@ -2943,7 +2911,6 @@ static const struct hisi_sas_hw hisi_sas_v3_hw = { ...@@ -2943,7 +2911,6 @@ static const struct hisi_sas_hw hisi_sas_v3_hw = {
.prep_smp = prep_smp_v3_hw, .prep_smp = prep_smp_v3_hw,
.prep_stp = prep_ata_v3_hw, .prep_stp = prep_ata_v3_hw,
.prep_abort = prep_abort_v3_hw, .prep_abort = prep_abort_v3_hw,
.get_free_slot = get_free_slot_v3_hw,
.start_delivery = start_delivery_v3_hw, .start_delivery = start_delivery_v3_hw,
.slot_complete = slot_complete_v3_hw, .slot_complete = slot_complete_v3_hw,
.phys_init = phys_init_v3_hw, .phys_init = phys_init_v3_hw,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment