Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 6
0
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;
}