You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
这里bcb->Lun 和CBW 中的bCBWLUN 并不完全对应,bCBWLUN 只有4 个bit,而咱们这里定义的时<br />
候,Lun 是有8 位的,低四位用来对应bCBWLUN,而高四位实际上是用来表征target id 的.所以接下来判<br />
断us->flags 里边设了US_FL_SCM_MULT_TARG 这个标志没有,如果有,说明是支持多个target 的,<br />
于<br />
是就要记录下是哪个target.<br />
bcb->Length = srb->cmd_len,这个对应于CBW 中的bCBWCBLength,即命令的有效长度,单位是<br />
bytes. scsi 命令的有效长度只能是1 到16 之间.接下来有个CDB 数组,数组共16 个元素,理由咱们刚才<br />
讲struct scsi_cmnd 中的cmnd 就已经说过了.而969 行,970 行正是把命令srb->cmnd 数组的内容<br />
copy 至bcb->CDB 中.<br />
这时候,前戏结束了,usb_stor_bulk_transfer_buf 正式被调用了.传递给她的第三个参数正是bcb,而<br />
第四个参数是US_BULK_CB_WRAP_LEN,她也是定义于drivers/usb/storage/transport.h 中,<br />
95 #define US_BULK_CB_WRAP_LEN 31<br />
31 就是CBW 的长度,CBW 正是31 个bytes.而usb_stor_bulk_transfer_buf 的所作所为咱们是非<br />
常<br />
清楚地,无非就是提交这么一个urb,然后就不用管事了,就等结果呗.而最终的result 是由<br />
interpret_urb_result()返回的,传输正确那么会返回USB_STOR_XFER_GOOD,而如果不正确,那么<br />
usb_stor_Bulk_transport()中就直接返回了,返回值是USB_STOR_TRANSPORT_ERROR.如果正确,<br />
那么继续往下走,这才到真正的数据传输阶段. 在真正开始将数据传输阶段之前,我们先来看看<br />
interpret_urb_result()函数.<br />
迷雾重重的 Bulk 传输(四)<br />
在讲数据传输阶段之前,先解决刚才的历史遗留问题. usb_stor_bulk_transfer_buf()中,429 行,有一<br />
个很有趣的函数interpret_urb_result()被调用.这个函数同样来自drivers/usb/storage/transport.c:<br />
277 /*<br />
278 * Interpret the results <strong>of</strong> a URB transfer<br />
279 *<br />
280 * This function prints appropriate debugging messages, clears halts on<br />
159<br />
281 * non-control endpoints, and translates the status to the corresponding<br />
282 * USB_STOR_XFER_xxx return code.<br />
283 */<br />
284 static int interpret_urb_result(struct us_data *us, unsigned int pipe,<br />
285 unsigned int length, int result, unsigned int partial)<br />
286 {<br />
287 US_DEBUGP("Status code %d; transferred %u/%u\n",<br />
288 result, partial, length);<br />
289 switch (result) {<br />
290<br />
291 /* no error code; did we send all the data? */<br />
292 case 0:<br />
293 if (partial != length) {<br />
294 US_DEBUGP("-- short transfer\n");<br />
295 return USB_STOR_XFER_SHORT;