On Fri, Jan 27, 2017 at 11:28:41AM -0800, Raghava Aditya Renukunta wrote:
> Retrieved queue depth from fw and saved it for future use.
> Only applicable for HBA1000 drives.
>
> Signed-off-by: Raghava Aditya Renukunta
> <[email protected]>
> Signed-off-by: Dave Carroll <[email protected]>
>
> ---
> Changes in V2:
> None
>
> Changes in V3:
> None
>
> drivers/scsi/aacraid/aachba.c | 84 ++++++++++++++++++++++++++++++++++++++++-
> drivers/scsi/aacraid/aacraid.h | 85
> +++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 167 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
> index e441a54..c34686f 100644
> --- a/drivers/scsi/aacraid/aachba.c
> +++ b/drivers/scsi/aacraid/aachba.c
> @@ -1516,6 +1516,83 @@ static int aac_scsi_32_64(struct fib * fib, struct
> scsi_cmnd * cmd)
> return aac_scsi_32(fib, cmd);
> }
>
> +int aac_issue_bmic_identify(struct aac_dev *dev, u32 bus, u32 target)
> +{
> + struct fib *fibptr;
> + int rcode = -1;
> + u16 fibsize, datasize;
> + struct aac_srb *srbcmd;
> + struct sgmap64 *sg64;
> + struct aac_ciss_identify_pd *identify_resp;
> + dma_addr_t addr;
> + u32 vbus, vid;
> + u16 temp;
> +
> + fibptr = aac_fib_alloc(dev);
> + if (!fibptr)
> + return -ENOMEM;
> +
> + temp = AAC_MAX_LUN + target;
> +
> + fibsize = sizeof(struct aac_srb) -
> + sizeof(struct sgentry) + sizeof(struct sgentry64);
> + datasize = sizeof(struct aac_ciss_identify_pd);
> +
> + identify_resp = (struct aac_ciss_identify_pd *)
> + pci_alloc_consistent(dev->pdev, datasize, &addr);
Please don't cast void pointers.
> +
> + if (identify_resp != NULL) {
if (!identify_resp)
goto free_fib_ptr;
> + vbus = (u32)le16_to_cpu(
> + dev->supplement_adapter_info.VirtDeviceBus);
> + vid = (u32)le16_to_cpu(
> + dev->supplement_adapter_info.VirtDeviceTarget);
> +
> + aac_fib_init(fibptr);
> + srbcmd = (struct aac_srb *) fib_data(fibptr);
> +
> + srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);
> + srbcmd->channel = cpu_to_le32(vbus);
> + srbcmd->id = cpu_to_le32(vid);
> + srbcmd->lun = 0;
> + srbcmd->flags = cpu_to_le32(SRB_DataIn);
> + srbcmd->timeout = cpu_to_le32(10);
> + srbcmd->retry_limit = 0;
> + srbcmd->cdb_size = cpu_to_le32(12);
> + srbcmd->count = cpu_to_le32(datasize);
> +
> + memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
> + srbcmd->cdb[0] = 0x26;
> + srbcmd->cdb[2] = (u8)(temp & 0x00FF);
> +
> + srbcmd->cdb[6] = CISS_IDENTIFY_PHYSICAL_DEVICE;
> +
> + sg64 = (struct sgmap64 *)&srbcmd->sg;
> + sg64->count = cpu_to_le32(1);
> + sg64->sg[0].addr[1] = cpu_to_le32((u32)(((addr) >> 16) >> 16));
> + sg64->sg[0].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff));
> + sg64->sg[0].count = cpu_to_le32(datasize);
> +
> + rcode = aac_fib_send(ScsiPortCommand64,
> + fibptr, fibsize, FsaNormal, 1, 1, NULL, NULL);
> +
> + if (identify_resp->current_queue_depth_limit <= 0 ||
> + identify_resp->current_queue_depth_limit > 32)
> + dev->hba_map[bus][target].qd_limit = 32;
> + else
> + dev->hba_map[bus][target].qd_limit =
> + identify_resp->current_queue_depth_limit;
> +
> + pci_free_consistent(dev->pdev, datasize,
> + (void *)identify_resp, addr);
> +
> + aac_fib_complete(fibptr);
> + }
free_fib_ptr:
> +
> + aac_fib_free(fibptr);
> +
> + return rcode;
> +}
> +
> /**
> * aac_update hba_map()- update current hba map with data from FW
> * @dev: aac_dev structure
> @@ -1565,6 +1642,9 @@ void aac_update_hba_map(struct aac_dev *dev,
> if (devtype != AAC_DEVTYPE_NATIVE_RAW)
> goto update_devtype;
>
> + if (aac_issue_bmic_identify(dev, bus, target) < 0)
> + dev->hba_map[bus][target].qd_limit = 32;
> +
> update_devtype:
> dev->hba_map[bus][target].devtype = devtype;
> }
> @@ -1711,8 +1791,10 @@ int aac_get_adapter_info(struct aac_dev* dev)
>
> /* reset all previous mapped devices (i.e. for init. after IOP_RESET) */
> for (bus = 0; bus < AAC_MAX_BUSES; bus++) {
> - for (target = 0; target < AAC_MAX_TARGETS; target++)
> + for (target = 0; target < AAC_MAX_TARGETS; target++) {
> dev->hba_map[bus][target].devtype = 0;
> + dev->hba_map[bus][target].qd_limit = 0;
> + }
> }
>
> /*
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> index 05884e6..e541394 100644
> --- a/drivers/scsi/aacraid/aacraid.h
> +++ b/drivers/scsi/aacraid/aacraid.h
> @@ -74,7 +74,7 @@ enum {
> #define AAC_NUM_IO_FIB (1024 - AAC_NUM_MGT_FIB)
> #define AAC_NUM_FIB (AAC_NUM_IO_FIB + AAC_NUM_MGT_FIB)
>
> -#define AAC_MAX_LUN (8)
> +#define AAC_MAX_LUN (256)
>
> #define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
> #define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)256)
> @@ -89,6 +89,7 @@ enum {
>
> #define CISS_REPORT_PHYSICAL_LUNS 0xc3
> #define WRITE_HOST_WELLNESS 0xa5
> +#define CISS_IDENTIFY_PHYSICAL_DEVICE 0x15
> #define BMIC_IN 0x26
> #define BMIC_OUT 0x27
>
> @@ -110,6 +111,86 @@ struct aac_ciss_phys_luns_resp {
> */
> #define AAC_MAX_HRRQ 64
>
> +#pragma pack(1)
> +
> +struct aac_ciss_identify_pd {
[...]
> +};
> +
> +#pragma pack()
I'd prefer '}; __packed' over #pragma pack(1) .. #pragma pack()
[...]
--
Johannes Thumshirn Storage
[email protected] +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html