From owner-svn-src-stable-8@FreeBSD.ORG Sun Aug 15 21:43:52 2010 Return-Path: Delivered-To: svn-src-stable-8@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 215531065673; Sun, 15 Aug 2010 21:43:52 +0000 (UTC) (envelope-from yongari@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E9A908FC13; Sun, 15 Aug 2010 21:43:51 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o7FLhpDj072801; Sun, 15 Aug 2010 21:43:51 GMT (envelope-from yongari@svn.freebsd.org) Received: (from yongari@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o7FLhp7P072799; Sun, 15 Aug 2010 21:43:51 GMT (envelope-from yongari@svn.freebsd.org) Message-Id: <201008152143.o7FLhp7P072799@svn.freebsd.org> From: Pyun YongHyeon Date: Sun, 15 Aug 2010 21:43:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211357 - stable/8/sys/dev/ste X-BeenThere: svn-src-stable-8@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for only the 8-stable src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Aug 2010 21:43:52 -0000 Author: yongari Date: Sun Aug 15 21:43:51 2010 New Revision: 211357 URL: http://svn.freebsd.org/changeset/base/211357 Log: MFC r211089: It seems some old Sundace(now IC Plus Corp.) controllers do not like memory mapped register access. Typical problem from the issue was MII access returned unreliable values. I'm not sure this comes from lack of register flushing in MII access after accessing STE_PHYCTL register though. To address the issue, read hints data that controls which type of memory mapping should be used in driver. ste(4) still prefers memory mapping to io mapping but honor hints entered by user except for controllers that have problems with memory mapping. The hint to use iomapping could be given by adding the following line to /boot/device.hints file. hint.ste.0.prefer_iomap="1" PR: kern/149285 Modified: stable/8/sys/dev/ste/if_ste.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cam/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) stable/8/sys/dev/e1000/ (props changed) stable/8/sys/dev/xen/xenpci/ (props changed) Modified: stable/8/sys/dev/ste/if_ste.c ============================================================================== --- stable/8/sys/dev/ste/if_ste.c Sun Aug 15 21:37:30 2010 (r211356) +++ stable/8/sys/dev/ste/if_ste.c Sun Aug 15 21:43:51 2010 (r211357) @@ -1059,7 +1059,7 @@ ste_attach(device_t dev) struct ste_softc *sc; struct ifnet *ifp; uint16_t eaddr[ETHER_ADDR_LEN / 2]; - int error = 0, pmc, rid; + int error = 0, pmc, prefer_iomap, rid; sc = device_get_softc(dev); sc->ste_dev = dev; @@ -1081,12 +1081,25 @@ ste_attach(device_t dev) */ pci_enable_busmaster(dev); - /* Prefer memory space register mapping over IO space. */ - sc->ste_res_id = PCIR_BAR(1); - sc->ste_res_type = SYS_RES_MEMORY; - sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type, - &sc->ste_res_id, RF_ACTIVE); - if (sc->ste_res == NULL) { + /* + * Prefer memory space register mapping over IO space but use + * IO space for a device that is known to have issues on memory + * mapping. + */ + prefer_iomap = 0; + if (pci_get_device(dev) == ST_DEVICEID_ST201_1) + prefer_iomap = 1; + else + resource_int_value(device_get_name(sc->ste_dev), + device_get_unit(sc->ste_dev), "prefer_iomap", + &prefer_iomap); + if (prefer_iomap == 0) { + sc->ste_res_id = PCIR_BAR(1); + sc->ste_res_type = SYS_RES_MEMORY; + sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type, + &sc->ste_res_id, RF_ACTIVE); + } + if (prefer_iomap || sc->ste_res == NULL) { sc->ste_res_id = PCIR_BAR(0); sc->ste_res_type = SYS_RES_IOPORT; sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type,