static int int13_read_sectors ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) {
DBG ( "Read: " );
- return int13_rw_sectors ( drive, ix86, drive->blockdev->read );
+ return int13_rw_sectors ( drive, ix86, drive->blockdev->op->read );
}
/**
static int int13_write_sectors ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) {
DBG ( "Write: " );
- return int13_rw_sectors ( drive, ix86, drive->blockdev->write );
+ return int13_rw_sectors ( drive, ix86, drive->blockdev->op->write );
}
/**
static int int13_extended_read ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) {
DBG ( "Extended read: " );
- return int13_extended_rw ( drive, ix86, drive->blockdev->read );
+ return int13_extended_rw ( drive, ix86, drive->blockdev->op->read );
}
/**
static int int13_extended_write ( struct int13_drive *drive,
struct i386_all_regs *ix86 ) {
DBG ( "Extended write: " );
- return int13_extended_rw ( drive, ix86, drive->blockdev->write );
+ return int13_extended_rw ( drive, ix86, drive->blockdev->op->write );
}
/**
/* Scan through partition table and modify guesses for heads
* and sectors_per_track if we find any used partitions.
*/
- if ( drive->blockdev->read ( drive->blockdev, 0, 1,
- virt_to_user ( &mbr ) ) == 0 ) {
+ if ( drive->blockdev->op->read ( drive->blockdev, 0, 1,
+ virt_to_user ( &mbr ) ) == 0 ) {
for ( i = 0 ; i < 4 ; i++ ) {
partition = &mbr.partitions[i];
if ( ! partition->type )
return 0;
}
+static struct block_device_operations ata_operations = {
+ .read = ata_read,
+ .write = ata_write
+};
+
/**
* Initialise ATA device
*
*/
int init_atadev ( struct ata_device *ata ) {
/** Fill in read and write methods, and get device capacity */
- ata->blockdev.read = ata_read;
- ata->blockdev.write = ata_write;
+ ata->blockdev.op = &ata_operations;
return ata_identify ( &ata->blockdev );
}
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,
unsigned int blksize ) {
blksize = 512;
ramdisk->data = data;
- ramdisk->blockdev.read = ramdisk_read;
- ramdisk->blockdev.write = ramdisk_write;
+ ramdisk->blockdev.op = &ramdisk_operations;
ramdisk->blockdev.blksize = blksize;
ramdisk->blockdev.blocks = ( len / blksize );
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
*
scsi_read_capacity_10 ( &scsi->blockdev );
/* Try READ CAPACITY (10), which is a mandatory command, first. */
- scsi->blockdev.read = scsi_read_10;
- scsi->blockdev.write = scsi_write_10;
+ scsi->blockdev.op = &scsi_operations_10;
if ( ( rc = scsi_read_capacity_10 ( &scsi->blockdev ) ) != 0 )
return rc;
* mandatory, so we can't just use it straight off.
*/
if ( scsi->blockdev.blocks == 0 ) {
- scsi->blockdev.read = scsi_read_16;
- scsi->blockdev.write = scsi_write_16;
+ scsi->blockdev.op = &scsi_operations_16;
if ( ( rc = scsi_read_capacity_16 ( &scsi->blockdev ) ) != 0 )
return rc;
}
#include <gpxe/uaccess.h>
-/** A block device */
-struct block_device {
- /** Block size */
- size_t blksize;
- /** Total number of blocks */
- uint64_t blocks;
+struct block_device;
+
+/** Block device operations */
+struct block_device_operations {
/**
* Read block
*
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 */