From owner-p4-projects@FreeBSD.ORG Tue Aug 25 10:54:21 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 869851065694; Tue, 25 Aug 2009 10:54:21 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4B3541065692 for ; Tue, 25 Aug 2009 10:54:21 +0000 (UTC) (envelope-from mav@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 205228FC14 for ; Tue, 25 Aug 2009 10:54:21 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n7PAsLLf035383 for ; Tue, 25 Aug 2009 10:54:21 GMT (envelope-from mav@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n7PAsLB4035381 for perforce@freebsd.org; Tue, 25 Aug 2009 10:54:21 GMT (envelope-from mav@freebsd.org) Date: Tue, 25 Aug 2009 10:54:21 GMT Message-Id: <200908251054.n7PAsLB4035381@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to mav@freebsd.org using -f From: Alexander Motin To: Perforce Change Reviews Cc: Subject: PERFORCE change 167782 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Aug 2009 10:54:21 -0000 http://perforce.freebsd.org/chv.cgi?CH=167782 Change 167782 by mav@mav_mavbook on 2009/08/25 10:53:46 Change slot selection algorithm to reuse previous slot if possible. Optimize CCC interrupts handling. Affected files ... .. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#55 edit Differences ... ==== //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#55 (text+ko) ==== @@ -384,13 +384,16 @@ void *arg; int unit; - is = ATA_INL(ctlr->r_mem, AHCI_IS); if (irq->mode == AHCI_IRQ_MODE_ALL) { + unit = 0; if (ctlr->ccc) is = ctlr->ichannels; - unit = 0; - } else /* AHCI_IRQ_MODE_AFTER */ + else + is = ATA_INL(ctlr->r_mem, AHCI_IS); + } else { /* AHCI_IRQ_MODE_AFTER */ unit = irq->r_irq_rid - 1; + is = ATA_INL(ctlr->r_mem, AHCI_IS); + } for (; unit < ctlr->channels; unit++) { if ((is & (1 << unit)) != 0 && (arg = ctlr->interrupt[unit].argument)) { @@ -948,6 +951,8 @@ /* Read and clear interrupt statuses. */ istatus = ATA_INL(ch->r_mem, AHCI_P_IS); + if (istatus == 0) + return; ATA_OUTL(ch->r_mem, AHCI_P_IS, istatus); /* Read command statuses. */ cstatus = ATA_INL(ch->r_mem, AHCI_P_CI); @@ -963,17 +968,16 @@ // ATA_INL(ch->r_mem, AHCI_P_SERR)); ccs = (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_CCS_MASK) >> AHCI_P_CMD_CCS_SHIFT; + err = ch->rslots & (cstatus | sstatus); /* Kick controller into sane state */ ahci_stop(dev); ahci_start(dev); - ok = ch->rslots & ~(cstatus | sstatus); - err = ch->rslots & (cstatus | sstatus); } else { ccs = 0; - ok = ch->rslots & ~(cstatus | sstatus); err = 0; } /* Complete all successfull commands. */ + ok = ch->rslots & ~(cstatus | sstatus); for (i = 0; i < ch->numslots; i++) { if ((ok >> i) & 1) ahci_end_transaction(&ch->slot[i], AHCI_ERR_NONE); @@ -1062,15 +1066,11 @@ /* Choose empty slot. */ tag = ch->lastslot; - do { - tag++; - if (tag >= ch->numslots) + while (ch->slot[tag].state != AHCI_SLOT_EMPTY) { + if (++tag >= ch->numslots) tag = 0; - if (ch->slot[tag].state == AHCI_SLOT_EMPTY) - break; - } while (tag != ch->lastslot); - if (ch->slot[tag].state != AHCI_SLOT_EMPTY) - device_printf(ch->dev, "ALL SLOTS BUSY!\n"); + KASSERT(tag != ch->lastslot, "ahci: ALL SLOTS BUSY!"); + } ch->lastslot = tag; /* Occupy chosen slot. */ slot = &ch->slot[tag];