FreeBSD/src 9f04320 — libexec/rc safe_eval.sh

safe_eval.sh fix description of safe_set_var returns.

The description was out of sync wrt return values.
1. invalid var
2. invalid val
3. var not in allowed list
DeltaFile
+4-4libexec/rc/safe_eval.sh
+4-41 files

FreeBSD/src 475e3bc — libexec/rc safe_eval.sh

safe_eval.sh: add safe_set_var

Get the log message right!
Fix default allowed chars (untabify clobbered TAB)
Add a couple more : messages to help debugging.
DeltaFile
+11-4libexec/rc/safe_eval.sh
+11-41 files

FreeBSD/src 3061504 — share/misc committers-ports.dot

Add Christos Longros as ports committer, update mentor/mentee

Reviewed by:    jrm (mentor)
Approved by:    jrm (mentor)
Differential Revision:  https://reviews.freebsd.org/D60591
DeltaFile
+3-0share/misc/committers-ports.dot
+3-01 files

FreeBSD/src 0fa0966 — libexec/rc safe_eval.sh

safe_eval.sh add safe_var_set

safe_var_set can be used to safely handle var=val args from command line.
eg.

        while :
        do
                case "$1" in
                *=*)    # eval "$1" can be very dangerous
                        # safe_var_set will only eval if
                        # both var and value are sane.
                        if ! safe_var_set "$1"; then
                                case "$?" in
                                1) echo invalid variable name;;
                                2) echo invalide value;;
                                3) echo variabel not allowed;;
                                esac
                        fi
                        shift

    [5 lines not shown]
DeltaFile
+49-1libexec/rc/safe_eval.sh
+49-11 files

FreeBSD/src b1023de — sys/fs/nfsserver nfs_nfsdstate.c

nfs_nfsdstate.c: Add an extra safety belt check for the backchannel

I do not think that xp_p2 can be NULL at this point,
but add an extra safety belt, just in case.

(cherry picked from commit a52c50b4b7c2652954ef1bd34710a4b1fc8ef391)
DeltaFile
+2-1sys/fs/nfsserver/nfs_nfsdstate.c
+2-11 files

FreeBSD/src 07c057b — sys/rpc clnt_vc.c

clnt_vc.c: Fix handling of broken TCP connections

After more than, I don't know, maybe 10k operations: mount, copy,
remove, verify and unmount cycles, one cp command hung in
close() / ncl_flush and never recovered. The machine and the mount
continued to work normally through a new connection, but the writes
using the old connection stayed frozen.

I did not understand exactly what happened.  I traced what appears to
be the issue in the code. My current understanding is that
clnt_vc_soupcall() saw the EOF and woke the caller waiting for RPC
replies, but one caller remained blocked in sosend().
That thread continued holding a reference to the old client, preventing
it from being completely cleaned up.

The attached patch calls socantsendmore() when EOF is received, which
should wake the blocked sender and let the normal reconnect code replace
the connection.

(cherry picked from commit 49bec8c3dc58cf8e944f9bbbbea07e7e856ad897)
DeltaFile
+7-5sys/rpc/clnt_vc.c
+7-51 files

FreeBSD/src 4d015c4 — sys/rpc clnt_vc.c

clnt_vc.c: Fix handling of backchannel xprt

When clnt_vc_destroy() is called, it might not be the
current connection.  Without this patch, if it is not
the current connection, xp_p2 is set NULL and xprt is released
when it should not be released.

This patch adds a check for "current connection" to fix
the problem.  Found during testing to the client RDMA code,
but could happen for TCP as well.

(cherry picked from commit 81a6514689cefdaa5c92b5539ae885ec8c6b3336)
DeltaFile
+8-2sys/rpc/clnt_vc.c
+8-21 files

FreeBSD/src 63e5c83 — sys/fs/nfsserver nfs_nfsdstate.c

nfs_nfsdstate.c: Add an extra safety belt check for the backchannel

I do not think that xp_p2 can be NULL at this point,
but add an extra safety belt, just in case.

(cherry picked from commit a52c50b4b7c2652954ef1bd34710a4b1fc8ef391)
DeltaFile
+2-1sys/fs/nfsserver/nfs_nfsdstate.c
+2-11 files

FreeBSD/src 69dc3d9 — sys/rpc clnt_vc.c

clnt_vc.c: Fix handling of broken TCP connections

After more than, I don't know, maybe 10k operations: mount, copy,
remove, verify and unmount cycles, one cp command hung in
close() / ncl_flush and never recovered. The machine and the mount
continued to work normally through a new connection, but the writes
using the old connection stayed frozen.

I did not understand exactly what happened.  I traced what appears to
be the issue in the code. My current understanding is that
clnt_vc_soupcall() saw the EOF and woke the caller waiting for RPC
replies, but one caller remained blocked in sosend().
That thread continued holding a reference to the old client, preventing
it from being completely cleaned up.

The attached patch calls socantsendmore() when EOF is received, which
should wake the blocked sender and let the normal reconnect code replace
the connection.

(cherry picked from commit 49bec8c3dc58cf8e944f9bbbbea07e7e856ad897)
DeltaFile
+7-5sys/rpc/clnt_vc.c
+7-51 files

FreeBSD/src 28eefc7 — sys/rpc clnt_vc.c

clnt_vc.c: Fix handling of backchannel xprt

When clnt_vc_destroy() is called, it might not be the
current connection.  Without this patch, if it is not
the current connection, xp_p2 is set NULL and xprt is released
when it should not be released.

This patch adds a check for "current connection" to fix
the problem.  Found during testing to the client RDMA code,
but could happen for TCP as well.

(cherry picked from commit 81a6514689cefdaa5c92b5539ae885ec8c6b3336)
DeltaFile
+8-2sys/rpc/clnt_vc.c
+8-21 files

FreeBSD/src 7fdc748 — sys/amd64/conf MINIMAL GENERIC, sys/powerpc/conf QORIQ64 MPC85XX

amd64, powerpc: Enable tpm(4) in supported kernels

tpm(4) was removed from amd64 GENERIC because it broke suspend and
resume.  The preceding lifecycle, state-save, interrupt, locality, and
teardown fixes address those failures for both TPM 1.2 and TPM 2.0.

Restore the driver to amd64 GENERIC and MINIMAL, where TPM entropy
harvesting remained enabled.  Enable the driver and entropy harvesting
in the MPC85XX and QORIQ64 configurations, which already provide FDT,
spibus, and the platform SPI controller required by FDT-attached TPMs.
Leave the generic AIM and POWER configurations unchanged because they
have no TPM attachment bus.

The TPM 1.2 path completed repeated S3 cycles and command tests on
ThinkPad T430 and T440p systems.  The TPM 2.0 path completed repeated
device and full-system suspend/resume cycles on a ThinkPad P51.  The
PowerPC configuration matrix was checked to retain tpm(4) only where its
FDT SPI attachment path is present.


    [9 lines not shown]
DeltaFile
+1-1sys/amd64/conf/MINIMAL
+1-1sys/amd64/conf/GENERIC
+2-0sys/powerpc/conf/QORIQ64
+2-0sys/powerpc/conf/MPC85XX
+6-24 files

FreeBSD/src 5329e07 — usr.sbin/bhyve tpm_intf_crb.c

bhyve: tpm: allow the last dword of the CRB command buffer

The bounds check rejected any access ending exactly at the end of the
register block, so a four byte write at offset 0xffc was refused,
returning EINVAL and killing the VM.

PR:             291063
Fixes:          75909086a45d ("bhyve: allow read/write to full CRB buffer")
Sponsored by:   Defenso

Signed-off-by: Quentin Thébault <quentin.thebault at defenso.fr>
Reviewed-by: aokblast, kevans, markj
Pull-Request: https://github.com/freebsd/freebsd-src/pull/2362
(cherry picked from commit 4505445ccdb9555efc23262a971a18ca03486969)
DeltaFile
+1-1usr.sbin/bhyve/tpm_intf_crb.c
+1-11 files

FreeBSD/src 99229e5 — usr.sbin/bhyve tpm_intf_crb.c

bhyve: allow read/write to full CRB buffer

For some reason, we've incorrectly calculated the size of the CRB data buffer
register. There's no need to divide the CRB data buffer size by 4. We should
allow access to the whole buffer instead.

Reviewed by:            markj
Sponsored by:           Beckhoff Automation GmbH & Co. KG
Pull Request:           https://github.com/freebsd/freebsd-src/pull/2169

(cherry picked from commit 75909086a45da3c5aeaff8152728111cf798c6bc)
DeltaFile
+1-1usr.sbin/bhyve/tpm_intf_crb.c
+1-11 files

FreeBSD/src bf62832 — sys/dev/tpm tpm_crb.c

tpm: crb: check the error bit only after taking locality

tpmcrb_transmit() read CRB_CTRL_STS before requesting locality 0.
An AMD Pluton fTPM (like FrameWork Desktop) using the plain CRB start method
reads the control area as all-ones until locality is assigned, so bit 0 looks
like a stuck tpmSts and every command failed with EIO.

With RANDOM_ENABLE_TPM the harvester retries every 10 seconds, so this printed
"Device has Error bit set" forever.

Reviewed by:    kbowling
Approved by:    kbowling
Sponsored by:   Netflix
Differential Revision:  https://reviews.freebsd.org/D59661

(cherry picked from commit 7c375af72ef3f631e89431ae32a855d806e6ec98)
DeltaFile
+13-5sys/dev/tpm/tpm_crb.c
+13-51 files

FreeBSD/src a81e324 — sys/dev/tpm tpm_crb.c

tpm: crb: make the Pluton startmethod more resilient

The original implementation assumed that the start/reply doorbells
lived within the device _CRS space, but that isn't always the case.  On
my AMD Ryzen 7640U-based frame.work laptop, device memory runs from
0xc0500000-0xc0500fff while the doorbells are up around 0xc0508000.

Stop sanity checking the addresses and just map them in to work reliably
whether they're within the device range or not.

pluton_wait_reply is cribbed from tpm_wait_for_u32, but rewritten
slightly to read in just one place and to read one last time before
giving up at the end of the timeout, just in case.

Reviewed by:    kbowling
Differential Revision:  https://reviews.freebsd.org/D59327

(cherry picked from commit 6af3031c951614f2a42dfd67ce2c3a48ee8314ae)
DeltaFile
+88-29sys/dev/tpm/tpm_crb.c
+88-291 files

FreeBSD/src 6327629 — sys/dev/tpm tpm.c

tpm: Do not use timed tsleep() while polling during cold boot

Commit 4e0f283fb97a made tpm_tis12_init() wait for TPM_STS_CMD_READY
after aborting any command.  The wait is implemented by the driver's
existing tpm_waitfor_poll() loop, which sleeps with a one-tick tsleep()
between status reads.  Until now, that loop only ran from the resume and
command paths after boot.  From tpm_attach() it can panic with "timed
sleep before timers are working" when the TPM is attached from ACPI
during cold boot and the chip does not report ready on the first status
read.

Before 4e0f283fb97a, tpm_tis12_init() wrote TPM_STS_CMD_READY and
returned without waiting, so the polling loops only ran after boot.
tpm_request_locality() had the same latent hazard but its fast path
returns before sleeping whenever locality is already active.

Nothing calls wakeup() on the channels used by these polling loops, so
the sleeps are pure delays.  Use pause_sig(), which falls back to
DELAY() while the kernel is cold and returns EWOULDBLOCK, a value these

    [11 lines not shown]
DeltaFile
+3-3sys/dev/tpm/tpm.c
+3-31 files

FreeBSD/src 74f8911 — sys/dev/tpm tpm_tis_core.c

tpm_tis: Quiesce interrupts before registering a handler

The current interrupt path uses the IRQ resource value directly as the
LPC SIRQ selector in TPM_INT_VECTOR and already restricts it to 1 through
15. This is a driver limitation: a parent interrupt number need not equal
an LPC SIRQ channel, and SPI TPMs can use a separate parallel interrupt.

On the reported system with ACPI IRQ 45, the existing range check runs
after handler registration and returns before disabling firmware interrupt
delivery. This can leave a polling device with a handler on an asserted
source.

Disable and verify interrupt delivery before registering a handler or
starting common TPM services. Preserve the existing range policy, using
polling without registering a handler for routes rejected by that check,
and release their IRQ resources. Keep a failed setup's potentially stale
output cookie out of the device state; the interrupt framework may
already have removed that handler.


    [20 lines not shown]
DeltaFile
+90-23sys/dev/tpm/tpm_tis_core.c
+90-231 files

FreeBSD/src 606ce72 — sys/dev/tpm tpm20.h tpm20.c

tpm20: Move user copies outside the lifecycle lock

The TPM 2.0 character-device methods held the global device lock
while uiomove() accessed user memory.  User page faults could therefore
delay suspend or detach even though the read response was already
buffered.

Add a per-open sleepable lock to serialize operations on each response
buffer.  Stage commands under that lock before acquiring the device
lock, and copy them into the response buffer only after the lifecycle
checks succeed.  This preserves an unread response when suspend or
detach rejects a write.  Release the device lock before copying buffered
responses out.  Also advance the response offset by the bytes actually
copied when uiomove() returns after a partial transfer.

Validated on an Intel TPM 2.0 TIS device.  PCR reads and GetRandom
passed under 16-process mixed command load.  A response was consumed
correctly in 5-byte, 7-byte, and remainder reads.  Module unload/reload
recreated the device and entropy source without lock diagnostics.

    [7 lines not shown]
DeltaFile
+29-8sys/dev/tpm/tpm20.c
+1-0sys/dev/tpm/tpm20.h
+30-82 files

FreeBSD/src ef68bf6 — sys/dev/tpm tpm20.h

tpm20: Correct 32-bit register helpers

OR4() reads only the low byte before writing the complete 32-bit
register.  Preserve all register bits by using a matching 32-bit read.

Make BIT() produce an unsigned value so masks containing bit 31 do not
rely on a signed left shift into the sign bit.  OpenBSD carries the
same change.

Reviewed by:    kevans
Sponsored by:   BBOX.io
Differential Revision:  https://reviews.freebsd.org/D59244

(cherry picked from commit f613a43c366600e8c388c3200f74c6dd27f8a7a2)
DeltaFile
+2-2sys/dev/tpm/tpm20.h
+2-21 files

FreeBSD/src 3904c7a — sys/dev/tpm tpm_crb.c tpm_tis_core.c

tpm20: Release transport state after command failures

Once a transport acquires locality, several TIS and CRB error paths
return without relinquishing it.  They can also leave a partial FIFO
transaction or an active CRB command for the next operation to inherit.

Route post-locality exits through common cleanup.  Reset the TIS command
state on every attempt.  For CRB, cancel an active failed command when
necessary, request the idle state, and relinquish locality even when the
state transition itself fails.

Successful command handling is unchanged apart from sharing the same
cleanup path.

Reviewed by:    kevans
Sponsored by:   BBOX.io
Differential Revision:  https://reviews.freebsd.org/D59243

(cherry picked from commit 2fe8510b0a06ad577789ece7be8c9319c8ce3d06)
DeltaFile
+41-24sys/dev/tpm/tpm_tis_core.c
+37-20sys/dev/tpm/tpm_crb.c
+78-442 files

FreeBSD/src bd54c7b — sys/dev/tpm tpm_tis_core.c

tpm_tis: release TPM resources after reading response

Per TIS 1.3 section 5.6.12, write commandReady to TPM_STS after reading the
response so the TPM can free its ReadFIFO and other internal resources.
The subsequent tpmtis_go_ready() provides the second write the spec describes
and waits for the state transition.

PR:             295103
Reported by:    Benoit Sansoni <benoit.sansoni at gmail.com>
Reviewed by:    kevans
Approved by:    kevans
Differential Revision:  https://reviews.freebsd.org/D57841

(cherry picked from commit e4c50d86796d07cf90e6a683234e1c0e9ca5e03c)
DeltaFile
+10-0sys/dev/tpm/tpm_tis_core.c
+10-01 files

FreeBSD/src 8e85e2e — usr.sbin/bsdinstall/scripts jail auto

bsdinstall: Drop "Technology preview" from package sets

And refer to dist sets as "legacy."

We're planning on turning off dist sets in 16.0 (the code will remain
in the tree, but disabled by default) so we'd like to encourage users
to install 15.2 systems using package sets in order to ease the upgrade
path to 16.0.

Reviewed by:    cperciva
Sponsored by:   The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D54156

(cherry picked from commit dac74b20c706b1f73986fb40dac27ed85c1d2850)
DeltaFile
+2-2usr.sbin/bsdinstall/scripts/jail
+2-2usr.sbin/bsdinstall/scripts/auto
+4-42 files

FreeBSD/src 48d997f — sys/dev/tpm tpm20.h tpm_tis_core.c

tpm_tis: Close interrupt wait races

The TIS interrupt handler can acknowledge and signal an event after
the waiter checks the device status but before it enters tsleep().
Since the handler is MPSAFE, the command lock does not close this
window.  A lost wakeup can delay a completed command for its full
timeout, up to 40 seconds for long TPM 2.0 operations.

Publish the expected event under an interrupt mutex and use a generation
counter to record matching interrupts.  Recheck the device predicate
without the mutex because register access may sleep on a SPI transport,
then compare the generation before atomically waiting on a condition
variable.  This closes the check-to-sleep race without placing sleeping
bus operations under a mutex.

Use an absolute deadline while retrying the predicate after wakeups.
Apply the same scheme to locality acquisition, which had an equivalent
race.  Leave the expected event published while polling so the
attach-time test can still prove that an advertised interrupt arrived.

    [11 lines not shown]
DeltaFile
+91-53sys/dev/tpm/tpm_tis_core.c
+6-0sys/dev/tpm/tpm20.h
+97-532 files

FreeBSD/src 0a843d2 — sys/dev/tpm tpm20.h tpm20.c

tpm20: Harden the common device lifecycle

Mark the device as dying before teardown and destroy the character
device before freeing its private state or lock.  This prevents cdev
methods from entering with a freed internal buffer or a destroyed sx.

Check the teardown state in command paths, honor failures from the cdev
private data interface, and publish teardown before waiting for the
lifecycle lock.  Keep that lock across TPM retry delays so commands
cannot interpose and private state remains pinned, but abort before the
next retry once teardown begins.

Block new cdev operations after a successful Shutdown(STATE).  Keep the
suspend gate and the TPM command under the same lock so a userspace
command cannot invalidate the saved state before S3 entry.  Clear the
gate only after Startup(STATE) succeeds.

Keep entropy harvesting scheduled after a transient command or suspend
failure, but stop it while suspended or once teardown begins.  Queue the

    [15 lines not shown]
DeltaFile
+124-46sys/dev/tpm/tpm20.c
+2-0sys/dev/tpm/tpm20.h
+126-462 files

FreeBSD/src 55c97a1 — sys/dev/tpm tpm20.h tpm_tis_core.c

tpm_tis: Restore validated interrupts after resume

TIS interrupt routing and enable registers may lose their state across
S3, while the driver retains its software indication that interrupts
work.  A subsequent locality or command wait can then sleep for an
interrupt that cannot arrive.

Remember whether interrupts worked before suspend and restore the
vector, pending status, and enable mask before TPM2_Startup.  Put the
transport in polling mode first; the interrupt handler promotes it back
to interrupt waits only after observing an interrupt from the restored
configuration.  If register restoration fails, Startup and subsequent
commands continue using polling.

Preserve the initial interrupt-enable mask, including the firmware's
trigger and polarity selection proven by the attach time interrupt test,
and restore that exact mask rather than accepting post-S3 defaults.

Program the same safe baseline for polling devices during attach and

    [17 lines not shown]
DeltaFile
+80-24sys/dev/tpm/tpm_tis_core.c
+1-0sys/dev/tpm/tpm20.h
+81-242 files

FreeBSD/src 2f85c15 — sys/dev/tpm tpm20.h tpm_tis_core.c

tpm20: Initialize common state before testing TIS interrupts

The TIS attach path tested its interrupt by transmitting GetRandom
before tpm20_init() allocated the internal command buffer.  A TPM2 FIFO
device with a usable IRQ could therefore dereference a null
internal_priv.

Initialize the common TPM2 state before running the interrupt test.
Make common cleanup safe for partially initialized devices and leave
cleanup to the attachment after tpm20_init() fails, avoiding duplicate
release of the lock, command buffer, and random-source state.

Clear the IRQ resource pointer after releasing it when interrupt handler
setup fails so the later polling-mode detach does not release it twice.

Free the internal command allocation through its object pointer rather
than relying on its embedded buffer being the first structure member.

Reviewed by:    kevans

    [4 lines not shown]
DeltaFile
+14-5sys/dev/tpm/tpm20.c
+9-5sys/dev/tpm/tpm_tis_core.c
+1-0sys/dev/tpm/tpm20.h
+24-103 files

FreeBSD/src 7a4e895 — sys/dev/tpm tpm20.h tpm20.c

tpm20: Validate suspend and resume commands

The internal TPM2_Shutdown and TPM2_Startup paths ignored both transport
failures and the TPM response.  Suspend could therefore enter S3 without
saved TPM state, while resume could restart entropy harvesting after a
failed state restoration.

Build both commands through one helper, validate their response framing
and TPM return codes, and propagate failures.  Retry the standard RETRY
and TESTING responses with bounded exponential backoff.  Accept
TPM_RC_INITIALIZE from Startup because firmware may already have started
the TPM during resume.

Do not enter S3 after an unsuccessful state save, and do not restart the
entropy task when TPM state restoration failed.  If Shutdown fails after
the entropy task was drained, requeue it before returning so an aborted
suspend does not permanently stop harvesting.

Reviewed by:    kevans

    [4 lines not shown]
DeltaFile
+102-62sys/dev/tpm/tpm20.c
+2-0sys/dev/tpm/tpm20.h
+104-622 files

FreeBSD/src fdc186e — sys/dev/tpm tpm_if.m tpm20.h

tpm: fix multi-threaded access with per-open state

The TPM driver currently has a single buffer per instance to hold the
result of a command, and does not allow subsequent commands to be sent
until the current result is read by the same OS thread that sent the
command, with a timeout to throw away the result after a while if the
result is not read in a timely fashion.  This has a couple problems:

 - The timeout code has a bug which causes all subsequent commands to
   hang forever if a different OS thread tries to read the result
   before the OS thread which sent the command, and the OS thread
   which sent the command never tries to read the result.

 - Even if the first problem is fixed, applications expect to be able
   to read the result from a different OS thread than the OS thread
   which sent the command. The particular case that we saw was a go
   application where the go runtime scheduled the goroutine which read
   the result to a different OS thread from one where the goroutine
   that sent the command ran, and there's no way to force these to

    [13 lines not shown]
DeltaFile
+46-70sys/dev/tpm/tpm20.c
+14-14sys/dev/tpm/tpm_tis_core.c
+9-10sys/dev/tpm/tpm_crb.c
+7-6sys/dev/tpm/tpm20.h
+5-0sys/dev/tpm/tpm_if.m
+81-1005 files

FreeBSD/src e10bda7 — sys/amd64/conf MINIMAL GENERIC, sys/arm/conf GENERIC

random: TPM_HARVEST should have been named RANDOM_ENABLE_TPM

* Enable RANDOM_ENABLE_TPM by default

* The commit of TPM_HARVEST failed to add it to NOTES
  so that the LINT kernel would build the code.

Fixes: 4ee7d3b0118c82e651712bb65da53d08e78cd7b1
Reviewed by:    imp
Differential Revision:  https://reviews.freebsd.org/D53460

Include the follow-up header guard fix so RANDOM_ENABLE_TPM also
provides the entropy harvest task in struct tpm_sc.

(cherry picked from commit 3deb21f1afd5c4abfd9cb93ca120097a841536c5)
(cherry picked from commit f1b9c1aafd8496c5bfdbc2be57bcfecfe58f12a8)
DeltaFile
+5-5sys/dev/tpm/tpm20.c
+5-1sys/amd64/conf/MINIMAL
+5-1sys/amd64/conf/GENERIC
+4-0sys/riscv/conf/GENERIC
+4-0sys/arm64/conf/std.arm64
+4-0sys/arm/conf/GENERIC
+27-74 files not shown
+32-810 files

FreeBSD/src 6a1b101 — share/man/man4 em.4, sys/dev/e1000 if_em.c

e1000: Configure PCH low-power link modes for suspend

The PCH suspend path kept a wake link fully powered and did not restore
the negotiated EEE modes after its stop-time reset.  Intel provides the
ULP entry and exit machinery in the shared code, but FreeBSD did not
invoke its Sx policy.

Enter ULP on LPT and newer PCH controllers when wake is armed without
directed-unicast, multicast, or broadcast filters, which ULP cannot
preserve.  For a link retained by host wake or management, restore the
100BASE-TX and 1000BASE-T LPI controls selected by the local
advertisement and the cached link-partner ability.

Keep these power reductions best-effort: wake filters and PME are
already configured independently, and a ULP or EEE failure is logged
without converting an optional power optimization into a suspend
failure.  The existing PCH resume workaround forcibly exits ULP and
clears automatic Sx LPI state before normal initialization.


    [11 lines not shown]
DeltaFile
+60-0sys/dev/e1000/if_em.c
+4-1share/man/man4/em.4
+64-12 files