On mar., mars 28, 2023 at 08:06, Simon Glass <s...@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 <s...@chromium.org> Reviewed-by: Mattijs Korpershoek <mkorpersh...@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