return device->port->ha->lldd_ha;
 }
 
+struct hisi_sas_port *to_hisi_sas_port(struct asd_sas_port *sas_port)
+{
+       return container_of(sas_port, struct hisi_sas_port, sas_port);
+}
+EXPORT_SYMBOL_GPL(to_hisi_sas_port);
+
 static void hisi_sas_slot_index_clear(struct hisi_hba *hisi_hba, int slot_idx)
 {
        void *bitmap = hisi_hba->slot_index_tags;
        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;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
 
-       if (!device->port) {
+       if (!sas_port) {
                struct task_status_struct *ts = &task->task_status;
 
                ts->resp = SAS_TASK_UNDELIVERED;
                rc = SAS_PHY_DOWN;
                return rc;
        }
-       port = device->port->lldd_port;
+
+       port = to_hisi_sas_port(sas_port);
        if (port && !port->port_attached) {
                dev_info(dev, "task prep: %s port%d not attach device\n",
                         (sas_protocol_ata(task->task_proto)) ?
        struct hisi_hba *hisi_hba = sas_ha->lldd_ha;
        struct hisi_sas_phy *phy = sas_phy->lldd_phy;
        struct asd_sas_port *sas_port = sas_phy->port;
-       struct hisi_sas_port *port = &hisi_hba->port[phy->port_id];
+       struct hisi_sas_port *port = to_hisi_sas_port(sas_port);
        unsigned long flags;
 
        if (!sas_port)
        struct device *dev = &hisi_hba->pdev->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;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
 
        if (!device->port)
                return -1;
 
-       port = device->port->lldd_port;
+       port = to_hisi_sas_port(sas_port);
 
        /* simply get a slot and send abort command */
        rc = hisi_sas_slot_index_alloc(hisi_hba, &slot_idx);
 
        struct device *dev = &hisi_hba->pdev->dev;
        u64 qw0, device_id = sas_dev->device_id;
        struct hisi_sas_itct *itct = &hisi_hba->itct[device_id];
+       struct asd_sas_port *sas_port = device->port;
+       struct hisi_sas_port *port = to_hisi_sas_port(sas_port);
 
        memset(itct, 0, sizeof(*itct));
 
                (1 << ITCT_HDR_AWT_CONTROL_OFF) |
                (device->max_linkrate << ITCT_HDR_MAX_CONN_RATE_OFF) |
                (1 << ITCT_HDR_VALID_LINK_NUM_OFF) |
-               (device->port->id << ITCT_HDR_PORT_ID_OFF));
+               (port->id << ITCT_HDR_PORT_ID_OFF));
        itct->qw0 = cpu_to_le64(qw0);
 
        /* qw1 */
 
        u64 qw0, device_id = sas_dev->device_id;
        struct hisi_sas_itct *itct = &hisi_hba->itct[device_id];
        struct domain_device *parent_dev = device->parent;
-       struct hisi_sas_port *port = device->port->lldd_port;
+       struct asd_sas_port *sas_port = device->port;
+       struct hisi_sas_port *port = to_hisi_sas_port(sas_port);
 
        memset(itct, 0, sizeof(*itct));
 
        struct domain_device *parent_dev = device->parent;
        struct hisi_sas_device *sas_dev = device->lldd_dev;
        struct hisi_sas_cmd_hdr *hdr = slot->cmd_hdr;
-       struct hisi_sas_port *port = device->port->lldd_port;
+       struct asd_sas_port *sas_port = device->port;
+       struct hisi_sas_port *port = to_hisi_sas_port(sas_port);
        u8 *buf_cmd;
        int has_data = 0, rc = 0, hdr_tag = 0;
        u32 dw1 = 0, dw2 = 0;