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.

就必须设置US_FL_IGNORE_RESIDUE 这个flag 了.当时那个patch 是这样的:<br />

===== drivers/usb/storage/transport.c 1.151 vs edited =====<br />

--- 1.151/drivers/usb/storage/transport.c 2004-10-20 12:38:15 -04:00<br />

+++ edited/drivers/usb/storage/transport.c 2004-10-28 10:50:42 -04:00<br />

@@ -1058,8 +1058,7 @@<br />

/* try to compute the actual residue, based on how much data<br />

* was really transferred and what the device tells us */<br />

if (residue) {<br />

- if (!(us->flags & US_FL_IGNORE_RESIDUE) ||<br />

- srb->sc_data_direction == DMA_TO_DEVICE) {<br />

+ if (!(us->flags & US_FL_IGNORE_RESIDUE)) {<br />

residue = min(residue, transfer_length);<br />

srb->resid = max(srb->resid, (int) residue);<br />

}<br />

同时我们也把当时去开源社区抱怨的那位哥们的调试信息贴出来:<br />

usb-storage: Command WRITE_10 (10 bytes)<br />

usb-storage: 2a 00 00 00 01 37 00 00 08 00<br />

usb-storage: Bulk Command S 0x43425355 T 0x82 L 4096 F 0 Trg 0 LUN 0 CL 10<br />

usb-storage: usb_stor_bulk_transfer_buf: xfer 31 bytes<br />

usb-storage: Status code 0; transferred 31/31<br />

usb-storage: -- transfer complete<br />

usb-storage: Bulk command transfer result=0<br />

usb-storage: usb_stor_bulk_transfer_sglist: xfer 4096 bytes, 2 entries<br />

usb-storage: Status code 0; transferred 4096/4096<br />

usb-storage: -- transfer complete<br />

usb-storage: Bulk data transfer result 0x0<br />

usb-storage: Attempting to get CSW...<br />

usb-storage: usb_stor_bulk_transfer_buf: xfer 13 bytes<br />

usb-storage: Status code 0; transferred 13/13<br />

usb-storage: -- transfer complete<br />

usb-storage: Bulk status result = 0<br />

usb-storage: Bulk Status S 0x53425355 T 0x82 R 3072 Stat 0x0<br />

170<br />

usb-storage: -- unexpectedly short transfer<br />

usb-storage: scsi cmd done, result=0x10070000<br />

SCSI error : return code = 0x10070000<br />

end_request: I/O error, dev sda, sector 311<br />

应该说这段信息清晰的打印出来整个Bulk 传输是怎么进行的.一共三个阶段,Command/Data/Status,<br />

这里执行的命令就是WRITE_10,本来这是一次成功的传输,但是最后返回值result 却不为0,而是<br />

0x10070000,关于这个0x10070000 如何出来的,我们稍候会知道.最后两行是scsi core 那边的代码打<br />

印出来的,我们不用管,只是需要知道我们最终返回给scsi 核心层的一个有用信息就是srb->result.所以我<br />

们看到scsi 那边打印了一个reture code,和我们这里的result 是一样的.其实打印的都是srb->result.<br />

很显然,srb 这个东西相当于usb-storage 和scsi 那边的桥梁,连接了两个模块.<br />

Ok,继续往下走.1068 行开始基于CSW 返回的状态,来判断结果了.判断的值就是bcs->Status.如果是

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

Saved successfully!

Ooh no, something went wrong!