2024年5月11日发(作者:)

SCSI子系统驱动架构

2013-2-2

代码布局:

一、读写数据流:

drivers/scsi/scsi_lib.c

scsi_execute_req===>scsi_execute===>blk_execute_rq===>blk_execute_rq_nowait

错误恢复:

drivers/scsi/scsi_error.c

内核线程scsi_error_handler===>

二、初始化:(本文!)

--------------------------------------------------------------------------------------------------------------------

scsi高层(scsi磁盘)驱动:

1代码分布

2核心调用:

drivers/scsi/sd.c(这里以scsi disk设备为例)

同步执行部分:sd_probe

异步执行部分:sd_probe_async===>sd_revalidate_disk===>sd_spinup_disk

--------------------------------------------------------------------------------------------------------------------

scsi子系统核心初始化:

1代码分布

2核心调用:

scsi_init_queue();

scsi_init_procfs();

scsi_init_devinfo();

scsi_init_hosts();

scsi_init_sysctl();

scsi_sysfs_register();

scsi_netlink_init();

--------------------------------------------------------------------------------------------------------------------

scsi适配器驱动:

1代码分布

2核心调用:

drivers/scsi/hosts.c

1)、struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)

2)、scsi_add_host(struct Scsi_Host *host,struct device *dev)

===>scsi_add_host_with_dma(host, dev, dev)

int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev, struct device *dma_dev)

3)、scsi_scan_host===>do_scsi_scan_host===>scsi_scan_host_selected===>scsi_scan_channel

===>__scsi_scan_target===>scsi_probe_and_add_lun===>scsi_probe_lun

scsi_add_lun

1

代码骨架:

----------------------------------------------------------------------------------------------------------------------

scsi子系统核心初始化:

drivers/scsi/scsi.c:

static struct class shost_class = {

.name = "scsi_host",

.dev_release = scsi_host_cls_release,

};

static struct class sdev_class = {

.name = "scsi_device",

.dev_release = scsi_device_cls_release,

};

struct bus_type scsi_bus_type = {

.name = "scsi",

.match = scsi_bus_match,

.uevent = scsi_bus_uevent,

};

subsys_initcall(init_scsi)===>

static int __init init_scsi(void)

{

scsi_init_queue();

scsi_init_procfs();

scsi_init_devinfo();//

scsi_init_hosts();//

scsi_init_sysctl();

scsi_sysfs_register();//

scsi_netlink_init();

}

int scsi_init_hosts(void)

{

return class_register(&shost_class);

}

int scsi_sysfs_register(void)

{

int error;

error = bus_register(&scsi_bus_type);

if (!error) {

class_register(&sdev_class);

}

}

----------------------------------------------------------------------------------------------------------------------

scsi HBA驱动:(前端以dmx3191d

为例

static struct scsi_host_template dmx3191d_driver_template = {

.name = "Domex DMX3191D",

.queuecommand = NCR5380_queue_command,

2