dm: usb: Tidy up storage code ready for driver model conversion

Adjust a few things so that the addition of driver-models support involved
adding code rather than also changing it. This makes the patches easier to
review.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
Tested-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
Simon Glass 2016-02-29 15:25:54 -07:00
parent c89e79d419
commit 9807c3b78a

View file

@ -142,6 +142,7 @@ static void usb_show_progress(void)
*/ */
int usb_stor_info(void) int usb_stor_info(void)
{ {
int count = 0;
int i; int i;
if (usb_max_devs > 0) { if (usb_max_devs > 0) {
@ -152,7 +153,11 @@ int usb_stor_info(void)
return 0; return 0;
} }
if (!count) {
printf("No storage devices, perhaps not 'usb start'ed..?\n"); printf("No storage devices, perhaps not 'usb start'ed..?\n");
return 1;
}
return 1; return 1;
} }
@ -171,9 +176,12 @@ static unsigned int usb_get_max_lun(struct us_data *us)
return (len > 0) ? *result : 0; return (len > 0) ? *result : 0;
} }
static int usb_stor_probe_device(struct usb_device *dev) static int usb_stor_probe_device(struct usb_device *udev)
{ {
if (dev == NULL) int lun, max_lun;
int start;
if (udev == NULL)
return -ENOENT; /* no more devices available */ return -ENOENT; /* no more devices available */
/* We don't have space to even probe if we hit the maximum */ /* We don't have space to even probe if we hit the maximum */
@ -184,15 +192,17 @@ static int usb_stor_probe_device(struct usb_device *dev)
} }
debug("\n\nProbing for storage\n"); debug("\n\nProbing for storage\n");
if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) { if (!usb_storage_probe(udev, 0, &usb_stor[usb_max_devs]))
/* OK, it's a storage device. Iterate over its LUNs return 0;
* and populate `usb_dev_desc'.
/*
* OK, it's a storage device. Iterate over its LUNs and populate
* usb_dev_desc'
*/ */
int lun, max_lun, start = usb_max_devs; start = usb_max_devs;
max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]); max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
for (lun = 0; for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV;
lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV;
lun++) { lun++) {
struct blk_desc *blkdev; struct blk_desc *blkdev;
@ -206,14 +216,12 @@ static int usb_stor_probe_device(struct usb_device *dev)
blkdev->block_read = usb_stor_read; blkdev->block_read = usb_stor_read;
blkdev->block_write = usb_stor_write; blkdev->block_write = usb_stor_write;
blkdev->lun = lun; blkdev->lun = lun;
blkdev->priv = dev; blkdev->priv = udev;
if (usb_stor_get_info(dev, &usb_stor[start], if (usb_stor_get_info(udev, &usb_stor[start],
&usb_dev_desc[usb_max_devs]) == &usb_dev_desc[usb_max_devs]) == 1) {
1) {
usb_max_devs++; usb_max_devs++;
debug("%s: Found device %p\n", __func__, dev); debug("%s: Found device %p\n", __func__, udev);
}
} }
} }
@ -1029,36 +1037,33 @@ static void usb_bin_fixup(struct usb_device_descriptor descriptor,
static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr, static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr,
lbaint_t blkcnt, void *buffer) lbaint_t blkcnt, void *buffer)
{ {
int device = block_dev->devnum;
lbaint_t start, blks; lbaint_t start, blks;
uintptr_t buf_addr; uintptr_t buf_addr;
unsigned short smallblks; unsigned short smallblks;
struct usb_device *dev; struct usb_device *udev;
struct us_data *ss; struct us_data *ss;
int retry; int retry;
ccb *srb = &usb_ccb; ccb *srb = &usb_ccb;
if (blkcnt == 0) if (blkcnt == 0)
return 0; return 0;
device &= 0xff;
/* Setup device */ /* Setup device */
debug("\nusb_read: dev %d\n", device); debug("\nusb_read: udev %d\n", block_dev->devnum);
dev = usb_dev_desc[device].priv; udev = usb_dev_desc[block_dev->devnum].priv;
if (!dev) { if (!udev) {
debug("%s: No device\n", __func__); debug("%s: No device\n", __func__);
return 0; return 0;
} }
ss = (struct us_data *)dev->privptr; ss = (struct us_data *)udev->privptr;
usb_disable_asynch(1); /* asynch transfer not allowed */ usb_disable_asynch(1); /* asynch transfer not allowed */
srb->lun = usb_dev_desc[device].lun; srb->lun = block_dev->lun;
buf_addr = (uintptr_t)buffer; buf_addr = (uintptr_t)buffer;
start = blknr; start = blknr;
blks = blkcnt; blks = blkcnt;
debug("\nusb_read: dev %d startblk " LBAF ", blccnt " LBAF debug("\nusb_read: dev %d startblk " LBAF ", blccnt " LBAF " buffer %"
" buffer %" PRIxPTR "\n", device, start, blks, buf_addr); PRIxPTR "\n", block_dev->devnum, start, blks, buf_addr);
do { do {
/* XXX need some comment here */ /* XXX need some comment here */
@ -1071,7 +1076,7 @@ static unsigned long usb_stor_read(struct blk_desc *block_dev, lbaint_t blknr,
retry_it: retry_it:
if (smallblks == USB_MAX_XFER_BLK) if (smallblks == USB_MAX_XFER_BLK)
usb_show_progress(); usb_show_progress();
srb->datalen = usb_dev_desc[device].blksz * smallblks; srb->datalen = block_dev->blksz * smallblks;
srb->pdata = (unsigned char *)buf_addr; srb->pdata = (unsigned char *)buf_addr;
if (usb_read_10(srb, ss, start, smallblks)) { if (usb_read_10(srb, ss, start, smallblks)) {
debug("Read ERROR\n"); debug("Read ERROR\n");
@ -1100,11 +1105,10 @@ retry_it:
static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr, static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
lbaint_t blkcnt, const void *buffer) lbaint_t blkcnt, const void *buffer)
{ {
int device = block_dev->devnum;
lbaint_t start, blks; lbaint_t start, blks;
uintptr_t buf_addr; uintptr_t buf_addr;
unsigned short smallblks; unsigned short smallblks;
struct usb_device *dev; struct usb_device *udev;
struct us_data *ss; struct us_data *ss;
int retry; int retry;
ccb *srb = &usb_ccb; ccb *srb = &usb_ccb;
@ -1112,23 +1116,24 @@ static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
if (blkcnt == 0) if (blkcnt == 0)
return 0; return 0;
device &= 0xff;
/* Setup device */ /* Setup device */
debug("\nusb_write: dev %d\n", device); debug("\nusb_read: udev %d\n", block_dev->devnum);
dev = usb_dev_desc[device].priv; udev = usb_dev_desc[block_dev->devnum].priv;
if (!dev) if (!udev) {
debug("%s: No device\n", __func__);
return 0; return 0;
ss = (struct us_data *)dev->privptr; }
ss = (struct us_data *)udev->privptr;
usb_disable_asynch(1); /* asynch transfer not allowed */ usb_disable_asynch(1); /* asynch transfer not allowed */
srb->lun = usb_dev_desc[device].lun; srb->lun = block_dev->lun;
buf_addr = (uintptr_t)buffer; buf_addr = (uintptr_t)buffer;
start = blknr; start = blknr;
blks = blkcnt; blks = blkcnt;
debug("\nusb_write: dev %d startblk " LBAF ", blccnt " LBAF debug("\nusb_write: dev %d startblk " LBAF ", blccnt " LBAF " buffer %"
" buffer %" PRIxPTR "\n", device, start, blks, buf_addr); PRIxPTR "\n", block_dev->devnum, start, blks, buf_addr);
do { do {
/* If write fails retry for max retry count else /* If write fails retry for max retry count else
@ -1143,7 +1148,7 @@ static unsigned long usb_stor_write(struct blk_desc *block_dev, lbaint_t blknr,
retry_it: retry_it:
if (smallblks == USB_MAX_XFER_BLK) if (smallblks == USB_MAX_XFER_BLK)
usb_show_progress(); usb_show_progress();
srb->datalen = usb_dev_desc[device].blksz * smallblks; srb->datalen = block_dev->blksz * smallblks;
srb->pdata = (unsigned char *)buf_addr; srb->pdata = (unsigned char *)buf_addr;
if (usb_write_10(srb, ss, start, smallblks)) { if (usb_write_10(srb, ss, start, smallblks)) {
debug("Write ERROR\n"); debug("Write ERROR\n");