libqos/ahci: Add ATAPI tray macros
(1) Add START_STOP_UNIT command to ahci-test suite
(2) Add eject/start macro commands; this is not a data transfer
    command so it is not well-served by the existing generic pipeline.
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-id: 1478553214-497-5-git-send-email-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									f697b0edea
								
							
						
					
					
						commit
						48cde09132
					
				| 
						 | 
				
			
			@ -882,6 +882,30 @@ AHCICommand *ahci_atapi_command_create(uint8_t scsi_cmd, uint16_t bcl)
 | 
			
		|||
    return cmd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ahci_atapi_eject(AHCIQState *ahci, uint8_t port)
 | 
			
		||||
{
 | 
			
		||||
    AHCICommand *cmd = ahci_atapi_command_create(CMD_ATAPI_START_STOP_UNIT, 0);
 | 
			
		||||
    ahci_command_set_size(cmd, 0);
 | 
			
		||||
 | 
			
		||||
    cmd->atapi_cmd[4] = 0x02; /* loej = true */
 | 
			
		||||
    ahci_command_commit(ahci, cmd, port);
 | 
			
		||||
    ahci_command_issue(ahci, cmd);
 | 
			
		||||
    ahci_command_verify(ahci, cmd);
 | 
			
		||||
    ahci_command_free(cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ahci_atapi_load(AHCIQState *ahci, uint8_t port)
 | 
			
		||||
{
 | 
			
		||||
    AHCICommand *cmd = ahci_atapi_command_create(CMD_ATAPI_START_STOP_UNIT, 0);
 | 
			
		||||
    ahci_command_set_size(cmd, 0);
 | 
			
		||||
 | 
			
		||||
    cmd->atapi_cmd[4] = 0x03; /* loej,start = true */
 | 
			
		||||
    ahci_command_commit(ahci, cmd, port);
 | 
			
		||||
    ahci_command_issue(ahci, cmd);
 | 
			
		||||
    ahci_command_verify(ahci, cmd);
 | 
			
		||||
    ahci_command_free(cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ahci_command_free(AHCICommand *cmd)
 | 
			
		||||
{
 | 
			
		||||
    g_free(cmd->atapi_cmd);
 | 
			
		||||
| 
						 | 
				
			
			@ -910,6 +934,9 @@ static void ahci_atapi_command_set_offset(AHCICommand *cmd, uint64_t lba)
 | 
			
		|||
        g_assert_cmpuint(lba, <=, UINT32_MAX);
 | 
			
		||||
        stl_be_p(&cbd[2], lba);
 | 
			
		||||
        break;
 | 
			
		||||
    case CMD_ATAPI_START_STOP_UNIT:
 | 
			
		||||
        g_assert_cmpuint(lba, ==, 0x00);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        /* SCSI doesn't have uniform packet formats,
 | 
			
		||||
         * so you have to add support for it manually. Sorry! */
 | 
			
		||||
| 
						 | 
				
			
			@ -977,6 +1004,9 @@ static void ahci_atapi_set_size(AHCICommand *cmd, uint64_t xbytes)
 | 
			
		|||
        cbd[7] = (tmp & 0xFF00) >> 8;
 | 
			
		||||
        cbd[8] = (tmp & 0xFF);
 | 
			
		||||
        break;
 | 
			
		||||
    case CMD_ATAPI_START_STOP_UNIT:
 | 
			
		||||
        g_assert_cmpuint(xbytes, ==, 0);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        /* SCSI doesn't have uniform packet formats,
 | 
			
		||||
         * so you have to add support for it manually. Sorry! */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -287,6 +287,7 @@ enum {
 | 
			
		|||
 | 
			
		||||
/* ATAPI Commands */
 | 
			
		||||
enum {
 | 
			
		||||
    CMD_ATAPI_START_STOP_UNIT = 0x1b,
 | 
			
		||||
    CMD_ATAPI_READ_10         = 0x28,
 | 
			
		||||
    CMD_ATAPI_READ_CD         = 0xbe,
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -600,6 +601,8 @@ void ahci_io(AHCIQState *ahci, uint8_t port, uint8_t ide_cmd,
 | 
			
		|||
             void *buffer, size_t bufsize, uint64_t sector);
 | 
			
		||||
void ahci_exec(AHCIQState *ahci, uint8_t port,
 | 
			
		||||
               uint8_t op, const AHCIOpts *opts);
 | 
			
		||||
void ahci_atapi_eject(AHCIQState *ahci, uint8_t port);
 | 
			
		||||
void ahci_atapi_load(AHCIQState *ahci, uint8_t port);
 | 
			
		||||
 | 
			
		||||
/* Command: Fine-grained lifecycle */
 | 
			
		||||
AHCICommand *ahci_command_create(uint8_t command_name);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue