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.

然<br />

要设置need_auto_sense 了.而704 行这里判断result 是否等于USB_STOR_TRANSPORT_GOOD,<br />

那么很显然,如果result 等于USB_STOR_TRANSPORT_FAILED,那么它就不可能等于<br />

USB_STOR_TRANSPORT_GOOD,因此,这里这个判断一定是针对第一种need_auto_sense 的情况,<br />

正如我们曾经说过的,遵守US_PR_CB/US_PR_DPCM_USB协议的设备是不会自己返回命令执行之后的<br />

Status,所以我们不管它执行到底成功与否,我们都会对它来一次REQUEST SENSE,就是为了尽可能多的<br />

获取一些信息,这样一旦出了问题,我们至少能多一些辅助信息来帮我们判断问题出在哪.那么对于<br />

USB_STOR_TRANSPORT_GOOD 的情况,首先这说明命令执行是没有问题的了,我们仔细看一下这个if<br />

语句,除了这个条件以外还判断了另外三个条件,(srb->sense_buffer[2]&0xaf)结果为0,那么说明<br />

srb->sense_buffer[2]的bit0~bit3 都为0,bit5 为0,bit7 也为0,而bit4 和bit6 是什么我们无所<br />

谓.(如<br />

果这个你还要问为什么那么我只能说你没救了.没办法,这个世界上只有10 种人,一种是懂二进制的,一种<br />

是<br />

不懂二进制的.)虽然我们没有兴趣熟悉每一个SCSI 命令的细节,但我们毕竟是共产主义接班人,应该对社<br />

会主义建设的方方面面都有所了解,所以让我们来仔细看看这个sense_buffer[2].对照sense data 的格<br />

式那张图,sense data 的第二个字节,bit0~bit3 是sense key,bit4 是Reserved,即保留的,不使用<br />

的.bit5 是ILI,全称incorrect length indicator,bit6 是EOM,全称End <strong>of</strong> Medium,bit7 是Filemark,<br />

伟大的不朽的金山词霸告诉我们这个词叫做卷标.关于sense key,<strong>Scsi</strong> 协议是这么规定的,如果sense<br />

key 为0h,那么这种情况表示NO SENSE.这种情况通常对应于命令的成功执行或者就是<br />

Filemark/EOM/ILI bits 中的任一个被设置为了1.需要注意的是,scsi 协议里边定义了四样东<br />

西,Filemark/EOM/ILI/Sense Key,它们都是为了提供错误信息的,只是前三者只要一个bit 就能表达明<br />

确<br />

的意思了,而最后一个包含很多信息,所以需要用4 个bits,并且还在后面附有很多额外信息,即<br />

sense_buffer[12]和sense_buffer[13],这里也要求它们为0,即所谓的ASC 和ASCQ 都为0,在scsi<br />

协议里面,这种情况称之为NO ADDITIONAL SENSE INFORMATION.关于这一点scsi 协议是这么说<br />

的:”The REQUEST SENSE command requests that the target transfer sense data to the<br />

initiator. If the target has no other sense data available to return, it shall return a sense key<br />

<strong>of</strong> NO SENSE and an additional sense code <strong>of</strong> NO ADDITIONAL SENSE INFORMATION.”而这<br />

正是我们这里的代码所表达的意思.(什么?你要我翻译这段话?有没有搞错啊,难道你没上过新东方,没听过<br />

老罗的课?那么我代表人民代表党义正严辞的告诉你,同志,你真的落伍了耶!)<br />

(filemark 和eom 都是针对磁带设备的,跟磁盘设备无关.也就是说跟咱们无关.)<br />

178<br />

最后,满足了这四个条件的情况就表示刚才这次scsi 命令的传输确实是圆满完成了.应该说这次检测还是<br />

蛮严格的,毕竟开源社区的同志们觉得写代码不像我们开会,每次看新闻,发现凡是会议必然是圆满成功的.<br />

这里人家检查了这么多条件都满足然后就设置srb->result 为SAM_STAT_GOOD,并且把<br />

srb->sense_buffer[0]也置为0.sense data 的byte 0 由两部分组成,Valid 和Error code,如果置为<br />

0,首先就说明这整个sense data 是无效的, 用scsi 标准的说法叫invalid, 所以scsi core 自然没法识别<br />

这么一个sense data,而我们既然认定这个命令是成功执行的,当然就没有必然让scsi core 再去理睬这么<br />

一个sense data 了.<br />

以上花了大量笔墨就讲了704 到712 这个if 语句段.需要重新强调一点,正如我们已经说过的,对于U 盘,<br />

这段代码根本就不可能执行,理由我们已经说过了.但是既然它出现在我们眼前了,我们又有什么理由去逃避<br />

呢?写代码,尤其是写这种通用的设备驱动程序,必然要考虑各种情况,不是完全跟着感觉走,也不是纯粹的追<br />

求华丽的算法和数据结构,更应该接近实际,华丽的代码堆砌的东西缺乏骨质感.<br />

这样,关于need_auto_sense 设置了的这一段就结束了.最后还想重复一点,说起来,REQUEST SENSE

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

Saved successfully!

Ooh no, something went wrong!