IFC @r273066
This commit is contained in:
commit
c0576dea26
@ -168,6 +168,8 @@ evalstring(char *s, int flags)
|
||||
else
|
||||
evaltree(n, flags);
|
||||
any = 1;
|
||||
if (evalskip)
|
||||
break;
|
||||
}
|
||||
popstackmark(&smark);
|
||||
setstackmark(&smark);
|
||||
|
@ -72,6 +72,8 @@ FILES+= eval3.0
|
||||
FILES+= eval4.0
|
||||
FILES+= eval5.0
|
||||
FILES+= eval6.0
|
||||
FILES+= eval7.0
|
||||
FILES+= eval8.7
|
||||
FILES+= exec1.0
|
||||
FILES+= exec2.0
|
||||
FILES+= exit1.0
|
||||
|
9
bin/sh/tests/builtins/eval7.0
Normal file
9
bin/sh/tests/builtins/eval7.0
Normal file
@ -0,0 +1,9 @@
|
||||
# $FreeBSD$
|
||||
# Assumes that break can break out of a loop outside eval.
|
||||
|
||||
while :; do
|
||||
eval "break
|
||||
echo bad1"
|
||||
echo bad2
|
||||
exit 3
|
||||
done
|
7
bin/sh/tests/builtins/eval8.7
Normal file
7
bin/sh/tests/builtins/eval8.7
Normal file
@ -0,0 +1,7 @@
|
||||
# $FreeBSD$
|
||||
|
||||
f() {
|
||||
eval "return 7
|
||||
echo bad2"
|
||||
}
|
||||
f
|
@ -7572,7 +7572,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
#define TARGET_LITTLE_SYM bfd_elf32_powerpcle_vec
|
||||
#define TARGET_LITTLE_NAME "elf32-powerpcle"
|
||||
#define TARGET_BIG_SYM bfd_elf32_powerpc_vec
|
||||
#define TARGET_BIG_NAME "elf32-powerpc"
|
||||
#define TARGET_BIG_NAME "elf32-powerpc-freebsd"
|
||||
#define ELF_ARCH bfd_arch_powerpc
|
||||
#define ELF_MACHINE_CODE EM_PPC
|
||||
#ifdef __QNXTARGET__
|
||||
|
@ -58,7 +58,7 @@ static bfd_vma opd_entry_value
|
||||
#define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
|
||||
#define TARGET_LITTLE_NAME "elf64-powerpcle"
|
||||
#define TARGET_BIG_SYM bfd_elf64_powerpc_vec
|
||||
#define TARGET_BIG_NAME "elf64-powerpc"
|
||||
#define TARGET_BIG_NAME "elf64-powerpc-freebsd"
|
||||
#define ELF_ARCH bfd_arch_powerpc
|
||||
#define ELF_MACHINE_CODE EM_PPC64
|
||||
#define ELF_MAXPAGESIZE 0x10000
|
||||
|
@ -1210,7 +1210,7 @@ ppc_target_format (void)
|
||||
return "elf32-powerpc-vxworks";
|
||||
# else
|
||||
return (target_big_endian
|
||||
? (ppc_obj64 ? "elf64-powerpc" : "elf32-powerpc")
|
||||
? (ppc_obj64 ? "elf64-powerpc-freebsd" : "elf32-powerpc-freebsd")
|
||||
: (ppc_obj64 ? "elf64-powerpcle" : "elf32-powerpcle"));
|
||||
# endif
|
||||
#endif
|
||||
|
@ -1,2 +1,4 @@
|
||||
. ${srcdir}/emulparams/elf32ppc.sh
|
||||
. ${srcdir}/emulparams/elf_fbsd.sh
|
||||
|
||||
OUTPUT_FORMAT="elf32-powerpc-freebsd"
|
||||
|
@ -1,3 +1,4 @@
|
||||
. ${srcdir}/emulparams/elf64ppc.sh
|
||||
. ${srcdir}/emulparams/elf_fbsd.sh
|
||||
|
||||
OUTPUT_FORMAT="elf64-powerpc-freebsd"
|
||||
|
@ -374,6 +374,7 @@ namespace std {
|
||||
#define _LIBCPP_HAS_NO_VARIADICS
|
||||
#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
|
||||
#define _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
|
||||
#else // __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
||||
|
@ -31,6 +31,9 @@
|
||||
*/
|
||||
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
#include <atf-c.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -248,6 +251,7 @@ ATF_TC_BODY(t_spawn_open_nonexistent, tc)
|
||||
posix_spawn_file_actions_destroy(&fa);
|
||||
}
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
ATF_TC(t_spawn_open_nonexistent_diag);
|
||||
|
||||
ATF_TC_HEAD(t_spawn_open_nonexistent_diag, tc)
|
||||
@ -283,6 +287,7 @@ ATF_TC_BODY(t_spawn_open_nonexistent_diag, tc)
|
||||
posix_spawn_file_actions_destroy(&fa);
|
||||
posix_spawnattr_destroy(&attr);
|
||||
}
|
||||
#endif
|
||||
|
||||
ATF_TC(t_spawn_fileactions);
|
||||
|
||||
@ -376,7 +381,9 @@ ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
ATF_TP_ADD_TC(tp, t_spawn_fileactions);
|
||||
ATF_TP_ADD_TC(tp, t_spawn_open_nonexistent);
|
||||
#if defined(__NetBSD__)
|
||||
ATF_TP_ADD_TC(tp, t_spawn_open_nonexistent_diag);
|
||||
#endif
|
||||
ATF_TP_ADD_TC(tp, t_spawn_reopen);
|
||||
ATF_TP_ADD_TC(tp, t_spawn_openmode);
|
||||
ATF_TP_ADD_TC(tp, t_spawn_empty_fileactions);
|
||||
|
@ -56,10 +56,12 @@ ATF_TC_BODY(getcwd_err, tc)
|
||||
ATF_REQUIRE(getcwd(buf, 0) == NULL);
|
||||
ATF_REQUIRE(errno == EINVAL);
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
errno = 0;
|
||||
|
||||
ATF_REQUIRE(getcwd((void *)-1, sizeof(buf)) == NULL);
|
||||
ATF_REQUIRE(errno == EFAULT);
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TC(getcwd_fts);
|
||||
|
@ -46,7 +46,13 @@ __RCSID("$NetBSD: t_glob.c,v 1.3 2013/01/02 11:28:48 martin Exp $");
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include "h_macros.h"
|
||||
#define __gl_stat_t struct stat
|
||||
#define _S_IFDIR S_IFDIR
|
||||
#else
|
||||
#include "../../../h_macros.h"
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -132,7 +138,11 @@ gl_readdir(void *v)
|
||||
dir.d_ino = dd->pos;
|
||||
dir.d_type = f->dir ? DT_DIR : DT_REG;
|
||||
DPRINTF(("readdir %s %d\n", dir.d_name, dir.d_type));
|
||||
#if defined(__FreeBSD__)
|
||||
dir.d_reclen = -1; /* Does not have _DIRENT_RECLEN */
|
||||
#else
|
||||
dir.d_reclen = _DIRENT_RECLEN(&dir, dir.d_namlen);
|
||||
#endif
|
||||
return &dir;
|
||||
}
|
||||
return NULL;
|
||||
@ -213,6 +223,7 @@ run(const char *p, int flags, const char **res, size_t len)
|
||||
}
|
||||
|
||||
|
||||
#if !defined(__FreeBSD__)
|
||||
ATF_TC(glob_star);
|
||||
ATF_TC_HEAD(glob_star, tc)
|
||||
{
|
||||
@ -224,6 +235,7 @@ ATF_TC_BODY(glob_star, tc)
|
||||
{
|
||||
run("a/**", GLOB_STAR, glob_star, __arraycount(glob_star));
|
||||
}
|
||||
#endif
|
||||
|
||||
ATF_TC(glob_star_not);
|
||||
ATF_TC_HEAD(glob_star_not, tc)
|
||||
@ -260,7 +272,9 @@ ATF_TC_BODY(glob_nocheck, tc)
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
#if !defined(__FreeBSD__)
|
||||
ATF_TP_ADD_TC(tp, glob_star);
|
||||
#endif
|
||||
ATF_TP_ADD_TC(tp, glob_star_not);
|
||||
/*
|
||||
* Remove this test for now - the GLOB_NOCHECK return value has been
|
||||
|
@ -34,7 +34,11 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#if defined(__FreeBSD__)
|
||||
#include <libutil.h>
|
||||
#else
|
||||
#include <util.h>
|
||||
#endif
|
||||
|
||||
const struct hnopts {
|
||||
size_t ho_len;
|
||||
@ -78,6 +82,7 @@ const struct hnopts {
|
||||
/*
|
||||
* Truncated output. Rev. 1.7 produces "1.0 K".
|
||||
*/
|
||||
#if !defined(__FreeBSD__)
|
||||
{ 6, 1000, "A", HN_AUTOSCALE, HN_DECIMAL, -1, "" },
|
||||
|
||||
/*
|
||||
@ -90,6 +95,7 @@ const struct hnopts {
|
||||
/* Similar case it prints 1000 where it shouldn't */
|
||||
{ 5, 1023488, "",
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 4, "1.0M" },
|
||||
#endif
|
||||
{ 5, 1023999, "",
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 4, "1.0M" },
|
||||
};
|
||||
|
@ -72,6 +72,11 @@ ATF_TC_BODY(nice_err, tc)
|
||||
{
|
||||
int i;
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("nice(incr) with incr < 0 fails with unprivileged "
|
||||
"users and sets errno == EPERM; see PR # 189821 for more details");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The call should fail with EPERM if the
|
||||
* supplied parameter is negative and the
|
||||
@ -93,7 +98,11 @@ ATF_TC_HEAD(nice_priority, tc)
|
||||
|
||||
ATF_TC_BODY(nice_priority, tc)
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
int i, pri, pri2, nic;
|
||||
#else
|
||||
int i, pri, nic;
|
||||
#endif
|
||||
pid_t pid;
|
||||
int sta;
|
||||
|
||||
@ -106,8 +115,10 @@ ATF_TC_BODY(nice_priority, tc)
|
||||
pri = getpriority(PRIO_PROCESS, 0);
|
||||
ATF_REQUIRE(errno == 0);
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
if (nic != pri)
|
||||
atf_tc_fail("nice(3) and getpriority(2) conflict");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Also verify that the nice(3) values
|
||||
@ -119,10 +130,18 @@ ATF_TC_BODY(nice_priority, tc)
|
||||
if (pid == 0) {
|
||||
|
||||
errno = 0;
|
||||
#if defined(__FreeBSD__)
|
||||
pri = getpriority(PRIO_PROCESS, 0);
|
||||
#else
|
||||
pri2 = getpriority(PRIO_PROCESS, 0);
|
||||
#endif
|
||||
ATF_REQUIRE(errno == 0);
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
if (pri != pri2)
|
||||
#else
|
||||
if (nic != pri)
|
||||
#endif
|
||||
_exit(EXIT_FAILURE);
|
||||
|
||||
_exit(EXIT_SUCCESS);
|
||||
@ -161,7 +180,11 @@ ATF_TC_HEAD(nice_thread, tc)
|
||||
ATF_TC_BODY(nice_thread, tc)
|
||||
{
|
||||
pthread_t tid[5];
|
||||
#if defined(__FreeBSD__)
|
||||
int pri, rv, val;
|
||||
#else
|
||||
int rv, val;
|
||||
#endif
|
||||
size_t i;
|
||||
|
||||
/*
|
||||
@ -173,7 +196,12 @@ ATF_TC_BODY(nice_thread, tc)
|
||||
val = nice(i);
|
||||
ATF_REQUIRE(val != -1);
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
pri = getpriority(PRIO_PROCESS, 0);
|
||||
rv = pthread_create(&tid[i], NULL, threadfunc, &pri);
|
||||
#else
|
||||
rv = pthread_create(&tid[i], NULL, threadfunc, &val);
|
||||
#endif
|
||||
ATF_REQUIRE(rv == 0);
|
||||
|
||||
rv = pthread_join(tid[i], NULL);
|
||||
|
@ -43,7 +43,11 @@ static int count;
|
||||
static void handler_err(int);
|
||||
static void handler_ret(int);
|
||||
static void handler_stress(int);
|
||||
#if defined(__FreeBSD__)
|
||||
static int sig[] = { SIGALRM, SIGIO, SIGUSR1, SIGUSR2 };
|
||||
#else
|
||||
static int sig[] = { SIGALRM, SIGIO, SIGUSR1, SIGUSR2, SIGPWR };
|
||||
#endif
|
||||
|
||||
static void
|
||||
handler_stress(int signo)
|
||||
|
@ -63,8 +63,20 @@ ATF_TC_BODY(setdomainname_basic, tc)
|
||||
|
||||
(void)memset(name, 0, sizeof(name));
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
/*
|
||||
* Sanity checks to ensure that the wrong invariant isn't being
|
||||
* tested for per PR # 181127
|
||||
*/
|
||||
ATF_REQUIRE_EQ(sizeof(domains[i]), MAXHOSTNAMELEN);
|
||||
ATF_REQUIRE_EQ(sizeof(name), MAXHOSTNAMELEN);
|
||||
|
||||
ATF_REQUIRE(setdomainname(domains[i],sizeof(domains[i]) - 1) == 0);
|
||||
ATF_REQUIRE(getdomainname(name, sizeof(name) - 1) == 0);
|
||||
#else
|
||||
ATF_REQUIRE(setdomainname(domains[i],sizeof(domains[i])) == 0);
|
||||
ATF_REQUIRE(getdomainname(name, sizeof(name)) == 0);
|
||||
#endif
|
||||
ATF_REQUIRE(strcmp(domains[i], name) == 0);
|
||||
}
|
||||
|
||||
@ -89,6 +101,10 @@ ATF_TC_BODY(setdomainname_limit, tc)
|
||||
|
||||
(void)memset(name, 0, sizeof(name));
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
ATF_REQUIRE(setdomainname(name, MAXHOSTNAMELEN - 1 ) == 0);
|
||||
ATF_REQUIRE(setdomainname(name, MAXHOSTNAMELEN) == -1);
|
||||
#endif
|
||||
ATF_REQUIRE(setdomainname(name, sizeof(name)) == -1);
|
||||
}
|
||||
|
||||
|
@ -63,8 +63,20 @@ ATF_TC_BODY(sethostname_basic, tc)
|
||||
|
||||
(void)memset(name, 0, sizeof(name));
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
/*
|
||||
* Sanity checks to ensure that the wrong invariant isn't being
|
||||
* tested for per PR # 181127
|
||||
*/
|
||||
ATF_REQUIRE_EQ(sizeof(hosts[i]), MAXHOSTNAMELEN);
|
||||
ATF_REQUIRE_EQ(sizeof(name), MAXHOSTNAMELEN);
|
||||
|
||||
ATF_REQUIRE(sethostname(hosts[i], sizeof(hosts[i]) - 1) == 0);
|
||||
ATF_REQUIRE(gethostname(name, sizeof(name) - 1) == 0);
|
||||
#else
|
||||
ATF_REQUIRE(sethostname(hosts[i], sizeof(hosts[i])) == 0);
|
||||
ATF_REQUIRE(gethostname(name, sizeof(name)) == 0);
|
||||
#endif
|
||||
ATF_REQUIRE(strcmp(hosts[i], name) == 0);
|
||||
}
|
||||
|
||||
@ -94,6 +106,10 @@ ATF_TC_BODY(sethostname_limit, tc)
|
||||
|
||||
ATF_TC_CLEANUP(sethostname_limit, tc)
|
||||
{
|
||||
#if defined(__FreeBSD__)
|
||||
ATF_REQUIRE(sethostname(host, MAXHOSTNAMELEN - 1 ) == 0);
|
||||
ATF_REQUIRE(sethostname(host, MAXHOSTNAMELEN) == -1);
|
||||
#endif
|
||||
(void)sethostname(host, sizeof(host));
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,9 @@
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: t_time.c,v 1.2 2011/11/11 05:03:38 jruoho Exp $");
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <atf-c.h>
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
|
@ -107,6 +107,9 @@ ATF_TC_BODY(ttyname_r_err, tc)
|
||||
ATF_REQUIRE(rv == ERANGE);
|
||||
}
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("FreeBSD returns ENOTTY instead of EBADF; see bin/191936");
|
||||
#endif
|
||||
rv = ttyname_r(-1, buf, ttymax);
|
||||
ATF_REQUIRE(rv == EBADF);
|
||||
|
||||
|
@ -56,6 +56,11 @@ ATF_TC_BODY(bad_big5_wprintf, tc)
|
||||
/* XXX implementation detail knowledge (wchar_t encoding) */
|
||||
wchar_t ibuf[] = { 0xcf10, 0 };
|
||||
setlocale(LC_CTYPE, "zh_TW.Big5");
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("does not fail as expected (may be implementation "
|
||||
"specific issue with the test)");
|
||||
#endif
|
||||
ATF_REQUIRE_ERRNO(EILSEQ, wprintf(L"%ls\n", ibuf) < 0);
|
||||
ATF_REQUIRE(ferror(stdout));
|
||||
}
|
||||
@ -72,6 +77,11 @@ ATF_TC_BODY(bad_big5_swprintf, tc)
|
||||
wchar_t ibuf[] = { 0xcf10, 0 };
|
||||
wchar_t obuf[20];
|
||||
setlocale(LC_CTYPE, "zh_TW.Big5");
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("does not fail as expected (may be implementation "
|
||||
"specific issue with the test)");
|
||||
#endif
|
||||
ATF_REQUIRE_ERRNO(EILSEQ,
|
||||
swprintf(obuf, sizeof(obuf), L"%ls\n", ibuf) < 0);
|
||||
}
|
||||
@ -161,6 +171,9 @@ ATF_TC_BODY(bad_big5_getwc, tc)
|
||||
|
||||
ATF_REQUIRE(fp != NULL);
|
||||
setlocale(LC_CTYPE, "zh_TW.Big5");
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("does not return WEOF as expected");
|
||||
#endif
|
||||
ATF_REQUIRE_EQ(getwc(fp), WEOF);
|
||||
fclose(fp);
|
||||
}
|
||||
|
@ -132,7 +132,14 @@ h_ctype2(const struct test *t, bool use_mbstate)
|
||||
size_t n;
|
||||
|
||||
ATF_REQUIRE_STREQ(setlocale(LC_ALL, "C"), "C");
|
||||
#if defined(__NetBSD__)
|
||||
ATF_REQUIRE(setlocale(LC_CTYPE, t->locale) != NULL);
|
||||
#else
|
||||
if (setlocale(LC_CTYPE, t->locale) == NULL) {
|
||||
fprintf(stderr, "Locale %s not found.\n", t->locale);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
(void)strvis(buf, t->data, VIS_WHITE | VIS_OCTAL);
|
||||
(void)printf("Checking string: \"%s\"\n", buf);
|
||||
@ -238,6 +245,9 @@ ATF_TC_BODY(mbrtowc_internal, tc)
|
||||
{
|
||||
struct test *t;
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("ja_* locale fails");
|
||||
#endif
|
||||
for (t = &tests[0]; t->data != NULL; ++t)
|
||||
h_ctype2(t, false);
|
||||
}
|
||||
|
@ -150,7 +150,14 @@ ATF_TC_BODY(mbstowcs_basic, tc)
|
||||
int i;
|
||||
|
||||
ATF_REQUIRE_STREQ(setlocale(LC_ALL, "C"), "C");
|
||||
#if defined(__NetBSD__)
|
||||
ATF_REQUIRE(setlocale(LC_CTYPE, t->locale) != NULL);
|
||||
#else
|
||||
if (setlocale(LC_CTYPE, t->locale) == NULL) {
|
||||
fprintf(stderr, "Locale %s not found.\n", t->locale);
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
(void)strvis(visbuf, t->data, VIS_WHITE | VIS_OCTAL);
|
||||
(void)printf("Checking string: \"%s\"\n", visbuf);
|
||||
|
@ -76,7 +76,14 @@ h_mbtowc(const char *locale, const char *illegal, const char *legal)
|
||||
char *str;
|
||||
|
||||
ATF_REQUIRE_STREQ(setlocale(LC_ALL, "C"), "C");
|
||||
#if defined(__NetBSD__)
|
||||
ATF_REQUIRE(setlocale(LC_CTYPE, locale) != NULL);
|
||||
#else
|
||||
if (setlocale(LC_CTYPE, locale) == NULL) {
|
||||
fprintf(stderr, "Locale %s not found.\n", locale);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
ATF_REQUIRE((str = setlocale(LC_ALL, NULL)) != NULL);
|
||||
(void)printf("Using locale: %s\n", str);
|
||||
@ -130,9 +137,16 @@ ATF_TC_BODY(mbtowc, tc)
|
||||
h_mbtowc("ja_JP.ISO2022-JP", "\033$B", "\033$B$\"\033(B");
|
||||
h_mbtowc("ja_JP.SJIS", "\202", "\202\240");
|
||||
h_mbtowc("ja_JP.eucJP", "\244", "\244\242");
|
||||
#if !defined(__FreeBSD__)
|
||||
/* Moved last as it fails */
|
||||
h_mbtowc("zh_CN.GB18030", "\241", "\241\241");
|
||||
#endif
|
||||
h_mbtowc("zh_TW.Big5", "\241", "\241@");
|
||||
h_mbtowc("zh_TW.eucTW", "\241", "\241\241");
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("zh_CN.GB18030");
|
||||
h_mbtowc("zh_CN.GB18030", "\241", "\241\241");
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
|
@ -66,6 +66,10 @@ __RCSID("$NetBSD: t_wcstod.c,v 1.3 2011/10/01 17:56:11 christos Exp $");
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#define ALT_HUGE_VAL -1
|
||||
#define ALT_MINUS_HUGE_VAL -2
|
||||
#define ALT_NAN -3
|
||||
@ -234,7 +238,7 @@ static struct test {
|
||||
{ L" -0X.", 12, 0, 0 },
|
||||
#endif
|
||||
/* XXX: FIXME */
|
||||
#if defined(__NetBSD__) || defined(__linux__)
|
||||
#if defined(__NetBSD__) || defined(__linux__) || defined(__FreeBSD__)
|
||||
{ L"0X.0", 4, 0, 0 },
|
||||
{ L"+0X.0", 5, 0, 0 },
|
||||
{ L"-0X.0", 5, 0, 0 },
|
||||
|
@ -109,7 +109,14 @@ h_wctomb(const struct test *t, char tc)
|
||||
size_t sz, ret, i;
|
||||
|
||||
ATF_REQUIRE_STREQ(setlocale(LC_ALL, "C"), "C");
|
||||
#if defined(__NetBSD__)
|
||||
ATF_REQUIRE(setlocale(LC_CTYPE, t->locale) != NULL);
|
||||
#else
|
||||
if (setlocale(LC_CTYPE, t->locale) == NULL) {
|
||||
fprintf(stderr, "Locale %s not found.\n", t->locale);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
(void)strvis(buf, t->data, VIS_WHITE | VIS_OCTAL);
|
||||
(void)printf("Checking sequence: \"%s\"\n", buf);
|
||||
|
@ -34,6 +34,10 @@
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#if defined(__FreeBSD__)
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
#endif
|
||||
|
||||
/* Don't sort these! */
|
||||
#include "utils.h"
|
||||
@ -50,6 +54,7 @@ static char *regchar(int);
|
||||
void
|
||||
regprint(regex_t *r, FILE *d)
|
||||
{
|
||||
#if defined(__NetBSD__)
|
||||
struct re_guts *g = r->re_g;
|
||||
int c;
|
||||
int last;
|
||||
@ -111,6 +116,7 @@ regprint(regex_t *r, FILE *d)
|
||||
}
|
||||
fprintf(d, "\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -171,6 +177,7 @@ s_print(struct re_guts *g, FILE *d)
|
||||
break;
|
||||
case OANYOF:
|
||||
fprintf(d, "[(%ld)", (long)opnd);
|
||||
#if defined(__NetBSD__)
|
||||
cs = &g->sets[opnd];
|
||||
last = -1;
|
||||
for (size_t i = 0; i < g->csetsize+1; i++) /* +1 flushes */
|
||||
@ -187,6 +194,7 @@ s_print(struct re_guts *g, FILE *d)
|
||||
last = -1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
fprintf(d, "]");
|
||||
break;
|
||||
case OBACK_:
|
||||
@ -242,7 +250,11 @@ s_print(struct re_guts *g, FILE *d)
|
||||
fprintf(d, ">");
|
||||
break;
|
||||
default:
|
||||
#if defined(__FreeBSD__)
|
||||
fprintf(d, "!%ld(%ld)!", OP(*s), opnd);
|
||||
#else
|
||||
fprintf(d, "!%d(%d)!", OP(*s), opnd);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
if (!done)
|
||||
|
@ -45,6 +45,9 @@ __RCSID("$NetBSD: t_exhaust.c,v 1.7 2011/11/16 18:37:31 christos Exp $");
|
||||
#include <stdlib.h>
|
||||
#include <err.h>
|
||||
#include <atf-c.h>
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
|
||||
#ifndef REGEX_MAXSIZE
|
||||
#define REGEX_MAXSIZE 9999
|
||||
@ -176,14 +179,25 @@ ATF_TC_HEAD(regcomp_too_big, tc)
|
||||
" crash, but return a proper error code");
|
||||
// libtre needs it.
|
||||
atf_tc_set_md_var(tc, "timeout", "600");
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_set_md_var(tc, "require.memory", "64M");
|
||||
#else
|
||||
atf_tc_set_md_var(tc, "require.memory", "120M");
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TC_BODY(regcomp_too_big, tc)
|
||||
{
|
||||
regex_t re;
|
||||
#if defined(__FreeBSD__)
|
||||
struct rlimit limit;
|
||||
#endif
|
||||
int e;
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
limit.rlim_cur = limit.rlim_max = 64 * 1024 * 1024;
|
||||
ATF_REQUIRE(setrlimit(RLIMIT_VMEM, &limit) != -1);
|
||||
#endif
|
||||
for (size_t i = 0; i < __arraycount(tests); i++) {
|
||||
char *d = (*tests[i].pattern)(REGEX_MAXSIZE);
|
||||
e = regcomp(&re, d, tests[i].type);
|
||||
|
@ -48,6 +48,9 @@ __RCSID("$NetBSD: t_regex_att.c,v 1.1 2012/08/24 20:24:40 jmmv Exp $");
|
||||
#include <vis.h>
|
||||
#include <ctype.h>
|
||||
#include <atf-c.h>
|
||||
#if defined(__FreeBSD__)
|
||||
#include <libutil.h>
|
||||
#endif
|
||||
|
||||
static const char sep[] = "\r\n\t";
|
||||
static const char delim[3] = "\\\\\0";
|
||||
@ -374,7 +377,11 @@ checkmatches(const char *matches, size_t nm, const regmatch_t *pm,
|
||||
" cur=%d, max=%zu", res, l, len - off);
|
||||
off += l;
|
||||
}
|
||||
#if defined(__FreeBSD__)
|
||||
ATF_CHECK_STREQ_MSG(res, matches, " at line %zu", lineno);
|
||||
#else
|
||||
ATF_REQUIRE_STREQ_MSG(res, matches, " at line %zu", lineno);
|
||||
#endif
|
||||
free(res);
|
||||
}
|
||||
|
||||
@ -572,6 +579,9 @@ ATF_TC_BODY(leftassoc, tc)
|
||||
* disabled this test in a very unconventional way without giving
|
||||
* any explation. Mark as broken here, but I don't know why. */
|
||||
atf_tc_expect_fail("Reason for breakage unknown");
|
||||
#endif
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("The expected and matched groups are mismatched on FreeBSD");
|
||||
#endif
|
||||
att_test(tc, "leftassoc");
|
||||
}
|
||||
|
@ -36,6 +36,9 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#if defined(__FreeBSD__)
|
||||
#include <libutil.h>
|
||||
#endif
|
||||
|
||||
#define SKIPWS(p) while (isspace((int)(*p))) p++
|
||||
#define WS "\t\n "
|
||||
|
@ -40,6 +40,9 @@ __RCSID("$NetBSD: t_getenv.c,v 1.2 2011/07/15 13:54:31 jruoho Exp $");
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#if defined(__FreeBSD__)
|
||||
#include <signal.h>
|
||||
#endif
|
||||
|
||||
extern char **environ;
|
||||
|
||||
@ -152,6 +155,15 @@ ATF_TC_BODY(setenv_basic, tc)
|
||||
ATF_CHECK_ERRNO(EINVAL, setenv(NULL, "val", 1) == -1);
|
||||
ATF_CHECK_ERRNO(EINVAL, setenv("", "val", 1) == -1);
|
||||
ATF_CHECK_ERRNO(EINVAL, setenv("v=r", "val", 1) == -1);
|
||||
#if defined(__FreeBSD__)
|
||||
/*
|
||||
Both FreeBSD and OS/X does not validate the second
|
||||
argument to setenv(3)
|
||||
*/
|
||||
atf_tc_expect_signal(SIGSEGV, "FreeBSD does not validate the second "
|
||||
"argument to setenv(3); see bin/189805");
|
||||
#endif
|
||||
|
||||
ATF_CHECK_ERRNO(EINVAL, setenv("var", NULL, 1) == -1);
|
||||
|
||||
ATF_CHECK(setenv("var", "=val", 1) == 0);
|
||||
|
@ -75,6 +75,7 @@ __RCSID("$NetBSD: t_hsearch.c,v 1.4 2014/07/20 20:17:21 christos Exp $");
|
||||
|
||||
#define REQUIRE_ERRNO(x) ATF_REQUIRE_MSG(x, "%s", strerror(errno))
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
ATF_TC(hsearch_basic);
|
||||
ATF_TC_HEAD(hsearch_basic, tc)
|
||||
{
|
||||
@ -123,6 +124,7 @@ ATF_TC_BODY(hsearch_basic, tc)
|
||||
|
||||
hdestroy1(free, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
ATF_TC(hsearch_duplicate);
|
||||
ATF_TC_HEAD(hsearch_duplicate, tc)
|
||||
@ -229,6 +231,7 @@ ATF_TC_BODY(hsearch_two, tc)
|
||||
hdestroy();
|
||||
}
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
ATF_TC(hsearch_r_basic);
|
||||
ATF_TC_HEAD(hsearch_r_basic, tc)
|
||||
{
|
||||
@ -276,6 +279,7 @@ ATF_TC_BODY(hsearch_r_basic, tc)
|
||||
|
||||
hdestroy1_r(&t, free, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
ATF_TC(hsearch_r_duplicate);
|
||||
ATF_TC_HEAD(hsearch_r_duplicate, tc)
|
||||
@ -385,12 +389,16 @@ ATF_TC_BODY(hsearch_r_two, tc)
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
ATF_TP_ADD_TC(tp, hsearch_basic);
|
||||
#endif
|
||||
ATF_TP_ADD_TC(tp, hsearch_duplicate);
|
||||
ATF_TP_ADD_TC(tp, hsearch_nonexistent);
|
||||
ATF_TP_ADD_TC(tp, hsearch_two);
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
ATF_TP_ADD_TC(tp, hsearch_r_basic);
|
||||
#endif
|
||||
ATF_TP_ADD_TC(tp, hsearch_r_duplicate);
|
||||
ATF_TP_ADD_TC(tp, hsearch_r_nonexistent);
|
||||
ATF_TP_ADD_TC(tp, hsearch_r_two);
|
||||
|
@ -221,7 +221,9 @@ ATF_TC_BODY(strtold_nan, tc)
|
||||
|
||||
volatile long double ld = strtold(nan_string, &end);
|
||||
ATF_REQUIRE(isnan(ld) != 0);
|
||||
#if !defined(__FreeBSD__)
|
||||
ATF_REQUIRE(__isnanl(ld) != 0);
|
||||
#endif
|
||||
ATF_REQUIRE(strcmp(end, "y") == 0);
|
||||
# else
|
||||
atf_tc_skip("Requires long double support");
|
||||
|
@ -51,7 +51,11 @@ unsigned char *start[BLOCKTYPES] = {
|
||||
};
|
||||
|
||||
char result[100];
|
||||
#if defined(__NetBSD__)
|
||||
const char goodResult[] = "7b405d24bc03195474c70ddae9e1f8fb";
|
||||
#else
|
||||
const char goodResult[] = "217b4fbe456916bf62a2f85df752e4ab";
|
||||
#endif
|
||||
|
||||
static void
|
||||
runTest(unsigned char *b1, unsigned char *b2)
|
||||
@ -89,7 +93,15 @@ ATF_TC_BODY(memcpy_basic, tc)
|
||||
start[2] = auto1;
|
||||
start[3] = auto2;
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
srandom(0L);
|
||||
#else
|
||||
/*
|
||||
* random() shall produce by default a sequence of numbers that can be
|
||||
* duplicated by calling srandom() with 1 as the seed.
|
||||
*/
|
||||
srandom(1);
|
||||
#endif
|
||||
MD5Init(mc);
|
||||
for (i = 0; i < BLOCKTYPES; ++i)
|
||||
for (j = 0; j < BLOCKTYPES; ++j)
|
||||
|
@ -75,8 +75,13 @@ ATF_TC_HEAD(memmem_basic, tc)
|
||||
ATF_TC_BODY(memmem_basic, tc)
|
||||
{
|
||||
|
||||
#if defined(__darwin__) || defined(__FreeBSD__)
|
||||
expect(memmem(b2, lb2, p0, lp0) == NULL);
|
||||
expect(memmem(b0, lb0, p0, lp0) == NULL);
|
||||
#else
|
||||
expect(memmem(b2, lb2, p0, lp0) == b2);
|
||||
expect(memmem(b0, lb0, p0, lp0) == b0);
|
||||
#endif
|
||||
expect(memmem(b0, lb0, p1, lp1) == NULL);
|
||||
expect(memmem(b1, lb1, p1, lp1) == NULL);
|
||||
|
||||
|
@ -37,6 +37,10 @@ __RCSID("$NetBSD: t_strerror.c,v 1.3 2011/05/10 06:55:27 jruoho Exp $");
|
||||
#include <locale.h>
|
||||
#include <string.h>
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
ATF_TC(strerror_basic);
|
||||
ATF_TC_HEAD(strerror_basic, tc)
|
||||
{
|
||||
|
@ -72,7 +72,12 @@ ATF_TC_BODY(mktime_negyear, tc)
|
||||
|
||||
errno = 0;
|
||||
t = mktime(&tms);
|
||||
#if defined(__FreeBSD__)
|
||||
/* Open Group says "and may set errno to indicate the error" */
|
||||
ATF_REQUIRE(t == (time_t)-1);
|
||||
#else
|
||||
ATF_REQUIRE_ERRNO(0, t != (time_t)-1);
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TC(timegm_epoch);
|
||||
|
@ -49,6 +49,17 @@ h_pass(const char *buf, const char *fmt, int len,
|
||||
exp = buf + len;
|
||||
ret = strptime(buf, fmt, &tm);
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
ATF_CHECK_MSG(ret == exp,
|
||||
"strptime(\"%s\", \"%s\", tm): incorrect return code: "
|
||||
"expected: %p, got: %p", buf, fmt, exp, ret);
|
||||
|
||||
#define H_REQUIRE_FIELD(field) \
|
||||
ATF_CHECK_MSG(tm.field == field, \
|
||||
"strptime(\"%s\", \"%s\", tm): incorrect %s: " \
|
||||
"expected: %d, but got: %d", buf, fmt, \
|
||||
___STRING(field), field, tm.field)
|
||||
#else
|
||||
ATF_REQUIRE_MSG(ret == exp,
|
||||
"strptime(\"%s\", \"%s\", tm): incorrect return code: "
|
||||
"expected: %p, got: %p", buf, fmt, exp, ret);
|
||||
@ -58,6 +69,7 @@ h_pass(const char *buf, const char *fmt, int len,
|
||||
"strptime(\"%s\", \"%s\", tm): incorrect %s: " \
|
||||
"expected: %d, but got: %d", buf, fmt, \
|
||||
___STRING(field), field, tm.field)
|
||||
#endif
|
||||
|
||||
H_REQUIRE_FIELD(tm_sec);
|
||||
H_REQUIRE_FIELD(tm_min);
|
||||
@ -76,8 +88,13 @@ h_fail(const char *buf, const char *fmt)
|
||||
{
|
||||
struct tm tm = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, NULL };
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
ATF_CHECK_MSG(strptime(buf, fmt, &tm) == NULL, "strptime(\"%s\", "
|
||||
"\"%s\", &tm) should fail, but it didn't", buf, fmt);
|
||||
#else
|
||||
ATF_REQUIRE_MSG(strptime(buf, fmt, &tm) == NULL, "strptime(\"%s\", "
|
||||
"\"%s\", &tm) should fail, but it didn't", buf, fmt);
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TC(common);
|
||||
@ -91,6 +108,10 @@ ATF_TC_HEAD(common, tc)
|
||||
ATF_TC_BODY(common, tc)
|
||||
{
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
atf_tc_expect_fail("There are various issues with strptime on FreeBSD");
|
||||
#endif
|
||||
|
||||
h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %T %Y",
|
||||
24, 46, 27, 23, 20, 0, 98, 2, -1);
|
||||
h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %H:%M:%S %Y",
|
||||
@ -168,9 +189,17 @@ ATF_TC_BODY(day, tc)
|
||||
h_pass("mon", "%a", 3, -1, -1, -1, -1, -1, -1, 1, -1);
|
||||
h_pass("tueSDay", "%A", 7, -1, -1, -1, -1, -1, -1, 2, -1);
|
||||
h_pass("sunday", "%A", 6, -1, -1, -1, -1, -1, -1, 0, -1);
|
||||
#if defined(__NetBSD__)
|
||||
h_fail("sunday", "%EA");
|
||||
#else
|
||||
h_pass("Sunday", "%EA", 6, -1, -1, -1, -1, -1, -1, 0, -1);
|
||||
#endif
|
||||
h_pass("SaturDay", "%A", 8, -1, -1, -1, -1, -1, -1, 6, -1);
|
||||
#if defined(__NetBSD__)
|
||||
h_fail("SaturDay", "%OA");
|
||||
#else
|
||||
h_pass("SaturDay", "%OA", 8, -1, -1, -1, -1, -1, -1, 6, -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
ATF_TC(month);
|
||||
|
@ -36,7 +36,9 @@ __RCSID("$NetBSD: h_tls_dlopen.c,v 1.5 2013/10/21 19:14:16 joerg Exp $");
|
||||
|
||||
#include <atf-c.h>
|
||||
#include <unistd.h>
|
||||
#if defined(__NetBSD__)
|
||||
#include <sys/tls.h>
|
||||
#endif
|
||||
|
||||
#ifdef __HAVE_NO___THREAD
|
||||
#define __thread
|
||||
|
@ -39,7 +39,9 @@ __RCSID("$NetBSD: t_tls_dlopen.c,v 1.3 2012/01/17 20:34:57 joerg Exp $");
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
#include <sys/tls.h>
|
||||
#endif
|
||||
|
||||
#ifdef __HAVE_NO___THREAD
|
||||
#define __thread
|
||||
|
@ -38,7 +38,9 @@ __RCSID("$NetBSD: t_tls_dynamic.c,v 1.3 2012/01/17 20:34:57 joerg Exp $");
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
#include <sys/tls.h>
|
||||
#endif
|
||||
|
||||
#ifdef __HAVE_NO___THREAD
|
||||
#define __thread
|
||||
|
@ -37,7 +37,9 @@ __RCSID("$NetBSD: t_tls_static.c,v 1.2 2012/01/17 20:34:57 joerg Exp $");
|
||||
#include <atf-c.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
#include <sys/tls.h>
|
||||
#endif
|
||||
|
||||
#ifdef __HAVE_NO___THREAD
|
||||
#define __thread
|
||||
|
@ -34,7 +34,9 @@
|
||||
#include <sys/cdefs.h>
|
||||
__RCSID("$NetBSD: t_tls_static_helper.c,v 1.2 2012/01/17 20:34:57 joerg Exp $");
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
#include <sys/tls.h>
|
||||
#endif
|
||||
|
||||
#ifdef __HAVE_NO___THREAD
|
||||
#define __thread
|
||||
|
@ -35,7 +35,9 @@
|
||||
__RCSID("$NetBSD: h_tls_dynamic.c,v 1.5 2013/10/21 19:11:17 joerg Exp $");
|
||||
|
||||
#include <unistd.h>
|
||||
#if defined(__NetBSD__)
|
||||
#include <sys/tls.h>
|
||||
#endif
|
||||
|
||||
#ifdef __HAVE_NO___THREAD
|
||||
#define __thread
|
||||
|
@ -8,7 +8,7 @@ extern char *inet_cfg(); /* read inetd.conf file */
|
||||
extern void inet_set(); /* remember internet service */
|
||||
extern int inet_get(); /* look up internet service */
|
||||
|
||||
#define WR_UNKNOWN (-1) /* service unknown */
|
||||
#define WR_NOT 1 /* may not be wrapped */
|
||||
#define WR_MAYBE 2 /* may be wrapped */
|
||||
#define WR_UNKNOWN (-1) /* service unknown */
|
||||
#define WR_NOT 1 /* may not be wrapped */
|
||||
#define WR_MAYBE 2 /* may be wrapped */
|
||||
#define WR_YES 3 /* service is wrapped */
|
||||
|
@ -6,14 +6,14 @@
|
||||
|
||||
#ifdef __STDC__
|
||||
#include <stdarg.h>
|
||||
#define VARARGS(func,type,arg) func(type arg, ...)
|
||||
#define VASTART(ap,type,name) va_start(ap,name)
|
||||
#define VAEND(ap) va_end(ap)
|
||||
#define VARARGS(func,type,arg) func(type arg, ...)
|
||||
#define VASTART(ap,type,name) va_start(ap,name)
|
||||
#define VAEND(ap) va_end(ap)
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#define VARARGS(func,type,arg) func(va_alist) va_dcl
|
||||
#define VASTART(ap,type,name) {type name; va_start(ap); name = va_arg(ap, type)
|
||||
#define VAEND(ap) va_end(ap);}
|
||||
#define VARARGS(func,type,arg) func(va_alist) va_dcl
|
||||
#define VASTART(ap,type,name) {type name; va_start(ap); name = va_arg(ap, type)
|
||||
#define VAEND(ap) va_end(ap);}
|
||||
#endif
|
||||
|
||||
extern char *percent_m();
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
/* Structure to describe one communications endpoint. */
|
||||
|
||||
#define STRING_LENGTH 128 /* hosts, users, processes */
|
||||
#define STRING_LENGTH 128 /* hosts, users, processes */
|
||||
|
||||
struct host_info {
|
||||
char name[STRING_LENGTH]; /* access via eval_hostname(host) */
|
||||
@ -31,21 +31,21 @@ struct request_info {
|
||||
char pid[10]; /* access via eval_pid(request) */
|
||||
struct host_info client[1]; /* client endpoint info */
|
||||
struct host_info server[1]; /* server endpoint info */
|
||||
void (*sink) (); /* datagram sink function or 0 */
|
||||
void (*hostname) (); /* address to printable hostname */
|
||||
void (*hostaddr) (); /* address to printable address */
|
||||
void (*cleanup) (); /* cleanup function or 0 */
|
||||
void (*sink) (int); /* datagram sink function or 0 */
|
||||
void (*hostname) (struct host_info *); /* address to printable hostname */
|
||||
void (*hostaddr) (struct host_info *); /* address to printable address */
|
||||
void (*cleanup) (struct request_info *); /* cleanup function or 0 */
|
||||
struct netconfig *config; /* netdir handle */
|
||||
};
|
||||
|
||||
/* Common string operations. Less clutter should be more readable. */
|
||||
|
||||
#define STRN_CPY(d,s,l) { strncpy((d),(s),(l)); (d)[(l)-1] = 0; }
|
||||
#define STRN_CPY(d,s,l) { strncpy((d),(s),(l)); (d)[(l)-1] = 0; }
|
||||
|
||||
#define STRN_EQ(x,y,l) (strncasecmp((x),(y),(l)) == 0)
|
||||
#define STRN_NE(x,y,l) (strncasecmp((x),(y),(l)) != 0)
|
||||
#define STR_EQ(x,y) (strcasecmp((x),(y)) == 0)
|
||||
#define STR_NE(x,y) (strcasecmp((x),(y)) != 0)
|
||||
#define STRN_EQ(x,y,l) (strncasecmp((x),(y),(l)) == 0)
|
||||
#define STRN_NE(x,y,l) (strncasecmp((x),(y),(l)) != 0)
|
||||
#define STR_EQ(x,y) (strcasecmp((x),(y)) == 0)
|
||||
#define STR_NE(x,y) (strcasecmp((x),(y)) != 0)
|
||||
|
||||
/*
|
||||
* Initially, all above strings have the empty value. Information that
|
||||
@ -54,25 +54,26 @@ struct request_info {
|
||||
* that we do not believe in is set to "paranoid".
|
||||
*/
|
||||
|
||||
#define STRING_UNKNOWN "unknown" /* lookup failed */
|
||||
#define STRING_PARANOID "paranoid" /* hostname conflict */
|
||||
#define STRING_UNKNOWN "unknown" /* lookup failed */
|
||||
#define STRING_PARANOID "paranoid" /* hostname conflict */
|
||||
|
||||
extern char unknown[];
|
||||
extern char paranoid[];
|
||||
|
||||
#define HOSTNAME_KNOWN(s) (STR_NE((s),unknown) && STR_NE((s),paranoid))
|
||||
#define HOSTNAME_KNOWN(s) (STR_NE((s),unknown) && STR_NE((s),paranoid))
|
||||
|
||||
#define NOT_INADDR(s) (s[strspn(s,"01234567890./")] != 0)
|
||||
#define NOT_INADDR(s) (s[strspn(s,"01234567890./")] != 0)
|
||||
|
||||
/* Global functions. */
|
||||
|
||||
#if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
|
||||
extern void fromhost(); /* get/validate client host info */
|
||||
#else
|
||||
#define fromhost sock_host /* no TLI support needed */
|
||||
#define fromhost sock_host /* no TLI support needed */
|
||||
#endif
|
||||
|
||||
extern int hosts_access(); /* access control */
|
||||
extern int hosts_ctl(); /* wrapper around request_init() */
|
||||
extern void shell_cmd(); /* execute shell command */
|
||||
extern char *percent_x(); /* do %<char> expansion */
|
||||
extern void rfc931(); /* client name from RFC 931 daemon */
|
||||
@ -105,15 +106,15 @@ extern struct request_info *request_init(); /* initialize request */
|
||||
extern struct request_info *request_set(); /* update request structure */
|
||||
#endif
|
||||
|
||||
#define RQ_FILE 1 /* file descriptor */
|
||||
#define RQ_DAEMON 2 /* server process (argv[0]) */
|
||||
#define RQ_USER 3 /* client user name */
|
||||
#define RQ_CLIENT_NAME 4 /* client host name */
|
||||
#define RQ_CLIENT_ADDR 5 /* client host address */
|
||||
#define RQ_CLIENT_SIN 6 /* client endpoint (internal) */
|
||||
#define RQ_SERVER_NAME 7 /* server host name */
|
||||
#define RQ_SERVER_ADDR 8 /* server host address */
|
||||
#define RQ_SERVER_SIN 9 /* server endpoint (internal) */
|
||||
#define RQ_FILE 1 /* file descriptor */
|
||||
#define RQ_DAEMON 2 /* server process (argv[0]) */
|
||||
#define RQ_USER 3 /* client user name */
|
||||
#define RQ_CLIENT_NAME 4 /* client host name */
|
||||
#define RQ_CLIENT_ADDR 5 /* client host address */
|
||||
#define RQ_CLIENT_SIN 6 /* client endpoint (internal) */
|
||||
#define RQ_SERVER_NAME 7 /* server host name */
|
||||
#define RQ_SERVER_ADDR 8 /* server host address */
|
||||
#define RQ_SERVER_SIN 9 /* server endpoint (internal) */
|
||||
|
||||
/*
|
||||
* Routines for delayed evaluation of request attributes. Each attribute
|
||||
@ -129,15 +130,15 @@ extern char *eval_hostaddr(); /* printable host address */
|
||||
extern char *eval_hostinfo(); /* host name or address */
|
||||
extern char *eval_client(); /* whatever is available */
|
||||
extern char *eval_server(); /* whatever is available */
|
||||
#define eval_daemon(r) ((r)->daemon) /* daemon process name */
|
||||
#define eval_pid(r) ((r)->pid) /* process id */
|
||||
#define eval_daemon(r) ((r)->daemon) /* daemon process name */
|
||||
#define eval_pid(r) ((r)->pid) /* process id */
|
||||
|
||||
/* Socket-specific methods, including DNS hostname lookups. */
|
||||
|
||||
extern void sock_host(); /* look up endpoint addresses */
|
||||
extern void sock_hostname(); /* translate address to hostname */
|
||||
extern void sock_hostaddr(); /* address to printable address */
|
||||
#define sock_methods(r) \
|
||||
#define sock_methods(r) \
|
||||
{ (r)->hostname = sock_hostname; (r)->hostaddr = sock_hostaddr; }
|
||||
|
||||
/* The System V Transport-Level Interface (TLI) interface. */
|
||||
@ -173,9 +174,9 @@ extern struct tcpd_context tcpd_context;
|
||||
* (-1) returns are here because zero is already taken by longjmp().
|
||||
*/
|
||||
|
||||
#define AC_PERMIT 1 /* permit access */
|
||||
#define AC_DENY (-1) /* deny_access */
|
||||
#define AC_ERROR AC_DENY /* XXX */
|
||||
#define AC_PERMIT 1 /* permit access */
|
||||
#define AC_DENY (-1) /* deny_access */
|
||||
#define AC_ERROR AC_DENY /* XXX */
|
||||
|
||||
/*
|
||||
* In verification mode an option function should just say what it would do,
|
||||
@ -190,36 +191,36 @@ extern int dry_run; /* verification flag */
|
||||
/* Bug workarounds. */
|
||||
|
||||
#ifdef INET_ADDR_BUG /* inet_addr() returns struct */
|
||||
#define inet_addr fix_inet_addr
|
||||
#define inet_addr fix_inet_addr
|
||||
extern long fix_inet_addr();
|
||||
#endif
|
||||
|
||||
#ifdef BROKEN_FGETS /* partial reads from sockets */
|
||||
#define fgets fix_fgets
|
||||
#define fgets fix_fgets
|
||||
extern char *fix_fgets();
|
||||
#endif
|
||||
|
||||
#ifdef RECVFROM_BUG /* no address family info */
|
||||
#define recvfrom fix_recvfrom
|
||||
#define recvfrom fix_recvfrom
|
||||
extern int fix_recvfrom();
|
||||
#endif
|
||||
|
||||
#ifdef GETPEERNAME_BUG /* claims success with UDP */
|
||||
#define getpeername fix_getpeername
|
||||
#define getpeername fix_getpeername
|
||||
extern int fix_getpeername();
|
||||
#endif
|
||||
|
||||
#ifdef SOLARIS_24_GETHOSTBYNAME_BUG /* lists addresses as aliases */
|
||||
#define gethostbyname fix_gethostbyname
|
||||
#define gethostbyname fix_gethostbyname
|
||||
extern struct hostent *fix_gethostbyname();
|
||||
#endif
|
||||
|
||||
#ifdef USE_STRSEP /* libc calls strtok() */
|
||||
#define strtok fix_strtok
|
||||
#define strtok fix_strtok
|
||||
extern char *fix_strtok();
|
||||
#endif
|
||||
|
||||
#ifdef LIBC_CALLS_STRTOK /* libc calls strtok() */
|
||||
#define strtok my_strtok
|
||||
#define strtok my_strtok
|
||||
extern char *my_strtok();
|
||||
#endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
#ifdef __STDC__
|
||||
#define __P(X) X
|
||||
#define __P(X) X
|
||||
#else
|
||||
#define __P(X) ()
|
||||
#define __P(X) ()
|
||||
#endif
|
||||
|
||||
extern int t_sync __P((int));
|
||||
|
@ -110,6 +110,7 @@ synchronous_dhclient="NO" # Start dhclient directly on configured
|
||||
# interfaces during startup.
|
||||
defaultroute_delay="30" # Time to wait for a default route on a DHCP interface.
|
||||
defaultroute_carrier_delay="5" # Time to wait for carrier while waiting for a default route.
|
||||
netif_enable="YES" # Set to YES to initialize network interfaces
|
||||
netif_ipexpand_max="2048" # Maximum number of IP addrs in a range spec.
|
||||
wpa_supplicant_program="/usr/sbin/wpa_supplicant"
|
||||
wpa_supplicant_flags="-s" # Extra flags to pass to wpa_supplicant
|
||||
|
@ -71,4 +71,10 @@ notify 0 {
|
||||
action "camcontrol eject cd0";
|
||||
};
|
||||
|
||||
|
||||
# Equivalent to the ACPI/ACAD notify
|
||||
notify 10 {
|
||||
match "system" "PMU";
|
||||
match "subsystem" "POWER";
|
||||
match "type" "ACLINE";
|
||||
action "/etc/rc.d/power_profile $notify";
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
. /etc/rc.subr
|
||||
|
||||
name="background-fsck"
|
||||
name="background_fsck"
|
||||
rcvar="background_fsck"
|
||||
start_cmd="bgfsck_start"
|
||||
stop_cmd=":"
|
||||
|
@ -33,9 +33,10 @@
|
||||
. /etc/rc.subr
|
||||
. /etc/network.subr
|
||||
|
||||
name="network"
|
||||
start_cmd="network_start"
|
||||
stop_cmd="network_stop"
|
||||
name="netif"
|
||||
rcvar="${name}_enable"
|
||||
start_cmd="netif_start"
|
||||
stop_cmd="netif_stop"
|
||||
cloneup_cmd="clone_up"
|
||||
clonedown_cmd="clone_down"
|
||||
clear_cmd="doclear"
|
||||
@ -47,7 +48,7 @@ cmdifn=
|
||||
set_rcvar_obsolete ipv6_enable ipv6_activate_all_interfaces
|
||||
set_rcvar_obsolete ipv6_prefer
|
||||
|
||||
network_start()
|
||||
netif_start()
|
||||
{
|
||||
local _if
|
||||
|
||||
@ -71,7 +72,7 @@ network_start()
|
||||
ifnet_rename $cmdifn
|
||||
|
||||
# Configure the interface(s).
|
||||
network_common ifn_start $cmdifn
|
||||
netif_common ifn_start $cmdifn
|
||||
|
||||
if [ -f /etc/rc.d/ipfilter ] ; then
|
||||
# Resync ipfilter
|
||||
@ -87,19 +88,19 @@ network_start()
|
||||
fi
|
||||
}
|
||||
|
||||
network_stop()
|
||||
netif_stop()
|
||||
{
|
||||
_clone_down=1
|
||||
network_stop0 $*
|
||||
netif_stop0 $*
|
||||
}
|
||||
|
||||
doclear()
|
||||
{
|
||||
_clone_down=
|
||||
network_stop0 $*
|
||||
netif_stop0 $*
|
||||
}
|
||||
|
||||
network_stop0()
|
||||
netif_stop0()
|
||||
{
|
||||
local _if
|
||||
|
||||
@ -108,7 +109,7 @@ network_stop0()
|
||||
cmdifn=$*
|
||||
|
||||
# Deconfigure the interface(s)
|
||||
network_common ifn_stop $cmdifn
|
||||
netif_common ifn_stop $cmdifn
|
||||
|
||||
# Destroy cloned interfaces
|
||||
if [ -n "$_clone_down" ]; then
|
||||
@ -126,28 +127,28 @@ vnet_up()
|
||||
{
|
||||
cmdifn=$*
|
||||
|
||||
network_common ifn_vnetup $cmdifn
|
||||
netif_common ifn_vnetup $cmdifn
|
||||
}
|
||||
|
||||
vnet_down()
|
||||
{
|
||||
cmdifn=$*
|
||||
|
||||
network_common ifn_vnetdown $cmdifn
|
||||
netif_common ifn_vnetdown $cmdifn
|
||||
}
|
||||
|
||||
# network_common routine
|
||||
# netif_common routine
|
||||
# Common configuration subroutine for network interfaces. This
|
||||
# routine takes all the preparatory steps needed for configuriing
|
||||
# an interface and then calls $routine.
|
||||
network_common()
|
||||
netif_common()
|
||||
{
|
||||
local _cooked_list _tmp_list _fail _func _ok _str _cmdifn
|
||||
|
||||
_func=
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
err 1 "network_common(): No function name specified."
|
||||
err 1 "netif_common(): No function name specified."
|
||||
else
|
||||
_func="$1"
|
||||
shift
|
||||
|
14
etc/rc.subr
14
etc/rc.subr
@ -749,6 +749,8 @@ check_startmsgs()
|
||||
# NOTE: $flags from the parent environment
|
||||
# can be used to override this.
|
||||
#
|
||||
# ${name}_env n Environment variables to run ${command} with.
|
||||
#
|
||||
# ${name}_fib n Routing table number to run ${command} with.
|
||||
#
|
||||
# ${name}_nice n Nice level to run ${command} at.
|
||||
@ -764,6 +766,8 @@ check_startmsgs()
|
||||
# to run the chrooted ${command} with.
|
||||
# Requires /usr to be mounted.
|
||||
#
|
||||
# ${name}_prepend n Command added before ${command}.
|
||||
#
|
||||
# ${rc_arg}_cmd n If set, use this as the method when invoked;
|
||||
# Otherwise, use default command (see below)
|
||||
#
|
||||
@ -937,7 +941,8 @@ run_rc_command()
|
||||
eval _chdir=\$${name}_chdir _chroot=\$${name}_chroot \
|
||||
_nice=\$${name}_nice _user=\$${name}_user \
|
||||
_group=\$${name}_group _groups=\$${name}_groups \
|
||||
_fib=\$${name}_fib
|
||||
_fib=\$${name}_fib _env=\$${name}_env \
|
||||
_prepend=\$${name}_prepend
|
||||
|
||||
if [ -n "$_user" ]; then # unset $_user if running as that user
|
||||
if [ "$_user" = "$(eval $IDCMD)" ]; then
|
||||
@ -1022,12 +1027,14 @@ run_rc_command()
|
||||
_doit="\
|
||||
${_nice:+nice -n $_nice }\
|
||||
${_fib:+setfib -F $_fib }\
|
||||
${_env:+env $_env }\
|
||||
chroot ${_user:+-u $_user }${_group:+-g $_group }${_groups:+-G $_groups }\
|
||||
$_chroot $command $rc_flags $command_args"
|
||||
else
|
||||
_doit="\
|
||||
${_chdir:+cd $_chdir && }\
|
||||
${_fib:+setfib -F $_fib }\
|
||||
${_env:+env $_env }\
|
||||
$command $rc_flags $command_args"
|
||||
if [ -n "$_user" ]; then
|
||||
_doit="su -m $_user -c 'sh -c \"$_doit\"'"
|
||||
@ -1038,6 +1045,9 @@ $command $rc_flags $command_args"
|
||||
fi
|
||||
_doit="nice -n $_nice $_doit"
|
||||
fi
|
||||
if [ -n "$_prepend" ]; then
|
||||
_doit="$_prepend $_doit"
|
||||
fi
|
||||
fi
|
||||
|
||||
# run the full command
|
||||
@ -2040,7 +2050,7 @@ check_kern_features()
|
||||
# check_namevarlist var
|
||||
# Return "0" if ${name}_var is reserved in rc.subr.
|
||||
|
||||
_rc_namevarlist="program chroot chdir flags fib nice user group groups"
|
||||
_rc_namevarlist="program chroot chdir env flags fib nice user group groups prepend"
|
||||
check_namevarlist()
|
||||
{
|
||||
local _v
|
||||
|
@ -44,6 +44,7 @@ SUBDIR= ${SUBDIR_ORDERED} \
|
||||
libdevstat \
|
||||
libdwarf \
|
||||
libedit \
|
||||
${_libevent} \
|
||||
libexecinfo \
|
||||
libexpat \
|
||||
libfetch \
|
||||
@ -226,6 +227,10 @@ _libnetgraph= libnetgraph
|
||||
_libypclnt= libypclnt
|
||||
.endif
|
||||
|
||||
.if ${MK_PF} != "no"
|
||||
_libevent= libevent
|
||||
.endif
|
||||
|
||||
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
|
||||
_libsmb= libsmb
|
||||
_libvgl= libvgl
|
||||
|
@ -87,17 +87,11 @@ static TAILQ_HEAD(, cuse_dev_entered) h_cuse_entered __guarded_by(m_cuse);
|
||||
static struct cuse_vm_allocation a_cuse[CUSE_ALLOC_UNIT_MAX]
|
||||
__guarded_by(m_cuse);
|
||||
|
||||
static void
|
||||
cuse_lock(void) __locks_exclusive(m_cuse)
|
||||
{
|
||||
pthread_mutex_lock(&m_cuse);
|
||||
}
|
||||
#define CUSE_LOCK() \
|
||||
pthread_mutex_lock(&m_cuse)
|
||||
|
||||
static void
|
||||
cuse_unlock(void) __unlocks(m_cuse)
|
||||
{
|
||||
pthread_mutex_unlock(&m_cuse);
|
||||
}
|
||||
#define CUSE_UNLOCK() \
|
||||
pthread_mutex_unlock(&m_cuse)
|
||||
|
||||
int
|
||||
cuse_init(void)
|
||||
@ -150,7 +144,7 @@ cuse_vmoffset(void *_ptr)
|
||||
unsigned long remainder;
|
||||
int n;
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
for (n = 0; n != CUSE_ALLOC_UNIT_MAX; n++) {
|
||||
if (a_cuse[n].ptr == NULL)
|
||||
continue;
|
||||
@ -160,7 +154,7 @@ cuse_vmoffset(void *_ptr)
|
||||
|
||||
if ((ptr >= ptr_min) && (ptr <= ptr_max)) {
|
||||
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
remainder = (ptr - ptr_min);
|
||||
|
||||
@ -169,7 +163,7 @@ cuse_vmoffset(void *_ptr)
|
||||
return ((n * PAGE_SIZE * CUSE_ALLOC_PAGES_MAX) + remainder);
|
||||
}
|
||||
}
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
return (0x80000000UL); /* failure */
|
||||
}
|
||||
@ -192,7 +186,7 @@ cuse_vmalloc(int size)
|
||||
|
||||
info.page_count = (size + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
for (n = 0; n != CUSE_ALLOC_UNIT_MAX; n++) {
|
||||
|
||||
if (a_cuse[n].ptr != NULL)
|
||||
@ -201,7 +195,7 @@ cuse_vmalloc(int size)
|
||||
a_cuse[n].ptr = ((uint8_t *)1); /* reserve */
|
||||
a_cuse[n].size = 0;
|
||||
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
info.alloc_nr = n;
|
||||
|
||||
@ -209,7 +203,7 @@ cuse_vmalloc(int size)
|
||||
|
||||
if (error) {
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
|
||||
a_cuse[n].ptr = NULL;
|
||||
|
||||
@ -230,20 +224,20 @@ cuse_vmalloc(int size)
|
||||
if (error) {
|
||||
/* ignore */
|
||||
}
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
|
||||
a_cuse[n].ptr = NULL;
|
||||
|
||||
break;
|
||||
}
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
a_cuse[n].ptr = ptr;
|
||||
a_cuse[n].size = size;
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
return (ptr); /* success */
|
||||
}
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
return (NULL); /* failure */
|
||||
}
|
||||
|
||||
@ -255,12 +249,12 @@ cuse_is_vmalloc_addr(void *ptr)
|
||||
if (f_cuse < 0 || ptr == NULL)
|
||||
return (0); /* false */
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
for (n = 0; n != CUSE_ALLOC_UNIT_MAX; n++) {
|
||||
if (a_cuse[n].ptr == ptr)
|
||||
break;
|
||||
}
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
return (n != CUSE_ALLOC_UNIT_MAX);
|
||||
}
|
||||
@ -268,6 +262,7 @@ cuse_is_vmalloc_addr(void *ptr)
|
||||
void
|
||||
cuse_vmfree(void *ptr)
|
||||
{
|
||||
struct cuse_vm_allocation temp;
|
||||
struct cuse_alloc_info info;
|
||||
int error;
|
||||
int n;
|
||||
@ -275,32 +270,35 @@ cuse_vmfree(void *ptr)
|
||||
if (f_cuse < 0)
|
||||
return;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
for (n = 0; n != CUSE_ALLOC_UNIT_MAX; n++) {
|
||||
if (a_cuse[n].ptr != ptr)
|
||||
continue;
|
||||
|
||||
cuse_unlock();
|
||||
temp = a_cuse[n];
|
||||
|
||||
CUSE_UNLOCK();
|
||||
|
||||
munmap(temp.ptr, temp.size);
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
|
||||
info.alloc_nr = n;
|
||||
|
||||
munmap(ptr, a_cuse[n].size);
|
||||
|
||||
error = ioctl(f_cuse, CUSE_IOCTL_FREE_MEMORY, &info);
|
||||
|
||||
if (error) {
|
||||
/* ignore */
|
||||
if (error != 0) {
|
||||
/* ignore any errors */
|
||||
DPRINTF("Freeing memory failed: %d\n", errno);
|
||||
}
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
|
||||
a_cuse[n].ptr = NULL;
|
||||
a_cuse[n].size = 0;
|
||||
|
||||
break;
|
||||
}
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
}
|
||||
|
||||
int
|
||||
@ -407,9 +405,9 @@ cuse_dev_create(const struct cuse_methods *mtod, void *priv0, void *priv1,
|
||||
free(cdev);
|
||||
return (NULL);
|
||||
}
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
TAILQ_INSERT_TAIL(&h_cuse, cdev, entry);
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
return (cdev);
|
||||
}
|
||||
@ -423,9 +421,9 @@ cuse_dev_destroy(struct cuse_dev *cdev)
|
||||
if (f_cuse < 0)
|
||||
return;
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
TAILQ_REMOVE(&h_cuse, cdev, entry);
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
error = ioctl(f_cuse, CUSE_IOCTL_DESTROY_DEV, &cdev);
|
||||
if (error)
|
||||
@ -477,7 +475,7 @@ cuse_wait_and_process(void)
|
||||
|
||||
cdev = info.dev;
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
enter.thread = curr;
|
||||
enter.per_file_handle = (void *)info.per_file_handle;
|
||||
enter.cmd = info.command;
|
||||
@ -485,7 +483,7 @@ cuse_wait_and_process(void)
|
||||
enter.got_signal = 0;
|
||||
enter.cdev = cdev;
|
||||
TAILQ_INSERT_TAIL(&h_cuse_entered, &enter, entry);
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
DPRINTF("cuse: Command = %d = %s, flags = %d, arg = 0x%08x, ptr = 0x%08x\n",
|
||||
(int)info.command, cuse_cmd_str(info.command), (int)info.fflags,
|
||||
@ -507,7 +505,7 @@ cuse_wait_and_process(void)
|
||||
|
||||
error = 0;
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
TAILQ_FOREACH(pe, &h_cuse_entered, entry) {
|
||||
if (pe->cdev != cdev)
|
||||
continue;
|
||||
@ -520,7 +518,7 @@ cuse_wait_and_process(void)
|
||||
pthread_kill(pe->thread, SIGHUP);
|
||||
error = CUSE_ERR_BUSY;
|
||||
}
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
if (error == 0)
|
||||
break;
|
||||
@ -571,7 +569,7 @@ cuse_wait_and_process(void)
|
||||
break;
|
||||
|
||||
case CUSE_CMD_SIGNAL:
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
TAILQ_FOREACH(pe, &h_cuse_entered, entry) {
|
||||
if (pe->cdev != cdev)
|
||||
continue;
|
||||
@ -583,7 +581,7 @@ cuse_wait_and_process(void)
|
||||
pe->got_signal = 1;
|
||||
pthread_kill(pe->thread, SIGHUP);
|
||||
}
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -594,9 +592,9 @@ cuse_wait_and_process(void)
|
||||
DPRINTF("cuse: Command error = %d for %s\n",
|
||||
error, cuse_cmd_str(info.command));
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
TAILQ_REMOVE(&h_cuse_entered, &enter, entry);
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
|
||||
/* we ignore any sync command failures */
|
||||
ioctl(f_cuse, CUSE_IOCTL_SYNC_COMMAND, &error);
|
||||
@ -610,12 +608,12 @@ cuse_dev_get_entered(void)
|
||||
struct cuse_dev_entered *pe;
|
||||
pthread_t curr = pthread_self();
|
||||
|
||||
cuse_lock();
|
||||
CUSE_LOCK();
|
||||
TAILQ_FOREACH(pe, &h_cuse_entered, entry) {
|
||||
if (pe->thread == curr)
|
||||
break;
|
||||
}
|
||||
cuse_unlock();
|
||||
CUSE_UNLOCK();
|
||||
return (pe);
|
||||
}
|
||||
|
||||
|
@ -1,10 +1,14 @@
|
||||
# $FreeBSD$
|
||||
|
||||
.PATH: ${.CURDIR}/../../../contrib/pf/libevent
|
||||
.PATH: ${.CURDIR}/../../contrib/pf/libevent
|
||||
|
||||
.include <src.opts.mk>
|
||||
|
||||
LIB= event
|
||||
SHLIB_MAJOR= 1
|
||||
PRIVATELIB=
|
||||
INTERNALLIB=
|
||||
|
||||
LIB= event
|
||||
INTERNALLIB=yes
|
||||
SRCS= buffer.c evbuffer.c event.c kqueue.c log.c poll.c select.c signal.c
|
||||
HDRS= event.h
|
||||
|
@ -2111,13 +2111,19 @@ static int
|
||||
do_range_cmd(int cmd, ipfw_range_tlv *rt)
|
||||
{
|
||||
ipfw_range_header rh;
|
||||
size_t sz;
|
||||
|
||||
memset(&rh, 0, sizeof(rh));
|
||||
memcpy(&rh.range, rt, sizeof(*rt));
|
||||
rh.range.head.length = sizeof(*rt);
|
||||
rh.range.head.type = IPFW_TLV_RANGE;
|
||||
sz = sizeof(rh);
|
||||
|
||||
return (do_set3(cmd, &rh.opheader, sizeof(rh)));
|
||||
if (do_get3(cmd, &rh.opheader, &sz) != 0)
|
||||
return (-1);
|
||||
/* Save number of matched objects */
|
||||
rt->new_set = rh.range.new_set;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2580,7 +2586,7 @@ ipfw_show_config(struct cmdline_opts *co, struct format_opts *fo,
|
||||
list_static_range(co, fo, &bp, rbase, rcnt);
|
||||
|
||||
if (co->do_dynamic && dynsz > 0) {
|
||||
printf("## Dynamic rules (%d %lu):\n", fo->dcnt, dynsz);
|
||||
printf("## Dynamic rules (%d %zu):\n", fo->dcnt, dynsz);
|
||||
list_dyn_range(co, fo, &bp, dynbase, dynsz);
|
||||
}
|
||||
|
||||
@ -3003,7 +3009,6 @@ fill_flags_cmd(ipfw_insn *cmd, enum ipfw_opcodes opcode,
|
||||
void
|
||||
ipfw_delete(char *av[])
|
||||
{
|
||||
uint32_t rulenum;
|
||||
int i;
|
||||
int exitval = EX_OK;
|
||||
int do_set = 0;
|
||||
@ -3053,7 +3058,15 @@ ipfw_delete(char *av[])
|
||||
if (i != 0) {
|
||||
exitval = EX_UNAVAILABLE;
|
||||
warn("rule %u: setsockopt(IP_FW_XDEL)",
|
||||
rulenum);
|
||||
rt.start_rule);
|
||||
} else if (rt.new_set == 0) {
|
||||
exitval = EX_UNAVAILABLE;
|
||||
if (rt.start_rule != rt.end_rule)
|
||||
warnx("no rules rules in %u-%u range",
|
||||
rt.start_rule, rt.end_rule);
|
||||
else
|
||||
warnx("rule %u not found",
|
||||
rt.start_rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4792,6 +4805,9 @@ ipfw_zero(int ac, char *av[], int optname)
|
||||
warn("rule %u: setsockopt(IP_FW_X%s)",
|
||||
arg, name);
|
||||
failed = EX_UNAVAILABLE;
|
||||
} else if (rt.new_set == 0) {
|
||||
printf("Entry %d not found\n", arg);
|
||||
failed = EX_UNAVAILABLE;
|
||||
} else if (!co.do_quiet)
|
||||
printf("Entry %d %s.\n", arg,
|
||||
optname == IP_FW_XZERO ?
|
||||
@ -4799,6 +4815,7 @@ ipfw_zero(int ac, char *av[], int optname)
|
||||
} else {
|
||||
errx(EX_USAGE, "invalid rule number ``%s''", *av);
|
||||
}
|
||||
av++; ac--;
|
||||
}
|
||||
if (failed != EX_OK)
|
||||
exit(failed);
|
||||
|
@ -13,7 +13,7 @@
|
||||
*
|
||||
* in-kernel ipfw tables support.
|
||||
*
|
||||
* $FreeBSD: projects/ipfw/sbin/ipfw/ipfw2.c 267467 2014-06-14 10:58:39Z melifaro $
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
|
||||
@ -1908,7 +1908,7 @@ ipfw_list_values(int ac, char *av[])
|
||||
for (i = 0; i < olh->count; i++) {
|
||||
table_show_value(buf, sizeof(buf), (ipfw_table_value *)v,
|
||||
vmask, 0);
|
||||
printf("[%u] refs=%lu %s\n", v->spare1, v->refcnt, buf);
|
||||
printf("[%u] refs=%ju %s\n", v->spare1, v->refcnt, buf);
|
||||
v = (struct _table_value *)((caddr_t)v + olh->objsize);
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 9, 2010
|
||||
.Dd October 9, 2014
|
||||
.Dt ISCONTROL 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -41,6 +41,15 @@
|
||||
.Op Fl t Ar target
|
||||
.Op Ar variable Ns = Ns Ar value
|
||||
.Sh DESCRIPTION
|
||||
.Bf -symbolic
|
||||
This command, along with its kernel counterpart
|
||||
.Xr iscsi_initiator 4 ,
|
||||
is obsolete.
|
||||
Users are advised to use
|
||||
.Xr iscsictl 8
|
||||
instead.
|
||||
.Ef
|
||||
.Pp
|
||||
Internet SCSI (iSCSI) is a network protocol standard, that allows the
|
||||
use of the SCSI protocol over TCP/IP networks,
|
||||
the
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 3, 2010
|
||||
.Dd October 9, 2014
|
||||
.Dt ISCSI_INITIATOR 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -45,6 +45,16 @@ module at boot time, place the following line in
|
||||
iscsi_initiator_load="YES"
|
||||
.Ed
|
||||
.Sh DESCRIPTION
|
||||
.Bf -symbolic
|
||||
This driver, along with its userspace counterpart
|
||||
.Xr iscontrol 8 ,
|
||||
is obsolete.
|
||||
Users are advised to use
|
||||
.Xr iscsi 4
|
||||
instead.
|
||||
.Ef
|
||||
.Pp
|
||||
|
||||
The
|
||||
.Nm
|
||||
implements the kernel side of the Internet SCSI (iSCSI) network
|
||||
|
@ -34,7 +34,7 @@
|
||||
.\" From: @(#)tcp.4 8.1 (Berkeley) 6/5/93
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd November 8, 2013
|
||||
.Dd October 13, 2014
|
||||
.Dt TCP 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -518,6 +518,21 @@ avoid packet drops.
|
||||
Number of retries (SYN or SYN/ACK retransmits) before disabling ECN on a
|
||||
specific connection. This is needed to help with connection establishment
|
||||
when a broken firewall is in the network path.
|
||||
.It Va pmtud_blackhole_detection
|
||||
Turn on automatic path MTU blackhole detection. In case of retransmits we will
|
||||
lower the MSS to check if it's MTU problem. If current MSS is greater than
|
||||
configured value to try, it will be set to it, otherwise, MSS will be set to
|
||||
default values (net.inet.tcp.mssdflt and net.inet.tcp.v6mssdflt).
|
||||
.It Va pmtud_blackhole_mss
|
||||
MSS to try for IPv4 if PMTU blackhole detection is turned on.
|
||||
.It Va v6pmtud_blackhole_mss
|
||||
MSS to try for IPv6 if PMTU blackhole detection is turned on.
|
||||
.It Va pmtud_blackhole_activated
|
||||
Number of times the code was activated to attempt a MSS downshift.
|
||||
.It Va pmtud_blackhole_min_activated
|
||||
Number of times the blackhole MSS was used in an attempt to downshift.
|
||||
.It Va pmtud_blackhole_failed
|
||||
Number of times that we failed to connect after we downshifted the MSS.
|
||||
.El
|
||||
.Sh ERRORS
|
||||
A socket operation may fail with one of the following errors returned:
|
||||
|
@ -29,7 +29,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd September 23, 2012
|
||||
.Dd October 12, 2014
|
||||
.Dt RC.SUBR 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -568,6 +568,22 @@ to before running
|
||||
Only supported after
|
||||
.Pa /usr
|
||||
is mounted.
|
||||
.It Va ${name}_env
|
||||
A list of environment variables to run
|
||||
.Va command
|
||||
with.
|
||||
This will be passed as arguments to
|
||||
.Xr env 1
|
||||
utility.
|
||||
.It Va ${name}_fib
|
||||
FIB
|
||||
.Pa Routing Table
|
||||
number to run
|
||||
.Va command
|
||||
with.
|
||||
See
|
||||
.Xr setfib 1
|
||||
for more details.
|
||||
.It Va ${name}_flags
|
||||
Arguments to call
|
||||
.Va command
|
||||
@ -622,6 +638,14 @@ as.
|
||||
Comma separated list of supplementary groups to run the chrooted
|
||||
.Va command
|
||||
with.
|
||||
.It Va ${name}_prepend
|
||||
Commands to be prepended to
|
||||
.Va command .
|
||||
This is a generic version of
|
||||
.Va ${name}_env ,
|
||||
.Va ${name}_fib ,
|
||||
or
|
||||
.Va ${name}_nice .
|
||||
.It Ar argument Ns Va _cmd
|
||||
Shell commands which override the default method for
|
||||
.Ar argument .
|
||||
|
@ -43,7 +43,7 @@ PROG ?= $t
|
||||
.if defined(PROG)
|
||||
# just one of many
|
||||
PROG_OVERRIDE_VARS += BINDIR MAN SRCS
|
||||
PROG_VARS += CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD ${PROG_OVERRIDE_VARS}
|
||||
PROG_VARS += CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD LDFLAGS ${PROG_OVERRIDE_VARS}
|
||||
.for v in ${PROG_VARS:O:u}
|
||||
.if empty(${PROG_OVERRIDE_VARS:M$v})
|
||||
.if defined(${v}.${PROG})
|
||||
|
@ -21,6 +21,10 @@ LIBBSDSTATDIR= ${ROOTOBJDIR}/lib/libbsdstat
|
||||
LDBSDSTAT?= ${LIBBSDSTATDIR}/libbsdstat.so
|
||||
LIBBSDSTAT?= ${LIBBSDSTATDIR}/libbsdstat.a
|
||||
|
||||
LIBEVENTDIR= ${ROOTOBJDIR}/lib/libevent
|
||||
LDEVENT?= ${LIBEVENTDIR}/libevent.so
|
||||
LIBEVENT?= ${LIBEVENTDIR}/libevent.a
|
||||
|
||||
LIBHEIMIPCCDIR= ${ROOTOBJDIR}/kerberos5/lib/libheimipcc
|
||||
LDHEIMIPCC?= ${LIBHEIMIPCCDIR}/libheimipcc.so
|
||||
LIBHEIMIPCC?= ${LIBHEIMIPCCDIR}/libheimipcc.a
|
||||
|
@ -17,6 +17,7 @@ arm/altera/socfpga/socfpga_common.c standard
|
||||
arm/altera/socfpga/socfpga_machdep.c standard
|
||||
arm/altera/socfpga/socfpga_manager.c standard
|
||||
arm/altera/socfpga/socfpga_rstmgr.c standard
|
||||
arm/altera/socfpga/socfpga_mp.c optional smp
|
||||
|
||||
dev/dwc/if_dwc.c optional dwc
|
||||
dev/mmc/host/dwmmc.c optional dwmmc
|
||||
|
@ -92,6 +92,9 @@ platform_devmap_init(void)
|
||||
/* dwmmc */
|
||||
arm_devmap_add_entry(0xff700000, 0x100000);
|
||||
|
||||
/* scu */
|
||||
arm_devmap_add_entry(0xfff00000, 0x100000);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
180
sys/arm/altera/socfpga/socfpga_mp.c
Normal file
180
sys/arm/altera/socfpga/socfpga_mp.c
Normal file
@ -0,0 +1,180 @@
|
||||
/*-
|
||||
* Copyright (c) 2014 Ruslan Bukin <br@bsdpad.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* 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 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
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/smp.h>
|
||||
|
||||
#include <machine/smp.h>
|
||||
#include <machine/fdt.h>
|
||||
#include <machine/intr.h>
|
||||
|
||||
#define SCU_PHYSBASE 0xFFFEC000
|
||||
#define SCU_SIZE 0x100
|
||||
|
||||
#define SCU_CONTROL_REG 0x00
|
||||
#define SCU_CONTROL_ENABLE (1 << 0)
|
||||
#define SCU_CONFIG_REG 0x04
|
||||
#define SCU_CONFIG_REG_NCPU_MASK 0x03
|
||||
#define SCU_CPUPOWER_REG 0x08
|
||||
#define SCU_INV_TAGS_REG 0x0c
|
||||
#define SCU_DIAG_CONTROL 0x30
|
||||
#define SCU_DIAG_DISABLE_MIGBIT (1 << 0)
|
||||
#define SCU_FILTER_START_REG 0x40
|
||||
#define SCU_FILTER_END_REG 0x44
|
||||
#define SCU_SECURE_ACCESS_REG 0x50
|
||||
#define SCU_NONSECURE_ACCESS_REG 0x54
|
||||
|
||||
#define RSTMGR_PHYSBASE 0xFFD05000
|
||||
#define RSTMGR_SIZE 0x100
|
||||
#define MPUMODRST 0x10
|
||||
#define MPUMODRST_CPU1 (1 << 1)
|
||||
|
||||
#define RAM_PHYSBASE 0x0
|
||||
#define RAM_SIZE 0x1000
|
||||
|
||||
extern char *mpentry_addr;
|
||||
static void socfpga_trampoline(void);
|
||||
|
||||
static void
|
||||
socfpga_trampoline(void)
|
||||
{
|
||||
|
||||
__asm __volatile(
|
||||
"ldr pc, 1f\n"
|
||||
".globl mpentry_addr\n"
|
||||
"mpentry_addr:\n"
|
||||
"1: .space 4\n");
|
||||
}
|
||||
|
||||
void
|
||||
platform_mp_init_secondary(void)
|
||||
{
|
||||
|
||||
gic_init_secondary();
|
||||
}
|
||||
|
||||
void
|
||||
platform_mp_setmaxid(void)
|
||||
{
|
||||
int hwcpu, ncpu;
|
||||
|
||||
/* If we've already set this don't bother to do it again. */
|
||||
if (mp_ncpus != 0)
|
||||
return;
|
||||
|
||||
hwcpu = 2;
|
||||
|
||||
ncpu = hwcpu;
|
||||
TUNABLE_INT_FETCH("hw.ncpu", &ncpu);
|
||||
if (ncpu < 1 || ncpu > hwcpu)
|
||||
ncpu = hwcpu;
|
||||
|
||||
mp_ncpus = ncpu;
|
||||
mp_maxid = ncpu - 1;
|
||||
}
|
||||
|
||||
int
|
||||
platform_mp_probe(void)
|
||||
{
|
||||
|
||||
if (mp_ncpus == 0)
|
||||
platform_mp_setmaxid();
|
||||
|
||||
return (mp_ncpus > 1);
|
||||
}
|
||||
|
||||
void
|
||||
platform_mp_start_ap(void)
|
||||
{
|
||||
bus_space_handle_t scu, rst, ram;
|
||||
int reg;
|
||||
|
||||
if (bus_space_map(fdtbus_bs_tag, SCU_PHYSBASE,
|
||||
SCU_SIZE, 0, &scu) != 0)
|
||||
panic("Couldn't map the SCU\n");
|
||||
if (bus_space_map(fdtbus_bs_tag, RSTMGR_PHYSBASE,
|
||||
RSTMGR_SIZE, 0, &rst) != 0)
|
||||
panic("Couldn't map the reset manager (RSTMGR)\n");
|
||||
if (bus_space_map(fdtbus_bs_tag, RAM_PHYSBASE,
|
||||
RAM_SIZE, 0, &ram) != 0)
|
||||
panic("Couldn't map the first physram page\n");
|
||||
|
||||
/* Invalidate SCU cache tags */
|
||||
bus_space_write_4(fdtbus_bs_tag, scu,
|
||||
SCU_INV_TAGS_REG, 0x0000ffff);
|
||||
|
||||
/*
|
||||
* Erratum ARM/MP: 764369 (problems with cache maintenance).
|
||||
* Setting the "disable-migratory bit" in the undocumented SCU
|
||||
* Diagnostic Control Register helps work around the problem.
|
||||
*/
|
||||
reg = bus_space_read_4(fdtbus_bs_tag, scu, SCU_DIAG_CONTROL);
|
||||
reg |= (SCU_DIAG_DISABLE_MIGBIT);
|
||||
bus_space_write_4(fdtbus_bs_tag, scu, SCU_DIAG_CONTROL, reg);
|
||||
|
||||
/* Put CPU1 to reset state */
|
||||
bus_space_write_4(fdtbus_bs_tag, rst, MPUMODRST, MPUMODRST_CPU1);
|
||||
|
||||
/* Enable the SCU, then clean the cache on this core */
|
||||
reg = bus_space_read_4(fdtbus_bs_tag, scu, SCU_CONTROL_REG);
|
||||
reg |= (SCU_CONTROL_ENABLE);
|
||||
bus_space_write_4(fdtbus_bs_tag, scu, SCU_CONTROL_REG, reg);
|
||||
|
||||
/* Set up trampoline code */
|
||||
mpentry_addr = (char *)pmap_kextract((vm_offset_t)mpentry);
|
||||
bus_space_write_region_4(fdtbus_bs_tag, ram, 0,
|
||||
(uint32_t *)&socfpga_trampoline, 8);
|
||||
|
||||
cpu_idcache_wbinv_all();
|
||||
cpu_l2cache_wbinv_all();
|
||||
|
||||
/* Put CPU1 out from reset */
|
||||
bus_space_write_4(fdtbus_bs_tag, rst, MPUMODRST, 0);
|
||||
|
||||
armv7_sev();
|
||||
|
||||
bus_space_unmap(fdtbus_bs_tag, scu, SCU_SIZE);
|
||||
bus_space_unmap(fdtbus_bs_tag, rst, RSTMGR_SIZE);
|
||||
bus_space_unmap(fdtbus_bs_tag, ram, RAM_SIZE);
|
||||
}
|
||||
|
||||
void
|
||||
platform_ipi_send(cpuset_t cpus, u_int ipi)
|
||||
{
|
||||
|
||||
pic_ipi_send(cpus, ipi);
|
||||
}
|
@ -22,7 +22,7 @@
|
||||
|
||||
ident BEAGLEBONE
|
||||
|
||||
include "../ti/am335x/std.beaglebone"
|
||||
include "../ti/am335x/std.am335x"
|
||||
|
||||
makeoptions WITHOUT_MODULES="ahc"
|
||||
|
||||
|
@ -53,7 +53,7 @@ options PREEMPTION
|
||||
options FREEBSD_BOOT_LOADER
|
||||
options VFP # vfp/neon
|
||||
|
||||
#options SMP
|
||||
options SMP
|
||||
|
||||
# Debugging
|
||||
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
|
||||
|
@ -1,14 +1,15 @@
|
||||
#$FreeBSD$
|
||||
|
||||
arm/ti/aintc.c standard
|
||||
arm/ti/am335x/am335x_prcm.c standard
|
||||
|
||||
arm/ti/am335x/am335x_dmtimer.c standard
|
||||
arm/ti/am335x/am335x_scm_padconf.c standard
|
||||
arm/ti/am335x/am335x_lcd.c optional sc
|
||||
arm/ti/am335x/am335x_lcd_syscons.c optional sc
|
||||
arm/ti/am335x/am335x_pmic.c optional am335x_pmic
|
||||
arm/ti/am335x/am335x_prcm.c standard
|
||||
arm/ti/am335x/am335x_pwm.c standard
|
||||
arm/ti/am335x/am335x_scm_padconf.c standard
|
||||
arm/ti/am335x/am335x_usbss.c optional musb fdt
|
||||
|
||||
arm/ti/ti_edma3.c standard
|
||||
arm/ti/ti_sdhci.c optional sdhci
|
||||
#arm/ti/ti_mmchs.c optional mmc
|
||||
arm/ti/cpsw/if_cpsw.c optional cpsw
|
||||
|
@ -1,3 +0,0 @@
|
||||
#$FreeBSD$
|
||||
|
||||
arm/ti/am335x/am335x_pmic.c optional am335x_pmic
|
@ -1,4 +0,0 @@
|
||||
# $FreeBSD$
|
||||
|
||||
files "../ti/am335x/files.beaglebone"
|
||||
include "../ti/am335x/std.am335x"
|
@ -22,6 +22,7 @@ arm/ti/ti_pruss.c standard
|
||||
arm/ti/ti_adc.c optional ti_adc
|
||||
arm/ti/ti_gpio.c optional gpio
|
||||
arm/ti/ti_i2c.c optional ti_i2c
|
||||
arm/ti/ti_sdhci.c optional sdhci
|
||||
|
||||
dev/uart/uart_dev_ti8250.c optional uart
|
||||
dev/uart/uart_dev_ns8250.c optional uart
|
||||
|
@ -1,780 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2011
|
||||
* Ben Gray <ben.r.gray@gmail.com>.
|
||||
* 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 AUTHOR 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
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS 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$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Texas Instruments - OMAP3xxx series processors
|
||||
*
|
||||
* Reference:
|
||||
* OMAP35x Applications Processor
|
||||
* Technical Reference Manual
|
||||
* (omap35xx_techref.pdf)
|
||||
*
|
||||
*
|
||||
* Note:
|
||||
* The devices are mapped into address above 0xD000_0000 as the kernel space
|
||||
* memory is at 0xC000_0000 and above. The first 256MB after this is reserved
|
||||
* for the size of the kernel, everything above that is reserved for SoC
|
||||
* devices.
|
||||
*
|
||||
*/
|
||||
#ifndef _OMAP35XX_REG_H_
|
||||
#define _OMAP35XX_REG_H_
|
||||
|
||||
#ifndef _LOCORE
|
||||
#include <sys/types.h> /* for uint32_t */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#define OMAP35XX_SDRAM0_START 0x80000000UL
|
||||
#define OMAP35XX_SDRAM1_START 0xA0000000UL
|
||||
#define OMAP35XX_SDRAM_BANKS 2
|
||||
#define OMAP35XX_SDRAM_BANK_SIZE 0x20000000UL
|
||||
|
||||
|
||||
/* Physical/Virtual address for SDRAM controller */
|
||||
|
||||
#define OMAP35XX_SMS_VBASE 0x6C000000UL
|
||||
#define OMAP35XX_SMS_HWBASE 0x6C000000UL
|
||||
#define OMAP35XX_SMS_SIZE 0x01000000UL
|
||||
|
||||
#define OMAP35XX_SDRC_VBASE 0x6D000000UL
|
||||
#define OMAP35XX_SDRC_HWBASE 0x6D000000UL
|
||||
#define OMAP35XX_SDRC_SIZE 0x01000000UL
|
||||
|
||||
|
||||
|
||||
/* Physical/Virtual address for I/O space */
|
||||
|
||||
#define OMAP35XX_L3_VBASE 0xD0000000UL
|
||||
#define OMAP35XX_L3_HWBASE 0x68000000UL
|
||||
#define OMAP35XX_L3_SIZE 0x01000000UL
|
||||
|
||||
#define OMAP35XX_L4_CORE_VBASE 0xE8000000UL
|
||||
#define OMAP35XX_L4_CORE_HWBASE 0x48000000UL
|
||||
#define OMAP35XX_L4_CORE_SIZE 0x01000000UL
|
||||
|
||||
#define OMAP35XX_L4_WAKEUP_VBASE 0xE8300000UL
|
||||
#define OMAP35XX_L4_WAKEUP_HWBASE 0x48300000UL
|
||||
#define OMAP35XX_L4_WAKEUP_SIZE 0x00040000UL
|
||||
|
||||
#define OMAP35XX_L4_PERIPH_VBASE 0xE9000000UL
|
||||
#define OMAP35XX_L4_PERIPH_HWBASE 0x49000000UL
|
||||
#define OMAP35XX_L4_PERIPH_SIZE 0x00100000UL
|
||||
|
||||
|
||||
/*
|
||||
* L4-CORE Physical/Virtual addresss offsets
|
||||
*/
|
||||
#define OMAP35XX_SCM_OFFSET 0x00002000UL
|
||||
#define OMAP35XX_CM_OFFSET 0x00004000UL
|
||||
#define OMAP35XX_SDMA_OFFSET 0x00056000UL
|
||||
#define OMAP35XX_I2C3_OFFSET 0x00060000UL
|
||||
#define OMAP35XX_USB_TLL_OFFSET 0x00062000UL
|
||||
#define OMAP35XX_USB_UHH_OFFSET 0x00064000UL
|
||||
#define OMAP35XX_USB_EHCI_OFFSET 0x00064800UL
|
||||
|
||||
|
||||
#define OMAP35XX_UART1_OFFSET 0x0006A000UL
|
||||
#define OMAP35XX_UART2_OFFSET 0x0006C000UL
|
||||
#define OMAP35XX_I2C1_OFFSET 0x00070000UL
|
||||
#define OMAP35XX_I2C2_OFFSET 0x00072000UL
|
||||
#define OMAP35XX_MCBSP1_OFFSET 0x00074000UL
|
||||
#define OMAP35XX_GPTIMER10_OFFSET 0x00086000UL
|
||||
#define OMAP35XX_GPTIMER11_OFFSET 0x00088000UL
|
||||
#define OMAP35XX_MCBSP5_OFFSET 0x00096000UL
|
||||
#define OMAP35XX_MMU1_OFFSET 0x000BD400UL
|
||||
#define OMAP35XX_INTCPS_OFFSET 0x00200000UL
|
||||
|
||||
|
||||
/*
|
||||
* L4-WAKEUP Physical/Virtual addresss offsets
|
||||
*/
|
||||
#define OMAP35XX_PRM_OFFSET 0x00006000UL
|
||||
#define OMAP35XX_GPIO1_OFFSET 0x00010000UL
|
||||
#define OMAP35XX_GPTIMER1_OFFSET 0x00018000UL
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* L4-PERIPH Physical/Virtual addresss offsets
|
||||
*/
|
||||
#define OMAP35XX_UART3_OFFSET 0x00020000UL
|
||||
#define OMAP35XX_MCBSP2_OFFSET 0x00022000UL
|
||||
#define OMAP35XX_MCBSP3_OFFSET 0x00024000UL
|
||||
#define OMAP35XX_MCBSP4_OFFSET 0x00026000UL
|
||||
#define OMAP35XX_SIDETONE_MCBSP2_OFFSET 0x00028000UL
|
||||
#define OMAP35XX_SIDETONE_MCBSP3_OFFSET 0x0002A000UL
|
||||
#define OMAP35XX_GPTIMER2_OFFSET 0x00032000UL
|
||||
#define OMAP35XX_GPTIMER3_OFFSET 0x00034000UL
|
||||
#define OMAP35XX_GPTIMER4_OFFSET 0x00036000UL
|
||||
#define OMAP35XX_GPTIMER5_OFFSET 0x00038000UL
|
||||
#define OMAP35XX_GPTIMER6_OFFSET 0x0003A000UL
|
||||
#define OMAP35XX_GPTIMER7_OFFSET 0x0003C000UL
|
||||
#define OMAP35XX_GPTIMER8_OFFSET 0x0003E000UL
|
||||
#define OMAP35XX_GPTIMER9_OFFSET 0x00040000UL
|
||||
#define OMAP35XX_GPIO2_OFFSET 0x00050000UL
|
||||
#define OMAP35XX_GPIO3_OFFSET 0x00052000UL
|
||||
#define OMAP35XX_GPIO4_OFFSET 0x00054000UL
|
||||
#define OMAP35XX_GPIO5_OFFSET 0x00056000UL
|
||||
#define OMAP35XX_GPIO6_OFFSET 0x00058000UL
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* System Control Module
|
||||
*/
|
||||
#define OMAP35XX_SCM_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_SCM_OFFSET)
|
||||
#define OMAP35XX_SCM_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_SCM_OFFSET)
|
||||
#define OMAP35XX_SCM_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_SCM_REVISION 0x00000000UL
|
||||
#define OMAP35XX_SCM_SYSCONFIG 0x00000010UL
|
||||
#define OMAP35XX_SCM_PADCONFS_BASE 0x00000030UL
|
||||
#define OMAP35XX_SCM_DEVCONF0 0x00000274UL
|
||||
#define OMAP35XX_SCM_MEM_DFTRW0 0x00000278UL
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
#define OMAP35XX_CM_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_CM_OFFSET)
|
||||
#define OMAP35XX_CM_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_CM_OFFSET)
|
||||
#define OMAP35XX_CM_SIZE 0x00001500UL
|
||||
|
||||
#define OMAP35XX_CM_CORE_OFFSET 0x00000A00UL
|
||||
#define OMAP35XX_CM_CORE_SIZE 0x00000100UL
|
||||
#define OMAP35XX_CM_FCLKEN1_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0000UL)
|
||||
#define OMAP35XX_CM_FCLKEN3_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0008UL)
|
||||
#define OMAP35XX_CM_ICLKEN1_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0010UL)
|
||||
#define OMAP35XX_CM_ICLKEN2_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0014UL)
|
||||
#define OMAP35XX_CM_ICLKEN3_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0018UL)
|
||||
#define OMAP35XX_CM_IDLEST1_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0020UL)
|
||||
#define OMAP35XX_CM_IDLEST2_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0024UL)
|
||||
#define OMAP35XX_CM_IDLEST3_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0028UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE1_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0030UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE2_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0034UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE3_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0038UL)
|
||||
#define OMAP35XX_CM_CLKSEL_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0040UL)
|
||||
#define OMAP35XX_CM_CLKSTCTRL_CORE (OMAP35XX_CM_CORE_OFFSET + 0x0048UL)
|
||||
#define OMAP35XX_CM_CLKSTST_CORE (OMAP35XX_CM_CORE_OFFSET + 0x004CUL)
|
||||
|
||||
#define OMAP35XX_CM_WKUP_OFFSET 0x00000C00UL
|
||||
#define OMAP35XX_CM_WKUP_SIZE 0x00000100UL
|
||||
#define OMAP35XX_CM_FCLKEN_WKUP (OMAP35XX_CM_WKUP_OFFSET + 0x0000UL)
|
||||
#define OMAP35XX_CM_ICLKEN_WKUP (OMAP35XX_CM_WKUP_OFFSET + 0x0010UL)
|
||||
#define OMAP35XX_CM_IDLEST_WKUP (OMAP35XX_CM_WKUP_OFFSET + 0x0020UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE_WKUP (OMAP35XX_CM_WKUP_OFFSET + 0x0030UL)
|
||||
#define OMAP35XX_CM_CLKSEL_WKUP (OMAP35XX_CM_WKUP_OFFSET + 0x0040UL)
|
||||
|
||||
#define OMAP35XX_CM_PLL_OFFSET 0x00000D00UL
|
||||
#define OMAP35XX_CM_PLL_SIZE 0x00000100UL
|
||||
#define OMAP35XX_CM_CLKEN_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0000UL)
|
||||
#define OMAP35XX_CM_CLKEN2_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0004UL)
|
||||
#define OMAP35XX_CM_IDLEST_CKGEN (OMAP35XX_CM_PLL_OFFSET + 0x0020UL)
|
||||
#define OMAP35XX_CM_IDLEST2_CKGEN (OMAP35XX_CM_PLL_OFFSET + 0x0024UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0030UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE2_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0034UL)
|
||||
#define OMAP35XX_CM_CLKSEL1_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0040UL)
|
||||
#define OMAP35XX_CM_CLKSEL2_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0044UL)
|
||||
#define OMAP35XX_CM_CLKSEL3_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0048UL)
|
||||
#define OMAP35XX_CM_CLKSEL4_PLL (OMAP35XX_CM_PLL_OFFSET + 0x004CUL)
|
||||
#define OMAP35XX_CM_CLKSEL5_PLL (OMAP35XX_CM_PLL_OFFSET + 0x0050UL)
|
||||
#define OMAP35XX_CM_CLKOUT_CTRL (OMAP35XX_CM_PLL_OFFSET + 0x0070UL)
|
||||
|
||||
#define OMAP35XX_CM_PER_OFFSET 0x00001000UL
|
||||
#define OMAP35XX_CM_PER_SIZE 0x00000100UL
|
||||
#define OMAP35XX_CM_FCLKEN_PER (OMAP35XX_CM_PER_OFFSET + 0x0000UL)
|
||||
#define OMAP35XX_CM_ICLKEN_PER (OMAP35XX_CM_PER_OFFSET + 0x0010UL)
|
||||
#define OMAP35XX_CM_IDLEST_PER (OMAP35XX_CM_PER_OFFSET + 0x0020UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE_PER (OMAP35XX_CM_PER_OFFSET + 0x0030UL)
|
||||
#define OMAP35XX_CM_CLKSEL_PER (OMAP35XX_CM_PER_OFFSET + 0x0040UL)
|
||||
#define OMAP35XX_CM_SLEEPDEP_PER (OMAP35XX_CM_PER_OFFSET + 0x0044UL)
|
||||
#define OMAP35XX_CM_CLKSTCTRL_PER (OMAP35XX_CM_PER_OFFSET + 0x0048UL)
|
||||
#define OMAP35XX_CM_CLKSTST_PER (OMAP35XX_CM_PER_OFFSET + 0x004CUL)
|
||||
|
||||
#define OMAP35XX_CM_USBHOST_OFFSET 0x00001400UL
|
||||
#define OMAP35XX_CM_USBHOST_SIZE 0x00000100UL
|
||||
#define OMAP35XX_CM_FCLKEN_USBHOST (OMAP35XX_CM_USBHOST_OFFSET + 0x0000UL)
|
||||
#define OMAP35XX_CM_ICLKEN_USBHOST (OMAP35XX_CM_USBHOST_OFFSET + 0x0010UL)
|
||||
#define OMAP35XX_CM_IDLEST_USBHOST (OMAP35XX_CM_USBHOST_OFFSET + 0x0020UL)
|
||||
#define OMAP35XX_CM_AUTOIDLE_USBHOST (OMAP35XX_CM_USBHOST_OFFSET + 0x0030UL)
|
||||
#define OMAP35XX_CM_SLEEPDEP_USBHOST (OMAP35XX_CM_USBHOST_OFFSET + 0x0044UL)
|
||||
#define OMAP35XX_CM_CLKSTCTRL_USBHOST (OMAP35XX_CM_USBHOST_OFFSET + 0x0048UL)
|
||||
#define OMAP35XX_CM_CLKSTST_USBHOST (OMAP35XX_CM_USBHOST_OFFSET + 0x004CUL)
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
#define OMAP35XX_PRM_HWBASE (OMAP35XX_L4_WAKEUP_HWBASE + OMAP35XX_PRM_OFFSET)
|
||||
#define OMAP35XX_PRM_VBASE (OMAP35XX_L4_WAKEUP_VBASE + OMAP35XX_PRM_OFFSET)
|
||||
#define OMAP35XX_PRM_SIZE 0x00001600UL
|
||||
|
||||
#define OMAP35XX_PRM_CLKCTRL_OFFSET 0x00000D00UL
|
||||
#define OMAP35XX_PRM_CLKCTRL_SIZE 0x00000100UL
|
||||
#define OMAP35XX_PRM_CLKSEL (OMAP35XX_PRM_CLKCTRL_OFFSET + 0x0040UL)
|
||||
#define OMAP35XX_PRM_CLKOUT_CTRL (OMAP35XX_PRM_CLKCTRL_OFFSET + 0x0070UL)
|
||||
|
||||
#define OMAP35XX_PRM_GLOBAL_OFFSET 0x00001200UL
|
||||
#define OMAP35XX_PRM_GLOBAL_SIZE 0x00000100UL
|
||||
#define OMAP35XX_PRM_CLKSRC_CTRL (OMAP35XX_PRM_GLOBAL_OFFSET + 0x0070UL)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Uarts
|
||||
*/
|
||||
#define OMAP35XX_UART1_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_UART1_OFFSET)
|
||||
#define OMAP35XX_UART1_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_UART1_OFFSET)
|
||||
#define OMAP35XX_UART1_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_UART2_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_UART2_OFFSET)
|
||||
#define OMAP35XX_UART2_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_UART2_OFFSET)
|
||||
#define OMAP35XX_UART2_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_UART3_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_UART3_OFFSET)
|
||||
#define OMAP35XX_UART3_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_UART3_OFFSET)
|
||||
#define OMAP35XX_UART3_SIZE 0x00001000UL
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* I2C Modules
|
||||
*/
|
||||
#define OMAP35XX_I2C1_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_I2C1_OFFSET)
|
||||
#define OMAP35XX_I2C1_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_I2C1_OFFSET)
|
||||
#define OMAP35XX_I2C1_SIZE 0x00000080UL
|
||||
|
||||
#define OMAP35XX_I2C2_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_I2C2_OFFSET)
|
||||
#define OMAP35XX_I2C2_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_I2C2_OFFSET)
|
||||
#define OMAP35XX_I2C2_SIZE 0x00000080UL
|
||||
|
||||
#define OMAP35XX_I2C3_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_I2C3_OFFSET)
|
||||
#define OMAP35XX_I2C3_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_I2C3_OFFSET)
|
||||
#define OMAP35XX_I2C3_SIZE 0x00000080UL
|
||||
|
||||
#define OMAP35XX_I2C_IE 0x04
|
||||
#define OMAP35XX_I2C_STAT 0x08
|
||||
#define OMAP35XX_I2C_WE 0x0C
|
||||
#define OMAP35XX_I2C_SYSS 0x10
|
||||
#define OMAP35XX_I2C_BUF 0x14
|
||||
#define OMAP35XX_I2C_CNT 0x18
|
||||
#define OMAP35XX_I2C_DATA 0x1C
|
||||
#define OMAP35XX_I2C_SYSC 0x20
|
||||
#define OMAP35XX_I2C_CON 0x24
|
||||
#define OMAP35XX_I2C_OA0 0x28
|
||||
#define OMAP35XX_I2C_SA 0x2C
|
||||
#define OMAP35XX_I2C_PSC 0x30
|
||||
#define OMAP35XX_I2C_SCLL 0x34
|
||||
#define OMAP35XX_I2C_SCLH 0x38
|
||||
#define OMAP35XX_I2C_SYSTEST 0x3C
|
||||
#define OMAP35XX_I2C_BUFSTAT 0x40
|
||||
#define OMAP35XX_I2C_OA1 0x44
|
||||
#define OMAP35XX_I2C_OA2 0x48
|
||||
#define OMAP35XX_I2C_OA3 0x4C
|
||||
#define OMAP35XX_I2C_ACTOA 0x50
|
||||
#define OMAP35XX_I2C_SBLOCK 0x54
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* McBSP Modules
|
||||
*/
|
||||
#define OMAP35XX_MCBSP1_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_MCBSP1_OFFSET)
|
||||
#define OMAP35XX_MCBSP1_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_MCBSP1_OFFSET)
|
||||
#define OMAP35XX_MCBSP1_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_MCBSP2_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_MCBSP2_OFFSET)
|
||||
#define OMAP35XX_MCBSP2_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_MCBSP2_OFFSET)
|
||||
#define OMAP35XX_MCBSP2_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_MCBSP3_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_MCBSP3_OFFSET)
|
||||
#define OMAP35XX_MCBSP3_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_MCBSP3_OFFSET)
|
||||
#define OMAP35XX_MCBSP3_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_MCBSP4_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_MCBSP4_OFFSET)
|
||||
#define OMAP35XX_MCBSP4_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_MCBSP4_OFFSET)
|
||||
#define OMAP35XX_MCBSP4_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_MCBSP5_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_MCBSP5_OFFSET)
|
||||
#define OMAP35XX_MCBSP5_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_MCBSP5_OFFSET)
|
||||
#define OMAP35XX_MCBSP5_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_MCBSP_DRR 0x0000
|
||||
#define OMAP35XX_MCBSP_DXR 0x0008
|
||||
#define OMAP35XX_MCBSP_SPCR2 0x0010
|
||||
#define OMAP35XX_MCBSP_SPCR1 0x0014
|
||||
#define OMAP35XX_MCBSP_RCR2 0x0018
|
||||
#define OMAP35XX_MCBSP_RCR1 0x001C
|
||||
#define OMAP35XX_MCBSP_XCR2 0x0020
|
||||
#define OMAP35XX_MCBSP_XCR1 0x0024
|
||||
#define OMAP35XX_MCBSP_SRGR2 0x0028
|
||||
#define OMAP35XX_MCBSP_SRGR1 0x002C
|
||||
#define OMAP35XX_MCBSP_MCR2 0x0030
|
||||
#define OMAP35XX_MCBSP_MCR1 0x0034
|
||||
#define OMAP35XX_MCBSP_RCERA 0x0038
|
||||
#define OMAP35XX_MCBSP_RCERB 0x003C
|
||||
#define OMAP35XX_MCBSP_XCERA 0x0040
|
||||
#define OMAP35XX_MCBSP_XCERB 0x0044
|
||||
#define OMAP35XX_MCBSP_PCR 0x0048
|
||||
#define OMAP35XX_MCBSP_RCERC 0x004C
|
||||
#define OMAP35XX_MCBSP_RCERD 0x0050
|
||||
#define OMAP35XX_MCBSP_XCERC 0x0054
|
||||
#define OMAP35XX_MCBSP_XCERD 0x0058
|
||||
#define OMAP35XX_MCBSP_RCERE 0x005C
|
||||
#define OMAP35XX_MCBSP_RCERF 0x0060
|
||||
#define OMAP35XX_MCBSP_XCERE 0x0064
|
||||
#define OMAP35XX_MCBSP_XCERF 0x0068
|
||||
#define OMAP35XX_MCBSP_RCERG 0x006C
|
||||
#define OMAP35XX_MCBSP_RCERH 0x0070
|
||||
#define OMAP35XX_MCBSP_XCERG 0x0074
|
||||
#define OMAP35XX_MCBSP_XCERH 0x0078
|
||||
#define OMAP35XX_MCBSP_RINTCLR 0x0080
|
||||
#define OMAP35XX_MCBSP_XINTCLR 0x0084
|
||||
#define OMAP35XX_MCBSP_ROVFLCLR 0x0088
|
||||
#define OMAP35XX_MCBSP_SYSCONFIG 0x008C
|
||||
#define OMAP35XX_MCBSP_THRSH2 0x0090
|
||||
#define OMAP35XX_MCBSP_THRSH1 0x0094
|
||||
#define OMAP35XX_MCBSP_IRQSTATUS 0x00A0
|
||||
#define OMAP35XX_MCBSP_IRQENABLE 0x00A4
|
||||
#define OMAP35XX_MCBSP_WAKEUPEN 0x00A8
|
||||
#define OMAP35XX_MCBSP_XCCR 0x00AC
|
||||
#define OMAP35XX_MCBSP_RCCR 0x00B0
|
||||
#define OMAP35XX_MCBSP_XBUFFSTAT 0x00B4
|
||||
#define OMAP35XX_MCBSP_RBUFFSTAT 0x00B8
|
||||
#define OMAP35XX_MCBSP_SSELCR 0x00BC
|
||||
#define OMAP35XX_MCBSP_STATUS 0x00C0
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* USB TTL Module
|
||||
*/
|
||||
#define OMAP35XX_USBTLL_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_USBTLL_OFFSET)
|
||||
#define OMAP35XX_USBTLL_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_USBTLL_OFFSET)
|
||||
#define OMAP35XX_USBTLL_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_USBTLL_REVISION 0x0000
|
||||
#define OMAP35XX_USBTLL_SYSCONFIG 0x0010
|
||||
#define OMAP35XX_USBTLL_SYSSTATUS 0x0014
|
||||
#define OMAP35XX_USBTLL_IRQSTATUS 0x0018
|
||||
#define OMAP35XX_USBTLL_IRQENABLE 0x001C
|
||||
#define OMAP35XX_USBTLL_TLL_SHARED_CONF 0x0030
|
||||
#define OMAP35XX_USBTLL_TLL_CHANNEL_CONF(i) (0x0040 + (0x04 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_VENDOR_ID_LO(i) (0x0800 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_VENDOR_ID_HI(i) (0x0801 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_PRODUCT_ID_LO(i) (0x0802 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_PRODUCT_ID_HI(i) (0x0803 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_FUNCTION_CTRL(i) (0x0804 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_FUNCTION_CTRL_SET(i) (0x0805 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_FUNCTION_CTRL_CLR(i) (0x0806 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_INTERFACE_CTRL(i) (0x0807 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_INTERFACE_CTRL_SET(i) (0x0808 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_INTERFACE_CTRL_CLR(i) (0x0809 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_OTG_CTRL(i) (0x080A + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_OTG_CTRL_SET(i) (0x080B + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_OTG_CTRL_CLR(i) (0x080C + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_EN_RISE(i) (0x080D + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_EN_RISE_SET(i) (0x080E + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_EN_RISE_CLR(i) (0x080F + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_EN_FALL(i) (0x0810 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_EN_FALL_SET(i) (0x0811 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_EN_FALL_CLR(i) (0x0812 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_STATUS(i) (0x0813 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_LATCH(i) (0x0814 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_DEBUG(i) (0x0815 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_SCRATCH_REGISTER(i) (0x0816 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_SCRATCH_REGISTER_SET(i) (0x0817 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_SCRATCH_REGISTER_CLR(i) (0x0818 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_EXTENDED_SET_ACCESS(i) (0x082F + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VCONTROL_EN(i) (0x0830 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VCONTROL_EN_SET(i) (0x0831 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VCONTROL_EN_CLR(i) (0x0832 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VCONTROL_STATUS(i) (0x0833 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VCONTROL_LATCH(i) (0x0834 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VSTATUS(i) (0x0835 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VSTATUS_SET(i) (0x0836 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_UTMI_VSTATUS_CLR(i) (0x0837 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_USB_INT_LATCH_NOCLR(i) (0x0838 + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_VENDOR_INT_EN(i) (0x083B + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_VENDOR_INT_EN_SET(i) (0x083C + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_VENDOR_INT_EN_CLR(i) (0x083D + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_VENDOR_INT_STATUS(i) (0x083E + (0x100 * (i)))
|
||||
#define OMAP35XX_USBTLL_ULPI_VENDOR_INT_LATCH(i) (0x083F + (0x100 * (i)))
|
||||
|
||||
|
||||
/*
|
||||
* USB Host Module
|
||||
*/
|
||||
#define OMAP35XX_USB_TLL_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_USB_TLL_OFFSET)
|
||||
#define OMAP35XX_USB_TLL_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_USB_TLL_OFFSET)
|
||||
#define OMAP35XX_USB_TLL_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_USB_EHCI_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_USB_EHCI_OFFSET)
|
||||
#define OMAP35XX_USB_EHCI_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_USB_EHCI_OFFSET)
|
||||
#define OMAP35XX_USB_EHCI_SIZE 0x00000400UL
|
||||
|
||||
#define OMAP35XX_USB_UHH_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_USB_UHH_OFFSET)
|
||||
#define OMAP35XX_USB_UHH_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_USB_UHH_OFFSET)
|
||||
#define OMAP35XX_USB_UHH_SIZE 0x00000400UL
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* SDRAM Controler (SDRC)
|
||||
* PA 0x6D00_0000
|
||||
*/
|
||||
|
||||
#define OMAP35XX_SDRC_SYSCONFIG (OMAP35XX_SDRC_VBASE + 0x10)
|
||||
#define OMAP35XX_SDRC_SYSSTATUS (OMAP35XX_SDRC_VBASE + 0x14)
|
||||
#define OMAP35XX_SDRC_CS_CFG (OMAP35XX_SDRC_VBASE + 0x40)
|
||||
#define OMAP35XX_SDRC_SHARING (OMAP35XX_SDRC_VBASE + 0x44)
|
||||
#define OMAP35XX_SDRC_ERR_ADDR (OMAP35XX_SDRC_VBASE + 0x48)
|
||||
#define OMAP35XX_SDRC_ERR_TYPE (OMAP35XX_SDRC_VBASE + 0x4C)
|
||||
#define OMAP35XX_SDRC_DLLA_CTRL (OMAP35XX_SDRC_VBASE + 0x60)
|
||||
#define OMAP35XX_SDRC_DLLA_STATUS (OMAP35XX_SDRC_VBASE + 0x64)
|
||||
#define OMAP35XX_SDRC_POWER_REG (OMAP35XX_SDRC_VBASE + 0x70)
|
||||
#define OMAP35XX_SDRC_MCFG(p) (OMAP35XX_SDRC_VBASE + 0x80 + (0x30 * (p)))
|
||||
#define OMAP35XX_SDRC_MR(p) (OMAP35XX_SDRC_VBASE + 0x84 + (0x30 * (p)))
|
||||
#define OMAP35XX_SDRC_EMR2(p) (OMAP35XX_SDRC_VBASE + 0x8C + (0x30 * (p)))
|
||||
#define OMAP35XX_SDRC_ACTIM_CTRLA(p) (OMAP35XX_SDRC_VBASE + 0x9C + (0x28 * (p)))
|
||||
#define OMAP35XX_SDRC_ACTIM_CTRLB(p) (OMAP35XX_SDRC_VBASE + 0xA0 + (0x28 * (p)))
|
||||
#define OMAP35XX_SDRC_RFR_CTRL(p) (OMAP35XX_SDRC_VBASE + 0xA4 + (0x30 * (p)))
|
||||
#define OMAP35XX_SDRC_MANUAL(p) (OMAP35XX_SDRC_VBASE + 0xA8 + (0x30 * (p)))
|
||||
|
||||
|
||||
/*
|
||||
* SDMA Offset
|
||||
* PA 0x4805 6000
|
||||
*/
|
||||
|
||||
#define OMAP35XX_SDMA_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_SDMA_OFFSET)
|
||||
#define OMAP35XX_SDMA_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_SDMA_OFFSET)
|
||||
#define OMAP35XX_SDMA_SIZE 0x00001000UL
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Interrupt Controller Unit.
|
||||
* PA 0x4820_0000
|
||||
*/
|
||||
|
||||
#define OMAP35XX_INTCPS_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_INTCPS_OFFSET)
|
||||
#define OMAP35XX_INTCPS_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_INTCPS_OFFSET)
|
||||
#define OMAP35XX_INTCPS_SIZE 0x00001000UL
|
||||
|
||||
#define OMAP35XX_INTCPS_SYSCONFIG (OMAP35XX_INTCPS_VBASE + 0x10)
|
||||
#define OMAP35XX_INTCPS_SYSSTATUS (OMAP35XX_INTCPS_VBASE + 0x14)
|
||||
#define OMAP35XX_INTCPS_SIR_IRQ (OMAP35XX_INTCPS_VBASE + 0x40)
|
||||
#define OMAP35XX_INTCPS_SIR_FIQ (OMAP35XX_INTCPS_VBASE + 0x44)
|
||||
#define OMAP35XX_INTCPS_CONTROL (OMAP35XX_INTCPS_VBASE + 0x48)
|
||||
#define OMAP35XX_INTCPS_PROTECTION (OMAP35XX_INTCPS_VBASE + 0x4C)
|
||||
#define OMAP35XX_INTCPS_IDLE (OMAP35XX_INTCPS_VBASE + 0x50)
|
||||
#define OMAP35XX_INTCPS_IRQ_PRIORITY (OMAP35XX_INTCPS_VBASE + 0x60)
|
||||
#define OMAP35XX_INTCPS_FIQ_PRIORITY (OMAP35XX_INTCPS_VBASE + 0x64)
|
||||
#define OMAP35XX_INTCPS_THRESHOLD (OMAP35XX_INTCPS_VBASE + 0x68)
|
||||
#define OMAP35XX_INTCPS_ITR(n) (OMAP35XX_INTCPS_VBASE + 0x80 + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_MIR(n) (OMAP35XX_INTCPS_VBASE + 0x84 + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_MIR_CLEAR(n) (OMAP35XX_INTCPS_VBASE + 0x88 + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_MIR_SET(n) (OMAP35XX_INTCPS_VBASE + 0x8C + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_ISR_SET(n) (OMAP35XX_INTCPS_VBASE + 0x90 + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_ISR_CLEAR(n) (OMAP35XX_INTCPS_VBASE + 0x94 + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_PENDING_IRQ(n) (OMAP35XX_INTCPS_VBASE + 0x98 + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_PENDING_FIQ(n) (OMAP35XX_INTCPS_VBASE + 0x9C + (0x20 * (n)))
|
||||
#define OMAP35XX_INTCPS_ILR(m) (OMAP35XX_INTCPS_VBASE + 0x100 + (0x4 * (m)))
|
||||
|
||||
|
||||
#define OMAP35XX_IRQ_EMUINT 0 /* MPU emulation(2) */
|
||||
#define OMAP35XX_IRQ_COMMTX 1 /* MPU emulation(2) */
|
||||
#define OMAP35XX_IRQ_COMMRX 2 /* MPU emulation(2) */
|
||||
#define OMAP35XX_IRQ_BENCH 3 /* MPU emulation(2) */
|
||||
#define OMAP35XX_IRQ_MCBSP2_ST 4 /* Sidetone MCBSP2 overflow */
|
||||
#define OMAP35XX_IRQ_MCBSP3_ST 5 /* Sidetone MCBSP3 overflow */
|
||||
#define OMAP35XX_IRQ_SSM_ABORT 6 /* MPU subsystem secure state-machine abort (2) */
|
||||
#define OMAP35XX_IRQ_SYS_NIRQ 7 /* External source (active low) */
|
||||
#define OMAP35XX_IRQ_RESERVED8 8 /* RESERVED */
|
||||
#define OMAP35XX_IRQ_SMX_DBG 9 /* SMX error for debug */
|
||||
#define OMAP35XX_IRQ_SMX_APP 10 /* SMX error for application */
|
||||
#define OMAP35XX_IRQ_PRCM_MPU 11 /* PRCM module IRQ */
|
||||
#define OMAP35XX_IRQ_SDMA0 12 /* System DMA request 0(3) */
|
||||
#define OMAP35XX_IRQ_SDMA1 13 /* System DMA request 1(3) */
|
||||
#define OMAP35XX_IRQ_SDMA2 14 /* System DMA request 2 */
|
||||
#define OMAP35XX_IRQ_SDMA3 15 /* System DMA request 3 */
|
||||
#define OMAP35XX_IRQ_MCBSP1 16 /* McBSP module 1 IRQ (3) */
|
||||
#define OMAP35XX_IRQ_MCBSP2 17 /* McBSP module 2 IRQ (3) */
|
||||
#define OMAP35XX_IRQ_SR1 18 /* SmartReflex™ 1 */
|
||||
#define OMAP35XX_IRQ_SR2 19 /* SmartReflex™ 2 */
|
||||
#define OMAP35XX_IRQ_GPMC 20 /* General-purpose memory controller module */
|
||||
#define OMAP35XX_IRQ_SGX 21 /* 2D/3D graphics module */
|
||||
#define OMAP35XX_IRQ_MCBSP3 22 /* McBSP module 3(3) */
|
||||
#define OMAP35XX_IRQ_MCBSP4 23 /* McBSP module 4(3) */
|
||||
#define OMAP35XX_IRQ_CAM0 24 /* Camera interface request 0 */
|
||||
#define OMAP35XX_IRQ_DSS 25 /* Display subsystem module(3) */
|
||||
#define OMAP35XX_IRQ_MAIL_U0 26 /* Mailbox user 0 request */
|
||||
#define OMAP35XX_IRQ_MCBSP5_IRQ1 27 /* McBSP module 5 (3) */
|
||||
#define OMAP35XX_IRQ_IVA2_MMU 28 /* IVA2 MMU */
|
||||
#define OMAP35XX_IRQ_GPIO1_MPU 29 /* GPIO module 1(3) */
|
||||
#define OMAP35XX_IRQ_GPIO2_MPU 30 /* GPIO module 2(3) */
|
||||
#define OMAP35XX_IRQ_GPIO3_MPU 31 /* GPIO module 3(3) */
|
||||
#define OMAP35XX_IRQ_GPIO4_MPU 32 /* GPIO module 4(3) */
|
||||
#define OMAP35XX_IRQ_GPIO5_MPU 33 /* GPIO module 5(3) */
|
||||
#define OMAP35XX_IRQ_GPIO6_MPU 34 /* GPIO module 6(3) */
|
||||
#define OMAP35XX_IRQ_USIM 35 /* USIM interrupt (HS devices only) (4) */
|
||||
#define OMAP35XX_IRQ_WDT3 36 /* Watchdog timer module 3 overflow */
|
||||
#define OMAP35XX_IRQ_GPT1 37 /* General-purpose timer module 1 */
|
||||
#define OMAP35XX_IRQ_GPT2 38 /* General-purpose timer module 2 */
|
||||
#define OMAP35XX_IRQ_GPT3 39 /* General-purpose timer module 3 */
|
||||
#define OMAP35XX_IRQ_GPT4 40 /* General-purpose timer module 4 */
|
||||
#define OMAP35XX_IRQ_GPT5 41 /* General-purpose timer module 5(3) */
|
||||
#define OMAP35XX_IRQ_GPT6 42 /* General-purpose timer module 6(3) */
|
||||
#define OMAP35XX_IRQ_GPT7 43 /* General-purpose timer module 7(3) */
|
||||
#define OMAP35XX_IRQ_GPT8 44 /* General-purpose timer module 8(3) */
|
||||
#define OMAP35XX_IRQ_GPT9 45 /* General-purpose timer module 9 */
|
||||
#define OMAP35XX_IRQ_GPT10 46 /* General-purpose timer module 10 */
|
||||
#define OMAP35XX_IRQ_GPT11 47 /* General-purpose timer module 11 */
|
||||
#define OMAP35XX_IRQ_SPI4 48 /* McSPI module 4 */
|
||||
#define OMAP35XX_IRQ_SHA1MD5_2 49 /* SHA-1/MD5 crypto-accelerator 2 (HS devices only)(4) */
|
||||
#define OMAP35XX_IRQ_FPKA_IRQREADY_N 50 /* PKA crypto-accelerator (HS devices only) (4) */
|
||||
#define OMAP35XX_IRQ_SHA2MD5 51 /* SHA-2/MD5 crypto-accelerator 1 (HS devices only) (4) */
|
||||
#define OMAP35XX_IRQ_RNG 52 /* RNG module (HS devices only) (4) */
|
||||
#define OMAP35XX_IRQ_MG 53 /* MG function (3) */
|
||||
#define OMAP35XX_IRQ_MCBSP4_TX 54 /* McBSP module 4 transmit(3) */
|
||||
#define OMAP35XX_IRQ_MCBSP4_RX 55 /* McBSP module 4 receive(3) */
|
||||
#define OMAP35XX_IRQ_I2C1 56 /* I2C module 1 */
|
||||
#define OMAP35XX_IRQ_I2C2 57 /* I2C module 2 */
|
||||
#define OMAP35XX_IRQ_HDQ 58 /* HDQ / One-wire */
|
||||
#define OMAP35XX_IRQ_MCBSP1_TX 59 /* McBSP module 1 transmit(3) */
|
||||
#define OMAP35XX_IRQ_MCBSP1_RX 60 /* McBSP module 1 receive(3) */
|
||||
#define OMAP35XX_IRQ_I2C3 61 /* I2C module 3 */
|
||||
#define OMAP35XX_IRQ_McBSP2_TX 62 /* McBSP module 2 transmit(3) */
|
||||
#define OMAP35XX_IRQ_McBSP2_RX 63 /* McBSP module 2 receive(3) */
|
||||
#define OMAP35XX_IRQ_FPKA_IRQRERROR_N 64 /* PKA crypto-accelerator (HS devices only) (4) */
|
||||
#define OMAP35XX_IRQ_SPI1 65 /* McSPI module 1 */
|
||||
#define OMAP35XX_IRQ_SPI2 66 /* McSPI module 2 */
|
||||
#define OMAP35XX_IRQ_RESERVED67 67 /* RESERVED */
|
||||
#define OMAP35XX_IRQ_RESERVED68 68 /* RESERVED */
|
||||
#define OMAP35XX_IRQ_RESERVED69 69 /* RESERVED */
|
||||
#define OMAP35XX_IRQ_RESERVED70 70 /* RESERVED */
|
||||
#define OMAP35XX_IRQ_RESERVED71 71 /* RESERVED */
|
||||
#define OMAP35XX_IRQ_UART1 72 /* UART module 1 */
|
||||
#define OMAP35XX_IRQ_UART2 73 /* UART module 2 */
|
||||
#define OMAP35XX_IRQ_UART3 74 /* UART module 3 (also infrared)(3) */
|
||||
#define OMAP35XX_IRQ_PBIAS 75 /* Merged interrupt for PBIASlite1 and 2 */
|
||||
#define OMAP35XX_IRQ_OHCI 76 /* OHCI controller HSUSB MP Host Interrupt */
|
||||
#define OMAP35XX_IRQ_EHCI 77 /* EHCI controller HSUSB MP Host Interrupt */
|
||||
#define OMAP35XX_IRQ_TLL 78 /* HSUSB MP TLL Interrupt */
|
||||
#define OMAP35XX_IRQ_PARTHASH 79 /* SHA2/MD5 crypto-accelerator 1 (HS devices only) (4) */
|
||||
#define OMAP35XX_IRQ_RESERVED80 80 /* Reserved */
|
||||
#define OMAP35XX_IRQ_MCBSP5_TX 81 /* McBSP module 5 transmit(3) */
|
||||
#define OMAP35XX_IRQ_MCBSP5_RX 82 /* McBSP module 5 receive(3) */
|
||||
#define OMAP35XX_IRQ_MMC1 83 /* MMC/SD module 1 */
|
||||
#define OMAP35XX_IRQ_MS 84 /* MS-PRO™ module */
|
||||
#define OMAP35XX_IRQ_RESERVED85 85 /* Reserved */
|
||||
#define OMAP35XX_IRQ_MMC2 86 /* MMC/SD module 2 */
|
||||
#define OMAP35XX_IRQ_MPU_ICR 87 /* MPU ICR */
|
||||
#define OMAP35XX_IRQ_RESERVED 88 /* RESERVED */
|
||||
#define OMAP35XX_IRQ_MCBSP3_TX 89 /* McBSP module 3 transmit(3) */
|
||||
#define OMAP35XX_IRQ_MCBSP3_RX 90 /* McBSP module 3 receive(3) */
|
||||
#define OMAP35XX_IRQ_SPI3 91 /* McSPI module 3 */
|
||||
#define OMAP35XX_IRQ_HSUSB_MC_NINT 92 /* High-Speed USB OTG controller */
|
||||
#define OMAP35XX_IRQ_HSUSB_DMA_NINT 93 /* High-Speed USB OTG DMA controller */
|
||||
#define OMAP35XX_IRQ_MMC3 94 /* MMC/SD module 3 */
|
||||
#define OMAP35XX_IRQ_GPT12 95 /* General-purpose timer module 12 */
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* General Purpose Timers
|
||||
*/
|
||||
#define OMAP35XX_GPTIMER1_VBASE (OMAP35XX_L4_WAKEUP_VBASE + OMAP35XX_GPTIMER1_OFFSET)
|
||||
#define OMAP35XX_GPTIMER1_HWBASE (OMAP35XX_L4_WAKEUP_HWBASE + OMAP35XX_GPTIMER1_OFFSET)
|
||||
#define OMAP35XX_GPTIMER2_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER2_OFFSET)
|
||||
#define OMAP35XX_GPTIMER2_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER2_OFFSET)
|
||||
#define OMAP35XX_GPTIMER3_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER3_OFFSET)
|
||||
#define OMAP35XX_GPTIMER3_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER3_OFFSET)
|
||||
#define OMAP35XX_GPTIMER4_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER4_OFFSET)
|
||||
#define OMAP35XX_GPTIMER4_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER4_OFFSET)
|
||||
#define OMAP35XX_GPTIMER5_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER5_OFFSET)
|
||||
#define OMAP35XX_GPTIMER5_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER5_OFFSET)
|
||||
#define OMAP35XX_GPTIMER6_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER6_OFFSET)
|
||||
#define OMAP35XX_GPTIMER6_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER6_OFFSET)
|
||||
#define OMAP35XX_GPTIMER7_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER7_OFFSET)
|
||||
#define OMAP35XX_GPTIMER7_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER7_OFFSET)
|
||||
#define OMAP35XX_GPTIMER8_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER8_OFFSET)
|
||||
#define OMAP35XX_GPTIMER8_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER8_OFFSET)
|
||||
#define OMAP35XX_GPTIMER9_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPTIMER9_OFFSET)
|
||||
#define OMAP35XX_GPTIMER9_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPTIMER9_OFFSET)
|
||||
#define OMAP35XX_GPTIMER10_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_GPTIMER10_OFFSET)
|
||||
#define OMAP35XX_GPTIMER10_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_GPTIMER10_OFFSET)
|
||||
#define OMAP35XX_GPTIMER11_VBASE (OMAP35XX_L4_CORE_VBASE + OMAP35XX_GPTIMER11_OFFSET)
|
||||
#define OMAP35XX_GPTIMER11_HWBASE (OMAP35XX_L4_CORE_HWBASE + OMAP35XX_GPTIMER11_OFFSET)
|
||||
#define OMAP35XX_GPTIMER12_VBASE 0x48304000UL /* GPTIMER12 */
|
||||
#define OMAP35XX_GPTIMER_SIZE 0x00001000UL
|
||||
|
||||
|
||||
|
||||
/* Timer register offsets */
|
||||
#define OMAP35XX_GPTIMER_TIOCP_CFG 0x010
|
||||
#define OMAP35XX_GPTIMER_TISTAT 0x014
|
||||
#define OMAP35XX_GPTIMER_TISR 0x018
|
||||
#define OMAP35XX_GPTIMER_TIER 0x01C
|
||||
#define OMAP35XX_GPTIMER_TWER 0x020
|
||||
#define OMAP35XX_GPTIMER_TCLR 0x024
|
||||
#define OMAP35XX_GPTIMER_TCRR 0x028
|
||||
#define OMAP35XX_GPTIMER_TLDR 0x02C
|
||||
#define OMAP35XX_GPTIMER_TTGR 0x030
|
||||
#define OMAP35XX_GPTIMER_TWPS 0x034
|
||||
#define OMAP35XX_GPTIMER_TMAR 0x038
|
||||
#define OMAP35XX_GPTIMER_TCAR1 0x03C
|
||||
#define OMAP35XX_GPTIMER_TSICR 0x040
|
||||
#define OMAP35XX_GPTIMER_TCAR2 0x044
|
||||
#define OMAP35XX_GPTIMER_TPIR 0x048
|
||||
#define OMAP35XX_GPTIMER_TNIR 0x04C
|
||||
#define OMAP35XX_GPTIMER_TCVR 0x050
|
||||
#define OMAP35XX_GPTIMER_TOCR 0x054
|
||||
#define OMAP35XX_GPTIMER_TOWR 0x058
|
||||
|
||||
/* Bit values */
|
||||
#define MAT_IT_FLAG 0x01
|
||||
#define OVF_IT_FLAG 0x02
|
||||
#define TCAR_IT_FLAG 0x04
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* GPIO - General Purpose IO
|
||||
*/
|
||||
|
||||
/* Base addresses for the GPIO modules */
|
||||
#define OMAP35XX_GPIO1_HWBASE (OMAP35XX_L4_WAKEUP_HWBASE + OMAP35XX_GPIO1_OFFSET)
|
||||
#define OMAP35XX_GPIO1_VBASE (OMAP35XX_L4_WAKEUP_VBASE + OMAP35XX_GPIO1_OFFSET)
|
||||
#define OMAP35XX_GPIO1_SIZE 0x00001000UL
|
||||
#define OMAP35XX_GPIO2_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPIO2_OFFSET)
|
||||
#define OMAP35XX_GPIO2_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPIO2_OFFSET)
|
||||
#define OMAP35XX_GPIO2_SIZE 0x00001000UL
|
||||
#define OMAP35XX_GPIO3_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPIO3_OFFSET)
|
||||
#define OMAP35XX_GPIO3_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPIO3_OFFSET)
|
||||
#define OMAP35XX_GPIO3_SIZE 0x00001000UL
|
||||
#define OMAP35XX_GPIO4_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPIO4_OFFSET)
|
||||
#define OMAP35XX_GPIO4_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPIO4_OFFSET)
|
||||
#define OMAP35XX_GPIO4_SIZE 0x00001000UL
|
||||
#define OMAP35XX_GPIO5_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPIO5_OFFSET)
|
||||
#define OMAP35XX_GPIO5_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPIO5_OFFSET)
|
||||
#define OMAP35XX_GPIO5_SIZE 0x00001000UL
|
||||
#define OMAP35XX_GPIO6_HWBASE (OMAP35XX_L4_PERIPH_HWBASE + OMAP35XX_GPIO6_OFFSET)
|
||||
#define OMAP35XX_GPIO6_VBASE (OMAP35XX_L4_PERIPH_VBASE + OMAP35XX_GPIO6_OFFSET)
|
||||
#define OMAP35XX_GPIO6_SIZE 0x00001000UL
|
||||
|
||||
|
||||
|
||||
/* Register offsets within the banks above */
|
||||
#define OMAP35XX_GPIO_SYSCONFIG 0x010
|
||||
#define OMAP35XX_GPIO_SYSSTATUS 0x014
|
||||
#define OMAP35XX_GPIO_IRQSTATUS1 0x018
|
||||
#define OMAP35XX_GPIO_IRQENABLE1 0x01C
|
||||
#define OMAP35XX_GPIO_WAKEUPENABLE 0x020
|
||||
#define OMAP35XX_GPIO_IRQSTATUS2 0x028
|
||||
#define OMAP35XX_GPIO_IRQENABLE2 0x02C
|
||||
#define OMAP35XX_GPIO_CTRL 0x030
|
||||
#define OMAP35XX_GPIO_OE 0x034
|
||||
#define OMAP35XX_GPIO_DATAIN 0x038
|
||||
#define OMAP35XX_GPIO_DATAOUT 0x03C
|
||||
#define OMAP35XX_GPIO_LEVELDETECT0 0x040
|
||||
#define OMAP35XX_GPIO_LEVELDETECT1 0x044
|
||||
#define OMAP35XX_GPIO_RISINGDETECT 0x048
|
||||
#define OMAP35XX_GPIO_FALLINGDETECT 0x04C
|
||||
#define OMAP35XX_GPIO_DEBOUNCENABLE 0x050
|
||||
#define OMAP35XX_GPIO_DEBOUNCINGTIME 0x054
|
||||
#define OMAP35XX_GPIO_CLEARIRQENABLE1 0x060
|
||||
#define OMAP35XX_GPIO_SETIRQENABLE1 0x064
|
||||
#define OMAP35XX_GPIO_CLEARIRQENABLE2 0x070
|
||||
#define OMAP35XX_GPIO_SETIRQENABLE2 0x074
|
||||
#define OMAP35XX_GPIO_CLEARWKUENA 0x080
|
||||
#define OMAP35XX_GPIO_SETWKUENA 0x084
|
||||
#define OMAP35XX_GPIO_CLEARDATAOUT 0x090
|
||||
#define OMAP35XX_GPIO_SETDATAOUT 0x094
|
||||
|
||||
|
||||
/*
|
||||
* MMC/SD/SDIO
|
||||
*/
|
||||
|
||||
/* Base addresses for the MMC/SD/SDIO modules */
|
||||
#define OMAP35XX_MMCHS1_HWBASE (OMAP35XX_L4_CORE_HWBASE + 0x0009C000)
|
||||
#define OMAP35XX_MMCHS1_VBASE (OMAP35XX_L4_CORE_VBASE + 0x0009C000)
|
||||
#define OMAP35XX_MMCHS2_HWBASE (OMAP35XX_L4_CORE_HWBASE + 0x000B4000)
|
||||
#define OMAP35XX_MMCHS2_VBASE (OMAP35XX_L4_CORE_VBASE + 0x000B4000)
|
||||
#define OMAP35XX_MMCHS3_HWBASE (OMAP35XX_L4_CORE_HWBASE + 0x000AD000)
|
||||
#define OMAP35XX_MMCHS3_VBASE (OMAP35XX_L4_CORE_VBASE + 0x000AD000)
|
||||
#define OMAP35XX_MMCHS_SIZE 0x00000200UL
|
||||
|
||||
/* Register offsets within each of the MMC/SD/SDIO controllers */
|
||||
#define OMAP35XX_MMCHS_SYSCONFIG 0x010
|
||||
#define OMAP35XX_MMCHS_SYSSTATUS 0x014
|
||||
#define OMAP35XX_MMCHS_CSRE 0x024
|
||||
#define OMAP35XX_MMCHS_SYSTEST 0x028
|
||||
#define OMAP35XX_MMCHS_CON 0x02C
|
||||
#define OMAP35XX_MMCHS_PWCNT 0x030
|
||||
#define OMAP35XX_MMCHS_BLK 0x104
|
||||
#define OMAP35XX_MMCHS_ARG 0x108
|
||||
#define OMAP35XX_MMCHS_CMD 0x10C
|
||||
#define OMAP35XX_MMCHS_RSP10 0x110
|
||||
#define OMAP35XX_MMCHS_RSP32 0x114
|
||||
#define OMAP35XX_MMCHS_RSP54 0x118
|
||||
#define OMAP35XX_MMCHS_RSP76 0x11C
|
||||
#define OMAP35XX_MMCHS_DATA 0x120
|
||||
#define OMAP35XX_MMCHS_PSTATE 0x124
|
||||
#define OMAP35XX_MMCHS_HCTL 0x128
|
||||
#define OMAP35XX_MMCHS_SYSCTL 0x12C
|
||||
#define OMAP35XX_MMCHS_STAT 0x130
|
||||
#define OMAP35XX_MMCHS_IE 0x134
|
||||
#define OMAP35XX_MMCHS_ISE 0x138
|
||||
#define OMAP35XX_MMCHS_AC12 0x13C
|
||||
#define OMAP35XX_MMCHS_CAPA 0x140
|
||||
#define OMAP35XX_MMCHS_CUR_CAPA 0x148
|
||||
#define OMAP35XX_MMCHS_REV 0x1FC
|
||||
|
||||
|
||||
|
||||
#endif /* _OMAP35XX_REG_H_ */
|
@ -6,8 +6,6 @@ arm/ti/ti_smc.S standard
|
||||
|
||||
arm/ti/usb/omap_ehci.c optional usb ehci
|
||||
arm/ti/ti_sdma.c optional ti_sdma
|
||||
arm/ti/ti_sdhci.c optional sdhci
|
||||
#arm/ti/ti_mmchs.c optional mmc
|
||||
|
||||
arm/ti/omap4/omap4_l2cache.c optional pl310
|
||||
arm/ti/omap4/omap4_prcm_clks.c standard
|
||||
|
@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <arm/ti/ti_cpuid.h>
|
||||
|
||||
#include <arm/ti/omap4/omap4_reg.h>
|
||||
#include <arm/ti/omap3/omap3_reg.h>
|
||||
#include <arm/ti/am335x/am335x_reg.h>
|
||||
|
||||
#define OMAP4_STD_FUSE_DIE_ID_0 0x2200
|
||||
@ -198,67 +197,6 @@ omap4_get_revision(void)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* omap3_get_revision - determines omap3 revision
|
||||
*
|
||||
* Reads the registers to determine the revision of the chip we are currently
|
||||
* running on. Stores the information in global variables.
|
||||
*
|
||||
* WARNING: This function currently only really works for OMAP3530 devices.
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
static void
|
||||
omap3_get_revision(void)
|
||||
{
|
||||
uint32_t id_code;
|
||||
uint32_t revision;
|
||||
uint32_t hawkeye;
|
||||
bus_space_handle_t bsh;
|
||||
|
||||
/* The chip revsion is read from the device identification registers and
|
||||
* the JTAG (?) tap registers, which are located in address 0x4A00_2200 to
|
||||
* 0x4A00_2218. This is part of the L4_CORE memory range and should have
|
||||
* been mapped in by the machdep.c code.
|
||||
*
|
||||
* CONTROL_IDCODE 0x4830 A204 (this is the only one we need)
|
||||
*
|
||||
*
|
||||
*/
|
||||
bus_space_map(fdtbus_bs_tag, OMAP35XX_L4_WAKEUP_HWBASE, 0x10000, 0, &bsh);
|
||||
id_code = bus_space_read_4(fdtbus_bs_tag, bsh, OMAP3_ID_CODE);
|
||||
bus_space_unmap(fdtbus_bs_tag, bsh, 0x10000);
|
||||
|
||||
hawkeye = ((id_code >> 12) & 0xffff);
|
||||
revision = ((id_code >> 28) & 0xf);
|
||||
|
||||
switch (hawkeye) {
|
||||
case 0xB6D6:
|
||||
chip_revision = OMAP3350_REV_ES1_0;
|
||||
break;
|
||||
case 0xB7AE:
|
||||
if (revision == 1)
|
||||
chip_revision = OMAP3530_REV_ES2_0;
|
||||
else if (revision == 2)
|
||||
chip_revision = OMAP3530_REV_ES2_1;
|
||||
else if (revision == 3)
|
||||
chip_revision = OMAP3530_REV_ES3_0;
|
||||
else if (revision == 4)
|
||||
chip_revision = OMAP3530_REV_ES3_1;
|
||||
else if (revision == 7)
|
||||
chip_revision = OMAP3530_REV_ES3_1_2;
|
||||
break;
|
||||
default:
|
||||
/* Default to the latest revision if we can't determine type */
|
||||
chip_revision = OMAP3530_REV_ES3_1_2;
|
||||
break;
|
||||
}
|
||||
printf("Texas Instruments OMAP%04x Processor, Revision ES%u.%u\n",
|
||||
OMAP_REV_DEVICE(chip_revision), OMAP_REV_MAJOR(chip_revision),
|
||||
OMAP_REV_MINOR(chip_revision));
|
||||
}
|
||||
|
||||
static void
|
||||
am335x_get_revision(void)
|
||||
{
|
||||
@ -313,9 +251,6 @@ static void
|
||||
ti_cpu_ident(void *dummy)
|
||||
{
|
||||
switch(ti_chip()) {
|
||||
case CHIP_OMAP_3:
|
||||
omap3_get_revision();
|
||||
break;
|
||||
case CHIP_OMAP_4:
|
||||
omap4_get_revision();
|
||||
break;
|
||||
|
@ -67,16 +67,13 @@
|
||||
|
||||
#define AM335X_DEVREV(x) ((x) >> 28)
|
||||
|
||||
#define CHIP_OMAP_3 0
|
||||
#define CHIP_OMAP_4 1
|
||||
#define CHIP_AM335X 2
|
||||
#define CHIP_OMAP_4 0
|
||||
#define CHIP_AM335X 1
|
||||
|
||||
static __inline int ti_chip(void)
|
||||
{
|
||||
#if defined(SOC_OMAP4)
|
||||
return CHIP_OMAP_4;
|
||||
#elif defined(SOC_OMAP3)
|
||||
return CHIP_OMAP_3;
|
||||
#elif defined(SOC_TI_AM335X)
|
||||
return CHIP_AM335X;
|
||||
#else
|
||||
|
@ -70,32 +70,7 @@ __FBSDID("$FreeBSD$");
|
||||
/* Register definitions */
|
||||
#define TI_GPIO_REVISION 0x0000
|
||||
#define TI_GPIO_SYSCONFIG 0x0010
|
||||
#if defined(SOC_OMAP3)
|
||||
#define TI_GPIO_SYSSTATUS 0x0014
|
||||
#define TI_GPIO_IRQSTATUS1 0x0018
|
||||
#define TI_GPIO_IRQENABLE1 0x001C
|
||||
#define TI_GPIO_WAKEUPENABLE 0x0020
|
||||
#define TI_GPIO_IRQSTATUS2 0x0028
|
||||
#define TI_GPIO_IRQENABLE2 0x002C
|
||||
#define TI_GPIO_CTRL 0x0030
|
||||
#define TI_GPIO_OE 0x0034
|
||||
#define TI_GPIO_DATAIN 0x0038
|
||||
#define TI_GPIO_DATAOUT 0x003C
|
||||
#define TI_GPIO_LEVELDETECT0 0x0040
|
||||
#define TI_GPIO_LEVELDETECT1 0x0044
|
||||
#define TI_GPIO_RISINGDETECT 0x0048
|
||||
#define TI_GPIO_FALLINGDETECT 0x004C
|
||||
#define TI_GPIO_DEBOUNCENABLE 0x0050
|
||||
#define TI_GPIO_DEBOUNCINGTIME 0x0054
|
||||
#define TI_GPIO_CLEARIRQENABLE1 0x0060
|
||||
#define TI_GPIO_SETIRQENABLE1 0x0064
|
||||
#define TI_GPIO_CLEARIRQENABLE2 0x0070
|
||||
#define TI_GPIO_SETIRQENABLE2 0x0074
|
||||
#define TI_GPIO_CLEARWKUENA 0x0080
|
||||
#define TI_GPIO_SETWKUENA 0x0084
|
||||
#define TI_GPIO_CLEARDATAOUT 0x0090
|
||||
#define TI_GPIO_SETDATAOUT 0x0094
|
||||
#elif defined(SOC_OMAP4) || defined(SOC_TI_AM335X)
|
||||
#if defined(SOC_OMAP4) || defined(SOC_TI_AM335X)
|
||||
#define TI_GPIO_IRQSTATUS_RAW_0 0x0024
|
||||
#define TI_GPIO_IRQSTATUS_RAW_1 0x0028
|
||||
#define TI_GPIO_IRQSTATUS_0 0x002C
|
||||
@ -131,10 +106,6 @@ __FBSDID("$FreeBSD$");
|
||||
#endif
|
||||
|
||||
/* Other SoC Specific definitions */
|
||||
#define OMAP3_MAX_GPIO_BANKS 6
|
||||
#define OMAP3_FIRST_GPIO_BANK 1
|
||||
#define OMAP3_INTR_PER_BANK 1
|
||||
#define OMAP3_GPIO_REV 0x00000025
|
||||
#define OMAP4_MAX_GPIO_BANKS 6
|
||||
#define OMAP4_FIRST_GPIO_BANK 1
|
||||
#define OMAP4_INTR_PER_BANK 1
|
||||
@ -152,10 +123,6 @@ static u_int
|
||||
ti_max_gpio_banks(void)
|
||||
{
|
||||
switch(ti_chip()) {
|
||||
#ifdef SOC_OMAP3
|
||||
case CHIP_OMAP_3:
|
||||
return (OMAP3_MAX_GPIO_BANKS);
|
||||
#endif
|
||||
#ifdef SOC_OMAP4
|
||||
case CHIP_OMAP_4:
|
||||
return (OMAP4_MAX_GPIO_BANKS);
|
||||
@ -172,10 +139,6 @@ static u_int
|
||||
ti_max_gpio_intrs(void)
|
||||
{
|
||||
switch(ti_chip()) {
|
||||
#ifdef SOC_OMAP3
|
||||
case CHIP_OMAP_3:
|
||||
return (OMAP3_MAX_GPIO_BANKS * OMAP3_INTR_PER_BANK);
|
||||
#endif
|
||||
#ifdef SOC_OMAP4
|
||||
case CHIP_OMAP_4:
|
||||
return (OMAP4_MAX_GPIO_BANKS * OMAP4_INTR_PER_BANK);
|
||||
@ -192,10 +155,6 @@ static u_int
|
||||
ti_first_gpio_bank(void)
|
||||
{
|
||||
switch(ti_chip()) {
|
||||
#ifdef SOC_OMAP3
|
||||
case CHIP_OMAP_3:
|
||||
return (OMAP3_FIRST_GPIO_BANK);
|
||||
#endif
|
||||
#ifdef SOC_OMAP4
|
||||
case CHIP_OMAP_4:
|
||||
return (OMAP4_FIRST_GPIO_BANK);
|
||||
@ -212,10 +171,6 @@ static uint32_t
|
||||
ti_gpio_rev(void)
|
||||
{
|
||||
switch(ti_chip()) {
|
||||
#ifdef SOC_OMAP3
|
||||
case CHIP_OMAP_3:
|
||||
return (OMAP3_GPIO_REV);
|
||||
#endif
|
||||
#ifdef SOC_OMAP4
|
||||
case CHIP_OMAP_4:
|
||||
return (OMAP4_GPIO_REV);
|
||||
|
@ -111,10 +111,6 @@ struct ti_i2c_clock_config
|
||||
uint8_t hssclh; /* High Speed mode SCL high time */
|
||||
};
|
||||
|
||||
#if defined(SOC_OMAP3)
|
||||
#error "Unsupported SoC"
|
||||
#endif
|
||||
|
||||
#if defined(SOC_OMAP4)
|
||||
static struct ti_i2c_clock_config ti_omap4_i2c_clock_configs[] = {
|
||||
{ IIC_UNKNOWN, 100000, 23, 13, 15, 0, 0},
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,176 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2011
|
||||
* Ben Gray <ben.r.gray@gmail.com>.
|
||||
* 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 AUTHOR 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
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS 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$
|
||||
*/
|
||||
#ifndef _TI_MMCHS_H_
|
||||
#define _TI_MMCHS_H_
|
||||
|
||||
/**
|
||||
* Header file for the TI MMC/SD/SDIO driver.
|
||||
*
|
||||
* Simply contains register addresses and bit flags.
|
||||
*/
|
||||
|
||||
/* Register offsets within each of the MMC/SD/SDIO controllers */
|
||||
#define MMCHS_SYSCONFIG 0x010
|
||||
#define MMCHS_SYSSTATUS 0x014
|
||||
#define MMCHS_CSRE 0x024
|
||||
#define MMCHS_SYSTEST 0x028
|
||||
#define MMCHS_CON 0x02C
|
||||
#define MMCHS_PWCNT 0x030
|
||||
#define MMCHS_BLK 0x104
|
||||
#define MMCHS_ARG 0x108
|
||||
#define MMCHS_CMD 0x10C
|
||||
#define MMCHS_RSP10 0x110
|
||||
#define MMCHS_RSP32 0x114
|
||||
#define MMCHS_RSP54 0x118
|
||||
#define MMCHS_RSP76 0x11C
|
||||
#define MMCHS_DATA 0x120
|
||||
#define MMCHS_PSTATE 0x124
|
||||
#define MMCHS_HCTL 0x128
|
||||
#define MMCHS_SYSCTL 0x12C
|
||||
#define MMCHS_STAT 0x130
|
||||
#define MMCHS_IE 0x134
|
||||
#define MMCHS_ISE 0x138
|
||||
#define MMCHS_AC12 0x13C
|
||||
#define MMCHS_CAPA 0x140
|
||||
#define MMCHS_CUR_CAPA 0x148
|
||||
#define MMCHS_REV 0x1FC
|
||||
|
||||
/* OMAP4 and OMAP4 have different register addresses */
|
||||
#define OMAP3_MMCHS_REG_OFFSET 0x000
|
||||
#define OMAP4_MMCHS_REG_OFFSET 0x100
|
||||
#define AM335X_MMCHS_REG_OFFSET 0x100
|
||||
|
||||
/* Register bit settings */
|
||||
#define MMCHS_SYSCONFIG_CLK_FUN (2 << 8)
|
||||
#define MMCHS_SYSCONFIG_CLK_IFC (1 << 8)
|
||||
#define MMCHS_SYSCONFIG_SIDL (2 << 3)
|
||||
#define MMCHS_SYSCONFIG_ENW (1 << 2)
|
||||
#define MMCHS_SYSCONFIG_SRST (1 << 1)
|
||||
#define MMCHS_SYSCONFIG_AIDL (1 << 0)
|
||||
#define MMCHS_STAT_BADA (1UL << 29)
|
||||
#define MMCHS_STAT_CERR (1UL << 28)
|
||||
#define MMCHS_STAT_ACE (1UL << 24)
|
||||
#define MMCHS_STAT_DEB (1UL << 22)
|
||||
#define MMCHS_STAT_DCRC (1UL << 21)
|
||||
#define MMCHS_STAT_DTO (1UL << 20)
|
||||
#define MMCHS_STAT_CIE (1UL << 19)
|
||||
#define MMCHS_STAT_CEB (1UL << 18)
|
||||
#define MMCHS_STAT_CCRC (1UL << 17)
|
||||
#define MMCHS_STAT_CTO (1UL << 16)
|
||||
#define MMCHS_STAT_ERRI (1UL << 15)
|
||||
#define MMCHS_STAT_OBI (1UL << 9)
|
||||
#define MMCHS_STAT_CIRQ (1UL << 8)
|
||||
#define MMCHS_STAT_BRR (1UL << 5)
|
||||
#define MMCHS_STAT_BWR (1UL << 4)
|
||||
#define MMCHS_STAT_BGE (1UL << 2)
|
||||
#define MMCHS_STAT_TC (1UL << 1)
|
||||
#define MMCHS_STAT_CC (1UL << 0)
|
||||
|
||||
#define MMCHS_STAT_CLEAR_MASK 0x3BFF8337UL
|
||||
|
||||
#define MMCHS_SYSCTL_SRD (1UL << 26)
|
||||
#define MMCHS_SYSCTL_SRC (1UL << 25)
|
||||
#define MMCHS_SYSCTL_SRA (1UL << 24)
|
||||
#define MMCHS_SYSCTL_DTO(x) (((x) & 0xf) << 16)
|
||||
#define MMCHS_SYSCTL_DTO_MASK MMCHS_SYSCTL_DTO(0xf)
|
||||
#define MMCHS_SYSCTL_CLKD(x) (((x) & 0x3ff) << 6)
|
||||
#define MMCHS_SYSCTL_CLKD_MASK MMCHS_SYSCTL_CLKD(0x3ff)
|
||||
#define MMCHS_SYSCTL_CEN (1UL << 2)
|
||||
#define MMCHS_SYSCTL_ICS (1UL << 1)
|
||||
#define MMCHS_SYSCTL_ICE (1UL << 0)
|
||||
|
||||
#define MMCHS_HCTL_OBWE (1UL << 27)
|
||||
#define MMCHS_HCTL_REM (1UL << 26)
|
||||
#define MMCHS_HCTL_INS (1UL << 25)
|
||||
#define MMCHS_HCTL_IWE (1UL << 24)
|
||||
#define MMCHS_HCTL_IBG (1UL << 19)
|
||||
#define MMCHS_HCTL_RWC (1UL << 18)
|
||||
#define MMCHS_HCTL_CR (1UL << 17)
|
||||
#define MMCHS_HCTL_SBGR (1UL << 16)
|
||||
#define MMCHS_HCTL_SDVS_MASK (7UL << 9)
|
||||
#define MMCHS_HCTL_SDVS_V18 (5UL << 9)
|
||||
#define MMCHS_HCTL_SDVS_V30 (6UL << 9)
|
||||
#define MMCHS_HCTL_SDVS_V33 (7UL << 9)
|
||||
#define MMCHS_HCTL_SDBP (1UL << 8)
|
||||
#define MMCHS_HCTL_DTW (1UL << 1)
|
||||
|
||||
#define MMCHS_CAPA_VS18 (1UL << 26)
|
||||
#define MMCHS_CAPA_VS30 (1UL << 25)
|
||||
#define MMCHS_CAPA_VS33 (1UL << 24)
|
||||
|
||||
#define MMCHS_CMD_CMD_TYPE_IO_ABORT (3UL << 21)
|
||||
#define MMCHS_CMD_CMD_TYPE_FUNC_SEL (2UL << 21)
|
||||
#define MMCHS_CMD_CMD_TYPE_SUSPEND (1UL << 21)
|
||||
#define MMCHS_CMD_CMD_TYPE_OTHERS (0UL << 21)
|
||||
#define MMCHS_CMD_CMD_TYPE_MASK (3UL << 22)
|
||||
|
||||
#define MMCHS_CMD_DP (1UL << 21)
|
||||
#define MMCHS_CMD_CICE (1UL << 20)
|
||||
#define MMCHS_CMD_CCCE (1UL << 19)
|
||||
|
||||
#define MMCHS_CMD_RSP_TYPE_MASK (3UL << 16)
|
||||
#define MMCHS_CMD_RSP_TYPE_NO (0UL << 16)
|
||||
#define MMCHS_CMD_RSP_TYPE_136 (1UL << 16)
|
||||
#define MMCHS_CMD_RSP_TYPE_48 (2UL << 16)
|
||||
#define MMCHS_CMD_RSP_TYPE_48_BSY (3UL << 16)
|
||||
|
||||
#define MMCHS_CMD_MSBS (1UL << 5)
|
||||
#define MMCHS_CMD_DDIR (1UL << 4)
|
||||
#define MMCHS_CMD_ACEN (1UL << 2)
|
||||
#define MMCHS_CMD_BCE (1UL << 1)
|
||||
#define MMCHS_CMD_DE (1UL << 0)
|
||||
|
||||
#define MMCHS_CON_CLKEXTFREE (1UL << 16)
|
||||
#define MMCHS_CON_PADEN (1UL << 15)
|
||||
#define MMCHS_CON_OBIE (1UL << 14)
|
||||
#define MMCHS_CON_OBIP (1UL << 13)
|
||||
#define MMCHS_CON_CEATA (1UL << 12)
|
||||
#define MMCHS_CON_CTPL (1UL << 11)
|
||||
|
||||
#define MMCHS_CON_DVAL_8_4MS (3UL << 9)
|
||||
#define MMCHS_CON_DVAL_1MS (2UL << 9)
|
||||
#define MMCHS_CON_DVAL_231US (1UL << 9)
|
||||
#define MMCHS_CON_DVAL_33US (0UL << 9)
|
||||
#define MMCHS_CON_DVAL_MASK (3UL << 9)
|
||||
|
||||
#define MMCHS_CON_WPP (1UL << 8)
|
||||
#define MMCHS_CON_CDP (1UL << 7)
|
||||
#define MMCHS_CON_MIT (1UL << 6)
|
||||
#define MMCHS_CON_DW8 (1UL << 5)
|
||||
#define MMCHS_CON_MODE (1UL << 4)
|
||||
#define MMCHS_CON_STR (1UL << 3)
|
||||
#define MMCHS_CON_HR (1UL << 2)
|
||||
#define MMCHS_CON_INIT (1UL << 1)
|
||||
#define MMCHS_CON_OD (1UL << 0)
|
||||
|
||||
#define MMCHS_CAPA_VS18 (1UL << 26)
|
||||
#define MMCHS_CAPA_VS30 (1UL << 25)
|
||||
#define MMCHS_CAPA_VS33 (1UL << 24)
|
||||
|
||||
#endif /* _TI_MMCHS_H_ */
|
@ -494,15 +494,21 @@ ti_sdhci_attach(device_t dev)
|
||||
* 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.
|
||||
*/
|
||||
if (ti_chip() == CHIP_OMAP_3)
|
||||
sc->mmchs_reg_off = OMAP3_MMCHS_REG_OFFSET;
|
||||
else if (ti_chip() == CHIP_OMAP_4) {
|
||||
switch (ti_chip()) {
|
||||
#ifdef SOC_OMAP4
|
||||
case CHIP_OMAP_4:
|
||||
sc->mmchs_reg_off = OMAP4_MMCHS_REG_OFFSET;
|
||||
sc->disable_highspeed = true;
|
||||
} else if (ti_chip() == CHIP_AM335X)
|
||||
break;
|
||||
#endif
|
||||
#ifdef SOC_TI_AM335X
|
||||
case CHIP_AM335X:
|
||||
sc->mmchs_reg_off = AM335X_MMCHS_REG_OFFSET;
|
||||
else
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
panic("Unknown OMAP device\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* The standard SDHCI registers are at a fixed offset (the same on all
|
||||
|
@ -38,6 +38,9 @@
|
||||
model = "Terasic SoCKit";
|
||||
compatible = "altr,socfpga-cyclone5", "altr,socfpga";
|
||||
|
||||
/* Reserve first page for secondary CPU trampoline code */
|
||||
memreserve = < 0x00000000 0x1000 >;
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = < 0x00000000 0x40000000 >; /* 1G RAM */
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* $FreeBSD$ */
|
||||
|
||||
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
|
||||
OUTPUT_FORMAT("elf32-powerpc-freebsd", "elf32-powerpc-freebsd",
|
||||
"elf32-powerpc-freebsd")
|
||||
OUTPUT_ARCH(powerpc:common)
|
||||
ENTRY(_start)
|
||||
SEARCH_DIR(/usr/lib);
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* $FreeBSD$ */
|
||||
|
||||
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
|
||||
OUTPUT_FORMAT("elf32-powerpc-freebsd", "elf32-powerpc-freebsd",
|
||||
"elf32-powerpc-freebsd")
|
||||
OUTPUT_ARCH(powerpc:common)
|
||||
ENTRY(_start)
|
||||
SEARCH_DIR(/usr/lib);
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* $FreeBSD$ */
|
||||
|
||||
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
|
||||
OUTPUT_FORMAT("elf32-powerpc-freebsd", "elf32-powerpc-freebsd",
|
||||
"elf32-powerpc-freebsd")
|
||||
OUTPUT_ARCH(powerpc:common)
|
||||
ENTRY(_start)
|
||||
SEARCH_DIR(/usr/lib);
|
||||
|
@ -2237,6 +2237,43 @@ ctl_sbuf_printf_esc(struct sbuf *sb, char *str)
|
||||
return (retval);
|
||||
}
|
||||
|
||||
static void
|
||||
ctl_id_sbuf(struct ctl_devid *id, struct sbuf *sb)
|
||||
{
|
||||
struct scsi_vpd_id_descriptor *desc;
|
||||
int i;
|
||||
|
||||
if (id == NULL || id->len < 4)
|
||||
return;
|
||||
desc = (struct scsi_vpd_id_descriptor *)id->data;
|
||||
switch (desc->id_type & SVPD_ID_TYPE_MASK) {
|
||||
case SVPD_ID_TYPE_T10:
|
||||
sbuf_printf(sb, "t10.");
|
||||
break;
|
||||
case SVPD_ID_TYPE_EUI64:
|
||||
sbuf_printf(sb, "eui.");
|
||||
break;
|
||||
case SVPD_ID_TYPE_NAA:
|
||||
sbuf_printf(sb, "naa.");
|
||||
break;
|
||||
case SVPD_ID_TYPE_SCSI_NAME:
|
||||
break;
|
||||
}
|
||||
switch (desc->proto_codeset & SVPD_ID_CODESET_MASK) {
|
||||
case SVPD_ID_CODESET_BINARY:
|
||||
for (i = 0; i < desc->length; i++)
|
||||
sbuf_printf(sb, "%02x", desc->identifier[i]);
|
||||
break;
|
||||
case SVPD_ID_CODESET_ASCII:
|
||||
sbuf_printf(sb, "%.*s", (int)desc->length,
|
||||
(char *)desc->identifier);
|
||||
break;
|
||||
case SVPD_ID_CODESET_UTF8:
|
||||
sbuf_printf(sb, "%s", (char *)desc->identifier);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
|
||||
struct thread *td)
|
||||
@ -2990,12 +3027,11 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
|
||||
for (j = 0; j < (CTL_MAX_PORTS * 2); j++) {
|
||||
for (k = 0; k < CTL_MAX_INIT_PER_PORT; k++){
|
||||
idx = j * CTL_MAX_INIT_PER_PORT + k;
|
||||
if (lun->per_res[idx].registered == 0)
|
||||
if (lun->pr_keys[idx] == 0)
|
||||
continue;
|
||||
printf(" LUN %d port %d iid %d key "
|
||||
"%#jx\n", i, j, k,
|
||||
(uintmax_t)scsi_8btou64(
|
||||
lun->per_res[idx].res_key.key));
|
||||
(uintmax_t)lun->pr_keys[idx]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3289,6 +3325,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
|
||||
struct ctl_port *port;
|
||||
struct ctl_lun_list *list;
|
||||
struct ctl_option *opt;
|
||||
int j;
|
||||
|
||||
list = (struct ctl_lun_list *)addr;
|
||||
|
||||
@ -3345,15 +3382,17 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
|
||||
if (retval != 0)
|
||||
break;
|
||||
|
||||
retval = sbuf_printf(sb, "\t<wwnn>%#jx</wwnn>\n",
|
||||
(uintmax_t)port->wwnn);
|
||||
if (retval != 0)
|
||||
break;
|
||||
if (port->target_devid != NULL) {
|
||||
sbuf_printf(sb, "\t<target>");
|
||||
ctl_id_sbuf(port->target_devid, sb);
|
||||
sbuf_printf(sb, "</target>\n");
|
||||
}
|
||||
|
||||
retval = sbuf_printf(sb, "\t<wwpn>%#jx</wwpn>\n",
|
||||
(uintmax_t)port->wwpn);
|
||||
if (retval != 0)
|
||||
break;
|
||||
if (port->port_devid != NULL) {
|
||||
sbuf_printf(sb, "\t<port>");
|
||||
ctl_id_sbuf(port->port_devid, sb);
|
||||
sbuf_printf(sb, "</port>\n");
|
||||
}
|
||||
|
||||
if (port->port_info != NULL) {
|
||||
retval = port->port_info(port->onoff_arg, sb);
|
||||
@ -3367,6 +3406,26 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
|
||||
break;
|
||||
}
|
||||
|
||||
for (j = 0; j < CTL_MAX_INIT_PER_PORT; j++) {
|
||||
if (port->wwpn_iid[j].in_use == 0 ||
|
||||
(port->wwpn_iid[j].wwpn == 0 &&
|
||||
port->wwpn_iid[j].name == NULL))
|
||||
continue;
|
||||
|
||||
if (port->wwpn_iid[j].name != NULL)
|
||||
retval = sbuf_printf(sb,
|
||||
"\t<initiator>%u %s</initiator>\n",
|
||||
j, port->wwpn_iid[j].name);
|
||||
else
|
||||
retval = sbuf_printf(sb,
|
||||
"\t<initiator>%u naa.%08jx</initiator>\n",
|
||||
j, port->wwpn_iid[j].wwpn);
|
||||
if (retval != 0)
|
||||
break;
|
||||
}
|
||||
if (retval != 0)
|
||||
break;
|
||||
|
||||
retval = sbuf_printf(sb, "</targ_port>\n");
|
||||
if (retval != 0)
|
||||
break;
|
||||
@ -4600,6 +4659,9 @@ ctl_alloc_lun(struct ctl_softc *ctl_softc, struct ctl_lun *ctl_lun,
|
||||
be_lun->ctl_lun = lun;
|
||||
be_lun->lun_id = lun_number;
|
||||
atomic_add_int(&be_lun->be->num_luns, 1);
|
||||
if (be_lun->flags & CTL_LUN_FLAG_OFFLINE)
|
||||
lun->flags |= CTL_LUN_OFFLINE;
|
||||
|
||||
if (be_lun->flags & CTL_LUN_FLAG_POWERED_OFF)
|
||||
lun->flags |= CTL_LUN_STOPPED;
|
||||
|
||||
@ -5536,7 +5598,7 @@ ctl_start_stop(struct ctl_scsiio *ctsio)
|
||||
uint32_t residx;
|
||||
|
||||
residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
|
||||
if (!lun->per_res[residx].registered
|
||||
if (lun->pr_keys[residx] == 0
|
||||
|| (lun->pr_res_idx!=residx && lun->res_type < 4)) {
|
||||
|
||||
ctl_set_reservation_conflict(ctsio);
|
||||
@ -5827,7 +5889,7 @@ ctl_read_buffer(struct ctl_scsiio *ctsio)
|
||||
&& residx != lun->pr_res_idx)
|
||||
|| ((lun->res_type == SPR_TYPE_EX_AC_RO
|
||||
|| lun->res_type == SPR_TYPE_EX_AC_AR)
|
||||
&& !lun->per_res[residx].registered)) {
|
||||
&& lun->pr_keys[residx] == 0)) {
|
||||
ctl_set_reservation_conflict(ctsio);
|
||||
ctl_done((union ctl_io *)ctsio);
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
@ -6882,7 +6944,7 @@ ctl_mode_sense(struct ctl_scsiio *ctsio)
|
||||
&& residx != lun->pr_res_idx)
|
||||
|| ((lun->res_type == SPR_TYPE_EX_AC_RO
|
||||
|| lun->res_type == SPR_TYPE_EX_AC_AR)
|
||||
&& !lun->per_res[residx].registered)) {
|
||||
&& lun->pr_keys[residx] == 0)) {
|
||||
ctl_set_reservation_conflict(ctsio);
|
||||
ctl_done((union ctl_io *)ctsio);
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
@ -7326,6 +7388,89 @@ ctl_read_capacity_16(struct ctl_scsiio *ctsio)
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
}
|
||||
|
||||
int
|
||||
ctl_read_defect(struct ctl_scsiio *ctsio)
|
||||
{
|
||||
struct scsi_read_defect_data_10 *ccb10;
|
||||
struct scsi_read_defect_data_12 *ccb12;
|
||||
struct scsi_read_defect_data_hdr_10 *data10;
|
||||
struct scsi_read_defect_data_hdr_12 *data12;
|
||||
struct ctl_lun *lun;
|
||||
uint32_t alloc_len, data_len;
|
||||
uint8_t format;
|
||||
|
||||
CTL_DEBUG_PRINT(("ctl_read_defect\n"));
|
||||
|
||||
lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
|
||||
if (lun->flags & CTL_LUN_PR_RESERVED) {
|
||||
uint32_t residx;
|
||||
|
||||
/*
|
||||
* XXX KDM need a lock here.
|
||||
*/
|
||||
residx = ctl_get_resindex(&ctsio->io_hdr.nexus);
|
||||
if ((lun->res_type == SPR_TYPE_EX_AC
|
||||
&& residx != lun->pr_res_idx)
|
||||
|| ((lun->res_type == SPR_TYPE_EX_AC_RO
|
||||
|| lun->res_type == SPR_TYPE_EX_AC_AR)
|
||||
&& lun->pr_keys[residx] == 0)) {
|
||||
ctl_set_reservation_conflict(ctsio);
|
||||
ctl_done((union ctl_io *)ctsio);
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
}
|
||||
}
|
||||
|
||||
if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
|
||||
ccb10 = (struct scsi_read_defect_data_10 *)&ctsio->cdb;
|
||||
format = ccb10->format;
|
||||
alloc_len = scsi_2btoul(ccb10->alloc_length);
|
||||
data_len = sizeof(*data10);
|
||||
} else {
|
||||
ccb12 = (struct scsi_read_defect_data_12 *)&ctsio->cdb;
|
||||
format = ccb12->format;
|
||||
alloc_len = scsi_4btoul(ccb12->alloc_length);
|
||||
data_len = sizeof(*data12);
|
||||
}
|
||||
if (alloc_len == 0) {
|
||||
ctl_set_success(ctsio);
|
||||
ctl_done((union ctl_io *)ctsio);
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
}
|
||||
|
||||
ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO);
|
||||
if (data_len < alloc_len) {
|
||||
ctsio->residual = alloc_len - data_len;
|
||||
ctsio->kern_data_len = data_len;
|
||||
ctsio->kern_total_len = data_len;
|
||||
} else {
|
||||
ctsio->residual = 0;
|
||||
ctsio->kern_data_len = alloc_len;
|
||||
ctsio->kern_total_len = alloc_len;
|
||||
}
|
||||
ctsio->kern_data_resid = 0;
|
||||
ctsio->kern_rel_offset = 0;
|
||||
ctsio->kern_sg_entries = 0;
|
||||
|
||||
if (ctsio->cdb[0] == READ_DEFECT_DATA_10) {
|
||||
data10 = (struct scsi_read_defect_data_hdr_10 *)
|
||||
ctsio->kern_data_ptr;
|
||||
data10->format = format;
|
||||
scsi_ulto2b(0, data10->length);
|
||||
} else {
|
||||
data12 = (struct scsi_read_defect_data_hdr_12 *)
|
||||
ctsio->kern_data_ptr;
|
||||
data12->format = format;
|
||||
scsi_ulto2b(0, data12->generation);
|
||||
scsi_ulto4b(0, data12->length);
|
||||
}
|
||||
|
||||
ctsio->scsi_status = SCSI_STATUS_OK;
|
||||
ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
|
||||
ctsio->be_move_done = ctl_config_move_done;
|
||||
ctl_datamove((union ctl_io *)ctsio);
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
}
|
||||
|
||||
int
|
||||
ctl_report_tagret_port_groups(struct ctl_scsiio *ctsio)
|
||||
{
|
||||
@ -7825,7 +7970,7 @@ ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
|
||||
lun->pr_key_count, res_keys->header.length);
|
||||
|
||||
for (i = 0, key_count = 0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (!lun->per_res[i].registered)
|
||||
if (lun->pr_keys[i] == 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
@ -7851,10 +7996,8 @@ ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
|
||||
key_count++;
|
||||
continue;
|
||||
}
|
||||
memcpy(res_keys->keys[key_count].key,
|
||||
lun->per_res[i].res_key.key,
|
||||
ctl_min(sizeof(res_keys->keys[key_count].key),
|
||||
sizeof(lun->per_res[i].res_key)));
|
||||
scsi_u64to8b(lun->pr_keys[i],
|
||||
res_keys->keys[key_count].key);
|
||||
key_count++;
|
||||
}
|
||||
break;
|
||||
@ -7905,9 +8048,8 @@ ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
|
||||
* is 0, since it doesn't really matter.
|
||||
*/
|
||||
if (lun->pr_res_idx != CTL_PR_ALL_REGISTRANTS) {
|
||||
memcpy(res->data.reservation,
|
||||
&lun->per_res[lun->pr_res_idx].res_key,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
scsi_u64to8b(lun->pr_keys[lun->pr_res_idx],
|
||||
res->data.reservation);
|
||||
}
|
||||
res->data.scopetype = lun->res_type;
|
||||
break;
|
||||
@ -7958,11 +8100,10 @@ ctl_persistent_reserve_in(struct ctl_scsiio *ctsio)
|
||||
|
||||
res_desc = &res_status->desc[0];
|
||||
for (i = 0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (!lun->per_res[i].registered)
|
||||
if (lun->pr_keys[i] == 0)
|
||||
continue;
|
||||
|
||||
memcpy(&res_desc->res_key, &lun->per_res[i].res_key.key,
|
||||
sizeof(res_desc->res_key));
|
||||
scsi_u64to8b(lun->pr_keys[i], res_desc->res_key.key);
|
||||
if ((lun->flags & CTL_LUN_PR_RESERVED) &&
|
||||
(lun->pr_res_idx == i ||
|
||||
lun->pr_res_idx == CTL_PR_ALL_REGISTRANTS)) {
|
||||
@ -8055,15 +8196,12 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* temporarily unregister this nexus */
|
||||
lun->per_res[residx].registered = 0;
|
||||
|
||||
/*
|
||||
* Unregister everybody else and build UA for
|
||||
* them
|
||||
*/
|
||||
for(i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i].registered == 0)
|
||||
if (i == residx || lun->pr_keys[i] == 0)
|
||||
continue;
|
||||
|
||||
if (!persis_offset
|
||||
@ -8074,11 +8212,8 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
&& i >= persis_offset)
|
||||
lun->pending_ua[i-persis_offset] |=
|
||||
CTL_UA_REG_PREEMPT;
|
||||
lun->per_res[i].registered = 0;
|
||||
memset(&lun->per_res[i].res_key, 0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
lun->pr_keys[i] = 0;
|
||||
}
|
||||
lun->per_res[residx].registered = 1;
|
||||
lun->pr_key_count = 1;
|
||||
lun->res_type = type;
|
||||
if (lun->res_type != SPR_TYPE_WR_EX_AR
|
||||
@ -8142,16 +8277,11 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
}
|
||||
|
||||
for (i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i].registered
|
||||
&& memcmp(param->serv_act_res_key,
|
||||
lun->per_res[i].res_key.key,
|
||||
sizeof(struct scsi_per_res_key)) != 0)
|
||||
if (lun->pr_keys[i] != sa_res_key)
|
||||
continue;
|
||||
|
||||
found = 1;
|
||||
lun->per_res[i].registered = 0;
|
||||
memset(&lun->per_res[i].res_key, 0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
lun->pr_keys[i] = 0;
|
||||
lun->pr_key_count--;
|
||||
|
||||
if (!persis_offset && i < CTL_MAX_INITIATORS)
|
||||
@ -8185,9 +8315,7 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
} else {
|
||||
/* Reserved but not all registrants */
|
||||
/* sa_res_key is res holder */
|
||||
if (memcmp(param->serv_act_res_key,
|
||||
lun->per_res[lun->pr_res_idx].res_key.key,
|
||||
sizeof(struct scsi_per_res_key)) == 0) {
|
||||
if (sa_res_key == lun->pr_keys[lun->pr_res_idx]) {
|
||||
/* validate scope and type */
|
||||
if ((cdb->scope_type & SPR_SCOPE_MASK) !=
|
||||
SPR_LU_SCOPE) {
|
||||
@ -8228,22 +8356,12 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
* except don't unregister the res holder.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Temporarily unregister so it won't get
|
||||
* removed or UA generated
|
||||
*/
|
||||
lun->per_res[residx].registered = 0;
|
||||
for(i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i].registered == 0)
|
||||
if (i == residx || lun->pr_keys[i] == 0)
|
||||
continue;
|
||||
|
||||
if (memcmp(param->serv_act_res_key,
|
||||
lun->per_res[i].res_key.key,
|
||||
sizeof(struct scsi_per_res_key)) == 0) {
|
||||
lun->per_res[i].registered = 0;
|
||||
memset(&lun->per_res[i].res_key,
|
||||
0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
if (sa_res_key == lun->pr_keys[i]) {
|
||||
lun->pr_keys[i] = 0;
|
||||
lun->pr_key_count--;
|
||||
|
||||
if (!persis_offset
|
||||
@ -8268,7 +8386,6 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
CTL_UA_RES_RELEASE;
|
||||
}
|
||||
}
|
||||
lun->per_res[residx].registered = 1;
|
||||
lun->res_type = type;
|
||||
if (lun->res_type != SPR_TYPE_WR_EX_AR
|
||||
&& lun->res_type != SPR_TYPE_EX_AC_AR)
|
||||
@ -8299,15 +8416,11 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
int found=0;
|
||||
|
||||
for (i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (memcmp(param->serv_act_res_key,
|
||||
lun->per_res[i].res_key.key,
|
||||
sizeof(struct scsi_per_res_key)) != 0)
|
||||
if (sa_res_key != lun->pr_keys[i])
|
||||
continue;
|
||||
|
||||
found = 1;
|
||||
lun->per_res[i].registered = 0;
|
||||
memset(&lun->per_res[i].res_key, 0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
lun->pr_keys[i] = 0;
|
||||
lun->pr_key_count--;
|
||||
|
||||
if (!persis_offset
|
||||
@ -8354,26 +8467,22 @@ ctl_pro_preempt(struct ctl_softc *softc, struct ctl_lun *lun, uint64_t res_key,
|
||||
static void
|
||||
ctl_pro_preempt_other(struct ctl_lun *lun, union ctl_ha_msg *msg)
|
||||
{
|
||||
uint64_t sa_res_key;
|
||||
int i;
|
||||
|
||||
sa_res_key = scsi_8btou64(msg->pr.pr_info.sa_res_key);
|
||||
|
||||
if (lun->pr_res_idx == CTL_PR_ALL_REGISTRANTS
|
||||
|| lun->pr_res_idx == CTL_PR_NO_RESERVATION
|
||||
|| memcmp(&lun->per_res[lun->pr_res_idx].res_key,
|
||||
msg->pr.pr_info.sa_res_key,
|
||||
sizeof(struct scsi_per_res_key)) != 0) {
|
||||
uint64_t sa_res_key;
|
||||
sa_res_key = scsi_8btou64(msg->pr.pr_info.sa_res_key);
|
||||
|
||||
|| sa_res_key != lun->pr_keys[lun->pr_res_idx]) {
|
||||
if (sa_res_key == 0) {
|
||||
/* temporarily unregister this nexus */
|
||||
lun->per_res[msg->pr.pr_info.residx].registered = 0;
|
||||
|
||||
/*
|
||||
* Unregister everybody else and build UA for
|
||||
* them
|
||||
*/
|
||||
for(i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i].registered == 0)
|
||||
if (i == msg->pr.pr_info.residx ||
|
||||
lun->pr_keys[i] == 0)
|
||||
continue;
|
||||
|
||||
if (!persis_offset
|
||||
@ -8383,12 +8492,9 @@ ctl_pro_preempt_other(struct ctl_lun *lun, union ctl_ha_msg *msg)
|
||||
else if (persis_offset && i >= persis_offset)
|
||||
lun->pending_ua[i - persis_offset] |=
|
||||
CTL_UA_REG_PREEMPT;
|
||||
lun->per_res[i].registered = 0;
|
||||
memset(&lun->per_res[i].res_key, 0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
lun->pr_keys[i] = 0;
|
||||
}
|
||||
|
||||
lun->per_res[msg->pr.pr_info.residx].registered = 1;
|
||||
lun->pr_key_count = 1;
|
||||
lun->res_type = msg->pr.pr_info.res_type;
|
||||
if (lun->res_type != SPR_TYPE_WR_EX_AR
|
||||
@ -8396,14 +8502,10 @@ ctl_pro_preempt_other(struct ctl_lun *lun, union ctl_ha_msg *msg)
|
||||
lun->pr_res_idx = msg->pr.pr_info.residx;
|
||||
} else {
|
||||
for (i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (memcmp(msg->pr.pr_info.sa_res_key,
|
||||
lun->per_res[i].res_key.key,
|
||||
sizeof(struct scsi_per_res_key)) != 0)
|
||||
if (sa_res_key == lun->pr_keys[i])
|
||||
continue;
|
||||
|
||||
lun->per_res[i].registered = 0;
|
||||
memset(&lun->per_res[i].res_key, 0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
lun->pr_keys[i] = 0;
|
||||
lun->pr_key_count--;
|
||||
|
||||
if (!persis_offset
|
||||
@ -8417,21 +8519,13 @@ ctl_pro_preempt_other(struct ctl_lun *lun, union ctl_ha_msg *msg)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Temporarily unregister so it won't get removed
|
||||
* or UA generated
|
||||
*/
|
||||
lun->per_res[msg->pr.pr_info.residx].registered = 0;
|
||||
for (i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i].registered == 0)
|
||||
if (i == msg->pr.pr_info.residx ||
|
||||
lun->pr_keys[i] == 0)
|
||||
continue;
|
||||
|
||||
if (memcmp(msg->pr.pr_info.sa_res_key,
|
||||
lun->per_res[i].res_key.key,
|
||||
sizeof(struct scsi_per_res_key)) == 0) {
|
||||
lun->per_res[i].registered = 0;
|
||||
memset(&lun->per_res[i].res_key, 0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
if (sa_res_key == lun->pr_keys[i]) {
|
||||
lun->pr_keys[i] = 0;
|
||||
lun->pr_key_count--;
|
||||
if (!persis_offset
|
||||
&& i < CTL_MAX_INITIATORS)
|
||||
@ -8454,7 +8548,6 @@ ctl_pro_preempt_other(struct ctl_lun *lun, union ctl_ha_msg *msg)
|
||||
CTL_UA_RES_RELEASE;
|
||||
}
|
||||
}
|
||||
lun->per_res[msg->pr.pr_info.residx].registered = 1;
|
||||
lun->res_type = msg->pr.pr_info.res_type;
|
||||
if (lun->res_type != SPR_TYPE_WR_EX_AR
|
||||
&& lun->res_type != SPR_TYPE_EX_AC_AR)
|
||||
@ -8552,11 +8645,8 @@ ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
|
||||
*/
|
||||
if ((cdb->action & SPRO_ACTION_MASK) != SPRO_REG_IGNO) {
|
||||
mtx_lock(&lun->lun_lock);
|
||||
if (lun->per_res[residx].registered) {
|
||||
if (memcmp(param->res_key.key,
|
||||
lun->per_res[residx].res_key.key,
|
||||
ctl_min(sizeof(param->res_key),
|
||||
sizeof(lun->per_res[residx].res_key))) != 0) {
|
||||
if (lun->pr_keys[residx] != 0) {
|
||||
if (res_key != lun->pr_keys[residx]) {
|
||||
/*
|
||||
* The current key passed in doesn't match
|
||||
* the one the initiator previously
|
||||
@ -8637,14 +8727,12 @@ ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
|
||||
if ((res_key == 0
|
||||
&& (cdb->action & SPRO_ACTION_MASK) == SPRO_REGISTER)
|
||||
|| ((cdb->action & SPRO_ACTION_MASK) == SPRO_REG_IGNO
|
||||
&& !lun->per_res[residx].registered)) {
|
||||
&& lun->pr_keys[residx] == 0)) {
|
||||
mtx_unlock(&lun->lun_lock);
|
||||
goto done;
|
||||
}
|
||||
|
||||
lun->per_res[residx].registered = 0;
|
||||
memset(&lun->per_res[residx].res_key,
|
||||
0, sizeof(lun->per_res[residx].res_key));
|
||||
lun->pr_keys[residx] = 0;
|
||||
lun->pr_key_count--;
|
||||
|
||||
if (residx == lun->pr_res_idx) {
|
||||
@ -8663,9 +8751,8 @@ ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
|
||||
*/
|
||||
|
||||
for (i = 0; i < CTL_MAX_INITIATORS;i++){
|
||||
if (lun->per_res[
|
||||
i+persis_offset].registered
|
||||
== 0)
|
||||
if (lun->pr_keys[
|
||||
i + persis_offset] == 0)
|
||||
continue;
|
||||
lun->pending_ua[i] |=
|
||||
CTL_UA_RES_RELEASE;
|
||||
@ -8695,15 +8782,9 @@ ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
|
||||
* If we aren't registered currently then increment
|
||||
* the key count and set the registered flag.
|
||||
*/
|
||||
if (!lun->per_res[residx].registered) {
|
||||
if (lun->pr_keys[residx] == 0)
|
||||
lun->pr_key_count++;
|
||||
lun->per_res[residx].registered = 1;
|
||||
}
|
||||
|
||||
memcpy(&lun->per_res[residx].res_key,
|
||||
param->serv_act_res_key,
|
||||
ctl_min(sizeof(param->serv_act_res_key),
|
||||
sizeof(lun->per_res[residx].res_key)));
|
||||
lun->pr_keys[residx] = sa_res_key;
|
||||
|
||||
persis_io.hdr.nexus = ctsio->io_hdr.nexus;
|
||||
persis_io.hdr.msg_type = CTL_MSG_PERS_ACTION;
|
||||
@ -8816,20 +8897,12 @@ ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
|
||||
*/
|
||||
if (type != SPR_TYPE_EX_AC
|
||||
&& type != SPR_TYPE_WR_EX) {
|
||||
/*
|
||||
* temporarily unregister so we don't generate UA
|
||||
*/
|
||||
lun->per_res[residx].registered = 0;
|
||||
|
||||
for (i = 0; i < CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i+persis_offset].registered
|
||||
== 0)
|
||||
if (i == residx ||
|
||||
lun->pr_keys[i + persis_offset] == 0)
|
||||
continue;
|
||||
lun->pending_ua[i] |=
|
||||
CTL_UA_RES_RELEASE;
|
||||
lun->pending_ua[i] |= CTL_UA_RES_RELEASE;
|
||||
}
|
||||
|
||||
lun->per_res[residx].registered = 1;
|
||||
}
|
||||
mtx_unlock(&lun->lun_lock);
|
||||
/* Send msg to other side */
|
||||
@ -8852,13 +8925,10 @@ ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
|
||||
lun->pr_key_count = 0;
|
||||
lun->pr_res_idx = CTL_PR_NO_RESERVATION;
|
||||
|
||||
|
||||
memset(&lun->per_res[residx].res_key,
|
||||
0, sizeof(lun->per_res[residx].res_key));
|
||||
lun->per_res[residx].registered = 0;
|
||||
lun->pr_keys[residx] = 0;
|
||||
|
||||
for (i=0; i < 2*CTL_MAX_INITIATORS; i++)
|
||||
if (lun->per_res[i].registered) {
|
||||
if (lun->pr_keys[i] != 0) {
|
||||
if (!persis_offset && i < CTL_MAX_INITIATORS)
|
||||
lun->pending_ua[i] |=
|
||||
CTL_UA_RES_PREEMPT;
|
||||
@ -8866,9 +8936,7 @@ ctl_persistent_reserve_out(struct ctl_scsiio *ctsio)
|
||||
lun->pending_ua[i-persis_offset] |=
|
||||
CTL_UA_RES_PREEMPT;
|
||||
|
||||
memset(&lun->per_res[i].res_key,
|
||||
0, sizeof(struct scsi_per_res_key));
|
||||
lun->per_res[i].registered = 0;
|
||||
lun->pr_keys[i] = 0;
|
||||
}
|
||||
lun->PRGeneration++;
|
||||
mtx_unlock(&lun->lun_lock);
|
||||
@ -8924,20 +8992,15 @@ ctl_hndl_per_res_out_on_other_sc(union ctl_ha_msg *msg)
|
||||
mtx_lock(&lun->lun_lock);
|
||||
switch(msg->pr.pr_info.action) {
|
||||
case CTL_PR_REG_KEY:
|
||||
if (!lun->per_res[msg->pr.pr_info.residx].registered) {
|
||||
lun->per_res[msg->pr.pr_info.residx].registered = 1;
|
||||
if (lun->pr_keys[msg->pr.pr_info.residx] == 0)
|
||||
lun->pr_key_count++;
|
||||
}
|
||||
lun->pr_keys[msg->pr.pr_info.residx] =
|
||||
scsi_8btou64(msg->pr.pr_info.sa_res_key);
|
||||
lun->PRGeneration++;
|
||||
memcpy(&lun->per_res[msg->pr.pr_info.residx].res_key,
|
||||
msg->pr.pr_info.sa_res_key,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
break;
|
||||
|
||||
case CTL_PR_UNREG_KEY:
|
||||
lun->per_res[msg->pr.pr_info.residx].registered = 0;
|
||||
memset(&lun->per_res[msg->pr.pr_info.residx].res_key,
|
||||
0, sizeof(struct scsi_per_res_key));
|
||||
lun->pr_keys[msg->pr.pr_info.residx] = 0;
|
||||
lun->pr_key_count--;
|
||||
|
||||
/* XXX Need to see if the reservation has been released */
|
||||
@ -8958,8 +9021,8 @@ ctl_hndl_per_res_out_on_other_sc(union ctl_ha_msg *msg)
|
||||
*/
|
||||
|
||||
for (i = 0; i < CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i+
|
||||
persis_offset].registered == 0)
|
||||
if (lun->pr_keys[i+
|
||||
persis_offset] == 0)
|
||||
continue;
|
||||
|
||||
lun->pending_ua[i] |=
|
||||
@ -8992,7 +9055,7 @@ ctl_hndl_per_res_out_on_other_sc(union ctl_ha_msg *msg)
|
||||
if (lun->res_type != SPR_TYPE_EX_AC
|
||||
&& lun->res_type != SPR_TYPE_WR_EX) {
|
||||
for (i = 0; i < CTL_MAX_INITIATORS; i++)
|
||||
if (lun->per_res[i+persis_offset].registered)
|
||||
if (lun->pr_keys[i+persis_offset] != 0)
|
||||
lun->pending_ua[i] |=
|
||||
CTL_UA_RES_RELEASE;
|
||||
}
|
||||
@ -9012,7 +9075,7 @@ ctl_hndl_per_res_out_on_other_sc(union ctl_ha_msg *msg)
|
||||
lun->pr_res_idx = CTL_PR_NO_RESERVATION;
|
||||
|
||||
for (i=0; i < 2*CTL_MAX_INITIATORS; i++) {
|
||||
if (lun->per_res[i].registered == 0)
|
||||
if (lun->pr_keys[i] == 0)
|
||||
continue;
|
||||
if (!persis_offset
|
||||
&& i < CTL_MAX_INITIATORS)
|
||||
@ -9021,9 +9084,7 @@ ctl_hndl_per_res_out_on_other_sc(union ctl_ha_msg *msg)
|
||||
&& i >= persis_offset)
|
||||
lun->pending_ua[i-persis_offset] |=
|
||||
CTL_UA_RES_PREEMPT;
|
||||
memset(&lun->per_res[i].res_key, 0,
|
||||
sizeof(struct scsi_per_res_key));
|
||||
lun->per_res[i].registered = 0;
|
||||
lun->pr_keys[i] = 0;
|
||||
}
|
||||
lun->PRGeneration++;
|
||||
break;
|
||||
@ -9062,7 +9123,7 @@ ctl_read_write(struct ctl_scsiio *ctsio)
|
||||
&& residx != lun->pr_res_idx)
|
||||
|| ((lun->res_type == SPR_TYPE_EX_AC_RO
|
||||
|| lun->res_type == SPR_TYPE_EX_AC_AR)
|
||||
&& !lun->per_res[residx].registered)) {
|
||||
&& lun->pr_keys[residx] == 0)) {
|
||||
ctl_set_reservation_conflict(ctsio);
|
||||
ctl_done((union ctl_io *)ctsio);
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
@ -10760,15 +10821,9 @@ ctl_inquiry_std(struct ctl_scsiio *ctsio)
|
||||
}
|
||||
|
||||
ctsio->scsi_status = SCSI_STATUS_OK;
|
||||
if (ctsio->kern_data_len > 0) {
|
||||
ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
|
||||
ctsio->be_move_done = ctl_config_move_done;
|
||||
ctl_datamove((union ctl_io *)ctsio);
|
||||
} else {
|
||||
ctsio->io_hdr.status = CTL_SUCCESS;
|
||||
ctl_done((union ctl_io *)ctsio);
|
||||
}
|
||||
|
||||
ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;
|
||||
ctsio->be_move_done = ctl_config_move_done;
|
||||
ctl_datamove((union ctl_io *)ctsio);
|
||||
return (CTL_RETVAL_COMPLETE);
|
||||
}
|
||||
|
||||
@ -11379,7 +11434,7 @@ ctl_scsiio_lun_check(struct ctl_softc *ctl_softc, struct ctl_lun *lun,
|
||||
* type reservations are checked in the particular command
|
||||
* for a conflict. Read and SSU are the only ones.
|
||||
*/
|
||||
if (!lun->per_res[residx].registered
|
||||
if (lun->pr_keys[residx] == 0
|
||||
|| (residx != lun->pr_res_idx && lun->res_type < 4)) {
|
||||
ctsio->scsi_status = SCSI_STATUS_RESERV_CONFLICT;
|
||||
ctsio->io_hdr.status = CTL_SCSI_ERROR;
|
||||
@ -12840,6 +12895,12 @@ ctl_datamove(union ctl_io *io)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Don't confuse frontend with zero length data move. */
|
||||
if (io->scsiio.kern_data_len == 0) {
|
||||
io->scsiio.be_move_done(io);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we're in XFER mode and this I/O is from the other shelf
|
||||
* controller, we need to send the DMA to the other side to
|
||||
|
@ -73,6 +73,8 @@
|
||||
* The DEV_TYPE flag tells us that the device_type field is filled in.
|
||||
*
|
||||
* 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,
|
||||
@ -82,7 +84,8 @@ typedef enum {
|
||||
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_UNMAP = 0x80,
|
||||
CTL_LUN_FLAG_OFFLINE = 0x100
|
||||
} ctl_backend_lun_flags;
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
@ -151,6 +151,7 @@ typedef void (*cbb_dispatch_t)(struct ctl_be_block_lun *be_lun,
|
||||
* and a backend block LUN, and between a backend block LUN and a CTL LUN.
|
||||
*/
|
||||
struct ctl_be_block_lun {
|
||||
struct ctl_lun_create_params params;
|
||||
struct ctl_block_disk *disk;
|
||||
char lunname[32];
|
||||
char *dev_path;
|
||||
@ -1521,7 +1522,7 @@ ctl_be_block_ioctl(struct cdev *dev, u_long cmd, caddr_t addr,
|
||||
default:
|
||||
lun_req->status = CTL_LUN_ERROR;
|
||||
snprintf(lun_req->error_str, sizeof(lun_req->error_str),
|
||||
"%s: invalid LUN request type %d", __func__,
|
||||
"invalid LUN request type %d",
|
||||
lun_req->reqtype);
|
||||
break;
|
||||
}
|
||||
@ -1541,11 +1542,12 @@ ctl_be_block_open_file(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
struct ctl_be_block_filedata *file_data;
|
||||
struct ctl_lun_create_params *params;
|
||||
struct vattr vattr;
|
||||
off_t pss;
|
||||
int error;
|
||||
|
||||
error = 0;
|
||||
file_data = &be_lun->backend.file;
|
||||
params = &req->reqdata.create;
|
||||
params = &be_lun->params;
|
||||
|
||||
be_lun->dev_type = CTL_BE_BLOCK_FILE;
|
||||
be_lun->dispatch = ctl_be_block_dispatch_file;
|
||||
@ -1589,21 +1591,21 @@ ctl_be_block_open_file(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
be_lun->flags |= CTL_BE_BLOCK_LUN_MULTI_THREAD;
|
||||
|
||||
/*
|
||||
* XXX KDM vattr.va_blocksize may be larger than 512 bytes here.
|
||||
* With ZFS, it is 131072 bytes. Block sizes that large don't work
|
||||
* with disklabel and UFS on FreeBSD at least. Large block sizes
|
||||
* may not work with other OSes as well. So just export a sector
|
||||
* size of 512 bytes, which should work with any OS or
|
||||
* application. Since our backing is a file, any block size will
|
||||
* work fine for the backing store.
|
||||
* For files we can use any logical block size. Prefer 512 bytes
|
||||
* for compatibility reasons. If file's vattr.va_blocksize
|
||||
* (preferred I/O block size) is bigger and multiple to chosen
|
||||
* logical block size -- report it as physical block size.
|
||||
*/
|
||||
#if 0
|
||||
be_lun->blocksize= vattr.va_blocksize;
|
||||
#endif
|
||||
if (params->blocksize_bytes != 0)
|
||||
be_lun->blocksize = params->blocksize_bytes;
|
||||
else
|
||||
be_lun->blocksize = 512;
|
||||
pss = vattr.va_blocksize / be_lun->blocksize;
|
||||
if ((pss > 0) && (pss * be_lun->blocksize == vattr.va_blocksize) &&
|
||||
((pss & (pss - 1)) == 0)) {
|
||||
be_lun->pblockexp = fls(pss) - 1;
|
||||
be_lun->pblockoff = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sanity check. The media size has to be at least one
|
||||
@ -1628,7 +1630,7 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
int error;
|
||||
off_t ps, pss, po, pos;
|
||||
|
||||
params = &req->reqdata.create;
|
||||
params = &be_lun->params;
|
||||
|
||||
be_lun->dev_type = CTL_BE_BLOCK_DEV;
|
||||
be_lun->backend.dev.cdev = be_lun->vn->v_rdev;
|
||||
@ -1646,8 +1648,8 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
error = VOP_GETATTR(be_lun->vn, &vattr, NOCRED);
|
||||
if (error) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error getting vnode attributes for device %s",
|
||||
__func__, be_lun->dev_path);
|
||||
"error getting vnode attributes for device %s",
|
||||
be_lun->dev_path);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -1655,7 +1657,7 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
devsw = dev->si_devsw;
|
||||
if (!devsw->d_ioctl) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: no d_ioctl for device %s!", __func__,
|
||||
"no d_ioctl for device %s!",
|
||||
be_lun->dev_path);
|
||||
return (ENODEV);
|
||||
}
|
||||
@ -1665,8 +1667,8 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
curthread);
|
||||
if (error) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error %d returned for DIOCGSECTORSIZE ioctl "
|
||||
"on %s!", __func__, error, be_lun->dev_path);
|
||||
"error %d returned for DIOCGSECTORSIZE ioctl "
|
||||
"on %s!", error, be_lun->dev_path);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -1688,9 +1690,9 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
be_lun->blocksize = params->blocksize_bytes;
|
||||
} else {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: requested blocksize %u is not an even "
|
||||
"requested blocksize %u is not an even "
|
||||
"multiple of backing device blocksize %u",
|
||||
__func__, params->blocksize_bytes,
|
||||
params->blocksize_bytes,
|
||||
be_lun->blocksize);
|
||||
return (EINVAL);
|
||||
|
||||
@ -1698,8 +1700,8 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
} else if ((params->blocksize_bytes != 0)
|
||||
&& (params->blocksize_bytes != be_lun->blocksize)) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: requested blocksize %u < backing device "
|
||||
"blocksize %u", __func__, params->blocksize_bytes,
|
||||
"requested blocksize %u < backing device "
|
||||
"blocksize %u", params->blocksize_bytes,
|
||||
be_lun->blocksize);
|
||||
return (EINVAL);
|
||||
}
|
||||
@ -1709,8 +1711,8 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
curthread);
|
||||
if (error) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error %d returned for DIOCGMEDIASIZE "
|
||||
" ioctl on %s!", __func__, error,
|
||||
"error %d returned for DIOCGMEDIASIZE "
|
||||
" ioctl on %s!", error,
|
||||
be_lun->dev_path);
|
||||
return (error);
|
||||
}
|
||||
@ -1718,8 +1720,8 @@ ctl_be_block_open_dev(struct ctl_be_block_lun *be_lun, struct ctl_lun_req *req)
|
||||
if (params->lun_size_bytes != 0) {
|
||||
if (params->lun_size_bytes > be_lun->size_bytes) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: requested LUN size %ju > backing device "
|
||||
"size %ju", __func__,
|
||||
"requested LUN size %ju > backing device "
|
||||
"size %ju",
|
||||
(uintmax_t)params->lun_size_bytes,
|
||||
(uintmax_t)be_lun->size_bytes);
|
||||
return (EINVAL);
|
||||
@ -1792,6 +1794,7 @@ ctl_be_block_close(struct ctl_be_block_lun *be_lun)
|
||||
panic("Unexpected backend type.");
|
||||
break;
|
||||
}
|
||||
be_lun->dev_type = CTL_BE_BLOCK_NONE;
|
||||
}
|
||||
PICKUP_GIANT();
|
||||
|
||||
@ -1814,7 +1817,7 @@ ctl_be_block_open(struct ctl_be_block_softc *softc,
|
||||
|
||||
if (rootvnode == NULL) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: Root filesystem is not mounted", __func__);
|
||||
"Root filesystem is not mounted");
|
||||
return (1);
|
||||
}
|
||||
|
||||
@ -1858,7 +1861,7 @@ ctl_be_block_open(struct ctl_be_block_softc *softc,
|
||||
}
|
||||
}
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error opening %s", __func__, be_lun->dev_path);
|
||||
"error opening %s: %d", be_lun->dev_path, error);
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -1902,11 +1905,13 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
params = &req->reqdata.create;
|
||||
retval = 0;
|
||||
req->status = CTL_LUN_OK;
|
||||
|
||||
num_threads = cbb_num_threads;
|
||||
|
||||
be_lun = malloc(sizeof(*be_lun), M_CTLBLK, M_ZERO | M_WAITOK);
|
||||
|
||||
be_lun->params = req->reqdata.create;
|
||||
be_lun->softc = softc;
|
||||
STAILQ_INIT(&be_lun->input_queue);
|
||||
STAILQ_INIT(&be_lun->config_write_queue);
|
||||
@ -1922,7 +1927,7 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
if (be_lun->lun_zone == NULL) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error allocating UMA zone", __func__);
|
||||
"error allocating UMA zone");
|
||||
goto bailout_error;
|
||||
}
|
||||
|
||||
@ -1935,26 +1940,18 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
value = ctl_get_opt(&be_lun->ctl_be_lun.options, "file");
|
||||
if (value == NULL) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: no file argument specified", __func__);
|
||||
"no file argument specified");
|
||||
goto bailout_error;
|
||||
}
|
||||
be_lun->dev_path = strdup(value, M_CTLBLK);
|
||||
be_lun->blocksize = 512;
|
||||
be_lun->blocksize_shift = fls(be_lun->blocksize) - 1;
|
||||
|
||||
retval = ctl_be_block_open(softc, be_lun, req);
|
||||
if (retval != 0) {
|
||||
retval = 0;
|
||||
goto bailout_error;
|
||||
req->status = CTL_LUN_WARNING;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tell the user the size of the file/device.
|
||||
*/
|
||||
params->lun_size_bytes = be_lun->size_bytes;
|
||||
|
||||
/*
|
||||
* The maximum LBA is the size - 1.
|
||||
*/
|
||||
be_lun->ctl_be_lun.maxlba = be_lun->size_blocks - 1;
|
||||
} else {
|
||||
/*
|
||||
* For processor devices, we don't have any size.
|
||||
@ -1965,7 +1962,6 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
be_lun->size_blocks = 0;
|
||||
be_lun->size_bytes = 0;
|
||||
be_lun->ctl_be_lun.maxlba = 0;
|
||||
params->lun_size_bytes = 0;
|
||||
|
||||
/*
|
||||
* Default to just 1 thread for processor devices.
|
||||
@ -1988,8 +1984,8 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
*/
|
||||
if (tmp_num_threads < 1) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: invalid number of threads %s",
|
||||
__func__, num_thread_str);
|
||||
"invalid number of threads %s",
|
||||
num_thread_str);
|
||||
goto bailout_error;
|
||||
}
|
||||
num_threads = tmp_num_threads;
|
||||
@ -2001,16 +1997,22 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
be_lun->flags = CTL_BE_BLOCK_LUN_UNCONFIGURED;
|
||||
be_lun->ctl_be_lun.flags = CTL_LUN_FLAG_PRIMARY;
|
||||
if (be_lun->vn == NULL)
|
||||
be_lun->ctl_be_lun.flags |= CTL_LUN_FLAG_OFFLINE;
|
||||
if (unmap)
|
||||
be_lun->ctl_be_lun.flags |= CTL_LUN_FLAG_UNMAP;
|
||||
if (be_lun->dispatch == ctl_be_block_dispatch_zvol)
|
||||
be_lun->ctl_be_lun.atomicblock = CTLBLK_MAX_IO_SIZE /
|
||||
be_lun->blocksize;
|
||||
be_lun->ctl_be_lun.be_lun = be_lun;
|
||||
be_lun->ctl_be_lun.maxlba = (be_lun->size_blocks == 0) ?
|
||||
0 : (be_lun->size_blocks - 1);
|
||||
be_lun->ctl_be_lun.blocksize = be_lun->blocksize;
|
||||
be_lun->ctl_be_lun.pblockexp = be_lun->pblockexp;
|
||||
be_lun->ctl_be_lun.pblockoff = be_lun->pblockoff;
|
||||
if (be_lun->dispatch == ctl_be_block_dispatch_zvol &&
|
||||
be_lun->blocksize != 0)
|
||||
be_lun->ctl_be_lun.atomicblock = CTLBLK_MAX_IO_SIZE /
|
||||
be_lun->blocksize;
|
||||
/* Tell the user the blocksize we ended up using */
|
||||
params->lun_size_bytes = be_lun->size_bytes;
|
||||
params->blocksize_bytes = be_lun->blocksize;
|
||||
if (params->flags & CTL_LUN_FLAG_ID_REQ) {
|
||||
be_lun->ctl_be_lun.req_lun_id = params->req_lun_id;
|
||||
@ -2062,7 +2064,7 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
if (be_lun->io_taskqueue == NULL) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: Unable to create taskqueue", __func__);
|
||||
"unable to create taskqueue");
|
||||
goto bailout_error;
|
||||
}
|
||||
|
||||
@ -2105,8 +2107,8 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
softc->num_luns--;
|
||||
mtx_unlock(&softc->lock);
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: ctl_add_lun() returned error %d, see dmesg for "
|
||||
"details", __func__, retval);
|
||||
"ctl_add_lun() returned error %d, see dmesg for "
|
||||
"details", retval);
|
||||
retval = 0;
|
||||
goto bailout_error;
|
||||
}
|
||||
@ -2128,8 +2130,7 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
if (be_lun->flags & CTL_BE_BLOCK_LUN_CONFIG_ERR) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: LUN configuration error, see dmesg for details",
|
||||
__func__);
|
||||
"LUN configuration error, see dmesg for details");
|
||||
STAILQ_REMOVE(&softc->lun_list, be_lun, ctl_be_block_lun,
|
||||
links);
|
||||
softc->num_luns--;
|
||||
@ -2148,9 +2149,6 @@ ctl_be_block_create(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
| DEVSTAT_TYPE_IF_OTHER,
|
||||
DEVSTAT_PRIORITY_OTHER);
|
||||
|
||||
|
||||
req->status = CTL_LUN_OK;
|
||||
|
||||
return (retval);
|
||||
|
||||
bailout_error:
|
||||
@ -2192,8 +2190,8 @@ ctl_be_block_rm(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
if (be_lun == NULL) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: LUN %u is not managed by the block backend",
|
||||
__func__, params->lun_id);
|
||||
"LUN %u is not managed by the block backend",
|
||||
params->lun_id);
|
||||
goto bailout_error;
|
||||
}
|
||||
|
||||
@ -2201,8 +2199,8 @@ ctl_be_block_rm(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
if (retval != 0) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error %d returned from ctl_disable_lun() for "
|
||||
"LUN %d", __func__, retval, params->lun_id);
|
||||
"error %d returned from ctl_disable_lun() for "
|
||||
"LUN %d", retval, params->lun_id);
|
||||
goto bailout_error;
|
||||
|
||||
}
|
||||
@ -2210,8 +2208,8 @@ ctl_be_block_rm(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
retval = ctl_invalidate_lun(&be_lun->ctl_be_lun);
|
||||
if (retval != 0) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error %d returned from ctl_invalidate_lun() for "
|
||||
"LUN %d", __func__, retval, params->lun_id);
|
||||
"error %d returned from ctl_invalidate_lun() for "
|
||||
"LUN %d", retval, params->lun_id);
|
||||
goto bailout_error;
|
||||
}
|
||||
|
||||
@ -2229,8 +2227,7 @@ ctl_be_block_rm(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
if ((be_lun->flags & CTL_BE_BLOCK_LUN_UNCONFIGURED) == 0) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: interrupted waiting for LUN to be freed",
|
||||
__func__);
|
||||
"interrupted waiting for LUN to be freed");
|
||||
mtx_unlock(&softc->lock);
|
||||
goto bailout_error;
|
||||
}
|
||||
@ -2274,9 +2271,7 @@ ctl_be_block_modify_file(struct ctl_be_block_lun *be_lun,
|
||||
{
|
||||
struct vattr vattr;
|
||||
int error;
|
||||
struct ctl_lun_modify_params *params;
|
||||
|
||||
params = &req->reqdata.modify;
|
||||
struct ctl_lun_create_params *params = &be_lun->params;
|
||||
|
||||
if (params->lun_size_bytes != 0) {
|
||||
be_lun->size_bytes = params->lun_size_bytes;
|
||||
@ -2303,16 +2298,13 @@ ctl_be_block_modify_dev(struct ctl_be_block_lun *be_lun,
|
||||
{
|
||||
struct ctl_be_block_devdata *dev_data;
|
||||
int error;
|
||||
struct ctl_lun_modify_params *params;
|
||||
struct ctl_lun_create_params *params = &be_lun->params;
|
||||
uint64_t size_bytes;
|
||||
|
||||
params = &req->reqdata.modify;
|
||||
|
||||
dev_data = &be_lun->backend.dev;
|
||||
if (!dev_data->csw->d_ioctl) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: no d_ioctl for device %s!", __func__,
|
||||
be_lun->dev_path);
|
||||
"no d_ioctl for device %s!", be_lun->dev_path);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
@ -2321,16 +2313,16 @@ ctl_be_block_modify_dev(struct ctl_be_block_lun *be_lun,
|
||||
curthread);
|
||||
if (error) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: error %d returned for DIOCGMEDIASIZE ioctl "
|
||||
"on %s!", __func__, error, be_lun->dev_path);
|
||||
"error %d returned for DIOCGMEDIASIZE ioctl "
|
||||
"on %s!", error, be_lun->dev_path);
|
||||
return (error);
|
||||
}
|
||||
|
||||
if (params->lun_size_bytes != 0) {
|
||||
if (params->lun_size_bytes > size_bytes) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: requested LUN size %ju > backing device "
|
||||
"size %ju", __func__,
|
||||
"requested LUN size %ju > backing device "
|
||||
"size %ju",
|
||||
(uintmax_t)params->lun_size_bytes,
|
||||
(uintmax_t)size_bytes);
|
||||
return (EINVAL);
|
||||
@ -2355,9 +2347,7 @@ ctl_be_block_modify(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
params = &req->reqdata.modify;
|
||||
|
||||
mtx_lock(&softc->lock);
|
||||
|
||||
be_lun = NULL;
|
||||
|
||||
STAILQ_FOREACH(be_lun, &softc->lun_list, links) {
|
||||
if (be_lun->ctl_be_lun.lun_id == params->lun_id)
|
||||
break;
|
||||
@ -2366,29 +2356,22 @@ ctl_be_block_modify(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
|
||||
if (be_lun == NULL) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: LUN %u is not managed by the block backend",
|
||||
__func__, params->lun_id);
|
||||
"LUN %u is not managed by the block backend",
|
||||
params->lun_id);
|
||||
goto bailout_error;
|
||||
}
|
||||
|
||||
if (params->lun_size_bytes != 0) {
|
||||
if (params->lun_size_bytes < be_lun->blocksize) {
|
||||
snprintf(req->error_str, sizeof(req->error_str),
|
||||
"%s: LUN size %ju < blocksize %u", __func__,
|
||||
params->lun_size_bytes, be_lun->blocksize);
|
||||
goto bailout_error;
|
||||
}
|
||||
}
|
||||
be_lun->params.lun_size_bytes = params->lun_size_bytes;
|
||||
|
||||
oldsize = be_lun->size_bytes;
|
||||
if (be_lun->vn->v_type == VREG)
|
||||
oldsize = be_lun->size_blocks;
|
||||
if (be_lun->vn == NULL)
|
||||
error = ctl_be_block_open(softc, be_lun, req);
|
||||
else if (be_lun->vn->v_type == VREG)
|
||||
error = ctl_be_block_modify_file(be_lun, req);
|
||||
else
|
||||
error = ctl_be_block_modify_dev(be_lun, req);
|
||||
if (error != 0)
|
||||
goto bailout_error;
|
||||
|
||||
if (be_lun->size_bytes != oldsize) {
|
||||
if (error == 0 && be_lun->size_blocks != oldsize) {
|
||||
be_lun->size_blocks = be_lun->size_bytes >>
|
||||
be_lun->blocksize_shift;
|
||||
|
||||
@ -2398,14 +2381,24 @@ ctl_be_block_modify(struct ctl_be_block_softc *softc, struct ctl_lun_req *req)
|
||||
* XXX: Note that this field is being updated without locking,
|
||||
* which might cause problems on 32-bit architectures.
|
||||
*/
|
||||
be_lun->ctl_be_lun.maxlba = be_lun->size_blocks - 1;
|
||||
be_lun->ctl_be_lun.maxlba = (be_lun->size_blocks == 0) ?
|
||||
0 : (be_lun->size_blocks - 1);
|
||||
be_lun->ctl_be_lun.blocksize = be_lun->blocksize;
|
||||
be_lun->ctl_be_lun.pblockexp = be_lun->pblockexp;
|
||||
be_lun->ctl_be_lun.pblockoff = be_lun->pblockoff;
|
||||
if (be_lun->dispatch == ctl_be_block_dispatch_zvol &&
|
||||
be_lun->blocksize != 0)
|
||||
be_lun->ctl_be_lun.atomicblock = CTLBLK_MAX_IO_SIZE /
|
||||
be_lun->blocksize;
|
||||
ctl_lun_capacity_changed(&be_lun->ctl_be_lun);
|
||||
if (oldsize == 0 && be_lun->size_blocks != 0)
|
||||
ctl_lun_online(&be_lun->ctl_be_lun);
|
||||
}
|
||||
|
||||
/* Tell the user the exact size we ended up using */
|
||||
params->lun_size_bytes = be_lun->size_bytes;
|
||||
|
||||
req->status = CTL_LUN_OK;
|
||||
req->status = error ? CTL_LUN_WARNING : CTL_LUN_OK;
|
||||
|
||||
return (0);
|
||||
|
||||
|
@ -70,6 +70,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5e[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -81,6 +82,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5e[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -92,6 +94,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5e[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -103,6 +106,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5e[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -120,6 +124,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5f[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -131,6 +136,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5f[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -142,6 +148,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5f[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -153,6 +160,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5f[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -164,6 +172,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5f[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -178,6 +187,7 @@ const struct ctl_cmd_entry ctl_cmd_table_5f[32] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -460,6 +470,7 @@ const struct ctl_cmd_entry ctl_cmd_table_a3[32] =
|
||||
{ctl_report_tagret_port_groups, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN,
|
||||
CTL_LUN_PAT_NONE,
|
||||
@ -472,6 +483,7 @@ const struct ctl_cmd_entry ctl_cmd_table_a3[32] =
|
||||
{ctl_report_supported_opcodes, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -482,6 +494,7 @@ const struct ctl_cmd_entry ctl_cmd_table_a3[32] =
|
||||
{ctl_report_supported_tmf, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -495,6 +508,7 @@ const struct ctl_cmd_entry ctl_cmd_table_a3[32] =
|
||||
{ctl_report_timestamp, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN,
|
||||
CTL_LUN_PAT_NONE,
|
||||
@ -601,6 +615,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
{ctl_mode_select, CTL_SERIDX_MD_SEL, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT,
|
||||
CTL_LUN_PAT_NONE, 6, {0x11, 0, 0, 0xff, 0x07}},
|
||||
@ -610,6 +625,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT,
|
||||
CTL_LUN_PAT_NONE, 6, {0, 0, 0, 0, 0x07}},
|
||||
@ -619,6 +635,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_NONE,
|
||||
CTL_LUN_PAT_NONE, 6, {0, 0, 0, 0, 0x07}},
|
||||
@ -633,6 +650,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
{ctl_mode_sense, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -750,7 +768,11 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
{NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
|
||||
|
||||
/* 37 READ DEFECT DATA(10) */
|
||||
{NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
|
||||
{ctl_read_defect, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_SLUN |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
CTL_LUN_PAT_NONE,
|
||||
10, {0, 0x1f, 0, 0, 0, 0, 0xff, 0xff, 0x07}},
|
||||
|
||||
/* 38 MEDIUM SCAN */
|
||||
{NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
|
||||
@ -855,6 +877,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
{ctl_mode_select, CTL_SERIDX_MD_SEL, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT,
|
||||
CTL_LUN_PAT_NONE, 10, {0x11, 0, 0, 0, 0, 0, 0xff, 0xff, 0x07} },
|
||||
@ -864,6 +887,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT,
|
||||
CTL_LUN_PAT_NONE, 10, {0x02, 0, 0xff, 0, 0, 0, 0xff, 0xff, 0x07} },
|
||||
@ -873,6 +897,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_OUT,
|
||||
CTL_LUN_PAT_NONE, 10, {0x02, 0, 0xff, 0, 0, 0, 0xff, 0xff, 0x07} },
|
||||
@ -887,6 +912,7 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
{ctl_mode_sense, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_BOTH |
|
||||
CTL_CMD_FLAG_OK_ON_STOPPED |
|
||||
CTL_CMD_FLAG_OK_ON_INOPERABLE |
|
||||
CTL_CMD_FLAG_OK_ON_OFFLINE |
|
||||
CTL_CMD_FLAG_OK_ON_SECONDARY |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
@ -1225,7 +1251,11 @@ const struct ctl_cmd_entry ctl_cmd_table[256] =
|
||||
{NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
|
||||
|
||||
/* B7 READ DEFECT DATA(12) */
|
||||
{NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
|
||||
{ctl_read_defect, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_SLUN |
|
||||
CTL_FLAG_DATA_IN |
|
||||
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
|
||||
CTL_LUN_PAT_NONE,
|
||||
12, {0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
|
||||
|
||||
/* B8 READ ELEMENT STATUS */
|
||||
{NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
|
||||
|
@ -1996,7 +1996,8 @@ cfiscsi_ioctl_port_create(struct ctl_req *req)
|
||||
/* XXX KDM what should the real number be here? */
|
||||
port->num_requested_ctl_io = 4096;
|
||||
port->port_name = "iscsi";
|
||||
port->virtual_port = strtoul(tag, NULL, 0);
|
||||
port->physical_port = strtoul(tag, NULL, 0);
|
||||
port->virtual_port = ct->ct_target_id;
|
||||
port->port_online = cfiscsi_online;
|
||||
port->port_offline = cfiscsi_offline;
|
||||
port->port_info = cfiscsi_info;
|
||||
@ -2029,7 +2030,7 @@ cfiscsi_ioctl_port_create(struct ctl_req *req)
|
||||
SVPD_ID_TYPE_SCSI_NAME;
|
||||
desc->length = idlen;
|
||||
snprintf(desc->identifier, idlen, "%s,t,0x%4.4x",
|
||||
target, port->virtual_port);
|
||||
target, port->physical_port);
|
||||
|
||||
/* Generate Target ID. */
|
||||
idlen = strlen(target) + 1;
|
||||
@ -2257,6 +2258,9 @@ cfiscsi_target_find_or_create(struct cfiscsi_softc *softc, const char *name,
|
||||
strlcpy(newct->ct_alias, alias, sizeof(newct->ct_alias));
|
||||
refcount_init(&newct->ct_refcount, 1);
|
||||
newct->ct_softc = softc;
|
||||
if (TAILQ_EMPTY(&softc->targets))
|
||||
softc->last_target_id = 0;
|
||||
newct->ct_target_id = ++softc->last_target_id;
|
||||
TAILQ_INSERT_TAIL(&softc->targets, newct, ct_next);
|
||||
mtx_unlock(&softc->lock);
|
||||
|
||||
|
@ -45,6 +45,7 @@ struct cfiscsi_target {
|
||||
char ct_alias[CTL_ISCSI_ALIAS_LEN];
|
||||
int ct_state;
|
||||
int ct_online;
|
||||
int ct_target_id;
|
||||
struct ctl_port ct_port;
|
||||
};
|
||||
|
||||
@ -110,6 +111,7 @@ struct cfiscsi_softc {
|
||||
struct mtx lock;
|
||||
char port_name[32];
|
||||
int online;
|
||||
int last_target_id;
|
||||
unsigned int last_session_id;
|
||||
TAILQ_HEAD(, cfiscsi_target) targets;
|
||||
TAILQ_HEAD(, cfiscsi_session) sessions;
|
||||
|
@ -363,7 +363,8 @@ struct ctl_port_list {
|
||||
typedef enum {
|
||||
CTL_LUN_NOSTATUS,
|
||||
CTL_LUN_OK,
|
||||
CTL_LUN_ERROR
|
||||
CTL_LUN_ERROR,
|
||||
CTL_LUN_WARNING
|
||||
} ctl_lun_status;
|
||||
|
||||
#define CTL_ERROR_STR_LEN 160
|
||||
|
@ -353,11 +353,6 @@ typedef enum {
|
||||
CTL_PR_FLAG_ACTIVE_RES = 0x02
|
||||
} ctl_per_res_flags;
|
||||
|
||||
struct ctl_per_res_info {
|
||||
struct scsi_per_res_key res_key;
|
||||
uint8_t registered;
|
||||
};
|
||||
|
||||
#define CTL_PR_ALL_REGISTRANTS 0xFFFFFFFF
|
||||
#define CTL_PR_NO_RESERVATION 0xFFFFFFF0
|
||||
|
||||
@ -398,8 +393,8 @@ struct ctl_lun {
|
||||
struct ctl_mode_pages mode_pages;
|
||||
struct ctl_lun_io_stats stats;
|
||||
uint32_t res_idx;
|
||||
struct ctl_per_res_info per_res[2*CTL_MAX_INITIATORS];
|
||||
unsigned int PRGeneration;
|
||||
uint64_t pr_keys[2*CTL_MAX_INITIATORS];
|
||||
int pr_key_count;
|
||||
uint32_t pr_res_idx;
|
||||
uint8_t res_type;
|
||||
@ -491,6 +486,7 @@ int ctl_mode_select(struct ctl_scsiio *ctsio);
|
||||
int ctl_mode_sense(struct ctl_scsiio *ctsio);
|
||||
int ctl_read_capacity(struct ctl_scsiio *ctsio);
|
||||
int ctl_read_capacity_16(struct ctl_scsiio *ctsio);
|
||||
int ctl_read_defect(struct ctl_scsiio *ctsio);
|
||||
int ctl_read_write(struct ctl_scsiio *ctsio);
|
||||
int ctl_cnw(struct ctl_scsiio *ctsio);
|
||||
int ctl_report_luns(struct ctl_scsiio *ctsio);
|
||||
|
@ -224,12 +224,13 @@ static void ctlfe_dump(void);
|
||||
static struct periph_driver ctlfe_driver =
|
||||
{
|
||||
ctlfeperiphinit, "ctl",
|
||||
TAILQ_HEAD_INITIALIZER(ctlfe_driver.units), /*generation*/ 0
|
||||
TAILQ_HEAD_INITIALIZER(ctlfe_driver.units), /*generation*/ 0,
|
||||
CAM_PERIPH_DRV_EARLY
|
||||
};
|
||||
|
||||
static struct ctl_frontend ctlfe_frontend =
|
||||
{
|
||||
.name = "camtarget",
|
||||
.name = "camtgt",
|
||||
.init = ctlfeinitialize,
|
||||
.fe_dump = ctlfe_dump,
|
||||
.shutdown = ctlfeshutdown,
|
||||
@ -270,11 +271,19 @@ ctlfeperiphinit(void)
|
||||
static void
|
||||
ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
{
|
||||
struct ctlfe_softc *softc;
|
||||
|
||||
#ifdef CTLFEDEBUG
|
||||
printf("%s: entered\n", __func__);
|
||||
#endif
|
||||
|
||||
mtx_lock(&ctlfe_list_mtx);
|
||||
STAILQ_FOREACH(softc, &ctlfe_softc_list, links) {
|
||||
if (softc->path_id == xpt_path_path_id(path))
|
||||
break;
|
||||
}
|
||||
mtx_unlock(&ctlfe_list_mtx);
|
||||
|
||||
/*
|
||||
* When a new path gets registered, and it is capable of target
|
||||
* mode, go ahead and attach. Later on, we may need to be more
|
||||
@ -283,7 +292,6 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
switch (code) {
|
||||
case AC_PATH_REGISTERED: {
|
||||
struct ctl_port *port;
|
||||
struct ctlfe_softc *bus_softc;
|
||||
struct ccb_pathinq *cpi;
|
||||
int retval;
|
||||
|
||||
@ -298,6 +306,14 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
break;
|
||||
}
|
||||
|
||||
if (softc != NULL) {
|
||||
#ifdef CTLFEDEBUG
|
||||
printf("%s: CTL port for CAM path %u already exists\n",
|
||||
__func__, xpt_path_path_id(path));
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef CTLFE_INIT_ENABLE
|
||||
if (ctlfe_num_targets >= ctlfe_max_targets) {
|
||||
union ccb *ccb;
|
||||
@ -346,25 +362,23 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
* use M_NOWAIT. Of course this means trouble if we
|
||||
* can't allocate memory.
|
||||
*/
|
||||
bus_softc = malloc(sizeof(*bus_softc), M_CTLFE,
|
||||
M_NOWAIT | M_ZERO);
|
||||
if (bus_softc == NULL) {
|
||||
softc = malloc(sizeof(*softc), M_CTLFE, M_NOWAIT | M_ZERO);
|
||||
if (softc == NULL) {
|
||||
printf("%s: unable to malloc %zd bytes for softc\n",
|
||||
__func__, sizeof(*bus_softc));
|
||||
__func__, sizeof(*softc));
|
||||
return;
|
||||
}
|
||||
|
||||
bus_softc->path_id = cpi->ccb_h.path_id;
|
||||
bus_softc->sim = xpt_path_sim(path);
|
||||
softc->path_id = cpi->ccb_h.path_id;
|
||||
softc->sim = xpt_path_sim(path);
|
||||
if (cpi->maxio != 0)
|
||||
bus_softc->maxio = cpi->maxio;
|
||||
softc->maxio = cpi->maxio;
|
||||
else
|
||||
bus_softc->maxio = DFLTPHYS;
|
||||
mtx_init(&bus_softc->lun_softc_mtx, "LUN softc mtx", NULL,
|
||||
MTX_DEF);
|
||||
STAILQ_INIT(&bus_softc->lun_softc_list);
|
||||
softc->maxio = DFLTPHYS;
|
||||
mtx_init(&softc->lun_softc_mtx, "LUN softc mtx", NULL, MTX_DEF);
|
||||
STAILQ_INIT(&softc->lun_softc_list);
|
||||
|
||||
port = &bus_softc->port;
|
||||
port = &softc->port;
|
||||
port->frontend = &ctlfe_frontend;
|
||||
|
||||
/*
|
||||
@ -379,21 +393,21 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
|
||||
/* XXX KDM what should the real number be here? */
|
||||
port->num_requested_ctl_io = 4096;
|
||||
snprintf(bus_softc->port_name, sizeof(bus_softc->port_name),
|
||||
snprintf(softc->port_name, sizeof(softc->port_name),
|
||||
"%s%d", cpi->dev_name, cpi->unit_number);
|
||||
/*
|
||||
* XXX KDM it would be nice to allocate storage in the
|
||||
* frontend structure itself.
|
||||
*/
|
||||
port->port_name = bus_softc->port_name;
|
||||
port->physical_port = cpi->unit_number;
|
||||
port->virtual_port = cpi->bus_id;
|
||||
port->port_name = softc->port_name;
|
||||
port->physical_port = cpi->bus_id;
|
||||
port->virtual_port = 0;
|
||||
port->port_online = ctlfe_online;
|
||||
port->port_offline = ctlfe_offline;
|
||||
port->onoff_arg = bus_softc;
|
||||
port->onoff_arg = softc;
|
||||
port->lun_enable = ctlfe_lun_enable;
|
||||
port->lun_disable = ctlfe_lun_disable;
|
||||
port->targ_lun_arg = bus_softc;
|
||||
port->targ_lun_arg = softc;
|
||||
port->fe_datamove = ctlfe_datamove_done;
|
||||
port->fe_done = ctlfe_datamove_done;
|
||||
/*
|
||||
@ -415,35 +429,28 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
if (retval != 0) {
|
||||
printf("%s: ctl_port_register() failed with "
|
||||
"error %d!\n", __func__, retval);
|
||||
mtx_destroy(&bus_softc->lun_softc_mtx);
|
||||
free(bus_softc, M_CTLFE);
|
||||
mtx_destroy(&softc->lun_softc_mtx);
|
||||
free(softc, M_CTLFE);
|
||||
break;
|
||||
} else {
|
||||
mtx_lock(&ctlfe_list_mtx);
|
||||
STAILQ_INSERT_TAIL(&ctlfe_softc_list, bus_softc, links);
|
||||
STAILQ_INSERT_TAIL(&ctlfe_softc_list, softc, links);
|
||||
mtx_unlock(&ctlfe_list_mtx);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case AC_PATH_DEREGISTERED: {
|
||||
struct ctlfe_softc *softc = NULL;
|
||||
|
||||
mtx_lock(&ctlfe_list_mtx);
|
||||
STAILQ_FOREACH(softc, &ctlfe_softc_list, links) {
|
||||
if (softc->path_id == xpt_path_path_id(path)) {
|
||||
STAILQ_REMOVE(&ctlfe_softc_list, softc,
|
||||
ctlfe_softc, links);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mtx_unlock(&ctlfe_list_mtx);
|
||||
|
||||
if (softc != NULL) {
|
||||
/*
|
||||
* XXX KDM are we certain at this point that there
|
||||
* are no outstanding commands for this frontend?
|
||||
*/
|
||||
mtx_lock(&ctlfe_list_mtx);
|
||||
STAILQ_REMOVE(&ctlfe_softc_list, softc, ctlfe_softc,
|
||||
links);
|
||||
mtx_unlock(&ctlfe_list_mtx);
|
||||
ctl_port_deregister(&softc->port);
|
||||
mtx_destroy(&softc->lun_softc_mtx);
|
||||
free(softc, M_CTLFE);
|
||||
@ -458,8 +465,7 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
switch (ac->contract_number) {
|
||||
case AC_CONTRACT_DEV_CHG: {
|
||||
struct ac_device_changed *dev_chg;
|
||||
struct ctlfe_softc *softc;
|
||||
int retval, found;
|
||||
int retval;
|
||||
|
||||
dev_chg = (struct ac_device_changed *)ac->contract_data;
|
||||
|
||||
@ -468,18 +474,7 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg)
|
||||
xpt_path_path_id(path), dev_chg->target,
|
||||
(dev_chg->arrived == 0) ? "left" : "arrived");
|
||||
|
||||
found = 0;
|
||||
|
||||
mtx_lock(&ctlfe_list_mtx);
|
||||
STAILQ_FOREACH(softc, &ctlfe_softc_list, links) {
|
||||
if (softc->path_id == xpt_path_path_id(path)) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mtx_unlock(&ctlfe_list_mtx);
|
||||
|
||||
if (found == 0) {
|
||||
if (softc == NULL) {
|
||||
printf("%s: CTL port for CAM path %u not "
|
||||
"found!\n", __func__,
|
||||
xpt_path_path_id(path));
|
||||
@ -1518,11 +1513,6 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
|
||||
case CAM_MESSAGE_RECV:
|
||||
switch (inot->arg) {
|
||||
case MSG_ABORT_TASK_SET:
|
||||
/*
|
||||
* XXX KDM this isn't currently
|
||||
* supported by CTL. It ends up
|
||||
* being a no-op.
|
||||
*/
|
||||
io->taskio.task_action =
|
||||
CTL_TASK_ABORT_TASK_SET;
|
||||
break;
|
||||
@ -1539,11 +1529,6 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb)
|
||||
CTL_TASK_LUN_RESET;
|
||||
break;
|
||||
case MSG_CLEAR_TASK_SET:
|
||||
/*
|
||||
* XXX KDM this isn't currently
|
||||
* supported by CTL. It ends up
|
||||
* being a no-op.
|
||||
*/
|
||||
io->taskio.task_action =
|
||||
CTL_TASK_CLEAR_TASK_SET;
|
||||
break;
|
||||
|
@ -92,28 +92,19 @@ struct scsi_reassign_blocks
|
||||
|
||||
struct scsi_read_defect_data_10
|
||||
{
|
||||
u_int8_t opcode;
|
||||
|
||||
/*
|
||||
* The most significant 3 bits are the LUN, the other 5 are
|
||||
* reserved.
|
||||
*/
|
||||
#define SRDD10_LUN_MASK 0xE0
|
||||
u_int8_t byte2;
|
||||
uint8_t opcode;
|
||||
uint8_t byte2;
|
||||
#define SRDD10_GLIST 0x08
|
||||
#define SRDD10_PLIST 0x10
|
||||
#define SRDD10_DLIST_FORMAT_MASK 0x07
|
||||
#define SRDD10_BLOCK_FORMAT 0x00
|
||||
#define SRDD10_BYTES_FROM_INDEX_FORMAT 0x04
|
||||
#define SRDD10_PHYSICAL_SECTOR_FORMAT 0x05
|
||||
u_int8_t format;
|
||||
|
||||
u_int8_t reserved[4];
|
||||
|
||||
u_int8_t alloc_length[2];
|
||||
uint8_t format;
|
||||
uint8_t reserved[4];
|
||||
uint8_t alloc_length[2];
|
||||
#define SRDD10_MAX_LENGTH 0xffff
|
||||
|
||||
u_int8_t control;
|
||||
uint8_t control;
|
||||
};
|
||||
|
||||
struct scsi_sanitize
|
||||
@ -143,29 +134,18 @@ struct scsi_sanitize_parameter_list
|
||||
|
||||
struct scsi_read_defect_data_12
|
||||
{
|
||||
u_int8_t opcode;
|
||||
|
||||
/*
|
||||
* The most significant 3 bits are the LUN, the other 5 are
|
||||
* reserved.
|
||||
*/
|
||||
#define SRDD12_LUN_MASK 0xE0
|
||||
u_int8_t byte2;
|
||||
|
||||
uint8_t opcode;
|
||||
#define SRDD12_GLIST 0x08
|
||||
#define SRDD12_PLIST 0x10
|
||||
#define SRDD12_DLIST_FORMAT_MASK 0x07
|
||||
#define SRDD12_BLOCK_FORMAT 0x00
|
||||
#define SRDD12_BYTES_FROM_INDEX_FORMAT 0x04
|
||||
#define SRDD12_PHYSICAL_SECTOR_FORMAT 0x05
|
||||
u_int8_t format;
|
||||
|
||||
u_int8_t reserved[4];
|
||||
|
||||
u_int8_t alloc_length[4];
|
||||
|
||||
u_int8_t control;
|
||||
|
||||
uint8_t format;
|
||||
uint8_t address_descriptor_index[4];
|
||||
uint8_t alloc_length[4];
|
||||
uint8_t reserved;
|
||||
uint8_t control;
|
||||
};
|
||||
|
||||
|
||||
@ -376,6 +356,7 @@ struct scsi_read_defect_data_hdr_12
|
||||
#define SRDDH12_BYTES_FROM_INDEX_FORMAT 0x04
|
||||
#define SRDDH12_PHYSICAL_SECTOR_FORMAT 0x05
|
||||
u_int8_t format;
|
||||
u_int8_t generation[2];
|
||||
u_int8_t length[4];
|
||||
};
|
||||
|
||||
|
@ -217,6 +217,7 @@ SYSINIT(arc_free_target_init, SI_SUB_KTHREAD_PAGE, SI_ORDER_ANY,
|
||||
arc_free_target_init, NULL);
|
||||
|
||||
TUNABLE_QUAD("vfs.zfs.arc_meta_limit", &zfs_arc_meta_limit);
|
||||
TUNABLE_INT("vfs.zfs.arc_shrink_shift", &zfs_arc_shrink_shift);
|
||||
SYSCTL_DECL(_vfs_zfs);
|
||||
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_max, CTLFLAG_RDTUN, &zfs_arc_max, 0,
|
||||
"Maximum ARC size");
|
||||
@ -225,6 +226,10 @@ SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_min, CTLFLAG_RDTUN, &zfs_arc_min, 0,
|
||||
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_average_blocksize, CTLFLAG_RDTUN,
|
||||
&zfs_arc_average_blocksize, 0,
|
||||
"ARC average blocksize");
|
||||
SYSCTL_INT(_vfs_zfs, OID_AUTO, arc_shrink_shift, CTLFLAG_RW,
|
||||
&arc_shrink_shift, 0,
|
||||
"log2(fraction of arc to reclaim)");
|
||||
|
||||
/*
|
||||
* We don't have a tunable for arc_free_target due to the dependency on
|
||||
* pagedaemon initialisation.
|
||||
@ -5227,7 +5232,7 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
|
||||
ARCSTAT_INCR(arcstat_l2_write_bytes, write_asize);
|
||||
ARCSTAT_INCR(arcstat_l2_size, write_sz);
|
||||
ARCSTAT_INCR(arcstat_l2_asize, write_asize);
|
||||
vdev_space_update(dev->l2ad_vdev, write_asize, 0, 0);
|
||||
vdev_space_update(dev->l2ad_vdev, write_psize, 0, 0);
|
||||
|
||||
/*
|
||||
* Bump device hand to the device start if it is approaching the end.
|
||||
|
@ -3175,6 +3175,7 @@ libkern/inet_ntoa.c standard
|
||||
libkern/inet_ntop.c standard
|
||||
libkern/inet_pton.c standard
|
||||
libkern/jenkins_hash.c standard
|
||||
libkern/murmur3_32.c standard
|
||||
libkern/mcount.c optional profiling-routine
|
||||
libkern/memcchr.c standard
|
||||
libkern/memchr.c optional fdt | gdb
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* $FreeBSD$ */
|
||||
|
||||
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
|
||||
OUTPUT_FORMAT("elf32-powerpc-freebsd", "elf32-powerpc-freebsd",
|
||||
"elf32-powerpc-freebsd")
|
||||
OUTPUT_ARCH(powerpc)
|
||||
ENTRY(__start)
|
||||
SEARCH_DIR(/usr/lib);
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* $FreeBSD$ */
|
||||
|
||||
OUTPUT_FORMAT("elf64-powerpc", "elf64-powerpc", "elf64-powerpc")
|
||||
OUTPUT_FORMAT("elf64-powerpc-freebsd", "elf64-powerpc-freebsd",
|
||||
"elf64-powerpc-freebsd")
|
||||
OUTPUT_ARCH(powerpc:common64)
|
||||
ENTRY(__start)
|
||||
SEARCH_DIR(/usr/lib);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user