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.

0,那么表明命令执行成功了.关于bcs->Status 的取值,usb mass storage bulk only spec 里面规定的<br />

很清楚,参考下面这幅图<br />

我们前面看到,我们定义了三个宏US_BULK_STAT_OK / US_BULK_STAT_FAIL /<br />

US_BULK_STAT_PHASE ,分别对应00h,01h,02h.所以这里我们就用这三个宏来进行判断.先来看后两<br />

个,如果是US_BULK_STAT_FAIL,那么返回USB_STOR_TRANSPORT_FAILED,如果是<br />

US_BULK_STAT_PHASE,那么返回USB_STOR_TRANSPORT_ERROR.这俩没啥好说的,我们在<br />

drivers/usb/storage/transport.h 中一共定义了四个这样的宏:<br />

131 /*<br />

132 * Transport return codes<br />

133 */<br />

134<br />

135 #define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command<br />

good */<br />

136 #define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command<br />

failed */<br />

137 #define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no<br />

auto-sense */<br />

138 #define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead)<br />

*/<br />

171<br />

其意思都很明显,从字面上就能看出来.相信受过九年制义务教育的你不会看不明白.至于这里返回这些值<br />

以后上面如何处理那我们稍后从这个函数返回了就知道了.另一个问题,FAILED 和ERROR 的区别也很明<br />

显,一个是说传输没问题,但是命令执行的时候有错误,另一个是传输本身就有错.<br />

现在我们来看看US_BULK_STAT_OK 的情况了,这种情况说明,传输成功了.但是这里需要判断<br />

fake_sense.什么是fake_sense?我们下一节再来专门讨论这个问题,需要知道的是,这里这三个return<br />

就意味着usb_stor_Bulk_transport()函数将结束了(当然,还有一个return,1094 行,就是说如果以上情<br />

况都不属于,那当然更加是出错了,所以直接返回USB_STOR_TRANSPORT_ERROR).我们将返回<br />

usb_stor_invoke_transport(),而这更加意味着一次Bulk 传输的结束.至此我们就算是把这个迷雾重重<br />

的Bulk 传输给从头到尾讲了一遍.而回到usb_stor_invoke_transport()之后所需要做的就是一些错误<br />

处理了,或者说秋后算账.<br />

跟着感觉走(一)<br />

接下来的时间里我们会接触两个变量,fake_sense 和need_auto_sense,sense 顾名思义,感觉.所以<br />

就让我们跟着感觉走.我们前面提到过,如果设备想发送比期望值更多的数据,那么我们前面就设了<br />

fake_sense 为1.这里就来看看设为1 之后怎么办.这里咱们看到了这个一个冬<br />

冬,usb_stor_sense_invalidCDB,她是谁?<br />

让我们把镜头对准drivers/usb/storage/scsiglue.c,<br />

479 /* To Report "Illegal Request: Invalid Field in CDB */<br />

480 unsigned char usb_stor_sense_invalidCDB[18] = {<br />

481 [0] = 0x70, /* current error */<br />

482 [2] = ILLEGAL_REQUEST, /* Illegal Request = 0x05 */<br />

483 [7] = 0x0a, /* additional length */<br />

484 [12] = 0x24 /* Invalid Field in CDB */

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

Saved successfully!

Ooh no, something went wrong!