From owner-freebsd-stable@FreeBSD.ORG Tue Dec 27 09:00:47 2005 Return-Path: X-Original-To: stable@FreeBSD.org Delivered-To: freebsd-stable@FreeBSD.ORG Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3837016A41F for ; Tue, 27 Dec 2005 09:00:47 +0000 (GMT) (envelope-from glebius@FreeBSD.org) Received: from cell.sick.ru (cell.sick.ru [217.72.144.68]) by mx1.FreeBSD.org (Postfix) with ESMTP id 229AD43D5E for ; Tue, 27 Dec 2005 09:00:45 +0000 (GMT) (envelope-from glebius@FreeBSD.org) Received: from cell.sick.ru (glebius@localhost [127.0.0.1]) by cell.sick.ru (8.13.3/8.13.3) with ESMTP id jBR90hi5012570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 27 Dec 2005 12:00:44 +0300 (MSK) (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by cell.sick.ru (8.13.3/8.13.1/Submit) id jBR90ffK012569; Tue, 27 Dec 2005 12:00:41 +0300 (MSK) (envelope-from glebius@FreeBSD.org) X-Authentication-Warning: cell.sick.ru: glebius set sender to glebius@FreeBSD.org using -f Date: Tue, 27 Dec 2005 12:00:41 +0300 From: Gleb Smirnoff To: Thierry DELHAISE , Manolo Valdes , spil oss , olekhov@yandex.ru Message-ID: <20051227090041.GJ1496@FreeBSD.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="MW5yreqqjyrRcusr" Content-Disposition: inline User-Agent: Mutt/1.5.6i Cc: stable@FreeBSD.org Subject: patch against xl(4) regression in RELENG_6 X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Dec 2005 09:00:47 -0000 --MW5yreqqjyrRcusr Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Colleagues, here is WIP patch for the regression with PCMCIA 3Com cards that you have reported. Please test it and tell whether it helps. -- Totus tuus, Glebius. GLEBIUS-RIPN GLEB-RIPE --MW5yreqqjyrRcusr Content-Type: text/plain; charset=koi8-r Content-Disposition: attachment; filename="cardbus_resources.diff" Index: cardbus.c =================================================================== RCS file: /home/ncvs/src/sys/dev/cardbus/cardbus.c,v retrieving revision 1.54 diff -u -r1.54 cardbus.c --- cardbus.c 28 Oct 2005 06:03:53 -0000 1.54 +++ cardbus.c 26 Dec 2005 10:17:47 -0000 @@ -149,14 +149,6 @@ cardbus_add_map(cbdev, child, PCIR_BAR(reg)); } -static void -cardbus_do_res(struct resource_list_entry *rle, device_t child, uint32_t start) -{ - rle->start = start; - rle->end = start + rle->count - 1; - pci_write_config(child, rle->rid, rle->start, 4); -} - static int cardbus_barsort(const void *a, const void *b) { @@ -249,8 +241,16 @@ rle = barlist[tmp]; if (rle->type == SYS_RES_MEMORY && dinfo->mprefetchable & BARBIT(rle->rid)) { - cardbus_do_res(rle, child, start); - start += rle->count; + rle->res = bus_alloc_resource(cbdev, + rle->type, &rle->rid, start, end, + rle->count, + rman_make_alignment_flags(rle->count)); + if (rle->res != NULL) { + rle->start = rman_get_start(rle->res); + rle->end = rman_get_end(rle->res); + pci_write_config(child, + rle->rid, rle->start, 4); + } } } } @@ -297,8 +297,20 @@ rle = barlist[tmp]; if (rle->type == SYS_RES_MEMORY && (dinfo->mprefetchable & BARBIT(rle->rid)) == 0) { - cardbus_do_res(rle, child, start); - start += rle->count; + rle->res = bus_alloc_resource(cbdev, + rle->type, &rle->rid, start, end, + rle->count, + rman_make_alignment_flags(rle->count)); + if (rle->res == NULL) { + DEVPRINTF((cbdev, "Cannot pre-allocate " + "memory for cardbus device\n")); + free(barlist, M_DEVBUF); + return (ENOMEM); + } + rle->start = rman_get_start(rle->res); + rle->end = rman_get_end(rle->res); + pci_write_config(child, + rle->rid, rle->start, 4); } } } @@ -341,8 +353,20 @@ for (tmp = 0; tmp < count; tmp++) { rle = barlist[tmp]; if (rle->type == SYS_RES_IOPORT) { - cardbus_do_res(rle, child, start); - start += rle->count; + rle->res = bus_alloc_resource(cbdev, + rle->type, &rle->rid, start, end, + rle->count, + rman_make_alignment_flags(rle->count)); + if (rle->res == NULL) { + DEVPRINTF((cbdev, "Cannot pre-allocate " + "IO port for cardbus device\n")); + free(barlist, M_DEVBUF); + return (ENOMEM); + } + rle->start = rman_get_start(rle->res); + rle->end = rman_get_end(rle->res); + pci_write_config(child, + rle->rid, rle->start, 4); } } } @@ -357,9 +381,10 @@ } start = rman_get_start(res); end = rman_get_end(res); - bus_release_resource(cbdev, SYS_RES_IRQ, rid, res); resource_list_add(&dinfo->pci.resources, SYS_RES_IRQ, rid, start, end, 1); + rle = resource_list_find(&dinfo->pci.resources, SYS_RES_IRQ, rid); + rle->res = res; dinfo->pci.cfg.intline = start; pci_write_config(child, PCIR_INTLINE, start, 1); --MW5yreqqjyrRcusr--