mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 09:34:12 +08:00
scsi: libsas: Factor out sas_ata_add_dev()
Factor out sas_ata_add_dev() and put it in sas_ata.c since it is a SATA related interface. Also follow the standard coding style to define an inline empty function when CONFIG_SCSI_SAS_ATA is not enabled. Cc: John Garry <john.g.garry@oracle.com> Signed-off-by: Jason Yan <yanaijie@huawei.com> Reviewed-by: John Garry <john.g.garry@oracle.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
8d2c9d25b7
commit
7cc7646b4b
@ -675,6 +675,68 @@ void sas_probe_sata(struct asd_sas_port *port)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
|
||||||
|
struct domain_device *child, int phy_id)
|
||||||
|
{
|
||||||
|
struct sas_rphy *rphy;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (child->linkrate > parent->min_linkrate) {
|
||||||
|
struct sas_phy *cphy = child->phy;
|
||||||
|
enum sas_linkrate min_prate = cphy->minimum_linkrate,
|
||||||
|
parent_min_lrate = parent->min_linkrate,
|
||||||
|
min_linkrate = (min_prate > parent_min_lrate) ?
|
||||||
|
parent_min_lrate : 0;
|
||||||
|
struct sas_phy_linkrates rates = {
|
||||||
|
.maximum_linkrate = parent->min_linkrate,
|
||||||
|
.minimum_linkrate = min_linkrate,
|
||||||
|
};
|
||||||
|
|
||||||
|
pr_notice("ex %016llx phy%02d SATA device linkrate > min pathway connection rate, attempting to lower device linkrate\n",
|
||||||
|
SAS_ADDR(child->sas_addr), phy_id);
|
||||||
|
ret = sas_smp_phy_control(parent, phy_id,
|
||||||
|
PHY_FUNC_LINK_RESET, &rates);
|
||||||
|
if (ret) {
|
||||||
|
pr_err("ex %016llx phy%02d SATA device could not set linkrate (%d)\n",
|
||||||
|
SAS_ADDR(child->sas_addr), phy_id, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
pr_notice("ex %016llx phy%02d SATA device set linkrate successfully\n",
|
||||||
|
SAS_ADDR(child->sas_addr), phy_id);
|
||||||
|
child->linkrate = child->min_linkrate;
|
||||||
|
}
|
||||||
|
ret = sas_get_ata_info(child, phy);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
sas_init_dev(child);
|
||||||
|
ret = sas_ata_init(child);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
rphy = sas_end_device_alloc(phy->port);
|
||||||
|
if (!rphy)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
rphy->identify.phy_identifier = phy_id;
|
||||||
|
child->rphy = rphy;
|
||||||
|
get_device(&rphy->dev);
|
||||||
|
|
||||||
|
list_add_tail(&child->disco_list_node, &parent->port->disco_list);
|
||||||
|
|
||||||
|
ret = sas_discover_sata(child);
|
||||||
|
if (ret) {
|
||||||
|
pr_notice("sas_discover_sata() for device %16llx at %016llx:%02d returned 0x%x\n",
|
||||||
|
SAS_ADDR(child->sas_addr),
|
||||||
|
SAS_ADDR(parent->sas_addr), phy_id, ret);
|
||||||
|
sas_rphy_free(child->rphy);
|
||||||
|
list_del(&child->disco_list_node);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void sas_ata_flush_pm_eh(struct asd_sas_port *port, const char *func)
|
static void sas_ata_flush_pm_eh(struct asd_sas_port *port, const char *func)
|
||||||
{
|
{
|
||||||
struct domain_device *dev, *n;
|
struct domain_device *dev, *n;
|
||||||
|
@ -785,61 +785,11 @@ static struct domain_device *sas_ex_discover_end_dev(
|
|||||||
sas_ex_get_linkrate(parent, child, phy);
|
sas_ex_get_linkrate(parent, child, phy);
|
||||||
sas_device_set_phy(child, phy->port);
|
sas_device_set_phy(child, phy->port);
|
||||||
|
|
||||||
#ifdef CONFIG_SCSI_SAS_ATA
|
|
||||||
if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) {
|
if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) {
|
||||||
if (child->linkrate > parent->min_linkrate) {
|
res = sas_ata_add_dev(parent, phy, child, phy_id);
|
||||||
struct sas_phy *cphy = child->phy;
|
|
||||||
enum sas_linkrate min_prate = cphy->minimum_linkrate,
|
|
||||||
parent_min_lrate = parent->min_linkrate,
|
|
||||||
min_linkrate = (min_prate > parent_min_lrate) ?
|
|
||||||
parent_min_lrate : 0;
|
|
||||||
struct sas_phy_linkrates rates = {
|
|
||||||
.maximum_linkrate = parent->min_linkrate,
|
|
||||||
.minimum_linkrate = min_linkrate,
|
|
||||||
};
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
pr_notice("ex %016llx phy%02d SATA device linkrate > min pathway connection rate, attempting to lower device linkrate\n",
|
|
||||||
SAS_ADDR(child->sas_addr), phy_id);
|
|
||||||
ret = sas_smp_phy_control(parent, phy_id,
|
|
||||||
PHY_FUNC_LINK_RESET, &rates);
|
|
||||||
if (ret) {
|
|
||||||
pr_err("ex %016llx phy%02d SATA device could not set linkrate (%d)\n",
|
|
||||||
SAS_ADDR(child->sas_addr), phy_id, ret);
|
|
||||||
goto out_free;
|
|
||||||
}
|
|
||||||
pr_notice("ex %016llx phy%02d SATA device set linkrate successfully\n",
|
|
||||||
SAS_ADDR(child->sas_addr), phy_id);
|
|
||||||
child->linkrate = child->min_linkrate;
|
|
||||||
}
|
|
||||||
res = sas_get_ata_info(child, phy);
|
|
||||||
if (res)
|
if (res)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
} else if (phy->attached_tproto & SAS_PROTOCOL_SSP) {
|
||||||
sas_init_dev(child);
|
|
||||||
res = sas_ata_init(child);
|
|
||||||
if (res)
|
|
||||||
goto out_free;
|
|
||||||
rphy = sas_end_device_alloc(phy->port);
|
|
||||||
if (!rphy)
|
|
||||||
goto out_free;
|
|
||||||
rphy->identify.phy_identifier = phy_id;
|
|
||||||
|
|
||||||
child->rphy = rphy;
|
|
||||||
get_device(&rphy->dev);
|
|
||||||
|
|
||||||
list_add_tail(&child->disco_list_node, &parent->port->disco_list);
|
|
||||||
|
|
||||||
res = sas_discover_sata(child);
|
|
||||||
if (res) {
|
|
||||||
pr_notice("sas_discover_sata() for device %16llx at %016llx:%02d returned 0x%x\n",
|
|
||||||
SAS_ADDR(child->sas_addr),
|
|
||||||
SAS_ADDR(parent->sas_addr), phy_id, res);
|
|
||||||
goto out_list_del;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if (phy->attached_tproto & SAS_PROTOCOL_SSP) {
|
|
||||||
child->dev_type = SAS_END_DEVICE;
|
child->dev_type = SAS_END_DEVICE;
|
||||||
rphy = sas_end_device_alloc(phy->port);
|
rphy = sas_end_device_alloc(phy->port);
|
||||||
/* FIXME: error handling */
|
/* FIXME: error handling */
|
||||||
|
@ -37,6 +37,8 @@ int sas_execute_ata_cmd(struct domain_device *device, u8 *fis,
|
|||||||
int force_phy_id);
|
int force_phy_id);
|
||||||
int smp_ata_check_ready_type(struct ata_link *link);
|
int smp_ata_check_ready_type(struct ata_link *link);
|
||||||
int sas_discover_sata(struct domain_device *dev);
|
int sas_discover_sata(struct domain_device *dev);
|
||||||
|
int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
|
||||||
|
struct domain_device *child, int phy_id);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline void sas_ata_disabled_notice(void)
|
static inline void sas_ata_disabled_notice(void)
|
||||||
@ -114,6 +116,13 @@ static inline int sas_discover_sata(struct domain_device *dev)
|
|||||||
sas_ata_disabled_notice();
|
sas_ata_disabled_notice();
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int sas_ata_add_dev(struct domain_device *parent, struct ex_phy *phy,
|
||||||
|
struct domain_device *child, int phy_id)
|
||||||
|
{
|
||||||
|
sas_ata_disabled_notice();
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _SAS_ATA_H_ */
|
#endif /* _SAS_ATA_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user