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.

您要从总线上来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

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

Saved successfully!

Ooh no, something went wrong!