mirror of
https://github.com/ipxe/ipxe
synced 2025-12-19 19:49:45 +03:00
[ata] Make ATA command issuing partially asynchronous
Move the icky call to step() from aoe.c to ata.c; this takes it at least one step further away from where it really doesn't belong. Unfortunately, AoE has the ugly aoe_discover() mechanism which means that we still have a step() loop in aoe.c for now; this needs to be replaced at some future point.
This commit is contained in:
@@ -21,8 +21,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <byteswap.h>
|
||||
#include <gpxe/blockdev.h>
|
||||
#include <gpxe/process.h>
|
||||
#include <gpxe/ata.h>
|
||||
|
||||
/** @file
|
||||
@@ -45,13 +47,34 @@ block_to_ata ( struct block_device *blockdev ) {
|
||||
*/
|
||||
static inline __attribute__ (( always_inline )) int
|
||||
ata_command ( struct ata_device *ata, struct ata_command *command ) {
|
||||
int rc;
|
||||
|
||||
DBG ( "ATA cmd %02x dev %02x LBA%s %llx count %04x\n",
|
||||
command->cb.cmd_stat, command->cb.device,
|
||||
( command->cb.lba48 ? "48" : "" ),
|
||||
( unsigned long long ) command->cb.lba.native,
|
||||
command->cb.count.native );
|
||||
|
||||
return ata->command ( ata, command );
|
||||
/* Flag command as in-progress */
|
||||
command->rc = -EINPROGRESS;
|
||||
|
||||
/* Issue ATA command */
|
||||
if ( ( rc = ata->command ( ata, command ) ) != 0 ) {
|
||||
/* Something went wrong with the issuing mechanism */
|
||||
DBG ( "ATA could not issue command: %s\n", strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Wait for command to complete */
|
||||
while ( command->rc == -EINPROGRESS )
|
||||
step();
|
||||
if ( ( rc = command->rc ) != 0 ) {
|
||||
/* Something went wrong with the command execution */
|
||||
DBG ( "ATA command failed: %s\n", strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user