scsi 子系统是一个分层结构,总共分为三层
Upper leve:disk driver(linux/drivers/scsi/sd.c), taple driver(linux/drivers/scsi/st.c),cdrom driver(linux/drivers/scsi/sr.c),generic driver(linux/drivers/scsi/sg.c)
mid level的code在:linux/drivers/scsi/hosts.c ,linux/drivers/scsi/scsi.c,linux/drivers/scsi/scsi_lib.c,linux/drivers/scsi/scsi_error.c
Lower level:sas driver,iSCSI driver,bridage driver等
这里以最底层的host driver的实现为例。
sas/sata host驱动首先要在其probe函数中申请struct Scsi_Host *shost;
例如:
shost = scsi_host_alloc(&hisi_sas_sht, sizeof(*hisi_hba));
if (!shost) {
dev_err(dev, "scsi host alloc failed\n");
return NULL;
}
其次就是调用scsi_add_host 来增加host
rc = scsi_add_host(shost, &pdev->dev);
if (rc)
goto err_out_ha;
最后就是调用scsi_scan_host来scan 这个host上链接的硬盘
scsi_scan_host(shost);
这里的hisi_sas_sht的是一个struct scsi_host_template 类型,后续提供给scsi中间层使用
Upper leve:disk driver(linux/drivers/scsi/sd.c), taple driver(linux/drivers/scsi/st.c),cdrom driver(linux/drivers/scsi/sr.c),generic driver(linux/drivers/scsi/sg.c)
mid level的code在:linux/drivers/scsi/hosts.c ,linux/drivers/scsi/scsi.c,linux/drivers/scsi/scsi_lib.c,linux/drivers/scsi/scsi_error.c
Lower level:sas driver,iSCSI driver,bridage driver等
这里以最底层的host driver的实现为例。
sas/sata host驱动首先要在其probe函数中申请struct Scsi_Host *shost;
例如:
shost = scsi_host_alloc(&hisi_sas_sht, sizeof(*hisi_hba));
if (!shost) {
dev_err(dev, "scsi host alloc failed\n");
return NULL;
}
其次就是调用scsi_add_host 来增加host
rc = scsi_add_host(shost, &pdev->dev);
if (rc)
goto err_out_ha;
最后就是调用scsi_scan_host来scan 这个host上链接的硬盘
scsi_scan_host(shost);
这里的hisi_sas_sht的是一个struct scsi_host_template 类型,后续提供给scsi中间层使用