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.

485 };<br />

486<br />

这是一个字符数组,共18 个元素,初始化的时候其中4 个元素被赋了值,为了说明这个数组,下面不得不<br />

插播一段scsi 广告,广告过后立刻回来.<br />

我们知道SCSI 通过命令通信,有一个命令是Request Sense.她是用来获取错误信息的,不知道为什<br />

么,那些有文化的人把错误信息唤作sense data.可能老外取名字都喜欢取得很优雅吧,相比之下,我们国内<br />

很多东西取名字就有些土,比如某所高校,中文名是沈阳理工,而英文名居然就是Shenyang Ligong<br />

University.这样没文化的名字实在让人笑死了.如果一个设备接收到了一个Request Sense 命令,那么她<br />

将按游戏规则返回一个sense data,我们可以参考scsi 协议,找到sense data 的格式规定,如下图所示:<br />

172<br />

标准的sense data 是18 个bytes 的.所以这里准备了一个18 个元素的数组,第0 个byte 的低七位<br />

称为error code,0x70 表明是出问题的是当前这个命令,第二个byte 的低四位成为sense key,0x5h 称<br />

为Illegal Request,表明命令本身有问题,比如命令的参数不合法.而第七个byte 称为additional sense<br />

length 表明在这个18 个元素之后还会有additional sense bytes,而她的长度就在这里被标注了,这些<br />

additional sense bytes 通常指的是一些命令特有的数据,或者是一些外围设备特有的数据,这里为她赋<br />

值<br />

为0x0a.而第十二个byte,称为additional sense code,这部分针对sense key 提供一些信息,也就是说<br />

比如sense key 如果是Illegal Request,那么我们知道了是命令有问题,那么究竟有什么问题<br />

呢?additional sense code 提供更详细的一些信息,scsi 规范中对24h 的描述是Invalid Field in CDB,<br />

正是我们这里注释所说.<br />

所以,这样我们明白了,1073 行,就是将usb_stor_sense_invalidCDB 数组里边的冬冬copy 至<br />

srb->sense_buffer 里边,然后返回USB_STOR_TRANSPORT_NO_SENSE.struct scsi_cmnd 结构<br />

体里面是这样定义sense_buffer 的,<br />

115 #define SCSI_SENSE_BUFFERSIZE 96<br />

116 unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE]; /*<br />

obtained by REQUEST SENSE<br />

117 * when CHECK CONDITION is<br />

118 * received on original command<br />

119 * (auto-sense) */<br />

关于sense_buffer 就得从scsi 协议以及Linux 中的scsi 核心层来讲了.scsi 协议里边有这么一码子<br />

事,当一个scsi 命令执行出了错,你可以发送一个REQUEST_SENSE 命令给目标设备,然后它会返回给你<br />

一些信息,即sense data.不过呢,scsi 核心层偷懒,把这一艰巨的任务抛给了底层驱动,即我们作为底层驱<br />

动不得不自己发送REQUEST SENSE 命令给目标设备.当然了,所谓的scsi core 偷懒并不是没有它的道<br />

理,<br />

因为有些scsi host 卡会自动发送这个命令,就是说当设备汇报说命令执行有误,那这时scsi host 卡会自<br />

动<br />

173<br />

发送REQUEST SENSE 命令去了解详情.所以scsi core 就干脆把权力下放,让底层驱动自己去处理吧.因<br />

此稍后我们会看到一个变量名字叫做need_auto_sense.就是说,REQUEST SENSE 这个命令要么就是<br />

硬件你自动发出去,要么就让软件自动发出去,总之scsi core 这一层是不管你了.只要你最终返回scsi 核<br />

心<br />

层的时候把相关的sense data 保存在srb->sense_buffer 里,scsi 核心层自然就知道该如何处理了.<br />

再回到我们具体的问题中来,我们说了,有些设备就是贱,你明明只期望它返回n 个字节,它偏偏要给你<br />

捣乱,它想返回n+m 个字节,对于这种情况我们怎么处理?老实说,它想多返回的几个字节我们完全可以抛

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

Saved successfully!

Ooh no, something went wrong!