s32 USBStorageOGC_MountLUN(usbstorage_handle *dev, u8 lun) { s32 retval; u32 n_sectors; if(lun >= dev->max_lun) return IPC_EINVAL; usleep(50); retval = __usbstorage_clearerrors(dev, lun); if (retval<0) { USBStorageOGC_Reset(dev); retval = __usbstorage_clearerrors(dev, lun); } retval = USBStorageOGC_Inquiry(dev, lun); retval = USBStorageOGC_ReadCapacity(dev, lun, &dev->sector_size[lun], &n_sectors); if(retval >= 0 && (dev->sector_size[lun]<512 || n_sectors==0)) return INVALID_LUN; __sector_size = dev->sector_size[lun]; __sector_count = n_sectors; return retval; }
s32 USBStorage_MountLUN(usbstorage_handle *dev, u8 lun) { s32 retval; if(lun >= dev->max_lun) return IPC_EINVAL; usleep(50); retval = __usbstorage_clearerrors(dev, lun); if (retval<0) { usb_log("Error __usbstorage_clearerrors: %i. Reset & retry again.\n",retval); USBStorage_Reset(dev); retval = __usbstorage_clearerrors(dev, lun); if (retval<0) usb_log("Error __usbstorage_clearerrors(2): %i.\n",retval); //return retval; } else usb_log("__usbstorage_clearerrors Ok\n"); retval = USBStorage_Inquiry(dev, lun); usb_log("USBStorage_Inquiry: %i\n", retval); retval = USBStorage_ReadCapacity(dev, lun, &dev->sector_size[lun], NULL); usb_log("USBStorage_ReadCapacity: %i sector size: %i\n", retval,dev->sector_size[lun]); return retval; }
s32 USBStorage_Write(usbstorage_handle *dev, u8 lun, u32 sector, u16 n_sectors, const u8 *buffer) { u8 status = 0; s32 retval; u8 cmd[] = { SCSI_WRITE_10, lun << 5, sector >> 24, sector >> 16, sector >> 8, sector, 0, n_sectors >> 8, n_sectors, 0 }; if(lun >= dev->max_lun || dev->sector_size[lun] == 0) return IPC_EINVAL; // more than 60s since last use - make sure drive is awake if(ticks_to_secs(gettime() - usb_last_used) > 60) { usbtimeout = 10; if(method==0) { USB_ResumeDevice(dev->usb_fd); if(dev->bInterfaceSubClass == MASS_STORAGE_SCSI_COMMANDS) { retval = __usbstorage_clearerrors(dev, lun); if (retval < 0) return retval; retval = USBStorage_StartStop(dev, lun, 0, 1, 0); if (retval < 0) return retval; } } else if(method==2) { __usbstorage_clearerrors(dev, lun); } } retval = __cycle(dev, lun, (u8 *)buffer, n_sectors * dev->sector_size[lun], cmd, sizeof(cmd), 1, &status, NULL); if(retval > 0 && status != 0) retval = USBSTORAGE_ESTATUS; usb_last_used = gettime(); usbtimeout = USBSTORAGE_TIMEOUT; return retval; }
s32 USBStorage_MountLUN(struct ehci_hcd * ehci, usbstorage_handle *dev, u8 lun) { s32 retval; int f = handshake_mode; if (lun >= dev->max_lun) return -EINVAL; usb_timeout = 1000 * 1000; handshake_mode = 1; retval = __usbstorage_start_stop(dev, lun, 1); #ifdef MEM_PRINT s_printf(" start_stop cmd ret %i\n", retval); #endif if (retval < 0) goto ret; retval = __usbstorage_clearerrors(ehci, dev, lun); if (retval < 0) goto ret; usb_timeout = 1000 * 1000; retval = USBStorage_Inquiry(ehci, dev, lun); #ifdef MEM_PRINT s_printf(" Inquiry ret %i\n", retval); #endif if (retval < 0) goto ret; retval = USBStorage_ReadCapacity(ehci, dev, lun, &dev->sector_size[lun], &dev->n_sector[lun]); #ifdef MEM_PRINT s_printf(" ReadCapacity ret %i\n", retval); #endif ret: handshake_mode = f; return retval; }
s32 USBStorage_MountLUN(usbstorage_handle *dev, u8 lun) { s32 retval; if(lun >= dev->max_lun) return -EINVAL; retval = __usbstorage_clearerrors(dev, lun); if(retval < 0) return retval; retval = USBStorage_Inquiry(dev, lun); retval = USBStorage_ReadCapacity(dev, lun, &dev->sector_size[lun], &dev->n_sector[lun]); return retval; }
s32 USBStorage_Read(usbstorage_handle *dev, u8 lun, u32 sector, u16 n_sectors, u8 *buffer) { u8 status = 0; s32 retval; u8 cmd[] = { SCSI_READ_10, lun << 5, sector >> 24, sector >> 16, sector >> 8, sector, 0, n_sectors >> 8, n_sectors, 0 }; usb_log("USBStorage_Read sector: %i num: %i\n",sector,n_sectors); if(lun >= dev->max_lun || dev->sector_size[lun] == 0) return IPC_EINVAL; // more than 60s since last use - make sure drive is awake if(ticks_to_secs(gettime() - usb_last_used) > 60) { usbtimeout = 10; usb_log("usbtimeout = 10\n"); if(method==0) { retval = USB_ResumeDevice(dev->usb_fd); usb_log("USB_ResumeDevice ret: %i\n",retval); if(dev->bInterfaceSubClass == MASS_STORAGE_SCSI_COMMANDS) { retval = __usbstorage_clearerrors(dev, lun); usb_log("__usbstorage_clearerrors ret: %i\n",retval); if (retval < 0) return retval; retval = USBStorage_StartStop(dev, lun, 0, 1, 0); usb_log("USBStorage_StartStop ret: %i\n",retval); if (retval < 0) return retval; } } else if(method==2) { retval = __usbstorage_clearerrors(dev, lun); usb_log("__usbstorage_clearerrors ret: %i\n",retval); } else if(method==3) { retval = __usbstorage_clearerrors(dev, lun); usb_log("__usbstorage_clearerrors ret: %i\n",retval); retval = USBStorage_StartStop(dev, lun, 0, 1, 0); usb_log("USBStorage_StartStop ret: %i\n",retval); usleep(100); } } retval = __cycle(dev, lun, buffer, n_sectors * dev->sector_size[lun], cmd, sizeof(cmd), 0, &status, NULL); usb_log("USBStorage_Read __cycle ret: %i status: %i\n",retval,status); if(retval > 0 && status != 0) retval = USBSTORAGE_ESTATUS; usb_last_used = gettime(); usbtimeout = USBSTORAGE_TIMEOUT; usb_log("usbtimeout = %i\n",usbtimeout); return retval; }