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.

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

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

Saved successfully!

Ooh no, something went wrong!