PERFORCE change 124476 for review
Rui Paulo
rpaulo at FreeBSD.org
Wed Aug 1 09:22:37 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=124476
Change 124476 by rpaulo at rpaulo_epsilon on 2007/08/01 16:21:53
IFC
Affected files ...
.. //depot/projects/soc2007/rpaulo-macbook/arm/arm/trap.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/arm/at91/at91rm92reg.h#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/arm/at91/kb920x_machdep.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/arm/at91/ohci_atmelarm.c#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/arm/conf/KB920X#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/conf/kern.pre.mk#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/conf/options.ia64#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/acpica/acpi_hpet.c#5 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/acpica/acpi_timer.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/aic7xxx/aic7xxx.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/aic7xxx/aic_osm_lib.c#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/arcmsr/arcmsr.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/bce/if_bce.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/bce/if_bcefw.h#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/bce/if_bcereg.h#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/dev/usb/umodem.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/db_machdep.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/exception.S#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/interrupt.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/machdep.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/mp_machdep.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/nexus.c#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/pmap.c#6 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/ia64/sapic.c#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/include/atomic.h#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/include/intr.h#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/include/md_var.h#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/ia64/include/sapicvar.h#2 integrate
.. //depot/projects/soc2007/rpaulo-macbook/net/if_bridge.c#5 integrate
.. //depot/projects/soc2007/rpaulo-macbook/net/if_bridgevar.h#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/net/if_lagg.c#9 integrate
.. //depot/projects/soc2007/rpaulo-macbook/net/if_lagg.h#7 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/tcp_fsm.h#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/tcp_input.c#12 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/tcp_subr.c#12 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/tcp_syncache.c#9 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/tcp_timer.h#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netinet/tcp_usrreq.c#8 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netipx/spx_debug.c#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/netipx/spx_debug.h#3 integrate
.. //depot/projects/soc2007/rpaulo-macbook/pc98/cbus/clock.c#4 integrate
.. //depot/projects/soc2007/rpaulo-macbook/powerpc/powerpc/trap.c#3 integrate
Differences ...
==== //depot/projects/soc2007/rpaulo-macbook/arm/arm/trap.c#3 (text+ko) ====
@@ -82,7 +82,7 @@
#include "opt_ktrace.h"
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/arm/trap.c,v 1.34 2007/06/04 21:38:45 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/arm/trap.c,v 1.35 2007/07/31 17:09:05 cognet Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -943,7 +943,7 @@
case 0:
#ifdef __ARMEB__
if ((insn & 0x000fffff) == SYS___syscall &&
- (code != SYS_lseek)) {
+ code != SYS_freebsd6_lseek && code != SYS_lseek) {
/*
* 64-bit return, 32-bit syscall. Fixup byte order
*/
==== //depot/projects/soc2007/rpaulo-macbook/arm/at91/at91rm92reg.h#2 (text) ====
@@ -22,7 +22,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/* $FreeBSD: src/sys/arm/at91/at91rm92reg.h,v 1.4 2006/08/28 20:05:00 cognet Exp $ */
+/* $FreeBSD: src/sys/arm/at91/at91rm92reg.h,v 1.5 2007/07/31 17:43:18 imp Exp $ */
#ifndef AT91RM92REG_H_
#define AT91RM92REG_H_
@@ -336,7 +336,8 @@
#define AT91RM92_TC1C1_BASE 0xffa4040
#define AT91RM92_TC1C2_BASE 0xffa4080
-#define AT91RM92_OHCI_BASE 0x00300000
+#define AT91RM92_OHCI_BASE 0xdfe00000
+#define AT91RM92_OHCI_PA_BASE 0x00300000
#define AT91RM92_OHCI_SIZE 0x00100000
#define AT91C_MASTER_CLOCK 60000000
==== //depot/projects/soc2007/rpaulo-macbook/arm/at91/kb920x_machdep.c#3 (text) ====
@@ -48,7 +48,7 @@
#include "opt_at91.h"
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.22 2007/05/23 13:20:50 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.23 2007/07/31 17:43:18 imp Exp $");
#define _ARM32_BUS_DMA_PRIVATE
#include <sys/param.h>
@@ -165,14 +165,14 @@
* initialization is done. However, the AT91 resource allocation
* system doesn't know how to use pmap_mapdev() yet.
*/
-#if 0
+#if 1
{
/*
* Add the ohci controller, and anything else that might be
* on this chip select for a VA/PA mapping.
*/
AT91RM92_OHCI_BASE,
- AT91RM92_OHCI_BASE,
+ AT91RM92_OHCI_PA_BASE,
AT91RM92_OHCI_SIZE,
VM_PROT_READ|VM_PROT_WRITE,
PTE_NOCACHE,
==== //depot/projects/soc2007/rpaulo-macbook/arm/at91/ohci_atmelarm.c#2 (text) ====
@@ -23,12 +23,14 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/ohci_atmelarm.c,v 1.2 2007/03/01 09:10:55 piso Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/ohci_atmelarm.c,v 1.3 2007/07/31 17:43:18 imp Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
+#include <sys/lock.h>
#include <sys/module.h>
+#include <sys/mutex.h>
#include <sys/bus.h>
#include <sys/queue.h>
#include <machine/bus.h>
@@ -99,6 +101,30 @@
}
device_set_ivars(sc->sc_ohci.sc_bus.bdev, &sc->sc_ohci.sc_bus);
+ /* Allocate a parent dma tag for DMA maps */
+ err = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ BUS_SPACE_MAXSIZE_32BIT, USB_DMA_NSEG, BUS_SPACE_MAXSIZE_32BIT, 0,
+ NULL, NULL, &sc->sc_ohci.sc_bus.parent_dmatag);
+ if (err) {
+ device_printf(dev, "Could not allocate parent DMA tag (%d)\n",
+ err);
+ err = ENXIO;
+ goto error;
+ }
+
+ /* Allocate a dma tag for transfer buffers */
+ err = bus_dma_tag_create(sc->sc_ohci.sc_bus.parent_dmatag, 1, 0,
+ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+ BUS_SPACE_MAXSIZE_32BIT, USB_DMA_NSEG, BUS_SPACE_MAXSIZE_32BIT, 0,
+ busdma_lock_mutex, &Giant, &sc->sc_ohci.sc_bus.buffer_dmatag);
+ if (err) {
+ device_printf(dev, "Could not allocate transfer tag (%d)\n",
+ err);
+ err = ENXIO;
+ goto error;
+ }
+
err = bus_setup_intr(dev, sc->sc_ohci.irq_res, INTR_TYPE_BIO, NULL,
ohci_intr, sc, &sc->sc_ohci.ih);
if (err) {
@@ -158,6 +184,12 @@
bus_teardown_intr(dev, sc->sc_ohci.irq_res, sc->sc_ohci.ih);
sc->sc_ohci.ih = NULL;
}
+
+ if (sc->sc_ohci.sc_bus.parent_dmatag != NULL)
+ bus_dma_tag_destroy(sc->sc_ohci.sc_bus.parent_dmatag);
+ if (sc->sc_ohci.sc_bus.buffer_dmatag != NULL)
+ bus_dma_tag_destroy(sc->sc_ohci.sc_bus.buffer_dmatag);
+
if (sc->sc_ohci.sc_bus.bdev) {
device_delete_child(dev, sc->sc_ohci.sc_bus.bdev);
sc->sc_ohci.sc_bus.bdev = NULL;
==== //depot/projects/soc2007/rpaulo-macbook/arm/conf/KB920X#2 (text) ====
@@ -16,7 +16,7 @@
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
-# $FreeBSD: src/sys/arm/conf/KB920X,v 1.12 2007/03/23 23:47:59 imp Exp $
+# $FreeBSD: src/sys/arm/conf/KB920X,v 1.13 2007/07/31 17:45:54 imp Exp $
machine arm
ident KB920X
@@ -93,3 +93,47 @@
device icee
device bpf
+# USB support
+device ohci # OHCI localbus->USB interface
+device usb # USB Bus (required)
+#device udbp # USB Double Bulk Pipe devices
+device ugen # Generic
+device uhid # "Human Interface Devices"
+device ulpt # Printer
+device umass # Disks/Mass storage - Requires scbus and da
+device ural # Ralink Technology RT2500USB wireless NICs
+device rum # Ralink Technology RT2501USB wireless NICs
+device urio # Diamond Rio 500 MP3 player
+device uscanner # Scanners
+# USB Ethernet, requires miibus
+device miibus
+device aue # ADMtek USB Ethernet
+device axe # ASIX Electronics USB Ethernet
+device cdce # Generic USB over Ethernet
+device cue # CATC USB Ethernet
+device kue # Kawasaki LSI USB Ethernet
+device rue # RealTek RTL8150 USB Ethernet
+device udav
+# usb serial
+device ucom
+device uark
+device ubsa
+device ubser
+device uftdi
+device uipaq
+device uplcom
+device uvisor
+device uvscom
+# SCSI peripherals
+device scbus # SCSI bus (required for SCSI)
+device da # Direct Access (disks)
+device cd # CD
+device pass # Passthrough device (direct SCSI access)
+# Wireless NIC cards
+device wlan # 802.11 support
+device wlan_wep # 802.11 WEP support
+device wlan_ccmp # 802.11 CCMP support
+device wlan_tkip # 802.11 TKIP support
+device wlan_amrr # AMRR transmit rate control algorithm
+device wlan_scan_ap # 802.11 AP mode scanning
+device wlan_scan_sta # 802.11 STA mode scanning
==== //depot/projects/soc2007/rpaulo-macbook/conf/kern.pre.mk#6 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/kern.pre.mk,v 1.90 2007/07/12 00:01:53 jfv Exp $
+# $FreeBSD: src/sys/conf/kern.pre.mk,v 1.91 2007/07/31 03:15:32 marcel Exp $
# Part of a unified Makefile for building kernels. This part contains all
# of the definitions that need to be before %BEFORE_DEPEND.
@@ -88,7 +88,7 @@
CFLAGS+= --param inline-unit-growth=100
CFLAGS+= --param large-function-growth=1000
.if ${MACHINE_ARCH} == "amd64" || ${MACHINE} == "i386" || \
- ${MACHINE_ARCH} == "sparc64"
+ ${MACHINE_ARCH} == "ia64" || ${MACHINE_ARCH} == "sparc64"
WERROR?= -Werror
.endif
.endif
==== //depot/projects/soc2007/rpaulo-macbook/conf/options.ia64#2 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options.ia64,v 1.27 2006/04/24 23:31:50 marcel Exp $
+# $FreeBSD: src/sys/conf/options.ia64,v 1.28 2007/07/30 22:42:33 marcel Exp $
# Options specific to the ia64 platform kernels
ITANIUM opt_global.h
@@ -11,6 +11,8 @@
COMPAT_IA32 opt_compat.h
+EXCEPTION_TRACING opt_xtrace.h
+
VGA_ALT_SEQACCESS opt_vga.h
VGA_DEBUG opt_vga.h
VGA_NO_FONT_LOADING opt_vga.h
==== //depot/projects/soc2007/rpaulo-macbook/dev/acpica/acpi_hpet.c#5 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_hpet.c,v 1.10 2007/07/22 20:45:27 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_hpet.c,v 1.11 2007/07/30 15:21:26 njl Exp $");
#include "opt_acpi.h"
#include <sys/param.h>
@@ -70,7 +70,7 @@
.tc_get_timecount = hpet_get_timecount,
.tc_counter_mask = ~0u,
.tc_name = "HPET",
- .tc_quality = 2000,
+ .tc_quality = 900,
};
static u_int
==== //depot/projects/soc2007/rpaulo-macbook/dev/acpica/acpi_timer.c#3 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_timer.c,v 1.41 2007/06/04 18:25:03 dwmalone Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_timer.c,v 1.42 2007/07/30 15:21:26 njl Exp $");
#include "opt_acpi.h"
#include <sys/param.h>
@@ -96,7 +96,7 @@
0, /* no default counter_mask */
0, /* no default frequency */
"ACPI", /* name */
- 1000 /* quality */
+ -1 /* quality (chosen later) */
};
static u_int
@@ -185,9 +185,11 @@
if (j == 10) {
acpi_timer_timecounter.tc_name = "ACPI-fast";
acpi_timer_timecounter.tc_get_timecount = acpi_timer_get_timecount;
+ acpi_timer_timecounter.tc_quality = 1000;
} else {
acpi_timer_timecounter.tc_name = "ACPI-safe";
acpi_timer_timecounter.tc_get_timecount = acpi_timer_get_timecount_safe;
+ acpi_timer_timecounter.tc_quality = 850;
}
tc_init(&acpi_timer_timecounter);
==== //depot/projects/soc2007/rpaulo-macbook/dev/aic7xxx/aic7xxx.c#3 (text+ko) ====
@@ -46,7 +46,7 @@
#include "aicasm/aicasm_insformat.h"
#else
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/aic7xxx/aic7xxx.c,v 1.111 2007/04/19 18:53:52 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/aic7xxx/aic7xxx.c,v 1.112 2007/07/31 20:11:02 scottl Exp $");
#include <dev/aic7xxx/aic7xxx_osm.h>
#include <dev/aic7xxx/aic7xxx_inline.h>
#include <dev/aic7xxx/aicasm/aicasm_insformat.h>
@@ -6932,7 +6932,6 @@
struct ahc_softc *ahc;
ahc = scb->ahc_softc;
- ahc_lock(ahc);
if ((scb->flags & SCB_ACTIVE) != 0) {
if ((scb->flags & SCB_TIMEDOUT) == 0) {
LIST_INSERT_HEAD(&ahc->timedout_scbs, scb,
@@ -6941,7 +6940,6 @@
}
ahc_wakeup_recovery_thread(ahc);
}
- ahc_unlock(ahc);
}
/*
==== //depot/projects/soc2007/rpaulo-macbook/dev/aic7xxx/aic_osm_lib.c#2 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/aic7xxx/aic_osm_lib.c,v 1.5 2007/04/17 06:26:25 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/aic7xxx/aic_osm_lib.c,v 1.6 2007/07/31 20:11:03 scottl Exp $");
static void aic_recovery_thread(void *arg);
@@ -120,9 +120,7 @@
if ((aic->flags & AIC_SHUTDOWN_RECOVERY) != 0)
break;
- aic_unlock(aic);
aic_recover_commands(aic);
- aic_lock(aic);
}
aic->platform_data->recovery_thread = NULL;
wakeup(aic->platform_data);
==== //depot/projects/soc2007/rpaulo-macbook/dev/arcmsr/arcmsr.c#3 (text+ko) ====
@@ -56,7 +56,7 @@
** and cause g_vfs_done() read write error
******************************************************************************************
-* $FreeBSD: src/sys/dev/arcmsr/arcmsr.c,v 1.23 2007/06/17 05:55:48 scottl Exp $
+* $FreeBSD: src/sys/dev/arcmsr/arcmsr.c,v 1.24 2007/07/31 20:16:50 scottl Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
@@ -103,6 +103,7 @@
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
#define ARCMSR_LOCK_INIT(l, s) mtx_init(l, s, NULL, MTX_DEF|MTX_RECURSE)
+ #define ARCMSR_LOCK_DESTROY(l) mtx_destroy(l)
#define ARCMSR_LOCK_ACQUIRE(l) mtx_lock(l)
#define ARCMSR_LOCK_RELEASE(l) mtx_unlock(l)
#define ARCMSR_LOCK_TRY(l) mtx_trylock(l)
@@ -113,6 +114,7 @@
#include <pci/pcivar.h>
#include <pci/pcireg.h>
#define ARCMSR_LOCK_INIT(l, s) simple_lock_init(l)
+ #define ARCMSR_LOCK_DESTROY(l)
#define ARCMSR_LOCK_ACQUIRE(l) simple_lock(l)
#define ARCMSR_LOCK_RELEASE(l) simple_unlock(l)
#define ARCMSR_LOCK_TRY(l) simple_lock_try(l)
@@ -417,7 +419,6 @@
bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
}
- ARCMSR_LOCK_ACQUIRE(&acb->workingQ_done_lock);
if(stand_flag==1) {
atomic_subtract_int(&acb->srboutstandingcount, 1);
if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
@@ -431,7 +432,6 @@
acb->srbworkingQ[acb->workingsrb_doneindex]=srb;
acb->workingsrb_doneindex++;
acb->workingsrb_doneindex %= ARCMSR_MAX_FREESRB_NUM;
- ARCMSR_LOCK_RELEASE(&acb->workingQ_done_lock);
xpt_done(pccb);
return;
}
@@ -671,6 +671,18 @@
**********************************************************************
**********************************************************************
*/
+static void arcmsr_intr_handler(void *arg)
+{
+ struct AdapterControlBlock *acb=(struct AdapterControlBlock *)arg;
+
+ ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
+ arcmsr_interrupt(acb);
+ ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
+}
+/*
+**********************************************************************
+**********************************************************************
+*/
static void arcmsr_interrupt(void *arg)
{
struct AdapterControlBlock *acb=(struct AdapterControlBlock *)arg;
@@ -1035,7 +1047,6 @@
struct CommandControlBlock *srb=NULL;
u_int32_t workingsrb_startindex, workingsrb_doneindex;
- ARCMSR_LOCK_ACQUIRE(&acb->workingQ_start_lock);
workingsrb_doneindex=acb->workingsrb_doneindex;
workingsrb_startindex=acb->workingsrb_startindex;
srb=acb->srbworkingQ[workingsrb_startindex];
@@ -1046,7 +1057,6 @@
} else {
srb=NULL;
}
- ARCMSR_LOCK_RELEASE(&acb->workingQ_start_lock);
return(srb);
}
/*
@@ -1970,7 +1980,7 @@
/*maxsegsz*/ BUS_SPACE_MAXSIZE_32BIT,
/*flags*/ 0,
/*lockfunc*/ busdma_lock_mutex,
- /*lockarg*/ &Giant,
+ /*lockarg*/ &acb->qbuffer_lock,
&acb->dm_segs_dmat) != 0)
#else
if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat,
@@ -2114,9 +2124,10 @@
printf("arcmsr%d: cannot allocate softc\n", unit);
return (ENOMEM);
}
- bzero(acb, sizeof(struct AdapterControlBlock));
+ ARCMSR_LOCK_INIT(&acb->qbuffer_lock, "arcmsr Q buffer lock");
if(arcmsr_initialize(dev)) {
printf("arcmsr%d: initialize failure!\n", unit);
+ ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
return ENXIO;
}
/* After setting up the adapter, map our interrupt */
@@ -2124,8 +2135,9 @@
irqres=bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, RF_SHAREABLE | RF_ACTIVE);
if(irqres == NULL ||
bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY|INTR_MPSAFE
- , NULL, arcmsr_interrupt, acb, &acb->ih)) {
+ , NULL, arcmsr_intr_handler, acb, &acb->ih)) {
arcmsr_free_resource(acb);
+ ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
printf("arcmsr%d: unable to register interrupt handler!\n", unit);
return ENXIO;
}
@@ -2142,23 +2154,27 @@
if(devq == NULL) {
arcmsr_free_resource(acb);
bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
+ ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
printf("arcmsr%d: cam_simq_alloc failure!\n", unit);
return ENXIO;
}
acb->psim=cam_sim_alloc(arcmsr_action, arcmsr_poll,
- "arcmsr", acb, unit, &Giant, 1,
+ "arcmsr", acb, unit, &acb->qbuffer_lock, 1,
ARCMSR_MAX_OUTSTANDING_CMD, devq);
if(acb->psim == NULL) {
arcmsr_free_resource(acb);
bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
cam_simq_free(devq);
+ ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
printf("arcmsr%d: cam_sim_alloc failure!\n", unit);
return ENXIO;
}
+ ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
if(xpt_bus_register(acb->psim, dev, 0) != CAM_SUCCESS) {
arcmsr_free_resource(acb);
bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
cam_sim_free(acb->psim, /*free_devq*/TRUE);
+ ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
printf("arcmsr%d: xpt_bus_register failure!\n", unit);
return ENXIO;
}
@@ -2170,12 +2186,10 @@
bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
xpt_bus_deregister(cam_sim_path(acb->psim));
cam_sim_free(acb->psim, /* free_simq */ TRUE);
+ ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
printf("arcmsr%d: xpt_create_path failure!\n", unit);
return ENXIO;
}
- ARCMSR_LOCK_INIT(&acb->workingQ_done_lock, "arcmsr done working Q lock");
- ARCMSR_LOCK_INIT(&acb->workingQ_start_lock, "arcmsr start working Q lock");
- ARCMSR_LOCK_INIT(&acb->qbuffer_lock, "arcmsr Q buffer lock");
/*
****************************************************
*/
@@ -2185,6 +2199,7 @@
csa.callback=arcmsr_async;
csa.callback_arg=acb->psim;
xpt_action((union ccb *)&csa);
+ ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
/* Create the control device. */
acb->ioctl_dev=make_dev(&arcmsr_cdevsw
, unit
@@ -2256,6 +2271,7 @@
struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
/* stop adapter background rebuild */
+ ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
arcmsr_stop_adapter_bgrb(acb);
arcmsr_flush_adapter_cache(acb);
/* disable all outbound interrupt */
@@ -2289,6 +2305,7 @@
atomic_set_int(&acb->srboutstandingcount, 0);
acb->workingsrb_doneindex=0;
acb->workingsrb_startindex=0;
+ ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
return;
}
/*
@@ -2299,15 +2316,18 @@
{
struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
+ bus_teardown_intr(dev, acb->irqres, acb->ih);
arcmsr_shutdown(dev);
arcmsr_free_resource(acb);
bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(0), acb->sys_res_arcmsr);
- bus_teardown_intr(dev, acb->irqres, acb->ih);
bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
+ ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
xpt_async(AC_LOST_DEVICE, acb->ppath, NULL);
xpt_free_path(acb->ppath);
xpt_bus_deregister(cam_sim_path(acb->psim));
cam_sim_free(acb->psim, TRUE);
+ ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
+ ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
return (0);
}
==== //depot/projects/soc2007/rpaulo-macbook/dev/bce/if_bce.c#6 (text) ====
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/bce/if_bce.c,v 1.33 2007/06/16 02:27:03 davidch Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/bce/if_bce.c,v 1.34 2007/07/31 00:06:04 davidch Exp $");
/*
* The following controllers are supported by this driver:
@@ -288,21 +288,22 @@
static int bce_get_buf (struct bce_softc *, struct mbuf *, u16 *, u16 *, u32 *);
static int bce_init_tx_chain (struct bce_softc *);
+static void bce_fill_rx_chain (struct bce_softc *);
static int bce_init_rx_chain (struct bce_softc *);
static void bce_free_rx_chain (struct bce_softc *);
static void bce_free_tx_chain (struct bce_softc *);
-static int bce_tx_encap (struct bce_softc *, struct mbuf **);
+static int bce_tx_encap (struct bce_softc *, struct mbuf **);
static void bce_start_locked (struct ifnet *);
static void bce_start (struct ifnet *);
static int bce_ioctl (struct ifnet *, u_long, caddr_t);
static void bce_watchdog (struct bce_softc *);
static int bce_ifmedia_upd (struct ifnet *);
-static void bce_ifmedia_upd_locked (struct ifnet *);
+static void bce_ifmedia_upd_locked (struct ifnet *);
static void bce_ifmedia_sts (struct ifnet *, struct ifmediareq *);
static void bce_init_locked (struct bce_softc *);
static void bce_init (void *);
-static void bce_mgmt_init_locked(struct bce_softc *sc);
+static void bce_mgmt_init_locked (struct bce_softc *sc);
static void bce_init_context (struct bce_softc *);
static void bce_get_mac_addr (struct bce_softc *);
@@ -629,7 +630,7 @@
if (val & BCE_PCICFG_MISC_STATUS_32BIT_DET)
sc->bce_flags |= BCE_PCI_32BIT_FLAG;
- /* Reset the controller and announce to bootcde that driver is present. */
+ /* Reset the controller and announce to bootcode that driver is present. */
if (bce_reset(sc, BCE_DRV_MSG_CODE_RESET)) {
BCE_PRINTF("%s(%d): Controller reset failed!\n",
__FILE__, __LINE__);
@@ -3178,7 +3179,7 @@
bce_disable_intr(sc);
- /* Free the RX lists. */
+ /* Free RX buffers. */
bce_free_rx_chain(sc);
/* Free TX buffers. */
@@ -3498,6 +3499,9 @@
/* This routine will map an mbuf cluster into 1 or more rx_bd's as */
/* necessary. */
/* */
+/* Todo: Consider writing the hardware mailboxes here to make rx_bd's */
+/* available to the hardware as soon as possible. */
+/* */
/* Returns: */
/* 0 for success, positive value for failure. */
/****************************************************************************/
@@ -3505,10 +3509,10 @@
bce_get_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, u16 *chain_prod,
u32 *prod_bseq)
{
- bus_dmamap_t map;
- bus_dma_segment_t segs[4];
+ bus_dmamap_t map;
+ bus_dma_segment_t segs[BCE_MAX_SEGMENTS];
struct mbuf *m_new = NULL;
- struct rx_bd *rxbd;
+ struct rx_bd *rxbd;
int i, nsegs, error, rc = 0;
#ifdef BCE_DEBUG
u16 debug_chain_prod = *chain_prod;
@@ -3525,12 +3529,13 @@
DBPRINT(sc, BCE_VERBOSE_RECV, "%s(enter): prod = 0x%04X, chain_prod = 0x%04X, "
"prod_bseq = 0x%08X\n", __FUNCTION__, *prod, *chain_prod, *prod_bseq);
+ /* Check whether this is a new mbuf allocation. */
if (m == NULL) {
+ /* Simulate an mbuf allocation failure. */
DBRUNIF(DB_RANDOMTRUE(bce_debug_mbuf_allocation_failure),
- BCE_PRINTF("%s(%d): Simulating mbuf allocation failure.\n",
- __FILE__, __LINE__);
- sc->mbuf_alloc_failed++;
+ sc->mbuf_alloc_failed++;
+ sc->mbuf_sim_alloc_failed++;
rc = ENOBUFS;
goto bce_get_buf_exit);
@@ -3541,13 +3546,24 @@
DBPRINT(sc, BCE_WARN, "%s(%d): RX mbuf header allocation failed!\n",
__FILE__, __LINE__);
- DBRUNIF(1, sc->mbuf_alloc_failed++);
+ sc->mbuf_alloc_failed++;
rc = ENOBUFS;
goto bce_get_buf_exit;
}
DBRUNIF(1, sc->rx_mbuf_alloc++);
+
+ /* Simulate an mbuf cluster allocation failure. */
+ DBRUNIF(DB_RANDOMTRUE(bce_debug_mbuf_allocation_failure),
+ m_freem(m_new);
+ sc->rx_mbuf_alloc--;
+ sc->mbuf_alloc_failed++;
+ sc->mbuf_sim_alloc_failed++;
+ rc = ENOBUFS;
+ goto bce_get_buf_exit);
+
+ /* Attach a cluster to the mbuf. */
m_cljget(m_new, M_DONTWAIT, sc->mbuf_alloc_size);
if (!(m_new->m_flags & M_EXT)) {
@@ -3555,16 +3571,17 @@
__FILE__, __LINE__);
m_freem(m_new);
-
DBRUNIF(1, sc->rx_mbuf_alloc--);
- DBRUNIF(1, sc->mbuf_alloc_failed++);
+ sc->mbuf_alloc_failed++;
rc = ENOBUFS;
goto bce_get_buf_exit;
}
+ /* Initialize the mbuf cluster. */
m_new->m_len = m_new->m_pkthdr.len = sc->mbuf_alloc_size;
} else {
+ /* Reuse an existing mbuf. */
m_new = m;
m_new->m_len = m_new->m_pkthdr.len = sc->mbuf_alloc_size;
m_new->m_data = m_new->m_ext.ext_buf;
@@ -3575,27 +3592,38 @@
error = bus_dmamap_load_mbuf_sg(sc->rx_mbuf_tag, map, m_new,
segs, &nsegs, BUS_DMA_NOWAIT);
+ /* Handle any mapping errors. */
if (error) {
BCE_PRINTF("%s(%d): Error mapping mbuf into RX chain!\n",
__FILE__, __LINE__);
m_freem(m_new);
-
DBRUNIF(1, sc->rx_mbuf_alloc--);
rc = ENOBUFS;
goto bce_get_buf_exit;
}
- /* Watch for overflow. */
- DBRUNIF((sc->free_rx_bd > USABLE_RX_BD),
- BCE_PRINTF("%s(%d): Too many free rx_bd (0x%04X > 0x%04X)!\n",
- __FILE__, __LINE__, sc->free_rx_bd, (u16) USABLE_RX_BD));
+ /* Make sure there is room in the receive chain. */
+ if (nsegs > sc->free_rx_bd) {
+ bus_dmamap_unload(sc->rx_mbuf_tag, map);
+
+ m_freem(m_new);
+ DBRUNIF(1, sc->rx_mbuf_alloc--);
+
+ rc = EFBIG;
+ goto bce_get_buf_exit;
+ }
+
+#ifdef BCE_DEBUG
+ /* Track the distribution of buffer segments. */
+ sc->rx_mbuf_segs[nsegs]++;
+#endif
/* Update some debug statistic counters */
DBRUNIF((sc->free_rx_bd < sc->rx_low_watermark),
sc->rx_low_watermark = sc->free_rx_bd);
- DBRUNIF((sc->free_rx_bd == 0), sc->rx_empty_count++);
+ DBRUNIF((sc->free_rx_bd == sc->max_rx_bd), sc->rx_empty_count++);
/* Setup the rx_bd for the first segment. */
rxbd = &sc->rx_bd_chain[RX_PAGE(*chain_prod)][RX_IDX(*chain_prod)];
@@ -3741,6 +3769,8 @@
for (i = 0; i < TX_PAGES; i++)
bzero((char *)sc->tx_bd_chain[i], BCE_TX_CHAIN_PAGE_SZ);
+ sc->used_tx_bd = 0;
+
/* Check if we lost any mbufs in the process. */
DBRUNIF((sc->tx_mbuf_alloc),
BCE_PRINTF("%s(%d): Memory leak! Lost %d mbufs "
@@ -3752,6 +3782,62 @@
/****************************************************************************/
+/* Add mbufs to the RX chain until its full or an mbuf allocation error */
+/* occurs. */
+/* */
+/* Returns: */
+/* Nothing */
+/****************************************************************************/
+static void
+bce_fill_rx_chain(struct bce_softc *sc)
+{
+ u16 prod, chain_prod;
+ u32 prod_bseq;
+#ifdef BCE_DEBUG
+ int rx_mbuf_alloc_before, free_rx_bd_before;
+#endif
+
+ DBPRINT(sc, BCE_EXCESSIVE_RECV, "Entering %s()\n", __FUNCTION__);
+
+ prod = sc->rx_prod;
+ prod_bseq = sc->rx_prod_bseq;
+
+#ifdef BCE_DEBUG
+ rx_mbuf_alloc_before = sc->rx_mbuf_alloc;
+ free_rx_bd_before = sc->free_rx_bd;
+#endif
+
+ /* Keep filling the RX chain until it's full. */
+ while (sc->free_rx_bd > 0) {
+ chain_prod = RX_CHAIN_IDX(prod);
+ if (bce_get_buf(sc, NULL, &prod, &chain_prod, &prod_bseq)) {
+ /* Bail out if we can't add an mbuf to the chain. */
+ break;
+ }
+ prod = NEXT_RX_BD(prod);
+ }
+
+#if 0
+ DBRUNIF((sc->rx_mbuf_alloc - rx_mbuf_alloc_before),
+ BCE_PRINTF("%s(): Installed %d mbufs in %d rx_bd entries.\n",
+ __FUNCTION__, (sc->rx_mbuf_alloc - rx_mbuf_alloc_before),
+ (free_rx_bd_before - sc->free_rx_bd)));
+#endif
+
+ /* Save the RX chain producer index. */
+ sc->rx_prod = prod;
+ sc->rx_prod_bseq = prod_bseq;
+
+ /* Tell the chip about the waiting rx_bd's. */
+ REG_WR16(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BDIDX, sc->rx_prod);
+ REG_WR(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BSEQ, sc->rx_prod_bseq);
+
+ DBPRINT(sc, BCE_EXCESSIVE_RECV, "Exiting %s()\n", __FUNCTION__);
+
+}
+
+
+/****************************************************************************/
/* Allocate memory and initialize the RX data structures. */
/* */
/* Returns: */
@@ -3762,8 +3848,7 @@
{
struct rx_bd *rxbd;
int i, rc = 0;
- u16 prod, chain_prod;
- u32 prod_bseq, val;
+ u32 val;
DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
@@ -3805,22 +3890,10 @@
val = BCE_ADDR_LO(sc->rx_bd_chain_paddr[0]);
CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_NX_BDHADDR_LO, val);
- /* Allocate mbuf clusters for the rx_bd chain. */
- prod = prod_bseq = 0;
- while (prod < TOTAL_RX_BD) {
- chain_prod = RX_CHAIN_IDX(prod);
- if (bce_get_buf(sc, NULL, &prod, &chain_prod, &prod_bseq)) {
- BCE_PRINTF("%s(%d): Error filling RX chain: rx_bd[0x%04X]!\n",
- __FILE__, __LINE__, chain_prod);
- rc = ENOBUFS;
- break;
- }
- prod = NEXT_RX_BD(prod);
- }
+
+ /* Fill up the RX chain. */
+ bce_fill_rx_chain(sc);
- /* Save the RX chain producer index. */
- sc->rx_prod = prod;
- sc->rx_prod_bseq = prod_bseq;
for (i = 0; i < RX_PAGES; i++) {
bus_dmamap_sync(
@@ -3829,10 +3902,6 @@
BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
}
- /* Tell the chip about the waiting rx_bd's. */
- REG_WR16(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BDIDX, sc->rx_prod);
- REG_WR(sc, MB_RX_CID_ADDR + BCE_L2CTX_HOST_BSEQ, sc->rx_prod_bseq);
-
DBRUN(BCE_VERBOSE_RECV, bce_dump_rx_chain(sc, 0, TOTAL_RX_BD));
DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__);
@@ -3851,9 +3920,16 @@
bce_free_rx_chain(struct bce_softc *sc)
{
int i;
+#ifdef BCE_DEBUG
+ int rx_mbuf_alloc_before;
+#endif
DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__);
+#ifdef BCE_DEBUG
+ rx_mbuf_alloc_before = sc->rx_mbuf_alloc;
+#endif
+
/* Free any mbufs still in the RX mbuf chain. */
for (i = 0; i < TOTAL_RX_BD; i++) {
if (sc->rx_mbuf_ptr[i] != NULL) {
@@ -3866,10 +3942,16 @@
}
}
+ DBRUNIF((rx_mbuf_alloc_before - sc->rx_mbuf_alloc),
+ BCE_PRINTF("%s(): Released %d mbufs.\n",
+ __FUNCTION__, (rx_mbuf_alloc_before - sc->rx_mbuf_alloc)));
+
/* Clear each RX chain page. */
for (i = 0; i < RX_PAGES; i++)
bzero((char *)sc->rx_bd_chain[i], BCE_RX_CHAIN_PAGE_SZ);
+ sc->free_rx_bd = sc->max_rx_bd;
+
/* Check if we lost any mbufs in the process. */
DBRUNIF((sc->rx_mbuf_alloc),
BCE_PRINTF("%s(%d): Memory leak! Lost %d mbufs from rx chain!\n",
@@ -4035,8 +4117,7 @@
DBPRINT(sc, BCE_INFO_RECV, "%s(enter): sw_prod = 0x%04X, "
"sw_cons = 0x%04X, sw_prod_bseq = 0x%08X\n",
- __FUNCTION__, sw_prod, sw_cons,
- sw_prod_bseq);
+ __FUNCTION__, sw_prod, sw_cons, sw_prod_bseq);
/* Prevent speculative reads from getting ahead of the status block. */
bus_space_barrier(sc->bce_btag, sc->bce_bhandle, 0, 0,
@@ -4045,7 +4126,7 @@
/* Update some debug statistics counters */
DBRUNIF((sc->free_rx_bd < sc->rx_low_watermark),
sc->rx_low_watermark = sc->free_rx_bd);
- DBRUNIF((sc->free_rx_bd == 0), sc->rx_empty_count++);
+ DBRUNIF((sc->free_rx_bd == USABLE_RX_BD), sc->rx_empty_count++);
/* Scan through the receive chain as long as there is work to do */
while (sw_cons != hw_cons) {
@@ -4100,7 +4181,7 @@
bus_dmamap_unload(sc->rx_mbuf_tag,
sc->rx_mbuf_map[sw_chain_cons]);
- /* Remove the mbuf from the driver's chain. */
+ /* Remove the mbuf from the RX chain. */
m = sc->rx_mbuf_ptr[sw_chain_cons];
sc->rx_mbuf_ptr[sw_chain_cons] = NULL;
@@ -4138,44 +4219,17 @@
L2_FHDR_ERRORS_PHY_DECODE | L2_FHDR_ERRORS_ALIGNMENT |
L2_FHDR_ERRORS_TOO_SHORT | L2_FHDR_ERRORS_GIANT_FRAME)) {
+ /* Log the error and release the mbuf. */
ifp->if_ierrors++;
DBRUNIF(1, sc->l2fhdr_status_errors++);
+
+ /* Todo: Reuse the mbuf to improve performance. */
- /* Reuse the mbuf for a new frame. */
- if (bce_get_buf(sc, m, &sw_prod, &sw_chain_prod, &sw_prod_bseq)) {
-
- DBRUNIF(1, bce_breakpoint(sc));
- panic("bce%d: Can't reuse RX mbuf!\n", sc->bce_unit);
-
- }
+ m_freem(m);
+ m = NULL;
goto bce_rx_int_next_rx;
}
- /*
- * Get a new mbuf for the rx_bd. If no new
- * mbufs are available then reuse the current mbuf,
- * log an ierror on the interface, and generate
- * an error in the system log.
- */
- if (bce_get_buf(sc, NULL, &sw_prod, &sw_chain_prod, &sw_prod_bseq)) {
-
- DBRUN(BCE_WARN,
- BCE_PRINTF("%s(%d): Failed to allocate "
- "new mbuf, incoming frame dropped!\n",
- __FILE__, __LINE__));
-
- ifp->if_ierrors++;
-
- /* Try and reuse the exisitng mbuf. */
- if (bce_get_buf(sc, m, &sw_prod, &sw_chain_prod, &sw_prod_bseq)) {
-
- DBRUNIF(1, bce_breakpoint(sc));
- panic("bce%d: Double mbuf allocation failure!", sc->bce_unit);
-
- }
- goto bce_rx_int_next_rx;
- }
-
/* Skip over the l2_fhdr when passing the data up the stack. */
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list