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 />
了,