mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-02 16:44:59 +00:00
scsi: hisi_sas: Initialise devices in .slave_alloc callback
Perform driver-specific SCSI device initialization in the designated SCSI midlayer callback instead of relying on the libsas "device found" callback. The SCSI midlayer .slave_alloc interface is called prior to sending any I/O to the device. Link: https://lore.kernel.org/r/1634041588-74824-2-git-send-email-john.garry@huawei.com Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com> Signed-off-by: John Garry <john.garry@huawei.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
d489f18ad1
commit
36c6b7613e
@ -649,6 +649,7 @@ extern int hisi_sas_probe(struct platform_device *pdev,
|
|||||||
extern int hisi_sas_remove(struct platform_device *pdev);
|
extern int hisi_sas_remove(struct platform_device *pdev);
|
||||||
|
|
||||||
extern int hisi_sas_slave_configure(struct scsi_device *sdev);
|
extern int hisi_sas_slave_configure(struct scsi_device *sdev);
|
||||||
|
extern int hisi_sas_slave_alloc(struct scsi_device *sdev);
|
||||||
extern int hisi_sas_scan_finished(struct Scsi_Host *shost, unsigned long time);
|
extern int hisi_sas_scan_finished(struct Scsi_Host *shost, unsigned long time);
|
||||||
extern void hisi_sas_scan_start(struct Scsi_Host *shost);
|
extern void hisi_sas_scan_start(struct Scsi_Host *shost);
|
||||||
extern int hisi_sas_host_reset(struct Scsi_Host *shost, int reset_type);
|
extern int hisi_sas_host_reset(struct Scsi_Host *shost, int reset_type);
|
||||||
|
@ -756,6 +756,20 @@ static int hisi_sas_init_device(struct domain_device *device)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int hisi_sas_slave_alloc(struct scsi_device *sdev)
|
||||||
|
{
|
||||||
|
struct domain_device *ddev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = sas_slave_alloc(sdev);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
ddev = sdev_to_domain_dev(sdev);
|
||||||
|
|
||||||
|
return hisi_sas_init_device(ddev);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(hisi_sas_slave_alloc);
|
||||||
|
|
||||||
static int hisi_sas_dev_found(struct domain_device *device)
|
static int hisi_sas_dev_found(struct domain_device *device)
|
||||||
{
|
{
|
||||||
struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
|
struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
|
||||||
@ -802,9 +816,6 @@ static int hisi_sas_dev_found(struct domain_device *device)
|
|||||||
dev_info(dev, "dev[%d:%x] found\n",
|
dev_info(dev, "dev[%d:%x] found\n",
|
||||||
sas_dev->device_id, sas_dev->dev_type);
|
sas_dev->device_id, sas_dev->dev_type);
|
||||||
|
|
||||||
rc = hisi_sas_init_device(device);
|
|
||||||
if (rc)
|
|
||||||
goto err_out;
|
|
||||||
sas_dev->dev_status = HISI_SAS_DEV_NORMAL;
|
sas_dev->dev_status = HISI_SAS_DEV_NORMAL;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1771,7 +1771,7 @@ static struct scsi_host_template sht_v1_hw = {
|
|||||||
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
|
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
|
||||||
.eh_device_reset_handler = sas_eh_device_reset_handler,
|
.eh_device_reset_handler = sas_eh_device_reset_handler,
|
||||||
.eh_target_reset_handler = sas_eh_target_reset_handler,
|
.eh_target_reset_handler = sas_eh_target_reset_handler,
|
||||||
.slave_alloc = sas_slave_alloc,
|
.slave_alloc = hisi_sas_slave_alloc,
|
||||||
.target_destroy = sas_target_destroy,
|
.target_destroy = sas_target_destroy,
|
||||||
.ioctl = sas_ioctl,
|
.ioctl = sas_ioctl,
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
|
@ -3584,7 +3584,7 @@ static struct scsi_host_template sht_v2_hw = {
|
|||||||
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
|
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
|
||||||
.eh_device_reset_handler = sas_eh_device_reset_handler,
|
.eh_device_reset_handler = sas_eh_device_reset_handler,
|
||||||
.eh_target_reset_handler = sas_eh_target_reset_handler,
|
.eh_target_reset_handler = sas_eh_target_reset_handler,
|
||||||
.slave_alloc = sas_slave_alloc,
|
.slave_alloc = hisi_sas_slave_alloc,
|
||||||
.target_destroy = sas_target_destroy,
|
.target_destroy = sas_target_destroy,
|
||||||
.ioctl = sas_ioctl,
|
.ioctl = sas_ioctl,
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
|
@ -3157,7 +3157,7 @@ static struct scsi_host_template sht_v3_hw = {
|
|||||||
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
|
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
|
||||||
.eh_device_reset_handler = sas_eh_device_reset_handler,
|
.eh_device_reset_handler = sas_eh_device_reset_handler,
|
||||||
.eh_target_reset_handler = sas_eh_target_reset_handler,
|
.eh_target_reset_handler = sas_eh_target_reset_handler,
|
||||||
.slave_alloc = sas_slave_alloc,
|
.slave_alloc = hisi_sas_slave_alloc,
|
||||||
.target_destroy = sas_target_destroy,
|
.target_destroy = sas_target_destroy,
|
||||||
.ioctl = sas_ioctl,
|
.ioctl = sas_ioctl,
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
|
Loading…
Reference in New Issue
Block a user