diff mbox

[3/6] pm80xx : Different SAS addresses for phys.

Message ID 20150130060645.23653-4-Viswas.G@microsemi.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Viswas G Jan. 30, 2015, 6:06 a.m. UTC
Different SAS addresses are assigned for each set of phys.

Signed-off-by: Viswas G <Viswas.G@microsemi.com>
---
 drivers/scsi/pm8001/pm8001_init.c | 13 +++++++++----
 drivers/scsi/pm8001/pm80xx_hwi.c  |  3 +--
 2 files changed, 10 insertions(+), 6 deletions(-)

Comments

Jack Wang Aug. 29, 2017, 11:25 a.m. UTC | #1
2015-01-30 7:06 GMT+01:00 Viswas G <Viswas.G@microsemi.com>:
> Different SAS addresses are assigned for each set of phys.
>
> Signed-off-by: Viswas G <Viswas.G@microsemi.com>
> ---
>  drivers/scsi/pm8001/pm8001_init.c | 13 +++++++++----
>  drivers/scsi/pm8001/pm80xx_hwi.c  |  3 +--
>  2 files changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
> index 034b2f7d1135..d282f1562615 100644
> --- a/drivers/scsi/pm8001/pm8001_init.c
> +++ b/drivers/scsi/pm8001/pm8001_init.c
> @@ -132,7 +132,7 @@ static void pm8001_phy_init(struct pm8001_hba_info *pm8001_ha, int phy_id)
>         sas_phy->oob_mode = OOB_NOT_CONNECTED;
>         sas_phy->linkrate = SAS_LINK_RATE_UNKNOWN;
>         sas_phy->id = phy_id;
> -       sas_phy->sas_addr = &pm8001_ha->sas_addr[0];
> +       sas_phy->sas_addr = (u8 *)&phy->dev_sas_addr;
>         sas_phy->frame_rcvd = &phy->frame_rcvd[0];
>         sas_phy->ha = (struct sas_ha_struct *)pm8001_ha->shost->hostdata;
>         sas_phy->lldd_phy = phy;
> @@ -593,10 +593,12 @@ static void  pm8001_post_sas_ha_init(struct Scsi_Host *shost,
>         for (i = 0; i < chip_info->n_phy; i++) {
>                 sha->sas_phy[i] = &pm8001_ha->phy[i].sas_phy;
>                 sha->sas_port[i] = &pm8001_ha->port[i].sas_port;
> +               sha->sas_phy[i]->sas_addr =
> +                       (u8 *)&pm8001_ha->phy[i].dev_sas_addr;
>         }
>         sha->sas_ha_name = DRV_NAME;
>         sha->dev = pm8001_ha->dev;
> -
> +       sha->strict_wide_ports = 1;
>         sha->lldd_module = THIS_MODULE;
>         sha->sas_addr = &pm8001_ha->sas_addr[0];
>         sha->num_phys = chip_info->n_phy;
> @@ -613,6 +615,7 @@ static void  pm8001_post_sas_ha_init(struct Scsi_Host *shost,
>  static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
>  {
>         u8 i, j;
> +       u8 sas_add[8];
>  #ifdef PM8001_READ_VPD
>         /* For new SPC controllers WWN is stored in flash vpd
>         *  For SPC/SPCve controllers WWN is stored in EEPROM
> @@ -674,10 +677,12 @@ static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
>                         pm8001_ha->sas_addr[j] =
>                                         payload.func_specific[0x804 + i];
>         }
> -
> +       memcpy(sas_add, pm8001_ha->sas_addr, SAS_ADDR_SIZE);
>         for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
> +               if (i && ((i % 4) == 0))
> +                       sas_add[7] = sas_add[7] + 4;
>                 memcpy(&pm8001_ha->phy[i].dev_sas_addr,
> -                       pm8001_ha->sas_addr, SAS_ADDR_SIZE);
> +                       sas_add, SAS_ADDR_SIZE);
>                 PM8001_INIT_DBG(pm8001_ha,
>                         pm8001_printk("phy %d sas_addr = %016llx\n", i,
>                         pm8001_ha->phy[i].dev_sas_addr));
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 8fb5ddf08cc4..a07b023c09bf 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -3041,7 +3041,6 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
>         port->port_state = portstate;
>         phy->identify.device_type = 0;
>         phy->phy_attached = 0;
> -       memset(&phy->dev_sas_addr, 0, SAS_ADDR_SIZE);
>         switch (portstate) {
>         case PORT_VALID:
>                 break;
> @@ -4394,7 +4393,7 @@ pm80xx_chip_phy_start_req(struct pm8001_hba_info *pm8001_ha, u8 phy_id)
>         payload.sas_identify.dev_type = SAS_END_DEVICE;
>         payload.sas_identify.initiator_bits = SAS_PROTOCOL_ALL;
>         memcpy(payload.sas_identify.sas_addr,
> -               pm8001_ha->sas_addr, SAS_ADDR_SIZE);
> +               &pm8001_ha->phy[phy_id].dev_sas_addr, SAS_ADDR_SIZE);
>         payload.sas_identify.phy_id = phy_id;
>         ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opcode, &payload, 0);
>         return ret;
> --
> 2.12.3
>
This removes the possibility to form a wide port, why do you want to do it?
Viswas G Aug. 30, 2017, 4:55 p.m. UTC | #2
Hi Jack,

This is a customer requirement. Since the SAS addresses of all the phys were same , when the attached SAS addresses are different, it was forming only one domain.  If we assign different SAS addresses, this will cause duplicate domain unless we set the strict_wide_port to 1.

Regards,
Viswas G


> -----Original Message-----

> From: Jack Wang [mailto:xjtuwjp@gmail.com]

> Sent: Tuesday, August 29, 2017 4:55 PM

> To: Viswas G <viswas.g@microsemi.com>

> Cc: linux-scsi@vger.kernel.org; Vasanthalakshmi Tharmarajan

> <vasanthalakshmi.thar@microsemi.com>

> Subject: Re: [PATCH 3/6] pm80xx : Different SAS addresses for phys.

> 

> EXTERNAL EMAIL

> 

> 

> 2015-01-30 7:06 GMT+01:00 Viswas G <Viswas.G@microsemi.com>:

> > Different SAS addresses are assigned for each set of phys.

> >

> > Signed-off-by: Viswas G <Viswas.G@microsemi.com>

> > ---

> >  drivers/scsi/pm8001/pm8001_init.c | 13 +++++++++----

> >  drivers/scsi/pm8001/pm80xx_hwi.c  |  3 +--

> >  2 files changed, 10 insertions(+), 6 deletions(-)

> >

> > diff --git a/drivers/scsi/pm8001/pm8001_init.c

> b/drivers/scsi/pm8001/pm8001_init.c

> > index 034b2f7d1135..d282f1562615 100644

> > --- a/drivers/scsi/pm8001/pm8001_init.c

> > +++ b/drivers/scsi/pm8001/pm8001_init.c

> > @@ -132,7 +132,7 @@ static void pm8001_phy_init(struct

> pm8001_hba_info *pm8001_ha, int phy_id)

> >         sas_phy->oob_mode = OOB_NOT_CONNECTED;

> >         sas_phy->linkrate = SAS_LINK_RATE_UNKNOWN;

> >         sas_phy->id = phy_id;

> > -       sas_phy->sas_addr = &pm8001_ha->sas_addr[0];

> > +       sas_phy->sas_addr = (u8 *)&phy->dev_sas_addr;

> >         sas_phy->frame_rcvd = &phy->frame_rcvd[0];

> >         sas_phy->ha = (struct sas_ha_struct *)pm8001_ha->shost->hostdata;

> >         sas_phy->lldd_phy = phy;

> > @@ -593,10 +593,12 @@ static void  pm8001_post_sas_ha_init(struct

> Scsi_Host *shost,

> >         for (i = 0; i < chip_info->n_phy; i++) {

> >                 sha->sas_phy[i] = &pm8001_ha->phy[i].sas_phy;

> >                 sha->sas_port[i] = &pm8001_ha->port[i].sas_port;

> > +               sha->sas_phy[i]->sas_addr =

> > +                       (u8 *)&pm8001_ha->phy[i].dev_sas_addr;

> >         }

> >         sha->sas_ha_name = DRV_NAME;

> >         sha->dev = pm8001_ha->dev;

> > -

> > +       sha->strict_wide_ports = 1;

> >         sha->lldd_module = THIS_MODULE;

> >         sha->sas_addr = &pm8001_ha->sas_addr[0];

> >         sha->num_phys = chip_info->n_phy;

> > @@ -613,6 +615,7 @@ static void  pm8001_post_sas_ha_init(struct

> Scsi_Host *shost,

> >  static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)

> >  {

> >         u8 i, j;

> > +       u8 sas_add[8];

> >  #ifdef PM8001_READ_VPD

> >         /* For new SPC controllers WWN is stored in flash vpd

> >         *  For SPC/SPCve controllers WWN is stored in EEPROM

> > @@ -674,10 +677,12 @@ static void pm8001_init_sas_add(struct

> pm8001_hba_info *pm8001_ha)

> >                         pm8001_ha->sas_addr[j] =

> >                                         payload.func_specific[0x804 + i];

> >         }

> > -

> > +       memcpy(sas_add, pm8001_ha->sas_addr, SAS_ADDR_SIZE);

> >         for (i = 0; i < pm8001_ha->chip->n_phy; i++) {

> > +               if (i && ((i % 4) == 0))

> > +                       sas_add[7] = sas_add[7] + 4;

> >                 memcpy(&pm8001_ha->phy[i].dev_sas_addr,

> > -                       pm8001_ha->sas_addr, SAS_ADDR_SIZE);

> > +                       sas_add, SAS_ADDR_SIZE);

> >                 PM8001_INIT_DBG(pm8001_ha,

> >                         pm8001_printk("phy %d sas_addr = %016llx\n", i,

> >                         pm8001_ha->phy[i].dev_sas_addr));

> > diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c

> b/drivers/scsi/pm8001/pm80xx_hwi.c

> > index 8fb5ddf08cc4..a07b023c09bf 100644

> > --- a/drivers/scsi/pm8001/pm80xx_hwi.c

> > +++ b/drivers/scsi/pm8001/pm80xx_hwi.c

> > @@ -3041,7 +3041,6 @@ hw_event_phy_down(struct pm8001_hba_info

> *pm8001_ha, void *piomb)

> >         port->port_state = portstate;

> >         phy->identify.device_type = 0;

> >         phy->phy_attached = 0;

> > -       memset(&phy->dev_sas_addr, 0, SAS_ADDR_SIZE);

> >         switch (portstate) {

> >         case PORT_VALID:

> >                 break;

> > @@ -4394,7 +4393,7 @@ pm80xx_chip_phy_start_req(struct

> pm8001_hba_info *pm8001_ha, u8 phy_id)

> >         payload.sas_identify.dev_type = SAS_END_DEVICE;

> >         payload.sas_identify.initiator_bits = SAS_PROTOCOL_ALL;

> >         memcpy(payload.sas_identify.sas_addr,

> > -               pm8001_ha->sas_addr, SAS_ADDR_SIZE);

> > +               &pm8001_ha->phy[phy_id].dev_sas_addr, SAS_ADDR_SIZE);

> >         payload.sas_identify.phy_id = phy_id;

> >         ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opcode,

> &payload, 0);

> >         return ret;

> > --

> > 2.12.3

> >

> This removes the possibility to form a wide port, why do you want to do it?
Jack Wang Sept. 1, 2017, 8:52 a.m. UTC | #3
2017-08-30 18:55 GMT+02:00 Viswas G <viswas.g@microsemi.com>:
> Hi Jack,
>
> This is a customer requirement. Since the SAS addresses of all the phys were same , when the attached SAS addresses are different, it was forming only one domain.  If we assign different SAS addresses, this will cause duplicate domain unless we set the strict_wide_port to 1.
>
> Regards,
> Viswas G

Ok, understand now!

Acked-by: Jack Wang <jinpu.wang@profitbricks.com>
Thanks!
>
>
>> -----Original Message-----
>> From: Jack Wang [mailto:xjtuwjp@gmail.com]
>> Sent: Tuesday, August 29, 2017 4:55 PM
>> To: Viswas G <viswas.g@microsemi.com>
>> Cc: linux-scsi@vger.kernel.org; Vasanthalakshmi Tharmarajan
>> <vasanthalakshmi.thar@microsemi.com>
>> Subject: Re: [PATCH 3/6] pm80xx : Different SAS addresses for phys.
>>
>> EXTERNAL EMAIL
>>
>>
>> 2015-01-30 7:06 GMT+01:00 Viswas G <Viswas.G@microsemi.com>:
>> > Different SAS addresses are assigned for each set of phys.
>> >
>> > Signed-off-by: Viswas G <Viswas.G@microsemi.com>
>> > ---
>> >  drivers/scsi/pm8001/pm8001_init.c | 13 +++++++++----
>> >  drivers/scsi/pm8001/pm80xx_hwi.c  |  3 +--
>> >  2 files changed, 10 insertions(+), 6 deletions(-)
>> >
>> > diff --git a/drivers/scsi/pm8001/pm8001_init.c
>> b/drivers/scsi/pm8001/pm8001_init.c
>> > index 034b2f7d1135..d282f1562615 100644
>> > --- a/drivers/scsi/pm8001/pm8001_init.c
>> > +++ b/drivers/scsi/pm8001/pm8001_init.c
>> > @@ -132,7 +132,7 @@ static void pm8001_phy_init(struct
>> pm8001_hba_info *pm8001_ha, int phy_id)
>> >         sas_phy->oob_mode = OOB_NOT_CONNECTED;
>> >         sas_phy->linkrate = SAS_LINK_RATE_UNKNOWN;
>> >         sas_phy->id = phy_id;
>> > -       sas_phy->sas_addr = &pm8001_ha->sas_addr[0];
>> > +       sas_phy->sas_addr = (u8 *)&phy->dev_sas_addr;
>> >         sas_phy->frame_rcvd = &phy->frame_rcvd[0];
>> >         sas_phy->ha = (struct sas_ha_struct *)pm8001_ha->shost->hostdata;
>> >         sas_phy->lldd_phy = phy;
>> > @@ -593,10 +593,12 @@ static void  pm8001_post_sas_ha_init(struct
>> Scsi_Host *shost,
>> >         for (i = 0; i < chip_info->n_phy; i++) {
>> >                 sha->sas_phy[i] = &pm8001_ha->phy[i].sas_phy;
>> >                 sha->sas_port[i] = &pm8001_ha->port[i].sas_port;
>> > +               sha->sas_phy[i]->sas_addr =
>> > +                       (u8 *)&pm8001_ha->phy[i].dev_sas_addr;
>> >         }
>> >         sha->sas_ha_name = DRV_NAME;
>> >         sha->dev = pm8001_ha->dev;
>> > -
>> > +       sha->strict_wide_ports = 1;
>> >         sha->lldd_module = THIS_MODULE;
>> >         sha->sas_addr = &pm8001_ha->sas_addr[0];
>> >         sha->num_phys = chip_info->n_phy;
>> > @@ -613,6 +615,7 @@ static void  pm8001_post_sas_ha_init(struct
>> Scsi_Host *shost,
>> >  static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
>> >  {
>> >         u8 i, j;
>> > +       u8 sas_add[8];
>> >  #ifdef PM8001_READ_VPD
>> >         /* For new SPC controllers WWN is stored in flash vpd
>> >         *  For SPC/SPCve controllers WWN is stored in EEPROM
>> > @@ -674,10 +677,12 @@ static void pm8001_init_sas_add(struct
>> pm8001_hba_info *pm8001_ha)
>> >                         pm8001_ha->sas_addr[j] =
>> >                                         payload.func_specific[0x804 + i];
>> >         }
>> > -
>> > +       memcpy(sas_add, pm8001_ha->sas_addr, SAS_ADDR_SIZE);
>> >         for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
>> > +               if (i && ((i % 4) == 0))
>> > +                       sas_add[7] = sas_add[7] + 4;
>> >                 memcpy(&pm8001_ha->phy[i].dev_sas_addr,
>> > -                       pm8001_ha->sas_addr, SAS_ADDR_SIZE);
>> > +                       sas_add, SAS_ADDR_SIZE);
>> >                 PM8001_INIT_DBG(pm8001_ha,
>> >                         pm8001_printk("phy %d sas_addr = %016llx\n", i,
>> >                         pm8001_ha->phy[i].dev_sas_addr));
>> > diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c
>> b/drivers/scsi/pm8001/pm80xx_hwi.c
>> > index 8fb5ddf08cc4..a07b023c09bf 100644
>> > --- a/drivers/scsi/pm8001/pm80xx_hwi.c
>> > +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
>> > @@ -3041,7 +3041,6 @@ hw_event_phy_down(struct pm8001_hba_info
>> *pm8001_ha, void *piomb)
>> >         port->port_state = portstate;
>> >         phy->identify.device_type = 0;
>> >         phy->phy_attached = 0;
>> > -       memset(&phy->dev_sas_addr, 0, SAS_ADDR_SIZE);
>> >         switch (portstate) {
>> >         case PORT_VALID:
>> >                 break;
>> > @@ -4394,7 +4393,7 @@ pm80xx_chip_phy_start_req(struct
>> pm8001_hba_info *pm8001_ha, u8 phy_id)
>> >         payload.sas_identify.dev_type = SAS_END_DEVICE;
>> >         payload.sas_identify.initiator_bits = SAS_PROTOCOL_ALL;
>> >         memcpy(payload.sas_identify.sas_addr,
>> > -               pm8001_ha->sas_addr, SAS_ADDR_SIZE);
>> > +               &pm8001_ha->phy[phy_id].dev_sas_addr, SAS_ADDR_SIZE);
>> >         payload.sas_identify.phy_id = phy_id;
>> >         ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opcode,
>> &payload, 0);
>> >         return ret;
>> > --
>> > 2.12.3
>> >
>> This removes the possibility to form a wide port, why do you want to do it?
diff mbox

Patch

diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index 034b2f7d1135..d282f1562615 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -132,7 +132,7 @@  static void pm8001_phy_init(struct pm8001_hba_info *pm8001_ha, int phy_id)
 	sas_phy->oob_mode = OOB_NOT_CONNECTED;
 	sas_phy->linkrate = SAS_LINK_RATE_UNKNOWN;
 	sas_phy->id = phy_id;
-	sas_phy->sas_addr = &pm8001_ha->sas_addr[0];
+	sas_phy->sas_addr = (u8 *)&phy->dev_sas_addr;
 	sas_phy->frame_rcvd = &phy->frame_rcvd[0];
 	sas_phy->ha = (struct sas_ha_struct *)pm8001_ha->shost->hostdata;
 	sas_phy->lldd_phy = phy;
@@ -593,10 +593,12 @@  static void  pm8001_post_sas_ha_init(struct Scsi_Host *shost,
 	for (i = 0; i < chip_info->n_phy; i++) {
 		sha->sas_phy[i] = &pm8001_ha->phy[i].sas_phy;
 		sha->sas_port[i] = &pm8001_ha->port[i].sas_port;
+		sha->sas_phy[i]->sas_addr =
+			(u8 *)&pm8001_ha->phy[i].dev_sas_addr;
 	}
 	sha->sas_ha_name = DRV_NAME;
 	sha->dev = pm8001_ha->dev;
-
+	sha->strict_wide_ports = 1;
 	sha->lldd_module = THIS_MODULE;
 	sha->sas_addr = &pm8001_ha->sas_addr[0];
 	sha->num_phys = chip_info->n_phy;
@@ -613,6 +615,7 @@  static void  pm8001_post_sas_ha_init(struct Scsi_Host *shost,
 static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
 {
 	u8 i, j;
+	u8 sas_add[8];
 #ifdef PM8001_READ_VPD
 	/* For new SPC controllers WWN is stored in flash vpd
 	*  For SPC/SPCve controllers WWN is stored in EEPROM
@@ -674,10 +677,12 @@  static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
 			pm8001_ha->sas_addr[j] =
 					payload.func_specific[0x804 + i];
 	}
-
+	memcpy(sas_add, pm8001_ha->sas_addr, SAS_ADDR_SIZE);
 	for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
+		if (i && ((i % 4) == 0))
+			sas_add[7] = sas_add[7] + 4;
 		memcpy(&pm8001_ha->phy[i].dev_sas_addr,
-			pm8001_ha->sas_addr, SAS_ADDR_SIZE);
+			sas_add, SAS_ADDR_SIZE);
 		PM8001_INIT_DBG(pm8001_ha,
 			pm8001_printk("phy %d sas_addr = %016llx\n", i,
 			pm8001_ha->phy[i].dev_sas_addr));
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 8fb5ddf08cc4..a07b023c09bf 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -3041,7 +3041,6 @@  hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
 	port->port_state = portstate;
 	phy->identify.device_type = 0;
 	phy->phy_attached = 0;
-	memset(&phy->dev_sas_addr, 0, SAS_ADDR_SIZE);
 	switch (portstate) {
 	case PORT_VALID:
 		break;
@@ -4394,7 +4393,7 @@  pm80xx_chip_phy_start_req(struct pm8001_hba_info *pm8001_ha, u8 phy_id)
 	payload.sas_identify.dev_type = SAS_END_DEVICE;
 	payload.sas_identify.initiator_bits = SAS_PROTOCOL_ALL;
 	memcpy(payload.sas_identify.sas_addr,
-		pm8001_ha->sas_addr, SAS_ADDR_SIZE);
+		&pm8001_ha->phy[phy_id].dev_sas_addr, SAS_ADDR_SIZE);
 	payload.sas_identify.phy_id = phy_id;
 	ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opcode, &payload, 0);
 	return ret;