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,这种情况当