基础阅读:如何将系统文章添加到主机适配器中?SCSI子系统(4)向系统添加适配器
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; }