]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/scsi/hisi_sas/hisi_sas_main.c
scsi: hisi_sas: add pci_dev in hisi_hba struct
[mirror_ubuntu-bionic-kernel.git] / drivers / scsi / hisi_sas / hisi_sas_main.c
index d622db502ec98b4b2d2599d2fad9d5c05641ac4b..139df4509a4172030963bc8bf9f89dc943381c43 100644 (file)
@@ -23,6 +23,95 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
                             int abort_flag, int tag);
 static int hisi_sas_softreset_ata_disk(struct domain_device *device);
 
+u8 hisi_sas_get_ata_protocol(u8 cmd, int direction)
+{
+       switch (cmd) {
+       case ATA_CMD_FPDMA_WRITE:
+       case ATA_CMD_FPDMA_READ:
+       case ATA_CMD_FPDMA_RECV:
+       case ATA_CMD_FPDMA_SEND:
+       case ATA_CMD_NCQ_NON_DATA:
+       return HISI_SAS_SATA_PROTOCOL_FPDMA;
+
+       case ATA_CMD_DOWNLOAD_MICRO:
+       case ATA_CMD_ID_ATA:
+       case ATA_CMD_PMP_READ:
+       case ATA_CMD_READ_LOG_EXT:
+       case ATA_CMD_PIO_READ:
+       case ATA_CMD_PIO_READ_EXT:
+       case ATA_CMD_PMP_WRITE:
+       case ATA_CMD_WRITE_LOG_EXT:
+       case ATA_CMD_PIO_WRITE:
+       case ATA_CMD_PIO_WRITE_EXT:
+       return HISI_SAS_SATA_PROTOCOL_PIO;
+
+       case ATA_CMD_DSM:
+       case ATA_CMD_DOWNLOAD_MICRO_DMA:
+       case ATA_CMD_PMP_READ_DMA:
+       case ATA_CMD_PMP_WRITE_DMA:
+       case ATA_CMD_READ:
+       case ATA_CMD_READ_EXT:
+       case ATA_CMD_READ_LOG_DMA_EXT:
+       case ATA_CMD_READ_STREAM_DMA_EXT:
+       case ATA_CMD_TRUSTED_RCV_DMA:
+       case ATA_CMD_TRUSTED_SND_DMA:
+       case ATA_CMD_WRITE:
+       case ATA_CMD_WRITE_EXT:
+       case ATA_CMD_WRITE_FUA_EXT:
+       case ATA_CMD_WRITE_QUEUED:
+       case ATA_CMD_WRITE_LOG_DMA_EXT:
+       case ATA_CMD_WRITE_STREAM_DMA_EXT:
+       return HISI_SAS_SATA_PROTOCOL_DMA;
+
+       case ATA_CMD_CHK_POWER:
+       case ATA_CMD_DEV_RESET:
+       case ATA_CMD_EDD:
+       case ATA_CMD_FLUSH:
+       case ATA_CMD_FLUSH_EXT:
+       case ATA_CMD_VERIFY:
+       case ATA_CMD_VERIFY_EXT:
+       case ATA_CMD_SET_FEATURES:
+       case ATA_CMD_STANDBY:
+       case ATA_CMD_STANDBYNOW1:
+       return HISI_SAS_SATA_PROTOCOL_NONDATA;
+       default:
+               if (direction == DMA_NONE)
+                       return HISI_SAS_SATA_PROTOCOL_NONDATA;
+               return HISI_SAS_SATA_PROTOCOL_PIO;
+       }
+}
+EXPORT_SYMBOL_GPL(hisi_sas_get_ata_protocol);
+
+void hisi_sas_sata_done(struct sas_task *task,
+                           struct hisi_sas_slot *slot)
+{
+       struct task_status_struct *ts = &task->task_status;
+       struct ata_task_resp *resp = (struct ata_task_resp *)ts->buf;
+       struct dev_to_host_fis *d2h = slot->status_buffer +
+                                     sizeof(struct hisi_sas_err_record);
+
+       resp->frame_len = sizeof(struct dev_to_host_fis);
+       memcpy(&resp->ending_fis[0], d2h, sizeof(struct dev_to_host_fis));
+
+       ts->buf_valid_size = sizeof(*resp);
+}
+EXPORT_SYMBOL_GPL(hisi_sas_sata_done);
+
+int hisi_sas_get_ncq_tag(struct sas_task *task, u32 *tag)
+{
+       struct ata_queued_cmd *qc = task->uldd_task;
+
+       if (qc) {
+               if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
+                       qc->tf.command == ATA_CMD_FPDMA_READ) {
+                       *tag = qc->tag;
+                       return 1;
+               }
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(hisi_sas_get_ncq_tag);
+
 static struct hisi_hba *dev_to_hisi_hba(struct domain_device *device)
 {
        return device->port->ha->lldd_ha;
@@ -79,7 +168,7 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
 {
 
        if (task) {
-               struct device *dev = &hisi_hba->pdev->dev;
+               struct device *dev = hisi_hba->dev;
                struct domain_device *device = task->dev;
                struct hisi_sas_device *sas_dev = device->lldd_dev;
 
@@ -156,7 +245,7 @@ static void hisi_sas_slot_abort(struct work_struct *work)
        struct scsi_cmnd *cmnd = task->uldd_task;
        struct hisi_sas_tmf_task tmf_task;
        struct scsi_lun lun;
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        int tag = abort_slot->idx;
        unsigned long flags;
 
@@ -179,17 +268,18 @@ out:
                task->task_done(task);
 }
 
-static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
-                             int is_tmf, struct hisi_sas_tmf_task *tmf,
-                             int *pass)
+static int hisi_sas_task_prep(struct sas_task *task, struct hisi_sas_dq
+               *dq, int is_tmf, struct hisi_sas_tmf_task *tmf,
+               int *pass)
 {
+       struct hisi_hba *hisi_hba = dq->hisi_hba;
        struct domain_device *device = task->dev;
        struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct hisi_sas_port *port;
        struct hisi_sas_slot *slot;
        struct hisi_sas_cmd_hdr *cmd_hdr_base;
        struct asd_sas_port *sas_port = device->port;
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
        unsigned long flags;
 
@@ -209,7 +299,7 @@ static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
 
        if (DEV_IS_GONE(sas_dev)) {
                if (sas_dev)
-                       dev_info(dev, "task prep: device %llu not ready\n",
+                       dev_info(dev, "task prep: device %d not ready\n",
                                 sas_dev->device_id);
                else
                        dev_info(dev, "task prep: device %016llx not ready\n",
@@ -240,18 +330,24 @@ static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
        } else
                n_elem = task->num_scatter;
 
+       spin_lock_irqsave(&hisi_hba->lock, flags);
        if (hisi_hba->hw->slot_index_alloc)
                rc = hisi_hba->hw->slot_index_alloc(hisi_hba, &slot_idx,
                                                    device);
        else
                rc = hisi_sas_slot_index_alloc(hisi_hba, &slot_idx);
-       if (rc)
+       if (rc) {
+               spin_unlock_irqrestore(&hisi_hba->lock, flags);
                goto err_out;
-       rc = hisi_hba->hw->get_free_slot(hisi_hba, sas_dev->device_id,
-                                       &dlvry_queue, &dlvry_queue_slot);
+       }
+       spin_unlock_irqrestore(&hisi_hba->lock, flags);
+
+       rc = hisi_hba->hw->get_free_slot(hisi_hba, dq);
        if (rc)
                goto err_out_tag;
 
+       dlvry_queue = dq->id;
+       dlvry_queue_slot = dq->wr_point;
        slot = &hisi_hba->slot_info[slot_idx];
        memset(slot, 0, sizeof(struct hisi_sas_slot));
 
@@ -316,7 +412,7 @@ static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
        task->task_state_flags |= SAS_TASK_AT_INITIATOR;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
-       hisi_hba->slot_prep = slot;
+       dq->slot_prep = slot;
 
        atomic64_inc(&sas_dev->running_req);
        ++(*pass);
@@ -335,7 +431,9 @@ err_out_status_buf:
 err_out_slot_buf:
        /* Nothing to be done */
 err_out_tag:
+       spin_lock_irqsave(&hisi_hba->lock, flags);
        hisi_sas_slot_index_free(hisi_hba, slot_idx);
+       spin_unlock_irqrestore(&hisi_hba->lock, flags);
 err_out:
        dev_err(dev, "task prep: failed[%d]!\n", rc);
        if (!sas_protocol_ata(task->task_proto))
@@ -353,20 +451,23 @@ static int hisi_sas_task_exec(struct sas_task *task, gfp_t gfp_flags,
        u32 pass = 0;
        unsigned long flags;
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(task->dev);
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
+       struct domain_device *device = task->dev;
+       struct hisi_sas_device *sas_dev = device->lldd_dev;
+       struct hisi_sas_dq *dq = sas_dev->dq;
 
        if (unlikely(test_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags)))
                return -EINVAL;
 
        /* protect task_prep and start_delivery sequence */
-       spin_lock_irqsave(&hisi_hba->lock, flags);
-       rc = hisi_sas_task_prep(task, hisi_hba, is_tmf, tmf, &pass);
+       spin_lock_irqsave(&dq->lock, flags);
+       rc = hisi_sas_task_prep(task, dq, is_tmf, tmf, &pass);
        if (rc)
                dev_err(dev, "task exec: failed[%d]!\n", rc);
 
        if (likely(pass))
-               hisi_hba->hw->start_delivery(hisi_hba);
-       spin_unlock_irqrestore(&hisi_hba->lock, flags);
+               hisi_hba->hw->start_delivery(dq);
+       spin_unlock_irqrestore(&dq->lock, flags);
 
        return rc;
 }
@@ -421,12 +522,16 @@ static struct hisi_sas_device *hisi_sas_alloc_dev(struct domain_device *device)
        spin_lock(&hisi_hba->lock);
        for (i = 0; i < HISI_SAS_MAX_DEVICES; i++) {
                if (hisi_hba->devices[i].dev_type == SAS_PHY_UNUSED) {
+                       int queue = i % hisi_hba->queue_count;
+                       struct hisi_sas_dq *dq = &hisi_hba->dq[queue];
+
                        hisi_hba->devices[i].device_id = i;
                        sas_dev = &hisi_hba->devices[i];
                        sas_dev->dev_status = HISI_SAS_DEV_NORMAL;
                        sas_dev->dev_type = device->dev_type;
                        sas_dev->hisi_hba = hisi_hba;
                        sas_dev->sas_device = device;
+                       sas_dev->dq = dq;
                        INIT_LIST_HEAD(&hisi_hba->devices[i].list);
                        break;
                }
@@ -441,7 +546,7 @@ static int hisi_sas_dev_found(struct domain_device *device)
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
        struct domain_device *parent_dev = device->parent;
        struct hisi_sas_device *sas_dev;
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
 
        if (hisi_hba->hw->alloc_dev)
                sas_dev = hisi_hba->hw->alloc_dev(device);
@@ -626,10 +731,10 @@ static void hisi_sas_dev_gone(struct domain_device *device)
 {
        struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
-       struct device *dev = &hisi_hba->pdev->dev;
-       u64 dev_id = sas_dev->device_id;
+       struct device *dev = hisi_hba->dev;
+       int dev_id = sas_dev->device_id;
 
-       dev_info(dev, "found dev[%lld:%x] is gone\n",
+       dev_info(dev, "found dev[%d:%x] is gone\n",
                 sas_dev->device_id, sas_dev->dev_type);
 
        hisi_sas_internal_task_abort(hisi_hba, device,
@@ -691,8 +796,13 @@ static void hisi_sas_task_done(struct sas_task *task)
 static void hisi_sas_tmf_timedout(unsigned long data)
 {
        struct sas_task *task = (struct sas_task *)data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&task->task_state_lock, flags);
+       if (!(task->task_state_flags & SAS_TASK_STATE_DONE))
+               task->task_state_flags |= SAS_TASK_STATE_ABORTED;
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
-       task->task_state_flags |= SAS_TASK_STATE_ABORTED;
        complete(&task->slow_task->completion);
 }
 
@@ -704,7 +814,7 @@ static int hisi_sas_exec_internal_tmf_task(struct domain_device *device,
 {
        struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct hisi_hba *hisi_hba = sas_dev->hisi_hba;
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        struct sas_task *task;
        int res, retry;
 
@@ -821,7 +931,7 @@ static int hisi_sas_softreset_ata_disk(struct domain_device *device)
        struct ata_link *link;
        int rc = TMF_RESP_FUNC_FAILED;
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        int s = sizeof(struct host_to_dev_fis);
        unsigned long flags;
 
@@ -879,7 +989,7 @@ static int hisi_sas_controller_reset(struct hisi_hba *hisi_hba)
                return -1;
 
        if (!test_and_set_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags)) {
-               struct device *dev = &hisi_hba->pdev->dev;
+               struct device *dev = hisi_hba->dev;
                struct sas_ha_struct *sas_ha = &hisi_hba->sha;
                unsigned long flags;
 
@@ -912,7 +1022,7 @@ static int hisi_sas_abort_task(struct sas_task *task)
        struct domain_device *device = task->dev;
        struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(task->dev);
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        int rc = TMF_RESP_FUNC_FAILED;
        unsigned long flags;
 
@@ -963,7 +1073,7 @@ static int hisi_sas_abort_task(struct sas_task *task)
                                                     HISI_SAS_INT_ABT_DEV, 0);
                        rc = hisi_sas_softreset_ata_disk(device);
                }
-       } else if (task->task_proto & SAS_PROTOCOL_SMP) {
+       } else if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SMP) {
                /* SMP */
                struct hisi_sas_slot *slot = task->lldd_task;
                u32 tag = slot->idx;
@@ -1041,7 +1151,7 @@ static int hisi_sas_lu_reset(struct domain_device *device, u8 *lun)
 {
        struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        unsigned long flags;
        int rc = TMF_RESP_FUNC_FAILED;
 
@@ -1077,7 +1187,7 @@ static int hisi_sas_lu_reset(struct domain_device *device, u8 *lun)
        }
 out:
        if (rc != TMF_RESP_FUNC_COMPLETE)
-               dev_err(dev, "lu_reset: for device[%llx]:rc= %d\n",
+               dev_err(dev, "lu_reset: for device[%d]:rc= %d\n",
                             sas_dev->device_id, rc);
        return rc;
 }
@@ -1124,19 +1234,20 @@ static int hisi_sas_query_task(struct sas_task *task)
 }
 
 static int
-hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, u64 device_id,
+hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
                                  struct sas_task *task, int abort_flag,
                                  int task_tag)
 {
        struct domain_device *device = task->dev;
        struct hisi_sas_device *sas_dev = device->lldd_dev;
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        struct hisi_sas_port *port;
        struct hisi_sas_slot *slot;
        struct asd_sas_port *sas_port = device->port;
        struct hisi_sas_cmd_hdr *cmd_hdr_base;
+       struct hisi_sas_dq *dq = sas_dev->dq;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
-       unsigned long flags;
+       unsigned long flags, flags_dq;
 
        if (unlikely(test_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags)))
                return -EINVAL;
@@ -1147,14 +1258,22 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, u64 device_id,
        port = to_hisi_sas_port(sas_port);
 
        /* simply get a slot and send abort command */
+       spin_lock_irqsave(&hisi_hba->lock, flags);
        rc = hisi_sas_slot_index_alloc(hisi_hba, &slot_idx);
-       if (rc)
+       if (rc) {
+               spin_unlock_irqrestore(&hisi_hba->lock, flags);
                goto err_out;
-       rc = hisi_hba->hw->get_free_slot(hisi_hba, sas_dev->device_id,
-                                       &dlvry_queue, &dlvry_queue_slot);
+       }
+       spin_unlock_irqrestore(&hisi_hba->lock, flags);
+
+       spin_lock_irqsave(&dq->lock, flags_dq);
+       rc = hisi_hba->hw->get_free_slot(hisi_hba, dq);
        if (rc)
                goto err_out_tag;
 
+       dlvry_queue = dq->id;
+       dlvry_queue_slot = dq->wr_point;
+
        slot = &hisi_hba->slot_info[slot_idx];
        memset(slot, 0, sizeof(struct hisi_sas_slot));
 
@@ -1181,17 +1300,21 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, u64 device_id,
        task->task_state_flags |= SAS_TASK_AT_INITIATOR;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
-       hisi_hba->slot_prep = slot;
+       dq->slot_prep = slot;
 
        atomic64_inc(&sas_dev->running_req);
 
-       /* send abort command to our chip */
-       hisi_hba->hw->start_delivery(hisi_hba);
+       /* send abort command to the chip */
+       hisi_hba->hw->start_delivery(dq);
+       spin_unlock_irqrestore(&dq->lock, flags_dq);
 
        return 0;
 
 err_out_tag:
+       spin_lock_irqsave(&hisi_hba->lock, flags);
        hisi_sas_slot_index_free(hisi_hba, slot_idx);
+       spin_unlock_irqrestore(&hisi_hba->lock, flags);
+       spin_unlock_irqrestore(&dq->lock, flags_dq);
 err_out:
        dev_err(dev, "internal abort task prep: failed[%d]!\n", rc);
 
@@ -1214,9 +1337,8 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
 {
        struct sas_task *task;
        struct hisi_sas_device *sas_dev = device->lldd_dev;
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        int res;
-       unsigned long flags;
 
        if (!hisi_hba->hw->prep_abort)
                return -EOPNOTSUPP;
@@ -1233,11 +1355,8 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
        task->slow_task->timer.expires = jiffies + msecs_to_jiffies(110);
        add_timer(&task->slow_task->timer);
 
-       /* Lock as we are alloc'ing a slot, which cannot be interrupted */
-       spin_lock_irqsave(&hisi_hba->lock, flags);
        res = hisi_sas_internal_abort_task_exec(hisi_hba, sas_dev->device_id,
                                                task, abort_flag, tag);
-       spin_unlock_irqrestore(&hisi_hba->lock, flags);
        if (res) {
                del_timer(&task->slow_task->timer);
                dev_err(dev, "internal task abort: executing internal task failed: %d\n",
@@ -1247,6 +1366,17 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
        wait_for_completion(&task->slow_task->completion);
        res = TMF_RESP_FUNC_FAILED;
 
+       /* Internal abort timed out */
+       if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
+               if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
+                       struct hisi_sas_slot *slot = task->lldd_task;
+
+                       if (slot)
+                               slot->task = NULL;
+                       dev_err(dev, "internal task abort: timeout.\n");
+               }
+       }
+
        if (task->task_status.resp == SAS_TASK_COMPLETE &&
                task->task_status.stat == TMF_RESP_FUNC_COMPLETE) {
                res = TMF_RESP_FUNC_COMPLETE;
@@ -1259,13 +1389,6 @@ hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
                goto exit;
        }
 
-       /* Internal abort timed out */
-       if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
-               if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
-                       dev_err(dev, "internal task abort: timeout.\n");
-               }
-       }
-
 exit:
        dev_dbg(dev, "internal task abort: task to dev %016llx task=%p "
                "resp: 0x%x sts 0x%x\n",
@@ -1424,8 +1547,7 @@ EXPORT_SYMBOL_GPL(hisi_sas_init_mem);
 
 static int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost)
 {
-       struct platform_device *pdev = hisi_hba->pdev;
-       struct device *dev = &pdev->dev;
+       struct device *dev = hisi_hba->dev;
        int i, s, max_command_entries = hisi_hba->hw->max_command_entries;
 
        spin_lock_init(&hisi_hba->lock);
@@ -1545,7 +1667,7 @@ err_out:
 
 static void hisi_sas_free(struct hisi_hba *hisi_hba)
 {
-       struct device *dev = &hisi_hba->pdev->dev;
+       struct device *dev = hisi_hba->dev;
        int i, s, max_command_entries = hisi_hba->hw->max_command_entries;
 
        for (i = 0; i < hisi_hba->queue_count; i++) {
@@ -1626,7 +1748,8 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
 
        INIT_WORK(&hisi_hba->rst_work, hisi_sas_rst_work_handler);
        hisi_hba->hw = hw;
-       hisi_hba->pdev = pdev;
+       hisi_hba->platform_dev = pdev;
+       hisi_hba->dev = dev;
        hisi_hba->shost = shost;
        SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;
 
@@ -1743,7 +1866,7 @@ int hisi_sas_probe(struct platform_device *pdev,
        shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
 
        sha->sas_ha_name = DRV_NAME;
-       sha->dev = &hisi_hba->pdev->dev;
+       sha->dev = hisi_hba->dev;
        sha->lldd_module = THIS_MODULE;
        sha->sas_addr = &hisi_hba->sas_addr[0];
        sha->num_phys = hisi_hba->n_phy;