EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe On 24/06/2020 13:03, Deepak Ukey wrote: > From: peter chang <dpf@xxxxxxxxxx> > > The host's scan finish waits for the libsas queue to drain. However, > if the PHYs are still in the process of starting then the queue will > be empty. This means that we declare the scan finished before it has > even started. Here we wait for various events from the firmware-side. But we still report the phy up even to libsas later, so should revalidate the domain and discover the device. - The scsi_host scan_finished callback polls the phy state in pm8001_update_phy_mask. If the phy fails to come up - - after phy->start_timeout, we declare the scan as finished and proceed. > > The wait behavior can be configured using the module parameter > "wait_for_phy_startup", if the parameter is enabled, the driver will > wait for the phy event from the firmware, before proceeding with load. If this is to circumvent a deficiency in udev (which you mentioned in the v1 in this series, but fail to mention here), then better to fix udev. - According to recommendation to fix this using udev. It looks like upstreaming this patch is not possible. We will - investigate using udev for fixing this issue and submit this patch later in future. > > Signed-off-by: Viswas G <Viswas.G@xxxxxxxxxxxxx> Author != first Signed-off-by > Signed-off-by: peter chang <dpf@xxxxxxxxxx> > Signed-off-by: Radha Ramachandran <radha@xxxxxxxxxx> > Signed-off-by: Deepak Ukey <Deepak.Ukey@xxxxxxxxxxxxx> > --- > drivers/scsi/pm8001/pm8001_ctl.c | 36 +++++++++++++++++++++ > drivers/scsi/pm8001/pm8001_defs.h | 6 ++-- > drivers/scsi/pm8001/pm8001_init.c | 22 +++++++++++++ > drivers/scsi/pm8001/pm8001_sas.c | 67 +++++++++++++++++++++++++++++++++++++-- > drivers/scsi/pm8001/pm8001_sas.h | 4 +++ > drivers/scsi/pm8001/pm80xx_hwi.c | 67 ++++++++++++++++++++++++++++++++------- > 6 files changed, 185 insertions(+), 17 deletions(-) > > diff --git a/drivers/scsi/pm8001/pm8001_ctl.c > b/drivers/scsi/pm8001/pm8001_ctl.c > index 3c9f42779dd0..eae629610a5f 100644 > --- a/drivers/scsi/pm8001/pm8001_ctl.c > +++ b/drivers/scsi/pm8001/pm8001_ctl.c > @@ -88,6 +88,41 @@ static ssize_t controller_fatal_error_show(struct device *cdev, > } > static DEVICE_ATTR_RO(controller_fatal_error); > > +/** > + * phy_startup_timeout_show - per-phy discovery timeout > + * @cdev: pointer to embedded class device > + * @buf: the buffer returned > + * > + * A sysfs 'read/write' shost attribute. > + */ > +static ssize_t phy_startup_timeout_show(struct device *cdev, > + struct device_attribute *attr, char *buf) { > + struct Scsi_Host *shost = class_to_shost(cdev); > + struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); > + struct pm8001_hba_info *pm8001_ha = sha->lldd_ha; > + > + return snprintf(buf, PAGE_SIZE, "%08xh\n", > + pm8001_ha->phy_startup_timeout / HZ); } > + > +static ssize_t phy_startup_timeout_store(struct device *cdev, > + struct device_attribute *attr, const char *buf, size_t count) { > + struct Scsi_Host *shost = class_to_shost(cdev); > + struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); > + struct pm8001_hba_info *pm8001_ha = sha->lldd_ha; > + int val = 0; > + > + if (kstrtoint(buf, 0, &val) < 0) > + return -EINVAL; > + > + pm8001_ha->phy_startup_timeout = val * HZ; > + return strlen(buf); I don't see how this can be used. > +} > + > +static DEVICE_ATTR_RW(phy_startup_timeout); > + > > case HW_EVENT_SAS_PHY_UP: > @@ -4975,6 +5015,9 @@ pm80xx_chip_phy_start_req(struct pm8001_hba_info *pm8001_ha, u8 phy_id) > > PM8001_INIT_DBG(pm8001_ha, > pm8001_printk("PHY START REQ for phy_id %d\n", phy_id)); > + set_bit(phy_id, &pm8001_ha->phy_mask); > + pm8001_ha->phy[phy_id].start_timeout = > + jiffies + pm8001_ha->phy_startup_timeout; > > payload.ase_sh_lm_slr_phyid = cpu_to_le32(SPINHOLD_ENABLE | > LINKMODE_AUTO | pm8001_ha->link_rate | phy_id); > -- If there is nothing attached to the phy, then it would never come up, right? If so, how do you handle this? Thanks, john