aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass2023-04-25 10:54:35 -0600
committerTom Rini2023-04-27 13:51:06 -0400
commit646deed40b8ffe9aa9c10b86f1addbb4a9788e91 (patch)
treebd59bb992dfda8f342bc15a72300d847db2bfa73
parent1486c906230ca61580a65421adb26a24f5128a4e (diff)
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: 145df842b44 ("dm: ide: Add support for driver-model block devices") Fixes: d0075059e4d ("ide: Drop non-DM code for BLK") Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com> Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--drivers/block/ide.c20
-rw-r--r--include/blk.h1
2 files changed, 18 insertions, 3 deletions
diff --git a/drivers/block/ide.c b/drivers/block/ide.c
index fa5f68ffeb0..875192cba16 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 1db203c1bab..871922dcde0 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) */