On Tue, Dec 24, 2019 at 5:41 AM Deepak Ukey <deepak.ukey@xxxxxxxxxxxxx> wrote: > > From: yuuzheng <yuuzheng@xxxxxxxxxx> > > In pm80xx driver, the command mpi_set_phy_profile_req is sent by host > during boot to configure the phy profile such as analog setting page, > rate control page. However, the tag is not freed when its response is > received. As a result, 16 tags are missing for each HBA after boot. > When NCQ is enabled with queue depth 16, it needs at least, 15 * 16 = > 240 tags for each HBA to achieve the best performance. In current > pm80xx driver with setting CCB_MAX = 256, the total number of tags in > each HBA is 255 for data IO. Hence, without returning those tags to the > pool after boot, some device will finally be forced to non-ncq mode by > ATA layer due to excessive errors (i.e. LLDD cannot allocate tag for > queued task). > > Signed-off-by: yuuzheng <yuuzheng@xxxxxxxxxx> > Signed-off-by: Deepak Ukey <deepak.ukey@xxxxxxxxxxxxx> > Signed-off-by: Viswas G <Viswas.G@xxxxxxxxxxxxx> > Signed-off-by: Vishakha Channapattan <vishakhavc@xxxxxxxxxx> > Signed-off-by: Bhavesh Jashnani <bjashnani@xxxxxxxxxx> > Signed-off-by: Radha Ramachandran <radha@xxxxxxxxxx> > Signed-off-by: Akshat Jain <akshatzen@xxxxxxxxxx> The patch looks fine. Acked-by: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx> > --- > drivers/scsi/pm8001/pm80xx_hwi.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c > index d805fd036ddf..37b82d7aa3d7 100644 > --- a/drivers/scsi/pm8001/pm80xx_hwi.c > +++ b/drivers/scsi/pm8001/pm80xx_hwi.c > @@ -3715,28 +3715,32 @@ static int mpi_flash_op_ext_resp(struct pm8001_hba_info *pm8001_ha, void *piomb) > static int mpi_set_phy_profile_resp(struct pm8001_hba_info *pm8001_ha, > void *piomb) > { > + u32 tag; > u8 page_code; > + int rc = 0; > struct set_phy_profile_resp *pPayload = > (struct set_phy_profile_resp *)(piomb + 4); > u32 ppc_phyid = le32_to_cpu(pPayload->ppc_phyid); > u32 status = le32_to_cpu(pPayload->status); > > + tag = le32_to_cpu(pPayload->tag); > page_code = (u8)((ppc_phyid & 0xFF00) >> 8); > if (status) { > /* status is FAILED */ > PM8001_FAIL_DBG(pm8001_ha, > pm8001_printk("PhyProfile command failed with status " > "0x%08X \n", status)); > - return -1; > + rc = -1; > } else { > if (page_code != SAS_PHY_ANALOG_SETTINGS_PAGE) { > PM8001_FAIL_DBG(pm8001_ha, > pm8001_printk("Invalid page code 0x%X\n", > page_code)); > - return -1; > + rc = -1; > } > } > - return 0; > + pm8001_tag_free(pm8001_ha, tag); > + return rc; > } > > /** > -- > 2.16.3 >