Linux 下wifi 驱动开发—— SDIO接口WiFi驱动浅析.docx
1.inux下wifi驱动开发(三)SDIO接口WiFi驱动浅析SDlO-Wifi极块是格I-SDIO接口的符合Wifi无废网络标准的微入式粒块,内JR无线网络协议IEEE802.11由议栈以及TCRlP办议栈.健济实现用户主平台数据通过SDKD:I到无线网络之间的整辄SDlCH!有恰轮救据快,兼存SD.MMC接I】琼特.点,对于SDlo接口的Wtn,首先,它是一个SdiO的卡的设符.然后典备了WiG的功健,所以,注册的时候还是先以sdi。的卡的设番去注册的.然后检测到卡之后就要蓼动他的VVifi功能了.iV.feHISdio的协议,通过发吩咐和致据束限制的.F面丸谕沾回Bi卜SDlO的相关学同r一、S3。相关若破学向IW1、SDIOSDIo故名思义,就是SD的I/O技口(interface)的一照,不过这样说明可能还丁点抽像,更具体的说明.SDKl它是记忆卡的标准,但是现在也可以把SD家来插上-S外IB授口运用,这样的技术使aSDio.所以SDK)4号是朴相当用纯的技术,透过SO的l,O按却;fc连接外罂外Hb并只透过SD上的I,。数据接位与这些外IK传输数据.而I1.SD用会金倒也推出很完祭的SDIOstack浜动程序,使得SDIO外IH(我们称为SDIO卡>的开发与应用变祖相当热门。现在已经有特别多的手机或是持装五都支拈SOlO的功能(SD杯准贩本就是针对mobiledevice而制定),而H很多SDIO外图也都放开发出来,让手机外接外阴更加荷洁,并且开发上更有弹性(不须要内建外围).目前常见的SDIO外IH<SDK)卡)IfiWi-Ficard(无线网将卡-CMOSsensorcard(照相模块)GPScard GSM.lGPRSmodemcard BluetthcardSDK)的应用将是格来嵌入式系统4iR要的接【】技术之一,井Il也会取代HOTGPIO式的SPI接2、SDIOAikSDiO总线和USB总统类似.SDQ也有两端.其中一端是HOST端.W端足device端,全H的信部是由HOSTMI发送蛤咐HB先的,DeviceIt可以相互JaftC1.K信+H0$T给OEVlCE的时神辅号,每个时钟周期传珀个吩附,CMD信明C向的俏叽C干传送C»H和反应.DAT0-DAT3俏:四条用于传送的吹伽线.VDD俏号:电海伯号.VSS1.VSS2:电源地伯号.3、SDIOIMMUItS方法:K个定时检查或按中断检,使件:Ikuigpgio(日NTl8)用于SDk检测GPGlO为高电平G没行挂入SDKGPGlo为低电平固插入/SDK4,SDlO*附SDK)总我上都是HOST端发起为求,然后DEVICE瑞网底M求.Sdk)功由由6个字节织成.a-COmmand:用起先传输的吩的,是由HOST端发i?DEVICE端的.其中吩咐是通过CMD伯号线传送的.b-Response:I-I½DEVICE返回的HOST的吩怀作为CommandWl"l,也是通过CMD线传送的.C-Data:敬粼型双向的传送的.可以设列为1线校式.也可以设设为4找模式.数据是通过DATOQAT3倒当找传箱的.SDtO的毋次煤作蚓6由HOST在CMD及上发起一个CMD.对于有的CMD.DEVICE须要返回ReSPOnSe.仃的则不缴:要.对F读吩呐.首先HOSTADEVICE发送助时,紧接莉DEVICE会一回个援.号,此时.当HOST收到何府的烈r.'.会杉敬粼放在4位的数掂找上.在传送攻榭的同时会跟前茄CRC校验码.当链个读传送完毕后,HOST会野次发送个吩咐.通知DEVICE操作完毕.DEVlCE同时会返网个啊应.对于写盼学计先HoST会向DEVICE发送物机J®着DEVICE会i铀手倡号,此时.“1HOST收到M位的粗F信号后.会将IkM放在4(4的Kt掘我上.在传送数屈的同时会跟同芹CRC投S码.当隹个与传送完毕后.HoST会再次发送个吩咐.通知DEVICE操作完中.DEVlCE同时会这回个科应.二、SDI。接口现动前面讲到.SDlO接口的w«i.首先.它是个sdi。的卡的设省.备了Wifi的功能,所以SDIOIirI的WiFi明动就是在所芈动外面套上了个SDlO郭动的外壳.SDIO期动仍I口符合七备罢动的分Ji与分JN星也役备出动层(wifi-各)I核心层(向上向下供应接口)II:机郭动层(实现SDKD架动)卜面先分析SDlO按I1!Jh功的实现,R几个,Il变的数据拮构用了核心层。生机用动星的数据交换处现).1,lnclude1u×11mc.host.hSIrUClmmCJTOSl用朱筠述卡JHiWittstructmmc_card用来描法卡structmmcdriver用来描述mmcf÷*jstructSdioJunc用来描述功能i2%Structmmc.host,ops用来描述F1«制!S携作接【】出数功傕,用从把机以制器层向COrC层注册操作也致,从而将COrC层与具体的主机限制/隔肉.也就是说core要搽作主机限制毋,就用这个OPS当中给的函数指仔探作,不能留/用具体上限制搭的沿11.HOST层杂动分析在前面的东列文章中1.inUXSOI:曲动开发(:)SO1:*:力分析HOSTRff具体阑逑,下面只淌洁回顾一下一些戒要函数处理1、MWHostXCtt这里.修整的是S3C24XX的HOSTlR功程序,1driversmmcosVs3cmci.cStaticStructPmfOrf1.drhfers3<nci-drlver三(fU2.driver"F"W1,,/名。和t'f;二备ZZ中的对块.hTM>rTHlSJlaMXF,.prs$3cfici_p_ops,.ldtabic53oici_drlvcr_ids.p11>eMS"»k£_吟K,.一2务。,以门南合.renove«_devexlt_p(s3crl-rerove),10.shutdo*11-s3©ici_shutdoMnt;1213. s3<<ci-probe(strvctPlateEj>evkepdev)W.(XS./.16. structWKJXistr;17. me-w*c-alloc-hst(sizeof(structs3cnci-bost),4pdev->dev);,寸Tmh8t体18.19. /26. )21.22. 注仪中断杜卬汨软GaIcIrq%处"教出也发AW引起的汴抑中的,23. r4>qu¾tjrq(host->1rq,(3cncl.lrq,DftIVERJUv<E,host)注M中所勉理K败63ow1.iN24.25. ,注H中断处FU3cmf、N_cd从%来处FJ然摆处;阳的4俅.中卧触发的影火为I.升前、卜。沿鞋我/26. rcque5t-irq(host->irq-cdjHCrKi_irq_cd,IRQFJRlGGE氏RlSlNGIIRQFTKlGGERA1.Ilh6,WIVtRNAME.host)27.2Sfwcadd_host(oc);/initialisehosthardware卜州coreii,host>29. ->dcvlco_ddd(&host->class_dcv);.(<_t»j5_t>p<3.->m<-strt-bost(ho);",)EChost31.32. H*Cdriversshouldcllthist*e11theydetectacardhasbeeninsertedorroved.沱裳Sd卡是吉城上豉稠i!33. ->11nc-,dctcct-chngc(host,);34.35. SchedulcdelayedworkintheWCworkqueu国度H”工作队列/36. rfic_schcdulc_dclayed_iK)rk(ahost>dctcct-delay);搜寻host->detected得到以下值息:drfvrsmm0,re,host.c)1. NIT-D1.AY1.0.M0RK(ah5t->detect,mc-rescan>2.3. <M*c_r¢$can(structh»ork_$trxictMvk)4. ->mc_bu$_put(hO5t);/<drd从busM故它为,。找内川5.6. mWWmehn联濯岂古被占用,力加ECRUX黑段如被占用,爨么hocUlr-1;告用为。7. *殁如为1,那么幺在Glk(I)M环中调用schedule切拉出自上,与'用r或器的蝶性先成之后,依freJrTNSQhxU)的叼蚁,含点落登记到净存认列&hsJM中的N他和MmMC点以黑衿的此阴根8. /9. nr»c_clain_h»st(hO5t);10. EJreS5_tryEhos1.r0x<freqsi,host->f.nin)t11.12. staticintrrrescan_try_freq(structmehosthot,IInSiKnedfreq)13(14. 315. Order'smPortgK:pro>e$010,then$0,thenft*C/16. if(wc-attach-5dio(host)17. returne;18. if(!iwc_attach_$d(hott>)19. return6;2.if(!»wc_attach_mc(ho5t)21. return;22. 23)24.25. «wc_attach_sdlo(structm<_ho$tBho$t>sdiot:lI-26. ->rwc_attdch_bu5(hott,&rfK_$dlo_op$);27.28. "c"d'J总筑卜的制动匹死,双柳始化"rd”29. mr>c_5dlo_lnit_card(bost,host>ocr,NU1.1.,);30. ->ord«EJaIIOC_crd(ho$t,NUll)jHt*cardrM,r,31. wc-5et.bus-node(host,WC_BU5OOt_PUSW1.1.);/i2TmebusIfJEC32.33. struct5dlo_func5dio-ur(SDI0-MAX-FUWCS);/SDXOfunctions(devices)34.35. u11<<host->card,11);36. >funcsdio-alloc-unc(card);/tstructsdio-<un,”。:”2备;。怆体37. iwc_io_rw_dircct();38. card->llounc(fn-IJ-fun.39.4.nmc_add_card(host->card);tf>',¾dor?i!>.M»c_bus_typcs£,41.sdlo-ddunc(ho$t->card->dlo_fuc1J);杉WioH:0不:“fIWio_tHl1.tyKS总汴这里泵列斯数调用在Iim的SD驱动蚊怅中已的州述过r.不再具体阐述2、SDIO设冬的m当场拔SDlO设备,分触发中断通知到CPlh然后执行卡检/I中断处理函数在这个中断服务函数中,mmc_detect_change->mmc_schedute_delayed_work(&ho5t-><ietecl.delay),lNIT_DE1.AYED_WORK(&bost->detect,(Tyncescan)会谓收mmcescan用数延时调度作队列.这样也会触发SDIo设备的初始化菰理,松测到仃效的SDlOiQ备后,会将它注册到系统中去.1. staticlrqreturn-ts3cfK13N><d(i11tf11bvoidadev.W)2. 3. structs3cnci-b5thost-(structs3c11ci-host)dcv-id;EJdete<j<hacjje(bost>mc,ms«c$_to_j1ff1es(5W);returnXRQ_HAKD1.ED;三、Wifi抬动分解析MH生动的通用的软件架构1,分为两部分,上面为1:机用*动.卜面是我们之就所说的HrmWarC2 .其中冏件1分的土要工作是:内为天&接殳和发送W米的拇是802.”他的博,而主机接受和传送出来的数据部必需是802,3WXl,所以必需由firmware来负员802.3的偏和80211糊之间的传换3 .当天税收到数刖,并俄Mmwar。处理好后会放在一个bu"er*R,并产生一个中新,主机在收到中断后就2:读这个butter.SDO设备的版由SdioMriVer结构体定义,Sdio_tInVer其实是UHer的时装.通过sdio_register_driver,j½4SDlO议备第,5加我迸内核K实就是挂收到SdIoJ)us_type总&卜&1、慢备网动的注与DaEDfiversl11et'welessllibertas.lif-sdio.c1. SDIOfunctiondevicedriver*/2.3. structsdlo-drivcr.<hatb11a11e;二林幺5. conststructsdio-device.idid-table;"各*虱ID6. Int(probc)(structsdio_unc.conststruct5dlo_dcvicc_id);1.Tm37. void(re<o)(struct5dlo_func>8. Strvctevl<e.dri<rdrv;91;下a是具体蠹敷的编充,if-sdio.c3.structSdijdrIerH_$dlo_drlver"(11. .nfe«-IibertdSeSdio",12. .id.tableif_5dio-idsi用f设番。阴动的11纪13. -probe-if-sdloj>robo,14. .rerov9-IJWegVQ,15. .drv>9.pr-iif-sdio-pn-ops,0)U-);设台注册请数(cpp)”00t*n1.2. sdio-rcgi5tcr-drivcrregisterafunctiondriver3drv:SDIOfu<tlcedriver4. /5.6. Intsdlo_rcgistcr_drlvcr(structsdlo_drivcrdrv)?(8.drv>drv.11artedrv->nare;9. drv>drv.bus-45dio_bus_typo;/i,H'*driverbuslj5dlo_bus_typo10. returndriwr-rglst¢r<idrv->drv);U.)©线的数1.2.staticstructbus_typctdlo_bus_typc.naf*-wsdio,3.dev-8ttrs三s<1io-dev.attrs,4.natch-sdio-bus-11atchi5.ucvcnt-sdlo_bus_ucvent.6.probe-sdlo_bus_pro6e.7.renove«*ic_bu5_regve.8.PG-SOIO.P,OPS.PTR,9.;fflfi:设名或齐业功注JH到系统中的过程中,都会调用相包bus上的匹配函数来进行匹协作适的动或谷Q.对于sdo设备的典配金Ihsdlo_bus_matchf«sdio_bus_probe函数来完成staticint5dio-bus-fiatch(structdevicedev,structdevice-driverdrv)3. structsdiouncunc-dcv_to_5dio_func(dcv);4. structsdio_drlver3rvto_$dlo_driver(drv);5. If(idio-atch-<levice(fufKjdrv)6. return1;7.a.Zturn0;910.11. staticconststructsdio_<5cvicc_ldtdio_fiatch_dcvlcc(structsdlo-fncfuncr12. struct$dlo_driversdrv)8. 14. conststructsdio.device-idids;15. Ids-sdrv<>id_tablo;16.17. if(sdio_net<h-one(fun<,Ws)18. returnids;19.由以上腿比过程来行,通过匹配idJabJe和Sa(IdnVeri2备胆,劝中id,来因协作道的奖励或设备,.M终会调用.RgeMtt来完成相关操作.2、tt_sdlo_probeS*,flflsdoN担入了之后就会用用lf_sdio_probe,而当卡祓移除£就公词用I1.SdIojemove硬件层产而光fi吓I1.Sdl。.Probet总数,I1.sdiojxob函数上要做门呵件犷StNkstructsdic,rl*rif-sdlo-driver«(.11are"IibUE-.id,tabl<-/HII之行HWy*'.rotx*-IjSdlJProb明5.rewcif-sdio-renove,6.drv-(7.ps-ftlf_$dio_pr_op5,8.9.l.U.b);12.1/;1."、if_sdiocard”:J工11.structif-sdio-cardcard;14.structH_sdlo_packot-packet;/sdioj15.16.structmc_ho$thostfunc->card>hst;17.U育女足皆有指定的财皖寄存道AmC18./_sdio_CArd中10.for(1-e;i<func->card>nun_lnfo;1)(20.Sf(ssonf(furx-><nl>ihfoi,21.22.”802.11SDIOID:%xSMI)-1>23.在出服Ii打片送珏*卦我不i用的MrVCl8686的&备24.case”01_836:2S.26.27.card->scratch,rcIF-SOIO-SCRATCH;2S./fiHtsdio的匚作M列29.CardWorkqueveCreatJMOrkQUeUe'HbeEudio,);3.调用下面的函数31.32.31.IMlT-MORK(lcrd->p<ketorker,“_Wio_hosJto_c3rd_worfc");34.主机到卡的工伸队开35.36staticvoidif_$dlo_h&$t_to_CArd_work*r(ttmctv»or*_$tru<twor)37.Checkifucsupportthiscard培徉处111所N片的卜的关空/38./ttffl>5W8686_M1X.”CdB686.bln39.fw.tble中的H0Ml.8686,sd866.helper.binw,sd8686.bl11,40.for(i0;1<AaMJSIZfdouble);i)41.if(card->f>del*fw-table(i).ncel)42.break;43.)44.45.46.NOOEI_8688,-Mbertssd86,helpe<,binM,-UKre"s谢热bin”47.中他个host48.Sdi"181IhOSt(fUM);49. /(%Sdlo的功籍寄存代5.ret-sdio_cnablc_func(func);51. if(r¢t)52. gotorelease;5J.54. 2/Ipiflidio的,吩m是事务的时向执行刎Ii55. ret«lio_cUln_lrq(func,if_tdio_lnxerrupt);ret-if-sdio-card.to.h5t(car<l);Mk到IU二卅57. ret-l<_sdio_handlc_data(card,card>bu<<cr4,chunk4);,接IZKM附处广58. rotl*_«Ho_h*>dl¢_cnd(card,crd>bu-。r4,chunk-4);也八IitJwZN'M59. ret三H_dlo_har>dle_event(card,<rd->buff<r%chunk-4);/巴申肃的I/60.61.62尊UI网络络构体安样设备并注册63priv-lbt_add_card(card,Afunc>dev);64.65. 女"EVwrnM设备并注明66. m5cv-lbs_cg_allocdr»dcv);67. 862无拄MftUIH1的检件咕数典veev->wlyVdPhy_MW,lbs_”的211_ops,¼Ueof(strictlbs.privte);69.7.71. ”安样网络设备是整个M珞端分操作的72. 的核心”尚体73. dev-lloc-nctdcv(e,*Ml0nXd*,cthor_sctup);:M化¾dan的见并74. dev->lcccse211_ptrHdcv;75. gv>eljr!v-riv;76. 设/设备的物理地址77. SET.NEIDEVj)EV(dev.dndev);78. 3cv>nctdcv-dev;79. prlv>d¢v-dev;80. 初帕化N络议备85.4t(Ifi81. dcv>nctdcv-ps-aibs_nctdc'_op5;/外4络气分的Il悴的注fl82. dev->wtchdog-tIjico-5HZ;83. d¢v->÷thtool-ops-aib$_thtool_ops;84. dev->flacs|«I“_BROADCASTIFF.HJ1.T1CAST;!橹女匕M85.86.87.88. 个内核纹理朱竹”这个M珞自笈的执发您事务的处JTI:的放比伸做卅时的处PI89. priv>fai11,thred*kthread.r11(lb5.tbread,dev,"lb¾rain");00."初#化相关的1.性以外Ol-prlv>¼ork-trwd-CrMtQ.Gnglehz;IdrorICqgUIbjgrkor");92INIT_W0K<privfKSt.workllt>S_set_ro$t_v»orter);93. privH<ol.criteriaEHS,RE>WE-kAK1.UP;94. priv>ol-gplo-<f;95. priv->uol_gap-20;96. priv->eh$_r<nove-$upporte(j三true;97.98.99. &置抬交It1W./WttI泗发送数据NK101. priv>hw-host-to-card*if-三dio-b5t-to-,card;12.priv->cntcr_dccp_51ccp-l<_sdio_cntcr_dccp_slccp;103.PriV>QXfj80p_SlSp-SJWiCfXlJd8p_£10”;1M,priv->reset_de«».$leep_viakeup三i<-dlo.reset-de<,slee-weup;10S.sdio-claim-host(func);16.107.,塔劝F设尔18.retlbs-SUrt-Cr<J(prlv);IW.if(Ib5-cfj,regi5ter(priv)ll.111. e一ZglStQr_伙MV(PrN>8v);112. err三y1st©JnerdeVke(dev);113.114.115. /HIiirjwHi设5*功功能116. 明络出在憔作的父幺版效117. staticcontstruct11et-<Jevice-opslbs-netdev-op5*(1.1. .djopQclb$_dev_op«n,/11*119. .rxJo-stop«lbs.eth.stop,止120. .ndo-start-xnitIb5Jnrdqtartjcfiit.五,.二七121. .ndo_sct_nac_addrcs5-lbs_sot_nac_3ddro55,门j/c,生t122. .11do-t×,tln>ut-ltH-tx-tlfWvt,力123. .f>do_骏JeUltkasJllst«IbS_3et_rultk3SJUst,/MttI址124. .r>do-chage-11tueth-cha11e-mtuj心KWln儿125. .ndo_valldatc_addrcth_valldatc_a<Mrr/】川也JlnH!二产3、数的接收Ji过中断的方式和联M络设备接收数据的匕公斤法及由中断引发设备的中断处理函数.中断处理函数推断中断的英皇.假如为接收中断幌读取接收到的故掂.安井SkJxJf结构和数粼缓冲K并将接收的钛箱更制到数箱级存区.并沟用netif_rxO««t4»sk_bUff传递给上层出议.搜7if_sdiojn1errupt.可知道它是在.if_sd»o.c文件中if_sd»o_ProbeO由数中sd®_claimjrq(func.if_sdio_interrupt).func->gJIandler=if_sdio_interrupt.当s3cmcijrq中断处理雨数的S3C2410_SDIIK4SK_SDIOIRO中断破触发时将调用if_sdiOjnterrUp(O函数.进行接收故KstaticVOidif-sdio-,interrpt(structsdio.funcfunc)3. rt-/从无线网I角口。我Z义及I.报联"4. «:W&门上的数先,成到Srd的buff"中5. ret-sdio_»a<lsb(card->func,Crd>buffcrzcard->ioport/chunk);6. 1.在这W方由处理中新ft27switch(type)(处MSd<1taeventffJ-R8. caseMVMS.CMD:9. retif-,5dio-ha11dle-cd(card,card->buffer4,chunk-4);如t'川*的小中Ittl.K(rot)11.gotoout;12. break;13. caseMVnSJM1:14. rot-if_sdlo_handlc_data<card,card->t>ufcr4,chunk4);/,''/"'tH,;,>':15. “(CQt)16. gotoout;17. break;18. caseKVKS_EVEMT:19. ret-tf_sdlo_handInvent(card,ord>bu*er*4,chunk-4)j,l,iHH20.21. 论发包俯近日22. Ib5_proco55_rxcd_packct(card->prlvtskb);2324. 俯S*中Ift.我杷5kb送个包代交法由iZM送个嫉皎兄25. 眇说以世应的netif-rx(5kb)26. U(in-intcrrut(>)27. netif-rx<skb);松女绐缉28.29.30. 24米洛I:,侑致"cardfflbufK>rI31. 21$dlo_r*ad$b(card>func,crd>buf*r,card->loort,chunk);32. 诜娘4/1的地址,教M$33i11tsdio,rcadsb(5tructidio_funcfc,voiddst,unsignedi11taddrji11tcount)34.35returnd1o_lo_rm_«xt_h¢1r(funci%addr,dst,count);36.37. retmc-Bio_nf_extended(func->card/YriyfUnC>1111,Dddr,increaddr,buf,blocks,func>cur-blksizc);38. cod.rg-write?8Geeaae:eaeeae;39.40. Maitforrequest41. mc-*it-lor-rcq(card>hst,&vrq);42.4J.起融答EJStarJregSt(host,Crq);44Mit-for-co<plction(corplete);45.46. hostos>>request(ho(tfnrq);4、99(cpp).*a.c<e<r*1. 1PUieiI*jqucUJXnlto将H黑父号睥络大报【I以#4络依ImieiIc。WCSCQ中侑注明而软侑融W发送的教2. Intdv_qu9u«_xnlt(structSlCjXJ开s*b>3.4. if(!netif.tx_qucue_stopp«l(txq)5. _thU-cu-lnc(xmit-rcur51on);6. 世益欢"起先发送?r<三dev-hBrd-strt.×wit(sXb,de,txq);8. 则HWim络中的叩59.1叽rc三ops->rxk),strtjmlt($kb,<>ev);11.12. dcv>nctdcv-ps-41bs_nctdcv_op5;/i7ir.A11<t13.14. 处Pfs<HoUear皎蛔加内核的数IEndlCAhrY"至线次15. privxiain_thre«d-kthread-run(lb5-thrad,dev.*Ibirain);16.17. /调用ho$t_to_card3Pif-sdlo.ca11j-to-h5t泊18. Intet-priv->FM-hoftt,to-<ard<pelvtRVW5_DATfprlv->t»c_p¢nding_bufrrlv->tx,pndlng-ln);19. 为什么是if_sdlo_to_hO5t懦m>i(prb由口中左乂ft28. 设置主机发送欧JK到上21. prlv->hM_ho$t_to_crd-1_sdlo_bo$t-to-card;22.23. staticIntif_5dlo_bo5t_to_card(stri>ctlbseprivateprlvtuBtype,u8bufru!611b>24. 杷b<K中的数线copySdio也中,和“WioIntSMi打处”25. ne«py(packet->buffer%buf,nb);26. 创it工作队到27. qucuc_Mork(card->workqucu.Acard->packct_uorkcr);28. 桁始化队列29INIT_W(W»K(8<r(l->pMket_M0rker,if_dlo_ho$t_to_<rd_worter);30.31. 。的U数IK32. retWIowfgSb(CrdNunc,crd->Ioport,pA<k¢t->bu*fr,packet>nb);33. 展门34. retme_io.rw_extended(func->cardzwrite,func->11ufi/oddrrincr-oddr,buf,blocks,func>cur-blksl2c>3536373839we41424J444$4647/waitforrequestm<_wait_for_rq(car<l->ho$t,Rnrq);crqKonjdataAco<vlete;nrq>donc-imc_nait_donc;Ej穴"jequQSt(hxt,11rq);完成导恬故奴丛我>wit-forco11pleti(8rcorplete);host->o>s>>re<>est(host,erq);咒党就耒发送教抠5、力s&ok拔除时.集动仑词用诊的数.完成相鹿操作.如郁故A.仃的贾泡.禁止func功能函数.煤放host.if_sdio_ro¥¢(structsdlouncunc>->lbs.stcp.Crd(<111->priv);lbs_rerove_card(cdrd->priv>.>kthread_$top(priv->nai-thread);+'V-,lbsr¢<.<1pter(priv);lb5.cfgfree(priv);frcc-nctdcvdcv);10. flus-orkqueue(Cdrd-Mwrkqueue);CClR的11. de5troy_