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.

269 memcpy(data+16, us->unusual_dev->productName,<br />

270 strlen(us->unusual_dev->productName) > 16 ? 16 :<br />

271 strlen(us->unusual_dev->productName));<br />

272 data[32] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>12)<br />

& 0x0F);<br />

273 data[33] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>8) &<br />

0x0F);<br />

274 data[34] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice>>4) &<br />

0x0F);<br />

275 data[35] = 0x30 + ((us->pusb_dev->descriptor.bcdDevice) &<br />

0x0F);<br />

276 }<br />

277<br />

278 usb_stor_set_xfer_buf(data, data_len, us->srb);<br />

279 }<br />

故事发生的太突然,会让人产生幻觉. 本来我们正儿八经用来处理scsi 命令的函数是后面将要讲的<br />

proto_handler(),但想不到我们在这里开始接触scsi 命令了.理由正是因为像Sony 这几款PEG 产品做<br />

的<br />

不好,连最基本的scsi 命令INQUIRY 都不支持,完了又想在Linux 中使用,那没办法了,Sony 毕竟是大公<br />

司,连欧洲冠军杯都是他们家和喜力给赞助的,开源社区没有必要得罪他们,所以就准备一个函数来fix 这个<br />

问题吧,毫无疑问,这属于硬件上的一个bug.<br />

那么什么是INQUIRY 命令?曾经也提过,INQUIRY 命令是最最基本的一个SCSI 命令,比如主机第一<br />

次探测设备的时候就要用INQUIRY命令来了解这是一个什么设备,比如scsi 总线上有一个插槽插了一个设<br />

备,那么scsi 主机就问它,你是scsi 磁盘呢,还是scsi 磁带,又或是scsi 的CD ROM 呢?作为设备,它内部<br />

一<br />

定有一段固件程序,即所谓的firmware.它就在接收到主机的INQUIRY 命令之后作出回答.具体应该怎么<br />

回答?当然是依据scsi 协议里规定的格式了.不仅仅INQUIRY 命令,对于每一个命令都应该如此.只要对方<br />

问:天王盖地虎.你作为设备就该回答,宝塔镇河妖.这其实就好比我们对对联,人家问天恢弘,地恢弘,天地恢<br />

弘,就得对你妈的,他妈的,你他妈的.这都是不成文的规矩,而开发scsi 的人把这些写成了规范,它就变成了<br />

成文的规矩了.具体来说, 设备在受到INQUIRY 命令查询时,她的相应遵从scsi 协议里面规定的标准格<br />

式,<br />

标准格式规定了,响应数据必须至少包含36 个字节,所以252 行,如果data_len 小于36,那就甭往下走了,<br />

返回吧.您违规了.<br />

如果你对scsi 协议很陌生,还是没有明白INQUIRY 命令究竟是做什么,那么推荐一个工具给你,你可以<br />

试一试,以便有个直观的印象,其实INQUIRY 命令就是如其字面意思一样,查询,查询设备的一些基本信息,<br />

从软件的角度来说,在主机扫描的时候,或者说枚举的时候,向每一个设备发送这个命令,并且获得回答,驱动<br />

程序从此就会保存这些信息,因为这些信息之后可能都会用到或者说其中的一部分会被用到.这里推荐的工<br />

具是sg_utils3,这是一个软件包,Linux 中可以使用的软件包,到处都有下,下了之后安装上,然后它包含一<br />

个应用程序sg_inq,这其实就是给设备发送INQUIRY 命令用的,用法如下所示:<br />

130<br />

[root@localhost ~]# sg_inq -36 /dev/sda<br />

standard INQUIRY:<br />

PQual=0 Device_type=0 RMB=1 version=0x02 [SCSI-2]<br />

[AERC=0] [TrmTsk=0] NormACA=0 HiSUP=0 Resp_data_format=2

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

Saved successfully!

Ooh no, something went wrong!