基础阅读:主机适配器怎么加入系统的文章《深入浅出SCSI子系统(四)添加适配器到系统》
pm8001_init
主要做工作队列申请,Sas layer 回调函数注册,pci驱动注册到设备模型中。
drivers/scsi/pm8001/pm8001_init.c 接口代码赏析:
/**
* pm8001_init - initialize scsi transport template
*/
static int __init pm8001_init(void)
{
int rc = -ENOMEM;
pm8001_wq = alloc_workqueue("pm80xx", 0, 0);
if (!pm8001_wq)
goto err;
pm8001_id = 0;
pm8001_stt = sas_domain_attach_transport(&pm8001_transport_ops);
if (!pm8001_stt)
goto err_wq;
rc = pci_register_driver(&pm8001_pci_driver);
if (rc)
goto err_tp;
return 0;
err_tp:
sas_release_transport(pm8001_stt);
err_wq:
destroy_workqueue(pm8001_wq);
err:
return rc;
}
1.alloc_workqueue
创建一个workqueue, 中间参数为0,默认配置
struct workqueue_struct *pm8001_wq;
pm8001_wq = alloc_workqueue("pm80xx", 0, 0);
使用的地方:调用工作处理函数pm8001_work_fn
drivers/scsi/pm8001/pm8001_hwi.c
int pm8001_handle_event(struct pm8001_hba_info *pm8001_ha, void *data,
int handler)
{
struct pm8001_work *pw;
int ret = 0;
pw = kmalloc(sizeof(struct pm8001_work), GFP_ATOMIC);
if (pw) {
pw->pm8001_ha = pm8001_ha;
pw->data = data;
pw->handler = handler;
INIT_WORK(&pw->work, pm8001_work_fn);
queue_work(pm8001_wq, &pw->work);
} else
ret = -ENOMEM;
return ret;
}