[haiku-commits] Re: r38405 - haiku/trunk/src/add-ons/kernel/drivers/disk/usb/usb_floppy

  • From: "Stephan Assmus" <superstippi@xxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 27 Aug 2010 19:59:09 +0200

-------- Original-Nachricht --------
> Datum: Fri, 27 Aug 2010 19:54:04 +0200 (CEST)
> Von: pulkomandy@xxxxxxxxxxxxxxxxx
> An: haiku-commits@xxxxxxxxxxxxx
> Betreff: [haiku-commits] r38405 - 
> haiku/trunk/src/add-ons/kernel/drivers/disk/usb/usb_floppy

> Author: pulkomandy
> Date: 2010-08-27 19:54:04 +0200 (Fri, 27 Aug 2010)
> New Revision: 38405
> Changeset: http://dev.haiku-os.org/changeset/38405
> 
> Modified:
>    haiku/trunk/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp
> Log:
> Use block read and block write instead of regular read and write commands.
> Mounting the device read-only now works. Writing 
> is still not working.
> 
> 
> Modified:
> haiku/trunk/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp
> ===================================================================
> ---
> haiku/trunk/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp       
> 2010-08-27 17:33:54 UTC (rev 38404)
> +++
> haiku/trunk/src/add-ons/kernel/drivers/disk/usb/usb_floppy/usb_disk.cpp       
> 2010-08-27 17:54:04 UTC (rev 38405)
> @@ -837,18 +837,23 @@
>       uint8 commandBlock[12];
>       memset(commandBlock, 0, sizeof(commandBlock));
>  
> -     commandBlock[0] = SCSI_READ_10;
> +     commandBlock[0] = 0xA8;
>       commandBlock[1] = lun->logical_unit_number << 5;
>       commandBlock[2] = blockPosition >> 24;
>       commandBlock[3] = blockPosition >> 16;
>       commandBlock[4] = blockPosition >> 8;
>       commandBlock[5] = blockPosition;
> -     commandBlock[7] = *length >> 8;
> -     commandBlock[8] = *length;
> -     // TODO: blockCount ?
> +     commandBlock[6] = blockCount >> 24;
> +     commandBlock[7] = blockCount >> 16;
> +     commandBlock[8] = blockCount >> 8;
> +     commandBlock[9] = blockCount;
>  
> -     status_t result = usb_disk_operation(lun, commandBlock, buffer, length,
> -             true);
> +     status_t result;
> +     do {
> +             snooze(10000);
> +             result = usb_disk_operation(lun, commandBlock, buffer, length,
> +                     true);
> +     } while (result != B_OK);
>       return result;
>  }
>  
> @@ -860,18 +865,24 @@
>       uint8 commandBlock[12];
>       memset(commandBlock, 0, sizeof(commandBlock));
>  
> -     commandBlock[0] = SCSI_WRITE_10;
> +     commandBlock[0] = 0xAA;
>       commandBlock[1] = lun->logical_unit_number << 5;
>       commandBlock[2] = blockPosition >> 24;
>       commandBlock[3] = blockPosition >> 16;
>       commandBlock[4] = blockPosition >> 8;
>       commandBlock[5] = blockPosition;
> -     commandBlock[7] = *length >> 8;
> -     commandBlock[8] = *length;
> -     // TOOD: blockCount ?
> +     commandBlock[6] = blockCount >> 24;
> +     commandBlock[7] = blockCount >> 16;
> +     commandBlock[8] = blockCount >> 8;
> +     commandBlock[9] = blockCount;
>  
> -     status_t result = usb_disk_operation(lun, commandBlock, buffer, length,
> -             false);
> +     status_t result;
> +     do {
> +             snooze(10000);
> +             result = usb_disk_operation(lun, commandBlock, buffer, length,
> +                     true);
> +     } while (result != B_OK);
> +
>       if (result == B_OK)
>               lun->should_sync = true;
>       return result;

Wouldn't it be better to snooze after the first operation request instead of 
before? It appears this imposes a delay even if the device implementation could 
respond quicker. Also it could be an idea to start with a lower delay and 
increase it in each iteration until it reaches a certain maximum.

Best regards,
-Stephan

Other related posts: