usb: add support for Motorola ROKR Z6 cellphone in mass storage mode
PATCH 1/1 usb: add support for Motorola ROKR Z6 cellphone in mass storage mode
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with FIX_INQUIRY and FIX_CAPACITY flags and new BULK_IGNORE_TAG flag. Last flag relaxes check for equality of bcs->Tag and us->tag in usb_stor_Bulk_transport routine.
--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 10 ++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-)
diff -upr linux-2.6.25-rc4/drivers/usb/storage/transport.c linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
--- linux-2.6.25-rc4/drivers/usb/storage/transport.c 2008-03-10
22:09:11.000000000 +0400
+++ linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
2008-03-10 22:11:24.000000000 +0400
@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_
US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status);
- if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) {
+ if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) ||
+ bcs->Status > US_BULK_STAT_PHASE) {
US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR;
}
diff -upr linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
--- linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h 2008-03-10
22:09:11.000000000 +0400
+++ linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
2008-03-10 22:10:40.000000000 +0400
@@ -1589,6 +1589,16 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x
US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY),
+/*
+ * Patch by Constantin Baranov <[email protected]>
+ * Report by Andreas Koenecke
+ */
+UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101,
+ "Motorola",
+ "MSnc.",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+ US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG),
+
/* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
"MPIO",
diff -upr linux-2.6.25-rc4/include/linux/usb_usual.h linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
--- linux-2.6.25-rc4/include/linux/usb_usual.h 2008-03-10
22:09:12.000000000 +0400
+++ linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h 2008-03-10
22:10:40.000000000 +0400
@@ -50,7 +50,9 @@
US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \
/* sometimes sizes is too big */ \
US_FLAG(MAX_SECTORS_MIN,0x00002000) \
- /* Sets max_sectors to arch min */
+ /* Sets max_sectors to arch min */ \
+ US_FLAG(BULK_IGNORE_TAG,0x00004000) \
+ /* Ignore tag mismatch in bulk operations */
#define US_FLAG(name, value) US_FL_##name = value ,
Are all 3 flags truly needed?
Matt
Quoted 76 lines · Constantin Baranov
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with
FIX_INQUIRYandFIX_CAPACITYflags and newBULK_IGNORE_TAGflag. Last flag relaxes check for equality ofbcs->Tagandus->taginusb_stor_Bulk_transportroutine.Signed-off-by Constantin Baranov <[email protected]>--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 10 ++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-)diff -upr
linux-2.6.25-rc4/drivers/usb/storage/transport.clinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
---linux-2.6.25-rc4/drivers/usb/storage/transport.c2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c2008-03-10 22:11:24.000000000 +0400(quoted diff) +2
-1@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_ US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status); - if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) { + if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || + bcs->Status > US_BULK_STAT_PHASE) { US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR; }diff -upr
linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.hlinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
---linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h2008-03-10 22:10:40.000000000 +0400(quoted diff) +10
-0@@ -1589,6 +1589,16 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), +/* + * Patch by Constantin Baranov <[email protected]> + * Report by Andreas Koenecke + */ +UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101, + "Motorola", + "MSnc.", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG), + /* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, "MPIO",diff -upr
linux-2.6.25-rc4/include/linux/usb_usual.hlinux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
---linux-2.6.25-rc4/include/linux/usb_usual.h2008-03-10
22:09:12.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h2008-03-10
22:10:40.000000000 +0400(quoted diff) +3
-2@@ -50,7 +50,9 @@ US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \ /* sometimes sizes is too big */ \ US_FLAG(MAX_SECTORS_MIN,0x00002000) \ - /* Sets max_sectors to arch min */ + /* Sets max_sectors to arch min */ \ + US_FLAG(BULK_IGNORE_TAG,0x00004000) \ + /* Ignore tag mismatch in bulk operations */ #define US_FLAG(name, value) US_FL_##name = value , --To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 6 lines
Matthew Dharm Home: [email protected] Maintainer, Linux USB Mass Storage Driver You were using cheat codes too. You guys suck. -- Greg to General Studebaker User Friendly, 12/16/1997
Yes. These three flags corresponds to three different bugs discussed in [email protected]
(http://www.mail-archive.com/[email protected]/msg19167.html)
FIX_INQUIRY: Device always sends PQ=1 in inquiry data, so SCSI subsystem stops to create sd device.FIX_CAPACITY: Device tells wrong size of internal memory card (real size + 1). If one would try to read/write "phantom" sector then phone hang up and reboot.BULK_IGNORE_TAG: Sometimes device sends wrong tags causing computer to reset endpoint. This may corrupt phone's filesystem in particular.
Quoted 82 lines · Matthew Dharm
Are all 3 flags truly needed?
Matt
Quoted 76 lines · Constantin Baranov
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with
FIX_INQUIRYandFIX_CAPACITYflags and newBULK_IGNORE_TAGflag. Last flag relaxes check for equality ofbcs->Tagandus->taginusb_stor_Bulk_transportroutine.Signed-off-by Constantin Baranov <[email protected]>--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 10 ++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-)diff -upr
linux-2.6.25-rc4/drivers/usb/storage/transport.clinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
---linux-2.6.25-rc4/drivers/usb/storage/transport.c2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c2008-03-10 22:11:24.000000000 +0400(quoted diff) +2
-1@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_ US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status); - if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) { + if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || + bcs->Status > US_BULK_STAT_PHASE) { US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR; }diff -upr
linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.hlinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
---linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h2008-03-10 22:10:40.000000000 +0400(quoted diff) +10
-0@@ -1589,6 +1589,16 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), +/* + * Patch by Constantin Baranov <[email protected]> + * Report by Andreas Koenecke + */ +UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101, + "Motorola", + "MSnc.", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG), + /* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, "MPIO",diff -upr
linux-2.6.25-rc4/include/linux/usb_usual.hlinux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
---linux-2.6.25-rc4/include/linux/usb_usual.h2008-03-10
22:09:12.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h2008-03-10
22:10:40.000000000 +0400(quoted diff) +3
-2@@ -50,7 +50,9 @@ US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \ /* sometimes sizes is too big */ \ US_FLAG(MAX_SECTORS_MIN,0x00002000) \ - /* Sets max_sectors to arch min */ + /* Sets max_sectors to arch min */ \ + US_FLAG(BULK_IGNORE_TAG,0x00004000) \ + /* Ignore tag mismatch in bulk operations */ #define US_FLAG(name, value) US_FL_##name = value , --To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
One last question:
If it's a ROKR Z6, why does the string in unusual_devs.h say "MSnc."?
Matt
Quoted 95 lines · Constantin Baranov
Yes. These three flags corresponds to three different bugs discussed in [email protected]
(http://www.mail-archive.com/[email protected]/msg19167.html)
FIX_INQUIRY: Device always sends PQ=1 in inquiry data, so SCSI subsystem stops to create sd device.FIX_CAPACITY: Device tells wrong size of internal memory card (real size + 1). If one would try to read/write "phantom" sector then phone hang up and reboot.BULK_IGNORE_TAG: Sometimes device sends wrong tags causing computer to reset endpoint. This may corrupt phone's filesystem in particular.Quoted 82 lines · Matthew Dharm
Are all 3 flags truly needed?
Matt
Quoted 76 lines · Constantin Baranov
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with
FIX_INQUIRYandFIX_CAPACITYflags and newBULK_IGNORE_TAGflag. Last flag relaxes check for equality ofbcs->Tagandus->taginusb_stor_Bulk_transportroutine.Signed-off-by Constantin Baranov <[email protected]>--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 10 ++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-)diff -upr
linux-2.6.25-rc4/drivers/usb/storage/transport.clinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
---linux-2.6.25-rc4/drivers/usb/storage/transport.c2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c2008-03-10 22:11:24.000000000 +0400(quoted diff) +2
-1@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_ US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status); - if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) { + if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || + bcs->Status > US_BULK_STAT_PHASE) { US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR; }diff -upr
linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.hlinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
---linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h2008-03-10 22:10:40.000000000 +0400(quoted diff) +10
-0@@ -1589,6 +1589,16 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), +/* + * Patch by Constantin Baranov <[email protected]> + * Report by Andreas Koenecke + */ +UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101, + "Motorola", + "MSnc.", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG), + /* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, "MPIO",diff -upr
linux-2.6.25-rc4/include/linux/usb_usual.hlinux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
---linux-2.6.25-rc4/include/linux/usb_usual.h2008-03-10
22:09:12.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h2008-03-10
22:10:40.000000000 +0400(quoted diff) +3
-2@@ -50,7 +50,9 @@ US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \ /* sometimes sizes is too big */ \ US_FLAG(MAX_SECTORS_MIN,0x00002000) \ - /* Sets max_sectors to arch min */ + /* Sets max_sectors to arch min */ \ + US_FLAG(BULK_IGNORE_TAG,0x00004000) \ + /* Ignore tag mismatch in bulk operations */ #define US_FLAG(name, value) US_FL_##name = value , --To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 8 lines
Matthew Dharm Home: [email protected] Maintainer, Linux USB Mass Storage Driver G: Money isn't everything, A.J. AJ: Who convinced you of that? G: The Chief, at my last salary review. -- Mike and Greg User Friendly, 11/3/1998
I have just copied identification strings from the phone. FIX_INQUIRY causes kernel to use vendor/product strings from unusual_devs.h instead of from device's inquiry data. And I'd like not to change the reality without any reason.
Quoted 102 lines · Matthew Dharm
One last question:
If it's a ROKR Z6, why does the string in
unusual_devs.hsay "MSnc."?Matt
Quoted 94 lines · Constantin Baranov
Yes. These three flags corresponds to three different bugs discussed in [email protected]
(http://www.mail-archive.com/[email protected]/msg19167.html)
FIX_INQUIRY: Device always sends PQ=1 in inquiry data, so SCSI subsystem stops to create sd device.FIX_CAPACITY: Device tells wrong size of internal memory card (real size + 1). If one would try to read/write "phantom" sector then phone hang up and reboot.BULK_IGNORE_TAG: Sometimes device sends wrong tags causing computer to reset endpoint. This may corrupt phone's filesystem in particular.Quoted 81 lines · Matthew Dharm
Are all 3 flags truly needed?
Matt
Quoted 76 lines · Constantin Baranov
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with
FIX_INQUIRYandFIX_CAPACITYflags and newBULK_IGNORE_TAGflag. Last flag relaxes check for equality ofbcs->Tagandus->taginusb_stor_Bulk_transportroutine.Signed-off-by Constantin Baranov <[email protected]>--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 10 ++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-)diff -upr
linux-2.6.25-rc4/drivers/usb/storage/transport.clinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
---linux-2.6.25-rc4/drivers/usb/storage/transport.c2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c2008-03-10 22:11:24.000000000 +0400(quoted diff) +2
-1@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_ US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status); - if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) { + if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || + bcs->Status > US_BULK_STAT_PHASE) { US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR; }diff -upr
linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.hlinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
---linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h2008-03-10 22:10:40.000000000 +0400(quoted diff) +10
-0@@ -1589,6 +1589,16 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), +/* + * Patch by Constantin Baranov <[email protected]> + * Report by Andreas Koenecke + */ +UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101, + "Motorola", + "MSnc.", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG), + /* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, "MPIO",diff -upr
linux-2.6.25-rc4/include/linux/usb_usual.hlinux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
---linux-2.6.25-rc4/include/linux/usb_usual.h2008-03-10
22:09:12.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h2008-03-10
22:10:40.000000000 +0400(quoted diff) +3
-2@@ -50,7 +50,9 @@ US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \ /* sometimes sizes is too big */ \ US_FLAG(MAX_SECTORS_MIN,0x00002000) \ - /* Sets max_sectors to arch min */ + /* Sets max_sectors to arch min */ \ + US_FLAG(BULK_IGNORE_TAG,0x00004000) \ + /* Ignore tag mismatch in bulk operations */ #define US_FLAG(name, value) US_FL_##name = value , --To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
That's reasonable. But you should then update the comment in unusual_devs.h so that people looking at the file know it's for the ROKR Z6.
If you change that, I'll sign off on the patch.
Matt
Quoted 108 lines · Constantin Baranov
I have just copied identification strings from the phone.
FIX_INQUIRYcauses kernel to use vendor/product strings fromunusual_devs.hinstead of from device's inquiry data. And I'd like not to change the reality without any reason.Quoted 102 lines · Matthew Dharm
One last question:
If it's a ROKR Z6, why does the string in
unusual_devs.hsay "MSnc."?Matt
Quoted 94 lines · Constantin Baranov
Yes. These three flags corresponds to three different bugs discussed in [email protected]
(http://www.mail-archive.com/[email protected]/msg19167.html)
FIX_INQUIRY: Device always sends PQ=1 in inquiry data, so SCSI subsystem stops to create sd device.FIX_CAPACITY: Device tells wrong size of internal memory card (real size + 1). If one would try to read/write "phantom" sector then phone hang up and reboot.BULK_IGNORE_TAG: Sometimes device sends wrong tags causing computer to reset endpoint. This may corrupt phone's filesystem in particular.Quoted 81 lines · Matthew Dharm
Are all 3 flags truly needed?
Matt
Quoted 76 lines · Constantin Baranov
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with
FIX_INQUIRYandFIX_CAPACITYflags and newBULK_IGNORE_TAGflag. Last flag relaxes check for equality ofbcs->Tagandus->taginusb_stor_Bulk_transportroutine.Signed-off-by Constantin Baranov <[email protected]>--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 10 ++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 15 insertions(+), 2 deletions(-)diff -upr
linux-2.6.25-rc4/drivers/usb/storage/transport.clinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
---linux-2.6.25-rc4/drivers/usb/storage/transport.c2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c2008-03-10 22:11:24.000000000 +0400(quoted diff) +2
-1@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_ US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status); - if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) { + if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || + bcs->Status > US_BULK_STAT_PHASE) { US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR; }diff -upr
linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.hlinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
---linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h2008-03-10
22:09:11.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h2008-03-10 22:10:40.000000000 +0400(quoted diff) +10
-0@@ -1589,6 +1589,16 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), +/* + * Patch by Constantin Baranov <[email protected]> + * Report by Andreas Koenecke + */ +UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101, + "Motorola", + "MSnc.", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG), + /* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, "MPIO",diff -upr
linux-2.6.25-rc4/include/linux/usb_usual.hlinux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
---linux-2.6.25-rc4/include/linux/usb_usual.h2008-03-10
22:09:12.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h2008-03-10
22:10:40.000000000 +0400(quoted diff) +3
-2@@ -50,7 +50,9 @@ US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \ /* sometimes sizes is too big */ \ US_FLAG(MAX_SECTORS_MIN,0x00002000) \ - /* Sets max_sectors to arch min */ + /* Sets max_sectors to arch min */ \ + US_FLAG(BULK_IGNORE_TAG,0x00004000) \ + /* Ignore tag mismatch in bulk operations */ #define US_FLAG(name, value) US_FL_##name = value , --To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 6 lines
Matthew Dharm Home: [email protected] Maintainer, Linux USB Mass Storage Driver What, are you one of those Microsoft-bashing Linux freaks? -- Customer to Greg User Friendly, 2/10/1999
PATCH 1/1 usb: add support for Motorola ROKR Z6 cellphone in mass storage mode
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with FIX_INQUIRY and FIX_CAPACITY flags and new BULK_IGNORE_TAG flag. Last flag relaxes check for equality of bcs->Tag and us->tag in usb_stor_Bulk_transport routine.
--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 11 +++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 16 insertions(+), 2 deletions(-)
diff -upr linux-2.6.25-rc4/drivers/usb/storage/transport.c linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
--- linux-2.6.25-rc4/drivers/usb/storage/transport.c 2008-03-11
22:08:20.000000000 +0400
+++ linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
2008-03-11 22:09:42.000000000 +0400
@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_
US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n",
le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status);
- if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) {
+ if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) ||
+ bcs->Status > US_BULK_STAT_PHASE) {
US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR;
}
diff -upr linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
--- linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h 2008-03-11
22:08:20.000000000 +0400
+++ linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
2008-03-11 22:14:59.000000000 +0400
@@ -1589,6 +1589,17 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x
US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY),
+/*
+ * Patch by Constantin Baranov <[email protected]>
+ * Report by Andreas Koenecke.
+ * Motorola ROKR Z6.
+ */
+UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101,
+ "Motorola",
+ "MSnc.",
+ US_SC_DEVICE, US_PR_DEVICE, NULL,
+ US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG),
+
/* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999,
"MPIO",
diff -upr linux-2.6.25-rc4/include/linux/usb_usual.h linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
--- linux-2.6.25-rc4/include/linux/usb_usual.h 2008-03-11
22:08:21.000000000 +0400
+++ linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h 2008-03-11
22:09:42.000000000 +0400
@@ -50,7 +50,9 @@
US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \
/* sometimes sizes is too big */ \
US_FLAG(MAX_SECTORS_MIN,0x00002000) \
- /* Sets max_sectors to arch min */
+ /* Sets max_sectors to arch min */ \
+ US_FLAG(BULK_IGNORE_TAG,0x00004000) \
+ /* Ignore tag mismatch in bulk operations */
#define US_FLAG(name, value) US_FL_##name = value ,
Greg, please apply.
Matt
Quoted 73 lines · Constantin Baranov
From: Constantin Baranov <[email protected]>
Motorola ROKR Z6 cellphone has bugs in its USB, so it is impossible to use it as mass storage. Patch describes new "unusual" USB device for it with
FIX_INQUIRYandFIX_CAPACITYflags and newBULK_IGNORE_TAGflag. Last flag relaxes check for equality ofbcs->Tagandus->taginusb_stor_Bulk_transportroutine.Signed-off-by Constantin Baranov <[email protected]>--- drivers/usb/storage/transport.c | 3 ++- drivers/usb/storage/unusual_devs.h | 11 +++++++++++ include/linux/usb_usual.h | 4 +++- 3 files changed, 16 insertions(+), 2 deletions(-)diff -upr
linux-2.6.25-rc4/drivers/usb/storage/transport.clinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c
---linux-2.6.25-rc4/drivers/usb/storage/transport.c2008-03-11
22:08:20.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/transport.c2008-03-11 22:09:42.000000000 +0400(quoted diff) +2
-1@@ -1009,7 +1009,8 @@ int usb_stor_Bulk_transport(struct scsi_ US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", le32_to_cpu(bcs->Signature), bcs->Tag, residue, bcs->Status); - if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) { + if (!(bcs->Tag == us->tag || (us->flags & US_FL_BULK_IGNORE_TAG)) || + bcs->Status > US_BULK_STAT_PHASE) { US_DEBUGP("Bulk logical error\n"); return USB_STOR_TRANSPORT_ERROR; }diff -upr
linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.hlinux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h
---linux-2.6.25-rc4/drivers/usb/storage/unusual_devs.h2008-03-11
22:08:20.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/drivers/usb/storage/unusual_devs.h2008-03-11 22:14:59.000000000 +0400(quoted diff) +11
-0@@ -1589,6 +1589,17 @@ UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY), +/* + * Patch by Constantin Baranov <[email protected]> + * Report by Andreas Koenecke. + * Motorola ROKR Z6. + */ +UNUSUAL_DEV( 0x22b8, 0x6426, 0x0101, 0x0101, + "Motorola", + "MSnc.", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY | US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG), + /* Reported by Radovan Garabik <[email protected]> */ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, "MPIO",diff -upr
linux-2.6.25-rc4/include/linux/usb_usual.hlinux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h
---linux-2.6.25-rc4/include/linux/usb_usual.h2008-03-11
22:08:21.000000000 +0400
+++linux-2.6.25-rc4-motorokr_z6/include/linux/usb_usual.h2008-03-11
22:09:42.000000000 +0400(quoted diff) +3
-1@@ -50,7 +50,9 @@ US_FLAG(CAPACITY_HEURISTICS, 0x00001000) \ /* sometimes sizes is too big */ \ US_FLAG(MAX_SECTORS_MIN,0x00002000) \ - /* Sets max_sectors to arch min */ + /* Sets max_sectors to arch min */ \ + US_FLAG(BULK_IGNORE_TAG,0x00004000) \ + /* Ignore tag mismatch in bulk operations */ #define US_FLAG(name, value) US_FL_##name = value ,
Signature · 7 lines
Matthew Dharm Home: [email protected] Maintainer, Linux USB Mass Storage Driver C: Like the Furby? DP: He gives me the creeps. Think the SPCA will take him? -- Cobb and Dust Puppy User Friendly, 1/2/1999