PERFORCE change 60885 for review
Julian Elischer
julian at FreeBSD.org
Thu Sep 2 14:11:43 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=60885
Change 60885 by julian at julian_ref on 2004/09/02 21:11:11
IFC @60880
Affected files ...
.. //depot/projects/nsched/sys/alpha/include/param.h#5 integrate
.. //depot/projects/nsched/sys/amd64/include/param.h#5 integrate
.. //depot/projects/nsched/sys/conf/NOTES#15 integrate
.. //depot/projects/nsched/sys/conf/files#22 integrate
.. //depot/projects/nsched/sys/conf/options#16 integrate
.. //depot/projects/nsched/sys/dev/acpica/Osd/OsdDebug.c#4 integrate
.. //depot/projects/nsched/sys/dev/acpica/acpi_pci_link.c#7 integrate
.. //depot/projects/nsched/sys/dev/ata/ata-chipset.c#10 integrate
.. //depot/projects/nsched/sys/dev/ata/ata-disk.c#7 integrate
.. //depot/projects/nsched/sys/dev/em/if_em.c#6 integrate
.. //depot/projects/nsched/sys/dev/em/if_em.h#3 integrate
.. //depot/projects/nsched/sys/dev/em/if_em_hw.c#2 integrate
.. //depot/projects/nsched/sys/dev/em/if_em_hw.h#2 integrate
.. //depot/projects/nsched/sys/dev/tga/tga_pci.c#4 integrate
.. //depot/projects/nsched/sys/fs/autofs/autofs_util.c#2 integrate
.. //depot/projects/nsched/sys/fs/autofs/autofs_vfsops.c#2 integrate
.. //depot/projects/nsched/sys/fs/autofs/autofs_vnops.c#2 integrate
.. //depot/projects/nsched/sys/fs/pseudofs/pseudofs_vnops.c#4 integrate
.. //depot/projects/nsched/sys/i386/i386/pmap.c#17 integrate
.. //depot/projects/nsched/sys/i386/include/param.h#6 integrate
.. //depot/projects/nsched/sys/ia64/conf/GENERIC#7 integrate
.. //depot/projects/nsched/sys/kern/kern_mutex.c#6 integrate
.. //depot/projects/nsched/sys/kern/kern_shutdown.c#9 integrate
.. //depot/projects/nsched/sys/kern/kern_switch.c#8 integrate
.. //depot/projects/nsched/sys/kern/sched_ule.c#22 integrate
.. //depot/projects/nsched/sys/kern/subr_smp.c#7 integrate
.. //depot/projects/nsched/sys/modules/Makefile#10 integrate
.. //depot/projects/nsched/sys/net/if.c#10 integrate
.. //depot/projects/nsched/sys/net/if.h#7 integrate
.. //depot/projects/nsched/sys/netgraph/ng_ksocket.c#7 integrate
.. //depot/projects/nsched/sys/netinet6/raw_ip6.c#4 integrate
.. //depot/projects/nsched/sys/netkey/key.c#3 integrate
.. //depot/projects/nsched/sys/pc98/conf/NOTES#9 integrate
.. //depot/projects/nsched/sys/vm/vm_fault.c#5 integrate
.. //depot/projects/nsched/sys/vm/vm_mmap.c#6 integrate
.. //depot/projects/nsched/sys/vm/vm_zeroidle.c#5 integrate
Differences ...
==== //depot/projects/nsched/sys/alpha/include/param.h#5 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/alpha/include/param.h,v 1.35 2004/08/01 14:31:45 scottl Exp $ */
+/* $FreeBSD: src/sys/alpha/include/param.h,v 1.36 2004/09/02 18:59:14 scottl Exp $ */
/* From: NetBSD: param.h,v 1.20 1997/09/19 13:52:53 leo Exp */
/*
@@ -113,11 +113,6 @@
#define SSIZE 1 /* initial stack size/NBPG */
#define SINCR 1 /* increment of stack/NBPG */
-/* PREEMPTION exposes scheduler bugs that need to be fixed. */
-#if 0
-#define PREEMPTION
-#endif
-
#ifndef KSTACK_PAGES
#define KSTACK_PAGES 2 /* pages of kstack (with pcb) */
#endif
==== //depot/projects/nsched/sys/amd64/include/param.h#5 (text+ko) ====
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)param.h 8.1 (Berkeley) 6/10/93
- * $FreeBSD: src/sys/amd64/include/param.h,v 1.13 2004/08/01 14:31:45 scottl Exp $
+ * $FreeBSD: src/sys/amd64/include/param.h,v 1.14 2004/09/02 18:59:14 scottl Exp $
*/
/*
@@ -119,11 +119,6 @@
#define NBPML4 (1ul<<PML4SHIFT)/* bytes/page map lev4 table */
#define PML4MASK (NBPML4-1)
-/* PREEMPTION exposes scheduler bugs that need to be fixed. */
-#if 0
-#define PREEMPTION
-#endif
-
#define IOPAGES 2 /* pages of i/o permission bitmap */
#ifndef KSTACK_PAGES
==== //depot/projects/nsched/sys/conf/NOTES#15 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1271 2004/09/01 01:19:51 brooks Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1273 2004/09/02 20:44:56 alfred Exp $
#
# NOTES -- Lines that can be cut/pasted into kernel and hints configs.
#
@@ -196,12 +196,16 @@
# SMP Debugging Options:
#
+# PREEMPTION allows the threads that are in the kernel to be preempted
+# by higher priority threads. It helps with interactivity and
+# allows interrupt threads to run sooner rather than waiting.
+# WARNING! Only tested on alpha, amd64, and i386.
# FULL_PREEMPTION instructs the kernel to preempt non-realtime kernel
# threads. It sole use is to expose race conditions and other
# bugs during development. Enabling this option will reduce
# performance and increase the frequency of kernel panics by
# design. If you aren't sure that you need it then you don't.
-# DON'T TURN THIS ON.
+# Relies on the PREEMPTION option. DON'T TURN THIS ON.
# MUTEX_DEBUG enables various extra assertions in the mutex code.
# SLEEPQUEUE_PROFILING enables rudimentary profiling of the hash table
# used to hold active sleep queues.
@@ -213,6 +217,7 @@
# a lock hierarchy violation occurs or if locks are held when going to
# sleep.
# WITNESS_SKIPSPIN disables the witness checks on spin mutexes.
+options PREEMPTION
options FULL_PREEMPTION
options MUTEX_DEBUG
options WITNESS
@@ -739,6 +744,7 @@
options NFSCLIENT #Network File System client
# The rest are optional:
+options AUTOFS #Auto File System
options CD9660 #ISO 9660 filesystem
options FDESCFS #File descriptor filesystem
options HPFS #OS/2 File system
==== //depot/projects/nsched/sys/conf/files#22 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.948 2004/08/30 23:03:56 peter Exp $
+# $FreeBSD: src/sys/conf/files,v 1.949 2004/09/02 20:44:56 alfred Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -858,6 +858,9 @@
dev/zs/zs.c optional zs
dev/zs/zs_sbus.c optional zs fhc
dev/zs/zs_sbus.c optional zs sbus
+fs/autofs/autofs_vnops.c optional autofs
+fs/autofs/autofs_vfsops.c optional autofs
+fs/autofs/autofs_util.c optional autofs
fs/deadfs/dead_vnops.c standard
fs/devfs/devfs_devs.c standard
fs/devfs/devfs_rule.c standard
==== //depot/projects/nsched/sys/conf/options#16 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.481 2004/09/01 01:19:52 brooks Exp $
+# $FreeBSD: src/sys/conf/options,v 1.483 2004/09/02 20:44:56 alfred Exp $
#
# On the handling of kernel options
#
@@ -66,7 +66,8 @@
CONSPEED opt_comconsole.h
CY_PCI_FASTINTR
DIRECTIO opt_directio.h
-FULL_PREEMPTION
+FULL_PREEMPTION opt_sched.h
+PREEMPTION opt_sched.h
GEOM_AES opt_geom.h
GEOM_APPLE opt_geom.h
GEOM_BDE opt_geom.h
@@ -160,6 +161,7 @@
# time, since the corresponding lkms cannot work if there are any static
# dependencies. Unusability is enforced by hiding the defines for the
# options in a never-included header.
+AUTOFS opt_dontuse.h
CD9660 opt_dontuse.h
CODA opt_dontuse.h
EXT2FS opt_dontuse.h
==== //depot/projects/nsched/sys/dev/acpica/Osd/OsdDebug.c#4 (text+ko) ====
@@ -24,7 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/acpica/Osd/OsdDebug.c,v 1.8 2004/07/10 20:56:43 marcel Exp $
+ * $FreeBSD: src/sys/dev/acpica/Osd/OsdDebug.c,v 1.9 2004/09/02 04:28:05 njl Exp $
*/
/*
@@ -73,8 +73,7 @@
AcpiOsSignal(UINT32 Function, void *Info)
{
ACPI_SIGNAL_FATAL_INFO *fatal;
- char *message;
-
+
switch (Function) {
case ACPI_SIGNAL_FATAL:
fatal = (ACPI_SIGNAL_FATAL_INFO *)Info;
@@ -82,10 +81,11 @@
fatal->Type, fatal->Code, fatal->Argument);
kdb_enter("AcpiOsSignal");
break;
-
+
case ACPI_SIGNAL_BREAKPOINT:
- message = (char *)Info;
- kdb_enter(message);
+#ifdef ACPI_DEBUG
+ kdb_enter((char *)Info);
+#endif
break;
default:
==== //depot/projects/nsched/sys/dev/acpica/acpi_pci_link.c#7 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.28 2004/08/27 00:53:11 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.29 2004/09/01 17:59:29 njl Exp $");
#include "opt_acpi.h"
#include <sys/param.h>
@@ -373,18 +373,6 @@
link->initial_irq = 0;
}
- /*
- * Try to disable this link. If successful, set the current IRQ to
- * zero and flags to indicate this link is not routed. If we can't
- * run _DIS (i.e., the method doesn't exist), assume the initial
- * IRQ was routed by the BIOS.
- */
- if (ACPI_SUCCESS(AcpiEvaluateObject(handle, "_DIS", NULL, NULL))) {
- link->current_irq = 0;
- link->flags = ACPI_LINK_NONE;
- } else
- link->flags = ACPI_LINK_ROUTED;
-
error = AcpiGetPossibleResources(handle, &buf);
if (ACPI_FAILURE(error)) {
ACPI_DEBUG_PRINT((ACPI_DB_WARN,
@@ -426,6 +414,18 @@
}
/*
+ * Try to disable this link. If successful, set the current IRQ to
+ * zero and flags to indicate this link is not routed. If we can't
+ * run _DIS (i.e., the method doesn't exist), assume the initial
+ * IRQ was routed by the BIOS.
+ */
+ if (ACPI_SUCCESS(AcpiEvaluateObject(handle, "_DIS", NULL, NULL))) {
+ link->current_irq = 0;
+ link->flags = ACPI_LINK_NONE;
+ } else
+ link->flags = ACPI_LINK_ROUTED;
+
+ /*
* If the initial IRQ is invalid (not in _PRS), set it to 0 and
* mark this link as not routed. We won't use it as the preferred
* interrupt later when we route.
==== //depot/projects/nsched/sys/dev/ata/ata-chipset.c#10 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.83 2004/08/27 12:54:58 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.84 2004/09/01 12:15:44 sos Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -188,13 +188,16 @@
* Marvell 88SX8030 SATA->PATA converters and UDMA6/ATA133.
*/
if (atadev->param->satacapabilities != 0x0000 &&
- atadev->param->satacapabilities != 0xffff)
- mode = ata_limit_mode(atadev, mode, ATA_UDMA6);
- else
+ atadev->param->satacapabilities != 0xffff) {
+ if (!ata_controlcmd(atadev, ATA_SETFEATURES, ATA_SF_SETXFER, 0,
+ ata_limit_mode(atadev, mode, ATA_UDMA6)))
+ atadev->mode = ATA_SA150;
+ }
+ else {
mode = ata_limit_mode(atadev, mode, ATA_UDMA5);
-
- if (!ata_controlcmd(atadev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode))
- atadev->mode = mode;
+ if (!ata_controlcmd(atadev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode))
+ atadev->mode = mode;
+ }
}
/*
==== //depot/projects/nsched/sys/dev/ata/ata-disk.c#7 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.176 2004/08/27 12:03:18 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-disk.c,v 1.177 2004/09/01 12:15:44 sos Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -393,7 +393,7 @@
}
else {
ata_prtdev(adp->device,
- "%lluMB <%.40s/%.8s> [%lld/%d/%d] at ata%d-%s %s",
+ "%lluMB <%.40s/%.8s> [%lld/%d/%d] at ata%d-%s %s%s\n",
(unsigned long long)(adp->total_secs /
((1024L * 1024L) / DEV_BSIZE)),
adp->device->param->model, adp->device->param->revision,
@@ -402,13 +402,8 @@
adp->heads, adp->sectors,
device_get_unit(adp->device->channel->dev),
(adp->device->unit == ATA_MASTER) ? "master" : "slave",
- (adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "");
-
- if (adp->device->param->satacapabilities != 0x0000 &&
- adp->device->param->satacapabilities != 0xffff)
- printf("SATA150\n");
- else
- printf("%s\n", ata_mode2str(adp->device->mode));
+ (adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "",
+ ata_mode2str(adp->device->mode));
}
}
==== //depot/projects/nsched/sys/dev/em/if_em.c#6 (text+ko) ====
@@ -31,7 +31,7 @@
***************************************************************************/
-/*$FreeBSD: src/sys/dev/em/if_em.c,v 1.44 2004/07/02 12:16:01 mlaier Exp $*/
+/*$FreeBSD: src/sys/dev/em/if_em.c,v 1.45 2004/09/01 23:22:41 pdeuskar Exp $*/
#include <dev/em/if_em.h>
@@ -51,7 +51,7 @@
* Driver version
*********************************************************************/
-char em_driver_version[] = "1.7.25";
+char em_driver_version[] = "1.7.35";
/*********************************************************************
@@ -80,7 +80,6 @@
{ 0x8086, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0},
{ 0x8086, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0},
{ 0x8086, 0x1013, PCI_ANY_ID, PCI_ANY_ID, 0},
- { 0x8086, 0x1014, PCI_ANY_ID, PCI_ANY_ID, 0},
{ 0x8086, 0x1015, PCI_ANY_ID, PCI_ANY_ID, 0},
{ 0x8086, 0x1016, PCI_ANY_ID, PCI_ANY_ID, 0},
{ 0x8086, 0x1017, PCI_ANY_ID, PCI_ANY_ID, 0},
@@ -99,6 +98,7 @@
{ 0x8086, 0x1079, PCI_ANY_ID, PCI_ANY_ID, 0},
{ 0x8086, 0x107A, PCI_ANY_ID, PCI_ANY_ID, 0},
{ 0x8086, 0x107B, PCI_ANY_ID, PCI_ANY_ID, 0},
+ { 0x8086, 0x107C, PCI_ANY_ID, PCI_ANY_ID, 0},
/* required last entry */
{ 0, 0, 0, 0, 0}
};
@@ -742,7 +742,7 @@
em_init(adapter);
break;
default:
- IOCTL_DEBUGOUT1("ioctl received: UNKNOWN (0x%x)\n", (int)command);
+ IOCTL_DEBUGOUT1("ioctl received: UNKNOWN (0x%x)", (int)command);
error = EINVAL;
}
@@ -797,6 +797,7 @@
{
struct ifnet *ifp;
+ uint32_t pba;
ifp = &adapter->interface_data.ac_if;
INIT_DEBUGOUT("em_init: begin");
@@ -805,6 +806,36 @@
em_stop(adapter);
+ /* Packet Buffer Allocation (PBA)
+ * Writing PBA sets the receive portion of the buffer
+ * the remainder is used for the transmit buffer.
+ *
+ * Devices before the 82547 had a Packet Buffer of 64K.
+ * Default allocation: PBA=48K for Rx, leaving 16K for Tx.
+ * After the 82547 the buffer was reduced to 40K.
+ * Default allocation: PBA=30K for Rx, leaving 10K for Tx.
+ * Note: default does not leave enough room for Jumbo Frame >10k.
+ */
+ if(adapter->hw.mac_type < em_82547) {
+ /* Total FIFO is 64K */
+ if(adapter->rx_buffer_len > EM_RXBUFFER_8192)
+ pba = E1000_PBA_40K; /* 40K for Rx, 24K for Tx */
+ else
+ pba = E1000_PBA_48K; /* 48K for Rx, 16K for Tx */
+ } else {
+ /* Total FIFO is 40K */
+ if(adapter->hw.max_frame_size > EM_RXBUFFER_8192) {
+ pba = E1000_PBA_22K; /* 22K for Rx, 18K for Tx */
+ } else {
+ pba = E1000_PBA_30K; /* 30K for Rx, 10K for Tx */
+ }
+ adapter->tx_fifo_head = 0;
+ adapter->tx_head_addr = pba << EM_TX_HEAD_ADDR_SHIFT;
+ adapter->tx_fifo_size = (E1000_PBA_40K - pba) << EM_PBA_BYTES_SHIFT;
+ }
+ INIT_DEBUGOUT1("em_init: pba=%dK",pba);
+ E1000_WRITE_REG(&adapter->hw, PBA, pba);
+
/* Get the latest mac address, User can use a LAA */
bcopy(adapter->interface_data.ac_enaddr, adapter->hw.mac_addr,
ETHER_ADDR_LEN);
@@ -1138,10 +1169,6 @@
bcopy(seg, q->segs, nsegs * sizeof(seg[0]));
}
-#define EM_FIFO_HDR 0x10
-#define EM_82547_PKT_THRESH 0x3e0
-#define EM_82547_TX_FIFO_SIZE 0x2800
-#define EM_82547_TX_FIFO_BEGIN 0xf00
/*********************************************************************
*
* This routine maps the mbufs to tx descriptors.
@@ -1356,7 +1383,7 @@
if(eop) {
if (em_82547_fifo_workaround(adapter, length)) {
- adapter->tx_fifo_wrk++;
+ adapter->tx_fifo_wrk_cnt++;
callout_reset(&adapter->tx_fifo_timer, 1,
em_82547_move_tail, adapter);
break;
@@ -1387,7 +1414,7 @@
fifo_pkt_len = EM_ROUNDUP(len + EM_FIFO_HDR, EM_FIFO_HDR);
if (adapter->link_duplex == HALF_DUPLEX) {
- fifo_space = EM_82547_TX_FIFO_SIZE - adapter->tx_fifo_head;
+ fifo_space = adapter->tx_fifo_size - adapter->tx_fifo_head;
if (fifo_pkt_len >= (EM_82547_PKT_THRESH + fifo_space)) {
if (em_82547_tx_fifo_reset(adapter)) {
@@ -1409,8 +1436,8 @@
/* tx_fifo_head is always 16 byte aligned */
adapter->tx_fifo_head += fifo_pkt_len;
- if (adapter->tx_fifo_head >= EM_82547_TX_FIFO_SIZE) {
- adapter->tx_fifo_head -= EM_82547_TX_FIFO_SIZE;
+ if (adapter->tx_fifo_head >= adapter->tx_fifo_size) {
+ adapter->tx_fifo_head -= adapter->tx_fifo_size;
}
return;
@@ -1435,17 +1462,17 @@
E1000_WRITE_REG(&adapter->hw, TCTL, tctl & ~E1000_TCTL_EN);
/* Reset FIFO pointers */
- E1000_WRITE_REG(&adapter->hw, TDFT, EM_82547_TX_FIFO_BEGIN);
- E1000_WRITE_REG(&adapter->hw, TDFH, EM_82547_TX_FIFO_BEGIN);
- E1000_WRITE_REG(&adapter->hw, TDFTS, EM_82547_TX_FIFO_BEGIN);
- E1000_WRITE_REG(&adapter->hw, TDFHS, EM_82547_TX_FIFO_BEGIN);
+ E1000_WRITE_REG(&adapter->hw, TDFT, adapter->tx_head_addr);
+ E1000_WRITE_REG(&adapter->hw, TDFH, adapter->tx_head_addr);
+ E1000_WRITE_REG(&adapter->hw, TDFTS, adapter->tx_head_addr);
+ E1000_WRITE_REG(&adapter->hw, TDFHS, adapter->tx_head_addr);
/* Re-enable TX unit */
E1000_WRITE_REG(&adapter->hw, TCTL, tctl);
E1000_WRITE_FLUSH(&adapter->hw);
adapter->tx_fifo_head = 0;
- adapter->tx_fifo_reset++;
+ adapter->tx_fifo_reset_cnt++;
return(TRUE);
}
@@ -1459,13 +1486,23 @@
{
u_int32_t reg_rctl;
+ u_int32_t ctrl;
struct ifnet *ifp = &adapter->interface_data.ac_if;
reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
+ ctrl = E1000_READ_REG(&adapter->hw, CTRL);
if (ifp->if_flags & IFF_PROMISC) {
reg_rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
+
+ /* Disable VLAN stripping in promiscous mode
+ * This enables bridging of vlan tagged frames to occur
+ * and also allows vlan tags to be seen in tcpdump
+ */
+ ctrl &= ~E1000_CTRL_VME;
+ E1000_WRITE_REG(&adapter->hw, CTRL, ctrl);
+
} else if (ifp->if_flags & IFF_ALLMULTI) {
reg_rctl |= E1000_RCTL_MPE;
reg_rctl &= ~E1000_RCTL_UPE;
@@ -1486,6 +1523,7 @@
reg_rctl &= (~E1000_RCTL_MPE);
E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
+ em_enable_vlans(adapter);
return;
}
@@ -3169,6 +3207,10 @@
uint8_t *hw_addr = adapter->hw.hw_addr;
printf("em%d: Adapter hardware address = %p \n", unit, hw_addr);
+ printf("em%d:CTRL = 0x%x\n", unit,
+ E1000_READ_REG(&adapter->hw, CTRL));
+ printf("em%d:RCTL = 0x%x PS=(0x8402)\n", unit,
+ E1000_READ_REG(&adapter->hw, RCTL));
printf("em%d:tx_int_delay = %d, tx_abs_int_delay = %d\n", unit,
E1000_READ_REG(&adapter->hw, TIDV),
E1000_READ_REG(&adapter->hw, TADV));
@@ -3183,8 +3225,8 @@
adapter->clean_tx_interrupts);
#endif
printf("em%d: fifo workaround = %lld, fifo_reset = %lld\n", unit,
- (long long)adapter->tx_fifo_wrk,
- (long long)adapter->tx_fifo_reset);
+ (long long)adapter->tx_fifo_wrk_cnt,
+ (long long)adapter->tx_fifo_reset_cnt);
printf("em%d: hw tdh = %d, hw tdt = %d\n", unit,
E1000_READ_REG(&adapter->hw, TDH),
E1000_READ_REG(&adapter->hw, TDT));
==== //depot/projects/nsched/sys/dev/em/if_em.h#3 (text+ko) ====
@@ -31,7 +31,7 @@
***************************************************************************/
-/*$FreeBSD: src/sys/dev/em/if_em.h,v 1.25 2004/05/30 20:08:30 phk Exp $*/
+/*$FreeBSD: src/sys/dev/em/if_em.h,v 1.26 2004/09/01 23:22:41 pdeuskar Exp $*/
#ifndef _EM_H_DEFINED_
#define _EM_H_DEFINED_
@@ -399,8 +399,6 @@
struct mbuf *fmp;
struct mbuf *lmp;
- u_int16_t tx_fifo_head;
-
struct sysctl_ctx_list sysctl_ctx;
struct sysctl_oid *sysctl_tree;
@@ -412,8 +410,21 @@
unsigned long no_tx_desc_avail2;
unsigned long no_tx_map_avail;
unsigned long no_tx_dma_setup;
- u_int64_t tx_fifo_reset;
- u_int64_t tx_fifo_wrk;
+
+ /* Used in for 82547 10Mb Half workaround */
+ #define EM_PBA_BYTES_SHIFT 0xA
+ #define EM_TX_HEAD_ADDR_SHIFT 7
+ #define EM_PBA_TX_MASK 0xFFFF0000
+ #define EM_FIFO_HDR 0x10
+
+ #define EM_82547_PKT_THRESH 0x3e0
+
+ u_int32_t tx_fifo_size;
+ u_int32_t tx_fifo_head;
+ u_int32_t tx_fifo_head_addr;
+ u_int64_t tx_fifo_reset_cnt;
+ u_int64_t tx_fifo_wrk_cnt;
+ u_int32_t tx_head_addr;
/* For 82544 PCIX Workaround */
boolean_t pcix_82544;
==== //depot/projects/nsched/sys/dev/em/if_em_hw.c#2 (text+ko) ====
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/em/if_em_hw.c,v 1.13 2004/02/10 21:31:09 pdeuskar Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/em/if_em_hw.c,v 1.14 2004/09/01 23:22:41 pdeuskar Exp $");
#include <dev/em/if_em_hw.h>
@@ -73,6 +73,7 @@
static void em_standby_eeprom(struct em_hw *hw);
static int32_t em_id_led_init(struct em_hw * hw);
static int32_t em_set_vco_speed(struct em_hw *hw);
+static int32_t em_set_phy_mode(struct em_hw *hw);
/* IGP cable length table */
static const
@@ -258,6 +259,7 @@
break;
case E1000_DEV_ID_82541ER:
case E1000_DEV_ID_82541GI:
+ case E1000_DEV_ID_82541GI_LF:
case E1000_DEV_ID_82541GI_MOBILE:
hw->mac_type = em_82541_rev_2;
break;
@@ -477,11 +479,11 @@
uint16_t pcix_stat_hi_word;
uint16_t cmd_mmrbc;
uint16_t stat_mmrbc;
-
DEBUGFUNC("em_init_hw");
/* Initialize Identification LED */
- if((ret_val = em_id_led_init(hw))) {
+ ret_val = em_id_led_init(hw);
+ if(ret_val) {
DEBUGOUT("Error Initializing Identification LED\n");
return ret_val;
}
@@ -602,16 +604,16 @@
return E1000_SUCCESS;
}
- if ((ret_val = em_read_eeprom(hw, EEPROM_SERDES_AMPLITUDE, 1,
- &eeprom_data))) {
+ ret_val = em_read_eeprom(hw, EEPROM_SERDES_AMPLITUDE, 1, &eeprom_data);
+ if (ret_val) {
return ret_val;
}
if(eeprom_data != EEPROM_RESERVED_WORD) {
/* Adjust SERDES output amplitude only. */
eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK;
- if((ret_val = em_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL,
- eeprom_data)))
+ ret_val = em_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, eeprom_data);
+ if(ret_val)
return ret_val;
}
@@ -760,14 +762,16 @@
if(hw->media_type == em_media_type_fiber)
signal = (hw->mac_type > em_82544) ? E1000_CTRL_SWDPIN1 : 0;
- if((ret_val = em_adjust_serdes_amplitude(hw)))
+ ret_val = em_adjust_serdes_amplitude(hw);
+ if(ret_val)
return ret_val;
/* Take the link out of reset */
ctrl &= ~(E1000_CTRL_LRST);
/* Adjust VCO speed to improve BER performance */
- if((ret_val = em_set_vco_speed(hw)))
+ ret_val = em_set_vco_speed(hw);
+ if(ret_val)
return ret_val;
em_config_collision_dist(hw);
@@ -854,7 +858,8 @@
* we detect a signal. This will allow us to communicate with
* non-autonegotiating link partners.
*/
- if((ret_val = em_check_for_link(hw))) {
+ ret_val = em_check_for_link(hw);
+ if(ret_val) {
DEBUGOUT("Error while checking for link\n");
return ret_val;
}
@@ -901,12 +906,25 @@
}
/* Make sure we have a valid PHY */
- if((ret_val = em_detect_gig_phy(hw))) {
+ ret_val = em_detect_gig_phy(hw);
+ if(ret_val) {
DEBUGOUT("Error, did not detect valid phy.\n");
return ret_val;
}
DEBUGOUT1("Phy ID = %x \n", hw->phy_id);
+ /* Set PHY to class A mode (if necessary) */
+ ret_val = em_set_phy_mode(hw);
+ if(ret_val)
+ return ret_val;
+
+ if((hw->mac_type == em_82545_rev_3) ||
+ (hw->mac_type == em_82546_rev_3)) {
+ ret_val = em_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
+ phy_data |= 0x00000008;
+ ret_val = em_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data);
+ }
+
if(hw->mac_type <= em_82543 ||
hw->mac_type == em_82541 || hw->mac_type == em_82547 ||
hw->mac_type == em_82541_rev_2 || hw->mac_type == em_82547_rev_2)
@@ -915,7 +933,8 @@
if(!hw->phy_reset_disable) {
if (hw->phy_type == em_phy_igp) {
- if((ret_val = em_phy_reset(hw))) {
+ ret_val = em_phy_reset(hw);
+ if(ret_val) {
DEBUGOUT("Error Resetting the PHY\n");
return ret_val;
}
@@ -930,14 +949,16 @@
E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
/* disable lplu d3 during driver init */
- if((ret_val = em_set_d3_lplu_state(hw, FALSE))) {
+ ret_val = em_set_d3_lplu_state(hw, FALSE);
+ if(ret_val) {
DEBUGOUT("Error Disabling LPLU D3\n");
return ret_val;
}
/* Configure mdi-mdix settings */
- if((ret_val = em_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
- &phy_data)))
+ ret_val = em_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
+ &phy_data);
+ if(ret_val)
return ret_val;
if((hw->mac_type == em_82541) || (hw->mac_type == em_82547)) {
@@ -964,8 +985,9 @@
break;
}
}
- if((ret_val = em_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
- phy_data)))
+ ret_val = em_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL,
+ phy_data);
+ if(ret_val)
return ret_val;
/* set auto-master slave resolution settings */
@@ -983,27 +1005,28 @@
* resolution as hardware default. */
if(hw->autoneg_advertised == ADVERTISE_1000_FULL) {
/* Disable SmartSpeed */
- if((ret_val = em_read_phy_reg(hw,
- IGP01E1000_PHY_PORT_CONFIG,
- &phy_data)))
+ ret_val = em_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+ &phy_data);
+ if(ret_val)
return ret_val;
phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
- if((ret_val = em_write_phy_reg(hw,
- IGP01E1000_PHY_PORT_CONFIG,
- phy_data)))
+ ret_val = em_write_phy_reg(hw,
+ IGP01E1000_PHY_PORT_CONFIG,
+ phy_data);
+ if(ret_val)
return ret_val;
/* Set auto Master/Slave resolution process */
- if((ret_val = em_read_phy_reg(hw, PHY_1000T_CTRL,
- &phy_data)))
+ ret_val = em_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
+ if(ret_val)
return ret_val;
phy_data &= ~CR_1000T_MS_ENABLE;
- if((ret_val = em_write_phy_reg(hw, PHY_1000T_CTRL,
- phy_data)))
+ ret_val = em_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
+ if(ret_val)
return ret_val;
}
- if((ret_val = em_read_phy_reg(hw, PHY_1000T_CTRL,
- &phy_data)))
+ ret_val = em_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data);
+ if(ret_val)
return ret_val;
/* load defaults for future use */
@@ -1026,14 +1049,15 @@
default:
break;
}
- if((ret_val = em_write_phy_reg(hw, PHY_1000T_CTRL,
- phy_data)))
+ ret_val = em_write_phy_reg(hw, PHY_1000T_CTRL, phy_data);
+ if(ret_val)
return ret_val;
}
} else {
/* Enable CRS on TX. This must be set for half-duplex operation. */
- if((ret_val = em_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
- &phy_data)))
+ ret_val = em_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
+ &phy_data);
+ if(ret_val)
return ret_val;
phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX;
@@ -1072,15 +1096,17 @@
phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL;
if(hw->disable_polarity_correction == 1)
phy_data |= M88E1000_PSCR_POLARITY_REVERSAL;
- if((ret_val = em_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
- phy_data)))
+ ret_val = em_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL,
+ phy_data);
+ if(ret_val)
return ret_val;
/* Force TX_CLK in the Extended PHY Specific Control Register
* to 25MHz clock.
*/
- if((ret_val = em_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
- &phy_data)))
+ ret_val = em_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
+ &phy_data);
+ if(ret_val)
return ret_val;
phy_data |= M88E1000_EPSCR_TX_CLK_25;
@@ -1091,14 +1117,15 @@
M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK);
phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X |
M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X);
- if((ret_val = em_write_phy_reg(hw,
- M88E1000_EXT_PHY_SPEC_CTRL,
- phy_data)))
+ ret_val = em_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL,
+ phy_data);
+ if(ret_val)
return ret_val;
}
/* SW Reset the PHY so all changes take effect */
- if((ret_val = em_phy_reset(hw))) {
+ ret_val = em_phy_reset(hw);
+ if(ret_val) {
DEBUGOUT("Error Resetting the PHY\n");
return ret_val;
}
@@ -1132,7 +1159,8 @@
hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
DEBUGOUT("Reconfiguring auto-neg advertisement params\n");
- if((ret_val = em_phy_setup_autoneg(hw))) {
+ ret_val = em_phy_setup_autoneg(hw);
+ if(ret_val) {
DEBUGOUT("Error Setting up Auto-Negotiation\n");
return ret_val;
}
@@ -1141,18 +1169,21 @@
/* Restart auto-negotiation by setting the Auto Neg Enable bit and
* the Auto Neg Restart bit in the PHY control register.
*/
- if((ret_val = em_read_phy_reg(hw, PHY_CTRL, &phy_data)))
+ ret_val = em_read_phy_reg(hw, PHY_CTRL, &phy_data);
+ if(ret_val)
return ret_val;
phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
- if((ret_val = em_write_phy_reg(hw, PHY_CTRL, phy_data)))
+ ret_val = em_write_phy_reg(hw, PHY_CTRL, phy_data);
+ if(ret_val)
return ret_val;
/* Does the user want to wait for Auto-Neg to complete here, or
* check at a later time (for example, callback routine).
*/
if(hw->wait_autoneg_complete) {
- if((ret_val = em_wait_autoneg(hw))) {
+ ret_val = em_wait_autoneg(hw);
+ if(ret_val) {
DEBUGOUT("Error while waiting for autoneg to complete\n");
return ret_val;
}
@@ -1160,7 +1191,8 @@
hw->get_link_status = TRUE;
} else {
DEBUGOUT("Forcing speed and duplex\n");
- if((ret_val = em_phy_force_speed_duplex(hw))) {
+ ret_val = em_phy_force_speed_duplex(hw);
+ if(ret_val) {
DEBUGOUT("Error Forcing Speed and Duplex\n");
return ret_val;
}
@@ -1171,9 +1203,11 @@
* valid.
*/
for(i = 0; i < 10; i++) {
- if((ret_val = em_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+ ret_val = em_read_phy_reg(hw, PHY_STATUS, &phy_data);
+ if(ret_val)
return ret_val;
- if((ret_val = em_read_phy_reg(hw, PHY_STATUS, &phy_data)))
+ ret_val = em_read_phy_reg(hw, PHY_STATUS, &phy_data);
+ if(ret_val)
return ret_val;
if(phy_data & MII_SR_LINK_STATUS) {
@@ -1188,19 +1222,22 @@
if(hw->mac_type >= em_82544) {
em_config_collision_dist(hw);
} else {
- if((ret_val = em_config_mac_to_phy(hw))) {
+ ret_val = em_config_mac_to_phy(hw);
+ if(ret_val) {
DEBUGOUT("Error configuring MAC to PHY settings\n");
return ret_val;
}
}
- if((ret_val = em_config_fc_after_link_up(hw))) {
+ ret_val = em_config_fc_after_link_up(hw);
+ if(ret_val) {
DEBUGOUT("Error Configuring Flow Control\n");
return ret_val;
}
DEBUGOUT("Valid link established!!!\n");
if(hw->phy_type == em_phy_igp) {
- if((ret_val = em_config_dsp_after_link_change(hw, TRUE))) {
+ ret_val = em_config_dsp_after_link_change(hw, TRUE);
+ if(ret_val) {
DEBUGOUT("Error Configuring DSP after link up\n");
return ret_val;
}
@@ -1230,12 +1267,13 @@
DEBUGFUNC("em_phy_setup_autoneg");
/* Read the MII Auto-Neg Advertisement Register (Address 4). */
- if((ret_val = em_read_phy_reg(hw, PHY_AUTONEG_ADV,
- &mii_autoneg_adv_reg)))
+ ret_val = em_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg);
+ if(ret_val)
return ret_val;
/* Read the MII 1000Base-T Control Register (Address 9). */
- if((ret_val = em_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg)))
+ ret_val = em_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
+ if(ret_val)
return ret_val;
/* Need to parse both autoneg_advertised and fc and set up
@@ -1342,13 +1380,14 @@
return -E1000_ERR_CONFIG;
}
- if((ret_val = em_write_phy_reg(hw, PHY_AUTONEG_ADV,
- mii_autoneg_adv_reg)))
+ ret_val = em_write_phy_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg);
+ if(ret_val)
return ret_val;
DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
- if((ret_val = em_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg)))
+ ret_val = em_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
+ if(ret_val)
return ret_val;
return E1000_SUCCESS;
@@ -1387,7 +1426,8 @@
ctrl &= ~E1000_CTRL_ASDE;
/* Read the MII Control Register. */
- if((ret_val = em_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg)))
+ ret_val = em_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg);
+ if(ret_val)
return ret_val;
/* We need to disable autoneg in order to force link and duplex. */
@@ -1489,10 +1529,12 @@
/* Read the MII Status Register and wait for Auto-Neg Complete bit
* to be set.
*/
- if((ret_val = em_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+ ret_val = em_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+ if(ret_val)
return ret_val;
- if((ret_val = em_read_phy_reg(hw, PHY_STATUS, &mii_status_reg)))
+ ret_val = em_read_phy_reg(hw, PHY_STATUS, &mii_status_reg);
+ if(ret_val)
return ret_val;
if(mii_status_reg & MII_SR_LINK_STATUS) break;
@@ -1500,7 +1542,8 @@
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list