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);
 
        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);
 
        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);
        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)))
        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);
 
        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);
 
 
        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)
 {
        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)
 {
        .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,
 
        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)
 {
        .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,
 
        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;
        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;
        .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,