summaryrefslogtreecommitdiff
path: root/firmware/usbstack
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-03-03 22:53:25 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-03-03 22:53:25 +0000
commit6cfa9090029163db72eb0b50a96cfcf1e663f208 (patch)
tree89f6a1064b8e1c657bacc30fc005c7781cae74e0 /firmware/usbstack
parent81d3a02928083b54560709488ad81911494d3796 (diff)
downloadrockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.zip
rockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.tar.gz
rockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.tar.bz2
rockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.tar.xz
handle START_STOP_UNIT eject command, to make TEST_UNIT_READY return false once the OS ejects
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16503 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack')
-rw-r--r--firmware/usbstack/usb_storage.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 9fae7fc..b526d7b 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -219,6 +219,7 @@ static void send_block_data(void *data,int size);
static void receive_block_data(void *data,int size);
static void identify2inquiry(int lun);
static void send_and_read_next(void);
+static bool ejected[NUM_VOLUMES];
static enum {
WAITING_FOR_COMMAND,
@@ -231,6 +232,9 @@ static enum {
/* called by usb_code_init() */
void usb_storage_init(void)
{
+ int i;
+ for(i=0;i<NUM_VOLUMES;i++)
+ ejected[i]=false;
logf("usb_storage_init done");
}
@@ -473,6 +477,9 @@ static void handle_scsi(struct command_block_wrapper* cbw)
block_count = (identify[61] << 16 | identify[60]);
#endif
+ if(ejected[lun])
+ lun_present = false;
+
#ifdef MAX_LOG_SECTOR_SIZE
block_size_mult = disk_sector_multiplier;
#endif
@@ -634,6 +641,14 @@ static void handle_scsi(struct command_block_wrapper* cbw)
case SCSI_START_STOP_UNIT:
logf("scsi start_stop unit %d",lun);
+ if((cbw->command_block[4] & 0xf0) == 0) /* Process start and eject bits */
+ {
+ if((cbw->command_block[4] & 0x01) == 0 &&
+ (cbw->command_block[4] & 0x02) != 0) /* Stop and eject */
+ {
+ ejected[lun]=true;
+ }
+ }
send_csw(UMS_STATUS_GOOD);
break;