megasas: Implement LD_LIST_QUERY
Newer firmware implement a LD_LIST_QUERY command, and due to a driver issue no drives might be detected if this command isn't supported. So add emulation for this command, too. Cc: qemu-stable@nongnu.org Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									6ee143a0a4
								
							
						
					
					
						commit
						34bb4d02e0
					
				@ -1106,6 +1106,21 @@ static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd)
 | 
				
			|||||||
    return MFI_STAT_OK;
 | 
					    return MFI_STAT_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* mbox0 contains flags */
 | 
				
			||||||
 | 
					    flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
 | 
				
			||||||
 | 
					    trace_megasas_dcmd_ld_list_query(cmd->index, flags);
 | 
				
			||||||
 | 
					    if (flags == MR_LD_QUERY_TYPE_ALL ||
 | 
				
			||||||
 | 
					        flags == MR_LD_QUERY_TYPE_EXPOSED_TO_HOST) {
 | 
				
			||||||
 | 
					        return megasas_dcmd_ld_get_list(s, cmd);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return MFI_STAT_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
 | 
					static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
 | 
				
			||||||
                                      MegasasCmd *cmd)
 | 
					                                      MegasasCmd *cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -1409,6 +1424,8 @@ static const struct dcmd_cmd_tbl_t {
 | 
				
			|||||||
      megasas_dcmd_dummy },
 | 
					      megasas_dcmd_dummy },
 | 
				
			||||||
    { MFI_DCMD_LD_GET_LIST, "LD_GET_LIST",
 | 
					    { MFI_DCMD_LD_GET_LIST, "LD_GET_LIST",
 | 
				
			||||||
      megasas_dcmd_ld_get_list},
 | 
					      megasas_dcmd_ld_get_list},
 | 
				
			||||||
 | 
					    { MFI_DCMD_LD_LIST_QUERY, "LD_LIST_QUERY",
 | 
				
			||||||
 | 
					      megasas_dcmd_ld_list_query },
 | 
				
			||||||
    { MFI_DCMD_LD_GET_INFO, "LD_GET_INFO",
 | 
					    { MFI_DCMD_LD_GET_INFO, "LD_GET_INFO",
 | 
				
			||||||
      megasas_dcmd_ld_get_info },
 | 
					      megasas_dcmd_ld_get_info },
 | 
				
			||||||
    { MFI_DCMD_LD_GET_PROP, "LD_GET_PROP",
 | 
					    { MFI_DCMD_LD_GET_PROP, "LD_GET_PROP",
 | 
				
			||||||
 | 
				
			|||||||
@ -164,6 +164,7 @@ typedef enum {
 | 
				
			|||||||
    MFI_DCMD_PD_BLINK =                 0x02070100,
 | 
					    MFI_DCMD_PD_BLINK =                 0x02070100,
 | 
				
			||||||
    MFI_DCMD_PD_UNBLINK =               0x02070200,
 | 
					    MFI_DCMD_PD_UNBLINK =               0x02070200,
 | 
				
			||||||
    MFI_DCMD_LD_GET_LIST =              0x03010000,
 | 
					    MFI_DCMD_LD_GET_LIST =              0x03010000,
 | 
				
			||||||
 | 
					    MFI_DCMD_LD_LIST_QUERY =            0x03010100,
 | 
				
			||||||
    MFI_DCMD_LD_GET_INFO =              0x03020000,
 | 
					    MFI_DCMD_LD_GET_INFO =              0x03020000,
 | 
				
			||||||
    MFI_DCMD_LD_GET_PROP =              0x03030000,
 | 
					    MFI_DCMD_LD_GET_PROP =              0x03030000,
 | 
				
			||||||
    MFI_DCMD_LD_SET_PROP =              0x03040000,
 | 
					    MFI_DCMD_LD_SET_PROP =              0x03040000,
 | 
				
			||||||
@ -411,6 +412,14 @@ typedef enum {
 | 
				
			|||||||
    MR_PD_QUERY_TYPE_EXPOSED_TO_HOST =  5, /*query for system drives */
 | 
					    MR_PD_QUERY_TYPE_EXPOSED_TO_HOST =  5, /*query for system drives */
 | 
				
			||||||
} mfi_pd_query_type;
 | 
					} mfi_pd_query_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    MR_LD_QUERY_TYPE_ALL =              0,
 | 
				
			||||||
 | 
					    MR_LD_QUERY_TYPE_EXPOSED_TO_HOST =  1,
 | 
				
			||||||
 | 
					    MR_LD_QUERY_TYPE_USED_TGT_IDS =     2,
 | 
				
			||||||
 | 
					    MR_LD_QUERY_TYPE_CLUSTER_ACCESS =   3,
 | 
				
			||||||
 | 
					    MR_LD_QUERY_TYPE_CLUSTER_LOCALE =   4,
 | 
				
			||||||
 | 
					} mfi_ld_query_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Other propertities and definitions
 | 
					 * Other propertities and definitions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
				
			|||||||
@ -685,6 +685,7 @@ megasas_dcmd_ld_get_list(int cmd, int num, int max) "scmd %d: DCMD LD get list:
 | 
				
			|||||||
megasas_dcmd_ld_get_info(int cmd, int ld_id) "scmd %d: DCMD LD get info for dev %d"
 | 
					megasas_dcmd_ld_get_info(int cmd, int ld_id) "scmd %d: DCMD LD get info for dev %d"
 | 
				
			||||||
megasas_dcmd_pd_get_info(int cmd, int pd_id) "scmd %d: DCMD PD get info for dev %d"
 | 
					megasas_dcmd_pd_get_info(int cmd, int pd_id) "scmd %d: DCMD PD get info for dev %d"
 | 
				
			||||||
megasas_dcmd_pd_list_query(int cmd, int flags) "scmd %d: DCMD PD list query flags %x"
 | 
					megasas_dcmd_pd_list_query(int cmd, int flags) "scmd %d: DCMD PD list query flags %x"
 | 
				
			||||||
 | 
					megasas_dcmd_ld_list_query(int cmd, int flags) "scmd %d: DCMD LD list query flags %x"
 | 
				
			||||||
megasas_dcmd_unsupported(int cmd, unsigned long size) "scmd %d: set properties len %ld"
 | 
					megasas_dcmd_unsupported(int cmd, unsigned long size) "scmd %d: set properties len %ld"
 | 
				
			||||||
megasas_abort_frame(int cmd, int abort_cmd) "scmd %d: aborting frame %x"
 | 
					megasas_abort_frame(int cmd, int abort_cmd) "scmd %d: aborting frame %x"
 | 
				
			||||||
megasas_abort_no_cmd(int cmd, uint64_t context) "scmd %d: no active command for frame context %" PRIx64 ""
 | 
					megasas_abort_no_cmd(int cmd, uint64_t context) "scmd %d: no active command for frame context %" PRIx64 ""
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user