mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 11:25:21 +01:00
Compare commits
56
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
617bf97c01 | ||
|
|
071c535fa2 | ||
|
|
7a83cdcae3 | ||
|
|
6295c65827 | ||
|
|
de070ce817 | ||
|
|
c6445771df | ||
|
|
858fc6e71a | ||
|
|
4bf4c60282 | ||
|
|
e6915a7bae | ||
|
|
38fd5f9ca0 | ||
|
|
0704d8f30b | ||
|
|
f973c27c38 | ||
|
|
ae809ec577 | ||
|
|
5d24d071b4 | ||
|
|
28a86bcb34 | ||
|
|
d336f39894 | ||
|
|
98f9be6299 | ||
|
|
127879c79e | ||
|
|
b87af33c49 | ||
|
|
8ca1e5e8a9 | ||
|
|
a2beabe890 | ||
|
|
86538b9112 | ||
|
|
5de478ffc6 | ||
|
|
7cf8e0dc83 | ||
|
|
a3aad3b17d | ||
|
|
a99194d3fa | ||
|
|
78c3d60fd2 | ||
|
|
208776beed | ||
|
|
27f444ce4d | ||
|
|
5d5eef26f5 | ||
|
|
c35c601593 | ||
|
|
69308a073c | ||
|
|
0c9cec7846 | ||
|
|
11987c4c87 | ||
|
|
49cc5e72fb | ||
|
|
00d8b1e3d8 | ||
|
|
57bff0b0fc | ||
|
|
a19e82db21 | ||
|
|
9e125e1d12 | ||
|
|
65ee15f155 | ||
|
|
d94c62263f | ||
|
|
5b73786f7d | ||
|
|
e6b9965e3f | ||
|
|
9df472ca75 | ||
|
|
f55756b7e4 | ||
|
|
b89c884834 | ||
|
|
da0f09bb1f | ||
|
|
7c1f7e6d34 | ||
|
|
299ba767db | ||
|
|
8da77379a5 | ||
|
|
8c9aa6c38c | ||
|
|
d740e20d96 | ||
|
|
43f072d8f1 | ||
|
|
83d2a5e85c | ||
|
|
dcf3e88028 | ||
|
|
f3563ad3d4 |
No files matched your search
@@ -38,6 +38,11 @@
|
||||
# xargs -n1 | sort | uniq -d;
|
||||
# done
|
||||
|
||||
# 20180613: obsolete libc++ files missed from the 5.0.0 import
|
||||
OLD_FILES+=usr/include/c++/v1/__refstring
|
||||
OLD_FILES+=usr/include/c++/v1/__undef_min_max
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__refstring
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__undef_min_max
|
||||
# 20180513: remove DTrace scripts made obsolete by dwatch(1)
|
||||
OLD_FILES+=usr/share/dtrace/watch_execve
|
||||
OLD_FILES+=usr/share/dtrace/watch_kill
|
||||
|
||||
@@ -16,6 +16,9 @@ from older versions of FreeBSD, try WITHOUT_CLANG and WITH_GCC to bootstrap to
|
||||
the tip of head, and then rebuild without this option. The bootstrap process
|
||||
from older version of current across the gcc/clang cutover is a bit fragile.
|
||||
|
||||
20180627:
|
||||
11.2-RELEASE.
|
||||
|
||||
20180504:
|
||||
The tz database (tzdb) has been updated to 2018e. This version more
|
||||
correctly models time stamps in time zones with negative DST such as
|
||||
|
||||
@@ -62,5 +62,5 @@ static const struct {
|
||||
.descsz = sizeof(int32_t),
|
||||
.type = ABI_NOTETYPE,
|
||||
.name = NOTE_FREEBSD_VENDOR,
|
||||
.desc = __FreeBSD_version
|
||||
.desc = 1102000
|
||||
};
|
||||
@@ -23,18 +23,6 @@
|
||||
# extra-bits-dir, if provided, contains additional files to be merged
|
||||
# into base-bits-dir as part of making the image.
|
||||
|
||||
if [ -z $ETDUMP ]; then
|
||||
ETDUMP=etdump
|
||||
fi
|
||||
|
||||
if [ -z $MAKEFS ]; then
|
||||
MAKEFS=makefs
|
||||
fi
|
||||
|
||||
if [ -z $MKIMG ]; then
|
||||
MKIMG=mkimg
|
||||
fi
|
||||
|
||||
if [ "x$1" = "x-b" ]; then
|
||||
# This is highly x86-centric and will be used directly below.
|
||||
bootable="-o bootimage=i386;$4/boot/cdboot -o no-emul-boot"
|
||||
@@ -67,32 +55,6 @@ NAME="$1"; shift
|
||||
|
||||
publisher="The FreeBSD Project. http://www.FreeBSD.org/"
|
||||
echo "/dev/iso9660/$LABEL / cd9660 ro 0 0" > "$1/etc/fstab"
|
||||
$MAKEFS -t cd9660 $bootable -o rockridge -o label="$LABEL" -o publisher="$publisher" "$NAME" "$@"
|
||||
makefs -t cd9660 $bootable -o rockridge -o label="$LABEL" -o publisher="$publisher" "$NAME" "$@"
|
||||
rm -f "$1/etc/fstab"
|
||||
rm -f efiboot.img
|
||||
|
||||
if [ "$bootable" != "" ]; then
|
||||
# Look for the EFI System Partition image we dropped in the ISO image.
|
||||
for entry in `$ETDUMP --format shell $NAME`; do
|
||||
eval $entry
|
||||
if [ "$et_platform" = "efi" ]; then
|
||||
espstart=`expr $et_lba \* 2048`
|
||||
espsize=`expr $et_sectors \* 512`
|
||||
espparam="-p efi::$espsize:$espstart"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Create a GPT image containing the partitions we need for hybrid boot.
|
||||
imgsize=`stat -f %z $NAME`
|
||||
$MKIMG -s gpt \
|
||||
--capacity $imgsize \
|
||||
-b $4/boot/pmbr \
|
||||
$espparam \
|
||||
-p freebsd-boot:=$4/boot/isoboot \
|
||||
-o hybrid.img
|
||||
|
||||
# Drop the PMBR, GPT, and boot code into the System Area of the ISO.
|
||||
dd if=hybrid.img of=$NAME bs=32k count=1 conv=notrunc
|
||||
rm -f hybrid.img
|
||||
fi
|
||||
@@ -3,6 +3,7 @@
|
||||
RELN_ROOT?= ${.CURDIR}/..
|
||||
|
||||
SUBDIR = relnotes
|
||||
SUBDIR+= installation
|
||||
SUBDIR+= hardware
|
||||
SUBDIR+= readme
|
||||
SUBDIR+= errata
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
<article xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xml:id="top"
|
||||
version="5.0">
|
||||
<info>
|
||||
<title>&os; &release; Errata</title>
|
||||
@@ -56,7 +57,7 @@
|
||||
<title>Introduction</title>
|
||||
|
||||
<para>This errata document contains <quote>late-breaking
|
||||
news</quote> about &os; &release; Before installing this
|
||||
news</quote> about &os; &release;. Before installing this
|
||||
version, it is important to consult this document to learn about
|
||||
any post-release discoveries or problems that may already have
|
||||
been found and fixed.</para>
|
||||
@@ -119,19 +120,6 @@ boot</screen>
|
||||
<programlisting>kern.kstack_pages=4</programlisting>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>[2017-07-21] Due to a bug in earlier versions of
|
||||
&man.clang.1; that is difficult to work around in the
|
||||
upgrade process, to upgrade the system from sources via
|
||||
buildworld to -CURRENT or &release;, it is necessary to
|
||||
upgrade machines running 9.x to at least revision r286035,
|
||||
or machines running 10.x to revision r286033. Source-based
|
||||
upgrades from 10.3-RELEASE are not affected. This differs
|
||||
from the historical situation where one could generally
|
||||
upgrade from anywhere on earlier stable branches, so caution
|
||||
should be exercised.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>[2017-07-25] &os;/&arch.arm64; currently lacks
|
||||
<acronym>EFI</acronym> real-time clock
|
||||
@@ -152,51 +140,6 @@ boot</screen>
|
||||
<para>There currently is no workaround.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>[2017-07-26] Note for those upgrading from 11.1-RC2 in
|
||||
<application>VirtualBox</application>:</para>
|
||||
|
||||
<para>If system panics were experienced when upgrading from
|
||||
11.1-RC1 to 11.1-RC2, and the <filename
|
||||
role="package">emulators/virtualbox-ose-additions{,-nox11}</filename>
|
||||
port was built locally as a resolution, the port will either
|
||||
need to be rebuilt when upgrading from 11.1-RC2 to
|
||||
11.1-RELEASE, or reinstall the package from the pkg(8)
|
||||
mirrors using either:</para>
|
||||
|
||||
<screen> &prompt.root; <userinput>pkg install -f virtualbox-ose-additions</userinput></screen>
|
||||
|
||||
<para>or</para>
|
||||
|
||||
<screen> &prompt.root; <userinput>pkg install -f virtualbox-ose-additions-nox11</userinput></screen>
|
||||
|
||||
<para>To ensure the system does not panic after rebooting into
|
||||
the updated kernel, it is recommended to disable the
|
||||
<literal>vboxguest</literal> service in &man.rc.conf.5;
|
||||
prior to rebooting the system if possible, or use
|
||||
&man.pkg.8; to forcefully reinstall the package.</para>
|
||||
|
||||
<para>Systems being upgraded from 11.1-RC1 and earlier and
|
||||
11.1-RC3 to 11.1-RELEASE should be unaffected.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>[2017-07-27] The release notes erroneously state
|
||||
revision <literal>r315330</literal> was sponsored by Rubicon
|
||||
Communications, LLC (Netgate), when in fact this work was
|
||||
done by Hiroki Mori independently.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>[2017-08-09] The release notes stated the
|
||||
&man.ruptime.1;, &man.rwho.1;, and &man.rwhod.8; utilities
|
||||
have been marked "deprecated", however this change
|
||||
was reversed in 12.0-CURRENT.</para>
|
||||
|
||||
<para>The other utilities mentioned in the entry in the
|
||||
release notes, however, are unchanged.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>[2017-11-06] An issue with &os; virtual machines with
|
||||
<application>vagrant</application> was discovered that
|
||||
@@ -213,6 +156,23 @@ boot</screen>
|
||||
virtual machine to successfully boot, allowing access via
|
||||
<literal>vagrant ssh</literal>.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>[2018-06-21] An issue had been discovered late in the
|
||||
release cycle where removing <acronym>ZFS</acronym> vdevs
|
||||
from a pool under certain conditions would cause a system
|
||||
crash when &man.zfsd.8; is enabled in
|
||||
&man.rc.conf.5;.</para>
|
||||
|
||||
<para>At present, it is believed to be limited to removal of
|
||||
a <literal>mirror</literal> vdev from a pool consisting of
|
||||
multiple <literal>mirror</literal> vdevs.</para>
|
||||
|
||||
<para>See <acronym>PR</acronym> <link
|
||||
xlink:href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=228750">228750</link>
|
||||
for more information and updates as the issue is
|
||||
investigated.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect1>
|
||||
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
%devauto;
|
||||
]>
|
||||
<article xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0">
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xml:id="top"
|
||||
version="5.0">
|
||||
|
||||
<info>
|
||||
<title>&os; &release.current; Hardware Notes</title>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<!ENTITY % release PUBLIC "-//FreeBSD//ENTITIES Release Specification//EN"
|
||||
"http://www.FreeBSD.org/release/XML/share/xml/release.ent">
|
||||
%release;
|
||||
<!ENTITY local.rel "11.1">
|
||||
<!ENTITY local.rel "11.2">
|
||||
]>
|
||||
|
||||
<article xmlns="http://docbook.org/ns/docbook"
|
||||
@@ -82,8 +82,8 @@
|
||||
<para>The &man.freebsd-update.8; utility supports binary
|
||||
upgrades of &arch.i386; and &arch.amd64; systems running
|
||||
earlier FreeBSD releases. Systems running
|
||||
<literal>10.3-RELEASE</literal>,
|
||||
<literal>11.0-RELEASE</literal> can upgrade as follows:</para>
|
||||
<literal>10.4-RELEASE</literal> or
|
||||
<literal>11.1-RELEASE</literal> can upgrade as follows:</para>
|
||||
|
||||
<screen>&prompt.root; freebsd-update fetch
|
||||
&prompt.root; freebsd-update install</screen>
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
End:
|
||||
-->
|
||||
<article xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0">
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xml:id="top"
|
||||
version="5.0">
|
||||
|
||||
<info>
|
||||
<title>&os; &release.current; README</title>
|
||||
@@ -70,7 +72,7 @@
|
||||
&release.current;, the latest point along the &release.branch;
|
||||
branch.</para>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="intro-about">
|
||||
<title>About &os;</title>
|
||||
|
||||
<para>&os; is an operating system based on 4.4 BSD Lite for
|
||||
@@ -107,7 +109,7 @@
|
||||
be quickly installed from the installation program.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="intro-audience">
|
||||
<title>Target Audience</title>
|
||||
|
||||
<para releasetype="current">This &release.type; is aimed
|
||||
@@ -163,7 +165,7 @@
|
||||
complete &os; distribution, rather than updating an existing
|
||||
installation.</para>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="obtain-cd-dvd">
|
||||
<title>CDROM and DVD</title>
|
||||
|
||||
<para>&os; -RELEASE distributions may be ordered on CDROM or DVD
|
||||
@@ -180,7 +182,7 @@
|
||||
&os;</quote></link> appendix to the Handbook.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="obtain-https">
|
||||
<title>HTTPS</title>
|
||||
|
||||
<para>&os; releases may be downloaded via
|
||||
@@ -189,7 +191,7 @@
|
||||
which is the official &os; release site.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="obtain-ftp">
|
||||
<title>FTP</title>
|
||||
|
||||
<para>You can use FTP to retrieve &os; and any or all of its
|
||||
@@ -222,14 +224,14 @@
|
||||
<sect1 xml:id="contacting">
|
||||
<title>Contacting the &os; Project</title>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="contacting-email">
|
||||
<title>Email and Mailing Lists</title>
|
||||
|
||||
<para>For any questions or general technical support issues,
|
||||
please send mail to the &a.questions;.</para>
|
||||
|
||||
<para>If you are tracking the &release.branch; development
|
||||
efforts, you <emphasis>must</emphasis> join the &a.current;,
|
||||
efforts, you <emphasis>must</emphasis> join the &a.stable;,
|
||||
in order to keep abreast of recent developments and changes
|
||||
that may affect the way you use and maintain the
|
||||
system.</para>
|
||||
@@ -265,7 +267,7 @@
|
||||
</important>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="contacting-problem-reports">
|
||||
<title>Submitting Problem Reports</title>
|
||||
|
||||
<para>Suggestions, bug reports and contributions of code are
|
||||
@@ -363,13 +365,13 @@
|
||||
consulted as the <quote>current errata</quote> for this
|
||||
release. These other copies of the errata are located at
|
||||
<uri
|
||||
xlink:href="&url.base;/releases/">&url.base;/releases/</uri>
|
||||
(as well as any sites which keep up-to-date mirrors of this
|
||||
location).</para>
|
||||
xlink:href="&url.base;/releases/">&os; &release.current;
|
||||
page</uri> (as well as any sites which keep up-to-date
|
||||
mirrors of this location).</para>
|
||||
</note>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="manual-pages">
|
||||
<title>Manual Pages</title>
|
||||
|
||||
<para>As with almost all &unix; like operating systems, &os;
|
||||
@@ -387,7 +389,7 @@
|
||||
and &man.style.9; (a style guide to kernel coding).</para>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<sect2 xml:id="books-articles">
|
||||
<title>Books and Articles</title>
|
||||
|
||||
<para>Two highly-useful collections of &os;-related information,
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
<!ENTITY errata SYSTEM "../../share/xml/errata.xml">
|
||||
]>
|
||||
<article xmlns="http://docbook.org/ns/docbook"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0">
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xml:id="top"
|
||||
version="5.0">
|
||||
|
||||
<info>
|
||||
<title>&os; &release.current; Release Notes</title>
|
||||
@@ -156,12 +158,6 @@
|
||||
<para>This section covers changes and additions to userland
|
||||
applications, contributed software, and system utilities.</para>
|
||||
|
||||
<sect2 xml:id="userland-config">
|
||||
<title>Userland Configuration Changes</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-programs">
|
||||
<title>Userland Application Changes</title>
|
||||
|
||||
@@ -337,6 +333,12 @@
|
||||
allow the <literal>@</literal> and <literal>!</literal>
|
||||
characters in the <acronym>GECOS</acronym> field.</para>
|
||||
|
||||
<para revision="330733" contrib="sponsor"
|
||||
sponsor="&spectralogic;">The &man.zfsd.8; utility has been
|
||||
updated to work with any type of <acronym>GEOM</acronym>
|
||||
provider, including &man.md.4;, &man.geli.8;, &man.glabel.8;,
|
||||
and &man.gstripe.8;.</para>
|
||||
|
||||
<para revision="331471">The &man.ps.1; utility has been updated
|
||||
to include a <literal>jail</literal> keyword, which when used
|
||||
will list the name of a &man.jail.8; instead of the numeric
|
||||
@@ -384,6 +386,11 @@
|
||||
that legacy database support will be removed effective
|
||||
&os; 12 when the <literal>-l</literal> flag is
|
||||
used.</para>
|
||||
|
||||
<para revision="334789">The &man.dhclient.8; utility has been
|
||||
updated to allow the <literal>interface-mtu</literal> option
|
||||
to be overridden with a <literal>supersede</literal> entry in
|
||||
&man.dhclient.conf.5;.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-contrib">
|
||||
@@ -392,9 +399,6 @@
|
||||
<para revision="321303">The &man.libarchive.3; library has been
|
||||
updated to version 3.3.2.</para>
|
||||
|
||||
<para revision="322172">The &man.libxo.3; library has been
|
||||
updated to version 0.8.4.</para>
|
||||
|
||||
<para revision="322442"><application>Subversion</application>
|
||||
has been updated to version 1.9.7.</para>
|
||||
|
||||
@@ -441,6 +445,9 @@
|
||||
|
||||
<para revision="333312">Timezone data files have been updated to
|
||||
version 2018e.</para>
|
||||
|
||||
<para revision="334458">The &man.libxo.3; library has been
|
||||
updated to version 0.9.0.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-installer">
|
||||
@@ -451,38 +458,6 @@
|
||||
updated to default to <acronym>UEFI</acronym>-only
|
||||
boot.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-rc">
|
||||
<title><filename class="directory">/etc/rc.d</filename>
|
||||
Scripts</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-periodic">
|
||||
<title><filename class="directory">/etc/periodic</filename>
|
||||
Scripts</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-libraries">
|
||||
<title>Runtime Libraries and API</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-abi">
|
||||
<title>ABI Compatibility</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="userland-debug">
|
||||
<title>Userland Debugging</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="kernel">
|
||||
@@ -495,31 +470,50 @@
|
||||
<sect2 xml:id="kernel-general">
|
||||
<title>General Kernel Changes</title>
|
||||
|
||||
<para> </para>
|
||||
<para revision="321007">The &man.linux.4; <acronym>ABI</acronym>
|
||||
compaibility layer has been updated to include support for
|
||||
<literal>musl</literal> consumers.</para>
|
||||
|
||||
<para revision="322340">The &man.fdescfs.5; filesystem has been
|
||||
updated to support &linux;-specific &man.fd.4;
|
||||
<filename>/dev/fd</filename> and
|
||||
<filename>/proc/self/fd</filename> behavior.</para>
|
||||
|
||||
<para revision="323447">Support for multiple realtime clocks has
|
||||
been added.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="kernel-bugfix">
|
||||
<title>Kernel Bug Fixes</title>
|
||||
|
||||
<para> </para>
|
||||
<para revision="324175">The &man.ng.iface.4; driver has been
|
||||
updated to prevent a possible system crash.</para>
|
||||
|
||||
<para revision="325730">The &man.ipfw.4; packet filter has been
|
||||
updated to identify layer-2 and layer-3 packets, fixing
|
||||
&man.dummynet.4; <acronym>AQM</acronym> packet marking.</para>
|
||||
|
||||
<para revision="333166">An issue causing boot issues with
|
||||
&intel; Apollo Lake™ <acronym>CPU</acronym>s has been
|
||||
fixed.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="kernel-config">
|
||||
<title>Kernel Configuration</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="kernel-modules">
|
||||
<title>Kernel Modules</title>
|
||||
|
||||
<para> </para>
|
||||
<para revision="327920">The &man.watchdog.4; facility has been
|
||||
updated to make <literal>SW_WATCHDOG</literal> dynamic,
|
||||
enabling the software &man.watchdogd.8; option whenever
|
||||
a hardware watchdog is not present.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="kernel-sysctl">
|
||||
<title>System Tuning and Controls</title>
|
||||
|
||||
<para> </para>
|
||||
<para revision="326322" contrib="sponsor"
|
||||
sponsor="&spectralogic;">The
|
||||
<literal>p1003_1b.aio_listio_max</literal> &man.sysctl.8; has
|
||||
been changed to a runtime-configurable tunable.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
@@ -532,27 +526,56 @@
|
||||
<sect2 xml:id="drivers-device">
|
||||
<title>Device Drivers</title>
|
||||
|
||||
<para revision="330307" contrib="sponsor"
|
||||
sponsor="&chelsio;">The &man.cxgbe.4; driver has been updated
|
||||
to firmware version 1.16.63.0 for T4, T5, and T6 network
|
||||
adapters.</para>
|
||||
|
||||
<para revision="331058">The &man.ng.pppoe.4; driver has been
|
||||
updated to add support for user-supplied
|
||||
<literal>Host-Uniq</literal> tags.</para>
|
||||
|
||||
<para revision="331500">Support for the TAIO
|
||||
<acronym>USB</acronym> multi-protocol adapter
|
||||
(<acronym>TUMPA</acronym>) has been added.</para>
|
||||
|
||||
<para revision="331586" contrib="sponsor"
|
||||
sponsor="&mellanox;">The &man.mlx5io.4; driver has been added,
|
||||
providing an interface to manage supported Connect-X 4
|
||||
and Connect-X 5 network adapters.</para>
|
||||
|
||||
<para revision="330307" contrib="sponsor"
|
||||
sponsor="&chelsio;">The &man.cxgbe.4; driver has been updated
|
||||
to firmware version 1.16.63.0 for T4, T5, and T6 network
|
||||
adapters.</para>
|
||||
</sect2>
|
||||
<para revision="331882" contrib="sponsor"
|
||||
sponsor="&darpa_afrl;">The &man.cm.4; and &man.fpa.4; drivers
|
||||
have been marked as deprecated, and will be removed in
|
||||
&os; 12.</para>
|
||||
|
||||
<sect2 xml:id="drivers-storage">
|
||||
<title>Storage Drivers</title>
|
||||
<para revision="332040" contrib="sponsor"
|
||||
sponsor="&broadcom;">The &man.ocs.fc.4; driver has been added,
|
||||
supporting Emulex 16/8G FC GEN 5
|
||||
<acronym>HBA</acronym>s LPe15004 and LPe160XX, and
|
||||
Emulex 32/16G FC GEN 6
|
||||
<acronym>HBA</acronym>s LPe3100X and LPe3200X.</para>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
<para revision="333171">The &man.ixgb.4; driver has been marked
|
||||
as deprecated, and will be removed in &os; 12.</para>
|
||||
|
||||
<sect2 xml:id="drivers-network">
|
||||
<title>Network Drivers</title>
|
||||
<para revision="333343" contrib="sponsor"
|
||||
sponsor="&intelcorp;">The &man.ixl.4; driver has been updated
|
||||
to version 1.9.9-k.</para>
|
||||
|
||||
<para> </para>
|
||||
<para revision="333367">The &man.nxge.4; driver has been marked
|
||||
as deprecated, and will be removed in &os; 12.</para>
|
||||
|
||||
<para revision="333412" contrib="sponsor" sponsor="&ff;">The
|
||||
&man.lmc.4; driver has been marked as deprecated, and will be
|
||||
removed in &os; 12.</para>
|
||||
|
||||
<para revision="333417">The &man.smartpqi.4; driver has been
|
||||
added, providing support for Microsemi®
|
||||
<acronym>SCSI</acronym> controllers.</para>
|
||||
|
||||
<para revision="333738">The &man.vxge.4; driver has been marked
|
||||
as deprecated, and will be removed in &os; 12.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
@@ -564,44 +587,12 @@
|
||||
as hardware changes and updates that do not otherwise fit in
|
||||
other sections of this document.</para>
|
||||
|
||||
<sect2 xml:id="hardware-support">
|
||||
<title>Hardware Support</title>
|
||||
|
||||
<para revision="331500">Support for the TAIO
|
||||
<acronym>USB</acronym> multi-protocol adapter
|
||||
(<acronym>TUMPA</acronym>) has been added.</para>
|
||||
|
||||
<para revision="331882" contrib="sponsor"
|
||||
sponsor="&darpa_afrl;">The &man.cm.4; and &man.fpa.4; drivers
|
||||
have been marked as deprecated, and will be removed in
|
||||
&os; 12.</para>
|
||||
|
||||
<para revision="333171">The &man.ixgb.4; driver has been marked
|
||||
as deprecated, and will be removed in &os; 12.</para>
|
||||
|
||||
<para revision="333367">The &man.nxge.4; driver has been marked
|
||||
as deprecated, and will be removed in &os; 12.</para>
|
||||
|
||||
<para revision="333412" contrib="sponsor" sponsor="&ff;">The
|
||||
&man.lmc.4; driver has been marked as deprecated, and will be
|
||||
removed in &os; 12.</para>
|
||||
|
||||
<para revision="333738">The &man.vxge.4; driver has been marked
|
||||
as deprecated, and will be removed in &os; 12.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="hardware-virtualization">
|
||||
<title>Virtualization Support</title>
|
||||
|
||||
<para revision="321413">Support for &man.virtio.console.4; has
|
||||
been added to &man.bhyve.4;.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="hardware-arm">
|
||||
<title>ARM Support</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="storage">
|
||||
@@ -610,24 +601,6 @@
|
||||
<para>This section covers changes and additions to file systems
|
||||
and other storage subsystems, both local and networked.</para>
|
||||
|
||||
<sect2 xml:id="storage-general">
|
||||
<title>General Storage</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="storage-net">
|
||||
<title>Networked Storage</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="storage-zfs">
|
||||
<title>ZFS</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="storage-geom">
|
||||
<title><literal>geom(4)</literal></title>
|
||||
|
||||
@@ -650,17 +623,21 @@
|
||||
<sect2 xml:id="boot-loader">
|
||||
<title>Boot Loader Changes</title>
|
||||
|
||||
<para revision="321519">The boot code and &man.loader.8; have
|
||||
been updated to check for unsupported <acronym>ZFS</acronym>
|
||||
feature flags. If unsupported features are active, the pool
|
||||
is not considered as a bootable pool, and a diagnostic message
|
||||
is printed to the console.</para>
|
||||
|
||||
<para revision="329010">The &man.loader.8; has been updated to
|
||||
improve quotation parsing, distinguishing between single- and
|
||||
double-quotes, and check for terminating quotes.</para>
|
||||
|
||||
<para revision="329114">The length of <acronym>GELI</acronym>
|
||||
passphrases entered when booting a system with encrypted disks
|
||||
is now hidden by default. See the configuration options in
|
||||
&man.geli.8; to restore the previous behavior.</para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="boot-menu">
|
||||
<title>Boot Menu Changes</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="network">
|
||||
@@ -672,13 +649,9 @@
|
||||
<sect2 xml:id="network-general">
|
||||
<title>General Network Changes</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="network-protocols">
|
||||
<title>Network Protocols</title>
|
||||
|
||||
<para> </para>
|
||||
<para revision="329581" contrib="sponsor"
|
||||
sponsor="&dellemc;">The &man.icmp6.4; protocol has been
|
||||
updated to fix <acronym>ICMPv6</acronym> redirects.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
@@ -689,35 +662,11 @@
|
||||
Collection, package infrastructure, and package maintenance and
|
||||
installation tools.</para>
|
||||
|
||||
<sect2 xml:id="ports-infrastructure">
|
||||
<title>Infrastructure Changes</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="ports-packages ">
|
||||
<title>Packaging Changes</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="doc">
|
||||
<title>Documentation</title>
|
||||
|
||||
<para>This section covers changes to the &os; Documentation
|
||||
Project sources and toolchain.</para>
|
||||
|
||||
<sect2 xml:id="doc-sources">
|
||||
<title>Documentation Source Changes</title>
|
||||
|
||||
<para> </para>
|
||||
</sect2>
|
||||
|
||||
<sect2 xml:id="doc-toolchain">
|
||||
<title>Documentation Toolchain Changes</title>
|
||||
|
||||
<para> </para>
|
||||
<para>The &man.pkg.8; utility has been updated to version
|
||||
1.10.5.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
@@ -736,18 +685,16 @@
|
||||
EC2™ infrastructure.</para>
|
||||
|
||||
<para revision="333410" contrib="sponsor" sponsor="&ff;">The
|
||||
&arch.i386; memory stick image installer have been changed
|
||||
&arch.i386; memory stick image installers have been changed
|
||||
to use the <acronym>MBR</acronym> partitioning scheme, which
|
||||
addresses a boot issue from a <acronym>GPT</acronym> partition
|
||||
scheme in non-<acronym>UEFI</acronym> mode.</para>
|
||||
|
||||
<para revision="333006" contrib="sponsor" sponsor="&ix;">The
|
||||
&os; installation <acronym>ISO</acronym> medium creation tools
|
||||
have been updated to generate hybrid images for &arch.amd64;,
|
||||
supporting both <acronym>BIOS</acronym> and
|
||||
<acronym>EFI</acronym>. The <acronym>ISO</acronym> image can
|
||||
now be written to a memory stick as well as being used as
|
||||
a <acronym>CD</acronym> image.</para>
|
||||
<para revision="334444" contrib="sponsor" sponsor="&ff;">The
|
||||
&arch.amd64; memory stick image installers have been changed
|
||||
to use the <acronym>MBR</acronym> partitioning scheme, which
|
||||
addresses a boot issue from a <acronym>GPT</acronym> partition
|
||||
scheme in non-<acronym>UEFI</acronym> mode.</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
</article>
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<!-- Version of the OS we're describing. This needs to be updated
|
||||
with each new release. -->
|
||||
<!ENTITY release.current "11.1-STABLE">
|
||||
<!ENTITY release.current "11.2-RELEASE">
|
||||
|
||||
<!-- The previous version used for comparison in the "What's New"
|
||||
section. For -CURRENT, we might point back to the last
|
||||
@@ -16,16 +16,16 @@
|
||||
<!-- The previous stable release, useful for pointing user's at the
|
||||
release they SHOULD be running if they don't want the bleeding
|
||||
edge. -->
|
||||
<!ENTITY release.prev.stable "10.3-RELEASE">
|
||||
<!ENTITY release.prev.stable "10.4-RELEASE">
|
||||
|
||||
<!-- The next version to be released, usually used for snapshots. -->
|
||||
<!ENTITY release.next "11.2-RELEASE">
|
||||
<!ENTITY release.next "11.3-RELEASE">
|
||||
|
||||
<!-- The name of this branch. -->
|
||||
<!ENTITY release.branch "11.1-STABLE">
|
||||
<!ENTITY release.branch "11.2-STABLE">
|
||||
|
||||
<!-- The URL for obtaining this version of FreeBSD. -->
|
||||
<!ENTITY release.url "https://www.FreeBSD.org/snapshots/">
|
||||
<!ENTITY release.url "https://www.FreeBSD.org/releases/">
|
||||
|
||||
<!-- The URL for Security Advisories and Errata Notices. -->
|
||||
<!ENTITY security.url "https://www.FreeBSD.org/security/advisories">
|
||||
@@ -37,10 +37,10 @@
|
||||
or "release" -->
|
||||
<!-- WARNING: Do not forget to also change the release type in
|
||||
doc.relnotes.mk when updating this -->
|
||||
<!ENTITY release.type "snapshot">
|
||||
<!ENTITY release.type "release">
|
||||
<!ENTITY % release.type.current "IGNORE">
|
||||
<!ENTITY % release.type.snapshot "INCLUDE">
|
||||
<!ENTITY % release.type.release "IGNORE">
|
||||
<!ENTITY % release.type.snapshot "IGNORE">
|
||||
<!ENTITY % release.type.release "INCLUDE">
|
||||
|
||||
<![%release.type.current;[
|
||||
<!ENTITY release '&release.current;'>
|
||||
@@ -55,10 +55,10 @@
|
||||
|
||||
<!-- The manpaths for man page references -->
|
||||
<!ENTITY release.man.url "https://www.FreeBSD.org/cgi/man.cgi">
|
||||
<!ENTITY release.manpath.xorg "7.5.1">
|
||||
<!ENTITY release.manpath.xorg "7.7">
|
||||
<!ENTITY release.manpath.netbsd "5.1">
|
||||
<!ENTITY release.manpath.freebsd-ports "Ports">
|
||||
<!ENTITY release.manpath.freebsd "11-current">
|
||||
<!ENTITY release.manpath.freebsd "11.2-RELEASE">
|
||||
|
||||
<!-- Text constants which probably don't need to be changed.-->
|
||||
|
||||
|
||||
@@ -84,10 +84,9 @@
|
||||
<para>Speculative Execution Vulnerabilities</para>
|
||||
<note>
|
||||
<para>This advisory addresses the most significant issues
|
||||
for &os; 11.1 on &arch.amd64; CPUs. We expect to
|
||||
update this advisory to include 10.x for &arch.amd64;
|
||||
CPUs. Future &os; releases will address this issue on
|
||||
&arch.i386; and other CPUs.</para>
|
||||
for &os; 11.x on &arch.amd64; CPUs. We expect to
|
||||
update this advisory to include &arch.i386; and other
|
||||
CPUs.</para>
|
||||
</note>
|
||||
</entry>
|
||||
</row>
|
||||
@@ -114,6 +113,14 @@
|
||||
<entry><para>Mishandling of x86 debug
|
||||
exceptions</para></entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><link
|
||||
xlink:href="&security.url;/FreeBSD-SA-18:07.lazyfpu.asc">FreeBSD-SA-18:07.lazyfpu</link></entry>
|
||||
<entry>21 June 2018</entry>
|
||||
<entry><para>Fix Lazy <acronym>FPU</acronym> information
|
||||
disclosure</para></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
@@ -1,6 +1,6 @@
|
||||
# $FreeBSD$
|
||||
release: {
|
||||
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
|
||||
url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
|
||||
mirror_type: "srv",
|
||||
signature_type: "fingerprints",
|
||||
fingerprints: "/usr/share/keys/pkg",
|
||||
|
||||
@@ -828,11 +828,23 @@ bind_lease(struct interface_info *ip)
|
||||
|
||||
opt = &ip->client->new->options[DHO_INTERFACE_MTU];
|
||||
if (opt->len == sizeof(u_int16_t)) {
|
||||
u_int16_t mtu = be16dec(opt->data);
|
||||
if (mtu < MIN_MTU)
|
||||
warning("mtu size %u < %d: ignored", (unsigned)mtu, MIN_MTU);
|
||||
u_int16_t mtu = 0;
|
||||
bool supersede = (ip->client->config->default_actions[DHO_INTERFACE_MTU] ==
|
||||
ACTION_SUPERSEDE);
|
||||
|
||||
if (supersede)
|
||||
mtu = getUShort(ip->client->config->defaults[DHO_INTERFACE_MTU].data);
|
||||
else
|
||||
mtu = be16dec(opt->data);
|
||||
|
||||
if (mtu < MIN_MTU) {
|
||||
/* Treat 0 like a user intentionally doesn't want to change MTU and,
|
||||
* therefore, warning is not needed */
|
||||
if (!supersede || mtu != 0)
|
||||
warning("mtu size %u < %d: ignored", (unsigned)mtu, MIN_MTU);
|
||||
} else {
|
||||
interface_set_mtu_unpriv(privfd, mtu);
|
||||
}
|
||||
}
|
||||
|
||||
/* Write out the new lease. */
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd January 1, 1997
|
||||
.Dd May 31, 2018
|
||||
.Dt DHCLIENT.CONF 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
@@ -227,6 +227,14 @@ rather than any value supplied by the server, these values can be defined
|
||||
in the
|
||||
.Ic supersede
|
||||
statement.
|
||||
.Pp
|
||||
Some options values have special meaning:
|
||||
.Bl -tag -width indent
|
||||
.It Ar interface-mtu
|
||||
Any server-supplied interface MTU is ignored by the client if a
|
||||
.Ic supersede
|
||||
zero value is configured.
|
||||
.El
|
||||
.It Xo
|
||||
.Ic prepend No { Op Ar option declaration
|
||||
.Oo , Ar ... option declaration Oc }
|
||||
|
||||
@@ -128,10 +128,10 @@ done_store_dr:
|
||||
|
||||
/* have we used fp, and need a save? */
|
||||
cmpq %rdi,PCPU(FPCURTHREAD)
|
||||
jne 3f
|
||||
jne 2f
|
||||
movq PCB_SAVEFPU(%r8),%r8
|
||||
clts
|
||||
cmpl $0,use_xsave
|
||||
cmpl $0,use_xsave(%rip)
|
||||
jne 1f
|
||||
fxsave (%r8)
|
||||
jmp 2f
|
||||
@@ -143,12 +143,7 @@ ctx_switch_xsave:
|
||||
/* This is patched to xsaveopt if supported, see fpuinit_bsp1() */
|
||||
xsave (%r8)
|
||||
movq %rcx,%rdx
|
||||
2: smsw %ax
|
||||
orb $CR0_TS,%al
|
||||
lmsw %ax
|
||||
xorl %eax,%eax
|
||||
movq %rax,PCPU(FPCURTHREAD)
|
||||
3:
|
||||
2:
|
||||
/* Save is done. Now fire up new thread. Leave old vmspace. */
|
||||
movq %rsi,%r12
|
||||
movq %rdi,%r13
|
||||
@@ -235,6 +230,8 @@ done_load_dr:
|
||||
movq PCB_RBX(%r8),%rbx
|
||||
movq PCB_RIP(%r8),%rax
|
||||
movq %rax,(%rsp)
|
||||
movq PCPU(CURTHREAD),%rdi
|
||||
call fpu_activate_sw
|
||||
ret
|
||||
|
||||
/*
|
||||
|
||||
+76
-40
@@ -139,6 +139,11 @@ static void fpu_clean_state(void);
|
||||
SYSCTL_INT(_hw, HW_FLOATINGPT, floatingpoint, CTLFLAG_RD,
|
||||
SYSCTL_NULL_INT_PTR, 1, "Floating point instructions executed in hardware");
|
||||
|
||||
int lazy_fpu_switch = 0;
|
||||
SYSCTL_INT(_hw, OID_AUTO, lazy_fpu_switch, CTLFLAG_RWTUN | CTLFLAG_NOFETCH,
|
||||
&lazy_fpu_switch, 0,
|
||||
"Lazily load FPU context after context switch");
|
||||
|
||||
int use_xsave; /* non-static for cpu_switch.S */
|
||||
uint64_t xsave_mask; /* the same */
|
||||
static uma_zone_t fpu_save_area_zone;
|
||||
@@ -204,6 +209,7 @@ fpuinit_bsp1(void)
|
||||
u_int cp[4];
|
||||
uint64_t xsave_mask_user;
|
||||
|
||||
TUNABLE_INT_FETCH("hw.lazy_fpu_switch", &lazy_fpu_switch);
|
||||
if ((cpu_feature2 & CPUID2_XSAVE) != 0) {
|
||||
use_xsave = 1;
|
||||
TUNABLE_INT_FETCH("hw.use_xsave", &use_xsave);
|
||||
@@ -612,6 +618,45 @@ fputrap_sse(void)
|
||||
return (fpetable[(mxcsr & (~mxcsr >> 7)) & 0x3f]);
|
||||
}
|
||||
|
||||
static void
|
||||
restore_fpu_curthread(struct thread *td)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
/*
|
||||
* Record new context early in case frstor causes a trap.
|
||||
*/
|
||||
PCPU_SET(fpcurthread, td);
|
||||
|
||||
stop_emulating();
|
||||
fpu_clean_state();
|
||||
pcb = td->td_pcb;
|
||||
|
||||
if ((pcb->pcb_flags & PCB_FPUINITDONE) == 0) {
|
||||
/*
|
||||
* This is the first time this thread has used the FPU or
|
||||
* the PCB doesn't contain a clean FPU state. Explicitly
|
||||
* load an initial state.
|
||||
*
|
||||
* We prefer to restore the state from the actual save
|
||||
* area in PCB instead of directly loading from
|
||||
* fpu_initialstate, to ignite the XSAVEOPT
|
||||
* tracking engine.
|
||||
*/
|
||||
bcopy(fpu_initialstate, pcb->pcb_save,
|
||||
cpu_max_ext_state_size);
|
||||
fpurestore(pcb->pcb_save);
|
||||
if (pcb->pcb_initial_fpucw != __INITIAL_FPUCW__)
|
||||
fldcw(pcb->pcb_initial_fpucw);
|
||||
if (PCB_USER_FPU(pcb))
|
||||
set_pcb_flags(pcb, PCB_FPUINITDONE |
|
||||
PCB_USERFPUINITDONE);
|
||||
else
|
||||
set_pcb_flags(pcb, PCB_FPUINITDONE);
|
||||
} else
|
||||
fpurestore(pcb->pcb_save);
|
||||
}
|
||||
|
||||
/*
|
||||
* Device Not Available (DNA, #NM) exception handler.
|
||||
*
|
||||
@@ -622,7 +667,9 @@ fputrap_sse(void)
|
||||
void
|
||||
fpudna(void)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
td = curthread;
|
||||
/*
|
||||
* This handler is entered with interrupts enabled, so context
|
||||
* switches may occur before critical_enter() is executed. If
|
||||
@@ -636,51 +683,40 @@ fpudna(void)
|
||||
|
||||
KASSERT((curpcb->pcb_flags & PCB_FPUNOSAVE) == 0,
|
||||
("fpudna while in fpu_kern_enter(FPU_KERN_NOCTX)"));
|
||||
if (PCPU_GET(fpcurthread) == curthread) {
|
||||
printf("fpudna: fpcurthread == curthread\n");
|
||||
stop_emulating();
|
||||
critical_exit();
|
||||
return;
|
||||
}
|
||||
if (PCPU_GET(fpcurthread) != NULL) {
|
||||
panic("fpudna: fpcurthread = %p (%d), curthread = %p (%d)\n",
|
||||
PCPU_GET(fpcurthread), PCPU_GET(fpcurthread)->td_tid,
|
||||
curthread, curthread->td_tid);
|
||||
}
|
||||
stop_emulating();
|
||||
/*
|
||||
* Record new context early in case frstor causes a trap.
|
||||
*/
|
||||
PCPU_SET(fpcurthread, curthread);
|
||||
|
||||
fpu_clean_state();
|
||||
|
||||
if ((curpcb->pcb_flags & PCB_FPUINITDONE) == 0) {
|
||||
if (__predict_false(PCPU_GET(fpcurthread) == td)) {
|
||||
/*
|
||||
* This is the first time this thread has used the FPU or
|
||||
* the PCB doesn't contain a clean FPU state. Explicitly
|
||||
* load an initial state.
|
||||
*
|
||||
* We prefer to restore the state from the actual save
|
||||
* area in PCB instead of directly loading from
|
||||
* fpu_initialstate, to ignite the XSAVEOPT
|
||||
* tracking engine.
|
||||
* Some virtual machines seems to set %cr0.TS at
|
||||
* arbitrary moments. Silently clear the TS bit
|
||||
* regardless of the eager/lazy FPU context switch
|
||||
* mode.
|
||||
*/
|
||||
bcopy(fpu_initialstate, curpcb->pcb_save,
|
||||
cpu_max_ext_state_size);
|
||||
fpurestore(curpcb->pcb_save);
|
||||
if (curpcb->pcb_initial_fpucw != __INITIAL_FPUCW__)
|
||||
fldcw(curpcb->pcb_initial_fpucw);
|
||||
if (PCB_USER_FPU(curpcb))
|
||||
set_pcb_flags(curpcb,
|
||||
PCB_FPUINITDONE | PCB_USERFPUINITDONE);
|
||||
else
|
||||
set_pcb_flags(curpcb, PCB_FPUINITDONE);
|
||||
} else
|
||||
fpurestore(curpcb->pcb_save);
|
||||
stop_emulating();
|
||||
} else {
|
||||
if (__predict_false(PCPU_GET(fpcurthread) != NULL)) {
|
||||
panic(
|
||||
"fpudna: fpcurthread = %p (%d), curthread = %p (%d)\n",
|
||||
PCPU_GET(fpcurthread),
|
||||
PCPU_GET(fpcurthread)->td_tid, td, td->td_tid);
|
||||
}
|
||||
restore_fpu_curthread(td);
|
||||
}
|
||||
critical_exit();
|
||||
}
|
||||
|
||||
void fpu_activate_sw(struct thread *td); /* Called from the context switch */
|
||||
void
|
||||
fpu_activate_sw(struct thread *td)
|
||||
{
|
||||
|
||||
if (lazy_fpu_switch || (td->td_pflags & TDP_KTHREAD) != 0 ||
|
||||
!PCB_USER_FPU(td->td_pcb)) {
|
||||
PCPU_SET(fpcurthread, NULL);
|
||||
start_emulating();
|
||||
} else if (PCPU_GET(fpcurthread) != td) {
|
||||
restore_fpu_curthread(td);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
fpudrop(void)
|
||||
{
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@
|
||||
|
||||
TYPE="FreeBSD"
|
||||
REVISION="11.2"
|
||||
BRANCH="BETA3"
|
||||
BRANCH="RELEASE"
|
||||
if [ -n "${BRANCH_OVERRIDE}" ]; then
|
||||
BRANCH=${BRANCH_OVERRIDE}
|
||||
fi
|
||||
|
||||
@@ -162,6 +162,7 @@ enum {
|
||||
|
||||
/* port flags */
|
||||
HAS_TRACEQ = (1 << 3),
|
||||
FIXED_IFMEDIA = (1 << 4), /* ifmedia list doesn't change. */
|
||||
|
||||
/* VI flags */
|
||||
DOOMED = (1 << 0),
|
||||
|
||||
@@ -413,12 +413,12 @@ struct link_config {
|
||||
unsigned char requested_aneg; /* link aneg user has requested */
|
||||
unsigned char requested_fc; /* flow control user has requested */
|
||||
unsigned char requested_fec; /* FEC user has requested */
|
||||
unsigned int requested_speed; /* speed user has requested */
|
||||
unsigned int requested_speed; /* speed user has requested (Mbps) */
|
||||
|
||||
unsigned short supported; /* link capabilities */
|
||||
unsigned short advertising; /* advertised capabilities */
|
||||
unsigned short lp_advertising; /* peer advertised capabilities */
|
||||
unsigned int speed; /* actual link speed */
|
||||
unsigned int speed; /* actual link speed (Mbps) */
|
||||
unsigned char fc; /* actual link flow control */
|
||||
unsigned char fec; /* actual FEC */
|
||||
unsigned char link_ok; /* link up? */
|
||||
|
||||
@@ -3725,21 +3725,24 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port,
|
||||
lc->requested_aneg == AUTONEG_DISABLE) {
|
||||
aneg = 0;
|
||||
switch (lc->requested_speed) {
|
||||
case 100:
|
||||
case 100000:
|
||||
speed = FW_PORT_CAP_SPEED_100G;
|
||||
break;
|
||||
case 40:
|
||||
case 40000:
|
||||
speed = FW_PORT_CAP_SPEED_40G;
|
||||
break;
|
||||
case 25:
|
||||
case 25000:
|
||||
speed = FW_PORT_CAP_SPEED_25G;
|
||||
break;
|
||||
case 10:
|
||||
case 10000:
|
||||
speed = FW_PORT_CAP_SPEED_10G;
|
||||
break;
|
||||
case 1:
|
||||
case 1000:
|
||||
speed = FW_PORT_CAP_SPEED_1G;
|
||||
break;
|
||||
case 100:
|
||||
speed = FW_PORT_CAP_SPEED_100M;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
break;
|
||||
@@ -7713,9 +7716,9 @@ static void handle_port_info(struct port_info *pi, const struct fw_port_info *p)
|
||||
|
||||
fec = 0;
|
||||
if (lc->advertising & FW_PORT_CAP_FEC_RS)
|
||||
fec |= FEC_RS;
|
||||
if (lc->advertising & FW_PORT_CAP_FEC_BASER_RS)
|
||||
fec |= FEC_BASER_RS;
|
||||
fec = FEC_RS;
|
||||
else if (lc->advertising & FW_PORT_CAP_FEC_BASER_RS)
|
||||
fec = FEC_BASER_RS;
|
||||
lc->fec = fec;
|
||||
}
|
||||
|
||||
@@ -7776,14 +7779,16 @@ int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl)
|
||||
}
|
||||
|
||||
lc = &pi->link_cfg;
|
||||
PORT_LOCK(pi);
|
||||
old_lc = &pi->old_link_cfg;
|
||||
old_ptype = pi->port_type;
|
||||
old_mtype = pi->mod_type;
|
||||
|
||||
handle_port_info(pi, &p->u.info);
|
||||
PORT_UNLOCK(pi);
|
||||
if (old_ptype != pi->port_type || old_mtype != pi->mod_type) {
|
||||
t4_os_portmod_changed(pi);
|
||||
}
|
||||
PORT_LOCK(pi);
|
||||
if (old_lc->link_ok != lc->link_ok ||
|
||||
old_lc->speed != lc->speed ||
|
||||
old_lc->fec != lc->fec ||
|
||||
@@ -7791,6 +7796,7 @@ int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl)
|
||||
t4_os_link_changed(pi);
|
||||
*old_lc = *lc;
|
||||
}
|
||||
PORT_UNLOCK(pi);
|
||||
} else {
|
||||
CH_WARN_RATELIMIT(adap, "Unknown firmware reply %d\n", opcode);
|
||||
return -EINVAL;
|
||||
@@ -7903,6 +7909,44 @@ int t4_get_flash_params(struct adapter *adapter)
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x9d: { /* ISSI -- Integrated Silicon Solution, Inc. */
|
||||
/*
|
||||
* This Density -> Size decoding table is taken from ISSI
|
||||
* Data Sheets.
|
||||
*/
|
||||
density = (flashid >> 16) & 0xff;
|
||||
switch (density) {
|
||||
case 0x16: size = 1 << 25; break; /* 32MB */
|
||||
case 0x17: size = 1 << 26; break; /* 64MB */
|
||||
|
||||
default:
|
||||
CH_ERR(adapter, "ISSI Flash Part has bad size, "
|
||||
"ID = %#x, Density code = %#x\n",
|
||||
flashid, density);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xc2: { /* Macronix */
|
||||
/*
|
||||
* This Density -> Size decoding table is taken from Macronix
|
||||
* Data Sheets.
|
||||
*/
|
||||
density = (flashid >> 16) & 0xff;
|
||||
switch (density) {
|
||||
case 0x17: size = 1 << 23; break; /* 8MB */
|
||||
case 0x18: size = 1 << 24; break; /* 16MB */
|
||||
|
||||
default:
|
||||
CH_ERR(adapter, "Macronix Flash Part has bad size, "
|
||||
"ID = %#x, Density code = %#x\n",
|
||||
flashid, density);
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 0xef: { /* Winbond */
|
||||
/*
|
||||
* This Density -> Size decoding table is taken from Winbond
|
||||
|
||||
+424
-269
@@ -376,9 +376,10 @@ int t4_intr_types = INTR_MSIX | INTR_MSI | INTR_INTX;
|
||||
TUNABLE_INT("hw.cxgbe.interrupt_types", &t4_intr_types);
|
||||
|
||||
/*
|
||||
* Configuration file.
|
||||
* Configuration file. All the _CF names here are special.
|
||||
*/
|
||||
#define DEFAULT_CF "default"
|
||||
#define BUILTIN_CF "built-in"
|
||||
#define FLASH_CF "flash"
|
||||
#define UWIRE_CF "uwire"
|
||||
#define FPGA_CF "fpga"
|
||||
@@ -528,6 +529,7 @@ static int set_params__post_init(struct adapter *);
|
||||
static void t4_set_desc(struct adapter *);
|
||||
static void build_medialist(struct port_info *, struct ifmedia *);
|
||||
static void init_l1cfg(struct port_info *);
|
||||
static int apply_l1cfg(struct port_info *);
|
||||
static int cxgbe_init_synchronized(struct vi_info *);
|
||||
static int cxgbe_uninit_synchronized(struct vi_info *);
|
||||
static void quiesce_txq(struct adapter *, struct sge_txq *);
|
||||
@@ -659,16 +661,10 @@ struct {
|
||||
{0x5412, "Chelsio T560-CR"}, /* 1 x 40G, 2 x 10G */
|
||||
{0x5414, "Chelsio T580-LP-SO-CR"}, /* 2 x 40G, nomem */
|
||||
{0x5415, "Chelsio T502-BT"}, /* 2 x 1G */
|
||||
#ifdef notyet
|
||||
{0x5404, "Chelsio T520-BCH"},
|
||||
{0x5405, "Chelsio T540-BCH"},
|
||||
{0x5406, "Chelsio T540-CH"},
|
||||
{0x5408, "Chelsio T520-CX"},
|
||||
{0x540b, "Chelsio B520-SR"},
|
||||
{0x540c, "Chelsio B504-BT"},
|
||||
{0x540f, "Chelsio Amsterdam"},
|
||||
{0x5413, "Chelsio T580-CHR"},
|
||||
#endif
|
||||
{0x5418, "Chelsio T540-BT"}, /* 4 x 10GBaseT */
|
||||
{0x5419, "Chelsio T540-LP-BT"}, /* 4 x 10GBaseT */
|
||||
{0x541a, "Chelsio T540-SO-BT"}, /* 4 x 10GBaseT, nomem */
|
||||
{0x541b, "Chelsio T540-SO-CR"}, /* 4 x 10G, nomem */
|
||||
}, t6_pciids[] = {
|
||||
{0xc006, "Chelsio Terminator 6 FPGA"}, /* T6 PE10K6 FPGA (PF0) */
|
||||
{0x6400, "Chelsio T6-DBG-25"}, /* 2 x 10/25G, debug */
|
||||
@@ -688,9 +684,14 @@ struct {
|
||||
{0x6415, "Chelsio T6201-BT"}, /* 2 x 1000BASE-T */
|
||||
|
||||
/* Custom */
|
||||
{0x6480, "Chelsio T6225 80"},
|
||||
{0x6481, "Chelsio T62100 81"},
|
||||
{0x6484, "Chelsio T62100 84"},
|
||||
{0x6480, "Custom T6225-CR"},
|
||||
{0x6481, "Custom T62100-CR"},
|
||||
{0x6482, "Custom T6225-CR"},
|
||||
{0x6483, "Custom T62100-CR"},
|
||||
{0x6484, "Custom T64100-CR"},
|
||||
{0x6485, "Custom T6240-SO"},
|
||||
{0x6486, "Custom T6225-SO-CR"},
|
||||
{0x6487, "Custom T6225-CR"},
|
||||
};
|
||||
|
||||
#ifdef TCP_OFFLOAD
|
||||
@@ -2008,14 +2009,205 @@ cxgbe_get_counter(struct ifnet *ifp, ift_counter c)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The kernel picks a media from the list we had provided so we do not have to
|
||||
* validate the request.
|
||||
*/
|
||||
static int
|
||||
cxgbe_media_change(struct ifnet *ifp)
|
||||
{
|
||||
struct vi_info *vi = ifp->if_softc;
|
||||
struct port_info *pi = vi->pi;
|
||||
struct ifmedia *ifm = &pi->media;
|
||||
struct link_config *lc = &pi->link_cfg;
|
||||
struct adapter *sc = pi->adapter;
|
||||
int rc;
|
||||
|
||||
device_printf(vi->dev, "%s unimplemented.\n", __func__);
|
||||
rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4mec");
|
||||
if (rc != 0)
|
||||
return (rc);
|
||||
PORT_LOCK(pi);
|
||||
if (IFM_SUBTYPE(ifm->ifm_media) == IFM_AUTO) {
|
||||
MPASS(lc->supported & FW_PORT_CAP_ANEG);
|
||||
lc->requested_aneg = AUTONEG_ENABLE;
|
||||
} else {
|
||||
lc->requested_aneg = AUTONEG_DISABLE;
|
||||
lc->requested_speed =
|
||||
ifmedia_baudrate(ifm->ifm_media) / 1000000;
|
||||
lc->requested_fc = 0;
|
||||
if (IFM_OPTIONS(ifm->ifm_media) & IFM_ETH_RXPAUSE)
|
||||
lc->requested_fc |= PAUSE_RX;
|
||||
if (IFM_OPTIONS(ifm->ifm_media) & IFM_ETH_TXPAUSE)
|
||||
lc->requested_fc |= PAUSE_TX;
|
||||
}
|
||||
if (pi->up_vis > 0)
|
||||
rc = apply_l1cfg(pi);
|
||||
PORT_UNLOCK(pi);
|
||||
end_synchronized_op(sc, 0);
|
||||
return (rc);
|
||||
}
|
||||
|
||||
return (EOPNOTSUPP);
|
||||
/*
|
||||
* Mbps to FW_PORT_CAP_SPEED_* bit.
|
||||
*/
|
||||
static uint16_t
|
||||
speed_to_fwspeed(int speed)
|
||||
{
|
||||
|
||||
switch (speed) {
|
||||
case 100000:
|
||||
return (FW_PORT_CAP_SPEED_100G);
|
||||
case 40000:
|
||||
return (FW_PORT_CAP_SPEED_40G);
|
||||
case 25000:
|
||||
return (FW_PORT_CAP_SPEED_25G);
|
||||
case 10000:
|
||||
return (FW_PORT_CAP_SPEED_10G);
|
||||
case 1000:
|
||||
return (FW_PORT_CAP_SPEED_1G);
|
||||
case 100:
|
||||
return (FW_PORT_CAP_SPEED_100M);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Base media word (without ETHER, pause, link active, etc.) for the port at the
|
||||
* given speed.
|
||||
*/
|
||||
static int
|
||||
port_mword(struct port_info *pi, uint16_t speed)
|
||||
{
|
||||
|
||||
MPASS(speed & M_FW_PORT_CAP_SPEED);
|
||||
MPASS(powerof2(speed));
|
||||
|
||||
switch(pi->port_type) {
|
||||
case FW_PORT_TYPE_BT_SGMII:
|
||||
case FW_PORT_TYPE_BT_XFI:
|
||||
case FW_PORT_TYPE_BT_XAUI:
|
||||
/* BaseT */
|
||||
switch (speed) {
|
||||
case FW_PORT_CAP_SPEED_100M:
|
||||
return (IFM_100_T);
|
||||
case FW_PORT_CAP_SPEED_1G:
|
||||
return (IFM_1000_T);
|
||||
case FW_PORT_CAP_SPEED_10G:
|
||||
return (IFM_10G_T);
|
||||
}
|
||||
break;
|
||||
case FW_PORT_TYPE_KX4:
|
||||
if (speed == FW_PORT_CAP_SPEED_10G)
|
||||
return (IFM_10G_KX4);
|
||||
break;
|
||||
case FW_PORT_TYPE_CX4:
|
||||
if (speed == FW_PORT_CAP_SPEED_10G)
|
||||
return (IFM_10G_CX4);
|
||||
break;
|
||||
case FW_PORT_TYPE_KX:
|
||||
if (speed == FW_PORT_CAP_SPEED_1G)
|
||||
return (IFM_1000_KX);
|
||||
break;
|
||||
case FW_PORT_TYPE_KR:
|
||||
case FW_PORT_TYPE_BP_AP:
|
||||
case FW_PORT_TYPE_BP4_AP:
|
||||
case FW_PORT_TYPE_BP40_BA:
|
||||
case FW_PORT_TYPE_KR4_100G:
|
||||
case FW_PORT_TYPE_KR_SFP28:
|
||||
case FW_PORT_TYPE_KR_XLAUI:
|
||||
switch (speed) {
|
||||
case FW_PORT_CAP_SPEED_1G:
|
||||
return (IFM_1000_KX);
|
||||
case FW_PORT_CAP_SPEED_10G:
|
||||
return (IFM_10G_KR);
|
||||
case FW_PORT_CAP_SPEED_25G:
|
||||
return (IFM_25G_KR);
|
||||
case FW_PORT_CAP_SPEED_40G:
|
||||
return (IFM_40G_KR4);
|
||||
case FW_PORT_CAP_SPEED_100G:
|
||||
return (IFM_100G_KR4);
|
||||
}
|
||||
break;
|
||||
case FW_PORT_TYPE_FIBER_XFI:
|
||||
case FW_PORT_TYPE_FIBER_XAUI:
|
||||
case FW_PORT_TYPE_SFP:
|
||||
case FW_PORT_TYPE_QSFP_10G:
|
||||
case FW_PORT_TYPE_QSA:
|
||||
case FW_PORT_TYPE_QSFP:
|
||||
case FW_PORT_TYPE_CR4_QSFP:
|
||||
case FW_PORT_TYPE_CR_QSFP:
|
||||
case FW_PORT_TYPE_CR2_QSFP:
|
||||
case FW_PORT_TYPE_SFP28:
|
||||
/* Pluggable transceiver */
|
||||
switch (pi->mod_type) {
|
||||
case FW_PORT_MOD_TYPE_LR:
|
||||
switch (speed) {
|
||||
case FW_PORT_CAP_SPEED_1G:
|
||||
return (IFM_1000_LX);
|
||||
case FW_PORT_CAP_SPEED_10G:
|
||||
return (IFM_10G_LR);
|
||||
case FW_PORT_CAP_SPEED_25G:
|
||||
return (IFM_25G_LR);
|
||||
case FW_PORT_CAP_SPEED_40G:
|
||||
return (IFM_40G_LR4);
|
||||
case FW_PORT_CAP_SPEED_100G:
|
||||
return (IFM_100G_LR4);
|
||||
}
|
||||
break;
|
||||
case FW_PORT_MOD_TYPE_SR:
|
||||
switch (speed) {
|
||||
case FW_PORT_CAP_SPEED_1G:
|
||||
return (IFM_1000_SX);
|
||||
case FW_PORT_CAP_SPEED_10G:
|
||||
return (IFM_10G_SR);
|
||||
case FW_PORT_CAP_SPEED_25G:
|
||||
return (IFM_25G_SR);
|
||||
case FW_PORT_CAP_SPEED_40G:
|
||||
return (IFM_40G_SR4);
|
||||
case FW_PORT_CAP_SPEED_100G:
|
||||
return (IFM_100G_SR4);
|
||||
}
|
||||
break;
|
||||
case FW_PORT_MOD_TYPE_ER:
|
||||
if (speed == FW_PORT_CAP_SPEED_10G)
|
||||
return (IFM_10G_ER);
|
||||
break;
|
||||
case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
|
||||
case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
|
||||
switch (speed) {
|
||||
case FW_PORT_CAP_SPEED_1G:
|
||||
return (IFM_1000_CX);
|
||||
case FW_PORT_CAP_SPEED_10G:
|
||||
return (IFM_10G_TWINAX);
|
||||
case FW_PORT_CAP_SPEED_25G:
|
||||
return (IFM_25G_CR);
|
||||
case FW_PORT_CAP_SPEED_40G:
|
||||
return (IFM_40G_CR4);
|
||||
case FW_PORT_CAP_SPEED_100G:
|
||||
return (IFM_100G_CR4);
|
||||
}
|
||||
break;
|
||||
case FW_PORT_MOD_TYPE_LRM:
|
||||
if (speed == FW_PORT_CAP_SPEED_10G)
|
||||
return (IFM_10G_LRM);
|
||||
break;
|
||||
case FW_PORT_MOD_TYPE_NA:
|
||||
MPASS(0); /* Not pluggable? */
|
||||
/* fall throough */
|
||||
case FW_PORT_MOD_TYPE_ERROR:
|
||||
case FW_PORT_MOD_TYPE_UNKNOWN:
|
||||
case FW_PORT_MOD_TYPE_NOTSUPPORTED:
|
||||
break;
|
||||
case FW_PORT_MOD_TYPE_NONE:
|
||||
return (IFM_NONE);
|
||||
}
|
||||
break;
|
||||
case FW_PORT_TYPE_NONE:
|
||||
return (IFM_NONE);
|
||||
}
|
||||
|
||||
return (IFM_UNKNOWN);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2023,63 +2215,42 @@ cxgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
|
||||
{
|
||||
struct vi_info *vi = ifp->if_softc;
|
||||
struct port_info *pi = vi->pi;
|
||||
struct ifmedia_entry *cur;
|
||||
struct adapter *sc = pi->adapter;
|
||||
struct link_config *lc = &pi->link_cfg;
|
||||
|
||||
/*
|
||||
* If all the interfaces are administratively down the firmware does not
|
||||
* report transceiver changes. Refresh port info here so that ifconfig
|
||||
* displays accurate information at all times.
|
||||
*/
|
||||
if (begin_synchronized_op(pi->adapter, NULL, SLEEP_OK | INTR_OK,
|
||||
"t4med") == 0) {
|
||||
PORT_LOCK(pi);
|
||||
if (pi->up_vis == 0) {
|
||||
t4_update_port_info(pi);
|
||||
build_medialist(pi, &pi->media);
|
||||
}
|
||||
PORT_UNLOCK(pi);
|
||||
end_synchronized_op(pi->adapter, 0);
|
||||
if (begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4med") != 0)
|
||||
return;
|
||||
PORT_LOCK(pi);
|
||||
|
||||
if (pi->up_vis == 0) {
|
||||
/*
|
||||
* If all the interfaces are administratively down the firmware
|
||||
* does not report transceiver changes. Refresh port info here
|
||||
* so that ifconfig displays accurate ifmedia at all times.
|
||||
* This is the only reason we have a synchronized op in this
|
||||
* function. Just PORT_LOCK would have been enough otherwise.
|
||||
*/
|
||||
t4_update_port_info(pi);
|
||||
build_medialist(pi, &pi->media);
|
||||
}
|
||||
|
||||
/* ifm_status */
|
||||
ifmr->ifm_status = IFM_AVALID;
|
||||
if (lc->link_ok == 0)
|
||||
return;
|
||||
|
||||
goto done;
|
||||
ifmr->ifm_status |= IFM_ACTIVE;
|
||||
|
||||
/* ifm_active */
|
||||
ifmr->ifm_active = IFM_ETHER | IFM_FDX;
|
||||
ifmr->ifm_active &= ~(IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE);
|
||||
if (lc->fc & PAUSE_RX)
|
||||
ifmr->ifm_active |= IFM_ETH_RXPAUSE;
|
||||
if (lc->fc & PAUSE_TX)
|
||||
ifmr->ifm_active |= IFM_ETH_TXPAUSE;
|
||||
|
||||
/* active and current will differ iff current media is autoselect. */
|
||||
cur = pi->media.ifm_cur;
|
||||
if (cur != NULL && IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
|
||||
return;
|
||||
|
||||
ifmr->ifm_active = IFM_ETHER | IFM_FDX;
|
||||
if (lc->fc & PAUSE_RX)
|
||||
ifmr->ifm_active |= IFM_ETH_RXPAUSE;
|
||||
if (lc->fc & PAUSE_TX)
|
||||
ifmr->ifm_active |= IFM_ETH_TXPAUSE;
|
||||
switch (lc->speed) {
|
||||
case 10000:
|
||||
ifmr->ifm_active |= IFM_10G_T;
|
||||
break;
|
||||
case 1000:
|
||||
ifmr->ifm_active |= IFM_1000_T;
|
||||
break;
|
||||
case 100:
|
||||
ifmr->ifm_active |= IFM_100_TX;
|
||||
break;
|
||||
case 10:
|
||||
ifmr->ifm_active |= IFM_10_T;
|
||||
break;
|
||||
default:
|
||||
device_printf(vi->dev, "link up but speed unknown (%u)\n",
|
||||
lc->speed);
|
||||
}
|
||||
ifmr->ifm_active |= port_mword(pi, speed_to_fwspeed(lc->speed));
|
||||
done:
|
||||
PORT_UNLOCK(pi);
|
||||
end_synchronized_op(sc, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -3247,7 +3418,8 @@ partition_resources(struct adapter *sc, const struct firmware *default_cfg,
|
||||
snprintf(sc->cfg_file, sizeof(sc->cfg_file), UWIRE_CF);
|
||||
if (is_fpga(sc))
|
||||
snprintf(sc->cfg_file, sizeof(sc->cfg_file), FPGA_CF);
|
||||
}
|
||||
} else if (strncmp(t4_cfg_file, BUILTIN_CF, sizeof(t4_cfg_file)) == 0)
|
||||
goto use_built_in_config; /* go straight to config. */
|
||||
|
||||
/*
|
||||
* We need to load another module if the profile is anything except
|
||||
@@ -3358,8 +3530,31 @@ use_config_on_flash:
|
||||
if (rc != 0) {
|
||||
device_printf(sc->dev,
|
||||
"failed to pre-process config file: %d "
|
||||
"(mtype %d, moff 0x%x).\n", rc, mtype, moff);
|
||||
goto done;
|
||||
"(mtype %d, moff 0x%x). Will reset the firmware and retry "
|
||||
"with the built-in configuration.\n", rc, mtype, moff);
|
||||
|
||||
rc = -t4_fw_reset(sc, sc->mbox, F_PIORSTMODE | F_PIORST);
|
||||
if (rc != 0) {
|
||||
device_printf(sc->dev,
|
||||
"firmware reset failed: %d.\n", rc);
|
||||
if (rc != ETIMEDOUT && rc != EIO) {
|
||||
t4_fw_bye(sc, sc->mbox);
|
||||
sc->flags &= ~FW_OK;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
snprintf(sc->cfg_file, sizeof(sc->cfg_file), "%s", "built-in");
|
||||
use_built_in_config:
|
||||
bzero(&caps, sizeof(caps));
|
||||
caps.op_to_write = htobe32(V_FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
|
||||
F_FW_CMD_REQUEST | F_FW_CMD_READ);
|
||||
caps.cfvalid_to_len16 = htobe32(FW_LEN16(caps));
|
||||
rc = t4_wr_mbox(sc, sc->mbox, &caps, sizeof(caps), &caps);
|
||||
if (rc != 0) {
|
||||
device_printf(sc->dev,
|
||||
"built-in configuration failed: %d.\n", rc);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
finicsum = be32toh(caps.finicsum);
|
||||
@@ -3759,214 +3954,114 @@ t4_set_desc(struct adapter *sc)
|
||||
device_set_desc_copy(sc->dev, buf);
|
||||
}
|
||||
|
||||
static void
|
||||
build_medialist(struct port_info *pi, struct ifmedia *media)
|
||||
static inline void
|
||||
ifmedia_add4(struct ifmedia *ifm, int m)
|
||||
{
|
||||
int m;
|
||||
|
||||
ifmedia_add(ifm, m, 0, NULL);
|
||||
ifmedia_add(ifm, m | IFM_ETH_TXPAUSE, 0, NULL);
|
||||
ifmedia_add(ifm, m | IFM_ETH_RXPAUSE, 0, NULL);
|
||||
ifmedia_add(ifm, m | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE, 0, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
set_current_media(struct port_info *pi, struct ifmedia *ifm)
|
||||
{
|
||||
struct link_config *lc;
|
||||
int mword;
|
||||
|
||||
PORT_LOCK_ASSERT_OWNED(pi);
|
||||
|
||||
ifmedia_removeall(media);
|
||||
/* Leave current media alone if it's already set to IFM_NONE. */
|
||||
if (ifm->ifm_cur != NULL &&
|
||||
IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_NONE)
|
||||
return;
|
||||
|
||||
lc = &pi->link_cfg;
|
||||
if (lc->requested_aneg == AUTONEG_ENABLE &&
|
||||
lc->supported & FW_PORT_CAP_ANEG) {
|
||||
ifmedia_set(ifm, IFM_ETHER | IFM_AUTO);
|
||||
return;
|
||||
}
|
||||
mword = IFM_ETHER | IFM_FDX;
|
||||
if (lc->requested_fc & PAUSE_TX)
|
||||
mword |= IFM_ETH_TXPAUSE;
|
||||
if (lc->requested_fc & PAUSE_RX)
|
||||
mword |= IFM_ETH_RXPAUSE;
|
||||
mword |= port_mword(pi, speed_to_fwspeed(lc->requested_speed));
|
||||
ifmedia_set(ifm, mword);
|
||||
}
|
||||
|
||||
static void
|
||||
build_medialist(struct port_info *pi, struct ifmedia *ifm)
|
||||
{
|
||||
uint16_t ss, speed;
|
||||
int unknown, mword, bit;
|
||||
struct link_config *lc;
|
||||
|
||||
PORT_LOCK_ASSERT_OWNED(pi);
|
||||
|
||||
if (pi->flags & FIXED_IFMEDIA)
|
||||
return;
|
||||
|
||||
/*
|
||||
* XXX: Would it be better to ifmedia_add all 4 combinations of pause
|
||||
* settings for every speed instead of just txpause|rxpause? ifconfig
|
||||
* media display looks much better if autoselect is the only case where
|
||||
* ifm_current is different from ifm_active. If the user picks anything
|
||||
* except txpause|rxpause the display is ugly.
|
||||
* First setup all the requested_ fields so that they comply with what's
|
||||
* supported by the port + transceiver. Note that this clobbers any
|
||||
* user preferences set via sysctl_pause_settings or sysctl_autoneg.
|
||||
*/
|
||||
m = IFM_ETHER | IFM_FDX | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
|
||||
init_l1cfg(pi);
|
||||
|
||||
switch(pi->port_type) {
|
||||
case FW_PORT_TYPE_BT_XFI:
|
||||
case FW_PORT_TYPE_BT_XAUI:
|
||||
ifmedia_add(media, m | IFM_10G_T, 0, NULL);
|
||||
/* fall through */
|
||||
|
||||
case FW_PORT_TYPE_BT_SGMII:
|
||||
ifmedia_add(media, m | IFM_1000_T, 0, NULL);
|
||||
ifmedia_add(media, m | IFM_100_TX, 0, NULL);
|
||||
ifmedia_add(media, IFM_ETHER | IFM_AUTO, 0, NULL);
|
||||
ifmedia_set(media, IFM_ETHER | IFM_AUTO);
|
||||
break;
|
||||
|
||||
case FW_PORT_TYPE_CX4:
|
||||
ifmedia_add(media, m | IFM_10G_CX4, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_10G_CX4);
|
||||
break;
|
||||
|
||||
case FW_PORT_TYPE_QSFP_10G:
|
||||
case FW_PORT_TYPE_SFP:
|
||||
case FW_PORT_TYPE_FIBER_XFI:
|
||||
case FW_PORT_TYPE_FIBER_XAUI:
|
||||
switch (pi->mod_type) {
|
||||
|
||||
case FW_PORT_MOD_TYPE_LR:
|
||||
ifmedia_add(media, m | IFM_10G_LR, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_10G_LR);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_SR:
|
||||
ifmedia_add(media, m | IFM_10G_SR, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_10G_SR);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_LRM:
|
||||
ifmedia_add(media, m | IFM_10G_LRM, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_10G_LRM);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
|
||||
case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
|
||||
ifmedia_add(media, m | IFM_10G_TWINAX, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_10G_TWINAX);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_NONE:
|
||||
m &= ~IFM_FDX;
|
||||
ifmedia_add(media, m | IFM_NONE, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_NONE);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_NA:
|
||||
case FW_PORT_MOD_TYPE_ER:
|
||||
default:
|
||||
device_printf(pi->dev,
|
||||
"unknown port_type (%d), mod_type (%d)\n",
|
||||
pi->port_type, pi->mod_type);
|
||||
ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_UNKNOWN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case FW_PORT_TYPE_CR_QSFP:
|
||||
case FW_PORT_TYPE_SFP28:
|
||||
case FW_PORT_TYPE_KR_SFP28:
|
||||
switch (pi->mod_type) {
|
||||
|
||||
case FW_PORT_MOD_TYPE_SR:
|
||||
ifmedia_add(media, m | IFM_25G_SR, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_25G_SR);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
|
||||
case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
|
||||
ifmedia_add(media, m | IFM_25G_CR, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_25G_CR);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_NONE:
|
||||
m &= ~IFM_FDX;
|
||||
ifmedia_add(media, m | IFM_NONE, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_NONE);
|
||||
break;
|
||||
|
||||
default:
|
||||
device_printf(pi->dev,
|
||||
"unknown port_type (%d), mod_type (%d)\n",
|
||||
pi->port_type, pi->mod_type);
|
||||
ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_UNKNOWN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case FW_PORT_TYPE_QSFP:
|
||||
switch (pi->mod_type) {
|
||||
|
||||
case FW_PORT_MOD_TYPE_LR:
|
||||
ifmedia_add(media, m | IFM_40G_LR4, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_40G_LR4);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_SR:
|
||||
ifmedia_add(media, m | IFM_40G_SR4, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_40G_SR4);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
|
||||
case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
|
||||
ifmedia_add(media, m | IFM_40G_CR4, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_40G_CR4);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_NONE:
|
||||
m &= ~IFM_FDX;
|
||||
ifmedia_add(media, m | IFM_NONE, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_NONE);
|
||||
break;
|
||||
|
||||
default:
|
||||
device_printf(pi->dev,
|
||||
"unknown port_type (%d), mod_type (%d)\n",
|
||||
pi->port_type, pi->mod_type);
|
||||
ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_UNKNOWN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case FW_PORT_TYPE_KR4_100G:
|
||||
case FW_PORT_TYPE_CR4_QSFP:
|
||||
switch (pi->mod_type) {
|
||||
|
||||
case FW_PORT_MOD_TYPE_LR:
|
||||
ifmedia_add(media, m | IFM_100G_LR4, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_100G_LR4);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_SR:
|
||||
ifmedia_add(media, m | IFM_100G_SR4, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_100G_SR4);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
|
||||
case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
|
||||
ifmedia_add(media, m | IFM_100G_CR4, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_100G_CR4);
|
||||
break;
|
||||
|
||||
case FW_PORT_MOD_TYPE_NONE:
|
||||
m &= ~IFM_FDX;
|
||||
ifmedia_add(media, m | IFM_NONE, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_NONE);
|
||||
break;
|
||||
|
||||
default:
|
||||
device_printf(pi->dev,
|
||||
"unknown port_type (%d), mod_type (%d)\n",
|
||||
pi->port_type, pi->mod_type);
|
||||
ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_UNKNOWN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
device_printf(pi->dev,
|
||||
"unknown port_type (%d), mod_type (%d)\n", pi->port_type,
|
||||
pi->mod_type);
|
||||
ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
|
||||
ifmedia_set(media, m | IFM_UNKNOWN);
|
||||
break;
|
||||
/*
|
||||
* Now (re)build the ifmedia list.
|
||||
*/
|
||||
ifmedia_removeall(ifm);
|
||||
lc = &pi->link_cfg;
|
||||
ss = G_FW_PORT_CAP_SPEED(lc->supported); /* Supported Speeds */
|
||||
if (__predict_false(ss == 0)) { /* not supposed to happen. */
|
||||
MPASS(ss != 0);
|
||||
no_media:
|
||||
MPASS(LIST_EMPTY(&ifm->ifm_list));
|
||||
ifmedia_add(ifm, IFM_ETHER | IFM_NONE, 0, NULL);
|
||||
ifmedia_set(ifm, IFM_ETHER | IFM_NONE);
|
||||
return;
|
||||
}
|
||||
|
||||
unknown = 0;
|
||||
for (bit = 0; bit < fls(ss); bit++) {
|
||||
speed = 1 << bit;
|
||||
MPASS(speed & M_FW_PORT_CAP_SPEED);
|
||||
if (ss & speed) {
|
||||
mword = port_mword(pi, speed);
|
||||
if (mword == IFM_NONE) {
|
||||
goto no_media;
|
||||
} else if (mword == IFM_UNKNOWN)
|
||||
unknown++;
|
||||
else
|
||||
ifmedia_add4(ifm, IFM_ETHER | IFM_FDX | mword);
|
||||
}
|
||||
}
|
||||
if (unknown > 0) /* Add one unknown for all unknown media types. */
|
||||
ifmedia_add4(ifm, IFM_ETHER | IFM_FDX | IFM_UNKNOWN);
|
||||
if (lc->supported & FW_PORT_CAP_ANEG)
|
||||
ifmedia_add(ifm, IFM_ETHER | IFM_AUTO, 0, NULL);
|
||||
|
||||
set_current_media(pi, ifm);
|
||||
}
|
||||
|
||||
/*
|
||||
* Update all the requested_* fields in the link config and then send a mailbox
|
||||
* command to apply the settings.
|
||||
* Update all the requested_* fields in the link config to something valid (and
|
||||
* reasonable).
|
||||
*/
|
||||
static void
|
||||
init_l1cfg(struct port_info *pi)
|
||||
{
|
||||
struct adapter *sc = pi->adapter;
|
||||
struct link_config *lc = &pi->link_cfg;
|
||||
int rc;
|
||||
|
||||
ASSERT_SYNCHRONIZED_OP(sc);
|
||||
PORT_LOCK_ASSERT_OWNED(pi);
|
||||
|
||||
/* Gbps -> Mbps */
|
||||
lc->requested_speed = port_top_speed(pi) * 1000;
|
||||
|
||||
lc->requested_speed = port_top_speed(pi); /* in Gbps */
|
||||
if (t4_autoneg != 0 && lc->supported & FW_PORT_CAP_ANEG) {
|
||||
lc->requested_aneg = AUTONEG_ENABLE;
|
||||
} else {
|
||||
@@ -3976,18 +4071,58 @@ init_l1cfg(struct port_info *pi)
|
||||
lc->requested_fc = t4_pause_settings & (PAUSE_TX | PAUSE_RX);
|
||||
|
||||
if (t4_fec != -1) {
|
||||
lc->requested_fec = t4_fec & (FEC_RS | FEC_BASER_RS |
|
||||
FEC_RESERVED);
|
||||
if (t4_fec & FEC_RS && lc->supported & FW_PORT_CAP_FEC_RS) {
|
||||
lc->requested_fec = FEC_RS;
|
||||
} else if (t4_fec & FEC_BASER_RS &&
|
||||
lc->supported & FW_PORT_CAP_FEC_BASER_RS) {
|
||||
lc->requested_fec = FEC_BASER_RS;
|
||||
} else {
|
||||
lc->requested_fec = 0;
|
||||
}
|
||||
} else {
|
||||
/* Use the suggested value provided by the firmware in acaps */
|
||||
if (lc->advertising & FW_PORT_CAP_FEC_RS)
|
||||
if (lc->advertising & FW_PORT_CAP_FEC_RS &&
|
||||
lc->supported & FW_PORT_CAP_FEC_RS) {
|
||||
lc->requested_fec = FEC_RS;
|
||||
else if (lc->advertising & FW_PORT_CAP_FEC_BASER_RS)
|
||||
} else if (lc->advertising & FW_PORT_CAP_FEC_BASER_RS &&
|
||||
lc->supported & FW_PORT_CAP_FEC_BASER_RS) {
|
||||
lc->requested_fec = FEC_BASER_RS;
|
||||
else
|
||||
} else {
|
||||
lc->requested_fec = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Apply the settings in requested_* to the hardware. The parameters are
|
||||
* expected to be sane.
|
||||
*/
|
||||
static int
|
||||
apply_l1cfg(struct port_info *pi)
|
||||
{
|
||||
struct adapter *sc = pi->adapter;
|
||||
struct link_config *lc = &pi->link_cfg;
|
||||
int rc;
|
||||
#ifdef INVARIANTS
|
||||
uint16_t fwspeed;
|
||||
|
||||
ASSERT_SYNCHRONIZED_OP(sc);
|
||||
PORT_LOCK_ASSERT_OWNED(pi);
|
||||
|
||||
if (lc->requested_aneg == AUTONEG_ENABLE)
|
||||
MPASS(lc->supported & FW_PORT_CAP_ANEG);
|
||||
if (lc->requested_fc & PAUSE_TX)
|
||||
MPASS(lc->supported & FW_PORT_CAP_FC_TX);
|
||||
if (lc->requested_fc & PAUSE_RX)
|
||||
MPASS(lc->supported & FW_PORT_CAP_FC_RX);
|
||||
if (lc->requested_fec == FEC_RS)
|
||||
MPASS(lc->supported & FW_PORT_CAP_FEC_RS);
|
||||
if (lc->requested_fec == FEC_BASER_RS)
|
||||
MPASS(lc->supported & FW_PORT_CAP_FEC_BASER_RS);
|
||||
fwspeed = speed_to_fwspeed(lc->requested_speed);
|
||||
MPASS(fwspeed != 0);
|
||||
MPASS(lc->supported & fwspeed);
|
||||
#endif
|
||||
rc = -t4_link_l1cfg(sc, sc->mbox, pi->tx_chan, lc);
|
||||
if (rc != 0) {
|
||||
device_printf(pi->dev, "l1cfg failed: %d\n", rc);
|
||||
@@ -3995,6 +4130,7 @@ init_l1cfg(struct port_info *pi)
|
||||
lc->fc = lc->requested_fc;
|
||||
lc->fec = lc->requested_fec;
|
||||
}
|
||||
return (rc);
|
||||
}
|
||||
|
||||
#define FW_MAC_EXACT_CHUNK 7
|
||||
@@ -4279,7 +4415,7 @@ cxgbe_init_synchronized(struct vi_info *vi)
|
||||
if (pi->up_vis++ == 0) {
|
||||
t4_update_port_info(pi);
|
||||
build_medialist(pi, &pi->media);
|
||||
init_l1cfg(pi);
|
||||
apply_l1cfg(pi);
|
||||
}
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
|
||||
@@ -4354,13 +4490,13 @@ cxgbe_uninit_synchronized(struct vi_info *vi)
|
||||
PORT_UNLOCK(pi);
|
||||
return (0);
|
||||
}
|
||||
PORT_UNLOCK(pi);
|
||||
|
||||
pi->link_cfg.link_ok = 0;
|
||||
pi->link_cfg.speed = 0;
|
||||
pi->link_cfg.link_down_rc = 255;
|
||||
t4_os_link_changed(pi);
|
||||
pi->old_link_cfg = pi->link_cfg;
|
||||
PORT_UNLOCK(pi);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@@ -6083,14 +6219,17 @@ sysctl_pause_settings(SYSCTL_HANDLER_ARGS)
|
||||
"t4PAUSE");
|
||||
if (rc)
|
||||
return (rc);
|
||||
PORT_LOCK(pi);
|
||||
if ((lc->requested_fc & (PAUSE_TX | PAUSE_RX)) != n) {
|
||||
lc->requested_fc &= ~(PAUSE_TX | PAUSE_RX);
|
||||
lc->requested_fc |= n;
|
||||
rc = -t4_link_l1cfg(sc, sc->mbox, pi->tx_chan, lc);
|
||||
if (rc == 0) {
|
||||
lc->fc = lc->requested_fc;
|
||||
set_current_media(pi, &pi->media);
|
||||
}
|
||||
}
|
||||
PORT_UNLOCK(pi);
|
||||
end_synchronized_op(sc, 0);
|
||||
}
|
||||
|
||||
@@ -6138,11 +6277,14 @@ sysctl_fec(SYSCTL_HANDLER_ARGS)
|
||||
n = s[0] - '0';
|
||||
if (n & ~M_FW_PORT_CAP_FEC)
|
||||
return (EINVAL); /* some other bit is set too */
|
||||
if (!powerof2(n))
|
||||
return (EINVAL); /* one bit can be set at most */
|
||||
|
||||
rc = begin_synchronized_op(sc, &pi->vi[0], SLEEP_OK | INTR_OK,
|
||||
"t4fec");
|
||||
if (rc)
|
||||
return (rc);
|
||||
PORT_LOCK(pi);
|
||||
if ((lc->requested_fec & M_FW_PORT_CAP_FEC) != n) {
|
||||
lc->requested_fec = n &
|
||||
G_FW_PORT_CAP_FEC(lc->supported);
|
||||
@@ -6151,6 +6293,7 @@ sysctl_fec(SYSCTL_HANDLER_ARGS)
|
||||
lc->fec = lc->requested_fec;
|
||||
}
|
||||
}
|
||||
PORT_UNLOCK(pi);
|
||||
end_synchronized_op(sc, 0);
|
||||
}
|
||||
|
||||
@@ -6172,27 +6315,35 @@ sysctl_autoneg(SYSCTL_HANDLER_ARGS)
|
||||
rc = sysctl_handle_int(oidp, &val, 0, req);
|
||||
if (rc != 0 || req->newptr == NULL)
|
||||
return (rc);
|
||||
if ((lc->supported & FW_PORT_CAP_ANEG) == 0)
|
||||
return (ENOTSUP);
|
||||
|
||||
if (val == 0)
|
||||
val = AUTONEG_DISABLE;
|
||||
else if (val == 1)
|
||||
val = AUTONEG_ENABLE;
|
||||
else
|
||||
return (EINVAL);
|
||||
if (lc->requested_aneg == val)
|
||||
return (0); /* no change */
|
||||
|
||||
rc = begin_synchronized_op(sc, &pi->vi[0], SLEEP_OK | INTR_OK,
|
||||
"t4aneg");
|
||||
if (rc)
|
||||
return (rc);
|
||||
PORT_LOCK(pi);
|
||||
if ((lc->supported & FW_PORT_CAP_ANEG) == 0) {
|
||||
rc = ENOTSUP;
|
||||
goto done;
|
||||
}
|
||||
if (lc->requested_aneg == val) {
|
||||
rc = 0; /* no change, do nothing. */
|
||||
goto done;
|
||||
}
|
||||
old = lc->requested_aneg;
|
||||
lc->requested_aneg = val;
|
||||
rc = -t4_link_l1cfg(sc, sc->mbox, pi->tx_chan, lc);
|
||||
if (rc != 0)
|
||||
lc->requested_aneg = old;
|
||||
else
|
||||
set_current_media(pi, &pi->media);
|
||||
done:
|
||||
PORT_UNLOCK(pi);
|
||||
end_synchronized_op(sc, 0);
|
||||
return (rc);
|
||||
}
|
||||
@@ -9395,12 +9546,14 @@ t4_os_portmod_changed(struct port_info *pi)
|
||||
NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM"
|
||||
};
|
||||
|
||||
PORT_LOCK(pi);
|
||||
build_medialist(pi, &pi->media);
|
||||
PORT_UNLOCK(pi);
|
||||
MPASS((pi->flags & FIXED_IFMEDIA) == 0);
|
||||
|
||||
vi = &pi->vi[0];
|
||||
if (begin_synchronized_op(sc, vi, HOLD_LOCK, "t4mod") == 0) {
|
||||
init_l1cfg(pi);
|
||||
PORT_LOCK(pi);
|
||||
build_medialist(pi, &pi->media);
|
||||
apply_l1cfg(pi);
|
||||
PORT_UNLOCK(pi);
|
||||
end_synchronized_op(sc, LOCK_HELD);
|
||||
}
|
||||
|
||||
@@ -9428,6 +9581,8 @@ t4_os_link_changed(struct port_info *pi)
|
||||
struct link_config *lc;
|
||||
int v;
|
||||
|
||||
PORT_LOCK_ASSERT_OWNED(pi);
|
||||
|
||||
for_each_vi(pi, v, vi) {
|
||||
ifp = vi->ifp;
|
||||
if (ifp == NULL)
|
||||
|
||||
@@ -2373,7 +2373,7 @@ static void
|
||||
get_nv_wwpn(ocs_t *ocs, char *name, ocs_textbuf_t *textbuf)
|
||||
{
|
||||
char result_string[24];
|
||||
static ocs_mgmt_get_nvparms_result_t result;
|
||||
ocs_mgmt_get_nvparms_result_t result;
|
||||
|
||||
ocs_sem_init(&(result.semaphore), 0, "get_nv_wwpn");
|
||||
|
||||
@@ -2411,7 +2411,7 @@ static void
|
||||
get_nv_wwnn(ocs_t *ocs, char *name, ocs_textbuf_t *textbuf)
|
||||
{
|
||||
char result_string[24];
|
||||
static ocs_mgmt_get_nvparms_result_t result;
|
||||
ocs_mgmt_get_nvparms_result_t result;
|
||||
|
||||
ocs_sem_init(&(result.semaphore), 0, "get_nv_wwnn");
|
||||
|
||||
|
||||
@@ -296,6 +296,12 @@ sw1:
|
||||
cpu_switch_load_gs:
|
||||
mov PCB_GS(%edx),%gs
|
||||
|
||||
pushl %edx
|
||||
pushl PCPU(CURTHREAD)
|
||||
call npxswitch
|
||||
popl %edx
|
||||
popl %edx
|
||||
|
||||
/* Test if debug registers should be restored. */
|
||||
testl $PCB_DBREGS,PCB_FLAGS(%edx)
|
||||
jz 1f
|
||||
|
||||
+70
-43
@@ -191,6 +191,11 @@ int hw_float;
|
||||
SYSCTL_INT(_hw, HW_FLOATINGPT, floatingpoint, CTLFLAG_RD,
|
||||
&hw_float, 0, "Floating point instructions executed in hardware");
|
||||
|
||||
int lazy_fpu_switch = 0;
|
||||
SYSCTL_INT(_hw, OID_AUTO, lazy_fpu_switch, CTLFLAG_RWTUN | CTLFLAG_NOFETCH,
|
||||
&lazy_fpu_switch, 0,
|
||||
"Lazily load FPU context after context switch");
|
||||
|
||||
int use_xsave;
|
||||
uint64_t xsave_mask;
|
||||
static uma_zone_t fpu_save_area_zone;
|
||||
@@ -327,6 +332,7 @@ npxinit_bsp1(void)
|
||||
u_int cp[4];
|
||||
uint64_t xsave_mask_user;
|
||||
|
||||
TUNABLE_INT_FETCH("hw.lazy_fpu_switch", &lazy_fpu_switch);
|
||||
if (cpu_fxsr && (cpu_feature2 & CPUID2_XSAVE) != 0) {
|
||||
use_xsave = 1;
|
||||
TUNABLE_INT_FETCH("hw.use_xsave", &use_xsave);
|
||||
@@ -785,47 +791,20 @@ npxtrap_sse(void)
|
||||
return (fpetable[(mxcsr & (~mxcsr >> 7)) & 0x3f]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Implement device not available (DNA) exception
|
||||
*
|
||||
* It would be better to switch FP context here (if curthread != fpcurthread)
|
||||
* and not necessarily for every context switch, but it is too hard to
|
||||
* access foreign pcb's.
|
||||
*/
|
||||
|
||||
static int err_count = 0;
|
||||
|
||||
int
|
||||
npxdna(void)
|
||||
static void
|
||||
restore_npx_curthread(struct thread *td, struct pcb *pcb)
|
||||
{
|
||||
|
||||
if (!hw_float)
|
||||
return (0);
|
||||
critical_enter();
|
||||
if (PCPU_GET(fpcurthread) == curthread) {
|
||||
printf("npxdna: fpcurthread == curthread %d times\n",
|
||||
++err_count);
|
||||
stop_emulating();
|
||||
critical_exit();
|
||||
return (1);
|
||||
}
|
||||
if (PCPU_GET(fpcurthread) != NULL) {
|
||||
printf("npxdna: fpcurthread = %p (%d), curthread = %p (%d)\n",
|
||||
PCPU_GET(fpcurthread),
|
||||
PCPU_GET(fpcurthread)->td_proc->p_pid,
|
||||
curthread, curthread->td_proc->p_pid);
|
||||
panic("npxdna");
|
||||
}
|
||||
stop_emulating();
|
||||
/*
|
||||
* Record new context early in case frstor causes a trap.
|
||||
*/
|
||||
PCPU_SET(fpcurthread, curthread);
|
||||
PCPU_SET(fpcurthread, td);
|
||||
|
||||
stop_emulating();
|
||||
if (cpu_fxsr)
|
||||
fpu_clean_state();
|
||||
|
||||
if ((curpcb->pcb_flags & PCB_NPXINITDONE) == 0) {
|
||||
if ((pcb->pcb_flags & PCB_NPXINITDONE) == 0) {
|
||||
/*
|
||||
* This is the first time this thread has used the FPU or
|
||||
* the PCB doesn't contain a clean FPU state. Explicitly
|
||||
@@ -836,18 +815,54 @@ npxdna(void)
|
||||
* npx_initialstate, to ignite the XSAVEOPT
|
||||
* tracking engine.
|
||||
*/
|
||||
bcopy(npx_initialstate, curpcb->pcb_save, cpu_max_ext_state_size);
|
||||
fpurstor(curpcb->pcb_save);
|
||||
if (curpcb->pcb_initial_npxcw != __INITIAL_NPXCW__)
|
||||
fldcw(curpcb->pcb_initial_npxcw);
|
||||
curpcb->pcb_flags |= PCB_NPXINITDONE;
|
||||
if (PCB_USER_FPU(curpcb))
|
||||
curpcb->pcb_flags |= PCB_NPXUSERINITDONE;
|
||||
bcopy(npx_initialstate, pcb->pcb_save, cpu_max_ext_state_size);
|
||||
fpurstor(pcb->pcb_save);
|
||||
if (pcb->pcb_initial_npxcw != __INITIAL_NPXCW__)
|
||||
fldcw(pcb->pcb_initial_npxcw);
|
||||
pcb->pcb_flags |= PCB_NPXINITDONE;
|
||||
if (PCB_USER_FPU(pcb))
|
||||
pcb->pcb_flags |= PCB_NPXUSERINITDONE;
|
||||
} else {
|
||||
fpurstor(curpcb->pcb_save);
|
||||
fpurstor(pcb->pcb_save);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Implement device not available (DNA) exception
|
||||
*
|
||||
* It would be better to switch FP context here (if curthread != fpcurthread)
|
||||
* and not necessarily for every context switch, but it is too hard to
|
||||
* access foreign pcb's.
|
||||
*/
|
||||
int
|
||||
npxdna(void)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
if (!hw_float)
|
||||
return (0);
|
||||
td = curthread;
|
||||
critical_enter();
|
||||
if (__predict_false(PCPU_GET(fpcurthread) == td)) {
|
||||
/*
|
||||
* Some virtual machines seems to set %cr0.TS at
|
||||
* arbitrary moments. Silently clear the TS bit
|
||||
* regardless of the eager/lazy FPU context switch
|
||||
* mode.
|
||||
*/
|
||||
stop_emulating();
|
||||
} else {
|
||||
if (__predict_false(PCPU_GET(fpcurthread) != NULL)) {
|
||||
printf(
|
||||
"npxdna: fpcurthread = %p (%d), curthread = %p (%d)\n",
|
||||
PCPU_GET(fpcurthread),
|
||||
PCPU_GET(fpcurthread)->td_proc->p_pid,
|
||||
td, td->td_proc->p_pid);
|
||||
panic("npxdna");
|
||||
}
|
||||
restore_npx_curthread(td, td->td_pcb);
|
||||
}
|
||||
critical_exit();
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -869,8 +884,20 @@ npxsave(addr)
|
||||
xsaveopt((char *)addr, xsave_mask);
|
||||
else
|
||||
fpusave(addr);
|
||||
start_emulating();
|
||||
PCPU_SET(fpcurthread, NULL);
|
||||
}
|
||||
|
||||
void npxswitch(struct thread *td, struct pcb *pcb);
|
||||
void
|
||||
npxswitch(struct thread *td, struct pcb *pcb)
|
||||
{
|
||||
|
||||
if (lazy_fpu_switch || (td->td_pflags & TDP_KTHREAD) != 0 ||
|
||||
!PCB_USER_FPU(pcb)) {
|
||||
start_emulating();
|
||||
PCPU_SET(fpcurthread, NULL);
|
||||
} else if (PCPU_GET(fpcurthread) != td) {
|
||||
restore_npx_curthread(td, pcb);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1502,6 +1502,8 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
if (p_random != NULL) {
|
||||
keylen = sizeof(*p_random) + random_len;
|
||||
memcpy(new_key->key, p_random, keylen);
|
||||
} else {
|
||||
keylen = 0;
|
||||
}
|
||||
/* append in the AUTH chunks */
|
||||
if (chunks != NULL) {
|
||||
|
||||
@@ -3619,7 +3619,9 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
|
||||
SCTP_SO_NOT_LOCKED);
|
||||
}
|
||||
/* Make sure to flag we had a FR */
|
||||
tp1->whoTo->net_ack++;
|
||||
if (tp1->whoTo != NULL) {
|
||||
tp1->whoTo->net_ack++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4810,7 +4810,6 @@ process_control_chunks:
|
||||
|
||||
/* check to see if this chunk required auth, but isn't */
|
||||
if ((stcb != NULL) &&
|
||||
(stcb->asoc.auth_supported == 1) &&
|
||||
sctp_auth_is_required_chunk(ch->chunk_type, stcb->asoc.local_auth_chunks) &&
|
||||
!stcb->asoc.authenticated) {
|
||||
/* "silently" ignore */
|
||||
@@ -5687,7 +5686,6 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
|
||||
* chunks
|
||||
*/
|
||||
if ((stcb != NULL) &&
|
||||
(stcb->asoc.auth_supported == 1) &&
|
||||
sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.local_auth_chunks)) {
|
||||
/* "silently" ignore */
|
||||
SCTP_STAT_INCR(sctps_recvauthmissing);
|
||||
@@ -5729,7 +5727,6 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
|
||||
*/
|
||||
if ((length > offset) &&
|
||||
(stcb != NULL) &&
|
||||
(stcb->asoc.auth_supported == 1) &&
|
||||
sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.local_auth_chunks) &&
|
||||
!stcb->asoc.authenticated) {
|
||||
/* "silently" ignore */
|
||||
|
||||
@@ -6702,6 +6702,8 @@ next_param:
|
||||
if (p_random != NULL) {
|
||||
keylen = sizeof(*p_random) + random_len;
|
||||
memcpy(new_key->key, p_random, keylen);
|
||||
} else {
|
||||
keylen = 0;
|
||||
}
|
||||
/* append in the AUTH chunks */
|
||||
if (chunks != NULL) {
|
||||
|
||||
@@ -4248,6 +4248,8 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
||||
if (sctp_auth_add_chunk(sauth->sauth_chunk, inp->sctp_ep.local_auth_chunks)) {
|
||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
|
||||
error = EINVAL;
|
||||
} else {
|
||||
inp->auth_supported = 1;
|
||||
}
|
||||
SCTP_INP_WUNLOCK(inp);
|
||||
break;
|
||||
|
||||
@@ -175,8 +175,27 @@ SYSCTL_UINT(_net_inet_tcp_syncache, OID_AUTO, hashsize, CTLFLAG_VNET | CTLFLAG_R
|
||||
&VNET_NAME(tcp_syncache.hashsize), 0,
|
||||
"Size of TCP syncache hashtable");
|
||||
|
||||
SYSCTL_UINT(_net_inet_tcp_syncache, OID_AUTO, rexmtlimit, CTLFLAG_VNET | CTLFLAG_RW,
|
||||
static int
|
||||
sysctl_net_inet_tcp_syncache_rexmtlimit_check(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
int error;
|
||||
u_int new;
|
||||
|
||||
new = V_tcp_syncache.rexmt_limit;
|
||||
error = sysctl_handle_int(oidp, &new, 0, req);
|
||||
if ((error == 0) && (req->newptr != NULL)) {
|
||||
if (new > TCP_MAXRXTSHIFT)
|
||||
error = EINVAL;
|
||||
else
|
||||
V_tcp_syncache.rexmt_limit = new;
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
SYSCTL_PROC(_net_inet_tcp_syncache, OID_AUTO, rexmtlimit,
|
||||
CTLFLAG_VNET | CTLTYPE_UINT | CTLFLAG_RW,
|
||||
&VNET_NAME(tcp_syncache.rexmt_limit), 0,
|
||||
sysctl_net_inet_tcp_syncache_rexmtlimit_check, "UI",
|
||||
"Limit on SYN/ACK retransmissions");
|
||||
|
||||
VNET_DEFINE(int, tcp_sc_rst_sock_fail) = 1;
|
||||
@@ -388,8 +407,14 @@ syncache_drop(struct syncache *sc, struct syncache_head *sch)
|
||||
static void
|
||||
syncache_timeout(struct syncache *sc, struct syncache_head *sch, int docallout)
|
||||
{
|
||||
sc->sc_rxttime = ticks +
|
||||
TCPTV_RTOBASE * (tcp_syn_backoff[sc->sc_rxmits]);
|
||||
int rexmt;
|
||||
|
||||
if (sc->sc_rxmits == 0)
|
||||
rexmt = TCPTV_RTOBASE;
|
||||
else
|
||||
TCPT_RANGESET(rexmt, TCPTV_RTOBASE * tcp_syn_backoff[sc->sc_rxmits],
|
||||
tcp_rexmit_min, TCPTV_REXMTMAX);
|
||||
sc->sc_rxttime = ticks + rexmt;
|
||||
sc->sc_rxmits++;
|
||||
if (TSTMP_LT(sc->sc_rxttime, sch->sch_nextc)) {
|
||||
sch->sch_nextc = sc->sc_rxttime;
|
||||
|
||||
+1
-1
@@ -58,7 +58,7 @@
|
||||
* in the range 5 to 9.
|
||||
*/
|
||||
#undef __FreeBSD_version
|
||||
#define __FreeBSD_version 1101516 /* Master, propagated to newvers */
|
||||
#define __FreeBSD_version 1102000 /* Master, propagated to newvers */
|
||||
|
||||
/*
|
||||
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
|
||||
|
||||
@@ -4499,7 +4499,6 @@ OLD_FILES+=usr/include/c++/v1/__libcpp_version
|
||||
OLD_FILES+=usr/include/c++/v1/__locale
|
||||
OLD_FILES+=usr/include/c++/v1/__mutex_base
|
||||
OLD_FILES+=usr/include/c++/v1/__nullptr
|
||||
OLD_FILES+=usr/include/c++/v1/__refstring
|
||||
OLD_FILES+=usr/include/c++/v1/__split_buffer
|
||||
OLD_FILES+=usr/include/c++/v1/__sso_allocator
|
||||
OLD_FILES+=usr/include/c++/v1/__std_stream
|
||||
@@ -4552,6 +4551,7 @@ OLD_FILES+=usr/include/c++/v1/experimental/__memory
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/algorithm
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/any
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/chrono
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/coroutine
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/deque
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/dynarray
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/filesystem
|
||||
@@ -4561,6 +4561,7 @@ OLD_FILES+=usr/include/c++/v1/experimental/iterator
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/list
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/map
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/memory_resource
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/numeric
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/optional
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/propagate_const
|
||||
OLD_FILES+=usr/include/c++/v1/experimental/ratio
|
||||
@@ -4642,7 +4643,6 @@ OLD_FILES+=usr/include/c++/v1/tr1/__libcpp_version
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__locale
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__mutex_base
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__nullptr
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__refstring
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__split_buffer
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__sso_allocator
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__std_stream
|
||||
@@ -4650,7 +4650,7 @@ OLD_FILES+=usr/include/c++/v1/tr1/__string
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__threading_support
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__tree
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__tuple
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__undef_min_max
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/__undef_macros
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/algorithm
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/any
|
||||
OLD_FILES+=usr/include/c++/v1/tr1/array
|
||||
|
||||
Reference in new issue
Block a user