* to wait for at least one CHECK_CONDITION to determine
         * SANE_SENSE support
         */
-       if ((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) &&
+       if (unlikely((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) &&
            result == USB_STOR_TRANSPORT_GOOD &&
            !(us->fflags & US_FL_SANE_SENSE) &&
-           !(srb->cmnd[2] & 0x20)) {
+           !(us->fflags & US_FL_BAD_SENSE) &&
+           !(srb->cmnd[2] & 0x20))) {
                US_DEBUGP("-- SAT supported, increasing auto-sense\n");
                us->fflags |= US_FL_SANE_SENSE;
        }
                if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) {
                        US_DEBUGP("-- auto-sense aborted\n");
                        srb->result = DID_ABORT << 16;
+
+                       /* If SANE_SENSE caused this problem, disable it */
+                       if (sense_size != US_SENSE_SIZE) {
+                               us->fflags &= ~US_FL_SANE_SENSE;
+                               us->fflags |= US_FL_BAD_SENSE;
+                       }
                        goto Handle_Errors;
                }
 
                 * (small) sense request. This fixes some USB GSM modems
                 */
                if (temp_result == USB_STOR_TRANSPORT_FAILED &&
-                   (us->fflags & US_FL_SANE_SENSE) &&
-                   sense_size != US_SENSE_SIZE) {
+                               sense_size != US_SENSE_SIZE) {
                        US_DEBUGP("-- auto-sense failure, retry small sense\n");
                        sense_size = US_SENSE_SIZE;
+                       us->fflags &= ~US_FL_SANE_SENSE;
+                       us->fflags |= US_FL_BAD_SENSE;
                        goto Retry_Sense;
                }
 
                 */
                if (srb->sense_buffer[7] > (US_SENSE_SIZE - 8) &&
                    !(us->fflags & US_FL_SANE_SENSE) &&
+                   !(us->fflags & US_FL_BAD_SENSE) &&
                    (srb->sense_buffer[0] & 0x7C) == 0x70) {
                        US_DEBUGP("-- SANE_SENSE support enabled\n");
                        us->fflags |= US_FL_SANE_SENSE;
 
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_FIX_CAPACITY ),
 
+/* Reported by Daniel Kukula <daniel.kuku@gmail.com> */
+UNUSUAL_DEV( 0x067b, 0x1063, 0x0100, 0x0100,
+               "Prolific Technology, Inc.",
+               "Prolific Storage Gadget",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_BAD_SENSE ),
+
 /* Reported by Rogerio Brito <rbrito@ime.usp.br> */
 UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
                "Prolific Technology, Inc.",
 
        US_FLAG(SANE_SENSE,     0x00008000)                     \
                /* Sane Sense (> 18 bytes) */                   \
        US_FLAG(CAPACITY_OK,    0x00010000)                     \
-               /* READ CAPACITY response is correct */
+               /* READ CAPACITY response is correct */         \
+       US_FLAG(BAD_SENSE,      0x00020000)                     \
+               /* Bad Sense (never more than 18 bytes) */
 
 #define US_FLAG(name, value)   US_FL_##name = value ,
 enum { US_DO_ALL_FLAGS };