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 <RaghavaAditya.Renukunta@xxxxxxxxxxxxx> > Signed-off-by: Dave Carroll <David.Carroll@xxxxxxxxxxxxx> > > --- > 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 jthumshirn@xxxxxxx +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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html