Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
315 行,scsi_report_device_reset(),drivers/scsi/scsi_error.c 中定义的.这个函数scsi core 那边<br />
要求我们调用的,我们身不由己.然而关于这个函数的细节,只能说,世界太大,我们只在乎我们需要在乎的冬<br />
冬,其她的我们无暇顾及.我们只想在960 万平方千米的一个角落里,静静的为自己的理想打拼,为自己寻找<br />
一份荣耀.usb 是我们care 的,而scsi 的核心,我们是不想去深究的,只有写scsi 核心的同志们会在乎.江<br />
湖<br />
中流传这么一句话:女孩在乎的是下半生的幸福,男孩关注的是下半身的幸福.同样,Linux 世界里,每一个人<br />
在乎的冬冬是不一样的……言归正传,咱们是不需要关系这个函数怎么定义的,但是咱们需要知道什么时候<br />
会调用她,调用她干嘛?需要传递什么参数?首先,要传递三个参数,第一个,<strong>Scsi</strong>_Host 指针,一块u 盘就有<br />
一<br />
个<strong>Scsi</strong>_Host,然后第二个参数,channel,然后第三个参数target,描述scsi 设备位置的四个参数就三缺一<br />
了,缺的就是LUN,因为一个device 都reset 那么就不会管她上面有几个LUN了,有几个都一起给她reset.<br />
那么调用这个函数的目的是什么?告诉scsi 核心,俺观察到某个设备reset 了.至于scsi 核心会如何处理<br />
呢,<br />
那咱管不着,也懒得去管.总而言之,言而总之,统而言之,言而统之,咱们的职责是在发现了一个设备reset<br />
之<br />
后立刻向上级汇报.<br />
187<br />
US_FL_SCM_MULT_TARG 这个flag,咱们也提过好几次,她代表的是支持多个target,这是设备本身的<br />
属性,不是咱们的代码愣给设备设的.对于这种设备,scsi_report_device_reset()就会被多调用几次,针对<br />
每一个target 要report 一次.<br />
结束了scsi_report_device_reset(),自然又回到了usb_stor_reset_common(),1123 行,1124 行<br />
设置一个flag,清除一个flag,设置的是US_FLIDX_RESETTING,清除的是US_FLIDX_ABORTING,关<br />
于这两个flag,一会咱们结合command_abort()来讲.<br />
1131 行,usb_stor_control_msg()被调用,再一次看到这个函数想必大家已经不再陌生了吧.她就是发<br />
送一个控制命令,其实我们已经很久没有讲控制传输了.这里结合参数来看看传送的什么命令.首先,us 还是<br />
那个us,不再多说.然后,pipe 是us->send_ctrl_pipe,就是发送控制管道.然后request,requesttype 这<br />
些都是在调用usb_stor_reset_common()的时候传递进来的参数,在usb_stor_Bulk_reset()中可以<br />
看到,request 是US_BULK_RESET_REQUEST,requesttype 是USB_TYPE_CLASS |<br />
USB_RECIP_INTERFACE.<br />
US_BULK_RESET_REQUEST 在drivers/usb/storage/transport.h 中被设置为0xff,这是和usb<br />
mass storage class-Bulk Only transport 协议相对应的.该协议专门为Bulk-Only Mass Storage 设<br />
备定义了一个请求,即Reset.协议里说,this request is used to reset the mass storage device and<br />
its associated interface.协议中规定了,当usb host 要发送命令reset usb 设备的时候,需要通过发送<br />
控<br />
制管道发送一个请求,即前面提过的ctrlrequest,其格式如下图所示:<br />
其中bReques 这一位须设置为255(FFh),wValue 设置为0,w<strong>Index</strong> 设置为interface<br />
number,wLength 设置为0.(而我们这里也确实这样做了,w<strong>Index</strong> 被赋值为us->ifnum,和上次咱们调<br />
用usb_stor_control_msg 的时候传递的一样,显然interface 还是那个interface.江山会变,四季会变,<br />
咱们心中的interface 始终不变.)<br />
至于requesttype,和咱们在usb_stor_Bulk_max_lun()中讲的差不多,唯一的区别是控制数据传输方<br />
向,当时是device to host,现在是host to device,所以当时多了一个USB_DIR_IN,而现在没有写<br />
USB_DIR_OUT,原因很简单,USB_DIR_OUT 被定义为0,所以或不或她无所谓.<br />
嗯,酱紫,就完成了向设备发送reset 命令的任务.返回值小于0 就是出错了.<br />
没出错那么就1141 行,wait_event_interruptible_timeout()被调用.us->dev_reset_wait 咱们前