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.

srb->sense_buffer 里边的东西.SAM_STAT_CHECK_CONDITION 是scsi 那边定义的宏,scsi 协议<br />

规<br />

定,scsi 总线上有若干个阶段,比如命令阶段,比如数据阶段,比如状态阶段,这三个阶段其实咱们Bulk-Only<br />

spec 里边也有.不过scsi 协议里还规定了更多的一些阶段,在scsi 协议里边称一个阶段为一个phase.除<br />

了<br />

这三个phase 以外,还可以有bus free phase,有selection phase,有message phase 等等.而状态阶<br />

段就是要求目标设备返回给主机一个状态码(status code).关于这些状态码,在scsi 的规范里边定义得很<br />

清楚.在include/scsi/scsi.h 中也有相关的宏定义.<br />

117 /*<br />

118 * SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft<br />

119 * T10/1561-D Revision 4 Draft dated 7th November 2002.<br />

120 */<br />

121 #define SAM_STAT_GOOD 0x00<br />

122 #define SAM_STAT_CHECK_CONDITION 0x02<br />

123 #define SAM_STAT_CONDITION_MET 0x04<br />

124 #define SAM_STAT_BUSY 0x08<br />

125 #define SAM_STAT_INTERMEDIATE 0x10<br />

126 #define SAM_STAT_INTERMEDIATE_CONDITION_MET 0x14<br />

127 #define SAM_STAT_RESERVATION_CONFLICT 0x18<br />

128 #define SAM_STAT_COMMAND_TERMINATED 0x22 /* obsolete in SAM-3<br />

*/<br />

129 #define SAM_STAT_TASK_SET_FULL 0x28<br />

130 #define SAM_STAT_ACA_ACTIVE 0x30<br />

131 #define SAM_STAT_TASK_ABORTED 0x40<br />

其中,SAM_STAT_CHECK_CONDITION就是对应scsi 协议中的CHECK CONDITION,这一状态表明<br />

有sense data 被_________放置在相应的buffer 里,于是scsi core 那边就会去读sense buffer.而我们<br />

这里遇到这<br />

种情况,当然就可以返回了.<br />

559 行,要是没别的啥意外的话,到了这里我们就可以设置srb->result 为SAM_STAT_GOOD 了,说明<br />

一切都是ok 的.当然,对于之后会出现的REQUEST SENSE 的执行失败,我们会再次修改srb->result<br />

的.<br />

下面566 行,出现了一个叫做need_auto_sense 的变量,这是我们定义的临时变量,这里赋初值为<br />

0.574 到588 行,两个if 语句,为need_auot_sense 赋了值,赋值为1.我们首先很容易理解第二个if,正<br />

如<br />

我们前面介绍的那样,REQUEST SENSE 这个艰巨的任务被下放给了我们底层驱动,那么我们就勇敢的去<br />

承担它,在USB_STOR_TRANSPORT_FAILED 的情况下,我们就去发送一个REQUEST SENSE 命令.设<br />

了这个flag 稍后我们就会看到我们会因此而执行REQUEST SENSE.那么第一个if 呢?相信那些注释已经<br />

说得很清楚了吧,如果你对自己的智商还有一丁点儿信心的话,应该就不需要我解释了.我只说一句,对于那<br />

些遵守CB 或者DPCM 协议的设备它们没有自己没有办法决定状态,所以scsi 核心层当然就不知道去读它<br />

175<br />

们的sense buffer 了,但是不读sense buffer 我们连这个命令执行成功与否都不知道,那怎么行?而设备<br />

对于大多数读操作的错误也不需要使用sense buffer,因为它们对于读操作的错误通常会停止掉bulk-in<br />

pipe,这已经是一个很明显的信号了,不需要再检测sense buffer,因为检测sense buffer 或者说检测<br />

sense data 的目的无非就是出错了以后想知道出错的原因,而这种情况下原因已经清楚了嘛不是.至于你

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

Saved successfully!

Ooh no, something went wrong!