From owner-freebsd-current@FreeBSD.ORG Mon Nov 19 08:05:06 2007 Return-Path: Delivered-To: freebsd-current@FreeBSD.ORG Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BEE9716A479; Mon, 19 Nov 2007 08:05:06 +0000 (UTC) (envelope-from root@kash.tomsk.ru) Received: from mx.kash.tomsk.ru (ns2.kash.tomsk.ru [88.204.35.2]) by mx1.freebsd.org (Postfix) with ESMTP id CDD4013C4C5; Mon, 19 Nov 2007 08:05:05 +0000 (UTC) (envelope-from root@kash.tomsk.ru) Received: by mx.kash.tomsk.ru (Postfix, from userid 0) id 50D83DAD45; Mon, 19 Nov 2007 14:04:47 +0600 (NOVT) Received: from mx2.freebsd.org (mx2.freebsd.org [69.147.83.53]) by mx.kash.tomsk.ru (Postfix) with ESMTP id 5A553DAD2B for ; Mon, 19 Nov 2007 14:04:45 +0600 (NOVT) Received: from hub.freebsd.org (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx2.freebsd.org (Postfix) with ESMTP id 81B8060461; Mon, 19 Nov 2007 08:03:00 +0000 (UTC) (envelope-from owner-freebsd-hackers@freebsd.org) Received: from hub.freebsd.org (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id 6269C16A46C; Mon, 19 Nov 2007 08:02:59 +0000 (UTC) (envelope-from owner-freebsd-hackers@freebsd.org) Delivered-To: freebsd-hackers@FreeBSD.ORG Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 165EA16A41B; Mon, 19 Nov 2007 08:02:46 +0000 (UTC) (envelope-from sos@deepcore.dk) Received: from spider.deepcore.dk (cpe.atm2-0-70484.0x50a6c9a6.abnxx16.customer.tele.dk [80.166.201.166]) by mx1.freebsd.org (Postfix) with ESMTP id 7C23F13C43E; Mon, 19 Nov 2007 08:02:45 +0000 (UTC) (envelope-from sos@deepcore.dk) Received: from ws.local (ws.deepcore.dk [194.192.25.137]) by spider.deepcore.dk (8.13.8/8.13.8) with ESMTP id lAJ82XVG016145; Mon, 19 Nov 2007 09:02:33 +0100 (CET) (envelope-from sos@deepcore.dk) Message-ID: <47414319.6070303@deepcore.dk> Date: Mon, 19 Nov 2007 09:02:33 +0100 From: =?ISO-8859-1?Q?S=F8ren_Schmidt?= User-Agent: Thunderbird 2.0.0.9 (Macintosh/20071031) MIME-Version: 1.0 To: Ulf Lilleengen References: <472A548B.50406@lxnt.info> <20071116144304.GA7950@stud.ntnu.no> <473DBABE.3070901@deepcore.dk> In-Reply-To: <473DBABE.3070901@deepcore.dk> Content-Type: multipart/mixed; boundary="------------090105030601040509090901" X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Sender: owner-freebsd-hackers@freebsd.org Errors-To: owner-freebsd-hackers@freebsd.org X-DSPAM-Result: Innocent X-DSPAM-Processed: Mon Nov 19 14:04:47 2007 X-DSPAM-Confidence: 0.9988 X-DSPAM-Probability: 0.0000 X-DSPAM-Signature: 4741439f191324428728995 X-DSPAM-Factors: 27, List-Post*, Thierry Herbelot , Alexander Sabourenkov , sos@FreeBSD.ORG Subject: Re: Patch RFC: Promise SATA300 TX4 hardware bug workaround. X-BeenThere: freebsd-current@freebsd.org List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Nov 2007 08:05:06 -0000 This is a multi-part message in MIME format. --------------090105030601040509090901 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: quoted-printable Hi All! I'd like to get the final verdict of the attached patch and if it fixes=20 the problem or not. Please test and report, its a bit urgent if it need to get into R7 :) -S=F8ren --------------090105030601040509090901 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="promise-fix3" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="promise-fix3" ? promise-fix2 ? promise-fix3 Index: ata-chipset.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/ata-chipset.c,v retrieving revision 1.202.2.2 diff -u -r1.202.2.2 ata-chipset.c --- ata-chipset.c 31 Oct 2007 19:59:53 -0000 1.202.2.2 +++ ata-chipset.c 18 Nov 2007 11:54:59 -0000 @@ -142,6 +142,7 @@ static int ata_promise_mio_command(struct ata_request *request); static void ata_promise_mio_reset(device_t dev); static void ata_promise_mio_dmainit(device_t dev); +static void ata_promise_mio_setprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); static void ata_promise_mio_setmode(device_t dev, int mode); static void ata_promise_sx4_intr(void *data); static int ata_promise_sx4_command(struct ata_request *request); @@ -792,6 +793,7 @@ prd[i].dbc = htole32((segs[i].ds_len - 1) & ATA_AHCI_PRD_MASK); } } + KASSERT(nsegs <= ATA_DMA_ENTRIES, "too many DMA segment entries\n"); args->nsegs = nsegs; } @@ -2760,6 +2762,8 @@ prd[i].addrhi = htole32((u_int64_t)segs[i].ds_addr >> 32); } prd[i - 1].count |= htole32(ATA_DMA_EOT); + KASSERT(nsegs <= ATA_DMA_ENTRIES, "too many DMA segment entries\n"); + args->nsegs = nsegs; } static void @@ -3288,9 +3292,13 @@ /* prime fake interrupt register */ ATA_OUTL(ctlr->r_res2, fake_reg, 0xffffffff); - /* clear SATA status */ + /* clear SATA status and unmask interrupts */ ATA_OUTL(ctlr->r_res2, stat_reg, 0x000000ff); + /* enable "long burst lenght" on gen2 chips */ + if ((ctlr->chip->cfg2 == PRSATA2) || (ctlr->chip->cfg2 == PRCMBO2)) + ATA_OUTL(ctlr->r_res2, 0x44, ATA_INL(ctlr->r_res2, 0x44) | 0x2000); + ctlr->allocate = ata_promise_mio_allocate; ctlr->reset = ata_promise_mio_reset; ctlr->dmainit = ata_promise_mio_dmainit; @@ -3778,8 +3786,42 @@ static void ata_promise_mio_dmainit(device_t dev) { + struct ata_channel *ch = device_get_softc(dev); + /* note start and stop are not used here */ ata_dmainit(dev); + if (ch->dma) + ch->dma->setprd = ata_promise_mio_setprd; +} + + +#define MAXLASTSGSIZE (32 * sizeof(u_int32_t)) +static void +ata_promise_mio_setprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) +{ + struct ata_dmasetprd_args *args = xsc; + struct ata_dma_prdentry *prd = args->dmatab; + int i; + + if ((args->error = error)) + return; + + for (i = 0; i < nsegs; i++) { + prd[i].addr = htole32(segs[i].ds_addr); + prd[i].count = htole32(segs[i].ds_len); + } + if (segs[i - 1].ds_len > MAXLASTSGSIZE) { + //printf("split last SG element of %u\n", segs[i - 1].ds_len); + prd[i - 1].count = htole32(segs[i - 1].ds_len - MAXLASTSGSIZE); + prd[i].count = htole32(MAXLASTSGSIZE); + prd[i].addr = htole32(segs[i - 1].ds_addr + + (segs[i - 1].ds_len - MAXLASTSGSIZE)); + nsegs++; + i++; + } + prd[i - 1].count |= htole32(ATA_DMA_EOT); + KASSERT(nsegs <= ATA_DMA_ENTRIES, "too many DMA segment entries\n"); + args->nsegs = nsegs; } static void @@ -4849,6 +4891,8 @@ prd[i].count = htole32(segs[i].ds_len); } prd[i - 1].control = htole32(ATA_DMA_EOT); + KASSERT(nsegs <= ATA_DMA_ENTRIES, "too many DMA segment entries\n"); + args->nsegs = nsegs; } static void Index: ata-dma.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/ata-dma.c,v retrieving revision 1.147 diff -u -r1.147 ata-dma.c --- ata-dma.c 8 Apr 2007 21:53:52 -0000 1.147 +++ ata-dma.c 18 Nov 2007 11:54:59 -0000 @@ -213,6 +213,7 @@ prd[i].count = htole32(segs[i].ds_len); } prd[i - 1].count |= htole32(ATA_DMA_EOT); + KASSERT(nsegs <= ATA_DMA_ENTRIES, "too many DMA segment entries\n"); args->nsegs = nsegs; } --------------090105030601040509090901 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org" --------------090105030601040509090901--