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.

一个类似的函数,名叫usb_stor_show_command().她们是老乡,都来自<br />

drivers/usb/storage/debug.c:<br />

159 void usb_stor_show_sense(<br />

160 unsigned char key,<br />

161 unsigned char asc,<br />

162 unsigned char ascq) {<br />

163<br />

164 const char *what, *keystr;<br />

165<br />

166 keystr = scsi_sense_key_string(key);<br />

167 what = scsi_extd_sense_format(asc, ascq);<br />

168<br />

169 if (keystr == NULL)<br />

170 keystr = "(Unknown Key)";<br />

171 if (what == NULL)<br />

172 what = "(unknown ASC/ASCQ)";<br />

173<br />

174 US_DEBUGP("%s: ", keystr);<br />

175 US_DEBUGPX(what, ascq);<br />

176 US_DEBUGPX("\n");<br />

177 }<br />

这里面又调用了其她函数,scsi_sense_key_string 和scsi_extd_sense_format,这两个函数来自<br />

driver/scsi/constants.c,暂且不表.先来看对usb_stor_show_sense 这个函数的调用.传递给她的实参<br />

是srb->sense_buffer 中的几个元素,对比咱们前面贴出来的那个sense data 的格式,可知<br />

sense_buffer[2]的低四位被称为Sense Key,而sense_buffer[12]是Additional sense code,也称<br />

ASC,sense_buffer[13]是Additional sense code qulifier,也称ASCQ.这三个冬冬联手为mid level<br />

177<br />

提供了需要的信息,主要也就是错误信息或者异常信息.为什么要三个冬冬呢?实际上就是一个分层的描述<br />

方法,比如要描述某个房间就要说某城市某街道某门牌号.这三个冬冬也是起着这么一个作用,Sense Key<br />

是第一层,ASC 则是对她的补充,而ASCQ 则又是对ASC 的补充,或者说解释.这样我们再来看看<br />

usb_stor_show_sense 就很清楚了,咱们传递进来的是三个char 变量,而实际的信息就像某种编码一样<br />

被融入在了这些char 变量中,而调用的两个来自scsi 核心层的函数scsi_sense_key_string 和<br />

scsi_extd_sense_format 就是起着翻译的作用,也叫解码.解码了就可以打印出来了.Yeah!<br />

699 行,srb->result 设置为SAM_STAT_CHECK_CONDITION.为什么?不为什么,Request Sense<br />

执行完之后,scsi 规范告诉我们应该把srb->result 设为SAM_STAT_CHECK_CONDITION,酱紫mid<br />

level 就知道去检查sense data.这也是为什么在554 行,555 行会令srb->result 也为这个值,只不过<br />

那<br />

次sense data 是咱们自己手工准备的,不是通过命令获得的.<br />

704这个if 这一小段,首先咱们需要明白,need_auot_sense 这个flag 被设为1实际上是有两种可能的,<br />

它本身是在usb_stor_invoke_transport()中第一行所定义的一个局部变量,并且在这个函数中特意把它<br />

初始化为0. 第一处设置为1 的位置是574 行当时check us->protocol 为US_PR_CB 或者<br />

US_PR_DPCM_USB,对于这种设备,(如果您只关心u 盘,那么就甭理这种设备了.)第二处设置这个flag<br />

的<br />

就是我们确实遇到了failure,585 行,result 如果等于USB_STOR_TRANSPORT_FAILED,这种情况当

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

Saved successfully!

Ooh no, something went wrong!