Scsi - Index of

Scsi - Index of Scsi - Index of

07.06.2013 Views

下,USB_STOR_XFER_STALLED 对应于usb core 传回来的是-EPIPE,这种情况说明管道不通,就相当 于 您家里的下水管道堵塞,当然这也说明get CSW 再次失败了...,这种情况很简单,直接retry,为什么要 retry?我们看一下interpret_urb_result()函数,最重要的就是310 到314 行,这里判断了,因为我们曾经 讲过,bulk 端点可能会设置了halt 条件,设置了这种条件的端点必然会堵塞管道,所以这里就不管如何,试 一 试看,看清掉这个flag 是否会有好转.所以对于这种情况,我们可以重试一次.我们抱着试一试的心态去 retry, 应该说这种心态是正确的,我再重申一次,这里实际上反映的就是Linux 代码背后的哲学,反映的是一种勇 敢 面对挫折的人生态度,一枚贝壳要用一生的时间才能将无数的沙粒转化成一粒并不规则的珍珠,雨后的彩虹 绽放刹那的美丽却要积聚无数的水汽.如果把这些都看成是一次又一次挫折,那么是挫折成就了光彩夺目的 珍珠和美丽的彩虹.我们要相信,失败并不可怕,失败是通往成功的道路. 如果您不是像李白一样近视的话,(床前明月光都能看成地上霜的人,还不是近视吗?)您应该会看见这次 传递给usb_stor_bulk_transfer_buf()函数的最后一个参数不是像之前那样,这次是NULL,这是因为实 际上cswlen 作为一个临时变量,表征的是状态阶段的实际传输长度,但是在眼下这种情况我们已经不需要 使用这个临时变量了. 1042 行,好家伙,如果都这么重新获取了还不成功的话,不用再瞎耽误工夫了,直接返回吧,向领导汇报这 设备无药可救了.没办法,返回USB_STOR_TRANSPORT_ERROR,到这里还不成功那真的就是让人绝望 了.什么?你说失败是成功之母?对于这句话我没有异议,问题是失败在遇上我之前已经结扎了... 而从1046 行开始,正式分析CSW 了.结合我们从usb mass storage bulk only 协议中抓出来的那幅 图,那幅介绍CSW的格式的图,bcs->Residue 对应于CSW的dCSWDataResidue,她表示的是实际传输 的数据和期望传输的数据的差值.bcs->Signature 对应于CSW 中的dCSWSignature,bcs->Tag 对应 于CSW中的dCSWTag,而bcs->Status 对应于bCSWStatus.我们有些事情没道理的,有人很抢手,有人 没资格,路是人走的.在bcs 中成员的存储格式居然还有区别,有的是little endian 的,有些却不是.对于那 些 little endian 的,咱们需要调用像cpu_to_le32 这样的宏来转换,而其她的却不需要转换,对于bcs 来说, 其成员Residue 和Signature 就需要这样转换.这些规矩仿佛是没有道理的. 167 1050 行,和之前bcb 中使用US_BULK_CB_SIGN 一样,US_BULK_CS_SIGN这个宏用来标志这个数 据包是一个CSW包.而US_BULK_CS_OLYMPUS_SIGN也是一个宏,不过她是专为某种变态设备专门准 备的.这两个宏和接下来将提到的一些宏依然来自drivers/usb/storage/transport.h 中, 110 #define US_BULK_CS_SIGN 0x53425355 /* spells out 'USBS' */ 111 /* This is for Olympus Camedia digital cameras */ 112 #define US_BULK_CS_OLYMPUS_SIGN 0x55425355 /* spells out 'USBU' */ 113 #define US_BULK_STAT_OK 0 114 #define US_BULK_STAT_FAIL 1 115 #define US_BULK_STAT_PHASE 2 对大多数普通的设备来说,如果要标志一个CSW 包,其Signature 会是53425355h.但是Olympus Camedia 这种数码相机偏偏要标新立异,她愣是跟您换个数字,那咱也没办法.敢情人家设计者是穿美特斯 邦威长大的,就是不走寻常路. Tag 就是和CBW 相对应的,两个Tag 应该相同.要不然也就不叫接头暗号了.前面为Tag 赋值为 srb->serial_number,这回自然也应该等于这个值.

而bcs->Status,标志命令执行是成功还是失败,当她是0 表明命令是成功的,当她是非0,嘿嘿,肯定有问 题.目前的spec 规定,她只能是00h,01h,02h,而03h 到FFh 都是保留的,不能用,所以这里会判断她是否 是大于US_BULK_STAT_PHASE,也就是说是否会大于02h,大于了当然就不行.好,这样子,就是说这些条 件如果不满足的话,那么一定是有问题的.返回错误值吧. 1060行至1066行,如果residue不为0,那么说明数据没传完,或者说和预期的不一样,那么来细看一下, 首先该设备应该没有设置US_FL_IGNORE_RESIDUE这个flag,老规矩,让我们看一下什么样的设备设置 了这个flag, 269 /* Yakumo Mega Image 37 270 * Submitted by Stephan Fuhrmann */ 271 UNUSUAL_DEV( 0x052b, 0x1801, 0x0100, 0x0100, 272 "Tekom Technologies, Inc", 273 "300_CAMERA", 274 US_SC_DEVICE, US_PR_DEVICE, NULL, 275 US_FL_IGNORE_RESIDUE ), 276 277 /* Another Yakumo camera. 278 * Reported by Michele Alzetta */ 279 UNUSUAL_DEV( 0x052b, 0x1804, 0x0100, 0x0100, 280 "Tekom Technologies, Inc", 281 "300_CAMERA", 282 US_SC_DEVICE, US_PR_DEVICE, NULL, 283 US_FL_IGNORE_RESIDUE ), 284 285 /* Reported by Iacopo Spalletti */ 168 286 UNUSUAL_DEV( 0x052b, 0x1807, 0x0100, 0x0100, 287 "Tekom Technologies, Inc", 288 "300_CAMERA", 289 US_SC_DEVICE, US_PR_DEVICE, NULL, 290 US_FL_IGNORE_RESIDUE ), 291 292 /* Yakumo Mega Image 47 293 * Reported by Bjoern Paetzel */ 294 UNUSUAL_DEV( 0x052b, 0x1905, 0x0100, 0x0100, 295 "Tekom Technologies, Inc", 296 "400_CAMERA", 297 US_SC_DEVICE, US_PR_DEVICE, NULL, 298 US_FL_IGNORE_RESIDUE ), 299 300 /* Reported by Paul Ortyl 301 * Note that it's similar to the device above, only different prodID */ 302 UNUSUAL_DEV( 0x052b, 0x1911, 0x0100, 0x0100, 303 "Tekom Technologies, Inc", 304 "400_CAMERA",

下,USB_STOR_XFER_STALLED 对应于usb core 传回来的是-EPIPE,这种情况说明管道不通,就相当<br />

于<br />

您家里的下水管道堵塞,当然这也说明get CSW 再次失败了...,这种情况很简单,直接retry,为什么要<br />

retry?我们看一下interpret_urb_result()函数,最重要的就是310 到314 行,这里判断了,因为我们曾经<br />

讲过,bulk 端点可能会设置了halt 条件,设置了这种条件的端点必然会堵塞管道,所以这里就不管如何,试<br />

一<br />

试看,看清掉这个flag 是否会有好转.所以对于这种情况,我们可以重试一次.我们抱着试一试的心态去<br />

retry,<br />

应该说这种心态是正确的,我再重申一次,这里实际上反映的就是Linux 代码背后的哲学,反映的是一种勇<br />

敢<br />

面对挫折的人生态度,一枚贝壳要用一生的时间才能将无数的沙粒转化成一粒并不规则的珍珠,雨后的彩虹<br />

绽放刹那的美丽却要积聚无数的水汽.如果把这些都看成是一次又一次挫折,那么是挫折成就了光彩夺目的<br />

珍珠和美丽的彩虹.我们要相信,失败并不可怕,失败是通往成功的道路.<br />

如果您不是像李白一样近视的话,(床前明月光都能看成地上霜的人,还不是近视吗?)您应该会看见这次<br />

传递给usb_stor_bulk_transfer_buf()函数的最后一个参数不是像之前那样,这次是NULL,这是因为实<br />

际上cswlen 作为一个临时变量,表征的是状态阶段的实际传输长度,但是在眼下这种情况我们已经不需要<br />

使用这个临时变量了.<br />

1042 行,好家伙,如果都这么重新获取了还不成功的话,不用再瞎耽误工夫了,直接返回吧,向领导汇报这<br />

设备无药可救了.没办法,返回USB_STOR_TRANSPORT_ERROR,到这里还不成功那真的就是让人绝望<br />

了.什么?你说失败是成功之母?对于这句话我没有异议,问题是失败在遇上我之前已经结扎了...<br />

而从1046 行开始,正式分析CSW 了.结合我们从usb mass storage bulk only 协议中抓出来的那幅<br />

图,那幅介绍CSW的格式的图,bcs->Residue 对应于CSW的dCSWDataResidue,她表示的是实际传输<br />

的数据和期望传输的数据的差值.bcs->Signature 对应于CSW 中的dCSWSignature,bcs->Tag 对应<br />

于CSW中的dCSWTag,而bcs->Status 对应于bCSWStatus.我们有些事情没道理的,有人很抢手,有人<br />

没资格,路是人走的.在bcs 中成员的存储格式居然还有区别,有的是little endian 的,有些却不是.对于那<br />

些<br />

little endian 的,咱们需要调用像cpu_to_le32 这样的宏来转换,而其她的却不需要转换,对于bcs 来说,<br />

其成员Residue 和Signature 就需要这样转换.这些规矩仿佛是没有道理的.<br />

167<br />

1050 行,和之前bcb 中使用US_BULK_CB_SIGN 一样,US_BULK_CS_SIGN这个宏用来标志这个数<br />

据包是一个CSW包.而US_BULK_CS_OLYMPUS_SIGN也是一个宏,不过她是专为某种变态设备专门准<br />

备的.这两个宏和接下来将提到的一些宏依然来自drivers/usb/storage/transport.h 中,<br />

110 #define US_BULK_CS_SIGN 0x53425355 /* spells out 'USBS' */<br />

111 /* This is for Olympus Camedia digital cameras */<br />

112 #define US_BULK_CS_OLYMPUS_SIGN 0x55425355 /* spells out<br />

'USBU' */<br />

113 #define US_BULK_STAT_OK 0<br />

114 #define US_BULK_STAT_FAIL 1<br />

115 #define US_BULK_STAT_PHASE 2<br />

对大多数普通的设备来说,如果要标志一个CSW 包,其Signature 会是53425355h.但是Olympus<br />

Camedia 这种数码相机偏偏要标新立异,她愣是跟您换个数字,那咱也没办法.敢情人家设计者是穿美特斯<br />

邦威长大的,就是不走寻常路.<br />

Tag 就是和CBW 相对应的,两个Tag 应该相同.要不然也就不叫接头暗号了.前面为Tag 赋值为<br />

srb->serial_number,这回自然也应该等于这个值.

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

Saved successfully!

Ooh no, something went wrong!