ide: Correct use of ATAPI

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: 145df842b4 ("dm: ide: Add support for driver-model block devices")
Fixes: d0075059e4 ("ide: Drop non-DM code for BLK")
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2023-04-25 10:54:35 -06:00 committed by Tom Rini
parent 1486c90623
commit 646deed40b
2 changed files with 18 additions and 3 deletions

View file

@ -155,7 +155,6 @@ OUT:
*last = '\0'; *last = '\0';
} }
#ifdef CONFIG_ATAPI
/**************************************************************************** /****************************************************************************
* ATAPI Support * ATAPI Support
*/ */
@ -422,9 +421,10 @@ error:
#define ATAPI_READ_BLOCK_SIZE 2048 /* assuming CD part */ #define ATAPI_READ_BLOCK_SIZE 2048 /* assuming CD part */
#define ATAPI_READ_MAX_BLOCK (ATAPI_READ_MAX_BYTES/ATAPI_READ_BLOCK_SIZE) #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) void *buffer)
{ {
struct blk_desc *block_dev = dev_get_uclass_plat(dev);
int device = block_dev->devnum; int device = block_dev->devnum;
ulong n = 0; ulong n = 0;
unsigned char ccb[12]; /* Command descriptor block */ 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; return n;
} }
#ifdef CONFIG_ATAPI
static void atapi_inquiry(struct blk_desc *dev_desc) static void atapi_inquiry(struct blk_desc *dev_desc)
{ {
unsigned char ccb[12]; /* Command descriptor block */ unsigned char ccb[12]; /* Command descriptor block */
@ -653,6 +655,7 @@ static void ide_ident(struct blk_desc *dev_desc)
#ifdef CONFIG_ATAPI #ifdef CONFIG_ATAPI
if (is_atapi) { if (is_atapi) {
dev_desc->atapi = true;
atapi_inquiry(dev_desc); atapi_inquiry(dev_desc);
return; return;
} }
@ -1010,6 +1013,17 @@ WR_OUT:
return n; 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) static int ide_blk_probe(struct udevice *udev)
{ {
struct blk_desc *desc = dev_get_uclass_plat(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 = { static const struct blk_ops ide_blk_ops = {
.read = ide_read, .read = ide_or_atapi_read,
.write = ide_write, .write = ide_write,
}; };

View file

@ -66,6 +66,7 @@ struct blk_desc {
/* device can use 48bit addr (ATA/ATAPI v7) */ /* device can use 48bit addr (ATA/ATAPI v7) */
unsigned char lba48; unsigned char lba48;
#endif #endif
unsigned char atapi; /* Use ATAPI protocol */
lbaint_t lba; /* number of blocks */ lbaint_t lba; /* number of blocks */
unsigned long blksz; /* block size */ unsigned long blksz; /* block size */
int log2blksz; /* for convenience: log2(blksz) */ int log2blksz; /* for convenience: log2(blksz) */