All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] usb: write command for RAW partition.
@ 2009-11-03  6:52 Mahavir Jain
  2009-11-13  8:03 ` Mahavir Jain
  2009-11-19 10:33 ` Mahavir Jain
  0 siblings, 2 replies; 4+ messages in thread
From: Mahavir Jain @ 2009-11-03  6:52 UTC (permalink / raw)
  To: u-boot

This patch implements write support to usb device with raw partition.
It will be useful for filesystem write support to usb device from
u-boot in future.

Tested with writing kernel image to raw usb disk & booting with usb
read command into ram.

[Note:  run usb part to get info about start sector & number of
sectors on a partition for usb write operation.]

Signed-off-by: Mahavir Jain <mjain@marvell.com>
---
 common/cmd_usb.c     |   24 ++++++++++++
 common/usb_storage.c |   99 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+), 0 deletions(-)

diff --git a/common/cmd_usb.c b/common/cmd_usb.c
index 7b8ee6b..1acb6fc 100644
--- a/common/cmd_usb.c
+++ b/common/cmd_usb.c
@@ -642,6 +642,28 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 			return 1;
 		}
 	}
+	if (strcmp(argv[1], "write") == 0) {
+		if (usb_stor_curr_dev < 0) {
+			printf("no current device selected\n");
+			return 1;
+		}
+		if (argc == 5) {
+			unsigned long addr = simple_strtoul(argv[2], NULL, 16);
+			unsigned long blk  = simple_strtoul(argv[3], NULL, 16);
+			unsigned long cnt  = simple_strtoul(argv[4], NULL, 16);
+			unsigned long n;
+			printf("\nUSB write: device %d block # %ld, count %ld"
+				" ... ", usb_stor_curr_dev, blk, cnt);
+			stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
+			n = stor_dev->block_write(usb_stor_curr_dev, blk, cnt,
+						(ulong *)addr);
+			printf("%ld blocks write: %s\n", n,
+				(n == cnt) ? "OK" : "ERROR");
+			if (n == cnt)
+				return 0;
+			return 1;
+		}
+	}
 	if (strncmp(argv[1], "dev", 3) == 0) {
 		if (argc == 3) {
 			int dev = (int)simple_strtoul(argv[2], NULL, 10);
@@ -687,6 +709,8 @@ U_BOOT_CMD(
 	" devices\n"
 	"usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"
 	"    to memory address `addr'"
+	"usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'\n"
+	"    from memory address `addr'"
 );
 
 
diff --git a/common/usb_storage.c b/common/usb_storage.c
index 19613f2..ed5b3f3 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -168,6 +168,8 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
 		      struct us_data *ss);
 unsigned long usb_stor_read(int device, unsigned long blknr,
 			    unsigned long blkcnt, void *buffer);
+unsigned long usb_stor_write(int device, unsigned long blknr,
+			     unsigned long blkcnt, const void *buffer);
 struct usb_device * usb_get_dev_index(int index);
 void uhci_show_temp_int_td(void);
 
@@ -227,6 +229,7 @@ int usb_stor_scan(int mode)
 		usb_dev_desc[i].dev = i;
 		usb_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
 		usb_dev_desc[i].block_read = usb_stor_read;
+		usb_dev_desc[i].block_write = usb_stor_write;
 	}
 
 	usb_max_devs = 0;
@@ -964,6 +967,22 @@ static int usb_read_10(ccb *srb, struct us_data *ss, unsigned long start,
 	return ss->transport(srb, ss);
 }
 
+static int usb_write_10(ccb *srb, struct us_data *ss, unsigned long start,
+			unsigned short blocks)
+{
+	memset(&srb->cmd[0], 0, 12);
+	srb->cmd[0] = SCSI_WRITE10;
+	srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
+	srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
+	srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
+	srb->cmd[5] = ((unsigned char) (start)) & 0xff;
+	srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
+	srb->cmd[8] = (unsigned char) blocks & 0xff;
+	srb->cmdlen = 12;
+	USB_STOR_PRINTF("write10: start %lx blocks %x\n", start, blocks);
+	return ss->transport(srb, ss);
+}
+
 
 #ifdef CONFIG_USB_BIN_FIXUP
 /*
@@ -1065,6 +1084,86 @@ retry_it:
 	return blkcnt;
 }
 
+#define USB_MAX_WRITE_BLK 20
+
+unsigned long usb_stor_write(int device, unsigned long blknr,
+				unsigned long blkcnt, const void *buffer)
+{
+	unsigned long start, blks, buf_addr;
+	unsigned short smallblks;
+	struct usb_device *dev;
+	int retry, i;
+	ccb *srb = &usb_ccb;
+
+	if (blkcnt == 0)
+		return 0;
+
+	device &= 0xff;
+	/* Setup  device */
+	USB_STOR_PRINTF("\nusb_write: dev %d \n", device);
+	dev = NULL;
+	for (i = 0; i < USB_MAX_DEVICE; i++) {
+		dev = usb_get_dev_index(i);
+		if (dev == NULL)
+			return 0;
+		if (dev->devnum == usb_dev_desc[device].target)
+			break;
+	}
+
+	usb_disable_asynch(1); /* asynch transfer not allowed */
+
+	srb->lun = usb_dev_desc[device].lun;
+	buf_addr = (unsigned long)buffer;
+	start = blknr;
+	blks = blkcnt;
+	if (usb_test_unit_ready(srb, (struct us_data *)dev->privptr)) {
+		printf("Device NOT ready\n   Request Sense returned %02X %02X"
+		       " %02X\n", srb->sense_buf[2], srb->sense_buf[12],
+			srb->sense_buf[13]);
+		return 0;
+	}
+
+	USB_STOR_PRINTF("\nusb_write: dev %d startblk %lx, blccnt %lx"
+			" buffer %lx\n", device, start, blks, buf_addr);
+
+	do {
+		/* If write fails retry for max retry count else
+		 * return with number of blocks written successfully.
+		 */
+		retry = 2;
+		srb->pdata = (unsigned char *)buf_addr;
+		if (blks > USB_MAX_WRITE_BLK)
+			smallblks = USB_MAX_WRITE_BLK;
+		else
+			smallblks = (unsigned short) blks;
+retry_it:
+		if (smallblks == USB_MAX_WRITE_BLK)
+			usb_show_progress();
+		srb->datalen = usb_dev_desc[device].blksz * smallblks;
+		srb->pdata = (unsigned char *)buf_addr;
+		if (usb_write_10(srb, (struct us_data *)dev->privptr, start,
+		    smallblks)) {
+			USB_STOR_PRINTF("Write ERROR\n");
+			usb_request_sense(srb, (struct us_data *)dev->privptr);
+			if (retry--)
+				goto retry_it;
+			blkcnt -= blks;
+			break;
+		}
+		start += smallblks;
+		blks -= smallblks;
+		buf_addr += srb->datalen;
+	} while (blks != 0);
+
+	USB_STOR_PRINTF("usb_write: end startblk %lx, blccnt %x buffer %lx\n",
+			start, smallblks, buf_addr);
+
+	usb_disable_asynch(0); /* asynch transfer allowed */
+	if (blkcnt >= USB_MAX_WRITE_BLK)
+		printf("\n");
+	return blkcnt;
+
+}
 
 /* Probe to see if a new device is actually a Storage device */
 int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
-- 
1.5.4.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [U-Boot] [PATCH] usb: write command for RAW partition.
  2009-11-03  6:52 [U-Boot] [PATCH] usb: write command for RAW partition Mahavir Jain
@ 2009-11-13  8:03 ` Mahavir Jain
  2009-11-19 10:33 ` Mahavir Jain
  1 sibling, 0 replies; 4+ messages in thread
From: Mahavir Jain @ 2009-11-13  8:03 UTC (permalink / raw)
  To: u-boot

Hi,

Any feedback or comments on this...?

Thanks
Mahavir


On Mon, 2009-11-02 at 22:52 -0800, Mahavir Jain wrote:
> This patch implements write support to usb device with raw partition.
> It will be useful for filesystem write support to usb device from
> u-boot in future.
> 
> Tested with writing kernel image to raw usb disk & booting with usb
> read command into ram.
> 
> [Note:  run usb part to get info about start sector & number of
> sectors on a partition for usb write operation.]
> 
> Signed-off-by: Mahavir Jain <mjain@marvell.com>
> ---
>  common/cmd_usb.c     |   24 ++++++++++++
>  common/usb_storage.c |   99 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 123 insertions(+), 0 deletions(-)
> 
> diff --git a/common/cmd_usb.c b/common/cmd_usb.c
> index 7b8ee6b..1acb6fc 100644
> --- a/common/cmd_usb.c
> +++ b/common/cmd_usb.c
> @@ -642,6 +642,28 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
>  			return 1;
>  		}
>  	}
> +	if (strcmp(argv[1], "write") == 0) {
> +		if (usb_stor_curr_dev < 0) {
> +			printf("no current device selected\n");
> +			return 1;
> +		}
> +		if (argc == 5) {
> +			unsigned long addr = simple_strtoul(argv[2], NULL, 16);
> +			unsigned long blk  = simple_strtoul(argv[3], NULL, 16);
> +			unsigned long cnt  = simple_strtoul(argv[4], NULL, 16);
> +			unsigned long n;
> +			printf("\nUSB write: device %d block # %ld, count %ld"
> +				" ... ", usb_stor_curr_dev, blk, cnt);
> +			stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
> +			n = stor_dev->block_write(usb_stor_curr_dev, blk, cnt,
> +						(ulong *)addr);
> +			printf("%ld blocks write: %s\n", n,
> +				(n == cnt) ? "OK" : "ERROR");
> +			if (n == cnt)
> +				return 0;
> +			return 1;
> +		}
> +	}
>  	if (strncmp(argv[1], "dev", 3) == 0) {
>  		if (argc == 3) {
>  			int dev = (int)simple_strtoul(argv[2], NULL, 10);
> @@ -687,6 +709,8 @@ U_BOOT_CMD(
>  	" devices\n"
>  	"usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"
>  	"    to memory address `addr'"
> +	"usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'\n"
> +	"    from memory address `addr'"
>  );
>  
> 
> diff --git a/common/usb_storage.c b/common/usb_storage.c
> index 19613f2..ed5b3f3 100644
> --- a/common/usb_storage.c
> +++ b/common/usb_storage.c
> @@ -168,6 +168,8 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
>  		      struct us_data *ss);
>  unsigned long usb_stor_read(int device, unsigned long blknr,
>  			    unsigned long blkcnt, void *buffer);
> +unsigned long usb_stor_write(int device, unsigned long blknr,
> +			     unsigned long blkcnt, const void *buffer);
>  struct usb_device * usb_get_dev_index(int index);
>  void uhci_show_temp_int_td(void);
>  
> @@ -227,6 +229,7 @@ int usb_stor_scan(int mode)
>  		usb_dev_desc[i].dev = i;
>  		usb_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
>  		usb_dev_desc[i].block_read = usb_stor_read;
> +		usb_dev_desc[i].block_write = usb_stor_write;
>  	}
>  
>  	usb_max_devs = 0;
> @@ -964,6 +967,22 @@ static int usb_read_10(ccb *srb, struct us_data *ss, unsigned long start,
>  	return ss->transport(srb, ss);
>  }
>  
> +static int usb_write_10(ccb *srb, struct us_data *ss, unsigned long start,
> +			unsigned short blocks)
> +{
> +	memset(&srb->cmd[0], 0, 12);
> +	srb->cmd[0] = SCSI_WRITE10;
> +	srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
> +	srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
> +	srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
> +	srb->cmd[5] = ((unsigned char) (start)) & 0xff;
> +	srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
> +	srb->cmd[8] = (unsigned char) blocks & 0xff;
> +	srb->cmdlen = 12;
> +	USB_STOR_PRINTF("write10: start %lx blocks %x\n", start, blocks);
> +	return ss->transport(srb, ss);
> +}
> +
>  
>  #ifdef CONFIG_USB_BIN_FIXUP
>  /*
> @@ -1065,6 +1084,86 @@ retry_it:
>  	return blkcnt;
>  }
>  
> +#define USB_MAX_WRITE_BLK 20
> +
> +unsigned long usb_stor_write(int device, unsigned long blknr,
> +				unsigned long blkcnt, const void *buffer)
> +{
> +	unsigned long start, blks, buf_addr;
> +	unsigned short smallblks;
> +	struct usb_device *dev;
> +	int retry, i;
> +	ccb *srb = &usb_ccb;
> +
> +	if (blkcnt == 0)
> +		return 0;
> +
> +	device &= 0xff;
> +	/* Setup  device */
> +	USB_STOR_PRINTF("\nusb_write: dev %d \n", device);
> +	dev = NULL;
> +	for (i = 0; i < USB_MAX_DEVICE; i++) {
> +		dev = usb_get_dev_index(i);
> +		if (dev == NULL)
> +			return 0;
> +		if (dev->devnum == usb_dev_desc[device].target)
> +			break;
> +	}
> +
> +	usb_disable_asynch(1); /* asynch transfer not allowed */
> +
> +	srb->lun = usb_dev_desc[device].lun;
> +	buf_addr = (unsigned long)buffer;
> +	start = blknr;
> +	blks = blkcnt;
> +	if (usb_test_unit_ready(srb, (struct us_data *)dev->privptr)) {
> +		printf("Device NOT ready\n   Request Sense returned %02X %02X"
> +		       " %02X\n", srb->sense_buf[2], srb->sense_buf[12],
> +			srb->sense_buf[13]);
> +		return 0;
> +	}
> +
> +	USB_STOR_PRINTF("\nusb_write: dev %d startblk %lx, blccnt %lx"
> +			" buffer %lx\n", device, start, blks, buf_addr);
> +
> +	do {
> +		/* If write fails retry for max retry count else
> +		 * return with number of blocks written successfully.
> +		 */
> +		retry = 2;
> +		srb->pdata = (unsigned char *)buf_addr;
> +		if (blks > USB_MAX_WRITE_BLK)
> +			smallblks = USB_MAX_WRITE_BLK;
> +		else
> +			smallblks = (unsigned short) blks;
> +retry_it:
> +		if (smallblks == USB_MAX_WRITE_BLK)
> +			usb_show_progress();
> +		srb->datalen = usb_dev_desc[device].blksz * smallblks;
> +		srb->pdata = (unsigned char *)buf_addr;
> +		if (usb_write_10(srb, (struct us_data *)dev->privptr, start,
> +		    smallblks)) {
> +			USB_STOR_PRINTF("Write ERROR\n");
> +			usb_request_sense(srb, (struct us_data *)dev->privptr);
> +			if (retry--)
> +				goto retry_it;
> +			blkcnt -= blks;
> +			break;
> +		}
> +		start += smallblks;
> +		blks -= smallblks;
> +		buf_addr += srb->datalen;
> +	} while (blks != 0);
> +
> +	USB_STOR_PRINTF("usb_write: end startblk %lx, blccnt %x buffer %lx\n",
> +			start, smallblks, buf_addr);
> +
> +	usb_disable_asynch(0); /* asynch transfer allowed */
> +	if (blkcnt >= USB_MAX_WRITE_BLK)
> +		printf("\n");
> +	return blkcnt;
> +
> +}
>  
>  /* Probe to see if a new device is actually a Storage device */
>  int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [U-Boot] [PATCH] usb: write command for RAW partition.
  2009-11-03  6:52 [U-Boot] [PATCH] usb: write command for RAW partition Mahavir Jain
  2009-11-13  8:03 ` Mahavir Jain
@ 2009-11-19 10:33 ` Mahavir Jain
  2009-12-03 20:30   ` Remy Bohmer
  1 sibling, 1 reply; 4+ messages in thread
From: Mahavir Jain @ 2009-11-19 10:33 UTC (permalink / raw)
  To: u-boot

Hi Remy,

This patch looks straight forward to me as it would be useful for
generic USB file system write support in future (FYI i was able to write
kernel image to raw partition & boot from it). I would really
appreciate any feedback or suggestions on this.


Thanks
Mahavir


On Mon, 2009-11-02 at 22:52 -0800, Mahavir Jain wrote:
> This patch implements write support to usb device with raw partition.
> It will be useful for filesystem write support to usb device from
> u-boot in future.
> 
> Tested with writing kernel image to raw usb disk & booting with usb
> read command into ram.
> 
> [Note:  run usb part to get info about start sector & number of
> sectors on a partition for usb write operation.]
> 
> Signed-off-by: Mahavir Jain <mjain@marvell.com>
> ---
>  common/cmd_usb.c     |   24 ++++++++++++
>  common/usb_storage.c |   99 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 123 insertions(+), 0 deletions(-)
> 
> diff --git a/common/cmd_usb.c b/common/cmd_usb.c
> index 7b8ee6b..1acb6fc 100644
> --- a/common/cmd_usb.c
> +++ b/common/cmd_usb.c
> @@ -642,6 +642,28 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
>  			return 1;
>  		}
>  	}
> +	if (strcmp(argv[1], "write") == 0) {
> +		if (usb_stor_curr_dev < 0) {
> +			printf("no current device selected\n");
> +			return 1;
> +		}
> +		if (argc == 5) {
> +			unsigned long addr = simple_strtoul(argv[2], NULL, 16);
> +			unsigned long blk  = simple_strtoul(argv[3], NULL, 16);
> +			unsigned long cnt  = simple_strtoul(argv[4], NULL, 16);
> +			unsigned long n;
> +			printf("\nUSB write: device %d block # %ld, count %ld"
> +				" ... ", usb_stor_curr_dev, blk, cnt);
> +			stor_dev = usb_stor_get_dev(usb_stor_curr_dev);
> +			n = stor_dev->block_write(usb_stor_curr_dev, blk, cnt,
> +						(ulong *)addr);
> +			printf("%ld blocks write: %s\n", n,
> +				(n == cnt) ? "OK" : "ERROR");
> +			if (n == cnt)
> +				return 0;
> +			return 1;
> +		}
> +	}
>  	if (strncmp(argv[1], "dev", 3) == 0) {
>  		if (argc == 3) {
>  			int dev = (int)simple_strtoul(argv[2], NULL, 10);
> @@ -687,6 +709,8 @@ U_BOOT_CMD(
>  	" devices\n"
>  	"usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"
>  	"    to memory address `addr'"
> +	"usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'\n"
> +	"    from memory address `addr'"
>  );
>  
> 
> diff --git a/common/usb_storage.c b/common/usb_storage.c
> index 19613f2..ed5b3f3 100644
> --- a/common/usb_storage.c
> +++ b/common/usb_storage.c
> @@ -168,6 +168,8 @@ int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,
>  		      struct us_data *ss);
>  unsigned long usb_stor_read(int device, unsigned long blknr,
>  			    unsigned long blkcnt, void *buffer);
> +unsigned long usb_stor_write(int device, unsigned long blknr,
> +			     unsigned long blkcnt, const void *buffer);
>  struct usb_device * usb_get_dev_index(int index);
>  void uhci_show_temp_int_td(void);
>  
> @@ -227,6 +229,7 @@ int usb_stor_scan(int mode)
>  		usb_dev_desc[i].dev = i;
>  		usb_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
>  		usb_dev_desc[i].block_read = usb_stor_read;
> +		usb_dev_desc[i].block_write = usb_stor_write;
>  	}
>  
>  	usb_max_devs = 0;
> @@ -964,6 +967,22 @@ static int usb_read_10(ccb *srb, struct us_data *ss, unsigned long start,
>  	return ss->transport(srb, ss);
>  }
>  
> +static int usb_write_10(ccb *srb, struct us_data *ss, unsigned long start,
> +			unsigned short blocks)
> +{
> +	memset(&srb->cmd[0], 0, 12);
> +	srb->cmd[0] = SCSI_WRITE10;
> +	srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
> +	srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
> +	srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
> +	srb->cmd[5] = ((unsigned char) (start)) & 0xff;
> +	srb->cmd[7] = ((unsigned char) (blocks >> 8)) & 0xff;
> +	srb->cmd[8] = (unsigned char) blocks & 0xff;
> +	srb->cmdlen = 12;
> +	USB_STOR_PRINTF("write10: start %lx blocks %x\n", start, blocks);
> +	return ss->transport(srb, ss);
> +}
> +
>  
>  #ifdef CONFIG_USB_BIN_FIXUP
>  /*
> @@ -1065,6 +1084,86 @@ retry_it:
>  	return blkcnt;
>  }
>  
> +#define USB_MAX_WRITE_BLK 20
> +
> +unsigned long usb_stor_write(int device, unsigned long blknr,
> +				unsigned long blkcnt, const void *buffer)
> +{
> +	unsigned long start, blks, buf_addr;
> +	unsigned short smallblks;
> +	struct usb_device *dev;
> +	int retry, i;
> +	ccb *srb = &usb_ccb;
> +
> +	if (blkcnt == 0)
> +		return 0;
> +
> +	device &= 0xff;
> +	/* Setup  device */
> +	USB_STOR_PRINTF("\nusb_write: dev %d \n", device);
> +	dev = NULL;
> +	for (i = 0; i < USB_MAX_DEVICE; i++) {
> +		dev = usb_get_dev_index(i);
> +		if (dev == NULL)
> +			return 0;
> +		if (dev->devnum == usb_dev_desc[device].target)
> +			break;
> +	}
> +
> +	usb_disable_asynch(1); /* asynch transfer not allowed */
> +
> +	srb->lun = usb_dev_desc[device].lun;
> +	buf_addr = (unsigned long)buffer;
> +	start = blknr;
> +	blks = blkcnt;
> +	if (usb_test_unit_ready(srb, (struct us_data *)dev->privptr)) {
> +		printf("Device NOT ready\n   Request Sense returned %02X %02X"
> +		       " %02X\n", srb->sense_buf[2], srb->sense_buf[12],
> +			srb->sense_buf[13]);
> +		return 0;
> +	}
> +
> +	USB_STOR_PRINTF("\nusb_write: dev %d startblk %lx, blccnt %lx"
> +			" buffer %lx\n", device, start, blks, buf_addr);
> +
> +	do {
> +		/* If write fails retry for max retry count else
> +		 * return with number of blocks written successfully.
> +		 */
> +		retry = 2;
> +		srb->pdata = (unsigned char *)buf_addr;
> +		if (blks > USB_MAX_WRITE_BLK)
> +			smallblks = USB_MAX_WRITE_BLK;
> +		else
> +			smallblks = (unsigned short) blks;
> +retry_it:
> +		if (smallblks == USB_MAX_WRITE_BLK)
> +			usb_show_progress();
> +		srb->datalen = usb_dev_desc[device].blksz * smallblks;
> +		srb->pdata = (unsigned char *)buf_addr;
> +		if (usb_write_10(srb, (struct us_data *)dev->privptr, start,
> +		    smallblks)) {
> +			USB_STOR_PRINTF("Write ERROR\n");
> +			usb_request_sense(srb, (struct us_data *)dev->privptr);
> +			if (retry--)
> +				goto retry_it;
> +			blkcnt -= blks;
> +			break;
> +		}
> +		start += smallblks;
> +		blks -= smallblks;
> +		buf_addr += srb->datalen;
> +	} while (blks != 0);
> +
> +	USB_STOR_PRINTF("usb_write: end startblk %lx, blccnt %x buffer %lx\n",
> +			start, smallblks, buf_addr);
> +
> +	usb_disable_asynch(0); /* asynch transfer allowed */
> +	if (blkcnt >= USB_MAX_WRITE_BLK)
> +		printf("\n");
> +	return blkcnt;
> +
> +}
>  
>  /* Probe to see if a new device is actually a Storage device */
>  int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [U-Boot] [PATCH] usb: write command for RAW partition.
  2009-11-19 10:33 ` Mahavir Jain
@ 2009-12-03 20:30   ` Remy Bohmer
  0 siblings, 0 replies; 4+ messages in thread
From: Remy Bohmer @ 2009-12-03 20:30 UTC (permalink / raw)
  To: u-boot

Hi,

2009/11/19 Mahavir Jain <mjain@marvell.com>:
> Hi Remy,
>
> This patch looks straight forward to me as it would be useful for
> generic USB file system write support in future (FYI i was able to write
> kernel image to raw partition & boot from it). I would really
> appreciate any feedback or suggestions on this.

Applied to U-boot-usb next.

Thanks.

Remy

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-12-03 20:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-03  6:52 [U-Boot] [PATCH] usb: write command for RAW partition Mahavir Jain
2009-11-13  8:03 ` Mahavir Jain
2009-11-19 10:33 ` Mahavir Jain
2009-12-03 20:30   ` Remy Bohmer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.