[PATCH 10/30] ide: Correct use of ATAPI
Mattijs Korpershoek
mkorpershoek at baylibre.com
Tue Mar 28 16:23:20 CEST 2023
On mar., mars 28, 2023 at 08:06, Simon Glass <sjg at chromium.org> wrote:
> The use of atapi_read() was incorrect dropped. Fix this so that it will
> be used when needed. Use a udevice for the first argument of atapi_read()
> so it is consistent with ide_read().
>
> This requires much of the ATAPI code to be brought out from behind the
> existing #ifdef. It will still be removed by the compiler if it is not
> needed.
>
> Add an atapi flag to struct blk_desc so the information can be retained.
>
> Fixes: 145df842b44 ("dm: ide: Add support for driver-model block devices")
> Fixes: d0075059e4d ("ide: Drop non-DM code for BLK")
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
> ---
>
> drivers/block/ide.c | 20 +++++++++++++++++---
> include/blk.h | 1 +
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/block/ide.c b/drivers/block/ide.c
> index fa5f68ffeb01..875192cba163 100644
> --- a/drivers/block/ide.c
> +++ b/drivers/block/ide.c
> @@ -155,7 +155,6 @@ OUT:
> *last = '\0';
> }
>
> -#ifdef CONFIG_ATAPI
> /****************************************************************************
> * ATAPI Support
> */
> @@ -422,9 +421,10 @@ error:
> #define ATAPI_READ_BLOCK_SIZE 2048 /* assuming CD part */
> #define ATAPI_READ_MAX_BLOCK (ATAPI_READ_MAX_BYTES/ATAPI_READ_BLOCK_SIZE)
>
> -ulong atapi_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
> +ulong atapi_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
> void *buffer)
> {
> + struct blk_desc *block_dev = dev_get_uclass_plat(dev);
> int device = block_dev->devnum;
> ulong n = 0;
> unsigned char ccb[12]; /* Command descriptor block */
> @@ -466,6 +466,8 @@ ulong atapi_read(struct blk_desc *block_dev, lbaint_t blknr, lbaint_t blkcnt,
> return n;
> }
>
> +#ifdef CONFIG_ATAPI
> +
> static void atapi_inquiry(struct blk_desc *dev_desc)
> {
> unsigned char ccb[12]; /* Command descriptor block */
> @@ -653,6 +655,7 @@ static void ide_ident(struct blk_desc *dev_desc)
>
> #ifdef CONFIG_ATAPI
> if (is_atapi) {
> + dev_desc->atapi = true;
> atapi_inquiry(dev_desc);
> return;
> }
> @@ -1010,6 +1013,17 @@ WR_OUT:
> return n;
> }
>
> +ulong ide_or_atapi_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
> + void *buffer)
> +{
> + struct blk_desc *desc = dev_get_uclass_plat(dev);
> +
> + if (IS_ENABLED(CONFIG_ATAPI) && desc->atapi)
> + return atapi_read(dev, blknr, blkcnt, buffer);
> +
> + return ide_read(dev, blknr, blkcnt, buffer);
> +}
> +
> static int ide_blk_probe(struct udevice *udev)
> {
> struct blk_desc *desc = dev_get_uclass_plat(udev);
> @@ -1029,7 +1043,7 @@ static int ide_blk_probe(struct udevice *udev)
> }
>
> static const struct blk_ops ide_blk_ops = {
> - .read = ide_read,
> + .read = ide_or_atapi_read,
> .write = ide_write,
> };
>
> diff --git a/include/blk.h b/include/blk.h
> index 1db203c1baba..871922dcde07 100644
> --- a/include/blk.h
> +++ b/include/blk.h
> @@ -66,6 +66,7 @@ struct blk_desc {
> /* device can use 48bit addr (ATA/ATAPI v7) */
> unsigned char lba48;
> #endif
> + unsigned char atapi; /* Use ATAPI protocol */
> lbaint_t lba; /* number of blocks */
> unsigned long blksz; /* block size */
> int log2blksz; /* for convenience: log2(blksz) */
> --
> 2.40.0.348.gf938b09366-goog
More information about the U-Boot
mailing list