PERFORCE change 85991 for review
John Baldwin
jhb at FreeBSD.org
Fri Oct 28 12:41:50 PDT 2005
http://perforce.freebsd.org/chv.cgi?CH=85991
Change 85991 by jhb at jhb_slimer on 2005/10/28 19:40:55
IFC @85989.
Affected files ...
.. //depot/projects/smpng/sys/conf/files#155 integrate
.. //depot/projects/smpng/sys/conf/files.i386#88 integrate
.. //depot/projects/smpng/sys/conf/files.sparc64#52 integrate
.. //depot/projects/smpng/sys/dev/cardbus/cardbus.c#27 integrate
.. //depot/projects/smpng/sys/dev/cardbus/cardbus_cis.c#25 integrate
.. //depot/projects/smpng/sys/dev/cardbus/cardbusreg.h#6 integrate
.. //depot/projects/smpng/sys/dev/cardbus/cardbusvar.h#10 integrate
.. //depot/projects/smpng/sys/dev/en/midway.c#28 integrate
.. //depot/projects/smpng/sys/dev/pci/pci.c#63 integrate
.. //depot/projects/smpng/sys/dev/pci/pcireg.h#11 integrate
.. //depot/projects/smpng/sys/dev/txp/if_txp.c#29 integrate
.. //depot/projects/smpng/sys/dev/txp/if_txpreg.h#5 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_bus_ebus.c#8 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_bus_pccard.c#6 integrate
.. //depot/projects/smpng/sys/dev/uart/uart_core.c#9 integrate
.. //depot/projects/smpng/sys/gnu/fs/ext2fs/ext2_vnops.c#3 integrate
.. //depot/projects/smpng/sys/i386/isa/pcf.c#9 delete
.. //depot/projects/smpng/sys/modules/Makefile#109 integrate
.. //depot/projects/smpng/sys/modules/i2c/controllers/pcf/Makefile#3 integrate
.. //depot/projects/smpng/sys/netgraph/ng_bridge.h#4 integrate
.. //depot/projects/smpng/sys/netgraph/ng_ksocket.h#9 integrate
.. //depot/projects/smpng/sys/netgraph/ng_parse.h#8 integrate
.. //depot/projects/smpng/sys/netgraph/ng_pppoe.h#11 integrate
.. //depot/projects/smpng/sys/netgraph/ng_vlan.h#2 integrate
.. //depot/projects/smpng/sys/pc98/conf/DEFAULTS#1 branch
.. //depot/projects/smpng/sys/pc98/conf/GENERIC#58 integrate
.. //depot/projects/smpng/sys/pci/if_vr.c#41 integrate
.. //depot/projects/smpng/sys/pci/if_vrreg.h#10 integrate
.. //depot/projects/smpng/sys/pci/if_wb.c#36 integrate
.. //depot/projects/smpng/sys/pci/if_wbreg.h#6 integrate
Differences ...
==== //depot/projects/smpng/sys/conf/files#155 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.1060 2005/10/23 00:22:02 njl Exp $
+# $FreeBSD: src/sys/conf/files,v 1.1061 2005/10/28 15:58:17 joerg Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -763,6 +763,7 @@
dev/pccbb/pccbb.c optional cbb
dev/pccbb/pccbb_isa.c optional cbb isa
dev/pccbb/pccbb_pci.c optional cbb pci
+dev/pcf/pcf.c optional pcf
dev/pci/eisa_pci.c optional pci eisa
dev/pci/fixup_pci.c optional pci
dev/pci/ignore_pci.c optional pci
==== //depot/projects/smpng/sys/conf/files.i386#88 (text+ko) ====
@@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
-# $FreeBSD: src/sys/conf/files.i386,v 1.541 2005/09/17 03:36:46 anholt Exp $
+# $FreeBSD: src/sys/conf/files.i386,v 1.542 2005/10/28 15:58:18 joerg Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -199,6 +199,7 @@
dev/mse/mse.c optional mse
dev/mse/mse_isa.c optional mse isa
dev/nve/if_nve.c optional nve pci
+dev/pcf/pcf_isa.c optional pcf
dev/ppc/ppc.c optional ppc
dev/ppc/ppc_puc.c optional ppc puc pci
dev/random/nehemiah.c optional random
@@ -325,7 +326,6 @@
i386/isa/isa_dma.c optional isa
i386/isa/nmi.c standard
i386/isa/npx.c optional npx
-i386/isa/pcf.c optional pcf
i386/isa/pcvt/pcvt_drv.c optional vt
i386/isa/pcvt/pcvt_ext.c optional vt
i386/isa/pcvt/pcvt_kbd.c optional vt
==== //depot/projects/smpng/sys/conf/files.sparc64#52 (text+ko) ====
@@ -1,7 +1,7 @@
# This file tells config what files go into building a kernel,
# files marked standard are always included.
#
-# $FreeBSD: src/sys/conf/files.sparc64,v 1.73 2005/06/12 00:47:21 marcel Exp $
+# $FreeBSD: src/sys/conf/files.sparc64,v 1.74 2005/10/28 15:58:18 joerg Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -46,6 +46,8 @@
dev/ofw/openfirm.c standard
dev/ofw/openfirmio.c standard
dev/ofw/openpromio.c standard
+dev/pcf/envctrl.c optional pcf
+dev/pcf/pcf_ebus.c optional pcf ebus
dev/sound/sbus/cs4231.c optional snd_audiocs ebus
dev/sound/sbus/cs4231.c optional snd_audiocs sbus
dev/syscons/scgfbrndr.c optional sc
==== //depot/projects/smpng/sys/dev/cardbus/cardbus.c#27 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus.c,v 1.53 2005/09/27 13:33:46 ru Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus.c,v 1.54 2005/10/28 06:03:53 imp Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -112,8 +112,8 @@
return;
}
- if (reg == CARDBUS_ROM_REG)
- testval = CARDBUS_ROM_ADDRMASK;
+ if (reg == PCIR_BIOS)
+ testval = PCIM_BIOS_ADDR_MASK;
else
testval = ~0;
@@ -435,50 +435,48 @@
device_t child;
int cardattached = 0;
int bus, slot, func;
+ int cardbusfunchigh = 0;
cardbus_detach_card(cbdev); /* detach existing cards */
POWER_ENABLE_SOCKET(brdev, cbdev);
bus = pcib_get_bus(cbdev);
+ slot = 0;
/* For each function, set it up and try to attach a driver to it */
- for (slot = 0; slot <= CARDBUS_SLOTMAX; slot++) {
- int cardbusfunchigh = 0;
- for (func = 0; func <= cardbusfunchigh; func++) {
- struct cardbus_devinfo *dinfo;
+ for (func = 0; func <= cardbusfunchigh; func++) {
+ struct cardbus_devinfo *dinfo;
- dinfo = (struct cardbus_devinfo *)
- pci_read_device(brdev, bus, slot, func,
- sizeof(struct cardbus_devinfo));
- if (dinfo == NULL)
- continue;
- if (dinfo->pci.cfg.mfdev)
- cardbusfunchigh = CARDBUS_FUNCMAX;
+ dinfo = (struct cardbus_devinfo *)
+ pci_read_device(brdev, bus, slot, func,
+ sizeof(struct cardbus_devinfo));
+ if (dinfo == NULL)
+ continue;
+ if (dinfo->pci.cfg.mfdev)
+ cardbusfunchigh = PCI_FUNCMAX;
- cardbus_device_setup_regs(brdev, bus, slot, func,
- &dinfo->pci.cfg);
- child = device_add_child(cbdev, NULL, -1);
- if (child == NULL) {
- DEVPRINTF((cbdev, "Cannot add child!\n"));
- pci_freecfg((struct pci_devinfo *)dinfo);
- continue;
- }
- dinfo->pci.cfg.dev = child;
- resource_list_init(&dinfo->pci.resources);
- device_set_ivars(child, dinfo);
- if (cardbus_do_cis(cbdev, child) != 0) {
- DEVPRINTF((cbdev, "Can't parse cis\n"));
- pci_freecfg((struct pci_devinfo *)dinfo);
- continue;
- }
- cardbus_pickup_maps(cbdev, child);
- cardbus_alloc_resources(cbdev, child);
- pci_print_verbose(&dinfo->pci);
- if (device_probe_and_attach(child) != 0)
- cardbus_release_all_resources(cbdev, dinfo);
- else
- cardattached++;
+ cardbus_device_setup_regs(brdev, bus, slot, func,
+ &dinfo->pci.cfg);
+ child = device_add_child(cbdev, NULL, -1);
+ if (child == NULL) {
+ DEVPRINTF((cbdev, "Cannot add child!\n"));
+ pci_freecfg((struct pci_devinfo *)dinfo);
+ continue;
+ }
+ dinfo->pci.cfg.dev = child;
+ resource_list_init(&dinfo->pci.resources);
+ device_set_ivars(child, dinfo);
+ if (cardbus_do_cis(cbdev, child) != 0) {
+ DEVPRINTF((cbdev, "Can't parse cis\n"));
+ pci_freecfg((struct pci_devinfo *)dinfo);
+ continue;
}
+ cardbus_pickup_maps(cbdev, child);
+ cardbus_alloc_resources(cbdev, child);
+ pci_print_verbose(&dinfo->pci);
+ if (device_probe_and_attach(child) != 0)
+ cardbus_release_all_resources(cbdev, dinfo);
+ else
+ cardattached++;
}
-
if (cardattached > 0)
return (0);
POWER_DISABLE_SOCKET(brdev, cbdev);
==== //depot/projects/smpng/sys/dev/cardbus/cardbus_cis.c#25 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus_cis.c,v 1.50 2005/02/20 20:36:16 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cardbus/cardbus_cis.c,v 1.52 2005/10/28 05:55:52 imp Exp $");
/*
* CIS Handling for the Cardbus Bus
@@ -325,7 +325,7 @@
}
/* Convert from BAR type to BAR offset */
- bar = CARDBUS_BASE0_REG + (bar - 1) * 4;
+ bar = PCIR_BAR(bar - 1);
if (type == SYS_RES_MEMORY) {
if (reg & TPL_BAR_REG_PREFETCHABLE)
@@ -491,32 +491,27 @@
uint32_t testval;
uint32_t size;
struct resource *res;
+ uint32_t space;
- switch (CARDBUS_CIS_SPACE(*start)) {
- case CARDBUS_CIS_ASI_TUPLE:
+ space = *start & PCIM_CIS_ASI_MASK;
+ switch (space) {
+ case PCIM_CIS_ASI_TUPLE:
/* CIS in PCI config space need no initialization */
return ((struct resource*)~0UL);
- case CARDBUS_CIS_ASI_BAR0:
- case CARDBUS_CIS_ASI_BAR1:
- case CARDBUS_CIS_ASI_BAR2:
- case CARDBUS_CIS_ASI_BAR3:
- case CARDBUS_CIS_ASI_BAR4:
- case CARDBUS_CIS_ASI_BAR5:
- *rid = CARDBUS_BASE0_REG + (CARDBUS_CIS_SPACE(*start) - 1) * 4;
+ case PCIM_CIS_ASI_BAR0:
+ case PCIM_CIS_ASI_BAR1:
+ case PCIM_CIS_ASI_BAR2:
+ case PCIM_CIS_ASI_BAR3:
+ case PCIM_CIS_ASI_BAR4:
+ case PCIM_CIS_ASI_BAR5:
+ *rid = PCIR_BAR(space - PCIM_CIS_ASI_BAR0);
break;
- case CARDBUS_CIS_ASI_ROM:
- *rid = CARDBUS_ROM_REG;
-#if 0
- /*
- * This mask doesn't contain the bit that actually enables
- * the Option ROM.
- */
- pci_write_config(child, *rid, CARDBUS_ROM_ADDRMASK, 4);
-#endif
+ case PCIM_CIS_ASI_ROM:
+ *rid = PCIR_BIOS;
break;
default:
device_printf(cbdev, "Unable to read CIS: Unknown space: %d\n",
- CARDBUS_CIS_SPACE(*start));
+ space);
return (NULL);
}
@@ -528,7 +523,7 @@
* This bit has a different meaning depending if we are dealing
* with a normal BAR or an Option ROM BAR.
*/
- if (((testval & 0x1) == 0x1) && (*rid != CARDBUS_ROM_REG)) {
+ if (((testval & 0x1) == 0x1) && (*rid != PCIR_BIOS)) {
device_printf(cbdev, "CIS Space is IO, expecting memory.\n");
return (NULL);
}
@@ -546,13 +541,12 @@
return (NULL);
}
pci_write_config(child, *rid,
- rman_get_start(res) | ((*rid == CARDBUS_ROM_REG)?
- CARDBUS_ROM_ENABLE : 0),
+ rman_get_start(res) | ((*rid == PCIR_BIOS) ? PCIM_BIOS_ENABLE : 0),
4);
PCI_ENABLE_IO(cbdev, child, SYS_RES_MEMORY);
/* Flip to the right ROM image if CIS is in ROM */
- if (CARDBUS_CIS_SPACE(*start) == CARDBUS_CIS_ASI_ROM) {
+ if (space == PCIM_CIS_ASI_ROM) {
bus_space_tag_t bt;
bus_space_handle_t bh;
uint32_t imagesize;
@@ -565,7 +559,7 @@
bt = rman_get_bustag(res);
bh = rman_get_bushandle(res);
- imagenum = CARDBUS_CIS_ASI_ROM_IMAGE(*start);
+ imagenum = (*start & PCIM_CIS_ROM_MASK) >> 28;
for (romnum = 0;; romnum++) {
romsig = bus_space_read_2(bt, bh,
imagebase + CARDBUS_EXROM_SIGNATURE);
@@ -617,9 +611,9 @@
}
imagebase += imagesize;
}
- *start = imagebase + CARDBUS_CIS_ADDR(*start);
+ *start = imagebase + (*start & PCIM_CIS_ADDR_MASK);
} else {
- *start = CARDBUS_CIS_ADDR(*start);
+ *start = *start & PCIM_CIS_ADDR_MASK;
}
return (res);
@@ -658,7 +652,7 @@
bzero(tupledata, MAXTUPLESIZE);
expect_linktarget = TRUE;
- if ((start = pci_read_config(child, CARDBUS_CIS_REG, 4)) == 0) {
+ if ((start = pci_read_config(child, PCIR_CIS, 4)) == 0) {
device_printf(cbdev, "CIS pointer is 0!\n");
return (ENXIO);
}
==== //depot/projects/smpng/sys/dev/cardbus/cardbusreg.h#6 (text+ko) ====
@@ -23,40 +23,13 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/cardbus/cardbusreg.h,v 1.8 2005/01/13 19:12:10 imp Exp $
+ * $FreeBSD: src/sys/dev/cardbus/cardbusreg.h,v 1.11 2005/10/28 06:03:53 imp Exp $
*/
/*
* Register definitions for the Cardbus Bus
*/
-
-/* Cardbus bus constants */
-#define CARDBUS_SLOTMAX 0
-#define CARDBUS_FUNCMAX 7
-
-/* Cardbus configuration header registers */
-#define CARDBUS_BASE0_REG 0x10
-#define CARDBUS_BASE1_REG 0x14
-#define CARDBUS_BASE2_REG 0x18
-#define CARDBUS_BASE3_REG 0x1C
-#define CARDBUS_BASE4_REG 0x20
-#define CARDBUS_BASE5_REG 0x24
-#define CARDBUS_CIS_REG 0x28
-# define CARDBUS_CIS_ASIMASK 0x07
-# define CARDBUS_CIS_ADDRMASK 0x0ffffff8
-# define CARDBUS_CIS_ASI_TUPLE 0x00
-# define CARDBUS_CIS_ASI_BAR0 0x01
-# define CARDBUS_CIS_ASI_BAR1 0x02
-# define CARDBUS_CIS_ASI_BAR2 0x03
-# define CARDBUS_CIS_ASI_BAR3 0x04
-# define CARDBUS_CIS_ASI_BAR4 0x05
-# define CARDBUS_CIS_ASI_BAR5 0x06
-# define CARDBUS_CIS_ASI_ROM 0x07
-#define CARDBUS_ROM_REG 0x30
-# define CARDBUS_ROM_ENABLE 0x00000001
-# define CARDBUS_ROM_ADDRMASK 0xfffff800
-
/* EXROM offsets for reading CIS */
#define CARDBUS_EXROM_SIGNATURE 0x00
#define CARDBUS_EXROM_DATA_PTR 0x18
@@ -72,16 +45,6 @@
#define CARDBUS_EXROM_DATA_CODE_TYPE 0x14 /* Code Type */
#define CARDBUS_EXROM_DATA_INDICATOR 0x15 /* Indicator */
-/* useful macros */
-#define CARDBUS_CIS_ADDR(x) \
- (CARDBUS_CIS_ADDRMASK & (x))
-#define CARDBUS_CIS_SPACE(x) \
- (CARDBUS_CIS_ASIMASK & (x))
-#define CARDBUS_CIS_ASI_BAR(x) \
- (((CARDBUS_CIS_ASIMASK & (x))-1)*4+0x10)
-#define CARDBUS_CIS_ASI_ROM_IMAGE(x) \
- (((x) >> 28) & 0xf)
-
#define CARDBUS_MAPREG_MEM_ADDR_MASK 0x0ffffff0
#define CARDBUS_MAPREG_MEM_ADDR(mr) \
((mr) & CARDBUS_MAPREG_MEM_ADDR_MASK)
==== //depot/projects/smpng/sys/dev/cardbus/cardbusvar.h#10 (text+ko) ====
@@ -23,18 +23,19 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/cardbus/cardbusvar.h,v 1.11 2005/02/06 21:03:13 imp Exp $
+ * $FreeBSD: src/sys/dev/cardbus/cardbusvar.h,v 1.12 2005/10/28 05:29:41 imp Exp $
*/
/*
* Structure definitions for the Cardbus Bus driver
*/
-struct cardbus_devinfo {
+struct cardbus_devinfo
+{
struct pci_devinfo pci;
uint8_t mprefetchable; /* bit mask of prefetchable BARs */
uint8_t mbelow1mb; /* bit mask of BARs which require below 1Mb */
uint8_t ibelow1mb; /* bit mask of BARs which require below 1Mb */
-#define BARBIT(RID) (1<<(((RID)-CARDBUS_BASE0_REG)/4))
+#define BARBIT(RID) (1<<(((RID)-PCIR_BARS)/4))
uint16_t mfrid; /* manufacturer id */
uint16_t prodid; /* product id */
u_int funcid; /* function id */
==== //depot/projects/smpng/sys/dev/en/midway.c#28 (text+ko) ====
@@ -32,7 +32,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/en/midway.c,v 1.66 2005/08/09 10:19:46 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/en/midway.c,v 1.67 2005/10/27 21:08:12 jhb Exp $");
/*
*
@@ -1869,7 +1869,9 @@
#ifdef ENABLE_BPF
BPF_MTAP(sc->ifp, m);
#endif
+ EN_UNLOCK(sc);
atm_input(sc->ifp, &ah, m, vc->rxhand);
+ EN_LOCK(sc);
}
}
==== //depot/projects/smpng/sys/dev/pci/pci.c#63 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.300 2005/10/25 06:53:45 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.301 2005/10/28 05:56:50 imp Exp $");
#include "opt_bus.h"
@@ -913,8 +913,7 @@
if (progif & PCIP_STORAGE_IDE_MODEPRIM) {
pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(0), rl);
pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(1), rl);
- }
- else {
+ } else {
rid = PCIR_BAR(0);
resource_list_add(rl, type, rid, 0x1f0, 0x1f7, 8);
resource_list_alloc(rl, bus, dev, type, &rid, 0x1f0, 0x1f7,8,0);
@@ -925,8 +924,7 @@
if (progif & PCIP_STORAGE_IDE_MODESEC) {
pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(2), rl);
pci_add_map(pcib, bus, dev, b, s, f, PCIR_BAR(3), rl);
- }
- else {
+ } else {
rid = PCIR_BAR(2);
resource_list_add(rl, type, rid, 0x170, 0x177, 8);
resource_list_alloc(rl, bus, dev, type, &rid, 0x170, 0x177,8,0);
==== //depot/projects/smpng/sys/dev/pci/pcireg.h#11 (text+ko) ====
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/pci/pcireg.h,v 1.45 2005/06/05 23:08:59 imp Exp $
+ * $FreeBSD: src/sys/dev/pci/pcireg.h,v 1.47 2005/10/28 06:02:51 imp Exp $
*
*/
@@ -111,11 +111,23 @@
#define PCIR_BARS 0x10
#define PCIR_BAR(x) (PCIR_BARS + (x) * 4)
-#define PCIR_CARDBUSCIS 0x28
+#define PCIR_CIS 0x28
+#define PCIM_CIS_ASI_MASK 0x7
+#define PCIM_CIS_ASI_TUPLE 0
+#define PCIM_CIS_ASI_BAR0 1
+#define PCIM_CIS_ASI_BAR1 2
+#define PCIM_CIS_ASI_BAR2 3
+#define PCIM_CIS_ASI_BAR3 4
+#define PCIM_CIS_ASI_BAR4 5
+#define PCIM_CIS_ASI_BAR5 6
+#define PCIM_CIS_ASI_ROM 7
+#define PCIM_CIS_ADDR_MASK 0x0ffffff8
+#define PCIM_CIS_ROM_MASK 0xf0000000
#define PCIR_SUBVEND_0 0x2c
#define PCIR_SUBDEV_0 0x2e
#define PCIR_BIOS 0x30
#define PCIM_BIOS_ENABLE 0x01
+#define PCIM_BIOS_ADDR_MASK 0xfffff800
#define PCIR_CAP_PTR 0x34
#define PCIR_INTLINE 0x3c
#define PCIR_INTPIN 0x3d
==== //depot/projects/smpng/sys/dev/txp/if_txp.c#29 (text+ko) ====
@@ -35,14 +35,14 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/txp/if_txp.c,v 1.36 2005/09/19 03:10:20 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/txp/if_txp.c,v 1.37 2005/10/27 21:16:17 jhb Exp $");
/*
* Driver for 3c990 (Typhoon) Ethernet ASIC
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/txp/if_txp.c,v 1.36 2005/09/19 03:10:20 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/txp/if_txp.c,v 1.37 2005/10/27 21:16:17 jhb Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -92,7 +92,7 @@
#ifndef lint
static const char rcsid[] =
- "$FreeBSD: src/sys/dev/txp/if_txp.c,v 1.36 2005/09/19 03:10:20 imp Exp $";
+ "$FreeBSD: src/sys/dev/txp/if_txp.c,v 1.37 2005/10/27 21:16:17 jhb Exp $";
#endif
/*
@@ -122,8 +122,10 @@
static int txp_shutdown(device_t);
static int txp_ioctl(struct ifnet *, u_long, caddr_t);
static void txp_start(struct ifnet *);
+static void txp_start_locked(struct ifnet *);
static void txp_stop(struct txp_softc *);
static void txp_init(void *);
+static void txp_init_locked(struct txp_softc *);
static void txp_watchdog(struct ifnet *);
static void txp_release_resources(struct txp_softc *);
@@ -216,16 +218,17 @@
struct ifnet *ifp;
u_int16_t p1;
u_int32_t p2;
- int unit, error = 0, rid;
+ int error = 0, rid;
u_char eaddr[6];
sc = device_get_softc(dev);
- unit = device_get_unit(dev);
sc->sc_dev = dev;
sc->sc_cold = 1;
mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
- MTX_DEF | MTX_RECURSE);
+ MTX_DEF);
+ callout_init_mtx(&sc->sc_tick, &sc->sc_mtx, 0);
+
/*
* Map control/status registers.
*/
@@ -324,8 +327,7 @@
ifp->if_softc = sc;
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
ifp->if_mtu = ETHERMTU;
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST |
- IFF_NEEDSGIANT;
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_ioctl = txp_ioctl;
ifp->if_start = txp_start;
ifp->if_watchdog = txp_watchdog;
@@ -339,9 +341,8 @@
* Attach us everywhere
*/
ether_ifattach(ifp, eaddr);
- callout_handle_init(&sc->sc_tick);
- error = bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET,
+ error = bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_NET | INTR_MPSAFE,
txp_intr, sc, &sc->sc_intrhand);
if (error) {
@@ -369,8 +370,11 @@
sc = device_get_softc(dev);
ifp = sc->sc_ifp;
+ TXP_LOCK(sc);
txp_stop(sc);
+ TXP_UNLOCK(sc);
txp_shutdown(dev);
+ callout_drain(&sc->sc_tick);
ifmedia_removeall(&sc->sc_ifmedia);
ether_ifdetach(ifp);
@@ -657,6 +661,7 @@
u_int32_t isr;
/* mask all interrupts */
+ TXP_LOCK(sc);
WRITE_REG(sc, TXP_IMR, TXP_INT_RESERVED | TXP_INT_SELF |
TXP_INT_A2H_7 | TXP_INT_A2H_6 | TXP_INT_A2H_5 | TXP_INT_A2H_4 |
TXP_INT_A2H_2 | TXP_INT_A2H_1 | TXP_INT_A2H_0 |
@@ -689,7 +694,8 @@
/* unmask all interrupts */
WRITE_REG(sc, TXP_IMR, TXP_INT_A2H_3);
- txp_start(sc->sc_ifp);
+ txp_start_locked(sc->sc_ifp);
+ TXP_UNLOCK(sc);
return;
}
@@ -705,6 +711,7 @@
struct txp_swdesc *sd = NULL;
u_int32_t roff, woff;
+ TXP_LOCK_ASSERT(sc);
roff = *r->r_roff;
woff = *r->r_woff;
rxd = r->r_desc + (roff / sizeof(struct txp_rx_desc));
@@ -736,24 +743,13 @@
*/
struct mbuf *mnew;
- MGETHDR(mnew, M_DONTWAIT, MT_DATA);
+ mnew = m_devget(mtod(m, caddr_t), rxd->rx_len,
+ ETHER_ALIGN, ifp, NULL);
+ m_freem(m);
if (mnew == NULL) {
- m_freem(m);
+ ifp->if_ierrors++;
goto next;
}
- if (m->m_len > (MHLEN - 2)) {
- MCLGET(mnew, M_DONTWAIT);
- if (!(mnew->m_flags & M_EXT)) {
- m_freem(mnew);
- m_freem(m);
- goto next;
- }
- }
- mnew->m_pkthdr.rcvif = ifp;
- m_adj(mnew, 2);
- mnew->m_pkthdr.len = mnew->m_len = m->m_len;
- m_copydata(m, 0, m->m_pkthdr.len, mtod(mnew, caddr_t));
- m_freem(m);
m = mnew;
}
#endif
@@ -776,7 +772,9 @@
m, htons(rxd->rx_vlan >> 16), goto next);
}
+ TXP_UNLOCK(sc);
(*ifp->if_input)(ifp, m);
+ TXP_LOCK(sc);
next:
@@ -804,6 +802,7 @@
struct txp_swdesc *sd;
u_int32_t i;
+ TXP_LOCK_ASSERT(sc);
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
return;
@@ -815,13 +814,9 @@
if (sd->sd_mbuf != NULL)
break;
- MGETHDR(sd->sd_mbuf, M_DONTWAIT, MT_DATA);
+ sd->sd_mbuf = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
if (sd->sd_mbuf == NULL)
- goto err_sd;
-
- MCLGET(sd->sd_mbuf, M_DONTWAIT);
- if ((sd->sd_mbuf->m_flags & M_EXT) == 0)
- goto err_mbuf;
+ return;
sd->sd_mbuf->m_pkthdr.rcvif = ifp;
sd->sd_mbuf->m_pkthdr.len = sd->sd_mbuf->m_len = MCLBYTES;
@@ -841,11 +836,6 @@
sc->sc_rxbufprod = i;
return;
-
-err_mbuf:
- m_freem(sd->sd_mbuf);
-err_sd:
- free(sd, M_DEVBUF);
}
/*
@@ -863,6 +853,7 @@
struct txp_swdesc *sd = sc->sc_txd + cons;
struct mbuf *m;
+ TXP_LOCK_ASSERT(sc);
while (cons != idx) {
if (cnt == 0)
break;
@@ -905,6 +896,8 @@
sc = device_get_softc(dev);
+ TXP_LOCK(sc);
+
/* mask all interrupts */
WRITE_REG(sc, TXP_IMR,
TXP_INT_SELF | TXP_INT_PCI_TABORT | TXP_INT_PCI_MABORT |
@@ -914,6 +907,7 @@
txp_command(sc, TXP_CMD_TX_DISABLE, 0, 0, 0, NULL, NULL, NULL, 0);
txp_command(sc, TXP_CMD_RX_DISABLE, 0, 0, 0, NULL, NULL, NULL, 0);
txp_command(sc, TXP_CMD_HALT, 0, 0, 0, NULL, NULL, NULL, 0);
+ TXP_UNLOCK(sc);
return(0);
}
@@ -1062,18 +1056,18 @@
{
struct txp_softc *sc = ifp->if_softc;
struct ifreq *ifr = (struct ifreq *)data;
- int s, error = 0;
+ int error = 0;
- s = splnet();
-
switch(command) {
case SIOCSIFFLAGS:
+ TXP_LOCK(sc);
if (ifp->if_flags & IFF_UP) {
- txp_init(sc);
+ txp_init_locked(sc);
} else {
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
txp_stop(sc);
}
+ TXP_UNLOCK(sc);
break;
case SIOCADDMULTI:
case SIOCDELMULTI:
@@ -1081,7 +1075,9 @@
* Multicast list has changed; set the hardware
* filter accordingly.
*/
+ TXP_LOCK(sc);
txp_set_filter(sc);
+ TXP_UNLOCK(sc);
error = 0;
break;
case SIOCGIFMEDIA:
@@ -1093,8 +1089,6 @@
break;
}
- (void)splx(s);
-
return(error);
}
@@ -1106,19 +1100,15 @@
struct ifnet *ifp;
struct txp_swdesc *sd;
+ TXP_LOCK_ASSERT(sc);
ifp = sc->sc_ifp;
for (i = 0; i < RXBUF_ENTRIES; i++) {
sd = sc->sc_rxbufs[i].rb_sd;
- MGETHDR(sd->sd_mbuf, M_DONTWAIT, MT_DATA);
+ sd->sd_mbuf = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
if (sd->sd_mbuf == NULL)
return(ENOBUFS);
- MCLGET(sd->sd_mbuf, M_DONTWAIT);
- if ((sd->sd_mbuf->m_flags & M_EXT) == 0) {
- m_freem(sd->sd_mbuf);
- return(ENOBUFS);
- }
sd->sd_mbuf->m_pkthdr.len = sd->sd_mbuf->m_len = MCLBYTES;
sd->sd_mbuf->m_pkthdr.rcvif = ifp;
@@ -1140,6 +1130,7 @@
int i;
struct txp_swdesc *sd;
+ TXP_LOCK_ASSERT(sc);
if (sc->sc_rxbufs == NULL)
return;
@@ -1163,12 +1154,22 @@
void *xsc;
{
struct txp_softc *sc;
+
+ sc = xsc;
+ TXP_LOCK(sc);
+ txp_init_locked(sc);
+ TXP_UNLOCK(sc);
+}
+
+static void
+txp_init_locked(sc)
+ struct txp_softc *sc;
+{
struct ifnet *ifp;
u_int16_t p1;
u_int32_t p2;
- int s;
- sc = xsc;
+ TXP_LOCK_ASSERT(sc);
ifp = sc->sc_ifp;
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
@@ -1176,8 +1177,6 @@
txp_stop(sc);
- s = splnet();
-
txp_command(sc, TXP_CMD_MAX_PKT_SIZE_WRITE, TXP_MAX_PKTLEN, 0, 0,
NULL, NULL, NULL, 1);
@@ -1209,9 +1208,7 @@
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
ifp->if_timer = 0;
- sc->sc_tick = timeout(txp_tick, sc, hz);
-
- splx(s);
+ callout_reset(&sc->sc_tick, hz, txp_tick, sc);
}
static void
@@ -1222,9 +1219,8 @@
struct ifnet *ifp = sc->sc_ifp;
struct txp_rsp_desc *rsp = NULL;
struct txp_ext_desc *ext;
- int s;
- s = splnet();
+ TXP_LOCK_ASSERT(sc);
txp_rxbuf_reclaim(sc);
if (txp_command2(sc, TXP_CMD_READ_STATISTICS, 0, 0, 0, NULL, 0,
@@ -1250,8 +1246,7 @@
if (rsp != NULL)
free(rsp, M_DEVBUF);
- splx(s);
- sc->sc_tick = timeout(txp_tick, sc, hz);
+ callout_reset(&sc->sc_tick, hz, txp_tick, sc);
return;
}
@@ -1260,6 +1255,18 @@
txp_start(ifp)
struct ifnet *ifp;
{
+ struct txp_softc *sc;
+
+ sc = ifp->if_softc;
+ TXP_LOCK(sc);
+ txp_start_locked(ifp);
+ TXP_UNLOCK(sc);
+}
+
+static void
+txp_start_locked(ifp)
+ struct ifnet *ifp;
+{
struct txp_softc *sc = ifp->if_softc;
struct txp_tx_ring *r = &sc->sc_txhir;
struct txp_tx_desc *txd;
@@ -1269,6 +1276,7 @@
u_int32_t firstprod, firstcnt, prod, cnt;
struct m_tag *mtag;
+ TXP_LOCK_ASSERT(sc);
if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
IFF_DRV_RUNNING)
return;
@@ -1572,11 +1580,12 @@
{
struct ifnet *ifp;
+ TXP_LOCK_ASSERT(sc);
ifp = sc->sc_ifp;
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
- untimeout(txp_tick, sc, sc->sc_tick);
+ callout_stop(&sc->sc_tick);
txp_command(sc, TXP_CMD_TX_DISABLE, 0, 0, 0, NULL, NULL, NULL, 1);
txp_command(sc, TXP_CMD_RX_DISABLE, 0, 0, 0, NULL, NULL, NULL, 1);
@@ -1601,8 +1610,11 @@
struct ifmedia *ifm = &sc->sc_ifmedia;
u_int16_t new_xcvr;
- if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
+ TXP_LOCK(sc);
+ if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) {
+ TXP_UNLOCK(sc);
return (EINVAL);
+ }
if (IFM_SUBTYPE(ifm->ifm_media) == IFM_10_T) {
if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
@@ -1616,16 +1628,21 @@
new_xcvr = TXP_XCVR_100_HDX;
} else if (IFM_SUBTYPE(ifm->ifm_media) == IFM_AUTO) {
new_xcvr = TXP_XCVR_AUTO;
- } else
+ } else {
+ TXP_UNLOCK(sc);
return (EINVAL);
+ }
/* nothing to do */
- if (sc->sc_xcvr == new_xcvr)
+ if (sc->sc_xcvr == new_xcvr) {
+ TXP_UNLOCK(sc);
return (0);
+ }
txp_command(sc, TXP_CMD_XCVR_SELECT, new_xcvr, 0, 0,
NULL, NULL, NULL, 0);
sc->sc_xcvr = new_xcvr;
+ TXP_UNLOCK(sc);
return (0);
}
@@ -1642,6 +1659,7 @@
ifmr->ifm_status = IFM_AVALID;
ifmr->ifm_active = IFM_ETHER;
+ TXP_LOCK(sc);
if (txp_command(sc, TXP_CMD_PHY_MGMT_READ, 0, MII_BMSR, 0,
&bmsr, NULL, NULL, 1))
goto bail;
@@ -1656,6 +1674,7 @@
if (txp_command(sc, TXP_CMD_PHY_MGMT_READ, 0, MII_ANLPAR, 0,
&anlpar, NULL, NULL, 1))
goto bail;
+ TXP_UNLOCK(sc);
if (bmsr & BMSR_LINK)
ifmr->ifm_status |= IFM_ACTIVE;
@@ -1692,6 +1711,7 @@
return;
bail:
+ TXP_UNLOCK(sc);
ifmr->ifm_active |= IFM_NONE;
ifmr->ifm_status &= ~IFM_AVALID;
}
==== //depot/projects/smpng/sys/dev/txp/if_txpreg.h#5 (text+ko) ====
@@ -1,5 +1,5 @@
/* $OpenBSD: if_txpreg.h,v 1.30 2001/06/23 04:18:02 jason Exp $ */
-/* $FreeBSD: src/sys/dev/txp/if_txpreg.h,v 1.5 2005/10/03 15:47:15 jhb Exp $ */
+/* $FreeBSD: src/sys/dev/txp/if_txpreg.h,v 1.6 2005/10/27 21:16:17 jhb Exp $ */
/*-
* Copyright (c) 2001 Aaron Campbell <aaron at monkey.org>.
@@ -606,7 +606,7 @@
struct txp_cmd_ring sc_cmdring;
struct txp_rsp_ring sc_rspring;
struct txp_swdesc sc_txd[TX_ENTRIES];
- struct callout_handle sc_tick;
+ struct callout sc_tick;
struct ifmedia sc_ifmedia;
struct txp_tx_ring sc_txhir, sc_txlor;
struct txp_rxbuf_desc *sc_rxbufs;
@@ -639,6 +639,10 @@
#define READ_REG(sc,reg) \
bus_space_read_4((sc)->sc_bt, (sc)->sc_bh, reg)
+#define TXP_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
+#define TXP_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
+#define TXP_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
+
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list