From owner-freebsd-bugs@FreeBSD.ORG Fri Jun 2 15:10:13 2006 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5C7CE16A430 for ; Fri, 2 Jun 2006 15:10:13 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id F398E43D46 for ; Fri, 2 Jun 2006 15:10:12 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id k52FACsg042846 for ; Fri, 2 Jun 2006 15:10:12 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id k52FACXu042845; Fri, 2 Jun 2006 15:10:12 GMT (envelope-from gnats) Date: Fri, 2 Jun 2006 15:10:12 GMT Message-Id: <200606021510.k52FACXu042845@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org From: Pavel Merdin Cc: Subject: Re: kern/68351: [bge] bge0 watchdog timeout on 5.2.1 and -current, 5.1 is ok X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Pavel Merdin List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Jun 2006 15:10:18 -0000 The following reply was made to PR kern/68351; it has been noted by GNATS. From: Pavel Merdin To: bug-followup@FreeBSD.org, freebsd-bugs@mikhailov.org Cc: Subject: Re: kern/68351: [bge] bge0 watchdog timeout on 5.2.1 and -current, 5.1 is ok Date: Fri, 2 Jun 2006 18:08:17 +0300 Hello. The following patch seems to work: ============================================================== --- if_bge.c.orig Fri Jun 2 08:05:57 2006 +++ if_bge.c.new Fri Jun 2 08:06:39 2006 @@ -1085,11 +1085,21 @@ (0x3F000F); } else { /* PCI-X bus */ + if (sc->bge_asicrev == BGE_ASICREV_BCM5750) { + dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD; + dma_rw_ctl &= ~BGE_PCIDMARWCTL_ONEDMA_ATONCE; /* XXX */ + device_printf(sc->bge_dev, "Gotcha\n"); + + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5780) + dma_rw_ctl |= (1 << 20) | (1 << 18) | + BGE_PCIDMARWCTL_ONEDMA_ATONCE; + else + dma_rw_ctl |= (1<<20) | (1<<18) | (1<<15); + } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704 || BGE_ASICREV_BCM5703) /* * The 5704 uses a different encoding of read/write * watermarks. */ - if (sc->bge_asicrev == BGE_ASICREV_BCM5704 || BGE_ASICREV_BCM5703) dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | (0x9F0000); else if (sc->bge_asicrev == BGE_ASICREV_BCM5780) ============================================================== It was imported from OpenBSD. I think that somebody could import their changes into FreeBSD :) The full patch with 5780 support: ============================================================== --- if_bge.c.orig Sat Mar 4 04:34:48 2006 +++ if_bge.c Fri Jun 2 08:06:39 2006 @@ -152,16 +152,28 @@ "Broadcom BCM5704C Dual Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5704S, "Broadcom BCM5704S Dual Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5704S_2, + "Broadcom BCM5704S v2 Dual Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5705, "Broadcom BCM5705 Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5705K, "Broadcom BCM5705K Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5705F, + "Broadcom BCM5705F Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5705M, "Broadcom BCM5705M Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5705M_ALT, "Broadcom BCM5705M Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5714C, "Broadcom BCM5714C Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5714S, + "Broadcom BCM5714S Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5715, + "Broadcom BCM5715 Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5715S, + "Broadcom BCM5715S Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5720, + "Broadcom BCM5720 Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5721, "Broadcom BCM5721 Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5750, @@ -170,10 +182,22 @@ "Broadcom BCM5750M Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5751, "Broadcom BCM5751 Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5751F, + "Broadcom BCM5751F Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5751M, "Broadcom BCM5751M Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5752, "Broadcom BCM5752 Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5753F, + "Broadcom BCM5753F Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5753M, + "Broadcom BCM5753M Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5780, + "Broadcom BCM5780 Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5780S, + "Broadcom BCM5780S Gigabit Ethernet" }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5781, + "Broadcom BCM5781 Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5782, "Broadcom BCM5782 Gigabit Ethernet" }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5788, @@ -1048,30 +1072,45 @@ /* Set up the PCI DMA control register. */ if (sc->bge_pcie) { dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | - (0xf << BGE_PCIDMARWCTL_RD_WAT_SHIFT) | - (0x2 << BGE_PCIDMARWCTL_WR_WAT_SHIFT); + (0x180000); } else if (pci_read_config(sc->bge_dev, BGE_PCI_PCISTATE, 4) & BGE_PCISTATE_PCI_BUSMODE) { /* Conventional PCI bus */ + if (sc->bge_asicrev == BGE_ASICREV_BCM5705 || + BGE_ASICREV_BCM5750) { + dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | + (0x3F0000); } + else dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | - (0x7 << BGE_PCIDMARWCTL_RD_WAT_SHIFT) | - (0x7 << BGE_PCIDMARWCTL_WR_WAT_SHIFT) | - (0x0F); + (0x3F000F); } else { /* PCI-X bus */ + if (sc->bge_asicrev == BGE_ASICREV_BCM5750) { + dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD; + dma_rw_ctl &= ~BGE_PCIDMARWCTL_ONEDMA_ATONCE; /* XXX */ + device_printf(sc->bge_dev, "Gotcha\n"); + + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5780) + dma_rw_ctl |= (1 << 20) | (1 << 18) | + BGE_PCIDMARWCTL_ONEDMA_ATONCE; + else + dma_rw_ctl |= (1<<20) | (1<<18) | (1<<15); + } else if (sc->bge_asicrev == BGE_ASICREV_BCM5704 || BGE_ASICREV_BCM5703) /* * The 5704 uses a different encoding of read/write * watermarks. */ - if (sc->bge_asicrev == BGE_ASICREV_BCM5704) dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | - (0x7 << BGE_PCIDMARWCTL_RD_WAT_SHIFT) | - (0x3 << BGE_PCIDMARWCTL_WR_WAT_SHIFT); + (0x9F0000); + else if (sc->bge_asicrev == BGE_ASICREV_BCM5780) + dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | + (0x144000); + else if (sc->bge_asicrev == BGE_ASICREV_BCM5714) + dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | + (0x148000); else dma_rw_ctl = BGE_PCI_READ_CMD|BGE_PCI_WRITE_CMD | - (0x3 << BGE_PCIDMARWCTL_RD_WAT_SHIFT) | - (0x3 << BGE_PCIDMARWCTL_WR_WAT_SHIFT) | - (0x0F); + (0x1B000F); /* * 5703 and 5704 need ONEDMA_AT_ONCE as a workaround @@ -2103,7 +2142,8 @@ * on this chip. */ if (sc->bge_asicrev == BGE_ASICREV_BCM5714 || - sc->bge_asicrev == BGE_ASICREV_BCM5752) + sc->bge_asicrev == BGE_ASICREV_BCM5752 || + sc->bge_asicrev == BGE_ASICREV_BCM5780) sc->bge_asicrev = BGE_ASICREV_BCM5750; /* ============================================================== -- / Pavel Merdin Fotki Inc.