Message ID | 20150130060645.23653-4-Viswas.G@microsemi.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
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?
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?
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 --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;
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(-)