Merge ^/head r311692 through r311807.

This commit is contained in:
dim 2017-01-09 19:25:49 +00:00
commit 54861dc62d
64 changed files with 1486 additions and 706 deletions

View File

@ -2370,7 +2370,6 @@ OLD_LIBS+=usr/lib32/private/libyaml.so.1
OLD_FILES+=usr/lib32/private/libyaml_p.a
# 20140216: new clang import which bumps version from 3.3 to 3.4.
OLD_FILES+=usr/bin/llvm-prof
OLD_FILES+=usr/bin/llvm-ranlib
OLD_FILES+=usr/include/clang/3.3/__wmmintrin_aes.h
OLD_FILES+=usr/include/clang/3.3/__wmmintrin_pclmul.h
OLD_FILES+=usr/include/clang/3.3/altivec.h

View File

@ -126,9 +126,11 @@ open_node(const SmiNode *n, u_int level, SmiNode **last)
while (level < n->oidlen - 1) {
if (level >= cut) {
n1 = smiGetNodeByOID(level + 1, n->oid);
if (n1 == NULL)
continue;
pindent(level);
printf("(%u", n->oid[level]);
n1 = smiGetNodeByOID(level + 1, n->oid);
printf(" ");
print_name(n1);
printf("\n");
@ -397,12 +399,11 @@ static void
save_typdef(char *name)
{
struct tdef *t;
t = malloc(sizeof(struct tdef));
t = calloc(1, sizeof(struct tdef));
if (t == NULL)
err(1, NULL);
memset(t, 0 , sizeof(struct tdef));
t->name = name;
SLIST_INSERT_HEAD(&tdefs, t, link);
}
@ -559,7 +560,11 @@ main(int argc, char *argv[])
level = 0;
last = NULL;
for (opt = 0; opt < argc; opt++) {
if (mods[opt] == NULL) /* smiGetModule failed above */
continue;
n = smiGetFirstNode(mods[opt], SMI_NODEKIND_ANY);
if (n == NULL)
continue;
for (;;) {
if (do_typedef == 0) {
level = open_node(n, level, &last);

View File

@ -54,6 +54,9 @@ begemotIp MODULE-IDENTITY
E-mail: harti@freebsd.org"
DESCRIPTION
"The MIB for IP stuff that is not in the official IP MIBs."
REVISION "200602130000Z"
DESCRIPTION
"Initial revision."
::= { begemot 3 }
begemotIpObjects OBJECT IDENTIFIER ::= { begemotIp 1 }

View File

@ -319,7 +319,7 @@ fetch_generic_mib(struct mibif *ifp, const struct ifmibdata *old)
name[5] = IFDATA_GENERAL;
len = sizeof(ifp->mib);
if (sysctl(name, 6, &ifp->mib, &len, NULL, 0) == -1) {
if (sysctl(name, nitems(name), &ifp->mib, &len, NULL, 0) == -1) {
if (errno != ENOENT)
syslog(LOG_WARNING, "sysctl(ifmib, %s) failed %m",
ifp->name);
@ -480,7 +480,7 @@ mib_fetch_ifmib(struct mibif *ifp)
name[3] = IFMIB_IFDATA;
name[4] = ifp->sysindex;
name[5] = IFDATA_LINKSPECIFIC;
if (sysctl(name, 6, NULL, &len, NULL, 0) == -1) {
if (sysctl(name, nitems(name), NULL, &len, NULL, 0) == -1) {
syslog(LOG_WARNING, "sysctl linkmib estimate (%s): %m",
ifp->name);
if (ifp->specmib != NULL) {
@ -506,7 +506,7 @@ mib_fetch_ifmib(struct mibif *ifp)
ifp->specmib = newmib;
ifp->specmiblen = len;
}
if (sysctl(name, 6, ifp->specmib, &len, NULL, 0) == -1) {
if (sysctl(name, nitems(name), ifp->specmib, &len, NULL, 0) == -1) {
syslog(LOG_WARNING, "sysctl linkmib (%s): %m", ifp->name);
if (ifp->specmib != NULL) {
ifp->specmib = NULL;
@ -902,7 +902,7 @@ mib_refresh_iflist(void)
for (idx = 1; idx <= count; idx++) {
name[4] = idx;
len = sizeof(mib);
if (sysctl(name, 6, &mib, &len, NULL, 0) == -1) {
if (sysctl(name, nitems(name), &mib, &len, NULL, 0) == -1) {
if (errno == ENOENT)
continue;
syslog(LOG_ERR, "ifmib(%u): %m", idx);
@ -1213,7 +1213,7 @@ mib_fetch_rtab(int af, int info, int arg, size_t *lenp)
*lenp = 0;
/* initial estimate */
if (sysctl(name, 6, NULL, lenp, NULL, 0) == -1) {
if (sysctl(name, nitems(name), NULL, lenp, NULL, 0) == -1) {
syslog(LOG_ERR, "sysctl estimate (%d,%d,%d,%d,%d,%d): %m",
name[0], name[1], name[2], name[3], name[4], name[5]);
return (NULL);
@ -1230,7 +1230,7 @@ mib_fetch_rtab(int af, int info, int arg, size_t *lenp)
}
buf = newbuf;
if (sysctl(name, 6, buf, lenp, NULL, 0) == 0)
if (sysctl(name, nitems(name), buf, lenp, NULL, 0) == 0)
break;
if (errno != ENOMEM) {

View File

@ -54,6 +54,9 @@ begemot MODULE-IDENTITY
E-mail: harti@freebsd.org"
DESCRIPTION
"The root of the Begemot subtree of the fokus tree."
REVISION "200201300000Z"
DESCRIPTION
"Initial revision."
::= { fokus 1 }
END

View File

@ -52,6 +52,9 @@ fokus MODULE-IDENTITY
E-mail: harti@freebsd.org"
DESCRIPTION
"The root of the Fokus enterprises tree."
REVISION "200202050000Z"
DESCRIPTION
"Initial revision."
::= { enterprises 12325 }
END

View File

@ -9,11 +9,11 @@ SRCS= cd9660.c \
common_kvm.c \
core.c \
libprocstat.c \
msdosfs.c \
msdosfs.c \
smbfs.c \
udf.c
VERSION_DEF= ${.CURDIR}/Versions.def
VERSION_DEF= ${LIBCSRCDIR}/Versions.def
SYMBOL_MAPS= ${.CURDIR}/Symbol.map
INCS= libprocstat.h

View File

@ -1,10 +0,0 @@
# $FreeBSD$
# This version was first added to 9.0-current.
FBSD_1.2 {
};
# This version was first added to 10.0-current.
FBSD_1.3 {
} FBSD_1.2;

View File

@ -282,7 +282,7 @@ procstat_getprocs(struct procstat *procstat, int what, int arg,
name[1] = KERN_PROC;
name[2] = what;
name[3] = arg;
error = sysctl(name, 4, NULL, &len, NULL, 0);
error = sysctl(name, nitems(name), NULL, &len, NULL, 0);
if (error < 0 && errno != EPERM) {
warn("sysctl(kern.proc)");
goto fail;
@ -299,7 +299,7 @@ procstat_getprocs(struct procstat *procstat, int what, int arg,
goto fail;
}
olen = len;
error = sysctl(name, 4, p, &len, NULL, 0);
error = sysctl(name, nitems(name), p, &len, NULL, 0);
} while (error < 0 && errno == ENOMEM && olen == len);
if (error < 0 && errno != EPERM) {
warn("sysctl(kern.proc)");
@ -1760,7 +1760,7 @@ getargv(struct procstat *procstat, struct kinfo_proc *kp, size_t nchr, int env)
name[2] = env ? KERN_PROC_ENV : KERN_PROC_ARGS;
name[3] = kp->ki_pid;
len = nchr;
error = sysctl(name, 4, av->buf, &len, NULL, 0);
error = sysctl(name, nitems(name), av->buf, &len, NULL, 0);
if (error != 0 && errno != ESRCH && errno != EPERM)
warn("sysctl(kern.proc.%s)", env ? "env" : "args");
if (error != 0 || len == 0)
@ -1983,7 +1983,7 @@ procstat_getgroups_sysctl(pid_t pid, unsigned int *cntp)
warn("malloc(%zu)", len);
return (NULL);
}
if (sysctl(mib, 4, groups, &len, NULL, 0) == -1) {
if (sysctl(mib, nitems(mib), groups, &len, NULL, 0) == -1) {
warn("sysctl: kern.proc.groups: %d", pid);
free(groups);
return (NULL);
@ -2059,7 +2059,7 @@ procstat_getumask_sysctl(pid_t pid, unsigned short *maskp)
mib[2] = KERN_PROC_UMASK;
mib[3] = pid;
len = sizeof(*maskp);
error = sysctl(mib, 4, maskp, &len, NULL, 0);
error = sysctl(mib, nitems(mib), maskp, &len, NULL, 0);
if (error != 0 && errno != ESRCH && errno != EPERM)
warn("sysctl: kern.proc.umask: %d", pid);
return (error);
@ -2139,7 +2139,7 @@ procstat_getrlimit_sysctl(pid_t pid, int which, struct rlimit* rlimit)
name[3] = pid;
name[4] = which;
len = sizeof(struct rlimit);
error = sysctl(name, 5, rlimit, &len, NULL, 0);
error = sysctl(name, nitems(name), rlimit, &len, NULL, 0);
if (error < 0 && errno != ESRCH) {
warn("sysctl: kern.proc.rlimit: %d", pid);
return (-1);
@ -2201,7 +2201,7 @@ procstat_getpathname_sysctl(pid_t pid, char *pathname, size_t maxlen)
name[2] = KERN_PROC_PATHNAME;
name[3] = pid;
len = maxlen;
error = sysctl(name, 4, pathname, &len, NULL, 0);
error = sysctl(name, nitems(name), pathname, &len, NULL, 0);
if (error != 0 && errno != ESRCH)
warn("sysctl: kern.proc.pathname: %d", pid);
if (len == 0)
@ -2281,7 +2281,7 @@ procstat_getosrel_sysctl(pid_t pid, int *osrelp)
name[2] = KERN_PROC_OSREL;
name[3] = pid;
len = sizeof(*osrelp);
error = sysctl(name, 4, osrelp, &len, NULL, 0);
error = sysctl(name, nitems(name), osrelp, &len, NULL, 0);
if (error != 0 && errno != ESRCH)
warn("sysctl: kern.proc.osrel: %d", pid);
return (error);
@ -2341,7 +2341,7 @@ is_elf32_sysctl(pid_t pid)
name[2] = KERN_PROC_SV_NAME;
name[3] = pid;
len = sizeof(sv_name);
error = sysctl(name, 4, sv_name, &len, NULL, 0);
error = sysctl(name, nitems(name), sv_name, &len, NULL, 0);
if (error != 0 || len == 0)
return (0);
for (i = 0; i < sizeof(elf32_sv_names) / sizeof(*elf32_sv_names); i++) {
@ -2372,7 +2372,7 @@ procstat_getauxv32_sysctl(pid_t pid, unsigned int *cntp)
warn("malloc(%zu)", len);
goto out;
}
if (sysctl(name, 4, auxv32, &len, NULL, 0) == -1) {
if (sysctl(name, nitems(name), auxv32, &len, NULL, 0) == -1) {
if (errno != ESRCH && errno != EPERM)
warn("sysctl: kern.proc.auxv: %d: %d", pid, errno);
goto out;
@ -2421,7 +2421,7 @@ procstat_getauxv_sysctl(pid_t pid, unsigned int *cntp)
warn("malloc(%zu)", len);
return (NULL);
}
if (sysctl(name, 4, auxv, &len, NULL, 0) == -1) {
if (sysctl(name, nitems(name), auxv, &len, NULL, 0) == -1) {
if (errno != ESRCH && errno != EPERM)
warn("sysctl: kern.proc.auxv: %d: %d", pid, errno);
free(auxv);
@ -2482,7 +2482,7 @@ procstat_getkstack_sysctl(pid_t pid, int *cntp)
name[3] = pid;
len = 0;
error = sysctl(name, 4, NULL, &len, NULL, 0);
error = sysctl(name, nitems(name), NULL, &len, NULL, 0);
if (error < 0 && errno != ESRCH && errno != EPERM && errno != ENOENT) {
warn("sysctl: kern.proc.kstack: %d", pid);
return (NULL);
@ -2499,7 +2499,7 @@ procstat_getkstack_sysctl(pid_t pid, int *cntp)
warn("malloc(%zu)", len);
return (NULL);
}
if (sysctl(name, 4, kkstp, &len, NULL, 0) == -1) {
if (sysctl(name, nitems(name), kkstp, &len, NULL, 0) == -1) {
warn("sysctl: kern.proc.pid: %d", pid);
free(kkstp);
return (NULL);

View File

@ -31,8 +31,8 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/user.h>
#include <sys/sysctl.h>
#include <sys/user.h>
#include <stdlib.h>
#include <string.h>
@ -75,14 +75,14 @@ kinfo_getallproc(int *cntp)
mib[2] = KERN_PROC_PROC;
len = 0;
if (sysctl(mib, 3, NULL, &len, NULL, 0) < 0)
if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) < 0)
return (NULL);
kipp = malloc(len);
if (kipp == NULL)
return (NULL);
if (sysctl(mib, 3, kipp, &len, NULL, 0) < 0)
if (sysctl(mib, nitems(mib), kipp, &len, NULL, 0) < 0)
goto bad;
if (len % sizeof(*kipp) != 0)
goto bad;

View File

@ -2,8 +2,8 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/user.h>
#include <sys/sysctl.h>
#include <sys/user.h>
#include <stdlib.h>
#include <string.h>
@ -26,14 +26,14 @@ kinfo_getfile(pid_t pid, int *cntp)
mib[2] = KERN_PROC_FILEDESC;
mib[3] = pid;
error = sysctl(mib, 4, NULL, &len, NULL, 0);
error = sysctl(mib, nitems(mib), NULL, &len, NULL, 0);
if (error)
return (NULL);
len = len * 4 / 3;
buf = malloc(len);
if (buf == NULL)
return (NULL);
error = sysctl(mib, 4, buf, &len, NULL, 0);
error = sysctl(mib, nitems(mib), buf, &len, NULL, 0);
if (error) {
free(buf);
return (NULL);

View File

@ -30,8 +30,8 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/user.h>
#include <sys/sysctl.h>
#include <sys/user.h>
#include <stdlib.h>
#include <string.h>
@ -49,14 +49,14 @@ kinfo_getproc(pid_t pid)
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = pid;
if (sysctl(mib, 4, NULL, &len, NULL, 0) < 0)
if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) < 0)
return (NULL);
kipp = malloc(len);
if (kipp == NULL)
return (NULL);
if (sysctl(mib, 4, kipp, &len, NULL, 0) < 0)
if (sysctl(mib, nitems(mib), kipp, &len, NULL, 0) < 0)
goto bad;
if (len != sizeof(*kipp))
goto bad;

View File

@ -2,8 +2,8 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/user.h>
#include <sys/sysctl.h>
#include <sys/user.h>
#include <stdlib.h>
#include <string.h>
@ -26,14 +26,14 @@ kinfo_getvmmap(pid_t pid, int *cntp)
mib[2] = KERN_PROC_VMMAP;
mib[3] = pid;
error = sysctl(mib, 4, NULL, &len, NULL, 0);
error = sysctl(mib, nitems(mib), NULL, &len, NULL, 0);
if (error)
return (NULL);
len = len * 4 / 3;
buf = malloc(len);
if (buf == NULL)
return (NULL);
error = sysctl(mib, 4, buf, &len, NULL, 0);
error = sysctl(mib, nitems(mib), buf, &len, NULL, 0);
if (error) {
free(buf);
return (NULL);

View File

@ -3,8 +3,8 @@
#
# List of PCI ID's
#
# Version: 2016.11.21
# Date: 2016-11-21 03:15:01
# Version: 2017.01.08
# Date: 2017-01-08 03:15:02
#
# Maintained by Albert Pool, Martin Mares, and other volunteers from
# the PCI ID Project at http://pci-ids.ucw.cz/.
@ -249,6 +249,7 @@
0014 MegaRAID Tri-Mode SAS3516
1028 1fd4 PERC H745P MX
1d49 0602 ThinkSystem RAID 930-16i 4GB Flash PCIe 12Gb Adapter
0015 MegaRAID Tri-Mode SAS3416
0016 MegaRAID Tri-Mode SAS3508
1028 1fc9 PERC H840 Adapter
1028 1fcb PERC H740P Adapter
@ -548,6 +549,7 @@
1028 1f53 HBA330 Mini
1028 1fd2 HBA330 MX
1028 1fd3 HBA330 MMZ
1bd4 0011 Inspur 12Gb 8i-3008 IT SAS HBA
00ab SAS3516 Fusion-MPT Tri-Mode RAID On Chip (ROC)
00ac SAS3416 Fusion-MPT Tri-Mode I/O Controller Chip (IOC)
1d49 0201 ThinkSystem 430-16i SAS/SATA 12Gb HBA
@ -2201,6 +2203,11 @@
67b9 Vesuvius [Radeon R9 295X2]
67be Hawaii LE
67c0 Ellesmere [Polaris10]
67c4 Ellesmere [Radeon Pro WX 7100]
67c7 Ellesmere [Radeon Pro WX 5100]
67ca Ellesmere [Polaris10]
67cc Ellesmere [Polaris10]
67cf Ellesmere [Polaris10]
67df Ellesmere [Radeon RX 470/480]
1002 0b37 Radeon RX 480
1043 04a8 Radeon RX 480
@ -2218,6 +2225,7 @@
1787 a480 Radeon RX 480
67e0 Baffin [Polaris11]
67e1 Baffin [Polaris11]
67e3 Baffin [Radeon Pro WX 4100]
67e8 Baffin [Polaris11]
67e9 Baffin [Polaris11]
67eb Baffin [Polaris11]
@ -2924,6 +2932,12 @@
148c 9380 Radeon R9 380
# Make naming scheme consistent
174b e308 Radeon R9 380 Nitro 4G D5
6980 Polaris12
6981 Polaris12
6985 Polaris12
6986 Polaris12
6987 Polaris12
699f Polaris12
700f RS100 AGP Bridge
7010 RS200/RS250 AGP Bridge
7100 R520 [Radeon X1800 XT]
@ -5095,6 +5109,7 @@
0675 1704 ISDN Adapter (PCI Bus, D, C)
0675 1707 ISDN Adapter (PCI Bus, DV, W)
10cf 105e ISDN Adapter (PCI Bus, DV, W)
13a0 Transformer Book T101HA-GR030R
# Should be 1022:9602
9602 AMD RS780/RS880 PCI to PCI bridge (int gfx)
1043 83a2 M4A785TD Motherboard
@ -10077,6 +10092,7 @@
10c3 GT218 [GeForce 8400 GS Rev. 3]
10c5 GT218 [GeForce 405]
10d8 GT218 [NVS 300]
10ef GP102 HDMI Audio Controller
10f0 GP104 High Definition Audio Controller
1140 GF117M [GeForce 610M/710M/810M/820M / GT 620M/625M/630M/720M]
1019 0799 GeForce 820M
@ -10620,7 +10636,7 @@
13f1 GM204GL [Quadro M4000]
13f2 GM204GL [Tesla M60]
13f3 GM204GL [Tesla M6]
13f8 GM204GLM [Quadro M5000M]
13f8 GM204GLM [Quadro M5000M / M5000 SE]
13f9 GM204GLM [Quadro M4000M]
13fa GM204GLM [Quadro M3000M]
10de 11c9 Quadro M3000 SE
@ -10634,8 +10650,9 @@
1431 GM206GL [Tesla M4]
15f0 GP100GL
15f1 GP100GL
15f8 GP100GL
15f9 GP100GL
15f7 GP100GL [Tesla P100 PCIe 12GB]
15f8 GP100GL [Tesla P100 PCIe 16GB]
15f9 GP100GL [Tesla P100 SMX2 16GB]
1617 GM204M [GeForce GTX 980M]
1618 GM204M [GeForce GTX 970M]
1619 GM204M [GeForce GTX 965M]
@ -10659,10 +10676,12 @@
1b81 GP104 [GeForce GTX 1070]
1b82 GP104
1b83 GP104
1b84 GP104 [GeForce GTX 1060 3GB]
1ba0 GP104M [GeForce GTX 1080]
1ba1 GP104M [GeForce GTX 1070]
1bb0 GP104GL [Quadro P5000]
1bb1 GP104GL
1bb3 GP104GL [Tesla P4]
1bb4 GP104GL
1be0 GP104M [GeForce GTX 1080]
1be1 GP104M [GeForce GTX 1070]
@ -10678,6 +10697,9 @@
1c80 GP107
1c81 GP107 [GeForce GTX 1050]
1c82 GP107 [GeForce GTX 1050 Ti]
1c8c GP107M [GeForce GTX 1050 Ti]
1c8d GP107M [GeForce GTX 1050]
1c8e GP107M
1ca7 GP107GL
1ca8 GP107GL
1caa GP107GL
@ -12103,7 +12125,11 @@
111f Precision Digital Images
4a47 Precision MX Video engine interface
5243 Frame capture bus interface
1120 EMC Corporation
# formerly EMC Corporation
1120 Dell EMC
2306 Unity Fibre Channel Controller
2501 Unity Ethernet Controller
2505 Unity Fibre Channel Controller
1121 Zilog
1122 Multi-tech Systems, Inc.
1123 Excellent Design, Inc.
@ -15975,7 +16001,7 @@
5081 T540-5081 Unified Wire Ethernet Controller
5082 T504-5082 Unified Wire Ethernet Controller
5083 T540-5083 Unified Wire Ethernet Controller
5084 T580-5084 Unified Wire Ethernet Controller
5084 T540-5084 Unified Wire Ethernet Controller
5085 T580-5085 Unified Wire Ethernet Controller
5086 T580-5086 Unified Wire Ethernet Controller
5087 T580-5087 Unified Wire Ethernet Controller
@ -15994,6 +16020,7 @@
509a T520-509A Unified Wire Ethernet Controller
509b T540-509B Unified Wire Ethernet Controller
509c T520-509C Unified Wire Ethernet Controller
509d T540-509D Unified Wire Ethernet Controller
5401 T520-CR Unified Wire Ethernet Controller
5402 T522-CR Unified Wire Ethernet Controller
5403 T540-CR Unified Wire Ethernet Controller
@ -16041,6 +16068,7 @@
549a T520-509A Unified Wire Ethernet Controller
549b T540-509B Unified Wire Ethernet Controller
549c T520-509C Unified Wire Ethernet Controller
549d T540-509D Unified Wire Ethernet Controller
5501 T520-CR Unified Wire Storage Controller
5502 T522-CR Unified Wire Storage Controller
5503 T540-CR Unified Wire Storage Controller
@ -16088,6 +16116,7 @@
559a T520-509A Unified Wire Storage Controller
559b T540-509B Unified Wire Storage Controller
559c T520-509C Unified Wire Storage Controller
559d T540-509D Unified Wire Storage Controller
5601 T520-CR Unified Wire Storage Controller
5602 T522-CR Unified Wire Storage Controller
5603 T540-CR Unified Wire Storage Controller
@ -16135,6 +16164,7 @@
569a T520-509A Unified Wire Storage Controller
569b T540-509B Unified Wire Storage Controller
569c T520-509C Unified Wire Storage Controller
569d T540-509D Unified Wire Storage Controller
5701 T520-CR Unified Wire Ethernet Controller
5702 T522-CR Unified Wire Ethernet Controller
5703 T540-CR Unified Wire Ethernet Controller
@ -16221,6 +16251,7 @@
589a T520-509A Unified Wire Ethernet Controller [VF]
589b T540-509B Unified Wire Ethernet Controller [VF]
589c T520-509C Unified Wire Ethernet Controller [VF]
589d T540-509D Unified Wire Ethernet Controller [VF]
6001 T6225-CR Unified Wire Ethernet Controller
6002 T6225-SO-CR Unified Wire Ethernet Controller
6003 T6425-CR Unified Wire Ethernet Controller
@ -16357,7 +16388,8 @@
144d Samsung Electronics Co Ltd
1600 Apple PCIe SSD
a800 XP941 PCIe SSD
a802 NVMe SSD Controller
a802 NVMe SSD Controller SM951/PM951
a804 NVMe SSD Controller SM961/PM961
a820 NVMe SSD Controller 171X
1028 1f95 Express Flash NVMe XS1715 SSD 400GB
1028 1f96 Express Flash NVMe XS1715 SSD 800GB
@ -17968,11 +18000,13 @@
15b3 Mellanox Technologies
0191 MT25408 [ConnectX IB Flash Recovery]
01f6 MT27500 Family [ConnectX-3 Flash Recovery]
01f8 MT27520 Family [ConnectX-3 Pro Flash Recovery]
01ff MT27600 Family [Connect-IB Flash Recovery]
0209 MT27700 Family [ConnectX-4 Flash Recovery]
020b MT27710 Family [ConnectX-4 Lx Flash Recovery]
020d MT28800 Family [ConnectX-5 Flash Recovery]
020f MT28908A0 Family [ConnectX-6 Flash Recovery]
0211 MT416842 Family [BlueField SoC Flash Recovery]
# reserved for RM#105916
024e MT53100 [Spectrum-2, Flash recovery mode]
# Actual value to be used
@ -18732,6 +18766,7 @@
7013 AP440-3: 32-Channel Isolated Digital Input Module
7014 AP445: 32-Channel Isolated Digital Output Module
7016 AP470 48-Channel TTL Level Digital Input/Output Module
7017 AP323 16-bit, 20 or 40 Channel Analog Input Module
7018 AP408: 32-Channel Digital I/O Module
701a AP220-16 12-Bit, 16-Channel Analog Output Module
701b AP231-16 16-Bit, 16-Channel Analog Output Module
@ -18992,6 +19027,7 @@
1160 ARC-1160 16-Port PCI-X to SATA RAID Controller
1170 ARC-1170 24-Port PCI-X to SATA RAID Controller
1201 ARC-1200 2-Port PCI-Express to SATA II RAID Controller
1203 ARC-1203 2/4/8 Port PCIe 2.0 to SATA 6Gb RAID Controller
1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller
1214 ARC-12x4 PCIe 2.0 to SAS/SATA 6Gb RAID Controller
17d3 1214 ARC-1214 4-Port PCIe 2.0 to SAS/SATA 6Gb RAID Controller
@ -19510,7 +19546,7 @@
1924 5105 SFN4111T-R5
1924 5201 SFN4112F-R1
1924 5202 SFN4112F-R2
0803 SFC9020 [Solarstorm]
0803 SFC9020 10G Ethernet Controller
1014 0478 2-port 10GbE Low-Latency (R7)
1014 0479 2-port 10GbE OpenOnload (R7)
1014 04a7 Solarflare 10Gb Low-latency Dual-port HBA (R7)
@ -19540,7 +19576,7 @@
1924 7207 SFN5162F-R7 SFP+ Server Adapter
1924 7a06 SFN5152F-R6 SFP+ Server Adapter
1924 7a07 SFN5152F-R7 SFP+ Server Adapter
0813 SFL9021 [Solarstorm]
0813 SFL9021 10GBASE-T Ethernet Controller
1924 6100 SFN5121T-R0 10GBASE-T Server Adapter
1924 6102 SFN5121T-R2 10GBASE-T Server Adapter
1924 6103 SFN5121T-R3 10GBASE-T Server Adapter
@ -19549,7 +19585,7 @@
1924 6904 SFN5111T-R4 10GBASE-T Server Adapter
1924 7104 SFN5161T-R4 10GBASE-T Server Adapter
1924 7904 SFN5151T-R4 10GBASE-T Server Adapter
0903 SFC9120
0903 SFC9120 10G Ethernet Controller
1014 04cc SFN7122F-R2 2x10GbE SFP+ Flareon Ultra
1924 8002 SFN7122F-R1 SFP+ Server Adapter
1924 8003 SFN7x41Q-R1 Flareon Ultra 7000 Series 10/40G Adapter
@ -19561,11 +19597,11 @@
1924 800d SFN7x02F-R3 Flareon 7000 Series 10G Adapter
1924 8010 SFA7942Q-R1 QSFP+ AOE Adapter
1924 8015 SFA7942Q-A5-0-R1 QSFP+ AOE Adapter
0923 SFC9140
0923 SFC9140 10/40G Ethernet Controller
1924 800b SFN7x42Q-R1 Flareon Ultra 7000 Series 10/40G Adapter
1924 800e SFN7x42Q-R2 Flareon Ultra 7000 Series 10/40G Adapter
1924 800f SFN7xx4F-R1 Flareon Ultra 7000 Series 10G Adapter
0a03 SFC9220
0a03 SFC9220 10/40G Ethernet Controller
1924 8011 SFN 8022-R1 Solarflare Flareon 8000 Series 10G Adapter
1924 8012 SFN8522-R1 Flareon Ultra 8000 Series 10G Adapter
1924 8013 SFN8042-R1 Solarflare Flareon 8000 Series 10/40G Adapter
@ -19574,10 +19610,11 @@
1924 8017 SFN8522-R2 Flareon Ultra 8000 Series 10G Adapter
1924 8018 SFN8042-R2 Flareon 8000 Series 10/40G Adapter
1924 8019 SFN8542-R2 Flareon Ultra 8000 Series 10/40G Adapter
1803 SFC9020 Virtual Function [Solarstorm]
1813 SFL9021 Virtual Function [Solarstorm]
1903 SFC9120 Virtual Function
1923 SFC9140 Virtual Function
1803 SFC9020 10G Ethernet Controller (Virtual Function)
1813 SFL9021 10GBASE-T Ethernet Controller (Virtual Function)
1903 SFC9120 10G Ethernet Controller (Virtual Function)
1923 SFC9140 10/40G Ethernet Controller (Virtual Function)
1a03 SFC9220 10/40G Ethernet Controller (Virtual Function)
6703 SFC4000 rev A iSCSI/Onload [Solarstorm]
10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard]
10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard]
@ -19864,6 +19901,7 @@
5801 DDRdrive X1
5808 DDRdrive X8
dd52 DDRdrive X1-30
19e5 Huawei Technologies Co., Ltd.
19e7 NET (Network Equipment Technologies)
1001 STIX DSP Card
1002 STIX - 1 Port T1/E1 Card
@ -20303,6 +20341,8 @@
0303 Simulyzer-RT CompactPCI Serial PSI5-SIM-1 card
0304 Simulyzer-RT CompactPCI Serial PWR-ANA-1 card
0305 Simulyzer-RT CompactPCI Serial CAN-1 card
1cd7 Nanjing Magewell Electronics Co., Ltd.
0010 Pro Capture Endpoint
1cdd secunet Security Networks AG
1ce4 Exablaze
0001 ExaNIC X4
@ -20310,6 +20350,7 @@
0003 ExaNIC X10
0004 ExaNIC X10-GM
0005 ExaNIC X40
0006 ExaNIC X10-HPT
1cf7 Subspace Dynamics
1d00 Pure Storage
1d1d CNEX Labs
@ -21336,6 +21377,27 @@
0813 Moorestown SC DMA
0814 Moorestown LPE DMA
0815 Moorestown SSP0
0817 Medfield Serial IO I2C Controller #3
0818 Medfield Serial IO I2C Controller #4
0819 Medfield Serial IO I2C Controller #5
081a Medfield GPIO Controller [Core]
081b Medfield Serial IO HSUART Controller #1
081c Medfield Serial IO HSUART Controller #2
081d Medfield Serial IO HSUART Controller #3
081e Medfield Serial IO HSUART DMA Controller
081f Medfield GPIO Controller [AON]
0820 Medfield SD Host Controller
0821 Medfield SDIO Controller #1
0822 Medfield SDIO Controller #2
0823 Medfield eMMC Controller #0
0824 Medfield eMMC Controller #1
0827 Medfield Serial IO DMA Controller
0828 Medfield Power Management Unit
0829 Medfield USB Device Controller (OTG)
082a Medfield SCU IPC
082c Medfield Serial IO I2C Controller #0
082d Medfield Serial IO I2C Controller #1
082e Medfield Serial IO I2C Controller #2
0885 Centrino Wireless-N + WiMAX 6150
8086 1305 Centrino Wireless-N + WiMAX 6150 BGN
8086 1307 Centrino Wireless-N + WiMAX 6150 BG
@ -22445,6 +22507,18 @@
1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller
8086 1161 82806AA PCI64 Hub APIC
1162 Xscale 80200 Big Endian Companion Chip
1190 Merrifield SD/SDIO/eMMC Controller
1191 Merrifield Serial IO HSUART Controller
1192 Merrifield Serial IO HSUART DMA Controller
1194 Merrifield Serial IO SPI Controller
1195 Merrifield Serial IO I2C Controller
1196 Merrifield Serial IO I2C Controller
1199 Merrifield GPIO Controller
119e Merrifield USB Device Controller (OTG)
11a0 Merrifield SCU IPC
11a1 Merrifield Power Management Unit
11a2 Merrifield Serial IO DMA Controller
11a5 Merrifield Serial IO PWM Controller
1200 IXP1200 Network Processor
172a 0000 AEP SSL Accelerator
1209 8255xER/82551IT Fast Ethernet Controller
@ -22917,8 +22991,8 @@
103c 0000 HPE Ethernet 10/20Gb 2-port 660FLB Adapter
103c 22fe HPE Ethernet 10/20Gb 2-port 660FLB Adapter
1588 Ethernet Controller XL710 for 20GbE backplane
103c 0000 HPE Ethernet 10/20Gb 2-port 660M Adapter
103c 22ff HPE Ethernet 10/20Gb 2-port 660M Adapter
103c 0000 Ethernet 10/20Gb 2-port 660M Adapter
103c 22ff Ethernet 10/20Gb 2-port 660M Adapter
1589 Ethernet Controller X710/X557-AT 10GBASE-T
108e 0000 Quad Port 10GBase-T Adapter
108e 7b1c Quad Port 10GBase-T Adapter
@ -22951,12 +23025,17 @@
15ac Ethernet Connection X552 10 GbE SFP+
15ad Ethernet Connection X552/X557-AT 10GBASE-T
15ae Ethernet Connection X552 1000BASE-T
15b0 Ethernet Connection X552 Backplane
15b4 X553 Virtual Function
15b5 DSL6340 USB 3.1 Controller [Alpine Ridge]
15b6 DSL6540 USB 3.1 Controller [Alpine Ridge]
15b7 Ethernet Connection (2) I219-LM
15b8 Ethernet Connection (2) I219-V
15b9 Ethernet Connection (3) I219-LM
15bb Ethernet Connection (7) I219-LM
15bc Ethernet Connection (7) I219-V
15bd Ethernet Connection (6) I219-LM
15be Ethernet Connection (6) I219-V
15bf JHL6240 Thunderbolt 3 NHI (Low Power) [Alpine Ridge LP 2016]
15c0 JHL6240 Thunderbolt 3 Bridge (Low Power) [Alpine Ridge LP 2016]
15c5 X553 Virtual Function
@ -24258,6 +24337,9 @@
24f4 Wireless 8260
# Snow Field Peak AC
8086 0030 Dual Band Wireless-AC 8260
24fd Wireless 8265 / 8275
# Windstorm Peak
8086 0010 Dual Band Wireless-AC 8265
2500 82820 820 (Camino) Chipset Host Bridge (MCH)
1028 0095 Precision Workstation 220 Chipset
1043 801c P3C-2000 system chipset
@ -25145,12 +25227,12 @@
1028 01da OptiPlex 745
1462 7235 P965 Neo MS-7235 mainboard
2826 C600/X79 series chipset SATA RAID Controller
1d49 0100 ThinkSystem RAID 331
1d49 0101 ThinkSystem RAID 331
1d49 0102 ThinkSystem RAID 331
1d49 0103 ThinkSystem RAID 331
1d49 0104 ThinkSystem RAID 331
1d49 0105 ThinkSystem RAID 331
1d49 0100 Intel RSTe SATA Software RAID
1d49 0101 Intel RSTe SATA Software RAID
1d49 0102 Intel RSTe SATA Software RAID
1d49 0103 Intel RSTe SATA Software RAID
1d49 0104 Intel RSTe SATA Software RAID
1d49 0105 Intel RSTe SATA Software RAID
2827 C610/X99 series chipset sSATA Controller [RAID mode]
2828 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode]
1028 01f3 Inspiron 1420
@ -26950,41 +27032,41 @@
530d 80310 (IOP) IO Processor
5845 QEMU NVM Express Controller
1af4 1100 QEMU Virtual Machine
5a84 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Integrated Graphics Controller
5a88 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Imaging Unit
5a98 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Audio Cluster
5a9a Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Trusted Execution Engine
5aa2 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Integrated Sensor Hub
5aa8 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series USB xHCI
5aac Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #1
5aae Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #2
5ab0 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #3
5ab2 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #4
5ab4 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #5
5ab6 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #6
5ab8 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #7
5aba Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series I2C Controller #8
5abc Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #1
5abe Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #2
5ac0 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #3
5ac2 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SPI Controller #1
5ac4 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SPI Controller #2
5ac6 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SPI Controller #3
5ac8 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PWM Pin Controller
5aca Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SDXC/MMC Host Controller
5acc Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series eMMC Controller
5ad0 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SDIO Controller
5ad4 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SMBus Controller
5ad6 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port B #1
5ad7 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port B #2
5ad8 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #1
5ad9 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #2
5ada Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #3
5adb Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series PCI Express Port A #4
5ae3 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series SATA AHCI Controller
5ae8 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Low Pin Count Interface
5aee Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series HSUART Controller #4
5af0 Atom/Celeron/Pentium Processor N4200/N3350/E3900 Series Host Bridge
5a84 Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Graphics Controller
5a88 Celeron N3350/Pentium N4200/Atom E3900 Series Imaging Unit
5a98 Celeron N3350/Pentium N4200/Atom E3900 Series Audio Cluster
5a9a Celeron N3350/Pentium N4200/Atom E3900 Series Trusted Execution Engine
5aa2 Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Sensor Hub
5aa8 Celeron N3350/Pentium N4200/Atom E3900 Series USB xHCI
5aac Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #1
5aae Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #2
5ab0 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #3
5ab2 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #4
5ab4 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #5
5ab6 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #6
5ab8 Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #7
5aba Celeron N3350/Pentium N4200/Atom E3900 Series I2C Controller #8
5abc Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #1
5abe Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #2
5ac0 Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #3
5ac2 Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #1
5ac4 Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #2
5ac6 Celeron N3350/Pentium N4200/Atom E3900 Series SPI Controller #3
5ac8 Celeron N3350/Pentium N4200/Atom E3900 Series PWM Pin Controller
5aca Celeron N3350/Pentium N4200/Atom E3900 Series SDXC/MMC Host Controller
5acc Celeron N3350/Pentium N4200/Atom E3900 Series eMMC Controller
5ad0 Celeron N3350/Pentium N4200/Atom E3900 Series SDIO Controller
5ad4 Celeron N3350/Pentium N4200/Atom E3900 Series SMBus Controller
5ad6 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port B #1
5ad7 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port B #2
5ad8 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #1
5ad9 Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #2
5ada Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #3
5adb Celeron N3350/Pentium N4200/Atom E3900 Series PCI Express Port A #4
5ae3 Celeron N3350/Pentium N4200/Atom E3900 Series SATA AHCI Controller
5ae8 Celeron N3350/Pentium N4200/Atom E3900 Series Low Pin Count Interface
5aee Celeron N3350/Pentium N4200/Atom E3900 Series HSUART Controller #4
5af0 Celeron N3350/Pentium N4200/Atom E3900 Series Host Bridge
65c0 5100 Chipset Memory Controller Hub
65e2 5100 Chipset PCI Express x4 Port 2
65e3 5100 Chipset PCI Express x4 Port 3
@ -27826,6 +27908,25 @@
a243 Lewisburg LPC or eSPI Controller
a252 Lewisburg SSATA Controller [AHCI mode]
a256 Lewisburg SSATA Controller [RAID mode]
a282 200 Series PCH SATA controller [AHCI mode]
a294 200 Series PCH PCI Express Root Port #1
a2a1 200 Series PCH PMC
a2a3 200 Series PCH SMBus Controller
a2a7 200 Series PCH Serial IO UART Controller #0
a2a8 200 Series PCH Serial IO UART Controller #1
a2a9 200 Series PCH Serial IO SPI Controller #0
a2aa 200 Series PCH Serial IO SPI Controller #1
a2af 200 Series PCH USB 3.0 xHCI Controller
a2b1 200 Series PCH Thermal Subsystem
a2ba 200 Series PCH CSME HECI #1
a2bb 200 Series PCH CSME HECI #2
a2c6 200 Series PCH LPC Controller
a2e0 200 Series PCH Serial IO I2C Controller #0
a2e1 200 Series PCH Serial IO I2C Controller #1
a2e2 200 Series PCH Serial IO I2C Controller #2
a2e3 200 Series PCH Serial IO I2C Controller #3
a2e6 200 Series PCH Serial IO UART Controller #2
a2f0 200 Series PCH HD Audio
a620 6400/6402 Advanced Memory Buffer (AMB)
abc0 Omni-Path Fabric Switch Silicon 100 Series
b152 21152 PCI-to-PCI Bridge
@ -28605,6 +28706,7 @@ f1d0 AJA Video
cafe Kona SD
cfee Xena LS/SD-22-DA/SD-DA
daff KONA LHi
db09 Corvid 24
dcaf Kona HD
dfee Xena HD-DA
efac Xena SD-MM/SD-22-MM

View File

@ -410,6 +410,63 @@ If foo has multiple source files, add the line:
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
The include file, <bsd.snmpmod.mk>, handles building MIB modules for bsnmpd
from one or more source files, along with their manual pages. It has a
limited number of suffixes, consistent with the current needs of the BSD
tree.
bsd.snmpmod.mk leverages bsd.lib.mk for building MIB modules and
bsd.files.mk for installing MIB description and definition files.
It has no additional targets.
It sets/uses the following variables:
BMIBS The MIB definitions to install.
BMIBSDIR The directory where the MIB definitions are installed.
This defaults to `${SHAREDIR}/snmp/mibs`.
DEFS The MIB description files to install.
DEFSDIR The directory where MIB description files are installed.
This defaults to `${SHAREDIR}/snmp/defs`.
EXTRAMIBDEFS Extra MIB description files to use as input when
generating ${MOD}_oid.h and ${MOD}_tree.[ch].
EXTRAMIBSYMS Extra MIB definition files used only for extracting
symbols.
EXTRAMIBSYMS are useful when resolving inter-module
dependencies and are useful with files containing only
enum-definitions.
See ${MOD}_oid.h for more details.
MOD The bsnmpd module name.
XSYM MIB names to extract symbols for. See ${MOD}_oid.h for
more details.
It generates the following files:
${MOD}_tree.c A source file and header which programmatically describes
${MOD}_tree.h the MIB (type, OID name, ACCESS attributes, etc).
The files are generated via "gensnmptree -p".
See gensnmptree(1) for more details.
${MOD}_oid.h A header which programmatically describes the MIB root and
MIB tables.
The files are generated via "gensnmptree -e".
See gensnmptree(1) for more details.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
The include file <bsd.subdir.mk> contains the default targets for building
subdirectories. It has the same seven targets as <bsd.prog.mk>: all, clean,
cleandir, depend, install, lint, and tags. For all of the directories

View File

@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
#include <dev/mmc/mmcbrvar.h>
#include <dev/sdhci/sdhci.h>
#include <dev/sdhci/sdhci_fdt_gpio.h>
#include "sdhci_if.h"
#include <arm/ti/ti_cpuid.h>
@ -61,7 +62,7 @@ __FBSDID("$FreeBSD$");
struct ti_sdhci_softc {
device_t dev;
device_t gpio_dev;
struct sdhci_fdt_gpio * gpio;
struct resource * mem_res;
struct resource * irq_res;
void * intr_cookie;
@ -362,20 +363,24 @@ static int
ti_sdhci_get_ro(device_t brdev, device_t reqdev)
{
struct ti_sdhci_softc *sc = device_get_softc(brdev);
unsigned int readonly = 0;
/* If a gpio pin is configured, read it. */
if (sc->gpio_dev != NULL) {
GPIO_PIN_GET(sc->gpio_dev, sc->wp_gpio_pin, &readonly);
}
return (sdhci_fdt_gpio_get_readonly(sc->gpio));
}
return (readonly);
static bool
ti_sdhci_get_card_present(device_t dev, struct sdhci_slot *slot)
{
struct ti_sdhci_softc *sc = device_get_softc(dev);
return (sdhci_fdt_gpio_get_present(sc->gpio));
}
static int
ti_sdhci_detach(device_t dev)
{
/* sdhci_fdt_gpio_teardown(sc->gpio); */
return (EBUSY);
}
@ -501,25 +506,6 @@ ti_sdhci_attach(device_t dev)
sc->slot.host.caps |= MMC_OCR_290_300 | MMC_OCR_300_310;
}
/*
* See if we've got a GPIO-based write detect pin. This is not the
* standard documented property for this, we added it in freebsd.
*/
if ((OF_getencprop(node, "mmchs-wp-gpio-pin", &prop, sizeof(prop))) <= 0)
sc->wp_gpio_pin = 0xffffffff;
else
sc->wp_gpio_pin = prop;
if (sc->wp_gpio_pin != 0xffffffff) {
sc->gpio_dev = devclass_get_device(devclass_find("gpio"), 0);
if (sc->gpio_dev == NULL)
device_printf(dev, "Error: No GPIO device, "
"Write Protect pin will not function\n");
else
GPIO_PIN_SETFLAGS(sc->gpio_dev, sc->wp_gpio_pin,
GPIO_PIN_INPUT);
}
/*
* Set the offset from the device's memory start to the MMCHS registers.
* Also for OMAP4 disable high speed mode due to erratum ID i626.
@ -572,6 +558,8 @@ ti_sdhci_attach(device_t dev)
goto fail;
}
sc->gpio = sdhci_fdt_gpio_setup(sc->dev, &sc->slot);
/* Initialise the MMCHS hardware. */
ti_sdhci_hw_init(dev);
@ -706,6 +694,7 @@ static device_method_t ti_sdhci_methods[] = {
DEVMETHOD(sdhci_write_2, ti_sdhci_write_2),
DEVMETHOD(sdhci_write_4, ti_sdhci_write_4),
DEVMETHOD(sdhci_write_multi_4, ti_sdhci_write_multi_4),
DEVMETHOD(sdhci_get_card_present, ti_sdhci_get_card_present),
DEVMETHOD_END
};

View File

@ -1,7 +1,7 @@
/*-
* Copyright (c) 2003-2009 Silicon Graphics International Corp.
* Copyright (c) 2012 The FreeBSD Foundation
* Copyright (c) 2015 Alexander Motin <mav@FreeBSD.org>
* Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Portions of this software were developed by Edward Tomasz Napierala
@ -2567,6 +2567,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
struct thread *td)
{
struct ctl_softc *softc = dev->si_drv1;
struct ctl_port *port;
struct ctl_lun *lun;
int retval;
@ -2778,6 +2779,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
#endif /* CTL_IO_DELAY */
break;
}
#ifdef CTL_LEGACY_STATS
case CTL_GETSTATS: {
struct ctl_stats *stats = (struct ctl_stats *)addr;
int i;
@ -2790,26 +2792,26 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
stats->status = CTL_SS_OK;
stats->fill_len = 0;
STAILQ_FOREACH(lun, &softc->lun_list, links) {
if (stats->fill_len + sizeof(lun->stats) >
if (stats->fill_len + sizeof(lun->legacy_stats) >
stats->alloc_len) {
stats->status = CTL_SS_NEED_MORE_SPACE;
break;
}
retval = copyout(&lun->stats, &stats->lun_stats[i++],
sizeof(lun->stats));
retval = copyout(&lun->legacy_stats, &stats->lun_stats[i++],
sizeof(lun->legacy_stats));
if (retval != 0)
break;
stats->fill_len += sizeof(lun->stats);
stats->fill_len += sizeof(lun->legacy_stats);
}
stats->num_luns = softc->num_luns;
#ifdef CTL_TIME_IO
stats->flags = CTL_STATS_FLAG_TIME_VALID;
#else
stats->flags = CTL_STATS_FLAG_NONE;
#ifdef CTL_TIME_IO
stats->flags |= CTL_STATS_FLAG_TIME_VALID;
#endif
getnanouptime(&stats->timestamp);
break;
}
#endif /* CTL_LEGACY_STATS */
case CTL_ERROR_INJECT: {
struct ctl_error_desc *err_desc, *new_err_desc;
@ -3397,6 +3399,72 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
ctl_isc_announce_port(port);
break;
}
case CTL_GET_LUN_STATS: {
struct ctl_get_io_stats *stats = (struct ctl_get_io_stats *)addr;
int i;
/*
* XXX KDM no locking here. If the LUN list changes,
* things can blow up.
*/
i = 0;
stats->status = CTL_SS_OK;
stats->fill_len = 0;
STAILQ_FOREACH(lun, &softc->lun_list, links) {
if (lun->lun < stats->first_item)
continue;
if (stats->fill_len + sizeof(lun->stats) >
stats->alloc_len) {
stats->status = CTL_SS_NEED_MORE_SPACE;
break;
}
retval = copyout(&lun->stats, &stats->stats[i++],
sizeof(lun->stats));
if (retval != 0)
break;
stats->fill_len += sizeof(lun->stats);
}
stats->num_items = softc->num_luns;
stats->flags = CTL_STATS_FLAG_NONE;
#ifdef CTL_TIME_IO
stats->flags |= CTL_STATS_FLAG_TIME_VALID;
#endif
getnanouptime(&stats->timestamp);
break;
}
case CTL_GET_PORT_STATS: {
struct ctl_get_io_stats *stats = (struct ctl_get_io_stats *)addr;
int i;
/*
* XXX KDM no locking here. If the LUN list changes,
* things can blow up.
*/
i = 0;
stats->status = CTL_SS_OK;
stats->fill_len = 0;
STAILQ_FOREACH(port, &softc->port_list, links) {
if (port->targ_port < stats->first_item)
continue;
if (stats->fill_len + sizeof(port->stats) >
stats->alloc_len) {
stats->status = CTL_SS_NEED_MORE_SPACE;
break;
}
retval = copyout(&port->stats, &stats->stats[i++],
sizeof(port->stats));
if (retval != 0)
break;
stats->fill_len += sizeof(port->stats);
}
stats->num_items = softc->num_ports;
stats->flags = CTL_STATS_FLAG_NONE;
#ifdef CTL_TIME_IO
stats->flags |= CTL_STATS_FLAG_TIME_VALID;
#endif
getnanouptime(&stats->timestamp);
break;
}
default: {
/* XXX KDM should we fix this? */
#if 0
@ -4391,7 +4459,7 @@ ctl_alloc_lun(struct ctl_softc *ctl_softc, struct ctl_lun *ctl_lun,
struct scsi_vpd_id_descriptor *desc;
struct scsi_vpd_id_t10 *t10id;
const char *eui, *naa, *scsiname, *uuid, *vendor, *value;
int lun_number, i, lun_malloced;
int lun_number, lun_malloced;
int devidlen, idlen1, idlen2 = 0, len;
if (be_lun == NULL)
@ -4585,6 +4653,10 @@ ctl_alloc_lun(struct ctl_softc *ctl_softc, struct ctl_lun *ctl_lun,
lun->ie_reported = 1;
callout_init_mtx(&lun->ie_callout, &lun->lun_lock, 0);
ctl_tpc_lun_init(lun);
if (lun->flags & CTL_LUN_REMOVABLE) {
lun->prevent = malloc((CTL_MAX_INITIATORS + 31) / 32 * 4,
M_CTL, M_WAITOK);
}
/*
* Initialize the mode and log page index.
@ -4609,13 +4681,16 @@ ctl_alloc_lun(struct ctl_softc *ctl_softc, struct ctl_lun *ctl_lun,
ctl_softc->num_luns++;
/* Setup statistics gathering */
lun->stats.device_type = be_lun->lun_type;
lun->stats.lun_number = lun_number;
lun->stats.blocksize = be_lun->blocksize;
#ifdef CTL_LEGACY_STATS
lun->legacy_stats.device_type = be_lun->lun_type;
lun->legacy_stats.lun_number = lun_number;
lun->legacy_stats.blocksize = be_lun->blocksize;
if (be_lun->blocksize == 0)
lun->stats.flags = CTL_LUN_STATS_NO_BLOCKSIZE;
for (i = 0;i < CTL_MAX_PORTS;i++)
lun->stats.ports[i].targ_port = i;
lun->legacy_stats.flags = CTL_LUN_STATS_NO_BLOCKSIZE;
for (len = 0; len < CTL_MAX_PORTS; len++)
lun->legacy_stats.ports[len].targ_port = len;
#endif /* CTL_LEGACY_STATS */
lun->stats.item = lun_number;
mtx_unlock(&ctl_softc->ctl_lock);
@ -4666,6 +4741,7 @@ ctl_free_lun(struct ctl_lun *lun)
for (i = 0; i < CTL_MAX_PORTS; i++)
free(lun->pr_keys[i], M_CTL);
free(lun->write_buffer, M_CTL);
free(lun->prevent, M_CTL);
if (lun->flags & CTL_LUN_MALLOCED)
free(lun, M_CTL);
@ -5276,7 +5352,7 @@ ctl_prevent_allow(struct ctl_scsiio *ctsio)
cdb = (struct scsi_prevent *)ctsio->cdb;
if ((lun->flags & CTL_LUN_REMOVABLE) == 0) {
if ((lun->flags & CTL_LUN_REMOVABLE) == 0 || lun->prevent == NULL) {
ctl_set_invalid_opcode(ctsio);
ctl_done((union ctl_io *)ctsio);
return (CTL_RETVAL_COMPLETE);
@ -6680,9 +6756,7 @@ ctl_sap_log_sense_handler(struct ctl_scsiio *ctsio,
{
struct ctl_lun *lun = CTL_LUN(ctsio);
struct stat_page *data;
uint64_t rn, wn, rb, wb;
struct bintime rt, wt;
int i;
struct bintime *t;
data = (struct stat_page *)page_index->page_data;
@ -6690,28 +6764,21 @@ ctl_sap_log_sense_handler(struct ctl_scsiio *ctsio,
data->sap.hdr.param_control = SLP_LBIN;
data->sap.hdr.param_len = sizeof(struct scsi_log_stat_and_perf) -
sizeof(struct scsi_log_param_header);
rn = wn = rb = wb = 0;
bintime_clear(&rt);
bintime_clear(&wt);
for (i = 0; i < CTL_MAX_PORTS; i++) {
rn += lun->stats.ports[i].operations[CTL_STATS_READ];
wn += lun->stats.ports[i].operations[CTL_STATS_WRITE];
rb += lun->stats.ports[i].bytes[CTL_STATS_READ];
wb += lun->stats.ports[i].bytes[CTL_STATS_WRITE];
bintime_add(&rt, &lun->stats.ports[i].time[CTL_STATS_READ]);
bintime_add(&wt, &lun->stats.ports[i].time[CTL_STATS_WRITE]);
scsi_u64to8b(lun->stats.operations[CTL_STATS_READ],
data->sap.read_num);
scsi_u64to8b(lun->stats.operations[CTL_STATS_WRITE],
data->sap.write_num);
if (lun->be_lun->blocksize > 0) {
scsi_u64to8b(lun->stats.bytes[CTL_STATS_WRITE] /
lun->be_lun->blocksize, data->sap.recvieved_lba);
scsi_u64to8b(lun->stats.bytes[CTL_STATS_READ] /
lun->be_lun->blocksize, data->sap.transmitted_lba);
}
scsi_u64to8b(rn, data->sap.read_num);
scsi_u64to8b(wn, data->sap.write_num);
if (lun->stats.blocksize > 0) {
scsi_u64to8b(wb / lun->stats.blocksize,
data->sap.recvieved_lba);
scsi_u64to8b(rb / lun->stats.blocksize,
data->sap.transmitted_lba);
}
scsi_u64to8b((uint64_t)rt.sec * 1000 + rt.frac / (UINT64_MAX / 1000),
t = &lun->stats.time[CTL_STATS_READ];
scsi_u64to8b((uint64_t)t->sec * 1000 + t->frac / (UINT64_MAX / 1000),
data->sap.read_int);
scsi_u64to8b((uint64_t)wt.sec * 1000 + wt.frac / (UINT64_MAX / 1000),
t = &lun->stats.time[CTL_STATS_WRITE];
scsi_u64to8b((uint64_t)t->sec * 1000 + t->frac / (UINT64_MAX / 1000),
data->sap.write_int);
scsi_u64to8b(0, data->sap.weighted_num);
scsi_u64to8b(0, data->sap.weighted_int);
@ -11872,8 +11939,10 @@ ctl_do_lun_reset(struct ctl_lun *lun, union ctl_io *io, ctl_ua_type ua_type)
ctl_clear_mask(lun->have_ca, i);
#endif
lun->prevent_count = 0;
for (i = 0; i < CTL_MAX_INITIATORS; i++)
ctl_clear_mask(lun->prevent, i);
if (lun->prevent) {
for (i = 0; i < CTL_MAX_INITIATORS; i++)
ctl_clear_mask(lun->prevent, i);
}
mtx_unlock(&lun->lun_lock);
return (0);
@ -12019,7 +12088,7 @@ ctl_i_t_nexus_reset(union ctl_io *io)
#endif
if ((lun->flags & CTL_LUN_RESERVED) && (lun->res_idx == initidx))
lun->flags &= ~CTL_LUN_RESERVED;
if (ctl_is_set(lun->prevent, initidx)) {
if (lun->prevent && ctl_is_set(lun->prevent, initidx)) {
ctl_clear_mask(lun->prevent, initidx);
lun->prevent_count--;
}
@ -13046,13 +13115,13 @@ static void
ctl_process_done(union ctl_io *io)
{
struct ctl_softc *softc = CTL_SOFTC(io);
struct ctl_port *port = CTL_PORT(io);
struct ctl_lun *lun = CTL_LUN(io);
void (*fe_done)(union ctl_io *io);
union ctl_ha_msg msg;
uint32_t targ_port = io->io_hdr.nexus.targ_port;
CTL_DEBUG_PRINT(("ctl_process_done\n"));
fe_done = softc->ctl_ports[targ_port]->fe_done;
fe_done = port->fe_done;
#ifdef CTL_TIME_IO
if ((time_uptime - io->io_hdr.start_time) > ctl_time_io_secs) {
@ -13155,11 +13224,13 @@ ctl_process_done(union ctl_io *io)
*/
if ((io->io_hdr.status & CTL_STATUS_MASK) == CTL_SUCCESS &&
io->io_hdr.io_type == CTL_IO_SCSI) {
#ifdef CTL_TIME_IO
struct bintime cur_bt;
#endif
int type;
#ifdef CTL_TIME_IO
struct bintime bt;
getbinuptime(&bt);
bintime_sub(&bt, &io->io_hdr.start_bt);
#endif
if ((io->io_hdr.flags & CTL_FLAG_DATA_MASK) ==
CTL_FLAG_DATA_IN)
type = CTL_STATS_READ;
@ -13169,18 +13240,38 @@ ctl_process_done(union ctl_io *io)
else
type = CTL_STATS_NO_IO;
lun->stats.ports[targ_port].bytes[type] +=
#ifdef CTL_LEGACY_STATS
uint32_t targ_port = port->targ_port;
lun->legacy_stats.ports[targ_port].bytes[type] +=
io->scsiio.kern_total_len;
lun->stats.ports[targ_port].operations[type]++;
#ifdef CTL_TIME_IO
bintime_add(&lun->stats.ports[targ_port].dma_time[type],
&io->io_hdr.dma_bt);
getbinuptime(&cur_bt);
bintime_sub(&cur_bt, &io->io_hdr.start_bt);
bintime_add(&lun->stats.ports[targ_port].time[type], &cur_bt);
#endif
lun->stats.ports[targ_port].num_dmas[type] +=
lun->legacy_stats.ports[targ_port].operations[type] ++;
lun->legacy_stats.ports[targ_port].num_dmas[type] +=
io->io_hdr.num_dmas;
#ifdef CTL_TIME_IO
bintime_add(&lun->legacy_stats.ports[targ_port].dma_time[type],
&io->io_hdr.dma_bt);
bintime_add(&lun->legacy_stats.ports[targ_port].time[type],
&bt);
#endif
#endif /* CTL_LEGACY_STATS */
lun->stats.bytes[type] += io->scsiio.kern_total_len;
lun->stats.operations[type] ++;
lun->stats.dmas[type] += io->io_hdr.num_dmas;
#ifdef CTL_TIME_IO
bintime_add(&lun->stats.dma_time[type], &io->io_hdr.dma_bt);
bintime_add(&lun->stats.time[type], &bt);
#endif
mtx_lock(&port->port_lock);
port->stats.bytes[type] += io->scsiio.kern_total_len;
port->stats.operations[type] ++;
port->stats.dmas[type] += io->io_hdr.num_dmas;
#ifdef CTL_TIME_IO
bintime_add(&port->stats.dma_time[type], &io->io_hdr.dma_bt);
bintime_add(&port->stats.time[type], &bt);
#endif
mtx_unlock(&port->port_lock);
}
/*

View File

@ -1,6 +1,6 @@
/*-
* Copyright (c) 2003 Silicon Graphics International Corp.
* Copyright (c) 2014-2015 Alexander Motin <mav@FreeBSD.org>
* Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -40,54 +40,7 @@
#ifndef _CTL_BACKEND_H_
#define _CTL_BACKEND_H_
/*
* XXX KDM move this to another header file?
*/
#define CTL_BE_NAME_LEN 32
/*
* The ID_REQ flag is used to say that the caller has requested a
* particular LUN ID in the req_lun_id field. If we cannot allocate that
* LUN ID, the ctl_add_lun() call will fail.
*
* The STOPPED flag tells us that the LUN should default to the powered
* off state. It will return 0x04,0x02 until it is powered up. ("Logical
* unit not ready, initializing command required.")
*
* The NO_MEDIA flag tells us that the LUN has no media inserted.
*
* The PRIMARY flag tells us that this LUN is registered as a Primary LUN
* which is accessible via the Master shelf controller in an HA. This flag
* being set indicates a Primary LUN. This flag being reset represents a
* Secondary LUN controlled by the Secondary controller in an HA
* configuration. Flag is applicable at this time to T_DIRECT types.
*
* The SERIAL_NUM flag tells us that the serial_num field is filled in and
* valid for use in SCSI INQUIRY VPD page 0x80.
*
* The DEVID flag tells us that the device_id field is filled in and
* valid for use in SCSI INQUIRY VPD page 0x83.
*
* The DEV_TYPE flag tells us that the device_type field is filled in.
*
* The EJECTED flag tells us that the removable LUN has tray open.
*
* The UNMAP flag tells us that this LUN supports UNMAP.
*
* The OFFLINE flag tells us that this LUN can not access backing store.
*/
typedef enum {
CTL_LUN_FLAG_ID_REQ = 0x01,
CTL_LUN_FLAG_STOPPED = 0x02,
CTL_LUN_FLAG_NO_MEDIA = 0x04,
CTL_LUN_FLAG_PRIMARY = 0x08,
CTL_LUN_FLAG_SERIAL_NUM = 0x10,
CTL_LUN_FLAG_DEVID = 0x20,
CTL_LUN_FLAG_DEV_TYPE = 0x40,
CTL_LUN_FLAG_UNMAP = 0x80,
CTL_LUN_FLAG_EJECTED = 0x100,
CTL_LUN_FLAG_READONLY = 0x200
} ctl_backend_lun_flags;
#include <cam/ctl/ctl_ioctl.h>
typedef enum {
CTL_LUN_SERSEQ_OFF,

View File

@ -1,5 +1,6 @@
/*-
* Copyright (c) 2003 Silicon Graphics International Corp.
* Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -192,13 +193,14 @@ error:
mtx_unlock(&softc->ctl_lock);
return (retval);
}
port->targ_port = port_num;
port->ctl_pool_ref = pool;
if (port->options.stqh_first == NULL)
STAILQ_INIT(&port->options);
port->stats.item = port_num;
mtx_init(&port->port_lock, "CTL port", NULL, MTX_DEF);
mtx_lock(&softc->ctl_lock);
port->targ_port = port_num;
STAILQ_INSERT_TAIL(&port->frontend->port_list, port, fe_links);
for (tport = NULL, nport = STAILQ_FIRST(&softc->port_list);
nport != NULL && nport->targ_port < port_num;
@ -218,17 +220,11 @@ int
ctl_port_deregister(struct ctl_port *port)
{
struct ctl_softc *softc = port->ctl_softc;
struct ctl_io_pool *pool;
int retval, i;
struct ctl_io_pool *pool = (struct ctl_io_pool *)port->ctl_pool_ref;
int i;
retval = 0;
pool = (struct ctl_io_pool *)port->ctl_pool_ref;
if (port->targ_port == -1) {
retval = 1;
goto bailout;
}
if (port->targ_port == -1)
return (1);
mtx_lock(&softc->ctl_lock);
STAILQ_REMOVE(&softc->port_list, port, ctl_port, links);
@ -251,9 +247,9 @@ ctl_port_deregister(struct ctl_port *port)
for (i = 0; i < port->max_initiators; i++)
free(port->wwpn_iid[i].name, M_CTL);
free(port->wwpn_iid, M_CTL);
mtx_destroy(&port->port_lock);
bailout:
return (retval);
return (0);
}
void

View File

@ -1,5 +1,6 @@
/*-
* Copyright (c) 2003 Silicon Graphics International Corp.
* Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -39,6 +40,8 @@
#ifndef _CTL_FRONTEND_H_
#define _CTL_FRONTEND_H_
#include <cam/ctl/ctl_ioctl.h>
typedef enum {
CTL_PORT_STATUS_NONE = 0x00,
CTL_PORT_STATUS_ONLINE = 0x01,
@ -243,6 +246,8 @@ struct ctl_port {
struct ctl_devid *port_devid; /* passed to CTL */
struct ctl_devid *target_devid; /* passed to CTL */
struct ctl_devid *init_devid; /* passed to CTL */
struct ctl_io_stats stats; /* used by CTL */
struct mtx port_lock; /* used by CTL */
STAILQ_ENTRY(ctl_port) fe_links; /* used by CTL */
STAILQ_ENTRY(ctl_port) links; /* used by CTL */
};

View File

@ -1,6 +1,7 @@
/*-
* Copyright (c) 2003 Silicon Graphics International Corp.
* Copyright (c) 2011 Spectra Logic Corporation
* Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -80,6 +81,9 @@
/* Hopefully this won't conflict with new misc devices that pop up */
#define CTL_MINOR 225
/* Legacy statistics accumulated for every port for every LU. */
//#define CTL_LEGACY_STATS 1
typedef enum {
CTL_DELAY_TYPE_NONE,
CTL_DELAY_TYPE_CONT,
@ -116,6 +120,18 @@ typedef enum {
} ctl_stat_types;
#define CTL_STATS_NUM_TYPES 3
typedef enum {
CTL_SS_OK,
CTL_SS_NEED_MORE_SPACE,
CTL_SS_ERROR
} ctl_stats_status;
typedef enum {
CTL_STATS_FLAG_NONE = 0x00,
CTL_STATS_FLAG_TIME_VALID = 0x01
} ctl_stats_flags;
#ifdef CTL_LEGACY_STATS
typedef enum {
CTL_LUN_STATS_NO_BLOCKSIZE = 0x01
} ctl_lun_stats_flags;
@ -137,17 +153,6 @@ struct ctl_lun_io_stats {
struct ctl_lun_io_port_stats ports[CTL_MAX_PORTS];
};
typedef enum {
CTL_SS_OK,
CTL_SS_NEED_MORE_SPACE,
CTL_SS_ERROR
} ctl_stats_status;
typedef enum {
CTL_STATS_FLAG_NONE = 0x00,
CTL_STATS_FLAG_TIME_VALID = 0x01
} ctl_stats_flags;
struct ctl_stats {
int alloc_len; /* passed to kernel */
struct ctl_lun_io_stats *lun_stats; /* passed to/from kernel */
@ -157,6 +162,27 @@ struct ctl_stats {
ctl_stats_flags flags; /* passed to userland */
struct timespec timestamp; /* passed to userland */
};
#endif /* CTL_LEGACY_STATS */
struct ctl_io_stats {
uint32_t item;
uint64_t bytes[CTL_STATS_NUM_TYPES];
uint64_t operations[CTL_STATS_NUM_TYPES];
uint64_t dmas[CTL_STATS_NUM_TYPES];
struct bintime time[CTL_STATS_NUM_TYPES];
struct bintime dma_time[CTL_STATS_NUM_TYPES];
};
struct ctl_get_io_stats {
struct ctl_io_stats *stats; /* passed to/from kernel */
size_t alloc_len; /* passed to kernel */
size_t fill_len; /* passed to userland */
int first_item; /* passed to kernel */
int num_items; /* passed to userland */
ctl_stats_status status; /* passed to userland */
ctl_stats_flags flags; /* passed to userland */
struct timespec timestamp; /* passed to userland */
};
/*
* The types of errors that can be injected:
@ -342,12 +368,54 @@ typedef enum {
CTL_LUNREQ_MODIFY,
} ctl_lunreq_type;
/*
* The ID_REQ flag is used to say that the caller has requested a
* particular LUN ID in the req_lun_id field. If we cannot allocate that
* LUN ID, the ctl_add_lun() call will fail.
*
* The STOPPED flag tells us that the LUN should default to the powered
* off state. It will return 0x04,0x02 until it is powered up. ("Logical
* unit not ready, initializing command required.")
*
* The NO_MEDIA flag tells us that the LUN has no media inserted.
*
* The PRIMARY flag tells us that this LUN is registered as a Primary LUN
* which is accessible via the Master shelf controller in an HA. This flag
* being set indicates a Primary LUN. This flag being reset represents a
* Secondary LUN controlled by the Secondary controller in an HA
* configuration. Flag is applicable at this time to T_DIRECT types.
*
* The SERIAL_NUM flag tells us that the serial_num field is filled in and
* valid for use in SCSI INQUIRY VPD page 0x80.
*
* The DEVID flag tells us that the device_id field is filled in and
* valid for use in SCSI INQUIRY VPD page 0x83.
*
* The DEV_TYPE flag tells us that the device_type field is filled in.
*
* The EJECTED flag tells us that the removable LUN has tray open.
*
* The UNMAP flag tells us that this LUN supports UNMAP.
*
* The OFFLINE flag tells us that this LUN can not access backing store.
*/
typedef enum {
CTL_LUN_FLAG_ID_REQ = 0x01,
CTL_LUN_FLAG_STOPPED = 0x02,
CTL_LUN_FLAG_NO_MEDIA = 0x04,
CTL_LUN_FLAG_PRIMARY = 0x08,
CTL_LUN_FLAG_SERIAL_NUM = 0x10,
CTL_LUN_FLAG_DEVID = 0x20,
CTL_LUN_FLAG_DEV_TYPE = 0x40,
CTL_LUN_FLAG_UNMAP = 0x80,
CTL_LUN_FLAG_EJECTED = 0x100,
CTL_LUN_FLAG_READONLY = 0x200
} ctl_backend_lun_flags;
/*
* LUN creation parameters:
*
* flags: Various LUN flags, see ctl_backend.h for a
* description of the flag values and meanings.
* flags: Various LUN flags, see above.
*
* device_type: The SCSI device type. e.g. 0 for Direct Access,
* 3 for Processor, etc. Only certain backends may
@ -465,6 +533,7 @@ union ctl_lunreq_data {
* kern_be_args: For kernel use only.
*/
struct ctl_lun_req {
#define CTL_BE_NAME_LEN 32
char backend[CTL_BE_NAME_LEN];
ctl_lunreq_type reqtype;
union ctl_lunreq_data reqdata;
@ -777,6 +846,8 @@ struct ctl_lun_map {
#define CTL_PORT_REQ _IOWR(CTL_MINOR, 0x26, struct ctl_req)
#define CTL_PORT_LIST _IOWR(CTL_MINOR, 0x27, struct ctl_lun_list)
#define CTL_LUN_MAP _IOW(CTL_MINOR, 0x28, struct ctl_lun_map)
#define CTL_GET_LUN_STATS _IOWR(CTL_MINOR, 0x29, struct ctl_get_io_stats)
#define CTL_GET_PORT_STATS _IOWR(CTL_MINOR, 0x2a, struct ctl_get_io_stats)
#endif /* _CTL_IOCTL_H_ */

View File

@ -1,6 +1,6 @@
/*-
* Copyright (c) 2003, 2004, 2005, 2008 Silicon Graphics International Corp.
* Copyright (c) 2014-2015 Alexander Motin <mav@FreeBSD.org>
* Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -404,7 +404,10 @@ struct ctl_lun {
struct callout ie_callout; /* INTERVAL TIMER */
struct ctl_mode_pages mode_pages;
struct ctl_log_pages log_pages;
struct ctl_lun_io_stats stats;
#ifdef CTL_LEGACY_STATS
struct ctl_lun_io_stats legacy_stats;
#endif /* CTL_LEGACY_STATS */
struct ctl_io_stats stats;
uint32_t res_idx;
uint32_t pr_generation;
uint64_t *pr_keys[CTL_MAX_PORTS];
@ -412,7 +415,7 @@ struct ctl_lun {
uint32_t pr_res_idx;
uint8_t pr_res_type;
int prevent_count;
uint32_t prevent[(CTL_MAX_INITIATORS+31)/32];
uint32_t *prevent;
uint8_t *write_buffer;
struct ctl_devid *lun_devid;
TAILQ_HEAD(tpc_lists, tpc_list) tpc_lists;

View File

@ -2824,6 +2824,7 @@ dev/scc/scc_dev_quicc.c optional scc quicc
dev/scc/scc_dev_sab82532.c optional scc
dev/scc/scc_dev_z8530.c optional scc
dev/sdhci/sdhci.c optional sdhci
dev/sdhci/sdhci_fdt_gpio.c optional sdhci fdt gpio
dev/sdhci/sdhci_if.m optional sdhci
dev/sdhci/sdhci_pci.c optional sdhci pci
dev/sf/if_sf.c optional sf pci

View File

@ -99,17 +99,24 @@ etherswitch_probe(device_t dev)
static int
etherswitch_attach(device_t dev)
{
struct etherswitch_softc *sc = (struct etherswitch_softc *)device_get_softc(dev);
int err;
struct etherswitch_softc *sc;
struct make_dev_args devargs;
sc = device_get_softc(dev);
sc->sc_dev = dev;
sc->sc_devnode = make_dev(&etherswitch_cdevsw, device_get_unit(dev),
UID_ROOT, GID_WHEEL,
0600, "etherswitch%d", device_get_unit(dev));
if (sc->sc_devnode == NULL) {
make_dev_args_init(&devargs);
devargs.mda_devsw = &etherswitch_cdevsw;
devargs.mda_uid = UID_ROOT;
devargs.mda_gid = GID_WHEEL;
devargs.mda_mode = 0600;
devargs.mda_si_drv1 = sc;
err = make_dev_s(&devargs, &sc->sc_devnode, "etherswitch%d",
device_get_unit(dev));
if (err != 0) {
device_printf(dev, "failed to create character device\n");
return (ENXIO);
}
sc->sc_devnode->si_drv1 = sc;
return (0);
}

View File

@ -78,18 +78,25 @@ gpioc_probe(device_t dev)
static int
gpioc_attach(device_t dev)
{
struct gpioc_softc *sc = device_get_softc(dev);
int err;
struct gpioc_softc *sc;
struct make_dev_args devargs;
sc = device_get_softc(dev);
sc->sc_dev = dev;
sc->sc_pdev = device_get_parent(dev);
sc->sc_unit = device_get_unit(dev);
sc->sc_ctl_dev = make_dev(&gpioc_cdevsw, sc->sc_unit,
UID_ROOT, GID_WHEEL, 0600, "gpioc%d", sc->sc_unit);
if (!sc->sc_ctl_dev) {
make_dev_args_init(&devargs);
devargs.mda_devsw = &gpioc_cdevsw;
devargs.mda_uid = UID_ROOT;
devargs.mda_gid = GID_WHEEL;
devargs.mda_mode = 0600;
devargs.mda_si_drv1 = sc;
err = make_dev_s(&devargs, &sc->sc_ctl_dev, "gpioc%d", sc->sc_unit);
if (err != 0) {
printf("Failed to create gpioc%d", sc->sc_unit);
return (ENXIO);
}
sc->sc_ctl_dev->si_drv1 = sc;
return (0);
}

View File

@ -79,9 +79,17 @@ struct hyperv_guid {
#define HYPERV_GUID_STRLEN 40
int hyperv_guid2str(const struct hyperv_guid *, char *, size_t);
typedef uint64_t (*hyperv_tc64_t)(void);
extern u_int hyperv_features; /* CPUID_HV_MSR_ */
int hyperv_guid2str(const struct hyperv_guid *, char *,
size_t);
/*
* hyperv_tc64 could be NULL, if there were no suitable Hyper-V
* specific timecounter.
*/
extern hyperv_tc64_t hyperv_tc64;
extern u_int hyperv_features; /* CPUID_HV_MSR_ */
#endif /* _KERNEL */

View File

@ -52,8 +52,7 @@ __FBSDID("$FreeBSD$");
VMBUS_ICVER_LE(VMBUS_IC_VERSION(4, 0), (sc)->ic_msgver)
#define VMBUS_TIMESYNC_DORTT(sc) \
(VMBUS_TIMESYNC_MSGVER4((sc)) &&\
(hyperv_features & CPUID_HV_MSR_TIME_REFCNT))
(VMBUS_TIMESYNC_MSGVER4((sc)) && hyperv_tc64 != NULL)
static int vmbus_timesync_probe(device_t);
static int vmbus_timesync_attach(device_t);
@ -117,7 +116,7 @@ vmbus_timesync(struct vmbus_ic_softc *sc, uint64_t hvtime, uint64_t sent_tc,
uint64_t hv_ns, vm_ns, rtt = 0;
if (VMBUS_TIMESYNC_DORTT(sc))
rtt = rdmsr(MSR_HV_TIME_REF_COUNT) - sent_tc;
rtt = hyperv_tc64() - sent_tc;
hv_ns = (hvtime - VMBUS_ICMSG_TS_BASE + rtt) * HYPERV_TIMER_NS_FACTOR;
nanotime(&vm_ts);

View File

@ -133,8 +133,8 @@ hyperv_tsc_vdso_timehands(struct vdso_timehands *vdso_th,
}
#define HYPERV_TSC_TIMECOUNT(fence) \
static u_int \
hyperv_tsc_timecount_##fence(struct timecounter *tc) \
static uint64_t \
hyperv_tc64_tsc_##fence(void) \
{ \
struct hyperv_reftsc *tsc_ref = hyperv_ref_tsc.tsc_ref; \
uint32_t seq; \
@ -161,6 +161,13 @@ hyperv_tsc_timecount_##fence(struct timecounter *tc) \
} \
/* Fallback to the generic timecounter, i.e. rdmsr. */ \
return (rdmsr(MSR_HV_TIME_REF_COUNT)); \
} \
\
static u_int \
hyperv_tsc_timecount_##fence(struct timecounter *tc __unused) \
{ \
\
return (hyperv_tc64_tsc_##fence()); \
} \
struct __hack
@ -170,6 +177,7 @@ HYPERV_TSC_TIMECOUNT(mfence);
static void
hyperv_tsc_tcinit(void *dummy __unused)
{
hyperv_tc64_t tc64 = NULL;
uint64_t val, orig;
if ((hyperv_features &
@ -182,11 +190,13 @@ hyperv_tsc_tcinit(void *dummy __unused)
case CPU_VENDOR_AMD:
hyperv_tsc_timecounter.tc_get_timecount =
hyperv_tsc_timecount_mfence;
tc64 = hyperv_tc64_tsc_mfence;
break;
case CPU_VENDOR_INTEL:
hyperv_tsc_timecounter.tc_get_timecount =
hyperv_tsc_timecount_lfence;
tc64 = hyperv_tc64_tsc_lfence;
break;
default:
@ -211,6 +221,10 @@ hyperv_tsc_tcinit(void *dummy __unused)
/* Register "enlightened" timecounter. */
tc_init(&hyperv_tsc_timecounter);
/* Install 64 bits timecounter method for other modules to use. */
KASSERT(tc64 != NULL, ("tc64 is not set"));
hyperv_tc64 = tc64;
/* Add device for mmap(2). */
make_dev(&hyperv_tsc_cdevsw, 0, UID_ROOT, GID_WHEEL, 0444,
HYPERV_REFTSC_DEVNAME);

View File

@ -77,6 +77,8 @@ u_int hyperv_recommends;
static u_int hyperv_pm_features;
static u_int hyperv_features3;
hyperv_tc64_t hyperv_tc64;
static struct timecounter hyperv_timecounter = {
.tc_get_timecount = hyperv_get_timecount,
.tc_poll_pps = NULL,
@ -96,6 +98,13 @@ hyperv_get_timecount(struct timecounter *tc __unused)
return rdmsr(MSR_HV_TIME_REF_COUNT);
}
static uint64_t
hyperv_tc64_rdmsr(void)
{
return (rdmsr(MSR_HV_TIME_REF_COUNT));
}
uint64_t
hypercall_post_message(bus_addr_t msg_paddr)
{
@ -232,6 +241,12 @@ hyperv_init(void *dummy __unused)
if (hyperv_features & CPUID_HV_MSR_TIME_REFCNT) {
/* Register Hyper-V timecounter */
tc_init(&hyperv_timecounter);
/*
* Install 64 bits timecounter method for other modules
* to use.
*/
hyperv_tc64 = hyperv_tc64_rdmsr;
}
}
SYSINIT(hyperv_initialize, SI_SUB_HYPERVISOR, SI_ORDER_FIRST, hyperv_init,

View File

@ -48,13 +48,10 @@ __FBSDID("$FreeBSD$");
MSR_HV_STIMER_CFG_SINT_MASK)
/*
* Two additionally required features:
* Additionally required feature:
* - SynIC is needed for interrupt generation.
* - Time reference counter is needed to set ABS reference count to
* STIMER0_COUNT.
*/
#define CPUID_HV_ET_MASK (CPUID_HV_MSR_TIME_REFCNT | \
CPUID_HV_MSR_SYNIC | \
#define CPUID_HV_ET_MASK (CPUID_HV_MSR_SYNIC | \
CPUID_HV_MSR_SYNTIMER)
static void vmbus_et_identify(driver_t *, device_t);
@ -102,7 +99,7 @@ vmbus_et_start(struct eventtimer *et __unused, sbintime_t first,
{
uint64_t current;
current = rdmsr(MSR_HV_TIME_REF_COUNT);
current = hyperv_tc64();
current += hyperv_sbintime2count(first);
wrmsr(MSR_HV_STIMER0_COUNT, current);
@ -131,7 +128,8 @@ vmbus_et_identify(driver_t *driver, device_t parent)
{
if (device_get_unit(parent) != 0 ||
device_find_child(parent, VMBUS_ET_NAME, -1) != NULL ||
(hyperv_features & CPUID_HV_ET_MASK) != CPUID_HV_ET_MASK)
(hyperv_features & CPUID_HV_ET_MASK) != CPUID_HV_ET_MASK ||
hyperv_tc64 == NULL)
return;
device_add_child(parent, VMBUS_ET_NAME, -1);
@ -187,9 +185,8 @@ vmbus_et_attach(device_t dev)
vmbus_et.et_start = vmbus_et_start;
/*
* Delay a bit to make sure that MSR_HV_TIME_REF_COUNT will
* not return 0, since writing 0 to STIMER0_COUNT will disable
* STIMER0.
* Delay a bit to make sure that hyperv_tc64 will not return 0,
* since writing 0 to STIMER0_COUNT will disable STIMER0.
*/
DELAY(100);
smp_rendezvous(NULL, vmbus_et_config, NULL, NULL);

View File

@ -545,6 +545,8 @@ mmcsd_task(void *arg)
bp->bio_error = EIO;
bp->bio_resid = (end - block) * sz;
bp->bio_flags |= BIO_ERROR;
} else {
bp->bio_resid = 0;
}
biodone(bp);
}

View File

@ -25,7 +25,6 @@
#define RTWN_TX_DESC_SIZE 64
#define RTWN_RXBUFSZ (8 * 1024)
#define RTWN_TXBUFSZ (16 * 1024)
#define RTWN_BCN_MAX_SIZE 512

View File

@ -133,8 +133,9 @@ rtwn_usb_alloc_rx_list(struct rtwn_softc *sc)
struct rtwn_usb_softc *uc = RTWN_USB_SOFTC(sc);
int error, i;
/* XXX recheck */
error = rtwn_usb_alloc_list(sc, uc->uc_rx, RTWN_USB_RX_LIST_COUNT,
RTWN_RXBUFSZ);
sc->rx_dma_size + 1024);
if (error != 0)
return (error);

View File

@ -63,7 +63,6 @@ static struct usb_config rtwn_config[RTWN_N_TRANSFER] = {
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.bufsize = RTWN_RXBUFSZ,
.flags = {
.pipe_bof = 1,
.short_xfer_ok = 1
@ -222,6 +221,7 @@ rtwn_usb_setup_endpoints(struct rtwn_usb_softc *uc)
break;
}
rtwn_config[RTWN_BULK_RX].bufsize = sc->rx_dma_size + 1024;
error = usbd_transfer_setup(uc->uc_udev, &iface_index,
uc->uc_xfer, rtwn_config, RTWN_N_TRANSFER, uc, &sc->sc_mtx);
if (error) {

View File

@ -158,8 +158,12 @@ rtwn_rxeof(struct rtwn_softc *sc, uint8_t *buf, int len)
/* Make sure everything fits in xfer. */
totlen = sizeof(*stat) + infosz + pktlen;
if (totlen > len)
if (totlen > len) {
device_printf(sc->sc_dev,
"%s: totlen (%d) > len (%d)!\n",
__func__, totlen, len);
break;
}
if (m0 == NULL)
m0 = m = rtwn_rx_copy_to_mbuf(sc, stat, totlen);

View File

@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
#include <arm/freescale/imx/imx_ccmvar.h>
#endif
#include <dev/gpio/gpiobusvar.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
@ -67,6 +68,7 @@ __FBSDID("$FreeBSD$");
#include <dev/mmc/mmcbrvar.h>
#include <dev/sdhci/sdhci.h>
#include <dev/sdhci/sdhci_fdt_gpio.h>
#include "sdhci_if.h"
struct fsl_sdhci_softc {
@ -77,10 +79,10 @@ struct fsl_sdhci_softc {
struct sdhci_slot slot;
struct callout r1bfix_callout;
sbintime_t r1bfix_timeout_at;
struct sdhci_fdt_gpio * gpio;
uint32_t baseclk_hz;
uint32_t cmd_and_mode;
uint32_t r1bfix_intmask;
boolean_t force_card_present;
uint16_t sdclockreg_freq_bits;
uint8_t r1bfix_type;
uint8_t hwtype;
@ -345,8 +347,6 @@ fsl_sdhci_read_4(device_t dev, struct sdhci_slot *slot, bus_size_t off)
val32 &= 0x000F0F07;
val32 |= (wrk32 >> 4) & SDHCI_STATE_DAT_MASK;
val32 |= (wrk32 >> 9) & SDHCI_RETUNE_REQUEST;
if (sc->force_card_present)
val32 |= SDHCI_CARD_PRESENT;
return (val32);
}
@ -752,9 +752,15 @@ fsl_sdhci_get_ro(device_t bus, device_t child)
{
struct fsl_sdhci_softc *sc = device_get_softc(bus);
if (RD4(sc, SDHCI_PRESENT_STATE) & SDHC_PRES_WPSPL)
return (false);
return (true);
return (sdhci_fdt_gpio_get_readonly(sc->gpio));
}
static bool
fsl_sdhci_get_card_present(device_t dev, struct sdhci_slot *slot)
{
struct fsl_sdhci_softc *sc = device_get_softc(dev);
return (sdhci_fdt_gpio_get_present(sc->gpio));
}
#ifdef __powerpc__
@ -802,6 +808,7 @@ static int
fsl_sdhci_detach(device_t dev)
{
/* sdhci_fdt_gpio_teardown(sc->gpio); */
return (EBUSY);
}
@ -810,8 +817,8 @@ fsl_sdhci_attach(device_t dev)
{
struct fsl_sdhci_softc *sc = device_get_softc(dev);
int rid, err;
phandle_t node;
#ifdef __powerpc__
phandle_t node;
uint32_t protctl;
#endif
@ -887,24 +894,13 @@ fsl_sdhci_attach(device_t dev)
sc->slot.max_clk = sc->baseclk_hz;
/*
* If the slot is flagged with the non-removable property, set our flag
* to always force the SDHCI_CARD_PRESENT bit on.
*
* XXX Workaround for gpio-based card detect...
*
* We don't have gpio support yet. If there's a cd-gpios property just
* force the SDHCI_CARD_PRESENT bit on for now. If there isn't really a
* card there it will fail to probe at the mmc layer and nothing bad
* happens except instantiating an mmcN device for an empty slot.
* Set up any gpio pin handling described in the FDT data. This cannot
* fail; see comments in sdhci_fdt_gpio.h for details.
*/
node = ofw_bus_get_node(dev);
if (OF_hasprop(node, "non-removable"))
sc->force_card_present = true;
else if (OF_hasprop(node, "cd-gpios")) {
/* XXX put real gpio hookup here. */
sc->force_card_present = true;
}
sc->gpio = sdhci_fdt_gpio_setup(dev, &sc->slot);
#ifdef __powerpc__
node = ofw_bus_get_node(dev);
/* Default to big-endian on powerpc */
protctl = RD4(sc, SDHC_PROT_CTRL);
protctl &= ~SDHC_PROT_EMODE_MASK;
@ -974,7 +970,7 @@ static device_method_t fsl_sdhci_methods[] = {
DEVMETHOD(mmcbr_acquire_host, sdhci_generic_acquire_host),
DEVMETHOD(mmcbr_release_host, sdhci_generic_release_host),
/* SDHCI registers accessors */
/* SDHCI accessors */
DEVMETHOD(sdhci_read_1, fsl_sdhci_read_1),
DEVMETHOD(sdhci_read_2, fsl_sdhci_read_2),
DEVMETHOD(sdhci_read_4, fsl_sdhci_read_4),
@ -983,6 +979,7 @@ static device_method_t fsl_sdhci_methods[] = {
DEVMETHOD(sdhci_write_2, fsl_sdhci_write_2),
DEVMETHOD(sdhci_write_4, fsl_sdhci_write_4),
DEVMETHOD(sdhci_write_multi_4, fsl_sdhci_write_multi_4),
DEVMETHOD(sdhci_get_card_present,fsl_sdhci_get_card_present),
{ 0, 0 }
};

View File

@ -73,6 +73,7 @@ static void sdhci_set_clock(struct sdhci_slot *slot, uint32_t clock);
static void sdhci_start(struct sdhci_slot *slot);
static void sdhci_start_data(struct sdhci_slot *slot, struct mmc_data *data);
static void sdhci_card_poll(void *);
static void sdhci_card_task(void *, int);
/* helper routines */
@ -89,6 +90,9 @@ static void sdhci_card_task(void *, int);
#define SDHCI_200_MAX_DIVIDER 256
#define SDHCI_300_MAX_DIVIDER 2046
#define SDHCI_CARD_PRESENT_TICKS (hz / 5)
#define SDHCI_INSERT_DELAY_TICKS (hz / 2)
/*
* Broadcom BCM577xx Controller Constants
*/
@ -229,10 +233,15 @@ sdhci_init(struct sdhci_slot *slot)
slot->intmask = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT |
SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_INDEX |
SDHCI_INT_END_BIT | SDHCI_INT_CRC | SDHCI_INT_TIMEOUT |
SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT |
SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL |
SDHCI_INT_DMA_END | SDHCI_INT_DATA_END | SDHCI_INT_RESPONSE |
SDHCI_INT_ACMD12ERR;
if (!(slot->quirks & SDHCI_QUIRK_POLL_CARD_PRESENT) &&
!(slot->opt & SDHCI_NON_REMOVABLE)) {
slot->intmask |= SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT;
}
WR4(slot, SDHCI_INT_ENABLE, slot->intmask);
WR4(slot, SDHCI_SIGNAL_ENABLE, slot->intmask);
}
@ -367,6 +376,13 @@ sdhci_set_power(struct sdhci_slot *slot, u_char power)
/* Turn on the power. */
pwr |= SDHCI_POWER_ON;
WR1(slot, SDHCI_POWER_CONTROL, pwr);
if (slot->quirks & SDHCI_QUIRK_INTEL_POWER_UP_RESET) {
WR1(slot, SDHCI_POWER_CONTROL, pwr | 0x10);
DELAY(10);
WR1(slot, SDHCI_POWER_CONTROL, pwr);
DELAY(300);
}
}
static void
@ -474,14 +490,6 @@ sdhci_transfer_pio(struct sdhci_slot *slot)
}
}
static void
sdhci_card_delay(void *arg)
{
struct sdhci_slot *slot = arg;
taskqueue_enqueue(taskqueue_swi_giant, &slot->card_task);
}
static void
sdhci_card_task(void *arg, int pending)
{
@ -491,6 +499,8 @@ sdhci_card_task(void *arg, int pending)
if (SDHCI_GET_CARD_PRESENT(slot->bus, slot)) {
if (slot->dev == NULL) {
/* If card is present - attach mmc bus. */
if (bootverbose || sdhci_debug)
slot_printf(slot, "Card inserted\n");
slot->dev = device_add_child(slot->bus, "mmc", -1);
device_set_ivars(slot->dev, slot);
SDHCI_UNLOCK(slot);
@ -500,6 +510,8 @@ sdhci_card_task(void *arg, int pending)
} else {
if (slot->dev != NULL) {
/* If no card present - detach mmc bus. */
if (bootverbose || sdhci_debug)
slot_printf(slot, "Card removed\n");
device_t d = slot->dev;
slot->dev = NULL;
SDHCI_UNLOCK(slot);
@ -509,6 +521,51 @@ sdhci_card_task(void *arg, int pending)
}
}
static void
sdhci_handle_card_present_locked(struct sdhci_slot *slot, bool is_present)
{
bool was_present;
/*
* If there was no card and now there is one, schedule the task to
* create the child device after a short delay. The delay is to
* debounce the card insert (sometimes the card detect pin stabilizes
* before the other pins have made good contact).
*
* If there was a card present and now it's gone, immediately schedule
* the task to delete the child device. No debouncing -- gone is gone,
* because once power is removed, a full card re-init is needed, and
* that happens by deleting and recreating the child device.
*/
was_present = slot->dev != NULL;
if (!was_present && is_present) {
taskqueue_enqueue_timeout(taskqueue_swi_giant,
&slot->card_delayed_task, -SDHCI_INSERT_DELAY_TICKS);
} else if (was_present && !is_present) {
taskqueue_enqueue(taskqueue_swi_giant, &slot->card_task);
}
}
void
sdhci_handle_card_present(struct sdhci_slot *slot, bool is_present)
{
SDHCI_LOCK(slot);
sdhci_handle_card_present_locked(slot, is_present);
SDHCI_UNLOCK(slot);
}
static void
sdhci_card_poll(void *arg)
{
struct sdhci_slot *slot = arg;
sdhci_handle_card_present(slot,
SDHCI_GET_CARD_PRESENT(slot->bus, slot));
callout_reset(&slot->card_poll_callout, SDHCI_CARD_PRESENT_TICKS,
sdhci_card_poll, slot);
}
int
sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num)
{
@ -579,9 +636,11 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num)
device_printf(dev, "Hardware doesn't specify base clock "
"frequency, using %dMHz as default.\n", SDHCI_DEFAULT_MAX_FREQ);
}
/* Calculate timeout clock frequency. */
/* Calculate/set timeout clock frequency. */
if (slot->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK) {
slot->timeout_clk = slot->max_clk / 1000;
} else if (slot->quirks & SDHCI_QUIRK_DATA_TIMEOUT_1MHZ) {
slot->timeout_clk = 1000;
} else {
slot->timeout_clk =
(caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;
@ -625,6 +684,8 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num)
slot->opt &= ~SDHCI_HAVE_DMA;
if (slot->quirks & SDHCI_QUIRK_FORCE_DMA)
slot->opt |= SDHCI_HAVE_DMA;
if (slot->quirks & SDHCI_QUIRK_ALL_SLOTS_NON_REMOVABLE)
slot->opt |= SDHCI_NON_REMOVABLE;
/*
* Use platform-provided transfer backend
@ -637,8 +698,9 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num)
slot_printf(slot, "%uMHz%s %s%s%s%s %s\n",
slot->max_clk / 1000000,
(caps & SDHCI_CAN_DO_HISPD) ? " HS" : "",
(caps & MMC_CAP_8_BIT_DATA) ? "8bits" :
((caps & MMC_CAP_4_BIT_DATA) ? "4bits" : "1bit"),
(slot->host.caps & MMC_CAP_8_BIT_DATA) ? "8bits" :
((slot->host.caps & MMC_CAP_4_BIT_DATA) ? "4bits" :
"1bit"),
(caps & SDHCI_CAN_VDD_330) ? " 3.3V" : "",
(caps & SDHCI_CAN_VDD_300) ? " 3.0V" : "",
(caps & SDHCI_CAN_VDD_180) ? " 1.8V" : "",
@ -652,9 +714,17 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int num)
"timeout", CTLFLAG_RW, &slot->timeout, 0,
"Maximum timeout for SDHCI transfers (in secs)");
TASK_INIT(&slot->card_task, 0, sdhci_card_task, slot);
callout_init(&slot->card_callout, 1);
TIMEOUT_TASK_INIT(taskqueue_swi_giant, &slot->card_delayed_task, 0,
sdhci_card_task, slot);
callout_init(&slot->card_poll_callout, 1);
callout_init_mtx(&slot->timeout_callout, &slot->mtx, 0);
if ((slot->quirks & SDHCI_QUIRK_POLL_CARD_PRESENT) &&
!(slot->opt & SDHCI_NON_REMOVABLE)) {
callout_reset(&slot->card_poll_callout,
SDHCI_CARD_PRESENT_TICKS, sdhci_card_poll, slot);
}
return (0);
}
@ -670,8 +740,9 @@ sdhci_cleanup_slot(struct sdhci_slot *slot)
device_t d;
callout_drain(&slot->timeout_callout);
callout_drain(&slot->card_callout);
callout_drain(&slot->card_poll_callout);
taskqueue_drain(taskqueue_swi_giant, &slot->card_task);
taskqueue_drain_timeout(taskqueue_swi_giant, &slot->card_delayed_task);
SDHCI_LOCK(slot);
d = slot->dev;
@ -721,6 +792,9 @@ bool
sdhci_generic_get_card_present(device_t brdev, struct sdhci_slot *slot)
{
if (slot->opt & SDHCI_NON_REMOVABLE)
return true;
return (RD4(slot, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT);
}
@ -821,7 +895,7 @@ static void
sdhci_start_command(struct sdhci_slot *slot, struct mmc_command *cmd)
{
int flags, timeout;
uint32_t mask, state;
uint32_t mask;
slot->curcmd = cmd;
slot->cmd_done = 0;
@ -836,8 +910,6 @@ sdhci_start_command(struct sdhci_slot *slot, struct mmc_command *cmd)
return;
}
/* Read controller present state. */
state = RD4(slot, SDHCI_PRESENT_STATE);
/* Do not issue command if there is no card, clock or power.
* Controller will not detect timeout without clock active. */
if (!SDHCI_GET_CARD_PRESENT(slot->bus, slot) ||
@ -866,7 +938,7 @@ sdhci_start_command(struct sdhci_slot *slot, struct mmc_command *cmd)
* (It's usually more like 20-30ms in the real world.)
*/
timeout = 250;
while (state & mask) {
while (mask & RD4(slot, SDHCI_PRESENT_STATE)) {
if (timeout == 0) {
slot_printf(slot, "Controller never released "
"inhibit bit(s).\n");
@ -877,7 +949,6 @@ sdhci_start_command(struct sdhci_slot *slot, struct mmc_command *cmd)
}
timeout--;
DELAY(1000);
state = RD4(slot, SDHCI_PRESENT_STATE);
}
/* Prepare command flags. */
@ -1329,7 +1400,7 @@ sdhci_generic_intr(struct sdhci_slot *slot)
/* Handle card presence interrupts. */
if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) {
present = SDHCI_GET_CARD_PRESENT(slot->bus, slot);
present = (intmask & SDHCI_INT_CARD_INSERT) != 0;
slot->intmask &=
~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE);
slot->intmask |= present ? SDHCI_INT_CARD_REMOVE :
@ -1338,20 +1409,7 @@ sdhci_generic_intr(struct sdhci_slot *slot)
WR4(slot, SDHCI_SIGNAL_ENABLE, slot->intmask);
WR4(slot, SDHCI_INT_STATUS, intmask &
(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE));
if (intmask & SDHCI_INT_CARD_REMOVE) {
if (bootverbose || sdhci_debug)
slot_printf(slot, "Card removed\n");
callout_stop(&slot->card_callout);
taskqueue_enqueue(taskqueue_swi_giant,
&slot->card_task);
}
if (intmask & SDHCI_INT_CARD_INSERT) {
if (bootverbose || sdhci_debug)
slot_printf(slot, "Card inserted\n");
callout_reset(&slot->card_callout, hz / 2,
sdhci_card_delay, slot);
}
sdhci_handle_card_present_locked(slot, present);
intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE);
}
/* Handle command interrupts. */

View File

@ -65,6 +65,14 @@
#define SDHCI_QUIRK_DONT_SET_HISPD_BIT (1<<15)
/* Alternate clock source is required when supplying a 400 KHz clock. */
#define SDHCI_QUIRK_BCM577XX_400KHZ_CLKSRC (1<<16)
/* Card insert/remove interrupts don't work, polling required. */
#define SDHCI_QUIRK_POLL_CARD_PRESENT (1<<17)
/* All controller slots are non-removable. */
#define SDHCI_QUIRK_ALL_SLOTS_NON_REMOVABLE (1<<18)
/* Issue custom Intel controller reset sequence after power-up. */
#define SDHCI_QUIRK_INTEL_POWER_UP_RESET (1<<19)
/* Data timeout is invalid, use 1 MHz clock instead. */
#define SDHCI_QUIRK_DATA_TIMEOUT_1MHZ (1<<20)
/*
* Controller registers
@ -273,8 +281,9 @@ struct sdhci_slot {
device_t dev; /* Slot device */
u_char num; /* Slot number */
u_char opt; /* Slot options */
#define SDHCI_HAVE_DMA 1
#define SDHCI_PLATFORM_TRANSFER 2
#define SDHCI_HAVE_DMA 0x01
#define SDHCI_PLATFORM_TRANSFER 0x02
#define SDHCI_NON_REMOVABLE 0x04
u_char version;
int timeout; /* Transfer timeout */
uint32_t max_clk; /* Max possible freq */
@ -284,7 +293,9 @@ struct sdhci_slot {
u_char *dmamem;
bus_addr_t paddr; /* DMA buffer address */
struct task card_task; /* Card presence check task */
struct callout card_callout; /* Card insert delay callout */
struct timeout_task
card_delayed_task;/* Card insert delayed task */
struct callout card_poll_callout;/* Card present polling callout */
struct callout timeout_callout;/* Card command/data response timeout */
struct mmc_host host; /* Host parameters */
struct mmc_request *req; /* Current request */
@ -323,5 +334,6 @@ int sdhci_generic_release_host(device_t brdev, device_t reqdev);
void sdhci_generic_intr(struct sdhci_slot *slot);
uint32_t sdhci_generic_min_freq(device_t brdev, struct sdhci_slot *slot);
bool sdhci_generic_get_card_present(device_t brdev, struct sdhci_slot *slot);
void sdhci_handle_card_present(struct sdhci_slot *slot, bool is_present);
#endif /* __SDHCI_H__ */

View File

@ -0,0 +1,256 @@
/*-
* Copyright (c) 2017 Ian Lepore <ian@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Support routines usable by any SoC sdhci bridge driver that uses gpio pins
* for card detect and write protect, and uses FDT data to describe those pins.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/gpio.h>
#include <sys/sysctl.h>
#include <sys/taskqueue.h>
#include <dev/gpio/gpiobusvar.h>
#include <dev/mmc/bridge.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
#include <dev/sdhci/sdhci.h>
#include <dev/sdhci/sdhci_fdt_gpio.h>
struct sdhci_fdt_gpio {
device_t dev;
struct sdhci_slot * slot;
gpio_pin_t wp_pin;
gpio_pin_t cd_pin;
void * cd_ihandler;
struct resource * cd_ires;
int cd_irid;
bool wp_disabled;
bool wp_inverted;
bool cd_disabled;
bool cd_inverted;
};
/*
* Card detect interrupt handler.
*/
static void
cd_intr(void *arg)
{
struct sdhci_fdt_gpio *gpio = arg;
sdhci_handle_card_present(gpio->slot, sdhci_fdt_gpio_get_present(gpio));
}
/*
* Card detect setup.
*/
static void
cd_setup(struct sdhci_fdt_gpio *gpio, phandle_t node)
{
int pincaps;
device_t dev;
const char *cd_mode_str;
dev = gpio->dev;
/*
* If the device is flagged as non-removable, set that slot option, and
* set a flag to make sdhci_fdt_gpio_get_present() always return true.
*/
if (OF_hasprop(node, "non-removable")) {
gpio->slot->opt |= SDHCI_NON_REMOVABLE;
gpio->cd_disabled = true;
if (bootverbose)
device_printf(dev, "Non-removable media");
return;
}
/*
* If there is no cd-gpios property, then presumably the hardware
* PRESENT_STATE register and interrupts will reflect card state
* properly, and there's nothing more for us to do. Our get_present()
* will return sdhci_generic_get_card_present() because cd_pin is NULL.
*
* If there is a property, make sure we can read the pin.
*/
if (gpio_pin_get_by_ofw_property(dev, node, "cd-gpios", &gpio->cd_pin))
return;
if (gpio_pin_getcaps(gpio->cd_pin, &pincaps) != 0 ||
!(pincaps & GPIO_PIN_INPUT)) {
device_printf(dev, "Cannot read card-detect gpio pin; "
"setting card-always-present flag.\n");
gpio->cd_disabled = true;
return;
}
if (OF_hasprop(node, "cd-inverted"))
gpio->cd_inverted = true;
/*
* If the pin can trigger an interrupt on both rising and falling edges,
* we can use it to detect card presence changes. If not, we'll request
* card presence polling instead of using interrupts.
*/
if (!(pincaps & GPIO_INTR_EDGE_BOTH)) {
if (bootverbose)
device_printf(dev, "Cannot configure "
"GPIO_INTR_EDGE_BOTH for card detect\n");
goto without_interrupts;
}
/*
* Create an interrupt resource from the pin and set up the interrupt.
*/
if ((gpio->cd_ires = gpio_alloc_intr_resource(dev, &gpio->cd_irid,
RF_ACTIVE, gpio->cd_pin, GPIO_INTR_EDGE_BOTH)) == NULL) {
if (bootverbose)
device_printf(dev, "Cannot allocate an IRQ for card "
"detect GPIO\n");
goto without_interrupts;
}
if (bus_setup_intr(dev, gpio->cd_ires, INTR_TYPE_BIO | INTR_MPSAFE,
NULL, cd_intr, gpio, &gpio->cd_ihandler) != 0) {
device_printf(dev, "Unable to setup card-detect irq handler\n");
gpio->cd_ihandler = NULL;
goto without_interrupts;
}
without_interrupts:
/*
* If we have a readable gpio pin, but didn't successfully configure
* gpio interrupts, ask the sdhci driver to poll from a callout.
*/
if (gpio->cd_ihandler == NULL) {
cd_mode_str = "polling";
gpio->slot->quirks |= SDHCI_QUIRK_POLL_CARD_PRESENT;
} else {
cd_mode_str = "interrupts";
}
if (bootverbose) {
device_printf(dev, "Card presence detect on %s pin %u, "
"configured for %s.\n",
device_get_nameunit(gpio->cd_pin->dev), gpio->cd_pin->pin,
cd_mode_str);
}
}
/*
* Write protect setup.
*/
static void
wp_setup(struct sdhci_fdt_gpio *gpio, phandle_t node)
{
device_t dev;
dev = gpio->dev;
if (OF_hasprop(node, "wp-disable"))
return;
if (gpio_pin_get_by_ofw_property(dev, node, "wp-gpios", &gpio->wp_pin))
return;
if (OF_hasprop(node, "wp-inverted"))
gpio->wp_inverted = true;
if (bootverbose)
device_printf(dev, "Write protect switch on %s pin %u\n",
device_get_nameunit(gpio->cd_pin->dev), gpio->cd_pin->pin);
}
struct sdhci_fdt_gpio *
sdhci_fdt_gpio_setup(device_t dev, struct sdhci_slot *slot)
{
phandle_t node;
struct sdhci_fdt_gpio *gpio;
gpio = malloc(sizeof(*gpio), M_DEVBUF, M_ZERO | M_WAITOK);
gpio->dev = dev;
gpio->slot = slot;
node = ofw_bus_get_node(dev);
wp_setup(gpio, node);
cd_setup(gpio, node);
return (gpio);
}
void
sdhci_fdt_gpio_teardown(struct sdhci_fdt_gpio *gpio)
{
if (gpio == NULL)
return;
if (gpio->cd_ihandler != NULL) {
bus_teardown_intr(gpio->dev, gpio->cd_ires, gpio->cd_ihandler);
}
free(gpio, M_DEVBUF);
}
bool
sdhci_fdt_gpio_get_present(struct sdhci_fdt_gpio *gpio)
{
bool pinstate;
if (gpio->cd_disabled)
return (true);
if (gpio->cd_pin == NULL)
return (sdhci_generic_get_card_present(gpio->slot->bus,
gpio->slot));
gpio_pin_is_active(gpio->cd_pin, &pinstate);
return (pinstate ^ gpio->cd_inverted);
}
int
sdhci_fdt_gpio_get_readonly(struct sdhci_fdt_gpio *gpio)
{
bool pinstate;
if (gpio->wp_disabled)
return (false);
if (gpio->wp_pin == NULL)
return (sdhci_generic_get_ro(gpio->slot->bus, gpio->slot->dev));
gpio_pin_is_active(gpio->wp_pin, &pinstate);
return (pinstate ^ gpio->wp_inverted);
}

View File

@ -0,0 +1,69 @@
/*-
* Copyright (c) 2017 Ian Lepore <ian@freebsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
* Support routines usable by any SoC sdhci bridge driver that uses gpio pins
* for card detect and/or write protect, and uses FDT data to describe those
* pins. A bridge driver need only supply a couple 2-line forwarding functions
* to connect the get_present and get_readonly accessors to the corresponding
* driver interface functions, and add setup/teardown calls to its attach and
* detach functions.
*/
#ifndef _SDHCI_FDT_GPIO_H_
#define _SDHCI_FDT_GPIO_H_
struct sdhci_slot;
struct sdhci_fdt_gpio;
/*
* sdhci_fdt_gpio_setup()
* sdhci_fdt_gpio_teardown()
*
* Process FDT properties that use gpio pins and set up interrupt handling (if
* supported by hardware) and accessor functions to read the pins.
*
* Setup cannot fail. If the properties are not present, the accessors will
* return the values from standard sdhci registers. If the gpio controller
* can't trigger interrupts on both edges, it configures the slot to use polling
* for card presence detection. If it can't access the gpio pin at all it sets
* up the get_present() accessor to always return true. Likewise the
* get_readonly() accessor always returns false if its pin can't be accessed.
*/
struct sdhci_fdt_gpio *sdhci_fdt_gpio_setup(device_t dev, struct sdhci_slot *slot);
void sdhci_fdt_gpio_teardown(struct sdhci_fdt_gpio *gpio);
/*
* sdhci_fdt_gpio_get_present()
* sdhci_fdt_gpio_get_readonly()
*
* Gpio pin state accessor functions.
*/
bool sdhci_fdt_gpio_get_present(struct sdhci_fdt_gpio *gpio);
int sdhci_fdt_gpio_get_readonly(struct sdhci_fdt_gpio *gpio);
#endif

View File

@ -107,8 +107,19 @@ static const struct sdhci_device {
SDHCI_QUIRK_RESET_AFTER_REQUEST },
{ 0x16bc14e4, 0xffff, "Broadcom BCM577xx SDXC/MMC Card Reader",
SDHCI_QUIRK_BCM577XX_400KHZ_CLKSRC },
{ 0x22948086, 0xffff, "Intel Braswell Storage Cluster Control MMC Port",
0 },
{ 0x0f148086, 0xffff, "Intel Bay Trail eMMC 4.5 Controller",
SDHCI_QUIRK_ALL_SLOTS_NON_REMOVABLE |
SDHCI_QUIRK_INTEL_POWER_UP_RESET },
{ 0x0f508086, 0xffff, "Intel Bay Trail eMMC 4.5 Controller",
SDHCI_QUIRK_ALL_SLOTS_NON_REMOVABLE |
SDHCI_QUIRK_INTEL_POWER_UP_RESET },
{ 0x22948086, 0xffff, "Intel Braswell eMMC 4.5.1 Controller",
SDHCI_QUIRK_ALL_SLOTS_NON_REMOVABLE |
SDHCI_QUIRK_DATA_TIMEOUT_1MHZ |
SDHCI_QUIRK_INTEL_POWER_UP_RESET },
{ 0x5acc8086, 0xffff, "Intel Apollo Lake eMMC 5.0 Controller",
SDHCI_QUIRK_ALL_SLOTS_NON_REMOVABLE |
SDHCI_QUIRK_INTEL_POWER_UP_RESET },
{ 0, 0xffff, NULL,
0 }
};
@ -121,8 +132,8 @@ struct sdhci_pci_softc {
int num_slots; /* Number of slots on this controller */
struct sdhci_slot slots[6];
struct resource *mem_res[6]; /* Memory resource */
uint8_t cfg_freq; /* Saved mode */
uint8_t cfg_mode; /* Saved frequency */
uint8_t cfg_freq; /* Saved frequency */
uint8_t cfg_mode; /* Saved mode */
};
static int sdhci_enable_msi = 1;

View File

@ -910,7 +910,7 @@ nd6_timer(void *arg)
struct nd_defrouter *dr, *ndr;
struct nd_prefix *pr, *npr;
struct in6_ifaddr *ia6, *nia6;
bool onlink_locked;
uint64_t genid;
TAILQ_INIT(&drq);
LIST_INIT(&prl);
@ -1022,7 +1022,6 @@ nd6_timer(void *arg)
}
ND6_WLOCK();
onlink_locked = false;
restart:
LIST_FOREACH_SAFE(pr, &V_nd_prefix, ndpr_entry, npr) {
/*
@ -1045,22 +1044,19 @@ restart:
continue;
}
if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0) {
if (!onlink_locked) {
onlink_locked = ND6_ONLINK_TRYLOCK();
if (!onlink_locked) {
ND6_WUNLOCK();
ND6_ONLINK_LOCK();
onlink_locked = true;
ND6_WLOCK();
goto restart;
}
}
genid = V_nd6_list_genid;
nd6_prefix_ref(pr);
ND6_WUNLOCK();
ND6_ONLINK_LOCK();
(void)nd6_prefix_offlink(pr);
ND6_ONLINK_UNLOCK();
ND6_WLOCK();
nd6_prefix_rele(pr);
if (genid != V_nd6_list_genid)
goto restart;
}
}
ND6_WUNLOCK();
if (onlink_locked)
ND6_ONLINK_UNLOCK();
while ((pr = LIST_FIRST(&prl)) != NULL) {
LIST_REMOVE(pr, ndpr_entry);

View File

@ -111,7 +111,7 @@
#define KERNBASE 0xc0000000 /* start of kernel virtual */
#define VM_MIN_KERNEL_ADDRESS KERNBASE
#define VM_MAX_KERNEL_ADDRESS 0xffffffff
#define VM_MAX_KERNEL_ADDRESS 0xffffefff
#define VM_MAX_SAFE_KERNEL_ADDRESS VM_MAX_KERNEL_ADDRESS
#endif /* AIM/E500 */

View File

@ -4444,6 +4444,8 @@ OLD_FILES+=usr/lib/libcxxrt.a
OLD_FILES+=usr/lib/libcxxrt.so
OLD_FILES+=usr/lib/libcxxrt_p.a
OLD_FILES+=usr/include/c++/v1/__bit_reference
OLD_FILES+=usr/include/c++/v1/__bsd_locale_defaults.h
OLD_FILES+=usr/include/c++/v1/__bsd_locale_fallbacks.h
OLD_FILES+=usr/include/c++/v1/__config
OLD_FILES+=usr/include/c++/v1/__debug
OLD_FILES+=usr/include/c++/v1/__functional_03
@ -4452,10 +4454,12 @@ OLD_FILES+=usr/include/c++/v1/__functional_base_03
OLD_FILES+=usr/include/c++/v1/__hash_table
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
OLD_FILES+=usr/include/c++/v1/__threading_support
OLD_FILES+=usr/include/c++/v1/__tree
OLD_FILES+=usr/include/c++/v1/__tuple
OLD_FILES+=usr/include/c++/v1/__undef___deallocate
@ -4491,30 +4495,51 @@ OLD_FILES+=usr/include/c++/v1/cstdlib
OLD_FILES+=usr/include/c++/v1/cstring
OLD_FILES+=usr/include/c++/v1/ctgmath
OLD_FILES+=usr/include/c++/v1/ctime
OLD_FILES+=usr/include/c++/v1/ctype.h
OLD_FILES+=usr/include/c++/v1/cwchar
OLD_FILES+=usr/include/c++/v1/cwctype
OLD_FILES+=usr/include/c++/v1/cxxabi.h
OLD_FILES+=usr/include/c++/v1/deque
OLD_FILES+=usr/include/c++/v1/errno.h
OLD_FILES+=usr/include/c++/v1/exception
OLD_FILES+=usr/include/c++/v1/experimental/__config
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/deque
OLD_FILES+=usr/include/c++/v1/experimental/dynarray
OLD_FILES+=usr/include/c++/v1/experimental/dynarray
OLD_FILES+=usr/include/c++/v1/experimental/filesystem
OLD_FILES+=usr/include/c++/v1/experimental/forward_list
OLD_FILES+=usr/include/c++/v1/experimental/functional
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/optional
OLD_FILES+=usr/include/c++/v1/experimental/propagate_const
OLD_FILES+=usr/include/c++/v1/experimental/ratio
OLD_FILES+=usr/include/c++/v1/experimental/regex
OLD_FILES+=usr/include/c++/v1/experimental/set
OLD_FILES+=usr/include/c++/v1/experimental/string
OLD_FILES+=usr/include/c++/v1/experimental/string_view
OLD_FILES+=usr/include/c++/v1/experimental/system_error
OLD_FILES+=usr/include/c++/v1/experimental/tuple
OLD_FILES+=usr/include/c++/v1/experimental/type_traits
OLD_FILES+=usr/include/c++/v1/experimental/unordered_map
OLD_FILES+=usr/include/c++/v1/experimental/unordered_set
OLD_FILES+=usr/include/c++/v1/experimental/utility
OLD_FILES+=usr/include/c++/v1/experimental/vector
OLD_FILES+=usr/include/c++/v1/ext/__hash
OLD_FILES+=usr/include/c++/v1/ext/hash_map
OLD_FILES+=usr/include/c++/v1/ext/hash_set
OLD_FILES+=usr/include/c++/v1/float.h
OLD_FILES+=usr/include/c++/v1/forward_list
OLD_FILES+=usr/include/c++/v1/fstream
OLD_FILES+=usr/include/c++/v1/functional
OLD_FILES+=usr/include/c++/v1/future
OLD_FILES+=usr/include/c++/v1/initializer_list
OLD_FILES+=usr/include/c++/v1/inttypes.h
OLD_FILES+=usr/include/c++/v1/iomanip
OLD_FILES+=usr/include/c++/v1/ios
OLD_FILES+=usr/include/c++/v1/iosfwd
@ -4525,6 +4550,7 @@ OLD_FILES+=usr/include/c++/v1/limits
OLD_FILES+=usr/include/c++/v1/list
OLD_FILES+=usr/include/c++/v1/locale
OLD_FILES+=usr/include/c++/v1/map
OLD_FILES+=usr/include/c++/v1/math.h
OLD_FILES+=usr/include/c++/v1/memory
OLD_FILES+=usr/include/c++/v1/mutex
OLD_FILES+=usr/include/c++/v1/new
@ -4536,17 +4562,25 @@ OLD_FILES+=usr/include/c++/v1/ratio
OLD_FILES+=usr/include/c++/v1/regex
OLD_FILES+=usr/include/c++/v1/scoped_allocator
OLD_FILES+=usr/include/c++/v1/set
OLD_FILES+=usr/include/c++/v1/setjmp.h
OLD_FILES+=usr/include/c++/v1/shared_mutex
OLD_FILES+=usr/include/c++/v1/sstream
OLD_FILES+=usr/include/c++/v1/stack
OLD_FILES+=usr/include/c++/v1/stdbool.h
OLD_FILES+=usr/include/c++/v1/stddef.h
OLD_FILES+=usr/include/c++/v1/stdexcept
OLD_FILES+=usr/include/c++/v1/stdio.h
OLD_FILES+=usr/include/c++/v1/stdlib.h
OLD_FILES+=usr/include/c++/v1/streambuf
OLD_FILES+=usr/include/c++/v1/string
OLD_FILES+=usr/include/c++/v1/string.h
OLD_FILES+=usr/include/c++/v1/strstream
OLD_FILES+=usr/include/c++/v1/system_error
OLD_FILES+=usr/include/c++/v1/tgmath.h
OLD_FILES+=usr/include/c++/v1/thread
OLD_FILES+=usr/include/c++/v1/tr1/__bit_reference
OLD_FILES+=usr/include/c++/v1/tr1/__bsd_locale_defaults.h
OLD_FILES+=usr/include/c++/v1/tr1/__bsd_locale_fallbacks.h
OLD_FILES+=usr/include/c++/v1/tr1/__config
OLD_FILES+=usr/include/c++/v1/tr1/__debug
OLD_FILES+=usr/include/c++/v1/tr1/__functional_03
@ -4555,13 +4589,15 @@ OLD_FILES+=usr/include/c++/v1/tr1/__functional_base_03
OLD_FILES+=usr/include/c++/v1/tr1/__hash_table
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
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/__tuple_03
OLD_FILES+=usr/include/c++/v1/tr1/__undef___deallocate
OLD_FILES+=usr/include/c++/v1/tr1/__undef_min_max
OLD_FILES+=usr/include/c++/v1/tr1/algorithm
OLD_FILES+=usr/include/c++/v1/tr1/array
@ -4594,15 +4630,19 @@ OLD_FILES+=usr/include/c++/v1/tr1/cstdlib
OLD_FILES+=usr/include/c++/v1/tr1/cstring
OLD_FILES+=usr/include/c++/v1/tr1/ctgmath
OLD_FILES+=usr/include/c++/v1/tr1/ctime
OLD_FILES+=usr/include/c++/v1/tr1/ctype.h
OLD_FILES+=usr/include/c++/v1/tr1/cwchar
OLD_FILES+=usr/include/c++/v1/tr1/cwctype
OLD_FILES+=usr/include/c++/v1/tr1/deque
OLD_FILES+=usr/include/c++/v1/tr1/errno.h
OLD_FILES+=usr/include/c++/v1/tr1/exception
OLD_FILES+=usr/include/c++/v1/tr1/float.h
OLD_FILES+=usr/include/c++/v1/tr1/forward_list
OLD_FILES+=usr/include/c++/v1/tr1/fstream
OLD_FILES+=usr/include/c++/v1/tr1/functional
OLD_FILES+=usr/include/c++/v1/tr1/future
OLD_FILES+=usr/include/c++/v1/tr1/initializer_list
OLD_FILES+=usr/include/c++/v1/tr1/inttypes.h
OLD_FILES+=usr/include/c++/v1/tr1/iomanip
OLD_FILES+=usr/include/c++/v1/tr1/ios
OLD_FILES+=usr/include/c++/v1/tr1/iosfwd
@ -4613,6 +4653,7 @@ OLD_FILES+=usr/include/c++/v1/tr1/limits
OLD_FILES+=usr/include/c++/v1/tr1/list
OLD_FILES+=usr/include/c++/v1/tr1/locale
OLD_FILES+=usr/include/c++/v1/tr1/map
OLD_FILES+=usr/include/c++/v1/tr1/math.h
OLD_FILES+=usr/include/c++/v1/tr1/memory
OLD_FILES+=usr/include/c++/v1/tr1/mutex
OLD_FILES+=usr/include/c++/v1/tr1/new
@ -4624,12 +4665,18 @@ OLD_FILES+=usr/include/c++/v1/tr1/ratio
OLD_FILES+=usr/include/c++/v1/tr1/regex
OLD_FILES+=usr/include/c++/v1/tr1/scoped_allocator
OLD_FILES+=usr/include/c++/v1/tr1/set
OLD_FILES+=usr/include/c++/v1/tr1/setjmp.h
OLD_FILES+=usr/include/c++/v1/tr1/shared_mutex
OLD_FILES+=usr/include/c++/v1/tr1/sstream
OLD_FILES+=usr/include/c++/v1/tr1/stack
OLD_FILES+=usr/include/c++/v1/tr1/stdbool.h
OLD_FILES+=usr/include/c++/v1/tr1/stddef.h
OLD_FILES+=usr/include/c++/v1/tr1/stdexcept
OLD_FILES+=usr/include/c++/v1/tr1/stdio.h
OLD_FILES+=usr/include/c++/v1/tr1/stdlib.h
OLD_FILES+=usr/include/c++/v1/tr1/streambuf
OLD_FILES+=usr/include/c++/v1/tr1/string
OLD_FILES+=usr/include/c++/v1/tr1/string.h
OLD_FILES+=usr/include/c++/v1/tr1/strstream
OLD_FILES+=usr/include/c++/v1/tr1/system_error
OLD_FILES+=usr/include/c++/v1/tr1/tgmath.h
@ -4643,6 +4690,8 @@ OLD_FILES+=usr/include/c++/v1/tr1/unordered_set
OLD_FILES+=usr/include/c++/v1/tr1/utility
OLD_FILES+=usr/include/c++/v1/tr1/valarray
OLD_FILES+=usr/include/c++/v1/tr1/vector
OLD_FILES+=usr/include/c++/v1/tr1/wchar.h
OLD_FILES+=usr/include/c++/v1/tr1/wctype.h
OLD_FILES+=usr/include/c++/v1/tuple
OLD_FILES+=usr/include/c++/v1/type_traits
OLD_FILES+=usr/include/c++/v1/typeindex
@ -4655,6 +4704,8 @@ OLD_FILES+=usr/include/c++/v1/unwind.h
OLD_FILES+=usr/include/c++/v1/utility
OLD_FILES+=usr/include/c++/v1/valarray
OLD_FILES+=usr/include/c++/v1/vector
OLD_FILES+=usr/include/c++/v1/wchar.h
OLD_FILES+=usr/include/c++/v1/wctype.h
OLD_FILES+=usr/lib32/libc++.a
OLD_FILES+=usr/lib32/libc++.so
OLD_LIBS+=usr/lib32/libc++.so.1

View File

@ -19,4 +19,6 @@ LDFLAGS+= -L${LOCALBASE}/lib
LDADD+= -lsmi
WARNS?= 6
.include <bsd.prog.mk>

View File

@ -34,7 +34,7 @@
.\" $Id: //depot/users/kenm/FreeBSD-test2/usr.bin/ctlstat/ctlstat.8#2 $
.\" $FreeBSD$
.\"
.Dd September 21, 2015
.Dd January 9, 2017
.Dt CTLSTAT 8
.Os
.Sh NAME
@ -120,3 +120,4 @@ every 10 seconds.
.Sh AUTHORS
.An Ken Merry Aq Mt ken@FreeBSD.org
.An Will Andrews Aq Mt will@FreeBSD.org
.An Alexander Motin Aq Mt mav@FreeBSD.org

View File

@ -1,5 +1,6 @@
/*-
* Copyright (c) 2004, 2008, 2009 Silicon Graphics International Corp.
* Copyright (c) 2017 Alexander Motin <mav@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -66,17 +67,17 @@ __FBSDID("$FreeBSD$");
#include <cam/ctl/ctl_ioctl.h>
/*
* The default amount of space we allocate for LUN storage space. We
* dynamically allocate more if needed.
* The default amount of space we allocate for stats storage space.
* We dynamically allocate more if needed.
*/
#define CTL_STAT_NUM_LUNS 30
#define CTL_STAT_NUM_ITEMS 256
/*
* The default number of LUN selection bits we allocate. This is large
* because we don't currently increase it if the user specifies a LUN
* number of 1024 or larger.
*/
#define CTL_STAT_LUN_BITS 1024L
#define CTL_STAT_BITS 1024L
static const char *ctlstat_opts = "Cc:Ddhjl:n:p:tw:";
static const char *ctlstat_usage = "Usage: ctlstat [-CDdjht] [-l lunnum]"
@ -101,31 +102,32 @@ typedef enum {
#define CTLSTAT_FLAG_FIRST_RUN (1 << 2)
#define CTLSTAT_FLAG_TOTALS (1 << 3)
#define CTLSTAT_FLAG_DMA_TIME (1 << 4)
#define CTLSTAT_FLAG_LUN_TIME_VALID (1 << 5)
#define CTLSTAT_FLAG_LUN_MASK (1 << 6)
#define CTLSTAT_FLAG_PORT_MASK (1 << 7)
#define CTLSTAT_FLAG_TIME_VALID (1 << 5)
#define CTLSTAT_FLAG_MASK (1 << 6)
#define CTLSTAT_FLAG_LUNS (1 << 7)
#define CTLSTAT_FLAG_PORTS (1 << 8)
#define F_CPU(ctx) ((ctx)->flags & CTLSTAT_FLAG_CPU)
#define F_HDR(ctx) ((ctx)->flags & CTLSTAT_FLAG_HEADER)
#define F_FIRST(ctx) ((ctx)->flags & CTLSTAT_FLAG_FIRST_RUN)
#define F_TOTALS(ctx) ((ctx)->flags & CTLSTAT_FLAG_TOTALS)
#define F_DMA(ctx) ((ctx)->flags & CTLSTAT_FLAG_DMA_TIME)
#define F_LUNVAL(ctx) ((ctx)->flags & CTLSTAT_FLAG_LUN_TIME_VALID)
#define F_LUNMASK(ctx) ((ctx)->flags & CTLSTAT_FLAG_LUN_MASK)
#define F_PORTMASK(ctx) ((ctx)->flags & CTLSTAT_FLAG_PORT_MASK)
#define F_TIMEVAL(ctx) ((ctx)->flags & CTLSTAT_FLAG_TIME_VALID)
#define F_MASK(ctx) ((ctx)->flags & CTLSTAT_FLAG_MASK)
#define F_LUNS(ctx) ((ctx)->flags & CTLSTAT_FLAG_LUNS)
#define F_PORTS(ctx) ((ctx)->flags & CTLSTAT_FLAG_PORTS)
struct ctlstat_context {
ctlstat_mode_types mode;
int flags;
struct ctl_lun_io_stats *cur_lun_stats, *prev_lun_stats,
*tmp_lun_stats;
struct ctl_lun_io_stats cur_total_stats[3], prev_total_stats[3];
struct ctl_io_stats *cur_stats, *prev_stats;
struct ctl_io_stats cur_total_stats[3], prev_total_stats[3];
struct timespec cur_time, prev_time;
struct ctl_cpu_stats cur_cpu, prev_cpu;
uint64_t cur_total_jiffies, prev_total_jiffies;
uint64_t cur_idle, prev_idle;
bitstr_t bit_decl(lun_mask, CTL_STAT_LUN_BITS);
bitstr_t bit_decl(port_mask, CTL_MAX_PORTS);
int num_luns;
bitstr_t bit_decl(item_mask, CTL_STAT_BITS);
int cur_items, prev_items;
int cur_alloc, prev_alloc;
int numdevs;
int header_interval;
};
@ -135,12 +137,11 @@ struct ctlstat_context {
#endif
static void usage(int error);
static int getstats(int fd, int *num_luns, struct ctl_lun_io_stats **xlun_stats,
struct timespec *cur_time, int *lun_time_valid);
static int getstats(int fd, int *alloc_items, int *num_items,
struct ctl_io_stats **xstats, struct timespec *cur_time, int *time_valid);
static int getcpu(struct ctl_cpu_stats *cpu_stats);
static void compute_stats(struct ctlstat_context *ctx,
struct ctl_lun_io_stats *cur_stats,
struct ctl_lun_io_stats *prev_stats,
static void compute_stats(struct ctl_io_stats *cur_stats,
struct ctl_io_stats *prev_stats,
long double etime, long double *mbsec,
long double *kb_per_transfer,
long double *transfers_per_second,
@ -155,64 +156,55 @@ usage(int error)
}
static int
getstats(int fd, int *num_luns, struct ctl_lun_io_stats **xlun_stats,
getstats(int fd, int *alloc_items, int *num_items, struct ctl_io_stats **stats,
struct timespec *cur_time, int *flags)
{
struct ctl_lun_io_stats *lun_stats;
struct ctl_stats stats;
int more_space_count;
struct ctl_get_io_stats get_stats;
int more_space_count = 0;
more_space_count = 0;
if (*num_luns == 0)
*num_luns = CTL_STAT_NUM_LUNS;
lun_stats = *xlun_stats;
if (*alloc_items == 0)
*alloc_items = CTL_STAT_NUM_ITEMS;
retry:
if (*stats == NULL)
*stats = malloc(sizeof(**stats) * *alloc_items);
if (lun_stats == NULL) {
lun_stats = (struct ctl_lun_io_stats *)malloc(
sizeof(*lun_stats) * *num_luns);
}
memset(&get_stats, 0, sizeof(get_stats));
get_stats.alloc_len = *alloc_items * sizeof(**stats);
memset(*stats, 0, get_stats.alloc_len);
get_stats.stats = *stats;
memset(&stats, 0, sizeof(stats));
stats.alloc_len = *num_luns * sizeof(*lun_stats);
memset(lun_stats, 0, stats.alloc_len);
stats.lun_stats = lun_stats;
if (ioctl(fd, (*flags & CTLSTAT_FLAG_PORTS) ? CTL_GET_PORT_STATS :
CTL_GET_LUN_STATS, &get_stats) == -1)
err(1, "CTL_GET_*_STATS ioctl returned error");
if (ioctl(fd, CTL_GETSTATS, &stats) == -1)
err(1, "error returned from CTL_GETSTATS ioctl");
switch (stats.status) {
switch (get_stats.status) {
case CTL_SS_OK:
break;
case CTL_SS_ERROR:
err(1, "CTL_SS_ERROR returned from CTL_GETSTATS ioctl");
err(1, "CTL_GET_*_STATS ioctl returned CTL_SS_ERROR");
break;
case CTL_SS_NEED_MORE_SPACE:
if (more_space_count > 0) {
errx(1, "CTL_GETSTATS returned NEED_MORE_SPACE again");
}
*num_luns = stats.num_luns;
free(lun_stats);
lun_stats = NULL;
if (more_space_count >= 2)
errx(1, "CTL_GET_*_STATS returned NEED_MORE_SPACE again");
*alloc_items = get_stats.num_items * 5 / 4;
free(*stats);
*stats = NULL;
more_space_count++;
goto retry;
break; /* NOTREACHED */
default:
errx(1, "unknown status %d returned from CTL_GETSTATS ioctl",
stats.status);
errx(1, "CTL_GET_*_STATS ioctl returned unknown status %d",
get_stats.status);
break;
}
*xlun_stats = lun_stats;
*num_luns = stats.num_luns;
cur_time->tv_sec = stats.timestamp.tv_sec;
cur_time->tv_nsec = stats.timestamp.tv_nsec;
if (stats.flags & CTL_STATS_FLAG_TIME_VALID)
*flags |= CTLSTAT_FLAG_LUN_TIME_VALID;
*num_items = get_stats.fill_len / sizeof(**stats);
cur_time->tv_sec = get_stats.timestamp.tv_sec;
cur_time->tv_nsec = get_stats.timestamp.tv_nsec;
if (get_stats.flags & CTL_STATS_FLAG_TIME_VALID)
*flags |= CTLSTAT_FLAG_TIME_VALID;
else
*flags &= ~CTLSTAT_FLAG_LUN_TIME_VALID;
*flags &= ~CTLSTAT_FLAG_TIME_VALID;
return (0);
}
@ -240,14 +232,13 @@ getcpu(struct ctl_cpu_stats *cpu_stats)
}
static void
compute_stats(struct ctlstat_context *ctx, struct ctl_lun_io_stats *cur_stats,
struct ctl_lun_io_stats *prev_stats, long double etime,
compute_stats(struct ctl_io_stats *cur_stats,
struct ctl_io_stats *prev_stats, long double etime,
long double *mbsec, long double *kb_per_transfer,
long double *transfers_per_second, long double *ms_per_transfer,
long double *ms_per_dma, long double *dmas_per_second)
{
uint64_t total_bytes = 0, total_operations = 0, total_dmas = 0;
uint32_t port;
struct bintime total_time_bt, total_dma_bt;
struct timespec total_time_ts, total_dma_ts;
int i;
@ -256,31 +247,18 @@ compute_stats(struct ctlstat_context *ctx, struct ctl_lun_io_stats *cur_stats,
bzero(&total_dma_bt, sizeof(total_dma_bt));
bzero(&total_time_ts, sizeof(total_time_ts));
bzero(&total_dma_ts, sizeof(total_dma_ts));
for (port = 0; port < CTL_MAX_PORTS; port++) {
if (F_PORTMASK(ctx) &&
bit_test(ctx->port_mask, port) == 0)
continue;
for (i = 0; i < CTL_STATS_NUM_TYPES; i++) {
total_bytes += cur_stats->ports[port].bytes[i];
total_operations +=
cur_stats->ports[port].operations[i];
total_dmas += cur_stats->ports[port].num_dmas[i];
bintime_add(&total_time_bt,
&cur_stats->ports[port].time[i]);
bintime_add(&total_dma_bt,
&cur_stats->ports[port].dma_time[i]);
if (prev_stats != NULL) {
total_bytes -=
prev_stats->ports[port].bytes[i];
total_operations -=
prev_stats->ports[port].operations[i];
total_dmas -=
prev_stats->ports[port].num_dmas[i];
bintime_sub(&total_time_bt,
&prev_stats->ports[port].time[i]);
bintime_sub(&total_dma_bt,
&prev_stats->ports[port].dma_time[i]);
}
for (i = 0; i < CTL_STATS_NUM_TYPES; i++) {
total_bytes += cur_stats->bytes[i];
total_operations += cur_stats->operations[i];
total_dmas += cur_stats->dmas[i];
bintime_add(&total_time_bt, &cur_stats->time[i]);
bintime_add(&total_dma_bt, &cur_stats->dma_time[i]);
if (prev_stats != NULL) {
total_bytes -= prev_stats->bytes[i];
total_operations -= prev_stats->operations[i];
total_dmas -= prev_stats->dmas[i];
bintime_sub(&total_time_bt, &prev_stats->time[i]);
bintime_sub(&total_dma_bt, &prev_stats->dma_time[i]);
}
}
@ -340,35 +318,25 @@ compute_stats(struct ctlstat_context *ctx, struct ctl_lun_io_stats *cur_stats,
static const char *iotypes[] = {"NO IO", "READ", "WRITE"};
static void
ctlstat_dump(struct ctlstat_context *ctx) {
int iotype, lun, port;
struct ctl_lun_io_stats *stats = ctx->cur_lun_stats;
ctlstat_dump(struct ctlstat_context *ctx)
{
int iotype, i;
struct ctl_io_stats *stats = ctx->cur_stats;
for (lun = 0; lun < ctx->num_luns;lun++) {
if (F_LUNMASK(ctx) && bit_test(ctx->lun_mask, lun) == 0)
for (i = 0; i < ctx->cur_items;i++) {
if (F_MASK(ctx) && bit_test(ctx->item_mask, i) == 0)
continue;
printf("lun %d\n", lun);
for (port = 0; port < CTL_MAX_PORTS; port++) {
if (F_PORTMASK(ctx) &&
bit_test(ctx->port_mask, port) == 0)
continue;
printf(" port %d\n",
stats[lun].ports[port].targ_port);
for (iotype = 0; iotype < CTL_STATS_NUM_TYPES;
iotype++) {
printf(" io type %d (%s)\n", iotype,
iotypes[iotype]);
printf(" bytes %ju\n", (uintmax_t)
stats[lun].ports[port].bytes[iotype]);
printf(" operations %ju\n", (uintmax_t)
stats[lun].ports[port].operations[iotype]);
PRINT_BINTIME(" io time",
stats[lun].ports[port].time[iotype]);
printf(" num dmas %ju\n", (uintmax_t)
stats[lun].ports[port].num_dmas[iotype]);
PRINT_BINTIME(" dma time",
stats[lun].ports[port].dma_time[iotype]);
}
printf("%s %d\n", F_PORTS(ctx) ? "port" : "lun", stats[i].item);
for (iotype = 0; iotype < CTL_STATS_NUM_TYPES; iotype++) {
printf(" io type %d (%s)\n", iotype, iotypes[iotype]);
printf(" bytes %ju\n", (uintmax_t)
stats[i].bytes[iotype]);
printf(" operations %ju\n", (uintmax_t)
stats[i].operations[iotype]);
printf(" dmas %ju\n", (uintmax_t)
stats[i].dmas[iotype]);
PRINT_BINTIME(" io time", stats[i].time[iotype]);
PRINT_BINTIME(" dma time", stats[i].dma_time[iotype]);
}
}
}
@ -378,63 +346,49 @@ ctlstat_dump(struct ctlstat_context *ctx) {
(uintmax_t)(((bt).frac >> 32) * 1000000 >> 32))
static void
ctlstat_json(struct ctlstat_context *ctx) {
int iotype, lun, port;
struct ctl_lun_io_stats *stats = ctx->cur_lun_stats;
int iotype, i;
struct ctl_io_stats *stats = ctx->cur_stats;
printf("{\"luns\":[");
for (lun = 0; lun < ctx->num_luns; lun++) {
if (F_LUNMASK(ctx) && bit_test(ctx->lun_mask, lun) == 0)
printf("{\"%s\":[", F_PORTS(ctx) ? "ports" : "luns");
for (i = 0; i < ctx->cur_items; i++) {
if (F_MASK(ctx) && bit_test(ctx->item_mask, i) == 0)
continue;
printf("{\"ports\":[");
for (port = 0; port < CTL_MAX_PORTS;port++) {
if (F_PORTMASK(ctx) &&
bit_test(ctx->port_mask, port) == 0)
continue;
printf("{\"num\":%d,\"io\":[",
stats[lun].ports[port].targ_port);
for (iotype = 0; iotype < CTL_STATS_NUM_TYPES;
iotype++) {
printf("{\"type\":\"%s\",", iotypes[iotype]);
printf("\"bytes\":%ju,", (uintmax_t)stats[
lun].ports[port].bytes[iotype]);
printf("\"operations\":%ju,", (uintmax_t)stats[
lun].ports[port].operations[iotype]);
JSON_BINTIME("io time",
stats[lun].ports[port].time[iotype]);
JSON_BINTIME("dma time",
stats[lun].ports[port].dma_time[iotype]);
printf("\"num dmas\":%ju}", (uintmax_t)
stats[lun].ports[port].num_dmas[iotype]);
if (iotype < (CTL_STATS_NUM_TYPES - 1))
printf(","); /* continue io array */
}
printf("]}"); /* close port */
if (port < (CTL_MAX_PORTS - 1))
printf(","); /* continue port array */
printf("{\"num\":%d,\"io\":[",
stats[i].item);
for (iotype = 0; iotype < CTL_STATS_NUM_TYPES; iotype++) {
printf("{\"type\":\"%s\",", iotypes[iotype]);
printf("\"bytes\":%ju,", (uintmax_t)stats[
i].bytes[iotype]);
printf("\"operations\":%ju,", (uintmax_t)stats[
i].operations[iotype]);
printf("\"dmas\":%ju}", (uintmax_t)
stats[i].dmas[iotype]);
JSON_BINTIME("io time", stats[i].time[iotype]);
JSON_BINTIME("dma time", stats[i].dma_time[iotype]);
if (iotype < (CTL_STATS_NUM_TYPES - 1))
printf(","); /* continue io array */
}
printf("]}"); /* close lun */
if (lun < (ctx->num_luns - 1))
printf("]}");
if (i < (ctx->cur_items - 1))
printf(","); /* continue lun array */
}
printf("]}"); /* close luns and toplevel */
printf("]}");
}
static void
ctlstat_standard(struct ctlstat_context *ctx) {
long double etime;
uint64_t delta_jiffies, delta_idle;
uint32_t port;
long double cpu_percentage;
int i;
int j;
int i, j;
cpu_percentage = 0;
if (F_CPU(ctx) && (getcpu(&ctx->cur_cpu) != 0))
errx(1, "error returned from getcpu()");
etime = ctx->cur_time.tv_sec - ctx->prev_time.tv_sec +
(ctx->prev_time.tv_nsec - ctx->cur_time.tv_nsec) * 1e-9;
etime = ctx->cur_time.tv_sec - ctx->prev_time.tv_sec +
(ctx->prev_time.tv_nsec - ctx->cur_time.tv_nsec) * 1e-9;
if (F_CPU(ctx)) {
ctx->prev_total_jiffies = ctx->cur_total_jiffies;
@ -465,29 +419,28 @@ ctlstat_standard(struct ctlstat_context *ctx) {
if (F_TOTALS(ctx)) {
fprintf(stdout, "%s Read %s"
" Write %s Total\n",
(F_LUNVAL(ctx) != 0) ? " " : "",
(F_LUNVAL(ctx) != 0) ? " " : "",
(F_LUNVAL(ctx) != 0) ? " " : "");
(F_TIMEVAL(ctx) != 0) ? " " : "",
(F_TIMEVAL(ctx) != 0) ? " " : "",
(F_TIMEVAL(ctx) != 0) ? " " : "");
hdr_devs = 3;
} else {
for (i = 0; i < min(CTL_STAT_LUN_BITS,
ctx->num_luns); i++) {
int lun;
for (i = 0; i < min(CTL_STAT_BITS,
ctx->cur_items); i++) {
int item;
/*
* Obviously this won't work with
* LUN numbers greater than a signed
* integer.
*/
lun = (int)ctx->cur_lun_stats[i
].lun_number;
item = (int)ctx->cur_stats[i].item;
if (F_LUNMASK(ctx) &&
bit_test(ctx->lun_mask, lun) == 0)
if (F_MASK(ctx) &&
bit_test(ctx->item_mask, item) == 0)
continue;
fprintf(stdout, "%15.6s%d %s",
"lun", lun,
(F_LUNVAL(ctx) != 0) ? " " : "");
F_PORTS(ctx) ? "port" : "lun", item,
(F_TIMEVAL(ctx) != 0) ? " " : "");
hdr_devs++;
}
fprintf(stdout, "\n");
@ -496,7 +449,7 @@ ctlstat_standard(struct ctlstat_context *ctx) {
fprintf(stdout, " ");
for (i = 0; i < hdr_devs; i++)
fprintf(stdout, "%s KB/t %s MB/s",
(F_LUNVAL(ctx) != 0) ? " ms" : "",
(F_TIMEVAL(ctx) != 0) ? " ms" : "",
(F_DMA(ctx) == 0) ? "tps" : "dps");
fprintf(stdout, "\n");
ctx->header_interval = 20;
@ -519,55 +472,48 @@ ctlstat_standard(struct ctlstat_context *ctx) {
memset(&ctx->cur_total_stats, 0, sizeof(ctx->cur_total_stats));
/* Use macros to make the next loop more readable. */
#define ADD_STATS_BYTES(st, p, i, j) \
ctx->cur_total_stats[st].ports[p].bytes[j] += \
ctx->cur_lun_stats[i].ports[p].bytes[j]
#define ADD_STATS_OPERATIONS(st, p, i, j) \
ctx->cur_total_stats[st].ports[p].operations[j] += \
ctx->cur_lun_stats[i].ports[p].operations[j]
#define ADD_STATS_NUM_DMAS(st, p, i, j) \
ctx->cur_total_stats[st].ports[p].num_dmas[j] += \
ctx->cur_lun_stats[i].ports[p].num_dmas[j]
#define ADD_STATS_TIME(st, p, i, j) \
bintime_add(&ctx->cur_total_stats[st].ports[p].time[j], \
&ctx->cur_lun_stats[i].ports[p].time[j])
#define ADD_STATS_DMA_TIME(st, p, i, j) \
bintime_add(&ctx->cur_total_stats[st].ports[p].dma_time[j], \
&ctx->cur_lun_stats[i].ports[p].dma_time[j])
#define ADD_STATS_BYTES(st, i, j) \
ctx->cur_total_stats[st].bytes[j] += \
ctx->cur_stats[i].bytes[j]
#define ADD_STATS_OPERATIONS(st, i, j) \
ctx->cur_total_stats[st].operations[j] += \
ctx->cur_stats[i].operations[j]
#define ADD_STATS_DMAS(st, i, j) \
ctx->cur_total_stats[st].dmas[j] += \
ctx->cur_stats[i].dmas[j]
#define ADD_STATS_TIME(st, i, j) \
bintime_add(&ctx->cur_total_stats[st].time[j], \
&ctx->cur_stats[i].time[j])
#define ADD_STATS_DMA_TIME(st, i, j) \
bintime_add(&ctx->cur_total_stats[st].dma_time[j], \
&ctx->cur_stats[i].dma_time[j])
for (i = 0; i < ctx->num_luns; i++) {
if (F_LUNMASK(ctx) && bit_test(ctx->lun_mask,
(int)ctx->cur_lun_stats[i].lun_number) == 0)
for (i = 0; i < ctx->cur_items; i++) {
if (F_MASK(ctx) && bit_test(ctx->item_mask,
(int)ctx->cur_stats[i].item) == 0)
continue;
for (port = 0; port < CTL_MAX_PORTS; port++) {
if (F_PORTMASK(ctx) &&
bit_test(ctx->port_mask, port) == 0)
continue;
for (j = 0; j < CTL_STATS_NUM_TYPES; j++) {
ADD_STATS_BYTES(2, port, i, j);
ADD_STATS_OPERATIONS(2, port, i, j);
ADD_STATS_NUM_DMAS(2, port, i, j);
ADD_STATS_TIME(2, port, i, j);
ADD_STATS_DMA_TIME(2, port, i, j);
}
ADD_STATS_BYTES(0, port, i, CTL_STATS_READ);
ADD_STATS_OPERATIONS(0, port, i,
CTL_STATS_READ);
ADD_STATS_NUM_DMAS(0, port, i, CTL_STATS_READ);
ADD_STATS_TIME(0, port, i, CTL_STATS_READ);
ADD_STATS_DMA_TIME(0, port, i, CTL_STATS_READ);
ADD_STATS_BYTES(1, port, i, CTL_STATS_WRITE);
ADD_STATS_OPERATIONS(1, port, i,
CTL_STATS_WRITE);
ADD_STATS_NUM_DMAS(1, port, i, CTL_STATS_WRITE);
ADD_STATS_TIME(1, port, i, CTL_STATS_WRITE);
ADD_STATS_DMA_TIME(1, port, i, CTL_STATS_WRITE);
for (j = 0; j < CTL_STATS_NUM_TYPES; j++) {
ADD_STATS_BYTES(2, i, j);
ADD_STATS_OPERATIONS(2, i, j);
ADD_STATS_DMAS(2, i, j);
ADD_STATS_TIME(2, i, j);
ADD_STATS_DMA_TIME(2, i, j);
}
ADD_STATS_BYTES(0, i, CTL_STATS_READ);
ADD_STATS_OPERATIONS(0, i, CTL_STATS_READ);
ADD_STATS_DMAS(0, i, CTL_STATS_READ);
ADD_STATS_TIME(0, i, CTL_STATS_READ);
ADD_STATS_DMA_TIME(0, i, CTL_STATS_READ);
ADD_STATS_BYTES(1, i, CTL_STATS_WRITE);
ADD_STATS_OPERATIONS(1, i, CTL_STATS_WRITE);
ADD_STATS_DMAS(1, i, CTL_STATS_WRITE);
ADD_STATS_TIME(1, i, CTL_STATS_WRITE);
ADD_STATS_DMA_TIME(1, i, CTL_STATS_WRITE);
}
for (i = 0; i < 3; i++) {
compute_stats(ctx, &ctx->cur_total_stats[i],
compute_stats(&ctx->cur_total_stats[i],
F_FIRST(ctx) ? NULL : &ctx->prev_total_stats[i],
etime, &mbsec[i], &kb_per_transfer[i],
&transfers_per_sec[i],
@ -576,7 +522,7 @@ ctlstat_standard(struct ctlstat_context *ctx) {
if (F_DMA(ctx) != 0)
fprintf(stdout, " %5.1Lf",
ms_per_dma[i]);
else if (F_LUNVAL(ctx) != 0)
else if (F_TIMEVAL(ctx) != 0)
fprintf(stdout, " %5.1Lf",
ms_per_transfer[i]);
fprintf(stdout, " %4.0Lf %5.0Lf %4.0Lf",
@ -585,25 +531,32 @@ ctlstat_standard(struct ctlstat_context *ctx) {
dmas_per_sec[i], mbsec[i]);
}
} else {
for (i = 0; i < min(CTL_STAT_LUN_BITS, ctx->num_luns); i++) {
for (i = 0; i < min(CTL_STAT_BITS, ctx->cur_items); i++) {
long double mbsec, kb_per_transfer;
long double transfers_per_sec;
long double ms_per_transfer;
long double ms_per_dma;
long double dmas_per_sec;
if (F_LUNMASK(ctx) && bit_test(ctx->lun_mask,
(int)ctx->cur_lun_stats[i].lun_number) == 0)
if (F_MASK(ctx) && bit_test(ctx->item_mask,
(int)ctx->cur_stats[i].item) == 0)
continue;
compute_stats(ctx, &ctx->cur_lun_stats[i],
F_FIRST(ctx) ? NULL : &ctx->prev_lun_stats[i],
for (j = 0; j < ctx->prev_items; j++) {
if (ctx->prev_stats[j].item ==
ctx->cur_stats[i].item)
break;
}
if (j >= ctx->prev_items)
j = -1;
compute_stats(&ctx->cur_stats[i],
j >= 0 ? &ctx->prev_stats[j] : NULL,
etime, &mbsec, &kb_per_transfer,
&transfers_per_sec, &ms_per_transfer,
&ms_per_dma, &dmas_per_sec);
if (F_DMA(ctx))
fprintf(stdout, " %5.1Lf",
ms_per_dma);
else if (F_LUNVAL(ctx) != 0)
else if (F_TIMEVAL(ctx) != 0)
fprintf(stdout, " %5.1Lf",
ms_per_transfer);
fprintf(stdout, " %4.0Lf %5.0Lf %4.0Lf",
@ -620,6 +573,7 @@ main(int argc, char **argv)
int count, waittime;
int fd, retval;
struct ctlstat_context ctx;
struct ctl_io_stats *tmp_stats;
/* default values */
retval = 0;
@ -658,15 +612,16 @@ main(int argc, char **argv)
int cur_lun;
cur_lun = atoi(optarg);
if (cur_lun > CTL_STAT_LUN_BITS)
if (cur_lun > CTL_STAT_BITS)
errx(1, "Invalid LUN number %d", cur_lun);
if (!F_LUNMASK(&ctx))
if (!F_MASK(&ctx))
ctx.numdevs = 1;
else
ctx.numdevs++;
bit_set(ctx.lun_mask, cur_lun);
ctx.flags |= CTLSTAT_FLAG_LUN_MASK;
bit_set(ctx.item_mask, cur_lun);
ctx.flags |= CTLSTAT_FLAG_MASK;
ctx.flags |= CTLSTAT_FLAG_LUNS;
break;
}
case 'n':
@ -676,11 +631,16 @@ main(int argc, char **argv)
int cur_port;
cur_port = atoi(optarg);
if (cur_port > CTL_MAX_PORTS)
errx(1, "Invalid LUN number %d", cur_port);
if (cur_port > CTL_STAT_BITS)
errx(1, "Invalid port number %d", cur_port);
bit_set(ctx.port_mask, cur_port);
ctx.flags |= CTLSTAT_FLAG_PORT_MASK;
if (!F_MASK(&ctx))
ctx.numdevs = 1;
else
ctx.numdevs++;
bit_set(ctx.item_mask, cur_port);
ctx.flags |= CTLSTAT_FLAG_MASK;
ctx.flags |= CTLSTAT_FLAG_PORTS;
break;
}
case 't':
@ -697,29 +657,45 @@ main(int argc, char **argv)
}
}
if (!F_TOTALS(&ctx) && !F_LUNMASK(&ctx)) {
if (F_LUNS(&ctx) && F_PORTS(&ctx))
errx(1, "Options -p and -l are exclusive.");
if (!F_LUNS(&ctx) && !F_PORTS(&ctx)) {
if (F_TOTALS(&ctx))
ctx.flags |= CTLSTAT_FLAG_PORTS;
else
ctx.flags |= CTLSTAT_FLAG_LUNS;
}
if (!F_TOTALS(&ctx) && !F_MASK(&ctx)) {
/*
* Note that this just selects the first N LUNs to display,
* but at this point we have no knoweledge of which LUN
* numbers actually exist. So we may select LUNs that
* aren't there.
*/
bit_nset(ctx.lun_mask, 0, min(ctx.numdevs - 1,
CTL_STAT_LUN_BITS - 1));
ctx.flags |= CTLSTAT_FLAG_LUN_MASK;
bit_nset(ctx.item_mask, 0, min(ctx.numdevs - 1,
CTL_STAT_BITS - 1));
ctx.flags |= CTLSTAT_FLAG_MASK;
}
if ((fd = open(CTL_DEFAULT_DEV, O_RDWR)) == -1)
err(1, "cannot open %s", CTL_DEFAULT_DEV);
for (;count != 0;) {
ctx.tmp_lun_stats = ctx.prev_lun_stats;
ctx.prev_lun_stats = ctx.cur_lun_stats;
ctx.cur_lun_stats = ctx.tmp_lun_stats;
tmp_stats = ctx.prev_stats;
ctx.prev_stats = ctx.cur_stats;
ctx.cur_stats = tmp_stats;
c = ctx.prev_alloc;
ctx.prev_alloc = ctx.cur_alloc;
ctx.cur_alloc = c;
c = ctx.prev_items;
ctx.prev_items = ctx.cur_items;
ctx.cur_items = c;
ctx.prev_time = ctx.cur_time;
ctx.prev_cpu = ctx.cur_cpu;
if (getstats(fd, &ctx.num_luns, &ctx.cur_lun_stats,
&ctx.cur_time, &ctx.flags) != 0)
if (getstats(fd, &ctx.cur_alloc, &ctx.cur_items,
&ctx.cur_stats, &ctx.cur_time, &ctx.flags) != 0)
errx(1, "error returned from getstats()");
switch(ctx.mode) {

View File

@ -427,6 +427,9 @@ main(int argc, char *argv[])
if (xflag && Tflag)
xo_errx(1, "-x and -T are incompatible, pick one.");
/* Load all necessary kvm symbols */
kresolve_list(nl);
if (Bflag) {
if (!live)
usage();
@ -507,9 +510,6 @@ main(int argc, char *argv[])
exit(0);
}
/* Load all necessary kvm symbols */
kresolve_list(nl);
if (tp) {
xo_open_container("statistics");
printproto(tp, tp->pr_name, &first);

View File

@ -496,7 +496,7 @@ fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags)
cq = buf;
slim = sa->sa_len + (u_char *) sa;
cqlim = cq + sizeof(buf) - sizeof(" ffff");
snprintf(cq, sizeof(cq), "(%d)", sa->sa_family);
snprintf(cq, sizeof(buf), "(%d)", sa->sa_family);
cq += strlen(cq);
while (s < slim && cq < cqlim) {
snprintf(cq, sizeof(" ff"), " %02x", *s++);

View File

@ -413,7 +413,7 @@ format_header(char *uname_field)
{
static char Header[128];
const char *prehead;
if (ps.jail)
jidlength = TOP_JID_LEN + 1; /* +1 for extra left space. */
else
@ -559,7 +559,7 @@ get_system_info(struct system_info *si)
arc_stats[5] = arc_stat >> 10;
si->arc = arc_stats;
}
/* set arrays and strings */
if (pcpu_stats) {
si->cpustates = pcpu_cpu_states;
@ -585,7 +585,7 @@ get_system_info(struct system_info *si)
mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
size = sizeof(boottime);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 &&
if (sysctl(mib, nitems(mib), &boottime, &size, NULL, 0) != -1 &&
boottime.tv_sec != 0) {
si->boottime = boottime;
} else {
@ -1072,7 +1072,7 @@ format_next_process(caddr_t handle, char *(*get_userid)(int), int flags)
}
}
if (ps.jail == 0)
if (ps.jail == 0)
jid_buf[0] = '\0';
else
snprintf(jid_buf, sizeof(jid_buf), "%*d",

View File

@ -62,6 +62,16 @@ __FBSDID("$FreeBSD$");
/* mouse device id */
#define PS2MOUSE_DEV_ID 0x0
/* mouse data bits */
#define PS2M_DATA_Y_OFLOW 0x80
#define PS2M_DATA_X_OFLOW 0x40
#define PS2M_DATA_Y_SIGN 0x20
#define PS2M_DATA_X_SIGN 0x10
#define PS2M_DATA_AONE 0x08
#define PS2M_DATA_MID_BUTTON 0x04
#define PS2M_DATA_RIGHT_BUTTON 0x02
#define PS2M_DATA_LEFT_BUTTON 0x01
/* mouse status bits */
#define PS2M_STS_REMOTE_MODE 0x40
#define PS2M_STS_ENABLE_DEV 0x20
@ -169,19 +179,20 @@ movement_get(struct ps2mouse_softc *sc)
assert(pthread_mutex_isowned_np(&sc->mtx));
val0 = sc->status & (PS2M_STS_LEFT_BUTTON |
PS2M_STS_RIGHT_BUTTON | PS2M_STS_MID_BUTTON);
val0 = PS2M_DATA_AONE;
val0 |= sc->status & (PS2M_DATA_LEFT_BUTTON |
PS2M_DATA_RIGHT_BUTTON | PS2M_DATA_MID_BUTTON);
if (sc->delta_x >= 0) {
if (sc->delta_x > 255) {
val0 |= (1 << 6);
val0 |= PS2M_DATA_X_OFLOW;
val1 = 255;
} else
val1 = sc->delta_x;
} else {
val0 |= (1 << 4);
val0 |= PS2M_DATA_X_SIGN;
if (sc->delta_x < -255) {
val0 |= (1 << 6);
val0 |= PS2M_DATA_X_OFLOW;
val1 = 255;
} else
val1 = sc->delta_x;
@ -190,14 +201,14 @@ movement_get(struct ps2mouse_softc *sc)
if (sc->delta_y >= 0) {
if (sc->delta_y > 255) {
val0 |= (1 << 7);
val0 |= PS2M_DATA_Y_OFLOW;
val2 = 255;
} else
val2 = sc->delta_y;
} else {
val0 |= (1 << 5);
val0 |= PS2M_DATA_Y_SIGN;
if (sc->delta_y < -255) {
val0 |= (1 << 7);
val0 |= PS2M_DATA_Y_OFLOW;
val2 = 255;
} else
val2 = sc->delta_y;

View File

@ -209,8 +209,8 @@ struct vring_used {
#define VIRTIO_VENDOR 0x1AF4
#define VIRTIO_DEV_NET 0x1000
#define VIRTIO_DEV_BLOCK 0x1001
#define VIRTIO_DEV_RANDOM 0x1002
#define VIRTIO_DEV_CONSOLE 0x1003
#define VIRTIO_DEV_RANDOM 0x1005
/*
* PCI config space constants.

View File

@ -56,7 +56,9 @@ begemotAtmFreeBSDGroup MODULE-IDENTITY
E-mail: harti@freebsd.org"
DESCRIPTION
"The FreeBSD specific Begemot MIB for ATM interfaces."
REVISION "200408060000Z"
DESCRIPTION
"Initial revision."
::= { begemotAtmSysGroup 1 }
-- Netgraph

View File

@ -2,7 +2,7 @@
#
# Author: Harti Brandt <harti@freebsd.org>
CONTRIB= ${.CURDIR}/../../../../contrib/ngatm
CONTRIB= ${SRCTOP}/contrib/ngatm
.PATH: ${CONTRIB}/snmp_atm
MOD= atm

View File

@ -2,7 +2,7 @@
.include <src.opts.mk>
.PATH: ${.CURDIR}/../../../../sbin/hastd
.PATH: ${SRCTOP}/sbin/hastd
MOD= hast
SRCS= ebuf.c
@ -18,7 +18,7 @@ MAN= snmp_hast.3
NO_WFORMAT=
NO_WCAST_ALIGN=
NO_WMISSING_VARIABLE_DECLARATIONS=
CFLAGS+=-I${.CURDIR}/../../../../sbin/hastd
CFLAGS+=-I${SRCTOP}/sbin/hastd
CFLAGS+=-DHAVE_CAPSICUM
CFLAGS+=-DINET
.if ${MK_INET6_SUPPORT} != "no"

View File

@ -54,6 +54,9 @@ begemotHostres MODULE-IDENTITY
E-mail: harti@freebsd.org"
DESCRIPTION
"The MIB for additional HOST-RESOURCES data."
REVISION "200601030000Z"
DESCRIPTION
"Initial revision."
::= { begemot 202 }
begemotHostresObjects OBJECT IDENTIFIER ::= { begemotHostres 1 }

View File

@ -28,7 +28,7 @@
# $FreeBSD$
#
LPRSRC= ${.CURDIR}/../../../lpr/common_source
LPRSRC= ${SRCTOP}/usr.sbin/lpr/common_source
.PATH: ${LPRSRC}
MOD= hostres
@ -76,6 +76,7 @@ LIBADD= kvm devinfo m geom memstat
printcap.pico: printcap.c
${CC} ${PICFLAG} -DPIC ${CFLAGS:C/^-W.*//} -c ${.IMPSRC} -o ${.TARGET}
smilint:
smilint: .PHONY
smilint: ${BMIBS}
env SMIPATH=.:/usr/share/snmp/mibs:/usr/local/share/snmp/mibs \
smilint -c /dev/null -l6 -i group-membership BEGEMOT-HOSTRES-MIB
smilint -c /dev/null -l6 -i group-membership ${.ALLSRC}

View File

@ -2,7 +2,7 @@
#
# Author: Harti Brandt <harti@freebsd.org>
CONTRIB= ${.CURDIR}/../../../../contrib/bsnmp
CONTRIB= ${SRCTOP}/contrib/bsnmp
.PATH: ${CONTRIB}/snmp_mibII
MOD= mibII
@ -22,6 +22,7 @@ BMIBS= BEGEMOT-IP-MIB.txt BEGEMOT-MIB2-MIB.txt
.include <bsd.snmpmod.mk>
smilint:
smilint: .PHONY
smilint: ${BMIBS}
env SMIPATH=/usr/share/snmp/mibs:/usr/local/share/snmp/mibs \
smilint -c /dev/null -l6 -i group-membership ${BMIBS:C/^/${CONTRIB}\/snmp_mibII\//}
smilint -c /dev/null -l6 -i group-membership ${.ALLSRC}

View File

@ -59,6 +59,19 @@ begemotNg MODULE-IDENTITY
E-mail: harti@freebsd.org"
DESCRIPTION
"The MIB for the NetGraph access module for SNMP."
REVISION "200311140000Z"
DESCRIPTION
"The maximum width of the following OCTET STRINGs was increased
from 15 to 31:
- NgTypeName
- NgNodeName
- NgNodeNameOrEmpty
- NgHookName
"
REVISION "200201310000Z"
DESCRIPTION
"Initial revision."
::= { begemot 2 }
begemotNgObjects OBJECT IDENTIFIER ::= { begemotNg 1 }

View File

@ -2,7 +2,7 @@
#
# Author: Shteryana Shopova <syrinx@freebsd.org>
CONTRIB= ${.CURDIR}/../../../../contrib/bsnmp
CONTRIB= ${SRCTOP}/contrib/bsnmp
.PATH: ${CONTRIB}/snmp_target
MOD= target

View File

@ -2,7 +2,7 @@
#
# Author: Shteryana Shopova <syrinx@freebsd.org>
CONTRIB= ${.CURDIR}/../../../../contrib/bsnmp
CONTRIB= ${SRCTOP}/contrib/bsnmp
.PATH: ${CONTRIB}/snmp_usm
MOD= usm

View File

@ -2,7 +2,7 @@
#
# Author: Shteryana Shopova <syrinx@freebsd.org>
CONTRIB= ${.CURDIR}/../../../../contrib/bsnmp
CONTRIB= ${SRCTOP}/contrib/bsnmp
.PATH: ${CONTRIB}/snmp_vacm
MOD= vacm

View File

@ -4,7 +4,7 @@
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -16,7 +16,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -34,44 +34,40 @@
static const char _rcsid[] = "$KAME: route6d.c,v 1.104 2003/10/31 00:30:20 itojun Exp $";
#endif
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <fnmatch.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <syslog.h>
#include <stddef.h>
#include <errno.h>
#include <err.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#endif
#include <sys/types.h>
#include <sys/param.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/uio.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/in_var.h>
#include <netinet/ip6.h>
#include <netinet/udp.h>
#include <netdb.h>
#include <err.h>
#include <errno.h>
#include <fnmatch.h>
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <netdb.h>
#ifdef HAVE_POLL_H
#include <poll.h>
#endif
#include <signal.h>
#include <stdio.h>
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <time.h>
#include <unistd.h>
#include "route6d.h"
@ -106,7 +102,7 @@ struct ifc { /* Configuration of an interface */
};
TAILQ_HEAD(, ifc) ifc_head = TAILQ_HEAD_INITIALIZER(ifc_head);
struct ifac { /* Adddress associated to an interface */
struct ifac { /* Adddress associated to an interface */
TAILQ_ENTRY(ifac) ifac_next;
struct ifc *ifac_ifc; /* back pointer */
@ -673,7 +669,7 @@ init(void)
fatal("rip IPV6_PKTINFO");
/*NOTREACHED*/
}
#endif
#endif
#ifdef IPV6_RECVPKTINFO
if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
@ -819,8 +815,8 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
* Request from non-link local address is not
* a regular route6d update.
*/
maxrte = (IFMINMTU - sizeof(struct ip6_hdr) -
sizeof(struct udphdr) -
maxrte = (IFMINMTU - sizeof(struct ip6_hdr) -
sizeof(struct udphdr) -
sizeof(struct rip6) + sizeof(struct netinfo6)) /
sizeof(struct netinfo6);
nh = NULL;
@ -868,8 +864,8 @@ ripsend(struct ifc *ifcp, struct sockaddr_in6 *sin6, int flag)
return;
}
maxrte = (ifcp->ifc_mtu - sizeof(struct ip6_hdr) -
sizeof(struct udphdr) -
maxrte = (ifcp->ifc_mtu - sizeof(struct ip6_hdr) -
sizeof(struct udphdr) -
sizeof(struct rip6) + sizeof(struct netinfo6)) /
sizeof(struct netinfo6);
@ -953,13 +949,13 @@ out_filter(struct riprt *rrt, struct ifc *ifcp)
/*
* -A: filter out less specific routes, if we have aggregated
* route configured.
*/
*/
TAILQ_FOREACH(iffp, &ifcp->ifc_iff_head, iff_next) {
if (iffp->iff_type != 'A')
continue;
if (rrt->rrt_info.rip6_plen <= iffp->iff_plen)
continue;
ia = rrt->rrt_info.rip6_dest;
ia = rrt->rrt_info.rip6_dest;
applyplen(&ia, iffp->iff_plen);
if (IN6_ARE_ADDR_EQUAL(&ia, &iffp->iff_addr))
return 0;
@ -995,7 +991,7 @@ out_filter(struct riprt *rrt, struct ifc *ifcp)
continue;
if (rrt->rrt_info.rip6_plen < iffp->iff_plen)
continue;
ia = rrt->rrt_info.rip6_dest;
ia = rrt->rrt_info.rip6_dest;
applyplen(&ia, iffp->iff_plen);
if (IN6_ARE_ADDR_EQUAL(&ia, &iffp->iff_addr)) {
ok = 1;
@ -1195,8 +1191,8 @@ riprecv(void)
} else {
riprequest(NULL, np, nn, &fsock);
}
return;
}
return;
}
if (!IN6_IS_ADDR_LINKLOCAL(&fsock.sin6_addr)) {
trace(1, "Response from non-ll addr: %s\n",
@ -1223,7 +1219,7 @@ riprecv(void)
* source address to be forwarded to a different link.
* So we also check whether the destination address is a link-local
* address or the hop limit is 255. Note that RFC2080 does not require
* the specific hop limit for a unicast response, so we cannot assume
* the specific hop limit for a unicast response, so we cannot assume
* the limitation.
*/
if (!IN6_IS_ADDR_LINKLOCAL(&pi->ipi6_addr) && *hlimp != 255) {
@ -1245,7 +1241,7 @@ riprecv(void)
return; /* The packet is from me; ignore */
if (rp->rip6_cmd != RIP6_RESPONSE) {
trace(1, "Invalid command %d\n", rp->rip6_cmd);
return;
return;
}
/* -N: no use */
@ -1323,7 +1319,7 @@ riprecv(void)
/* special rule: ::/0 means default, not "in /0" */
if (iffp->iff_plen == 0 && np->rip6_plen > 0)
continue;
ia = np->rip6_dest;
ia = np->rip6_dest;
applyplen(&ia, iffp->iff_plen);
if (IN6_ARE_ADDR_EQUAL(&ia, &iffp->iff_addr)) {
ok = 1;
@ -1374,7 +1370,7 @@ riprecv(void)
} else if (nq->rip6_metric == np->rip6_metric &&
np->rip6_metric < HOPCNT_INFINITY6) {
if (rrt->rrt_index == ifcp->ifc_index &&
IN6_ARE_ADDR_EQUAL(&nh, &rrt->rrt_gw)) {
IN6_ARE_ADDR_EQUAL(&nh, &rrt->rrt_gw)) {
/* same metric, same route from same gw */
rrt->rrt_t = t;
} else if (rrt->rrt_t < t_half_lifetime) {
@ -1389,7 +1385,7 @@ riprecv(void)
rrt->rrt_t = t;
}
}
/*
/*
* if nq->rip6_metric == HOPCNT_INFINITY6 then
* do not update age value. Do nothing.
*/
@ -1667,7 +1663,7 @@ ifremove(int ifindex)
break;
}
if (ifcp == NULL)
return;
return;
tracet(1, "ifremove: %s is departed.\n", ifcp->ifc_name);
TAILQ_REMOVE(&ifc_head, ifcp, ifc_next);
@ -1824,7 +1820,7 @@ rtrecv(void)
#if 0
if (rta[RTAX_DST] == NULL) {
trace(1, "\tno destination, ignored\n");
continue;
continue;
}
if (rta[RTAX_DST]->sin6_family != AF_INET6) {
trace(1, "\taf mismatch, ignored\n");
@ -2422,7 +2418,7 @@ getifmtu(int ifindex)
mib[3] = AF_INET6;
mib[4] = NET_RT_IFLIST;
mib[5] = ifindex;
if (sysctl(mib, 6, NULL, &msize, NULL, 0) < 0) {
if (sysctl(mib, nitems(mib), NULL, &msize, NULL, 0) < 0) {
fatal("sysctl estimate NET_RT_IFLIST");
/*NOTREACHED*/
}
@ -2430,7 +2426,7 @@ getifmtu(int ifindex)
fatal("malloc");
/*NOTREACHED*/
}
if (sysctl(mib, 6, buf, &msize, NULL, 0) < 0) {
if (sysctl(mib, nitems(mib), buf, &msize, NULL, 0) < 0) {
fatal("sysctl NET_RT_IFLIST");
/*NOTREACHED*/
}
@ -2602,7 +2598,7 @@ krtread(int again)
free(buf);
buf = NULL;
}
if (sysctl(mib, 6, NULL, &msize, NULL, 0) < 0) {
if (sysctl(mib, nitems(mib), NULL, &msize, NULL, 0) < 0) {
errmsg = "sysctl estimate";
continue;
}
@ -2610,7 +2606,7 @@ krtread(int again)
errmsg = "malloc";
continue;
}
if (sysctl(mib, 6, buf, &msize, NULL, 0) < 0) {
if (sysctl(mib, nitems(mib), buf, &msize, NULL, 0) < 0) {
errmsg = "sysctl NET_RT_DUMP";
continue;
}
@ -3238,7 +3234,7 @@ ifonly:
#if 0
/*
* When the address has already been registered in the
* kernel routing table, it should be removed
* kernel routing table, it should be removed
*/
delroute(&rrt->rrt_info, &gw);
#else
@ -3319,7 +3315,7 @@ mask2len(const struct in6_addr *addr, int lenlim)
{
int i = 0, j;
const u_char *p = (const u_char *)addr;
for (j = 0; j < lenlim; j++, p++) {
if (*p != 0xff)
break;
@ -3446,7 +3442,7 @@ ripsuptrig(void)
time_t t;
double r = rand();
t = (int)(RIP_TRIG_INT6_MIN +
t = (int)(RIP_TRIG_INT6_MIN +
(RIP_TRIG_INT6_MAX - RIP_TRIG_INT6_MIN) * (r / RAND_MAX));
sup_trig_update = time(NULL) + t;
return t;

View File

@ -43,14 +43,14 @@ static char sccsid[] = "@(#)rwhod.c 8.1 (Berkeley) 6/6/93";
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/capsicum.h>
#include <sys/param.h>
#include <sys/capsicum.h>
#include <sys/ioctl.h>
#include <sys/procdesc.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <sys/ioctl.h>
#include <sys/sysctl.h>
#include <sys/procdesc.h>
#include <sys/wait.h>
#include <net/if.h>
@ -548,7 +548,7 @@ getboottime(int signo __unused)
mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
size = sizeof(tm);
if (sysctl(mib, 2, &tm, &size, NULL, 0) == -1) {
if (sysctl(mib, nitems(mib), &tm, &size, NULL, 0) == -1) {
syslog(LOG_ERR, "cannot get boottime: %m");
exit(1);
}
@ -629,11 +629,11 @@ configure(int so)
mib[3] = AF_INET;
mib[4] = NET_RT_IFLIST;
mib[5] = 0;
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
if (sysctl(mib, nitems(mib), NULL, &needed, NULL, 0) < 0)
quit("route-sysctl-estimate");
if ((buf = malloc(needed)) == NULL)
quit("malloc");
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
if (sysctl(mib, nitems(mib), buf, &needed, NULL, 0) < 0)
quit("actual retrieval of interface table");
lim = buf + needed;