07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

285 US_DEBUGP("No reset during disconnect\n");<br />

286 } else if (us->pusb_dev->actconfig->desc.bNumInterfaces != 1) {<br />

287 result = -EBUSY;<br />

288 US_DEBUGP("Refusing to reset a multi-interface device\n");<br />

289 } else {<br />

290 rc = usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);<br />

291 if (rc < 0) {<br />

292 US_DEBUGP("unable to lock device for reset: %d\n", rc);<br />

189<br />

293 result = rc;<br />

294 } else {<br />

295 result = usb_reset_device(us->pusb_dev);<br />

296 if (rc)<br />

297 usb_unlock_device(us->pusb_dev);<br />

298 US_DEBUGP("usb_reset_device returns %d\n", result);<br />

299 }<br />

300 }<br />

301 up(&(us->dev_semaphore));<br />

302<br />

303 /* lock the host for the return */<br />

304 scsi_lock(srb->device->host);<br />

305 return result < 0 ? FAILED : SUCCESS;<br />

306 }<br />

看完了device_reset 再来看bus_reset 应该就不难了.这个函数本身写的也特别清楚,注释很详细加上<br />

又有一些调试信息,基本上,中关村那些抱着小孩卖毛片的妇女同志们应该都能看懂这个函数了.咱们再简单<br />

介绍一下,和device_reset 不同的地方在于,device_reset 实际上只是设备本身的复位,而bus_reset<br />

的<br />

意义就更加广泛了,它涉及到从usb core 这一层面来初始化这个设备,千万不要混淆了,bus reset 不是说<br />

usb bus 的reset,而是scsi bus,即scsi 总线.哪来的scsi 总线?我们模拟的,假的.难道你忘记了我们模拟<br />

了一个scsi host,一个scsi device 么,实际上也就是模拟了一条scsi 总线.而这个冬冬的reset 就意味着<br />

整个driver 都得重新初始化,即从usb core 那边开始,确切的说是usb hub 那边,先给咱们在usb 总线上<br />

来重新分配一个地址,重新建立起之前的配置,重新选择altsetting,也就是说对于咱们这个设备,相当于重<br />

新经历了一次usb 的总线枚举.而之后,咱们的storage_probe()会重新被调用,整个模拟的scsi 总线将从<br />

头再来,所以说bus_reset 是一场很大规模的运动,而不像device reset 那样属于小打小闹式的.<br />

283 行,还是老套路,检查是不是disconnecting 了,要是的话就甭reset 了,省省事吧,别瞎折腾了.<br />

286 行,还记得咱们说过一个interface 对应一个driver 吗,一个device 可能有多个interface,也因此<br />

可能对应多个driver,那么咱们这里对一个device reset 就只能针对那种一个device 只有一个interface<br />

的情况,因为要不然您就影响别人了,就好比,假如你们家是在一个森林里边,前不挨村后不着店的房子, 或<br />

者说你们家的周边地形和那个史上最牛的重庆钉子户差不多,那您如果想把自己建好的房子给拆了,那可能<br />

没人管,但假如您住的是楼房,您的卧室跟邻居家的卧室一墙之隔,或者浴室跟邻居家的浴室一墙之隔,那您<br />

要是敢把您那堵墙拆了,毋庸置疑,邻居非跟您急不可.<br />

然后289 行到300 行,总共三个来自usb core 那边的关键函<br />

数,usb_lock_device_for_reset/usb_reset_device/usb_unlock_device.usb core 都为您准备好<br />

了,

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

Saved successfully!

Ooh no, something went wrong!