hisi_sas: Add phy and port init
authorJohn Garry <john.garry@huawei.com>
Tue, 17 Nov 2015 16:50:42 +0000 (00:50 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 26 Nov 2015 03:12:57 +0000 (22:12 -0500)
Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
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

index 5ac5a82edfec80b48ea6d9c53a9fc81ea54dd1d3..3a2400e8bb9594079663d85b28cd9f7c405c7f71 100644 (file)
@@ -43,12 +43,27 @@ enum dev_status {
        HISI_SAS_DEV_EH,
 };
 struct hisi_sas_phy {
+       struct hisi_hba *hisi_hba;
+       struct hisi_sas_port    *port;
        struct asd_sas_phy      sas_phy;
+       struct sas_identify     identify;
+       struct timer_list       timer;
+       u64             port_id; /* from hw */
        u64             dev_sas_addr;
+       u64             phy_type;
+       u64             frame_rcvd_size;
+       u8              frame_rcvd[32];
+       u8              phy_attached;
+       u8              reserved[3];
+       enum sas_linkrate       minimum_linkrate;
+       enum sas_linkrate       maximum_linkrate;
 };
 
 struct hisi_sas_port {
        struct asd_sas_port     sas_port;
+       u8      port_attached;
+       u8      id; /* from hw */
+       struct list_head        list;
 };
 
 struct hisi_sas_cq {
index 21111d4b854f241fcacab3d7e32011b86f7e3284..bc41ce478c3dd95723b4718c00da686cf2d291b8 100644 (file)
@@ -27,6 +27,30 @@ static void hisi_sas_slot_index_init(struct hisi_hba *hisi_hba)
                hisi_sas_slot_index_clear(hisi_hba, i);
 }
 
+
+static void hisi_sas_phy_init(struct hisi_hba *hisi_hba, int phy_no)
+{
+       struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
+       struct asd_sas_phy *sas_phy = &phy->sas_phy;
+
+       phy->hisi_hba = hisi_hba;
+       phy->port = NULL;
+       init_timer(&phy->timer);
+       sas_phy->enabled = (phy_no < hisi_hba->n_phy) ? 1 : 0;
+       sas_phy->class = SAS;
+       sas_phy->iproto = SAS_PROTOCOL_ALL;
+       sas_phy->tproto = 0;
+       sas_phy->type = PHY_TYPE_PHYSICAL;
+       sas_phy->role = PHY_ROLE_INITIATOR;
+       sas_phy->oob_mode = OOB_NOT_CONNECTED;
+       sas_phy->linkrate = SAS_LINK_RATE_UNKNOWN;
+       sas_phy->id = phy_no;
+       sas_phy->sas_addr = &hisi_hba->sas_addr[0];
+       sas_phy->frame_rcvd = &phy->frame_rcvd[0];
+       sas_phy->ha = (struct sas_ha_struct *)hisi_hba->shost->hostdata;
+       sas_phy->lldd_phy = phy;
+}
+
 static struct scsi_transport_template *hisi_sas_stt;
 
 static struct scsi_host_template hisi_sas_sht = {
@@ -57,6 +81,13 @@ 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;
 
+       for (i = 0; i < hisi_hba->n_phy; i++) {
+               hisi_sas_phy_init(hisi_hba, i);
+               hisi_hba->port[i].port_attached = 0;
+               hisi_hba->port[i].id = -1;
+               INIT_LIST_HEAD(&hisi_hba->port[i].list);
+       }
+
        for (i = 0; i < HISI_SAS_MAX_DEVICES; i++) {
                hisi_hba->devices[i].dev_type = SAS_PHY_UNUSED;
                hisi_hba->devices[i].device_id = i;