diff options
Diffstat (limited to 'drivers/usb/storage/usb.c')
-rw-r--r-- | drivers/usb/storage/usb.c | 77 |
1 files changed, 35 insertions, 42 deletions
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index a43b498e4b..cc241e69be 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -1,30 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Most of this source has been derived from the Linux and * U-Boot USB Mass Storage driver implementations. * * Adapted for barebox: * Copyright (c) 2011, AMK Drives & Controls Ltd. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * */ #include <common.h> #include <init.h> #include <malloc.h> +#include <dma.h> #include <errno.h> #include <scsi.h> -#include <usb/usb.h> -#include <usb/usb_defs.h> +#include <linux/usb/usb.h> +#include <linux/usb/usb_defs.h> #include <asm/unaligned.h> @@ -41,10 +31,10 @@ static int usb_stor_request_sense(struct us_blk_dev *usb_blkdev) { struct us_data *us = usb_blkdev->us; - struct device_d *dev = &us->pusb_dev->dev; + struct device *dev = &us->pusb_dev->dev; u8 cmd[6]; const u8 datalen = 18; - u8 *data = xzalloc(datalen); + u8 *data = dma_alloc(datalen); dev_dbg(dev, "SCSI_REQ_SENSE\n"); @@ -55,7 +45,7 @@ static int usb_stor_request_sense(struct us_blk_dev *usb_blkdev) dev_dbg(dev, "Request Sense returned %02X %02X %02X\n", data[2], data[12], data[13]); - free(data); + dma_free(data); return 0; } @@ -84,7 +74,7 @@ static int usb_stor_transport(struct us_blk_dev *usb_blkdev, int retries, int request_sense_delay_ms) { struct us_data *us = usb_blkdev->us; - struct device_d *dev = &us->pusb_dev->dev; + struct device *dev = &us->pusb_dev->dev; int i, ret; for (i = 0; i <= retries; i++) { @@ -111,11 +101,11 @@ static int usb_stor_transport(struct us_blk_dev *usb_blkdev, static int usb_stor_inquiry(struct us_blk_dev *usb_blkdev) { - struct device_d *dev = &usb_blkdev->us->pusb_dev->dev; + struct device *dev = &usb_blkdev->us->pusb_dev->dev; int ret; u8 cmd[6]; const u16 datalen = 36; - u8 *data = xzalloc(datalen); + u8 *data = dma_alloc(datalen); memset(cmd, 0, sizeof(cmd)); cmd[0] = SCSI_INQUIRY; @@ -137,7 +127,7 @@ static int usb_stor_inquiry(struct us_blk_dev *usb_blkdev) // TODO: process and store device info exit: - free(data); + dma_free(data); return ret; } @@ -162,10 +152,10 @@ static int usb_stor_test_unit_ready(struct us_blk_dev *usb_blkdev, u64 timeout_n static int read_capacity_16(struct us_blk_dev *usb_blkdev) { - struct device_d *dev = &usb_blkdev->us->pusb_dev->dev; + struct device *dev = &usb_blkdev->us->pusb_dev->dev; unsigned char cmd[16]; const u8 datalen = 32; - u8 *data = xzalloc(datalen); + u8 *data = dma_alloc(datalen); int ret; sector_t lba; unsigned sector_size; @@ -180,7 +170,7 @@ static int read_capacity_16(struct us_blk_dev *usb_blkdev) if (ret < 0) { dev_warn(dev, "Read Capacity(16) failed\n"); - return ret; + goto fail; } /* Note this is logical, not physical sector size */ @@ -192,21 +182,25 @@ static int read_capacity_16(struct us_blk_dev *usb_blkdev) if ((data[12] & 1) == 1) { dev_warn(dev, "Protection unsupported\n"); - return -ENOTSUPP; + ret = -ENOTSUPP; + goto fail; } usb_blkdev->blk.blockbits = SECTOR_SHIFT; usb_blkdev->blk.num_blocks = lba + 1; - return sector_size; + ret = sector_size; +fail: + dma_free(data); + return ret; } static int read_capacity_10(struct us_blk_dev *usb_blkdev) { - struct device_d *dev = &usb_blkdev->us->pusb_dev->dev; + struct device *dev = &usb_blkdev->us->pusb_dev->dev; unsigned char cmd[16]; const u32 datalen = 8; - __be32 *data = xzalloc(datalen); + __be32 *data = dma_alloc(datalen); int ret; sector_t lba; unsigned sector_size; @@ -219,7 +213,7 @@ static int read_capacity_10(struct us_blk_dev *usb_blkdev) if (ret < 0) { dev_warn(dev, "Read Capacity(10) failed\n"); - return ret; + goto fail; } sector_size = be32_to_cpu(data[1]); @@ -234,7 +228,10 @@ static int read_capacity_10(struct us_blk_dev *usb_blkdev) usb_blkdev->blk.num_blocks = lba + 1; usb_blkdev->blk.blockbits = SECTOR_SHIFT; - return SECTOR_SIZE; + ret = SECTOR_SIZE; +fail: + dma_free(data); + return ret; } static int usb_stor_io_16(struct us_blk_dev *usb_blkdev, u8 opcode, @@ -280,7 +277,7 @@ static int usb_stor_blk_io(struct block_device *disk_dev, struct us_blk_dev, blk); struct us_data *us = pblk_dev->us; - struct device_d *dev = &us->pusb_dev->dev; + struct device *dev = &us->pusb_dev->dev; int result; /* ensure unit ready */ @@ -353,7 +350,7 @@ static struct block_device_ops usb_mass_storage_ops = { static int usb_stor_init_blkdev(struct us_blk_dev *pblk_dev) { struct us_data *us = pblk_dev->us; - struct device_d *dev = &us->pusb_dev->dev; + struct device *dev = &us->pusb_dev->dev; int result; /* get device info */ @@ -399,7 +396,7 @@ static int usb_stor_init_blkdev(struct us_blk_dev *pblk_dev) /* Create and register a disk device for the specified LUN */ static int usb_stor_add_blkdev(struct us_data *us, unsigned char lun) { - struct device_d *dev = &us->pusb_dev->dev; + struct device *dev = &us->pusb_dev->dev; struct us_blk_dev *pblk_dev; int result; @@ -424,6 +421,7 @@ static int usb_stor_add_blkdev(struct us_data *us, unsigned char lun) pblk_dev->blk.cdev.name = basprintf("disk%d", result); pblk_dev->blk.blockbits = SECTOR_SHIFT; + pblk_dev->blk.type = BLK_TYPE_USB; result = blockdevice_register(&pblk_dev->blk); if (result != 0) { @@ -431,11 +429,6 @@ static int usb_stor_add_blkdev(struct us_data *us, unsigned char lun) goto BadDevice; } - /* create partitions on demand */ - result = parse_partition_table(&pblk_dev->blk); - if (result != 0) - dev_warn(dev, "No partition table found\n"); - list_add_tail(&pblk_dev->list, &us->blk_dev_list); dev_dbg(dev, "USB disk device successfully added\n"); @@ -454,7 +447,7 @@ BadDevice: /* Get the transport settings */ static void get_transport(struct us_data *us) { - struct device_d *dev = &us->pusb_dev->dev; + struct device *dev = &us->pusb_dev->dev; switch (us->protocol) { case US_PR_BULK: us->transport_name = "Bulk"; @@ -469,7 +462,7 @@ static void get_transport(struct us_data *us) /* Get the endpoint settings */ static int get_pipes(struct us_data *us, struct usb_interface *intf) { - struct device_d *dev = &us->pusb_dev->dev; + struct device *dev = &us->pusb_dev->dev; unsigned int i; struct usb_endpoint_descriptor *ep; struct usb_endpoint_descriptor *ep_in = NULL; @@ -510,7 +503,7 @@ static int get_pipes(struct us_data *us, struct usb_interface *intf) /* Scan device's LUNs, registering a disk device for each LUN */ static int usb_stor_scan(struct usb_device *usbdev, struct us_data *us) { - struct device_d *dev = &usbdev->dev; + struct device *dev = &usbdev->dev; unsigned char lun; int num_devs = 0; @@ -534,7 +527,7 @@ static int usb_stor_scan(struct usb_device *usbdev, struct us_data *us) static int usb_stor_probe(struct usb_device *usbdev, const struct usb_device_id *id) { - struct device_d *dev = &usbdev->dev; + struct device *dev = &usbdev->dev; struct us_data *us; int result; int ifno; |