Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
您要从总线上来reset 设备,首先调用的是usb_lock_device_for_reset,这是usb 核心层的函数,来自<br />
drivers/usb/core/usb.c 中,成功执行就返回1 或者0,失败了就返回一个负的错误代码.295 行的<br />
usb_reset_device(),同样来自usb 核心层,drivers/usb/core/hub.c 中,是usb 核心层提供给咱们的<br />
用<br />
来重新初始化一个设备的函数.成功返回0,否则就返回负的错误代码.出错了就得调用<br />
usb_unlock_device 来释放锁.<br />
最后305 行,result 为0 才是返回成功,否则返回FAILED.<br />
190<br />
能看懂296 行,297 行吗?我们说了,usb_lock_device_for_reset 可以返回负数,可以返回1,可以返回<br />
0.返回负数的情况就是291 到293 行所做的事情,而对于usb_lock_device_for_reset 来说,它返回1<br />
表示我们在执行了usb_reset_device 之后要调用usb_unlock_device 来释放锁,而返回0 表示我们在<br />
执行了usb_reset_device 之后不需要调用usb_unlock_device 来释放锁.如果你对这些很好奇,那么你<br />
可以看一下usb core 的代码.特别是看一下关于两个宏的代码,USB_INTERFACE_BINDING 和<br />
USB_INTERFACE_BOUND.<br />
于是,我们就这样从这个bus_reset()函数打马而过了.<br />
最后我们来看command_abort().很显然这是一个错误处理函数, 她的职责很明确, 试图去中止当前的<br />
命令.同样来自drivers/usb/storage/scsiglue.c:<br />
202 /* Command timeout and abort */<br />
203 /* This is always called with scsi_lock(srb->host) held */<br />
204 static int command_abort(struct scsi_cmnd *srb )<br />
205 {<br />
206 struct <strong>Scsi</strong>_Host *host = srb->device->host;<br />
207 struct us_data *us = (struct us_data *) host->hostdata[0];<br />
208<br />
209 US_DEBUGP("%s called\n", __FUNCTION__);<br />
210<br />
211 /* Is this command still active? */<br />
212 if (us->srb != srb) {<br />
213 US_DEBUGP ("-- nothing to abort\n");<br />
214 return FAILED;<br />
215 }<br />
216<br />
217 /* Set the TIMED_OUT bit. Also set the ABORTING bit, but only if<br />
218 * a device reset isn't already in progress (to avoid interfering<br />
219 * with the reset). To prevent races with auto-reset, we must<br />
220 * stop any ongoing USB transfers while still holding the host<br />
221 * lock. */<br />
222 set_bit(US_FLIDX_TIMED_OUT, &us->flags);<br />
223 if (!test_bit(US_FLIDX_RESETTING, &us->flags)) {<br />
224 set_bit(US_FLIDX_ABORTING, &us->flags);<br />
225 usb_stor_stop_transport(us);<br />
226 }<br />
227 scsi_unlock(host);<br />
228