mirror of
https://github.com/u-boot/u-boot.git
synced 2025-01-24 03:33:28 +08:00
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:
parent
1486c90623
commit
646deed40b
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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) */
|
||||
|
Loading…
Reference in New Issue
Block a user