mirror of
https://github.com/ipxe/ipxe
synced 2025-12-09 02:40:27 +03:00
[blockdev] Move block device operations to structure block_device_operations
Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net>
This commit is contained in:
committed by
Michael Brown
parent
b48f37e69a
commit
a2686a55c4
@@ -144,7 +144,7 @@ static int int13_rw_sectors ( struct int13_drive *drive,
|
|||||||
static int int13_read_sectors ( struct int13_drive *drive,
|
static int int13_read_sectors ( struct int13_drive *drive,
|
||||||
struct i386_all_regs *ix86 ) {
|
struct i386_all_regs *ix86 ) {
|
||||||
DBG ( "Read: " );
|
DBG ( "Read: " );
|
||||||
return int13_rw_sectors ( drive, ix86, drive->blockdev->read );
|
return int13_rw_sectors ( drive, ix86, drive->blockdev->op->read );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -163,7 +163,7 @@ static int int13_read_sectors ( struct int13_drive *drive,
|
|||||||
static int int13_write_sectors ( struct int13_drive *drive,
|
static int int13_write_sectors ( struct int13_drive *drive,
|
||||||
struct i386_all_regs *ix86 ) {
|
struct i386_all_regs *ix86 ) {
|
||||||
DBG ( "Write: " );
|
DBG ( "Write: " );
|
||||||
return int13_rw_sectors ( drive, ix86, drive->blockdev->write );
|
return int13_rw_sectors ( drive, ix86, drive->blockdev->op->write );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -275,7 +275,7 @@ static int int13_extended_rw ( struct int13_drive *drive,
|
|||||||
static int int13_extended_read ( struct int13_drive *drive,
|
static int int13_extended_read ( struct int13_drive *drive,
|
||||||
struct i386_all_regs *ix86 ) {
|
struct i386_all_regs *ix86 ) {
|
||||||
DBG ( "Extended read: " );
|
DBG ( "Extended read: " );
|
||||||
return int13_extended_rw ( drive, ix86, drive->blockdev->read );
|
return int13_extended_rw ( drive, ix86, drive->blockdev->op->read );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -288,7 +288,7 @@ static int int13_extended_read ( struct int13_drive *drive,
|
|||||||
static int int13_extended_write ( struct int13_drive *drive,
|
static int int13_extended_write ( struct int13_drive *drive,
|
||||||
struct i386_all_regs *ix86 ) {
|
struct i386_all_regs *ix86 ) {
|
||||||
DBG ( "Extended write: " );
|
DBG ( "Extended write: " );
|
||||||
return int13_extended_rw ( drive, ix86, drive->blockdev->write );
|
return int13_extended_rw ( drive, ix86, drive->blockdev->op->write );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -488,8 +488,8 @@ static void guess_int13_geometry ( struct int13_drive *drive ) {
|
|||||||
/* Scan through partition table and modify guesses for heads
|
/* Scan through partition table and modify guesses for heads
|
||||||
* and sectors_per_track if we find any used partitions.
|
* and sectors_per_track if we find any used partitions.
|
||||||
*/
|
*/
|
||||||
if ( drive->blockdev->read ( drive->blockdev, 0, 1,
|
if ( drive->blockdev->op->read ( drive->blockdev, 0, 1,
|
||||||
virt_to_user ( &mbr ) ) == 0 ) {
|
virt_to_user ( &mbr ) ) == 0 ) {
|
||||||
for ( i = 0 ; i < 4 ; i++ ) {
|
for ( i = 0 ; i < 4 ; i++ ) {
|
||||||
partition = &mbr.partitions[i];
|
partition = &mbr.partitions[i];
|
||||||
if ( ! partition->type )
|
if ( ! partition->type )
|
||||||
|
|||||||
@@ -139,6 +139,11 @@ static int ata_identify ( struct block_device *blockdev ) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct block_device_operations ata_operations = {
|
||||||
|
.read = ata_read,
|
||||||
|
.write = ata_write
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialise ATA device
|
* Initialise ATA device
|
||||||
*
|
*
|
||||||
@@ -153,7 +158,6 @@ static int ata_identify ( struct block_device *blockdev ) {
|
|||||||
*/
|
*/
|
||||||
int init_atadev ( struct ata_device *ata ) {
|
int init_atadev ( struct ata_device *ata ) {
|
||||||
/** Fill in read and write methods, and get device capacity */
|
/** Fill in read and write methods, and get device capacity */
|
||||||
ata->blockdev.read = ata_read;
|
ata->blockdev.op = &ata_operations;
|
||||||
ata->blockdev.write = ata_write;
|
|
||||||
return ata_identify ( &ata->blockdev );
|
return ata_identify ( &ata->blockdev );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,11 @@ static int ramdisk_write ( struct block_device *blockdev, uint64_t block,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct block_device_operations ramdisk_operations = {
|
||||||
|
.read = ramdisk_read,
|
||||||
|
.write = ramdisk_write
|
||||||
|
};
|
||||||
|
|
||||||
int init_ramdisk ( struct ramdisk *ramdisk, userptr_t data, size_t len,
|
int init_ramdisk ( struct ramdisk *ramdisk, userptr_t data, size_t len,
|
||||||
unsigned int blksize ) {
|
unsigned int blksize ) {
|
||||||
|
|
||||||
@@ -82,8 +87,7 @@ int init_ramdisk ( struct ramdisk *ramdisk, userptr_t data, size_t len,
|
|||||||
blksize = 512;
|
blksize = 512;
|
||||||
|
|
||||||
ramdisk->data = data;
|
ramdisk->data = data;
|
||||||
ramdisk->blockdev.read = ramdisk_read;
|
ramdisk->blockdev.op = &ramdisk_operations;
|
||||||
ramdisk->blockdev.write = ramdisk_write;
|
|
||||||
ramdisk->blockdev.blksize = blksize;
|
ramdisk->blockdev.blksize = blksize;
|
||||||
ramdisk->blockdev.blocks = ( len / blksize );
|
ramdisk->blockdev.blocks = ( len / blksize );
|
||||||
|
|
||||||
|
|||||||
@@ -228,6 +228,16 @@ static int scsi_read_capacity_16 ( struct block_device *blockdev ) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct block_device_operations scsi_operations_16 = {
|
||||||
|
.read = scsi_read_16,
|
||||||
|
.write = scsi_write_16,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct block_device_operations scsi_operations_10 = {
|
||||||
|
.read = scsi_read_10,
|
||||||
|
.write = scsi_write_10,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialise SCSI device
|
* Initialise SCSI device
|
||||||
*
|
*
|
||||||
@@ -250,8 +260,7 @@ int init_scsidev ( struct scsi_device *scsi ) {
|
|||||||
scsi_read_capacity_10 ( &scsi->blockdev );
|
scsi_read_capacity_10 ( &scsi->blockdev );
|
||||||
|
|
||||||
/* Try READ CAPACITY (10), which is a mandatory command, first. */
|
/* Try READ CAPACITY (10), which is a mandatory command, first. */
|
||||||
scsi->blockdev.read = scsi_read_10;
|
scsi->blockdev.op = &scsi_operations_10;
|
||||||
scsi->blockdev.write = scsi_write_10;
|
|
||||||
if ( ( rc = scsi_read_capacity_10 ( &scsi->blockdev ) ) != 0 )
|
if ( ( rc = scsi_read_capacity_10 ( &scsi->blockdev ) ) != 0 )
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@@ -261,8 +270,7 @@ int init_scsidev ( struct scsi_device *scsi ) {
|
|||||||
* mandatory, so we can't just use it straight off.
|
* mandatory, so we can't just use it straight off.
|
||||||
*/
|
*/
|
||||||
if ( scsi->blockdev.blocks == 0 ) {
|
if ( scsi->blockdev.blocks == 0 ) {
|
||||||
scsi->blockdev.read = scsi_read_16;
|
scsi->blockdev.op = &scsi_operations_16;
|
||||||
scsi->blockdev.write = scsi_write_16;
|
|
||||||
if ( ( rc = scsi_read_capacity_16 ( &scsi->blockdev ) ) != 0 )
|
if ( ( rc = scsi_read_capacity_16 ( &scsi->blockdev ) ) != 0 )
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,12 +10,10 @@
|
|||||||
|
|
||||||
#include <gpxe/uaccess.h>
|
#include <gpxe/uaccess.h>
|
||||||
|
|
||||||
/** A block device */
|
struct block_device;
|
||||||
struct block_device {
|
|
||||||
/** Block size */
|
/** Block device operations */
|
||||||
size_t blksize;
|
struct block_device_operations {
|
||||||
/** Total number of blocks */
|
|
||||||
uint64_t blocks;
|
|
||||||
/**
|
/**
|
||||||
* Read block
|
* Read block
|
||||||
*
|
*
|
||||||
@@ -40,4 +38,14 @@ struct block_device {
|
|||||||
unsigned long count, userptr_t buffer );
|
unsigned long count, userptr_t buffer );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** A block device */
|
||||||
|
struct block_device {
|
||||||
|
/** Block device operations */
|
||||||
|
struct block_device_operations *op;
|
||||||
|
/** Block size */
|
||||||
|
size_t blksize;
|
||||||
|
/** Total number of blocks */
|
||||||
|
uint64_t blocks;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* _GPXE_BLOCKDEV_H */
|
#endif /* _GPXE_BLOCKDEV_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user