From: Dave Jiang Date: Wed, 5 Sep 2012 23:35:44 +0000 (-0700) Subject: [SCSI] isci: Fix interrupt coalescing assumption of active TCs X-Git-Tag: firefly_0821_release~3680^2~1940^2^2~37 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=44ef2bf72df34ef2628dc3475b4507ab984d6744;p=firefly-linux-kernel-4.4.55.git [SCSI] isci: Fix interrupt coalescing assumption of active TCs We always assign a dummy task context to a port in order to address a silicon issue. We have 4 ports per controller. So when idle, there are always exactly 4 TCs "active". The adaptive interrupt coalescing code uses number of active TCs to figure out the coalescing values. However, we never hit "0" TCs because of the 4 dummy TCs. Putting in fix so that we calculate this correctly. Reported-by: Dan Melnic Signed-off-by: Dave Jiang Signed-off-by: James Bottomley --- diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c index d4daa0f24595..ab026a50ace3 100644 --- a/drivers/scsi/isci/host.c +++ b/drivers/scsi/isci/host.c @@ -1122,10 +1122,16 @@ void isci_host_completion_routine(unsigned long data) sci_controller_completion_handler(ihost); spin_unlock_irq(&ihost->scic_lock); - /* the coalesence timeout doubles at each encoding step, so + /* + * we subtract SCI_MAX_PORTS to account for the number of dummy TCs + * issued for hardware issue workaround + */ + active = isci_tci_active(ihost) - SCI_MAX_PORTS; + + /* + * the coalesence timeout doubles at each encoding step, so * update it based on the ilog2 value of the outstanding requests */ - active = isci_tci_active(ihost); writel(SMU_ICC_GEN_VAL(NUMBER, active) | SMU_ICC_GEN_VAL(TIMER, ISCI_COALESCE_BASE + ilog2(active)), &ihost->smu_registers->interrupt_coalesce_control);