07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

问为什么读操作会有这种特点,那我只能说两个字,经验.写设备驱动靠的就是经验.<br />

594 行,srb->resid 大于0,说明有问题,希望传输n 个字节,结果汇报上来说只传递了n-m 个字节.对于<br />

这里列出的这五个命令,少传几个字节倒是无所谓,比如INQUIRY,我就想知道设备的基本信息,那你说你姓<br />

甚名谁,生辰八字,学历如何,婚否,等等这些信息,你多说两句就多说两句,少说两句就少说两句,无所谓,没什<br />

么影响,但是有些命令就不能少传输了,比如我要传一个pdf 文档,你传到一半就不传了,那肯定不行,直接导<br />

致我可能打不开这个pdf 文档.驱动程序要是写成这样,那人家不跟你急就怪了.这里咱们就是调用<br />

US_DEBUGP 打印一句调试语句,也就不退出了,咱们忍了.<br />

接下来的一些行,604 行开始,一直到713 行,我们就是为need_auto_sense 的情况发送REQUEST<br />

SENSE 命令了.其实和之前一样,我们还是等于再进行一次Bulk 传输,还是三个阶段,不过我们有了之前的<br />

经验,现在再看Bulk 传输就简单多了,无非就是准备一个struct scsi_cmnd,调用<br />

us->transport(us->srb,us),然后结束了之后检查结果.这正是这一百多行所做的事情.不过我们偷了点<br />

懒,没有另外申请一个struct scsi_cmnd,而是直接利用之前的那个srb,只是调用us->transport 之前先<br />

把一些关键的东西备份起来,然后执行完us->transport 之后再恢复过来.所以接下来我们看到如下事件:<br />

用old_cmnd 保存了srb->cmnd;<br />

用old_cmd_len 保存了srb->cmd_len;<br />

先把srb->cmnd 清零,然后对它重新赋值,按REQUEST SENSE 的意思来赋值.<br />

不同的命令集里边REQUEST SENSE 的长度也不同,对于RBC 或者咱们的SCSI,长度为6,而对于别的<br />

命令集,其长度为12.<br />

然后用old_sc_data_direction 保存了srb->sc_data_direction,而把srb->sc_data_direction 设<br />

置为REQUEST SENSE 的要求,DMA_FROM_DEVICE,很显然,REQUEST SENSE 是向设备要sense<br />

data,那么当然数据传输方向是从设备到主机.<br />

然后用old_request_buffer 来保存srb->request_buffer,而将srb->request_buffer 设置为<br />

srb->sense_buffer,同时用old_request_bufflen 来备份srb->request_bufflen,同时把<br />

srb->request_bufflen 设置为18.<br />

用old_sg 来备份srb->use_sg,而把srb->use_sg 设置为0,传这么点数据也就别用那麻烦的<br />

scatter-gather 机制了.<br />

然后用old_serial_number 来备份srb->serial_number,并把srb->serial_number 的最高位取反.<br />

最后用old_resid 来备份srb->resid,而把srb->resid 再次初始化为0.<br />

这时候就可以调用us->transport(us->srb,us)了.并且用一个临时变量temp_result 来保存这个结<br />

果.<br />

176<br />

这次命令完了之后,我们659 到666 行,就把刚才备份的那些变量给恢复原来的值.<br />

668 行,再一次判断是不是被放弃了,如果是又goto Handle_Abort.<br />

672 行,然后判断temp_result,如果这个result 说明这次传输还有问题,那就说明连REQUEST SENSE<br />

都fail 了.于是我们会设置srb->result=DID_ERROR

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

Saved successfully!

Ooh no, something went wrong!