07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

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 咱们前

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!