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.

这里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;

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

Saved successfully!

Ooh no, something went wrong!