Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
339 return USB_STOR_XFER_ERROR;<br />
340<br />
341 /* the catch-all error case */<br />
342 default:<br />
343 US_DEBUGP("-- unknown error\n");<br />
344 return USB_STOR_XFER_ERROR;<br />
345 }<br />
346 }<br />
应该说这个函数的作用是一目了然的.就是根据传进来的参数result 进行判断,从而采取相应的行<br />
动.partial 是实际传输的长度,而length 是期望传输的长度,传输结束了当然要比较这两者,因为有所期<br />
待,<br />
才会失望.result 是usb_stor_msg_common()函数的返回值,其实就是状态代码,如果为0说明一切都很<br />
顺利,结果也是成功的,287 这行,打印出result 来,同时打印出partial 和length 的比,注意两个%u中间<br />
那<br />
个”/”,就是除号,或者说分割分子和分母的符号.然后通过一个switch 语句判断result,为0,说明至少数据<br />
有传输,然后有两种情况,于是返回不同的值,一个是USB_STOR_XFER_SHORT,另一个是<br />
USB_STOR_XFER_GOOD.至于返回这些值之后会得到什么反应,让我们边走边看.目前只需要知道的是,<br />
对于真正传输完全令人满意的情况,返回值只能是USB_STOR_XFER_GOOD.返回其它值都说明有问题.<br />
而这里作为传递给switch 的result,实际上是usb core 那一层传过来的值.而我们注意<br />
到,interpret_urb_result 这个函数整个是被作为一个返回值出现在usb_stor_bulk_transfer_buf()中<br />
的,换言之,前者返回之后,后者也马上就返回了,即再次返回到了usb_stor_Bulk_transport()中来了.因<br />
此,我们把视线拉回usb_stor_Bulk_transport(),981 行,如果result 不为USB_STOR_XFER_GOOD,<br />
就说明多少有些问题,于是索性usb_stor_Bulk_transport()也返回,没必要再进行下一阶段的传输了.否<br />
则,才可以进行下一阶段.<br />
什么下一阶段?所谓的Bulk Only 传输,总共就是三个阶段,命令传输阶段,数据传输阶段,状态传输阶段.<br />
很显然,真正最有意义的阶段就是数据传输阶段,而在此之前,我们已经讲了第一阶段,即命令传输阶段.下面<br />
我们可以来看数据阶段.<br />
989 行,990 行,实在没话可说,USB_VENDOR_ID_GENESYS 代表某公司,这公司的产品在命令阶段<br />
和数据阶段居然还得延时100 微秒.没办法,谁要我们生活在一个宣扬个性的时代呢.体谅他们吧,没有哪一<br />
161<br />
种胭脂能涂抹时间,没有哪一件服装能掩饰灵魂,没有哪一套古籍能装潢空虚,没有哪一家公司能说自己的产<br />
品是完美的,是没有缺陷的.<br />
992行,transfer_length可能为0,因为有的命令她并不需要您传输数据,所以她没有数据阶段.而对于那<br />
些有数据阶段的情况,咱们进入if 这一段.<br />
993 行,没什么可说的,就是根据数据传输方向确定用接收pipe 还是发送pipe.<br />
然后,995 行,usb_stor_bulk_transfer_sg()这个函数是真正的执行bulk 数据传输了.这个函数来自<br />
drivers/usb/storage/transport.c 中:<br />
484 /*<br />
485 * Transfer an entire SCSI command's worth <strong>of</strong> data payload over the bulk<br />
486 * pipe.<br />
487 *<br />
488 * Note that this uses usb_stor_bulk_transfer_buf() and<br />
489 * usb_stor_bulk_transfer_sglist() to achieve its goals --<br />
490 * this function simply determines whether we're going to use