MFH
Sponsored by: The FreeBSD Foundation
This commit is contained in:
@@ -283,7 +283,6 @@ static int
|
|||||||
equiv_su(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
|
equiv_su(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
|
||||||
{
|
{
|
||||||
mlist_t *ml1 = stdp->t_members, *ml2 = ttdp->t_members;
|
mlist_t *ml1 = stdp->t_members, *ml2 = ttdp->t_members;
|
||||||
mlist_t *olm1 = NULL;
|
|
||||||
|
|
||||||
while (ml1 && ml2) {
|
while (ml1 && ml2) {
|
||||||
if (ml1->ml_offset != ml2->ml_offset ||
|
if (ml1->ml_offset != ml2->ml_offset ||
|
||||||
@@ -292,7 +291,6 @@ equiv_su(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
|
|||||||
!equiv_node(ml1->ml_type, ml2->ml_type, ed))
|
!equiv_node(ml1->ml_type, ml2->ml_type, ed))
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
olm1 = ml1;
|
|
||||||
ml1 = ml1->ml_next;
|
ml1 = ml1->ml_next;
|
||||||
ml2 = ml2->ml_next;
|
ml2 = ml2->ml_next;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -82,10 +82,6 @@ BIN1+= apmd.conf
|
|||||||
BIN1+= auto_master
|
BIN1+= auto_master
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.if ${MK_BSNMP} != "no"
|
|
||||||
BIN1+= snmpd.config
|
|
||||||
.endif
|
|
||||||
|
|
||||||
.if ${MK_FREEBSD_UPDATE} != "no"
|
.if ${MK_FREEBSD_UPDATE} != "no"
|
||||||
BIN1+= freebsd-update.conf
|
BIN1+= freebsd-update.conf
|
||||||
.endif
|
.endif
|
||||||
@@ -219,6 +215,11 @@ distribution:
|
|||||||
${BIN2} ${DESTDIR}/etc; \
|
${BIN2} ${DESTDIR}/etc; \
|
||||||
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 600 \
|
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 600 \
|
||||||
master.passwd nsmb.conf opieaccess ${DESTDIR}/etc;
|
master.passwd nsmb.conf opieaccess ${DESTDIR}/etc;
|
||||||
|
.if ${MK_BSNMP} != "no"
|
||||||
|
cd ${.CURDIR}; \
|
||||||
|
${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 600 \
|
||||||
|
snmpd.config ${DESTDIR}/etc;
|
||||||
|
.endif
|
||||||
.if ${MK_AT} == "no"
|
.if ${MK_AT} == "no"
|
||||||
sed -i "" -e 's;.*/usr/libexec/atrun;#&;' ${DESTDIR}/etc/crontab
|
sed -i "" -e 's;.*/usr/libexec/atrun;#&;' ${DESTDIR}/etc/crontab
|
||||||
.endif
|
.endif
|
||||||
|
|||||||
@@ -376,6 +376,32 @@
|
|||||||
..
|
..
|
||||||
file
|
file
|
||||||
..
|
..
|
||||||
|
geom
|
||||||
|
class
|
||||||
|
concat
|
||||||
|
..
|
||||||
|
eli
|
||||||
|
..
|
||||||
|
gate
|
||||||
|
..
|
||||||
|
gpt
|
||||||
|
..
|
||||||
|
mirror
|
||||||
|
..
|
||||||
|
nop
|
||||||
|
..
|
||||||
|
raid3
|
||||||
|
..
|
||||||
|
shsec
|
||||||
|
..
|
||||||
|
stripe
|
||||||
|
..
|
||||||
|
uzip
|
||||||
|
etalon
|
||||||
|
..
|
||||||
|
..
|
||||||
|
..
|
||||||
|
..
|
||||||
kern
|
kern
|
||||||
acct
|
acct
|
||||||
..
|
..
|
||||||
|
|||||||
@@ -54,11 +54,7 @@ __asm(" .text \n"
|
|||||||
" .align 0 \n"
|
" .align 0 \n"
|
||||||
" .globl _start \n"
|
" .globl _start \n"
|
||||||
" _start: \n"
|
" _start: \n"
|
||||||
/* TODO: Remove this when the kernel correctly aligns the stack */
|
" mov x3, x2 \n" /* cleanup */
|
||||||
" cbnz x0, 1f \n" /* Are we using a new kernel? */
|
|
||||||
" mov x0, sp \n" /* No, load the args from sp */
|
|
||||||
" and sp, x0, #~0xf \n" /* And align the stack */
|
|
||||||
"1: mov x3, x2 \n" /* cleanup */
|
|
||||||
" add x1, x0, #8 \n" /* load argv */
|
" add x1, x0, #8 \n" /* load argv */
|
||||||
" ldr x0, [x0] \n" /* load argc */
|
" ldr x0, [x0] \n" /* load argc */
|
||||||
" add x2, x1, x0, lsl #3 \n" /* env is after argv */
|
" add x2, x1, x0, lsl #3 \n" /* env is after argv */
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
base = leaf; \
|
base = leaf; \
|
||||||
path_init(&path); \
|
path_init(&path); \
|
||||||
} \
|
} \
|
||||||
result = &(*leaf)->key; \
|
|
||||||
path_taking_right(&path); \
|
path_taking_right(&path); \
|
||||||
leaf = &(*leaf)->rlink; \
|
leaf = &(*leaf)->rlink; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ wcslcat(wchar_t *dst, const wchar_t *src, size_t siz)
|
|||||||
size_t dlen;
|
size_t dlen;
|
||||||
|
|
||||||
/* Find the end of dst and adjust bytes left but don't go past end */
|
/* Find the end of dst and adjust bytes left but don't go past end */
|
||||||
while (*d != '\0' && n-- != 0)
|
while (n-- != 0 && *d != '\0')
|
||||||
d++;
|
d++;
|
||||||
dlen = d - dst;
|
dlen = d - dst;
|
||||||
n = siz - dlen;
|
n = siz - dlen;
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ wcsncat(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n)
|
|||||||
p++;
|
p++;
|
||||||
q = p;
|
q = p;
|
||||||
r = s2;
|
r = s2;
|
||||||
while (*r && n) {
|
while (n && *r) {
|
||||||
*q++ = *r++;
|
*q++ = *r++;
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -28,7 +28,7 @@
|
|||||||
.\" @(#)stat.2 8.4 (Berkeley) 5/1/95
|
.\" @(#)stat.2 8.4 (Berkeley) 5/1/95
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd June 2, 2012
|
.Dd January 14, 2016
|
||||||
.Dt STAT 2
|
.Dt STAT 2
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@@ -40,12 +40,11 @@
|
|||||||
.Sh LIBRARY
|
.Sh LIBRARY
|
||||||
.Lb libc
|
.Lb libc
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.In sys/types.h
|
|
||||||
.In sys/stat.h
|
.In sys/stat.h
|
||||||
.Ft int
|
.Ft int
|
||||||
.Fn stat "const char *path" "struct stat *sb"
|
.Fn stat "const char * restrict path" "struct stat * restrict sb"
|
||||||
.Ft int
|
.Ft int
|
||||||
.Fn lstat "const char *path" "struct stat *sb"
|
.Fn lstat "const char * restrict path" "struct stat * restrict sb"
|
||||||
.Ft int
|
.Ft int
|
||||||
.Fn fstat "int fd" "struct stat *sb"
|
.Fn fstat "int fd" "struct stat *sb"
|
||||||
.Ft int
|
.Ft int
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <dialog.h>
|
#include <dialog.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <locale.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -482,6 +483,11 @@ dpv(struct dpv_config *config, struct dpv_file_node *file_list)
|
|||||||
/* Reads: label_size pbar_size pprompt aprompt dpv_nfiles */
|
/* Reads: label_size pbar_size pprompt aprompt dpv_nfiles */
|
||||||
/* Inits: dheight and dwidth */
|
/* Inits: dheight and dwidth */
|
||||||
|
|
||||||
|
/* Default localeconv(3) settings for dialog(3) status */
|
||||||
|
setlocale(LC_NUMERIC,
|
||||||
|
getenv("LC_ALL") == NULL && getenv("LC_NUMERIC") == NULL ?
|
||||||
|
LC_NUMERIC_DEFAULT : "");
|
||||||
|
|
||||||
if (!debug) {
|
if (!debug) {
|
||||||
/* Internally create the initial `--gauge' prompt text */
|
/* Internally create the initial `--gauge' prompt text */
|
||||||
dprompt_recreate(file_list, (struct dpv_file_node *)NULL, 0);
|
dprompt_recreate(file_list, (struct dpv_file_node *)NULL, 0);
|
||||||
|
|||||||
@@ -38,6 +38,9 @@
|
|||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* localeconv(3) */
|
||||||
|
#define LC_NUMERIC_DEFAULT "en_US.ISO8859-1"
|
||||||
|
|
||||||
/* Data to process */
|
/* Data to process */
|
||||||
extern long long dpv_overall_read;
|
extern long long dpv_overall_read;
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ int _umtx_op_err(void *obj, int op, u_long val, void *uaddr, void *uaddr2)
|
|||||||
void
|
void
|
||||||
_thr_umutex_init(struct umutex *mtx)
|
_thr_umutex_init(struct umutex *mtx)
|
||||||
{
|
{
|
||||||
static struct umutex default_mtx = DEFAULT_UMUTEX;
|
static const struct umutex default_mtx = DEFAULT_UMUTEX;
|
||||||
|
|
||||||
*mtx = default_mtx;
|
*mtx = default_mtx;
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,8 @@ _thr_umutex_init(struct umutex *mtx)
|
|||||||
void
|
void
|
||||||
_thr_urwlock_init(struct urwlock *rwl)
|
_thr_urwlock_init(struct urwlock *rwl)
|
||||||
{
|
{
|
||||||
static struct urwlock default_rwl = DEFAULT_URWLOCK;
|
static const struct urwlock default_rwl = DEFAULT_URWLOCK;
|
||||||
|
|
||||||
*rwl = default_rwl;
|
*rwl = default_rwl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,13 +34,7 @@ ENTRY(.rtld_start)
|
|||||||
mov x19, x0 /* Put ps_strings in a callee-saved register */
|
mov x19, x0 /* Put ps_strings in a callee-saved register */
|
||||||
mov x20, sp /* And the stack pointer */
|
mov x20, sp /* And the stack pointer */
|
||||||
|
|
||||||
/* Handle the old style stack */
|
sub sp, sp, #16 /* Make room for obj_main & exit proc */
|
||||||
/* TODO: Remove this when the kernel correctly aligns the stack */
|
|
||||||
cbnz x0, 1f
|
|
||||||
mov x0, sp /* sp points to the args */
|
|
||||||
and sp, x0, #~0xf /* Align the stack as needed */
|
|
||||||
|
|
||||||
1: sub sp, sp, #16 /* Make room for obj_main & exit proc */
|
|
||||||
|
|
||||||
mov x1, sp /* exit_proc */
|
mov x1, sp /* exit_proc */
|
||||||
add x2, x1, #8 /* obj_main */
|
add x2, x1, #8 /* obj_main */
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ if [ "x$1" = "x-b" ]; then
|
|||||||
bootable="-o bootimage=i386;$4/boot/cdboot -o no-emul-boot"
|
bootable="-o bootimage=i386;$4/boot/cdboot -o no-emul-boot"
|
||||||
|
|
||||||
# Make EFI system partition (should be done with makefs in the future)
|
# Make EFI system partition (should be done with makefs in the future)
|
||||||
dd if=/dev/zero of=efiboot.img bs=4k count=100
|
dd if=/dev/zero of=efiboot.img bs=4k count=200
|
||||||
device=`mdconfig -a -t vnode -f efiboot.img`
|
device=`mdconfig -a -t vnode -f efiboot.img`
|
||||||
newfs_msdos -F 12 -m 0xf8 /dev/$device
|
newfs_msdos -F 12 -m 0xf8 /dev/$device
|
||||||
mkdir efi
|
mkdir efi
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
# $OpenBSD: pf.conf,v 1.34 2007/02/24 19:30:59 millert Exp $
|
# $OpenBSD: pf.conf,v 1.34 2007/02/24 19:30:59 millert Exp $
|
||||||
#
|
#
|
||||||
# See pf.conf(5) and /usr/share/examples/pf for syntax and examples.
|
# See pf.conf(5) and /usr/share/examples/pf for syntax and examples.
|
||||||
# Remember to set net.inet.ip.forwarding=1 and/or net.inet6.ip6.forwarding=1
|
# Remember to set gateway_enable="YES" and/or ipv6_gateway_enable="YES"
|
||||||
# in /etc/sysctl.conf if packets are to be forwarded between interfaces.
|
# in /etc/rc.conf if packets are to be forwarded between interfaces.
|
||||||
|
|
||||||
#ext_if="ext0"
|
#ext_if="ext0"
|
||||||
#int_if="int0"
|
#int_if="int0"
|
||||||
|
|||||||
+3
-2
@@ -164,10 +164,11 @@ SSP_CFLAGS?= -fstack-protector
|
|||||||
CFLAGS+= ${SSP_CFLAGS}
|
CFLAGS+= ${SSP_CFLAGS}
|
||||||
.endif # SSP && !ARM && !MIPS
|
.endif # SSP && !ARM && !MIPS
|
||||||
|
|
||||||
# Allow user-specified additional warning flags, plus compiler specific flag overrides.
|
# Allow user-specified additional warning flags, plus compiler and file
|
||||||
# Unless we've overriden this...
|
# specific flag overrides, unless we've overriden this...
|
||||||
.if ${MK_WARNS} != "no"
|
.if ${MK_WARNS} != "no"
|
||||||
CFLAGS+= ${CWARNFLAGS} ${CWARNFLAGS.${COMPILER_TYPE}}
|
CFLAGS+= ${CWARNFLAGS} ${CWARNFLAGS.${COMPILER_TYPE}}
|
||||||
|
CFLAGS+= ${CWARNFLAGS.${.IMPSRC:T}}
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
CFLAGS+= ${CFLAGS.${COMPILER_TYPE}}
|
CFLAGS+= ${CFLAGS.${COMPILER_TYPE}}
|
||||||
|
|||||||
@@ -3018,11 +3018,14 @@ reserve_pv_entries(pmap_t pmap, int needed, struct rwlock **lockp)
|
|||||||
retry:
|
retry:
|
||||||
avail = 0;
|
avail = 0;
|
||||||
TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) {
|
TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) {
|
||||||
|
#ifndef __POPCNT__
|
||||||
if ((cpu_feature2 & CPUID2_POPCNT) == 0) {
|
if ((cpu_feature2 & CPUID2_POPCNT) == 0) {
|
||||||
free = bitcount64(pc->pc_map[0]);
|
free = bitcount64(pc->pc_map[0]);
|
||||||
free += bitcount64(pc->pc_map[1]);
|
free += bitcount64(pc->pc_map[1]);
|
||||||
free += bitcount64(pc->pc_map[2]);
|
free += bitcount64(pc->pc_map[2]);
|
||||||
} else {
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
free = popcnt_pc_map_elem_pq(pc->pc_map[0]);
|
free = popcnt_pc_map_elem_pq(pc->pc_map[0]);
|
||||||
free += popcnt_pc_map_elem_pq(pc->pc_map[1]);
|
free += popcnt_pc_map_elem_pq(pc->pc_map[1]);
|
||||||
free += popcnt_pc_map_elem_pq(pc->pc_map[2]);
|
free += popcnt_pc_map_elem_pq(pc->pc_map[2]);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LINUX_SYSPROTO_H_
|
#ifndef _LINUX_SYSPROTO_H_
|
||||||
@@ -966,7 +966,7 @@ struct linux_set_robust_list_args {
|
|||||||
};
|
};
|
||||||
struct linux_get_robust_list_args {
|
struct linux_get_robust_list_args {
|
||||||
char pid_l_[PADL_(l_int)]; l_int pid; char pid_r_[PADR_(l_int)];
|
char pid_l_[PADL_(l_int)]; l_int pid; char pid_r_[PADR_(l_int)];
|
||||||
char head_l_[PADL_(struct linux_robust_list_head *)]; struct linux_robust_list_head * head; char head_r_[PADR_(struct linux_robust_list_head *)];
|
char head_l_[PADL_(struct linux_robust_list_head **)]; struct linux_robust_list_head ** head; char head_r_[PADR_(struct linux_robust_list_head **)];
|
||||||
char len_l_[PADL_(l_size_t *)]; l_size_t * len; char len_r_[PADR_(l_size_t *)];
|
char len_l_[PADL_(l_size_t *)]; l_size_t * len; char len_r_[PADR_(l_size_t *)];
|
||||||
};
|
};
|
||||||
struct linux_splice_args {
|
struct linux_splice_args {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define LINUX_SYS_read 0
|
#define LINUX_SYS_read 0
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const char *linux_syscallnames[] = {
|
const char *linux_syscallnames[] = {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|||||||
@@ -2020,7 +2020,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
|
|||||||
case 274: {
|
case 274: {
|
||||||
struct linux_get_robust_list_args *p = params;
|
struct linux_get_robust_list_args *p = params;
|
||||||
iarg[0] = p->pid; /* l_int */
|
iarg[0] = p->pid; /* l_int */
|
||||||
uarg[1] = (intptr_t) p->head; /* struct linux_robust_list_head * */
|
uarg[1] = (intptr_t) p->head; /* struct linux_robust_list_head ** */
|
||||||
uarg[2] = (intptr_t) p->len; /* l_size_t * */
|
uarg[2] = (intptr_t) p->len; /* l_size_t * */
|
||||||
*n_args = 3;
|
*n_args = 3;
|
||||||
break;
|
break;
|
||||||
@@ -5347,7 +5347,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
|
|||||||
p = "l_int";
|
p = "l_int";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
p = "struct linux_robust_list_head *";
|
p = "struct linux_robust_list_head **";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
p = "l_size_t *";
|
p = "l_size_t *";
|
||||||
|
|||||||
@@ -461,8 +461,8 @@
|
|||||||
272 AUE_NULL STD { int linux_unshare(void); }
|
272 AUE_NULL STD { int linux_unshare(void); }
|
||||||
273 AUE_NULL STD { int linux_set_robust_list(struct linux_robust_list_head *head, \
|
273 AUE_NULL STD { int linux_set_robust_list(struct linux_robust_list_head *head, \
|
||||||
l_size_t len); }
|
l_size_t len); }
|
||||||
274 AUE_NULL STD { int linux_get_robust_list(l_int pid, struct linux_robust_list_head *head, \
|
274 AUE_NULL STD { int linux_get_robust_list(l_int pid, \
|
||||||
l_size_t *len); }
|
struct linux_robust_list_head **head, l_size_t *len); }
|
||||||
275 AUE_NULL STD { int linux_splice(void); }
|
275 AUE_NULL STD { int linux_splice(void); }
|
||||||
276 AUE_NULL STD { int linux_tee(void); }
|
276 AUE_NULL STD { int linux_tee(void); }
|
||||||
277 AUE_NULL STD { int linux_sync_file_range(void); }
|
277 AUE_NULL STD { int linux_sync_file_range(void); }
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LINUX32_SYSPROTO_H_
|
#ifndef _LINUX32_SYSPROTO_H_
|
||||||
@@ -1023,7 +1023,7 @@ struct linux_set_robust_list_args {
|
|||||||
};
|
};
|
||||||
struct linux_get_robust_list_args {
|
struct linux_get_robust_list_args {
|
||||||
char pid_l_[PADL_(l_int)]; l_int pid; char pid_r_[PADR_(l_int)];
|
char pid_l_[PADL_(l_int)]; l_int pid; char pid_r_[PADR_(l_int)];
|
||||||
char head_l_[PADL_(struct linux_robust_list_head *)]; struct linux_robust_list_head * head; char head_r_[PADR_(struct linux_robust_list_head *)];
|
char head_l_[PADL_(struct linux_robust_list_head **)]; struct linux_robust_list_head ** head; char head_r_[PADR_(struct linux_robust_list_head **)];
|
||||||
char len_l_[PADL_(l_size_t *)]; l_size_t * len; char len_r_[PADR_(l_size_t *)];
|
char len_l_[PADL_(l_size_t *)]; l_size_t * len; char len_r_[PADR_(l_size_t *)];
|
||||||
};
|
};
|
||||||
struct linux_splice_args {
|
struct linux_splice_args {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define LINUX32_SYS_linux_exit 1
|
#define LINUX32_SYS_linux_exit 1
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const char *linux32_syscallnames[] = {
|
const char *linux32_syscallnames[] = {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* DO NOT EDIT-- this file is automatically generated.
|
* DO NOT EDIT-- this file is automatically generated.
|
||||||
* $FreeBSD$
|
* $FreeBSD$
|
||||||
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 289769 2015-10-22 21:28:20Z jhb
|
* created from FreeBSD: head/sys/amd64/linux32/syscalls.master 293907 2016-01-14 10:13:58Z glebius
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "opt_compat.h"
|
#include "opt_compat.h"
|
||||||
|
|||||||
@@ -2122,7 +2122,7 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
|
|||||||
case 312: {
|
case 312: {
|
||||||
struct linux_get_robust_list_args *p = params;
|
struct linux_get_robust_list_args *p = params;
|
||||||
iarg[0] = p->pid; /* l_int */
|
iarg[0] = p->pid; /* l_int */
|
||||||
uarg[1] = (intptr_t) p->head; /* struct linux_robust_list_head * */
|
uarg[1] = (intptr_t) p->head; /* struct linux_robust_list_head ** */
|
||||||
uarg[2] = (intptr_t) p->len; /* l_size_t * */
|
uarg[2] = (intptr_t) p->len; /* l_size_t * */
|
||||||
*n_args = 3;
|
*n_args = 3;
|
||||||
break;
|
break;
|
||||||
@@ -5551,7 +5551,7 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
|
|||||||
p = "l_int";
|
p = "l_int";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
p = "struct linux_robust_list_head *";
|
p = "struct linux_robust_list_head **";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
p = "l_size_t *";
|
p = "l_size_t *";
|
||||||
|
|||||||
@@ -520,8 +520,8 @@
|
|||||||
; linux 2.6.17:
|
; linux 2.6.17:
|
||||||
311 AUE_NULL STD { int linux_set_robust_list(struct linux_robust_list_head *head, \
|
311 AUE_NULL STD { int linux_set_robust_list(struct linux_robust_list_head *head, \
|
||||||
l_size_t len); }
|
l_size_t len); }
|
||||||
312 AUE_NULL STD { int linux_get_robust_list(l_int pid, struct linux_robust_list_head *head, \
|
312 AUE_NULL STD { int linux_get_robust_list(l_int pid, \
|
||||||
l_size_t *len); }
|
struct linux_robust_list_head **head, l_size_t *len); }
|
||||||
313 AUE_NULL STD { int linux_splice(void); }
|
313 AUE_NULL STD { int linux_splice(void); }
|
||||||
314 AUE_NULL STD { int linux_sync_file_range(void); }
|
314 AUE_NULL STD { int linux_sync_file_range(void); }
|
||||||
315 AUE_NULL STD { int linux_tee(void); }
|
315 AUE_NULL STD { int linux_tee(void); }
|
||||||
|
|||||||
+2
-2
@@ -139,8 +139,8 @@ EENTRY_NP(fueword32)
|
|||||||
mov r0, #0x00000000
|
mov r0, #0x00000000
|
||||||
str r0, [r2, #PCB_ONFAULT]
|
str r0, [r2, #PCB_ONFAULT]
|
||||||
RET
|
RET
|
||||||
EEND(fuword32)
|
EEND(fueword32)
|
||||||
END(fuword)
|
END(fueword)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* fusword(caddr_t uaddr);
|
* fusword(caddr_t uaddr);
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ NEWVERSWHAT= "U-Boot loader" ${MACHINE_ARCH}
|
|||||||
BINDIR?= /boot
|
BINDIR?= /boot
|
||||||
INSTALLFLAGS= -b
|
INSTALLFLAGS= -b
|
||||||
WARNS?= 1
|
WARNS?= 1
|
||||||
|
CWARNFLAGS.gcc+= -Wno-int-to-pointer-cast
|
||||||
|
|
||||||
# Address at which ubldr will be loaded.
|
# Address at which ubldr will be loaded.
|
||||||
# This varies for different boards and SOCs.
|
# This varies for different boards and SOCs.
|
||||||
UBLDR_LOADADDR?= 0x1000000
|
UBLDR_LOADADDR?= 0x1000000
|
||||||
|
|||||||
@@ -56,7 +56,10 @@ typedef int (bootblk_cmd_t)(int argc, char *argv[]);
|
|||||||
extern char *command_errmsg;
|
extern char *command_errmsg;
|
||||||
extern char command_errbuf[]; /* XXX blah, length */
|
extern char command_errbuf[]; /* XXX blah, length */
|
||||||
#define CMD_OK 0
|
#define CMD_OK 0
|
||||||
#define CMD_ERROR 1
|
#define CMD_WARN 1
|
||||||
|
#define CMD_ERROR 2
|
||||||
|
#define CMD_CRIT 3
|
||||||
|
#define CMD_FATAL 4
|
||||||
|
|
||||||
/* interp.c */
|
/* interp.c */
|
||||||
void interact(const char *rc);
|
void interact(const char *rc);
|
||||||
|
|||||||
@@ -138,13 +138,23 @@ bf_command(FICL_VM *vm)
|
|||||||
} else {
|
} else {
|
||||||
result=BF_PARSE;
|
result=BF_PARSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (result) {
|
||||||
|
case CMD_CRIT:
|
||||||
|
printf("%s\n", command_errmsg);
|
||||||
|
break;
|
||||||
|
case CMD_FATAL:
|
||||||
|
panic("%s\n", command_errmsg);
|
||||||
|
}
|
||||||
|
|
||||||
free(line);
|
free(line);
|
||||||
/*
|
/*
|
||||||
* If there was error during nested ficlExec(), we may no longer have
|
* If there was error during nested ficlExec(), we may no longer have
|
||||||
* valid environment to return. Throw all exceptions from here.
|
* valid environment to return. Throw all exceptions from here.
|
||||||
*/
|
*/
|
||||||
if (result != 0)
|
if (result != CMD_OK)
|
||||||
vmThrow(vm, result);
|
vmThrow(vm, result);
|
||||||
|
|
||||||
/* This is going to be thrown!!! */
|
/* This is going to be thrown!!! */
|
||||||
stackPushINT(vm->pStack,result);
|
stackPushINT(vm->pStack,result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ command_load(int argc, char *argv[])
|
|||||||
typestr = NULL;
|
typestr = NULL;
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
command_errmsg = "no filename specified";
|
command_errmsg = "no filename specified";
|
||||||
return(CMD_ERROR);
|
return (CMD_CRIT);
|
||||||
}
|
}
|
||||||
while ((ch = getopt(argc, argv, "kt:")) != -1) {
|
while ((ch = getopt(argc, argv, "kt:")) != -1) {
|
||||||
switch(ch) {
|
switch(ch) {
|
||||||
@@ -138,33 +138,46 @@ command_load(int argc, char *argv[])
|
|||||||
if (dofile) {
|
if (dofile) {
|
||||||
if ((argc != 2) || (typestr == NULL) || (*typestr == 0)) {
|
if ((argc != 2) || (typestr == NULL) || (*typestr == 0)) {
|
||||||
command_errmsg = "invalid load type";
|
command_errmsg = "invalid load type";
|
||||||
return(CMD_ERROR);
|
return (CMD_CRIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
fp = file_findfile(argv[1], typestr);
|
fp = file_findfile(argv[1], typestr);
|
||||||
if (fp) {
|
if (fp) {
|
||||||
sprintf(command_errbuf, "warning: file '%s' already loaded", argv[1]);
|
sprintf(command_errbuf, "warning: file '%s' already loaded", argv[1]);
|
||||||
return (CMD_ERROR);
|
return (CMD_WARN);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (file_loadraw(argv[1], typestr, 1) ? CMD_OK : CMD_ERROR);
|
if (file_loadraw(argv[1], typestr, 1) != NULL)
|
||||||
|
return (CMD_OK);
|
||||||
|
|
||||||
|
/* Failing to load mfs_root is never going to end well! */
|
||||||
|
if (strcmp("mfs_root", typestr) == 0)
|
||||||
|
return (CMD_FATAL);
|
||||||
|
|
||||||
|
return (CMD_ERROR);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Do we have explicit KLD load ?
|
* Do we have explicit KLD load ?
|
||||||
*/
|
*/
|
||||||
if (dokld || file_havepath(argv[1])) {
|
if (dokld || file_havepath(argv[1])) {
|
||||||
error = mod_loadkld(argv[1], argc - 2, argv + 2);
|
error = mod_loadkld(argv[1], argc - 2, argv + 2);
|
||||||
if (error == EEXIST)
|
if (error == EEXIST) {
|
||||||
sprintf(command_errbuf, "warning: KLD '%s' already loaded", argv[1]);
|
sprintf(command_errbuf, "warning: KLD '%s' already loaded", argv[1]);
|
||||||
return (error == 0 ? CMD_OK : CMD_ERROR);
|
return (CMD_WARN);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (error == 0 ? CMD_OK : CMD_CRIT);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Looks like a request for a module.
|
* Looks like a request for a module.
|
||||||
*/
|
*/
|
||||||
error = mod_load(argv[1], NULL, argc - 2, argv + 2);
|
error = mod_load(argv[1], NULL, argc - 2, argv + 2);
|
||||||
if (error == EEXIST)
|
if (error == EEXIST) {
|
||||||
sprintf(command_errbuf, "warning: module '%s' already loaded", argv[1]);
|
sprintf(command_errbuf, "warning: module '%s' already loaded", argv[1]);
|
||||||
return (error == 0 ? CMD_OK : CMD_ERROR);
|
return (CMD_WARN);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (error == 0 ? CMD_OK : CMD_CRIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
COMMAND_SET(load_geli, "load_geli", "load a geli key", command_load_geli);
|
COMMAND_SET(load_geli, "load_geli", "load a geli key", command_load_geli);
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
LIB= efi_fdt
|
LIB= efi_fdt
|
||||||
INTERNALLIB=
|
INTERNALLIB=
|
||||||
WARNS?= 6
|
WARNS?= 6
|
||||||
|
CWARNFLAGS.gcc+= -Wno-strict-prototypes
|
||||||
|
CWARNFLAGS.gcc+= -Wno-redundant-decls
|
||||||
|
|
||||||
SRCS= efi_fdt.c
|
SRCS= efi_fdt.c
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
LIB= efi
|
LIB= efi
|
||||||
INTERNALLIB=
|
INTERNALLIB=
|
||||||
WARNS?= 2
|
WARNS?= 2
|
||||||
|
CWARNFLAGS.gcc+= -Wno-attributes
|
||||||
|
|
||||||
SRCS= delay.c efi_console.c efinet.c efipart.c errno.c handles.c \
|
SRCS= delay.c efi_console.c efinet.c efipart.c errno.c handles.c \
|
||||||
libefi.c time.c
|
libefi.c time.c
|
||||||
|
|||||||
@@ -1131,7 +1131,7 @@ linux_get_robust_list(struct thread *td, struct linux_get_robust_list_args *args
|
|||||||
return (EFAULT);
|
return (EFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
error = copyout(head, args->head, sizeof(struct linux_robust_list_head));
|
error = copyout(&head, args->head, sizeof(head));
|
||||||
if (error) {
|
if (error) {
|
||||||
LIN_SDT_PROBE1(futex, linux_get_robust_list, copyout_error,
|
LIN_SDT_PROBE1(futex, linux_get_robust_list, copyout_error,
|
||||||
error);
|
error);
|
||||||
|
|||||||
@@ -1304,9 +1304,11 @@ linux_setgroups(struct thread *td, struct linux_setgroups_args *args)
|
|||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
newcred = crget();
|
newcred = crget();
|
||||||
|
crextend(newcred, ngrp + 1);
|
||||||
p = td->td_proc;
|
p = td->td_proc;
|
||||||
PROC_LOCK(p);
|
PROC_LOCK(p);
|
||||||
oldcred = crcopysafe(p, newcred);
|
oldcred = p->p_ucred;
|
||||||
|
crcopy(newcred, oldcred);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cr_groups[0] holds egid. Setting the whole set from
|
* cr_groups[0] holds egid. Setting the whole set from
|
||||||
|
|||||||
@@ -273,6 +273,7 @@ dev/hyperv/vmbus/hv_channel.c optional hyperv
|
|||||||
dev/hyperv/vmbus/hv_channel_mgmt.c optional hyperv
|
dev/hyperv/vmbus/hv_channel_mgmt.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_connection.c optional hyperv
|
dev/hyperv/vmbus/hv_connection.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_hv.c optional hyperv
|
dev/hyperv/vmbus/hv_hv.c optional hyperv
|
||||||
|
dev/hyperv/vmbus/hv_et.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_ring_buffer.c optional hyperv
|
dev/hyperv/vmbus/hv_ring_buffer.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c optional hyperv
|
dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c optional hyperv
|
||||||
dev/nfe/if_nfe.c optional nfe pci
|
dev/nfe/if_nfe.c optional nfe pci
|
||||||
@@ -316,6 +317,7 @@ dev/sfxge/common/efx_ev.c optional sfxge pci
|
|||||||
dev/sfxge/common/efx_filter.c optional sfxge pci
|
dev/sfxge/common/efx_filter.c optional sfxge pci
|
||||||
dev/sfxge/common/efx_hash.c optional sfxge pci
|
dev/sfxge/common/efx_hash.c optional sfxge pci
|
||||||
dev/sfxge/common/efx_intr.c optional sfxge pci
|
dev/sfxge/common/efx_intr.c optional sfxge pci
|
||||||
|
dev/sfxge/common/efx_lic.c optional sfxge pci
|
||||||
dev/sfxge/common/efx_mac.c optional sfxge pci
|
dev/sfxge/common/efx_mac.c optional sfxge pci
|
||||||
dev/sfxge/common/efx_mcdi.c optional sfxge pci
|
dev/sfxge/common/efx_mcdi.c optional sfxge pci
|
||||||
dev/sfxge/common/efx_mon.c optional sfxge pci
|
dev/sfxge/common/efx_mon.c optional sfxge pci
|
||||||
|
|||||||
@@ -247,6 +247,7 @@ dev/hyperv/vmbus/hv_channel.c optional hyperv
|
|||||||
dev/hyperv/vmbus/hv_channel_mgmt.c optional hyperv
|
dev/hyperv/vmbus/hv_channel_mgmt.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_connection.c optional hyperv
|
dev/hyperv/vmbus/hv_connection.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_hv.c optional hyperv
|
dev/hyperv/vmbus/hv_hv.c optional hyperv
|
||||||
|
dev/hyperv/vmbus/hv_et.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_ring_buffer.c optional hyperv
|
dev/hyperv/vmbus/hv_ring_buffer.c optional hyperv
|
||||||
dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c optional hyperv
|
dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c optional hyperv
|
||||||
dev/ichwd/ichwd.c optional ichwd
|
dev/ichwd/ichwd.c optional ichwd
|
||||||
|
|||||||
+10
-10
@@ -663,7 +663,7 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane,
|
|||||||
plane->dev = dev;
|
plane->dev = dev;
|
||||||
plane->funcs = funcs;
|
plane->funcs = funcs;
|
||||||
plane->format_types = malloc(sizeof(uint32_t) * format_count,
|
plane->format_types = malloc(sizeof(uint32_t) * format_count,
|
||||||
DRM_MEM_KMS, M_NOWAIT);
|
DRM_MEM_KMS, M_WAITOK);
|
||||||
if (!plane->format_types) {
|
if (!plane->format_types) {
|
||||||
DRM_DEBUG_KMS("out of memory when allocating plane\n");
|
DRM_DEBUG_KMS("out of memory when allocating plane\n");
|
||||||
drm_mode_object_put(dev, &plane->base);
|
drm_mode_object_put(dev, &plane->base);
|
||||||
@@ -1010,7 +1010,7 @@ int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group)
|
|||||||
total_objects += dev->mode_config.num_encoder;
|
total_objects += dev->mode_config.num_encoder;
|
||||||
|
|
||||||
group->id_list = malloc(total_objects * sizeof(uint32_t),
|
group->id_list = malloc(total_objects * sizeof(uint32_t),
|
||||||
DRM_MEM_KMS, M_NOWAIT | M_ZERO);
|
DRM_MEM_KMS, M_WAITOK | M_ZERO);
|
||||||
if (!group->id_list)
|
if (!group->id_list)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@@ -1998,7 +1998,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
|
|||||||
|
|
||||||
connector_set = malloc(crtc_req->count_connectors *
|
connector_set = malloc(crtc_req->count_connectors *
|
||||||
sizeof(struct drm_connector *),
|
sizeof(struct drm_connector *),
|
||||||
DRM_MEM_KMS, M_NOWAIT);
|
DRM_MEM_KMS, M_WAITOK);
|
||||||
if (!connector_set) {
|
if (!connector_set) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
@@ -2523,7 +2523,7 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
|
|||||||
goto out_err1;
|
goto out_err1;
|
||||||
}
|
}
|
||||||
clips = malloc(num_clips * sizeof(*clips), DRM_MEM_KMS,
|
clips = malloc(num_clips * sizeof(*clips), DRM_MEM_KMS,
|
||||||
M_NOWAIT | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
if (!clips) {
|
if (!clips) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out_err1;
|
goto out_err1;
|
||||||
@@ -2774,13 +2774,13 @@ struct drm_property *drm_property_create(struct drm_device *dev, int flags,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
property = malloc(sizeof(struct drm_property), DRM_MEM_KMS,
|
property = malloc(sizeof(struct drm_property), DRM_MEM_KMS,
|
||||||
M_NOWAIT | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
if (!property)
|
if (!property)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (num_values) {
|
if (num_values) {
|
||||||
property->values = malloc(sizeof(uint64_t)*num_values, DRM_MEM_KMS,
|
property->values = malloc(sizeof(uint64_t)*num_values, DRM_MEM_KMS,
|
||||||
M_NOWAIT | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
if (!property->values)
|
if (!property->values)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@@ -2908,7 +2908,7 @@ int drm_property_add_enum(struct drm_property *property, int index,
|
|||||||
}
|
}
|
||||||
|
|
||||||
prop_enum = malloc(sizeof(struct drm_property_enum), DRM_MEM_KMS,
|
prop_enum = malloc(sizeof(struct drm_property_enum), DRM_MEM_KMS,
|
||||||
M_NOWAIT | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
if (!prop_enum)
|
if (!prop_enum)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@@ -3104,7 +3104,7 @@ static struct drm_property_blob *drm_property_create_blob(struct drm_device *dev
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
blob = malloc(sizeof(struct drm_property_blob)+length, DRM_MEM_KMS,
|
blob = malloc(sizeof(struct drm_property_blob)+length, DRM_MEM_KMS,
|
||||||
M_NOWAIT | M_ZERO);
|
M_WAITOK | M_ZERO);
|
||||||
if (!blob)
|
if (!blob)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -3434,7 +3434,7 @@ int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
|
|||||||
crtc->gamma_size = gamma_size;
|
crtc->gamma_size = gamma_size;
|
||||||
|
|
||||||
crtc->gamma_store = malloc(gamma_size * sizeof(uint16_t) * 3,
|
crtc->gamma_store = malloc(gamma_size * sizeof(uint16_t) * 3,
|
||||||
DRM_MEM_KMS, M_NOWAIT | M_ZERO);
|
DRM_MEM_KMS, M_WAITOK | M_ZERO);
|
||||||
if (!crtc->gamma_store) {
|
if (!crtc->gamma_store) {
|
||||||
crtc->gamma_size = 0;
|
crtc->gamma_size = 0;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -3632,7 +3632,7 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
|
|||||||
file_priv->event_space -= sizeof e->event;
|
file_priv->event_space -= sizeof e->event;
|
||||||
mtx_unlock(&dev->event_lock);
|
mtx_unlock(&dev->event_lock);
|
||||||
|
|
||||||
e = malloc(sizeof *e, DRM_MEM_KMS, M_NOWAIT | M_ZERO);
|
e = malloc(sizeof *e, DRM_MEM_KMS, M_WAITOK | M_ZERO);
|
||||||
if (e == NULL) {
|
if (e == NULL) {
|
||||||
mtx_lock(&dev->event_lock);
|
mtx_lock(&dev->event_lock);
|
||||||
file_priv->event_space += sizeof e->event;
|
file_priv->event_space += sizeof e->event;
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ int drm_pci_set_unique(struct drm_device *dev,
|
|||||||
|
|
||||||
master->unique_len = u->unique_len;
|
master->unique_len = u->unique_len;
|
||||||
master->unique_size = u->unique_len + 1;
|
master->unique_size = u->unique_len + 1;
|
||||||
master->unique = malloc(master->unique_size, DRM_MEM_DRIVER, M_NOWAIT);
|
master->unique = malloc(master->unique_size, DRM_MEM_DRIVER, M_WAITOK);
|
||||||
if (!master->unique) {
|
if (!master->unique) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err;
|
goto err;
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ i915_gem_wait_for_error(struct drm_device *dev)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!atomic_load_acq_int(&dev_priv->mm.wedged))
|
if (!atomic_load_acq_int(&dev_priv->mm.wedged))
|
||||||
return (0);
|
return 0;
|
||||||
|
|
||||||
mtx_lock(&dev_priv->error_completion_lock);
|
mtx_lock(&dev_priv->error_completion_lock);
|
||||||
while (dev_priv->error_completion == 0) {
|
while (dev_priv->error_completion == 0) {
|
||||||
@@ -166,7 +166,7 @@ i915_gem_wait_for_error(struct drm_device *dev)
|
|||||||
ret = -ERESTARTSYS;
|
ret = -ERESTARTSYS;
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
mtx_unlock(&dev_priv->error_completion_lock);
|
mtx_unlock(&dev_priv->error_completion_lock);
|
||||||
return (ret);
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mtx_unlock(&dev_priv->error_completion_lock);
|
mtx_unlock(&dev_priv->error_completion_lock);
|
||||||
@@ -1861,26 +1861,30 @@ i915_gem_object_put_pages_range(struct drm_i915_gem_object *obj,
|
|||||||
static void
|
static void
|
||||||
i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
|
i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
|
||||||
{
|
{
|
||||||
vm_page_t page;
|
int page_count = obj->base.size / PAGE_SIZE;
|
||||||
int page_count, i;
|
int i;
|
||||||
|
|
||||||
KASSERT(obj->madv != I915_MADV_PURGED_INTERNAL, ("Purged object"));
|
KASSERT(obj->madv != I915_MADV_PURGED_INTERNAL, ("Purged object"));
|
||||||
|
|
||||||
if (obj->tiling_mode != I915_TILING_NONE)
|
if (obj->tiling_mode != I915_TILING_NONE)
|
||||||
i915_gem_object_save_bit_17_swizzle(obj);
|
i915_gem_object_save_bit_17_swizzle(obj);
|
||||||
|
|
||||||
if (obj->madv == I915_MADV_DONTNEED)
|
if (obj->madv == I915_MADV_DONTNEED)
|
||||||
obj->dirty = 0;
|
obj->dirty = 0;
|
||||||
page_count = obj->base.size / PAGE_SIZE;
|
|
||||||
VM_OBJECT_WLOCK(obj->base.vm_obj);
|
VM_OBJECT_WLOCK(obj->base.vm_obj);
|
||||||
#if GEM_PARANOID_CHECK_GTT
|
#if GEM_PARANOID_CHECK_GTT
|
||||||
i915_gem_assert_pages_not_mapped(obj->base.dev, obj->pages, page_count);
|
i915_gem_assert_pages_not_mapped(obj->base.dev, obj->pages, page_count);
|
||||||
#endif
|
#endif
|
||||||
for (i = 0; i < page_count; i++) {
|
for (i = 0; i < page_count; i++) {
|
||||||
page = obj->pages[i];
|
vm_page_t page = obj->pages[i];
|
||||||
|
|
||||||
if (obj->dirty)
|
if (obj->dirty)
|
||||||
vm_page_dirty(page);
|
vm_page_dirty(page);
|
||||||
|
|
||||||
if (obj->madv == I915_MADV_WILLNEED)
|
if (obj->madv == I915_MADV_WILLNEED)
|
||||||
vm_page_reference(page);
|
vm_page_reference(page);
|
||||||
|
|
||||||
vm_page_lock(page);
|
vm_page_lock(page);
|
||||||
vm_page_unwire(obj->pages[i], PQ_ACTIVE);
|
vm_page_unwire(obj->pages[i], PQ_ACTIVE);
|
||||||
vm_page_unlock(page);
|
vm_page_unlock(page);
|
||||||
@@ -1888,6 +1892,7 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
|
|||||||
}
|
}
|
||||||
VM_OBJECT_WUNLOCK(obj->base.vm_obj);
|
VM_OBJECT_WUNLOCK(obj->base.vm_obj);
|
||||||
obj->dirty = 0;
|
obj->dirty = 0;
|
||||||
|
|
||||||
free(obj->pages, DRM_I915_GEM);
|
free(obj->pages, DRM_I915_GEM);
|
||||||
obj->pages = NULL;
|
obj->pages = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -411,8 +411,8 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
|
|||||||
reloc->offset += obj->gtt_offset;
|
reloc->offset += obj->gtt_offset;
|
||||||
reloc_page = pmap_mapdev_attr(dev->agp->base + (reloc->offset &
|
reloc_page = pmap_mapdev_attr(dev->agp->base + (reloc->offset &
|
||||||
~PAGE_MASK), PAGE_SIZE, PAT_WRITE_COMBINING);
|
~PAGE_MASK), PAGE_SIZE, PAT_WRITE_COMBINING);
|
||||||
reloc_entry = (uint32_t *)(reloc_page + (reloc->offset &
|
reloc_entry = (uint32_t *)
|
||||||
PAGE_MASK));
|
(reloc_page + (reloc->offset & PAGE_MASK));
|
||||||
*(volatile uint32_t *)reloc_entry = reloc->delta;
|
*(volatile uint32_t *)reloc_entry = reloc->delta;
|
||||||
pmap_unmapdev((vm_offset_t)reloc_page, PAGE_SIZE);
|
pmap_unmapdev((vm_offset_t)reloc_page, PAGE_SIZE);
|
||||||
}
|
}
|
||||||
@@ -502,7 +502,7 @@ i915_gem_execbuffer_relocate(struct drm_device *dev,
|
|||||||
struct list_head *objects)
|
struct list_head *objects)
|
||||||
{
|
{
|
||||||
struct drm_i915_gem_object *obj;
|
struct drm_i915_gem_object *obj;
|
||||||
int ret, pflags;
|
int ret = 0, pflags;
|
||||||
|
|
||||||
/* Try to move as many of the relocation targets off the active list
|
/* Try to move as many of the relocation targets off the active list
|
||||||
* to avoid unnecessary fallbacks to the slow path, as we cannot wait
|
* to avoid unnecessary fallbacks to the slow path, as we cannot wait
|
||||||
@@ -510,7 +510,6 @@ i915_gem_execbuffer_relocate(struct drm_device *dev,
|
|||||||
*/
|
*/
|
||||||
i915_gem_retire_requests(dev);
|
i915_gem_retire_requests(dev);
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
/* This is the fast path and we cannot handle a pagefault whilst
|
/* This is the fast path and we cannot handle a pagefault whilst
|
||||||
* holding the device lock lest the user pass in the relocations
|
* holding the device lock lest the user pass in the relocations
|
||||||
* contained within a mmaped bo. For in such a case we, the page
|
* contained within a mmaped bo. For in such a case we, the page
|
||||||
@@ -952,6 +951,7 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec, int count,
|
|||||||
*map = malloc(count * sizeof(*ma), DRM_I915_GEM, M_WAITOK | M_ZERO);
|
*map = malloc(count * sizeof(*ma), DRM_I915_GEM, M_WAITOK | M_ZERO);
|
||||||
*maplen = malloc(count * sizeof(*maplen), DRM_I915_GEM, M_WAITOK |
|
*maplen = malloc(count * sizeof(*maplen), DRM_I915_GEM, M_WAITOK |
|
||||||
M_ZERO);
|
M_ZERO);
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
/* First check for malicious input causing overflow */
|
/* First check for malicious input causing overflow */
|
||||||
if (exec[i].relocation_count >
|
if (exec[i].relocation_count >
|
||||||
|
|||||||
@@ -107,21 +107,22 @@ int i915_gem_init_aliasing_ppgtt(struct drm_device *dev)
|
|||||||
I915_PPGTT_PT_ENTRIES);
|
I915_PPGTT_PT_ENTRIES);
|
||||||
ppgtt->pd_offset = (first_pd_entry_in_global_pt) * sizeof(uint32_t);
|
ppgtt->pd_offset = (first_pd_entry_in_global_pt) * sizeof(uint32_t);
|
||||||
dev_priv->mm.aliasing_ppgtt = ppgtt;
|
dev_priv->mm.aliasing_ppgtt = ppgtt;
|
||||||
return (0);
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void i915_ppgtt_insert_pages(struct i915_hw_ppgtt *ppgtt,
|
||||||
i915_ppgtt_insert_pages(struct i915_hw_ppgtt *ppgtt, unsigned first_entry,
|
unsigned first_entry,
|
||||||
unsigned num_entries, vm_page_t *pages, uint32_t pte_flags)
|
unsigned num_entries,
|
||||||
|
vm_page_t *pages,
|
||||||
|
uint32_t pte_flags)
|
||||||
{
|
{
|
||||||
uint32_t *pt_vaddr, pte;
|
uint32_t *pt_vaddr, pte;
|
||||||
struct sf_buf *sf;
|
unsigned act_pd = first_entry / I915_PPGTT_PT_ENTRIES;
|
||||||
unsigned act_pd, first_pte;
|
unsigned first_pte = first_entry % I915_PPGTT_PT_ENTRIES;
|
||||||
unsigned last_pte, i;
|
unsigned j, last_pte;
|
||||||
vm_paddr_t page_addr;
|
vm_paddr_t page_addr;
|
||||||
|
struct sf_buf *sf;
|
||||||
act_pd = first_entry / I915_PPGTT_PT_ENTRIES;
|
|
||||||
first_pte = first_entry % I915_PPGTT_PT_ENTRIES;
|
|
||||||
|
|
||||||
while (num_entries) {
|
while (num_entries) {
|
||||||
last_pte = first_pte + num_entries;
|
last_pte = first_pte + num_entries;
|
||||||
@@ -132,10 +133,10 @@ i915_ppgtt_insert_pages(struct i915_hw_ppgtt *ppgtt, unsigned first_entry,
|
|||||||
sf = sf_buf_alloc(ppgtt->pt_pages[act_pd], SFB_CPUPRIVATE);
|
sf = sf_buf_alloc(ppgtt->pt_pages[act_pd], SFB_CPUPRIVATE);
|
||||||
pt_vaddr = (uint32_t *)(uintptr_t)sf_buf_kva(sf);
|
pt_vaddr = (uint32_t *)(uintptr_t)sf_buf_kva(sf);
|
||||||
|
|
||||||
for (i = first_pte; i < last_pte; i++) {
|
for (j = first_pte; j < last_pte; j++) {
|
||||||
page_addr = VM_PAGE_TO_PHYS(*pages);
|
page_addr = VM_PAGE_TO_PHYS(*pages);
|
||||||
pte = GEN6_PTE_ADDR_ENCODE(page_addr);
|
pte = GEN6_PTE_ADDR_ENCODE(page_addr);
|
||||||
pt_vaddr[i] = pte | pte_flags;
|
pt_vaddr[j] = pte | pte_flags;
|
||||||
|
|
||||||
pages++;
|
pages++;
|
||||||
}
|
}
|
||||||
@@ -194,18 +195,21 @@ void i915_gem_init_ppgtt(struct drm_device *dev)
|
|||||||
struct intel_ring_buffer *ring;
|
struct intel_ring_buffer *ring;
|
||||||
struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
|
struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
|
||||||
u_int first_pd_entry_in_global_pt;
|
u_int first_pd_entry_in_global_pt;
|
||||||
vm_paddr_t pt_addr;
|
|
||||||
uint32_t pd_entry;
|
uint32_t pd_entry;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!dev_priv->mm.aliasing_ppgtt)
|
if (!dev_priv->mm.aliasing_ppgtt)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
first_pd_entry_in_global_pt = 512 * 1024 - I915_PPGTT_PD_ENTRIES;
|
first_pd_entry_in_global_pt = 512 * 1024 - I915_PPGTT_PD_ENTRIES;
|
||||||
for (i = 0; i < ppgtt->num_pd_entries; i++) {
|
for (i = 0; i < ppgtt->num_pd_entries; i++) {
|
||||||
|
vm_paddr_t pt_addr;
|
||||||
|
|
||||||
pt_addr = VM_PAGE_TO_PHYS(ppgtt->pt_pages[i]);
|
pt_addr = VM_PAGE_TO_PHYS(ppgtt->pt_pages[i]);
|
||||||
pd_entry = GEN6_PDE_ADDR_ENCODE(pt_addr);
|
pd_entry = GEN6_PDE_ADDR_ENCODE(pt_addr);
|
||||||
pd_entry |= GEN6_PDE_VALID;
|
pd_entry |= GEN6_PDE_VALID;
|
||||||
|
|
||||||
intel_gtt_write(first_pd_entry_in_global_pt + i, pd_entry);
|
intel_gtt_write(first_pd_entry_in_global_pt + i, pd_entry);
|
||||||
}
|
}
|
||||||
intel_gtt_read_pte(first_pd_entry_in_global_pt);
|
intel_gtt_read_pte(first_pd_entry_in_global_pt);
|
||||||
@@ -336,8 +340,7 @@ int i915_gem_gtt_prepare_object(struct drm_i915_gem_object *obj)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj,
|
||||||
i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj,
|
|
||||||
enum i915_cache_level cache_level)
|
enum i915_cache_level cache_level)
|
||||||
{
|
{
|
||||||
struct drm_device *dev;
|
struct drm_device *dev;
|
||||||
@@ -379,11 +382,10 @@ int i915_gem_init_global_gtt(struct drm_device *dev,
|
|||||||
unsigned long mappable_end,
|
unsigned long mappable_end,
|
||||||
unsigned long end)
|
unsigned long end)
|
||||||
{
|
{
|
||||||
drm_i915_private_t *dev_priv;
|
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||||
unsigned long mappable;
|
unsigned long mappable;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
dev_priv = dev->dev_private;
|
|
||||||
mappable = min(end, mappable_end) - start;
|
mappable = min(end, mappable_end) - start;
|
||||||
|
|
||||||
/* Substract the guard page ... */
|
/* Substract the guard page ... */
|
||||||
|
|||||||
@@ -453,15 +453,15 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
|
|||||||
* by the GPU.
|
* by the GPU.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
i915_gem_swizzle_page(vm_page_t m)
|
i915_gem_swizzle_page(vm_page_t page)
|
||||||
{
|
{
|
||||||
char temp[64];
|
char temp[64];
|
||||||
char *vaddr;
|
|
||||||
struct sf_buf *sf;
|
struct sf_buf *sf;
|
||||||
|
char *vaddr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* XXXKIB sleep */
|
/* XXXKIB sleep */
|
||||||
sf = sf_buf_alloc(m, SFB_DEFAULT);
|
sf = sf_buf_alloc(page, SFB_DEFAULT);
|
||||||
vaddr = (char *)sf_buf_kva(sf);
|
vaddr = (char *)sf_buf_kva(sf);
|
||||||
|
|
||||||
for (i = 0; i < PAGE_SIZE; i += 128) {
|
for (i = 0; i < PAGE_SIZE; i += 128) {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <dev/drm2/i915/i915_drm.h>
|
#include <dev/drm2/i915/i915_drm.h>
|
||||||
#include <dev/drm2/i915/i915_drv.h>
|
#include <dev/drm2/i915/i915_drv.h>
|
||||||
#include <dev/drm2/i915/intel_drv.h>
|
#include <dev/drm2/i915/intel_drv.h>
|
||||||
|
|
||||||
#include <sys/sched.h>
|
#include <sys/sched.h>
|
||||||
#include <sys/sf_buf.h>
|
#include <sys/sf_buf.h>
|
||||||
#include <sys/sleepqueue.h>
|
#include <sys/sleepqueue.h>
|
||||||
@@ -770,42 +771,47 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
|
|||||||
struct drm_i915_gem_object *src)
|
struct drm_i915_gem_object *src)
|
||||||
{
|
{
|
||||||
struct drm_i915_error_object *dst;
|
struct drm_i915_error_object *dst;
|
||||||
struct sf_buf *sf;
|
int i, count;
|
||||||
void *d, *s;
|
|
||||||
int page, page_count;
|
|
||||||
u32 reloc_offset;
|
u32 reloc_offset;
|
||||||
|
|
||||||
if (src == NULL || src->pages == NULL)
|
if (src == NULL || src->pages == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
page_count = src->base.size / PAGE_SIZE;
|
count = src->base.size / PAGE_SIZE;
|
||||||
|
|
||||||
dst = malloc(sizeof(*dst) + page_count * sizeof(u32 *), DRM_I915_GEM,
|
dst = malloc(sizeof(*dst) + count * sizeof(u32 *), DRM_I915_GEM, M_NOWAIT);
|
||||||
M_NOWAIT);
|
|
||||||
if (dst == NULL)
|
if (dst == NULL)
|
||||||
return (NULL);
|
return NULL;
|
||||||
|
|
||||||
reloc_offset = src->gtt_offset;
|
reloc_offset = src->gtt_offset;
|
||||||
for (page = 0; page < page_count; page++) {
|
for (i = 0; i < count; i++) {
|
||||||
|
void *d;
|
||||||
|
|
||||||
d = malloc(PAGE_SIZE, DRM_I915_GEM, M_NOWAIT);
|
d = malloc(PAGE_SIZE, DRM_I915_GEM, M_NOWAIT);
|
||||||
if (d == NULL)
|
if (d == NULL)
|
||||||
goto unwind;
|
goto unwind;
|
||||||
|
|
||||||
if (reloc_offset < dev_priv->mm.gtt_mappable_end &&
|
if (reloc_offset < dev_priv->mm.gtt_mappable_end &&
|
||||||
src->has_global_gtt_mapping) {
|
src->has_global_gtt_mapping) {
|
||||||
|
void *s;
|
||||||
|
|
||||||
/* Simply ignore tiling or any overlapping fence.
|
/* Simply ignore tiling or any overlapping fence.
|
||||||
* It's part of the error state, and this hopefully
|
* It's part of the error state, and this hopefully
|
||||||
* captures what the GPU read.
|
* captures what the GPU read.
|
||||||
*/
|
*/
|
||||||
s = pmap_mapdev_attr(src->base.dev->agp->base +
|
s = pmap_mapdev_attr(src->base.dev->agp->base +
|
||||||
reloc_offset, PAGE_SIZE, PAT_WRITE_COMBINING);
|
reloc_offset,
|
||||||
|
PAGE_SIZE, PAT_WRITE_COMBINING);
|
||||||
memcpy(d, s, PAGE_SIZE);
|
memcpy(d, s, PAGE_SIZE);
|
||||||
pmap_unmapdev((vm_offset_t)s, PAGE_SIZE);
|
pmap_unmapdev((vm_offset_t)s, PAGE_SIZE);
|
||||||
} else {
|
} else {
|
||||||
drm_clflush_pages(&src->pages[page], 1);
|
struct sf_buf *sf;
|
||||||
|
void *s;
|
||||||
|
|
||||||
|
drm_clflush_pages(&src->pages[i], 1);
|
||||||
|
|
||||||
sched_pin();
|
sched_pin();
|
||||||
sf = sf_buf_alloc(src->pages[page], SFB_CPUPRIVATE |
|
sf = sf_buf_alloc(src->pages[i], SFB_CPUPRIVATE |
|
||||||
SFB_NOWAIT);
|
SFB_NOWAIT);
|
||||||
if (sf != NULL) {
|
if (sf != NULL) {
|
||||||
s = (void *)(uintptr_t)sf_buf_kva(sf);
|
s = (void *)(uintptr_t)sf_buf_kva(sf);
|
||||||
@@ -817,21 +823,21 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
|
|||||||
}
|
}
|
||||||
sched_unpin();
|
sched_unpin();
|
||||||
|
|
||||||
drm_clflush_pages(&src->pages[page], 1);
|
drm_clflush_pages(&src->pages[i], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
dst->pages[page] = d;
|
dst->pages[i] = d;
|
||||||
|
|
||||||
reloc_offset += PAGE_SIZE;
|
reloc_offset += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
dst->page_count = page_count;
|
dst->page_count = count;
|
||||||
dst->gtt_offset = src->gtt_offset;
|
dst->gtt_offset = src->gtt_offset;
|
||||||
|
|
||||||
return dst;
|
return dst;
|
||||||
|
|
||||||
unwind:
|
unwind:
|
||||||
while (page--)
|
while (i--)
|
||||||
free(dst->pages[page], DRM_I915_GEM);
|
free(dst->pages[i], DRM_I915_GEM);
|
||||||
free(dst, DRM_I915_GEM);
|
free(dst, DRM_I915_GEM);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -2571,6 +2577,7 @@ void intel_irq_init(struct drm_device *dev)
|
|||||||
dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
|
dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
|
||||||
dev->driver->get_vblank_counter = gm45_get_vblank_counter;
|
dev->driver->get_vblank_counter = gm45_get_vblank_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||||
dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp;
|
dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -598,8 +598,7 @@ void intel_crt_init(struct drm_device *dev)
|
|||||||
|
|
||||||
crt = malloc(sizeof(struct intel_crt), DRM_MEM_KMS, M_WAITOK | M_ZERO);
|
crt = malloc(sizeof(struct intel_crt), DRM_MEM_KMS, M_WAITOK | M_ZERO);
|
||||||
|
|
||||||
intel_connector = malloc(sizeof(struct intel_connector), DRM_MEM_KMS,
|
intel_connector = malloc(sizeof(struct intel_connector), DRM_MEM_KMS, M_WAITOK | M_ZERO);
|
||||||
M_WAITOK | M_ZERO);
|
|
||||||
|
|
||||||
connector = &intel_connector->base;
|
connector = &intel_connector->base;
|
||||||
drm_connector_init(dev, &intel_connector->base,
|
drm_connector_init(dev, &intel_connector->base,
|
||||||
|
|||||||
@@ -1382,9 +1382,8 @@ intel_sbi_write(struct drm_i915_private *dev_priv, u16 reg, u32 value)
|
|||||||
static u32
|
static u32
|
||||||
intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg)
|
intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg)
|
||||||
{
|
{
|
||||||
u32 value;
|
u32 value = 0;
|
||||||
|
|
||||||
value = 0;
|
|
||||||
mtx_lock(&dev_priv->dpio_lock);
|
mtx_lock(&dev_priv->dpio_lock);
|
||||||
if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_READY) == 0, 100)) {
|
if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_READY) == 0, 100)) {
|
||||||
DRM_ERROR("timeout waiting for SBI to become ready\n");
|
DRM_ERROR("timeout waiting for SBI to become ready\n");
|
||||||
@@ -1517,7 +1516,8 @@ static void intel_enable_transcoder(struct drm_i915_private *dev_priv,
|
|||||||
KASSERT(dev_priv->info->gen >= 5, ("Wrong device gen"));
|
KASSERT(dev_priv->info->gen >= 5, ("Wrong device gen"));
|
||||||
|
|
||||||
/* Make sure PCH DPLL is enabled */
|
/* Make sure PCH DPLL is enabled */
|
||||||
assert_pch_pll_enabled(dev_priv, to_intel_crtc(crtc));
|
assert_pch_pll_enabled(dev_priv,
|
||||||
|
to_intel_crtc(crtc));
|
||||||
|
|
||||||
/* FDI must be feeding us bits for PCH ports */
|
/* FDI must be feeding us bits for PCH ports */
|
||||||
assert_fdi_tx_enabled(dev_priv, pipe);
|
assert_fdi_tx_enabled(dev_priv, pipe);
|
||||||
@@ -1527,9 +1527,11 @@ static void intel_enable_transcoder(struct drm_i915_private *dev_priv,
|
|||||||
DRM_ERROR("Attempting to enable transcoder on Haswell with pipe > 0\n");
|
DRM_ERROR("Attempting to enable transcoder on Haswell with pipe > 0\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
reg = TRANSCONF(pipe);
|
reg = TRANSCONF(pipe);
|
||||||
val = I915_READ(reg);
|
val = I915_READ(reg);
|
||||||
pipeconf_val = I915_READ(PIPECONF(pipe));
|
pipeconf_val = I915_READ(PIPECONF(pipe));
|
||||||
|
|
||||||
if (HAS_PCH_IBX(dev_priv->dev)) {
|
if (HAS_PCH_IBX(dev_priv->dev)) {
|
||||||
/*
|
/*
|
||||||
* make the BPC in transcoder be consistent with
|
* make the BPC in transcoder be consistent with
|
||||||
@@ -1886,6 +1888,7 @@ static int i9xx_update_plane(struct drm_crtc *crtc, struct drm_framebuffer *fb,
|
|||||||
DRM_ERROR("Unknown color depth %d\n", fb->bits_per_pixel);
|
DRM_ERROR("Unknown color depth %d\n", fb->bits_per_pixel);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (INTEL_INFO(dev)->gen >= 4) {
|
if (INTEL_INFO(dev)->gen >= 4) {
|
||||||
if (obj->tiling_mode != I915_TILING_NONE)
|
if (obj->tiling_mode != I915_TILING_NONE)
|
||||||
dspcntr |= DISPPLANE_TILED;
|
dspcntr |= DISPPLANE_TILED;
|
||||||
@@ -7132,7 +7135,7 @@ int intel_modeset_vga_set_state(struct drm_device *dev, bool state)
|
|||||||
else
|
else
|
||||||
gmch_ctrl |= INTEL_GMCH_VGA_DISABLE;
|
gmch_ctrl |= INTEL_GMCH_VGA_DISABLE;
|
||||||
pci_write_config(bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl, 2);
|
pci_write_config(bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl, 2);
|
||||||
return (0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct intel_display_error_state {
|
struct intel_display_error_state {
|
||||||
|
|||||||
@@ -1138,8 +1138,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
params = malloc(sizeof(struct put_image_params), DRM_I915_GEM,
|
params = malloc(sizeof(struct put_image_params), DRM_I915_GEM, M_WAITOK | M_ZERO);
|
||||||
M_WAITOK | M_ZERO);
|
|
||||||
|
|
||||||
drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id,
|
drmmode_obj = drm_mode_object_find(dev, put_image_rec->crtc_id,
|
||||||
DRM_MODE_OBJECT_CRTC);
|
DRM_MODE_OBJECT_CRTC);
|
||||||
@@ -1403,8 +1402,7 @@ void intel_setup_overlay(struct drm_device *dev)
|
|||||||
if (!HAS_OVERLAY(dev))
|
if (!HAS_OVERLAY(dev))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
overlay = malloc(sizeof(struct intel_overlay), DRM_I915_GEM,
|
overlay = malloc(sizeof(struct intel_overlay), DRM_I915_GEM, M_WAITOK | M_ZERO);
|
||||||
M_WAITOK | M_ZERO);
|
|
||||||
DRM_LOCK(dev);
|
DRM_LOCK(dev);
|
||||||
if (dev_priv->overlay != NULL)
|
if (dev_priv->overlay != NULL)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
@@ -1523,16 +1521,15 @@ intel_overlay_capture_error_state(struct drm_device *dev)
|
|||||||
memcpy(&error->regs, regs, sizeof(struct overlay_registers));
|
memcpy(&error->regs, regs, sizeof(struct overlay_registers));
|
||||||
intel_overlay_unmap_regs(overlay, regs);
|
intel_overlay_unmap_regs(overlay, regs);
|
||||||
|
|
||||||
return (error);
|
return error;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
free(error, DRM_I915_GEM);
|
free(error, DRM_I915_GEM);
|
||||||
return (NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
intel_overlay_print_error_state(struct sbuf *m,
|
intel_overlay_print_error_state(struct sbuf *m, struct intel_overlay_error_state *error)
|
||||||
struct intel_overlay_error_state *error)
|
|
||||||
{
|
{
|
||||||
sbuf_printf(m, "Overlay, status: 0x%08x, interrupt: 0x%08x\n",
|
sbuf_printf(m, "Overlay, status: 0x%08x, interrupt: 0x%08x\n",
|
||||||
error->dovsta, error->isr);
|
error->dovsta, error->isr);
|
||||||
|
|||||||
+8
-11
@@ -2035,9 +2035,9 @@ em_xmit(struct tx_ring *txr, struct mbuf **m_headp)
|
|||||||
if (error == EFBIG && remap) {
|
if (error == EFBIG && remap) {
|
||||||
struct mbuf *m;
|
struct mbuf *m;
|
||||||
|
|
||||||
m = m_defrag(*m_headp, M_NOWAIT);
|
m = m_collapse(*m_headp, M_NOWAIT, EM_MAX_SCATTER);
|
||||||
if (m == NULL) {
|
if (m == NULL) {
|
||||||
adapter->mbuf_alloc_failed++;
|
adapter->mbuf_defrag_failed++;
|
||||||
m_freem(*m_headp);
|
m_freem(*m_headp);
|
||||||
*m_headp = NULL;
|
*m_headp = NULL;
|
||||||
return (ENOBUFS);
|
return (ENOBUFS);
|
||||||
@@ -5493,18 +5493,15 @@ em_add_hw_stats(struct adapter *adapter)
|
|||||||
char namebuf[QUEUE_NAME_LEN];
|
char namebuf[QUEUE_NAME_LEN];
|
||||||
|
|
||||||
/* Driver Statistics */
|
/* Driver Statistics */
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
|
|
||||||
CTLFLAG_RD, &adapter->link_irq,
|
|
||||||
"Link MSIX IRQ Handled");
|
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_alloc_fail",
|
|
||||||
CTLFLAG_RD, &adapter->mbuf_alloc_failed,
|
|
||||||
"Std mbuf failed");
|
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "cluster_alloc_fail",
|
|
||||||
CTLFLAG_RD, &adapter->mbuf_cluster_failed,
|
|
||||||
"Std mbuf cluster failed");
|
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
|
||||||
CTLFLAG_RD, &adapter->dropped_pkts,
|
CTLFLAG_RD, &adapter->dropped_pkts,
|
||||||
"Driver dropped packets");
|
"Driver dropped packets");
|
||||||
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
|
||||||
|
CTLFLAG_RD, &adapter->link_irq,
|
||||||
|
"Link MSIX IRQ Handled");
|
||||||
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_defrag_fail",
|
||||||
|
CTLFLAG_RD, &adapter->mbuf_defrag_failed,
|
||||||
|
"Defragmenting mbuf chain failed");
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "tx_dma_fail",
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "tx_dma_fail",
|
||||||
CTLFLAG_RD, &adapter->no_tx_dma_setup,
|
CTLFLAG_RD, &adapter->no_tx_dma_setup,
|
||||||
"Driver tx dma failure in xmit");
|
"Driver tx dma failure in xmit");
|
||||||
|
|||||||
@@ -473,13 +473,12 @@ struct adapter {
|
|||||||
|
|
||||||
/* Misc stats maintained by the driver */
|
/* Misc stats maintained by the driver */
|
||||||
unsigned long dropped_pkts;
|
unsigned long dropped_pkts;
|
||||||
unsigned long mbuf_alloc_failed;
|
unsigned long link_irq;
|
||||||
unsigned long mbuf_cluster_failed;
|
unsigned long mbuf_defrag_failed;
|
||||||
unsigned long no_tx_map_avail;
|
|
||||||
unsigned long no_tx_dma_setup;
|
unsigned long no_tx_dma_setup;
|
||||||
|
unsigned long no_tx_map_avail;
|
||||||
unsigned long rx_overruns;
|
unsigned long rx_overruns;
|
||||||
unsigned long watchdog_events;
|
unsigned long watchdog_events;
|
||||||
unsigned long link_irq;
|
|
||||||
|
|
||||||
struct e1000_hw_stats stats;
|
struct e1000_hw_stats stats;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1835,7 +1835,8 @@ igb_xmit(struct tx_ring *txr, struct mbuf **m_headp)
|
|||||||
/* Try it again? - one try */
|
/* Try it again? - one try */
|
||||||
if (remap == TRUE) {
|
if (remap == TRUE) {
|
||||||
remap = FALSE;
|
remap = FALSE;
|
||||||
m = m_defrag(*m_headp, M_NOWAIT);
|
m = m_collapse(*m_headp, M_NOWAIT,
|
||||||
|
IGB_MAX_SCATTER);
|
||||||
if (m == NULL) {
|
if (m == NULL) {
|
||||||
adapter->mbuf_defrag_failed++;
|
adapter->mbuf_defrag_failed++;
|
||||||
m_freem(*m_headp);
|
m_freem(*m_headp);
|
||||||
@@ -5826,12 +5827,15 @@ igb_add_hw_stats(struct adapter *adapter)
|
|||||||
char namebuf[QUEUE_NAME_LEN];
|
char namebuf[QUEUE_NAME_LEN];
|
||||||
|
|
||||||
/* Driver Statistics */
|
/* Driver Statistics */
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
|
|
||||||
CTLFLAG_RD, &adapter->link_irq,
|
|
||||||
"Link MSIX IRQ Handled");
|
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
|
||||||
CTLFLAG_RD, &adapter->dropped_pkts,
|
CTLFLAG_RD, &adapter->dropped_pkts,
|
||||||
"Driver dropped packets");
|
"Driver dropped packets");
|
||||||
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
|
||||||
|
CTLFLAG_RD, &adapter->link_irq,
|
||||||
|
"Link MSIX IRQ Handled");
|
||||||
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_defrag_fail",
|
||||||
|
CTLFLAG_RD, &adapter->mbuf_defrag_failed,
|
||||||
|
"Defragmenting mbuf chain failed");
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "tx_dma_fail",
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "tx_dma_fail",
|
||||||
CTLFLAG_RD, &adapter->no_tx_dma_setup,
|
CTLFLAG_RD, &adapter->no_tx_dma_setup,
|
||||||
"Driver tx dma failure in xmit");
|
"Driver tx dma failure in xmit");
|
||||||
|
|||||||
+9
-10
@@ -512,20 +512,19 @@ struct adapter {
|
|||||||
u8 *mta;
|
u8 *mta;
|
||||||
|
|
||||||
/* Misc stats maintained by the driver */
|
/* Misc stats maintained by the driver */
|
||||||
unsigned long dropped_pkts;
|
|
||||||
unsigned long mbuf_defrag_failed;
|
|
||||||
unsigned long mbuf_header_failed;
|
|
||||||
unsigned long mbuf_packet_failed;
|
|
||||||
unsigned long no_tx_dma_setup;
|
|
||||||
unsigned long watchdog_events;
|
|
||||||
unsigned long link_irq;
|
|
||||||
unsigned long rx_overruns;
|
|
||||||
unsigned long device_control;
|
unsigned long device_control;
|
||||||
unsigned long rx_control;
|
unsigned long dropped_pkts;
|
||||||
unsigned long int_mask;
|
|
||||||
unsigned long eint_mask;
|
unsigned long eint_mask;
|
||||||
|
unsigned long int_mask;
|
||||||
|
unsigned long link_irq;
|
||||||
|
unsigned long mbuf_defrag_failed;
|
||||||
|
unsigned long no_tx_dma_setup;
|
||||||
unsigned long packet_buf_alloc_rx;
|
unsigned long packet_buf_alloc_rx;
|
||||||
unsigned long packet_buf_alloc_tx;
|
unsigned long packet_buf_alloc_tx;
|
||||||
|
unsigned long rx_control;
|
||||||
|
unsigned long rx_overruns;
|
||||||
|
unsigned long watchdog_events;
|
||||||
|
|
||||||
/* Used in pf and vf */
|
/* Used in pf and vf */
|
||||||
void *stats;
|
void *stats;
|
||||||
|
|
||||||
|
|||||||
@@ -1675,9 +1675,9 @@ lem_xmit(struct adapter *adapter, struct mbuf **m_headp)
|
|||||||
if (error == EFBIG) {
|
if (error == EFBIG) {
|
||||||
struct mbuf *m;
|
struct mbuf *m;
|
||||||
|
|
||||||
m = m_defrag(*m_headp, M_NOWAIT);
|
m = m_collapse(*m_headp, M_NOWAIT, EM_MAX_SCATTER);
|
||||||
if (m == NULL) {
|
if (m == NULL) {
|
||||||
adapter->mbuf_alloc_failed++;
|
adapter->mbuf_defrag_failed++;
|
||||||
m_freem(*m_headp);
|
m_freem(*m_headp);
|
||||||
*m_headp = NULL;
|
*m_headp = NULL;
|
||||||
return (ENOBUFS);
|
return (ENOBUFS);
|
||||||
@@ -4526,12 +4526,12 @@ lem_add_hw_stats(struct adapter *adapter)
|
|||||||
struct sysctl_oid_list *stat_list;
|
struct sysctl_oid_list *stat_list;
|
||||||
|
|
||||||
/* Driver Statistics */
|
/* Driver Statistics */
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_alloc_fail",
|
|
||||||
CTLFLAG_RD, &adapter->mbuf_alloc_failed,
|
|
||||||
"Std mbuf failed");
|
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "cluster_alloc_fail",
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "cluster_alloc_fail",
|
||||||
CTLFLAG_RD, &adapter->mbuf_cluster_failed,
|
CTLFLAG_RD, &adapter->mbuf_cluster_failed,
|
||||||
"Std mbuf cluster failed");
|
"Std mbuf cluster failed");
|
||||||
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_defrag_fail",
|
||||||
|
CTLFLAG_RD, &adapter->mbuf_defrag_failed,
|
||||||
|
"Defragmenting mbuf chain failed");
|
||||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
|
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
|
||||||
CTLFLAG_RD, &adapter->dropped_pkts,
|
CTLFLAG_RD, &adapter->dropped_pkts,
|
||||||
"Driver dropped packets");
|
"Driver dropped packets");
|
||||||
|
|||||||
@@ -417,17 +417,17 @@ struct adapter {
|
|||||||
|
|
||||||
/* Misc stats maintained by the driver */
|
/* Misc stats maintained by the driver */
|
||||||
unsigned long dropped_pkts;
|
unsigned long dropped_pkts;
|
||||||
unsigned long mbuf_alloc_failed;
|
unsigned long link_irq;
|
||||||
unsigned long mbuf_cluster_failed;
|
unsigned long mbuf_cluster_failed;
|
||||||
|
unsigned long mbuf_defrag_failed;
|
||||||
unsigned long no_tx_desc_avail1;
|
unsigned long no_tx_desc_avail1;
|
||||||
unsigned long no_tx_desc_avail2;
|
unsigned long no_tx_desc_avail2;
|
||||||
unsigned long no_tx_map_avail;
|
|
||||||
unsigned long no_tx_dma_setup;
|
unsigned long no_tx_dma_setup;
|
||||||
|
unsigned long no_tx_map_avail;
|
||||||
unsigned long watchdog_events;
|
unsigned long watchdog_events;
|
||||||
unsigned long rx_overruns;
|
|
||||||
unsigned long rx_irq;
|
unsigned long rx_irq;
|
||||||
|
unsigned long rx_overruns;
|
||||||
unsigned long tx_irq;
|
unsigned long tx_irq;
|
||||||
unsigned long link_irq;
|
|
||||||
|
|
||||||
/* 82547 workaround */
|
/* 82547 workaround */
|
||||||
uint32_t tx_fifo_size;
|
uint32_t tx_fifo_size;
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ gpiobus_init_softc(device_t dev)
|
|||||||
if (GPIO_PIN_MAX(sc->sc_dev, &sc->sc_npins) != 0)
|
if (GPIO_PIN_MAX(sc->sc_dev, &sc->sc_npins) != 0)
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
|
|
||||||
KASSERT(sc->sc_npins != 0, ("GPIO device with no pins"));
|
KASSERT(sc->sc_npins >= 0, ("GPIO device with no pins"));
|
||||||
|
|
||||||
/* Pins = GPIO_PIN_MAX() + 1 */
|
/* Pins = GPIO_PIN_MAX() + 1 */
|
||||||
sc->sc_npins++;
|
sc->sc_npins++;
|
||||||
|
|||||||
@@ -335,11 +335,6 @@ typedef enum {
|
|||||||
HV_CHANNEL_MESSAGE_INITIATED_CONTACT = 14,
|
HV_CHANNEL_MESSAGE_INITIATED_CONTACT = 14,
|
||||||
HV_CHANNEL_MESSAGE_VERSION_RESPONSE = 15,
|
HV_CHANNEL_MESSAGE_VERSION_RESPONSE = 15,
|
||||||
HV_CHANNEL_MESSAGE_UNLOAD = 16,
|
HV_CHANNEL_MESSAGE_UNLOAD = 16,
|
||||||
|
|
||||||
#ifdef HV_VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
|
|
||||||
HV_CHANNEL_MESSAGE_VIEW_RANGE_ADD = 17,
|
|
||||||
HV_CHANNEL_MESSAGE_VIEW_RANGE_REMOVE = 18,
|
|
||||||
#endif
|
|
||||||
HV_CHANNEL_MESSAGE_COUNT
|
HV_CHANNEL_MESSAGE_COUNT
|
||||||
} hv_vmbus_channel_msg_type;
|
} hv_vmbus_channel_msg_type;
|
||||||
|
|
||||||
|
|||||||
@@ -642,6 +642,12 @@ hv_nv_connect_to_vsp(struct hv_device *device)
|
|||||||
/* sema_wait(&NetVscChannel->channel_init_sema); */
|
/* sema_wait(&NetVscChannel->channel_init_sema); */
|
||||||
|
|
||||||
/* Post the big receive buffer to NetVSP */
|
/* Post the big receive buffer to NetVSP */
|
||||||
|
if (net_dev->nvsp_version <= NVSP_PROTOCOL_VERSION_2)
|
||||||
|
net_dev->rx_buf_size = NETVSC_RECEIVE_BUFFER_SIZE_LEGACY;
|
||||||
|
else
|
||||||
|
net_dev->rx_buf_size = NETVSC_RECEIVE_BUFFER_SIZE;
|
||||||
|
net_dev->send_buf_size = NETVSC_SEND_BUFFER_SIZE;
|
||||||
|
|
||||||
ret = hv_nv_init_rx_buffer_with_net_vsp(device);
|
ret = hv_nv_init_rx_buffer_with_net_vsp(device);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = hv_nv_init_send_buffer_with_net_vsp(device);
|
ret = hv_nv_init_send_buffer_with_net_vsp(device);
|
||||||
@@ -676,9 +682,6 @@ hv_nv_on_device_add(struct hv_device *device, void *additional_info)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Initialize the NetVSC channel extension */
|
/* Initialize the NetVSC channel extension */
|
||||||
net_dev->rx_buf_size = NETVSC_RECEIVE_BUFFER_SIZE;
|
|
||||||
|
|
||||||
net_dev->send_buf_size = NETVSC_SEND_BUFFER_SIZE;
|
|
||||||
|
|
||||||
sema_init(&net_dev->channel_init_sema, 0, "netdev_sema");
|
sema_init(&net_dev->channel_init_sema, 0, "netdev_sema");
|
||||||
|
|
||||||
|
|||||||
@@ -857,7 +857,7 @@ typedef struct nvsp_msg_ {
|
|||||||
#define NETVSC_SEND_BUFFER_SIZE (1024*1024*15) /* 15M */
|
#define NETVSC_SEND_BUFFER_SIZE (1024*1024*15) /* 15M */
|
||||||
#define NETVSC_SEND_BUFFER_ID 0xface
|
#define NETVSC_SEND_BUFFER_ID 0xface
|
||||||
|
|
||||||
|
#define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY (1024*1024*15) /* 15MB */
|
||||||
#define NETVSC_RECEIVE_BUFFER_SIZE (1024*1024*16) /* 16MB */
|
#define NETVSC_RECEIVE_BUFFER_SIZE (1024*1024*16) /* 16MB */
|
||||||
|
|
||||||
#define NETVSC_RECEIVE_BUFFER_ID 0xcafe
|
#define NETVSC_RECEIVE_BUFFER_ID 0xcafe
|
||||||
|
|||||||
@@ -391,12 +391,14 @@ netvsc_attach(device_t dev)
|
|||||||
sc->hn_carrier = 1;
|
sc->hn_carrier = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(INET) || defined(INET6)
|
||||||
tcp_lro_init(&sc->hn_lro);
|
tcp_lro_init(&sc->hn_lro);
|
||||||
/* Driver private LRO settings */
|
/* Driver private LRO settings */
|
||||||
sc->hn_lro.ifp = ifp;
|
sc->hn_lro.ifp = ifp;
|
||||||
#ifdef HN_LRO_HIWAT
|
#ifdef HN_LRO_HIWAT
|
||||||
sc->hn_lro.lro_hiwat = sc->hn_lro_hiwat;
|
sc->hn_lro.lro_hiwat = sc->hn_lro_hiwat;
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* INET || INET6 */
|
||||||
|
|
||||||
ether_ifattach(ifp, device_info.mac_addr);
|
ether_ifattach(ifp, device_info.mac_addr);
|
||||||
|
|
||||||
@@ -475,7 +477,9 @@ netvsc_detach(device_t dev)
|
|||||||
hv_rf_on_device_remove(hv_device, HV_RF_NV_DESTROY_CHANNEL);
|
hv_rf_on_device_remove(hv_device, HV_RF_NV_DESTROY_CHANNEL);
|
||||||
|
|
||||||
ifmedia_removeall(&sc->hn_media);
|
ifmedia_removeall(&sc->hn_media);
|
||||||
|
#if defined(INET) || defined(INET6)
|
||||||
tcp_lro_free(&sc->hn_lro);
|
tcp_lro_free(&sc->hn_lro);
|
||||||
|
#endif
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@@ -1083,6 +1087,7 @@ netvsc_recv(struct hv_device *device_ctx, netvsc_packet *packet,
|
|||||||
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
|
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
|
||||||
|
|
||||||
if ((ifp->if_capenable & IFCAP_LRO) && do_lro) {
|
if ((ifp->if_capenable & IFCAP_LRO) && do_lro) {
|
||||||
|
#if defined(INET) || defined(INET6)
|
||||||
struct lro_ctrl *lro = &sc->hn_lro;
|
struct lro_ctrl *lro = &sc->hn_lro;
|
||||||
|
|
||||||
if (lro->lro_cnt) {
|
if (lro->lro_cnt) {
|
||||||
@@ -1092,6 +1097,7 @@ netvsc_recv(struct hv_device *device_ctx, netvsc_packet *packet,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We're not holding the lock here, so don't release it */
|
/* We're not holding the lock here, so don't release it */
|
||||||
@@ -1103,6 +1109,7 @@ netvsc_recv(struct hv_device *device_ctx, netvsc_packet *packet,
|
|||||||
void
|
void
|
||||||
netvsc_recv_rollup(struct hv_device *device_ctx)
|
netvsc_recv_rollup(struct hv_device *device_ctx)
|
||||||
{
|
{
|
||||||
|
#if defined(INET) || defined(INET6)
|
||||||
hn_softc_t *sc = device_get_softc(device_ctx->device);
|
hn_softc_t *sc = device_get_softc(device_ctx->device);
|
||||||
struct lro_ctrl *lro = &sc->hn_lro;
|
struct lro_ctrl *lro = &sc->hn_lro;
|
||||||
struct lro_entry *queued;
|
struct lro_entry *queued;
|
||||||
@@ -1111,6 +1118,7 @@ netvsc_recv_rollup(struct hv_device *device_ctx)
|
|||||||
SLIST_REMOVE_HEAD(&lro->lro_active, next);
|
SLIST_REMOVE_HEAD(&lro->lro_active, next);
|
||||||
tcp_lro_flush(lro, queued);
|
tcp_lro_flush(lro, queued);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ hv_vmbus_connect(void) {
|
|||||||
|
|
||||||
hv_vmbus_protocal_version = version;
|
hv_vmbus_protocal_version = version;
|
||||||
if (bootverbose)
|
if (bootverbose)
|
||||||
printf("VMBUS: Portocal Version: %d.%d\n",
|
printf("VMBUS: Protocol Version: %d.%d\n",
|
||||||
version >> 16, version & 0xFFFF);
|
version >> 16, version & 0xFFFF);
|
||||||
|
|
||||||
sema_destroy(&msg_info->wait_sema);
|
sema_destroy(&msg_info->wait_sema);
|
||||||
@@ -423,12 +423,6 @@ VmbusProcessChannelEvent(uint32_t relid)
|
|||||||
// mtx_unlock(&channel->inbound_lock);
|
// mtx_unlock(&channel->inbound_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HV_DEBUG_INTR
|
|
||||||
extern uint32_t hv_intr_count;
|
|
||||||
extern uint32_t hv_vmbus_swintr_event_cpu[MAXCPU];
|
|
||||||
extern uint32_t hv_vmbus_intr_cpu[MAXCPU];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for events
|
* Handler for events
|
||||||
*/
|
*/
|
||||||
@@ -449,17 +443,6 @@ hv_vmbus_on_events(void *arg)
|
|||||||
KASSERT(cpu <= mp_maxid, ("VMBUS: hv_vmbus_on_events: "
|
KASSERT(cpu <= mp_maxid, ("VMBUS: hv_vmbus_on_events: "
|
||||||
"cpu out of range!"));
|
"cpu out of range!"));
|
||||||
|
|
||||||
#ifdef HV_DEBUG_INTR
|
|
||||||
int i;
|
|
||||||
hv_vmbus_swintr_event_cpu[cpu]++;
|
|
||||||
if (hv_intr_count % 10000 == 0) {
|
|
||||||
printf("VMBUS: Total interrupt %d\n", hv_intr_count);
|
|
||||||
for (i = 0; i < mp_ncpus; i++)
|
|
||||||
printf("VMBUS: hw cpu[%d]: %d, event sw intr cpu[%d]: %d\n",
|
|
||||||
i, hv_vmbus_intr_cpu[i], i, hv_vmbus_swintr_event_cpu[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) ||
|
if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) ||
|
||||||
(hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7)) {
|
(hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7)) {
|
||||||
maxdword = HV_MAX_NUM_CHANNELS_SUPPORTED >> 5;
|
maxdword = HV_MAX_NUM_CHANNELS_SUPPORTED >> 5;
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2015 Microsoft Corp.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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/proc.h>
|
||||||
|
#include <sys/systm.h>
|
||||||
|
#include <sys/smp.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/timeet.h>
|
||||||
|
|
||||||
|
#include "hv_vmbus_priv.h"
|
||||||
|
|
||||||
|
#define HV_TIMER_FREQUENCY (10 * 1000 * 1000LL) /* 100ns period */
|
||||||
|
#define HV_MAX_DELTA_TICKS 0xffffffffLL
|
||||||
|
#define HV_MIN_DELTA_TICKS 1LL
|
||||||
|
|
||||||
|
static struct eventtimer et;
|
||||||
|
static uint64_t periodticks[MAXCPU];
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
sbintime2tick(sbintime_t time)
|
||||||
|
{
|
||||||
|
struct timespec val;
|
||||||
|
|
||||||
|
val = sbttots(time);
|
||||||
|
return val.tv_sec * HV_TIMER_FREQUENCY + val.tv_nsec / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
hv_et_start(struct eventtimer *et, sbintime_t firsttime, sbintime_t periodtime)
|
||||||
|
{
|
||||||
|
union hv_timer_config timer_cfg;
|
||||||
|
uint64_t current;
|
||||||
|
|
||||||
|
timer_cfg.as_uint64 = 0;
|
||||||
|
timer_cfg.auto_enable = 1;
|
||||||
|
timer_cfg.sintx = HV_VMBUS_MESSAGE_SINT;
|
||||||
|
|
||||||
|
periodticks[curcpu] = sbintime2tick(periodtime);
|
||||||
|
if (firsttime == 0)
|
||||||
|
firsttime = periodtime;
|
||||||
|
|
||||||
|
current = rdmsr(HV_X64_MSR_TIME_REF_COUNT);
|
||||||
|
current += sbintime2tick(firsttime);
|
||||||
|
|
||||||
|
wrmsr(HV_X64_MSR_STIMER0_CONFIG, timer_cfg.as_uint64);
|
||||||
|
wrmsr(HV_X64_MSR_STIMER0_COUNT, current);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
hv_et_stop(struct eventtimer *et)
|
||||||
|
{
|
||||||
|
wrmsr(HV_X64_MSR_STIMER0_CONFIG, 0);
|
||||||
|
wrmsr(HV_X64_MSR_STIMER0_COUNT, 0);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hv_et_intr(struct trapframe *frame)
|
||||||
|
{
|
||||||
|
union hv_timer_config timer_cfg;
|
||||||
|
struct trapframe *oldframe;
|
||||||
|
struct thread *td;
|
||||||
|
|
||||||
|
if (periodticks[curcpu] != 0) {
|
||||||
|
uint64_t tick = sbintime2tick(periodticks[curcpu]);
|
||||||
|
timer_cfg.as_uint64 = rdmsr(HV_X64_MSR_STIMER0_CONFIG);
|
||||||
|
timer_cfg.enable = 0;
|
||||||
|
timer_cfg.auto_enable = 1;
|
||||||
|
timer_cfg.periodic = 1;
|
||||||
|
periodticks[curcpu] = 0;
|
||||||
|
|
||||||
|
wrmsr(HV_X64_MSR_STIMER0_CONFIG, timer_cfg.as_uint64);
|
||||||
|
wrmsr(HV_X64_MSR_STIMER0_COUNT, tick);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (et.et_active) {
|
||||||
|
td = curthread;
|
||||||
|
td->td_intr_nesting_level++;
|
||||||
|
oldframe = td->td_intr_frame;
|
||||||
|
td->td_intr_frame = frame;
|
||||||
|
et.et_event_cb(&et, et.et_arg);
|
||||||
|
td->td_intr_frame = oldframe;
|
||||||
|
td->td_intr_nesting_level--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hv_et_init(void)
|
||||||
|
{
|
||||||
|
et.et_name = "HyperV";
|
||||||
|
et.et_flags = ET_FLAGS_ONESHOT | ET_FLAGS_PERCPU | ET_FLAGS_PERIODIC;
|
||||||
|
et.et_quality = 1000;
|
||||||
|
et.et_frequency = HV_TIMER_FREQUENCY;
|
||||||
|
et.et_min_period = (1LL << 32) / HV_TIMER_FREQUENCY;
|
||||||
|
et.et_max_period = HV_MAX_DELTA_TICKS * ((1LL << 32) / HV_TIMER_FREQUENCY);
|
||||||
|
et.et_start = hv_et_start;
|
||||||
|
et.et_stop = hv_et_stop;
|
||||||
|
et.et_priv = &et;
|
||||||
|
et_register(&et);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/pcpu.h>
|
#include <sys/pcpu.h>
|
||||||
#include <sys/timetc.h>
|
#include <sys/timetc.h>
|
||||||
#include <machine/bus.h>
|
#include <machine/bus.h>
|
||||||
|
#include <machine/md_var.h>
|
||||||
#include <vm/vm.h>
|
#include <vm/vm.h>
|
||||||
#include <vm/vm_param.h>
|
#include <vm/vm_param.h>
|
||||||
#include <vm/pmap.h>
|
#include <vm/pmap.h>
|
||||||
@@ -44,23 +45,11 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include "hv_vmbus_priv.h"
|
#include "hv_vmbus_priv.h"
|
||||||
|
|
||||||
#define HV_X64_MSR_GUEST_OS_ID 0x40000000
|
|
||||||
|
|
||||||
#define HV_X64_CPUID_MIN 0x40000005
|
|
||||||
#define HV_X64_CPUID_MAX 0x4000ffff
|
|
||||||
#define HV_X64_MSR_TIME_REF_COUNT 0x40000020
|
|
||||||
|
|
||||||
#define HV_NANOSECONDS_PER_SEC 1000000000L
|
#define HV_NANOSECONDS_PER_SEC 1000000000L
|
||||||
|
|
||||||
|
|
||||||
static u_int hv_get_timecount(struct timecounter *tc);
|
static u_int hv_get_timecount(struct timecounter *tc);
|
||||||
|
|
||||||
static inline void do_cpuid_inline(unsigned int op, unsigned int *eax,
|
|
||||||
unsigned int *ebx, unsigned int *ecx, unsigned int *edx) {
|
|
||||||
__asm__ __volatile__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx),
|
|
||||||
"=d" (*edx) : "0" (op), "c" (ecx));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Globals
|
* Globals
|
||||||
*/
|
*/
|
||||||
@@ -86,27 +75,10 @@ hv_get_timecount(struct timecounter *tc)
|
|||||||
int
|
int
|
||||||
hv_vmbus_query_hypervisor_presence(void)
|
hv_vmbus_query_hypervisor_presence(void)
|
||||||
{
|
{
|
||||||
u_int regs[4];
|
if (vm_guest != VM_GUEST_HV)
|
||||||
int hyper_v_detected = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When Xen is detected and native Xen PV support is enabled,
|
|
||||||
* ignore Xen's HyperV emulation.
|
|
||||||
*/
|
|
||||||
if (vm_guest == VM_GUEST_XEN)
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
do_cpuid(1, regs);
|
return (hv_high >= HV_X64_CPUID_MIN && hv_high <= HV_X64_CPUID_MAX);
|
||||||
if (regs[2] & 0x80000000) { /* if(a hypervisor is detected) */
|
|
||||||
/* make sure this really is Hyper-V */
|
|
||||||
/* we look at the CPUID info */
|
|
||||||
do_cpuid(HV_X64_MSR_GUEST_OS_ID, regs);
|
|
||||||
hyper_v_detected =
|
|
||||||
regs[0] >= HV_X64_CPUID_MIN &&
|
|
||||||
regs[0] <= HV_X64_CPUID_MAX &&
|
|
||||||
!memcmp("Microsoft Hv", ®s[1], 12);
|
|
||||||
}
|
|
||||||
return (hyper_v_detected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,10 +87,7 @@ hv_vmbus_query_hypervisor_presence(void)
|
|||||||
static int
|
static int
|
||||||
hv_vmbus_get_hypervisor_version(void)
|
hv_vmbus_get_hypervisor_version(void)
|
||||||
{
|
{
|
||||||
unsigned int eax;
|
u_int regs[4];
|
||||||
unsigned int ebx;
|
|
||||||
unsigned int ecx;
|
|
||||||
unsigned int edx;
|
|
||||||
unsigned int maxLeaf;
|
unsigned int maxLeaf;
|
||||||
unsigned int op;
|
unsigned int op;
|
||||||
|
|
||||||
@@ -127,28 +96,16 @@ hv_vmbus_get_hypervisor_version(void)
|
|||||||
* Viridian is present
|
* Viridian is present
|
||||||
* Query id and revision.
|
* Query id and revision.
|
||||||
*/
|
*/
|
||||||
eax = 0;
|
|
||||||
ebx = 0;
|
|
||||||
ecx = 0;
|
|
||||||
edx = 0;
|
|
||||||
op = HV_CPU_ID_FUNCTION_HV_VENDOR_AND_MAX_FUNCTION;
|
op = HV_CPU_ID_FUNCTION_HV_VENDOR_AND_MAX_FUNCTION;
|
||||||
do_cpuid_inline(op, &eax, &ebx, &ecx, &edx);
|
do_cpuid(op, regs);
|
||||||
|
|
||||||
maxLeaf = eax;
|
maxLeaf = regs[0];
|
||||||
eax = 0;
|
|
||||||
ebx = 0;
|
|
||||||
ecx = 0;
|
|
||||||
edx = 0;
|
|
||||||
op = HV_CPU_ID_FUNCTION_HV_INTERFACE;
|
op = HV_CPU_ID_FUNCTION_HV_INTERFACE;
|
||||||
do_cpuid_inline(op, &eax, &ebx, &ecx, &edx);
|
do_cpuid(op, regs);
|
||||||
|
|
||||||
if (maxLeaf >= HV_CPU_ID_FUNCTION_MS_HV_VERSION) {
|
if (maxLeaf >= HV_CPU_ID_FUNCTION_MS_HV_VERSION) {
|
||||||
eax = 0;
|
|
||||||
ebx = 0;
|
|
||||||
ecx = 0;
|
|
||||||
edx = 0;
|
|
||||||
op = HV_CPU_ID_FUNCTION_MS_HV_VERSION;
|
op = HV_CPU_ID_FUNCTION_MS_HV_VERSION;
|
||||||
do_cpuid_inline(op, &eax, &ebx, &ecx, &edx);
|
do_cpuid(op, regs);
|
||||||
}
|
}
|
||||||
return (maxLeaf);
|
return (maxLeaf);
|
||||||
}
|
}
|
||||||
@@ -256,6 +213,8 @@ hv_vmbus_init(void)
|
|||||||
|
|
||||||
tc_init(&hv_timecounter); /* register virtual timecount */
|
tc_init(&hv_timecounter); /* register virtual timecount */
|
||||||
|
|
||||||
|
hv_et_init();
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
#include <sys/malloc.h>
|
#include <sys/malloc.h>
|
||||||
#include <sys/module.h>
|
#include <sys/module.h>
|
||||||
|
#include <sys/proc.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#include <sys/syslog.h>
|
#include <sys/syslog.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@@ -60,13 +61,15 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include "hv_vmbus_priv.h"
|
#include "hv_vmbus_priv.h"
|
||||||
|
|
||||||
|
#include <contrib/dev/acpica/include/acpi.h>
|
||||||
#define VMBUS_IRQ 0x5
|
#include "acpi_if.h"
|
||||||
|
|
||||||
static device_t vmbus_devp;
|
static device_t vmbus_devp;
|
||||||
static int vmbus_inited;
|
static int vmbus_inited;
|
||||||
static hv_setup_args setup_args; /* only CPU 0 supported at this time */
|
static hv_setup_args setup_args; /* only CPU 0 supported at this time */
|
||||||
|
|
||||||
|
static char *vmbus_ids[] = { "VMBUS", NULL };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Software interrupt thread routine to handle channel messages from
|
* @brief Software interrupt thread routine to handle channel messages from
|
||||||
* the hypervisor.
|
* the hypervisor.
|
||||||
@@ -151,7 +154,7 @@ vmbus_msg_swintr(void *arg)
|
|||||||
* message to process - an event or a channel message.
|
* message to process - an event or a channel message.
|
||||||
*/
|
*/
|
||||||
static inline int
|
static inline int
|
||||||
hv_vmbus_isr(void *unused)
|
hv_vmbus_isr(struct trapframe *frame)
|
||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
hv_vmbus_message* msg;
|
hv_vmbus_message* msg;
|
||||||
@@ -191,41 +194,57 @@ hv_vmbus_isr(void *unused)
|
|||||||
page_addr = hv_vmbus_g_context.syn_ic_msg_page[cpu];
|
page_addr = hv_vmbus_g_context.syn_ic_msg_page[cpu];
|
||||||
msg = (hv_vmbus_message*) page_addr + HV_VMBUS_MESSAGE_SINT;
|
msg = (hv_vmbus_message*) page_addr + HV_VMBUS_MESSAGE_SINT;
|
||||||
|
|
||||||
|
/* we call eventtimer process the message */
|
||||||
|
if (msg->header.message_type == HV_MESSAGE_TIMER_EXPIRED) {
|
||||||
|
msg->header.message_type = HV_MESSAGE_TYPE_NONE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the write to message_type (ie set to
|
||||||
|
* HV_MESSAGE_TYPE_NONE) happens before we read the
|
||||||
|
* message_pending and EOMing. Otherwise, the EOMing will
|
||||||
|
* not deliver any more messages
|
||||||
|
* since there is no empty slot
|
||||||
|
*/
|
||||||
|
wmb();
|
||||||
|
|
||||||
|
if (msg->header.message_flags.u.message_pending) {
|
||||||
|
/*
|
||||||
|
* This will cause message queue rescan to possibly
|
||||||
|
* deliver another msg from the hypervisor
|
||||||
|
*/
|
||||||
|
wrmsr(HV_X64_MSR_EOM, 0);
|
||||||
|
}
|
||||||
|
hv_et_intr(frame);
|
||||||
|
return (FILTER_HANDLED);
|
||||||
|
}
|
||||||
|
|
||||||
if (msg->header.message_type != HV_MESSAGE_TYPE_NONE) {
|
if (msg->header.message_type != HV_MESSAGE_TYPE_NONE) {
|
||||||
swi_sched(hv_vmbus_g_context.msg_swintr[cpu], 0);
|
swi_sched(hv_vmbus_g_context.msg_swintr[cpu], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return FILTER_HANDLED;
|
return (FILTER_HANDLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HV_DEBUG_INTR
|
|
||||||
uint32_t hv_intr_count = 0;
|
|
||||||
#endif
|
|
||||||
uint32_t hv_vmbus_swintr_event_cpu[MAXCPU];
|
uint32_t hv_vmbus_swintr_event_cpu[MAXCPU];
|
||||||
uint32_t hv_vmbus_intr_cpu[MAXCPU];
|
u_long *hv_vmbus_intr_cpu[MAXCPU];
|
||||||
|
|
||||||
void
|
void
|
||||||
hv_vector_handler(struct trapframe *trap_frame)
|
hv_vector_handler(struct trapframe *trap_frame)
|
||||||
{
|
{
|
||||||
#ifdef HV_DEBUG_INTR
|
|
||||||
int cpu;
|
int cpu;
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable preemption.
|
* Disable preemption.
|
||||||
*/
|
*/
|
||||||
critical_enter();
|
critical_enter();
|
||||||
|
|
||||||
#ifdef HV_DEBUG_INTR
|
|
||||||
/*
|
/*
|
||||||
* Do a little interrupt counting.
|
* Do a little interrupt counting.
|
||||||
*/
|
*/
|
||||||
cpu = PCPU_GET(cpuid);
|
cpu = PCPU_GET(cpuid);
|
||||||
hv_vmbus_intr_cpu[cpu]++;
|
(*hv_vmbus_intr_cpu[cpu])++;
|
||||||
hv_intr_count++;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hv_vmbus_isr(NULL);
|
hv_vmbus_isr(trap_frame);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable preemption.
|
* Enable preemption.
|
||||||
@@ -350,25 +369,15 @@ hv_vmbus_child_device_unregister(struct hv_device *child_dev)
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
vmbus_identify(driver_t *driver, device_t parent)
|
|
||||||
{
|
|
||||||
if (!hv_vmbus_query_hypervisor_presence())
|
|
||||||
return;
|
|
||||||
|
|
||||||
vm_guest = VM_GUEST_HV;
|
|
||||||
|
|
||||||
BUS_ADD_CHILD(parent, 0, "vmbus", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
vmbus_probe(device_t dev) {
|
vmbus_probe(device_t dev) {
|
||||||
if(bootverbose)
|
if (ACPI_ID_PROBE(device_get_parent(dev), dev, vmbus_ids) == NULL ||
|
||||||
device_printf(dev, "VMBUS: probe\n");
|
device_get_unit(dev) != 0)
|
||||||
|
return (ENXIO);
|
||||||
|
|
||||||
device_set_desc(dev, "Vmbus Devices");
|
device_set_desc(dev, "Vmbus Devices");
|
||||||
|
|
||||||
return (BUS_PROBE_NOWILDCARD);
|
return (BUS_PROBE_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HYPERV
|
#ifdef HYPERV
|
||||||
@@ -462,6 +471,7 @@ static int
|
|||||||
vmbus_bus_init(void)
|
vmbus_bus_init(void)
|
||||||
{
|
{
|
||||||
int i, j, n, ret;
|
int i, j, n, ret;
|
||||||
|
char buf[MAXCOMLEN + 1];
|
||||||
|
|
||||||
if (vmbus_inited)
|
if (vmbus_inited)
|
||||||
return (0);
|
return (0);
|
||||||
@@ -498,13 +508,15 @@ vmbus_bus_init(void)
|
|||||||
setup_args.vector = hv_vmbus_g_context.hv_cb_vector;
|
setup_args.vector = hv_vmbus_g_context.hv_cb_vector;
|
||||||
|
|
||||||
CPU_FOREACH(j) {
|
CPU_FOREACH(j) {
|
||||||
hv_vmbus_intr_cpu[j] = 0;
|
|
||||||
hv_vmbus_swintr_event_cpu[j] = 0;
|
hv_vmbus_swintr_event_cpu[j] = 0;
|
||||||
hv_vmbus_g_context.hv_event_intr_event[j] = NULL;
|
hv_vmbus_g_context.hv_event_intr_event[j] = NULL;
|
||||||
hv_vmbus_g_context.hv_msg_intr_event[j] = NULL;
|
hv_vmbus_g_context.hv_msg_intr_event[j] = NULL;
|
||||||
hv_vmbus_g_context.event_swintr[j] = NULL;
|
hv_vmbus_g_context.event_swintr[j] = NULL;
|
||||||
hv_vmbus_g_context.msg_swintr[j] = NULL;
|
hv_vmbus_g_context.msg_swintr[j] = NULL;
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "cpu%d:hyperv", j);
|
||||||
|
intrcnt_add(buf, &hv_vmbus_intr_cpu[j]);
|
||||||
|
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
setup_args.page_buffers[2 * j + i] = NULL;
|
setup_args.page_buffers[2 * j + i] = NULL;
|
||||||
}
|
}
|
||||||
@@ -723,7 +735,6 @@ vmbus_modevent(module_t mod, int what, void *arg)
|
|||||||
|
|
||||||
static device_method_t vmbus_methods[] = {
|
static device_method_t vmbus_methods[] = {
|
||||||
/** Device interface */
|
/** Device interface */
|
||||||
DEVMETHOD(device_identify, vmbus_identify),
|
|
||||||
DEVMETHOD(device_probe, vmbus_probe),
|
DEVMETHOD(device_probe, vmbus_probe),
|
||||||
DEVMETHOD(device_attach, vmbus_attach),
|
DEVMETHOD(device_attach, vmbus_attach),
|
||||||
DEVMETHOD(device_detach, vmbus_detach),
|
DEVMETHOD(device_detach, vmbus_detach),
|
||||||
@@ -745,7 +756,8 @@ static driver_t vmbus_driver = { driver_name, vmbus_methods,0, };
|
|||||||
|
|
||||||
devclass_t vmbus_devclass;
|
devclass_t vmbus_devclass;
|
||||||
|
|
||||||
DRIVER_MODULE(vmbus, nexus, vmbus_driver, vmbus_devclass, vmbus_modevent, 0);
|
DRIVER_MODULE(vmbus, acpi, vmbus_driver, vmbus_devclass, vmbus_modevent, 0);
|
||||||
|
MODULE_DEPEND(vmbus, acpi, 1, 1, 1);
|
||||||
MODULE_VERSION(vmbus, 1);
|
MODULE_VERSION(vmbus, 1);
|
||||||
|
|
||||||
/* We want to be started after SMP is initialized */
|
/* We want to be started after SMP is initialized */
|
||||||
|
|||||||
@@ -359,11 +359,6 @@ typedef struct {
|
|||||||
struct sema control_sema;
|
struct sema control_sema;
|
||||||
} hv_vmbus_connection;
|
} hv_vmbus_connection;
|
||||||
|
|
||||||
/*
|
|
||||||
* Declare the MSR used to identify the guest OS
|
|
||||||
*/
|
|
||||||
#define HV_X64_MSR_GUEST_OS_ID 0x40000000
|
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
uint64_t as_uint64_t;
|
uint64_t as_uint64_t;
|
||||||
struct {
|
struct {
|
||||||
@@ -380,10 +375,6 @@ typedef union {
|
|||||||
} u;
|
} u;
|
||||||
} hv_vmbus_x64_msr_guest_os_id_contents;
|
} hv_vmbus_x64_msr_guest_os_id_contents;
|
||||||
|
|
||||||
/*
|
|
||||||
* Declare the MSR used to setup pages used to communicate with the hypervisor
|
|
||||||
*/
|
|
||||||
#define HV_X64_MSR_HYPERCALL 0x40000001
|
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
uint64_t as_uint64_t;
|
uint64_t as_uint64_t;
|
||||||
@@ -512,6 +503,22 @@ typedef union {
|
|||||||
} u;
|
} u;
|
||||||
} hv_vmbus_synic_sint;
|
} hv_vmbus_synic_sint;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Timer configuration register.
|
||||||
|
*/
|
||||||
|
union hv_timer_config {
|
||||||
|
uint64_t as_uint64;
|
||||||
|
struct {
|
||||||
|
uint64_t enable:1;
|
||||||
|
uint64_t periodic:1;
|
||||||
|
uint64_t lazy:1;
|
||||||
|
uint64_t auto_enable:1;
|
||||||
|
uint64_t reserved_z0:12;
|
||||||
|
uint64_t sintx:4;
|
||||||
|
uint64_t reserved_z1:44;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define syn_ic control register
|
* Define syn_ic control register
|
||||||
*/
|
*/
|
||||||
@@ -542,9 +549,22 @@ typedef union {
|
|||||||
uint32_t flags32[HV_EVENT_FLAGS_DWORD_COUNT];
|
uint32_t flags32[HV_EVENT_FLAGS_DWORD_COUNT];
|
||||||
} hv_vmbus_synic_event_flags;
|
} hv_vmbus_synic_event_flags;
|
||||||
|
|
||||||
|
#define HV_X64_CPUID_MIN (0x40000005)
|
||||||
|
#define HV_X64_CPUID_MAX (0x4000ffff)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Declare the MSR used to identify the guest OS
|
||||||
|
*/
|
||||||
|
#define HV_X64_MSR_GUEST_OS_ID (0x40000000)
|
||||||
|
/*
|
||||||
|
* Declare the MSR used to setup pages used to communicate with the hypervisor
|
||||||
|
*/
|
||||||
|
#define HV_X64_MSR_HYPERCALL (0x40000001)
|
||||||
/* MSR used to provide vcpu index */
|
/* MSR used to provide vcpu index */
|
||||||
#define HV_X64_MSR_VP_INDEX (0x40000002)
|
#define HV_X64_MSR_VP_INDEX (0x40000002)
|
||||||
|
|
||||||
|
#define HV_X64_MSR_TIME_REF_COUNT (0x40000020)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define synthetic interrupt controller model specific registers
|
* Define synthetic interrupt controller model specific registers
|
||||||
*/
|
*/
|
||||||
@@ -571,6 +591,18 @@ typedef union {
|
|||||||
#define HV_X64_MSR_SINT14 (0x4000009E)
|
#define HV_X64_MSR_SINT14 (0x4000009E)
|
||||||
#define HV_X64_MSR_SINT15 (0x4000009F)
|
#define HV_X64_MSR_SINT15 (0x4000009F)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Synthetic Timer MSRs. Four timers per vcpu.
|
||||||
|
*/
|
||||||
|
#define HV_X64_MSR_STIMER0_CONFIG 0x400000B0
|
||||||
|
#define HV_X64_MSR_STIMER0_COUNT 0x400000B1
|
||||||
|
#define HV_X64_MSR_STIMER1_CONFIG 0x400000B2
|
||||||
|
#define HV_X64_MSR_STIMER1_COUNT 0x400000B3
|
||||||
|
#define HV_X64_MSR_STIMER2_CONFIG 0x400000B4
|
||||||
|
#define HV_X64_MSR_STIMER2_COUNT 0x400000B5
|
||||||
|
#define HV_X64_MSR_STIMER3_CONFIG 0x400000B6
|
||||||
|
#define HV_X64_MSR_STIMER3_COUNT 0x400000B7
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Declare the various hypercall operations
|
* Declare the various hypercall operations
|
||||||
*/
|
*/
|
||||||
@@ -678,6 +710,11 @@ int hv_vmbus_post_message(void *buffer, size_t buf_size);
|
|||||||
int hv_vmbus_set_event(hv_vmbus_channel *channel);
|
int hv_vmbus_set_event(hv_vmbus_channel *channel);
|
||||||
void hv_vmbus_on_events(void *);
|
void hv_vmbus_on_events(void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event Timer interfaces
|
||||||
|
*/
|
||||||
|
void hv_et_init(void);
|
||||||
|
void hv_et_intr(struct trapframe*);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The guest OS needs to register the guest ID with the hypervisor.
|
* The guest OS needs to register the guest ID with the hypervisor.
|
||||||
|
|||||||
+13
-2
@@ -97,6 +97,8 @@ static void
|
|||||||
pty_clone(void *arg, struct ucred *cr, char *name, int namelen,
|
pty_clone(void *arg, struct ucred *cr, char *name, int namelen,
|
||||||
struct cdev **dev)
|
struct cdev **dev)
|
||||||
{
|
{
|
||||||
|
struct make_dev_args mda;
|
||||||
|
int error;
|
||||||
|
|
||||||
/* Cloning is already satisfied. */
|
/* Cloning is already satisfied. */
|
||||||
if (*dev != NULL)
|
if (*dev != NULL)
|
||||||
@@ -117,8 +119,17 @@ pty_clone(void *arg, struct ucred *cr, char *name, int namelen,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Create the controller device node. */
|
/* Create the controller device node. */
|
||||||
*dev = make_dev_credf(MAKEDEV_REF, &ptydev_cdevsw, 0,
|
make_dev_args_init(&mda);
|
||||||
NULL, UID_ROOT, GID_WHEEL, 0666, "%s", name);
|
mda.mda_flags = MAKEDEV_CHECKNAME | MAKEDEV_REF;
|
||||||
|
mda.mda_devsw = &ptydev_cdevsw;
|
||||||
|
mda.mda_uid = UID_ROOT;
|
||||||
|
mda.mda_gid = GID_WHEEL;
|
||||||
|
mda.mda_mode = 0666;
|
||||||
|
error = make_dev_s(&mda, dev, "%s", name);
|
||||||
|
if (error != 0) {
|
||||||
|
printf("pty_clone: failed to create %s: %d\n", name, error);
|
||||||
|
*dev = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|||||||
@@ -45,6 +45,47 @@ extern "C" {
|
|||||||
#define EF10_MAX_PIOBUF_NBUFS MEDFORD_PIOBUF_NBUFS
|
#define EF10_MAX_PIOBUF_NBUFS MEDFORD_PIOBUF_NBUFS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_get_port_assignment(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out uint32_t *portp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_get_port_modes(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out uint32_t *modesp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_get_mac_address_pf(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out_ecount_opt(6) uint8_t mac_addrp[6]);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_get_mac_address_vf(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out_ecount_opt(6) uint8_t mac_addrp[6]);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_get_clock(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out uint32_t *sys_freqp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_get_vector_cfg(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out_opt uint32_t *vec_basep,
|
||||||
|
__out_opt uint32_t *pf_nvecp,
|
||||||
|
__out_opt uint32_t *vf_nvecp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
ef10_get_datapath_caps(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
ef10_external_port_mapping(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint32_t port,
|
||||||
|
__out uint8_t *external_portp);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -764,4 +764,20 @@ struct tlv_rx_event_merging_config {
|
|||||||
#define TLV_RX_EVENT_MERGING_MAX_EVENTS_DEFAULT 7
|
#define TLV_RX_EVENT_MERGING_MAX_EVENTS_DEFAULT 7
|
||||||
#define TLV_RX_EVENT_MERGING_TIMEOUT_NS_DEFAULT 8740
|
#define TLV_RX_EVENT_MERGING_TIMEOUT_NS_DEFAULT 8740
|
||||||
|
|
||||||
|
#define TLV_TAG_PCIE_LINK_SETTINGS (0x101f0000)
|
||||||
|
struct tlv_pcie_link_settings {
|
||||||
|
uint32_t tag;
|
||||||
|
uint32_t length;
|
||||||
|
uint16_t gen; /* Target PCIe generation: 1, 2, 3 */
|
||||||
|
uint16_t width; /* Number of lanes */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TLV_TAG_LICENSE (0x20800000)
|
||||||
|
|
||||||
|
typedef struct tlv_license {
|
||||||
|
uint32_t tag;
|
||||||
|
uint32_t length;
|
||||||
|
uint8_t data[];
|
||||||
|
} tlv_license_t;
|
||||||
|
|
||||||
#endif /* CI_MGMT_TLV_LAYOUT_H */
|
#endif /* CI_MGMT_TLV_LAYOUT_H */
|
||||||
|
|||||||
@@ -288,12 +288,13 @@ sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map,
|
|||||||
#define EFSYS_OPT_QSTATS 1
|
#define EFSYS_OPT_QSTATS 1
|
||||||
#define EFSYS_OPT_FILTER 1
|
#define EFSYS_OPT_FILTER 1
|
||||||
#define EFSYS_OPT_RX_SCATTER 0
|
#define EFSYS_OPT_RX_SCATTER 0
|
||||||
#define EFSYS_OPT_RX_HDR_SPLIT 0
|
|
||||||
|
|
||||||
#define EFSYS_OPT_EV_PREFETCH 0
|
#define EFSYS_OPT_EV_PREFETCH 0
|
||||||
|
|
||||||
#define EFSYS_OPT_DECODE_INTR_FATAL 1
|
#define EFSYS_OPT_DECODE_INTR_FATAL 1
|
||||||
|
|
||||||
|
#define EFSYS_OPT_LICENSING 0
|
||||||
|
|
||||||
/* ID */
|
/* ID */
|
||||||
|
|
||||||
typedef struct __efsys_identifier_s efsys_identifier_t;
|
typedef struct __efsys_identifier_s efsys_identifier_t;
|
||||||
|
|||||||
+73
-12
@@ -1071,6 +1071,7 @@ efx_bist_stop(
|
|||||||
#define EFX_FEATURE_TX_SRC_FILTERS 0x00000400
|
#define EFX_FEATURE_TX_SRC_FILTERS 0x00000400
|
||||||
#define EFX_FEATURE_PIO_BUFFERS 0x00000800
|
#define EFX_FEATURE_PIO_BUFFERS 0x00000800
|
||||||
#define EFX_FEATURE_FW_ASSISTED_TSO 0x00001000
|
#define EFX_FEATURE_FW_ASSISTED_TSO 0x00001000
|
||||||
|
#define EFX_FEATURE_FW_ASSISTED_TSO_V2 0x00002000
|
||||||
|
|
||||||
typedef struct efx_nic_cfg_s {
|
typedef struct efx_nic_cfg_s {
|
||||||
uint32_t enc_board_type;
|
uint32_t enc_board_type;
|
||||||
@@ -1152,6 +1153,7 @@ typedef struct efx_nic_cfg_s {
|
|||||||
*/
|
*/
|
||||||
uint32_t enc_tx_tso_tcp_header_offset_limit;
|
uint32_t enc_tx_tso_tcp_header_offset_limit;
|
||||||
boolean_t enc_fw_assisted_tso_enabled;
|
boolean_t enc_fw_assisted_tso_enabled;
|
||||||
|
boolean_t enc_fw_assisted_tso_v2_enabled;
|
||||||
boolean_t enc_hw_tx_insert_vlan_enabled;
|
boolean_t enc_hw_tx_insert_vlan_enabled;
|
||||||
/* Datapath firmware vadapter/vport/vswitch support */
|
/* Datapath firmware vadapter/vport/vswitch support */
|
||||||
boolean_t enc_datapath_cap_evb;
|
boolean_t enc_datapath_cap_evb;
|
||||||
@@ -1315,6 +1317,7 @@ typedef enum efx_nvram_type_e {
|
|||||||
EFX_NVRAM_CPLD,
|
EFX_NVRAM_CPLD,
|
||||||
EFX_NVRAM_FPGA_BACKUP,
|
EFX_NVRAM_FPGA_BACKUP,
|
||||||
EFX_NVRAM_DYNAMIC_CFG,
|
EFX_NVRAM_DYNAMIC_CFG,
|
||||||
|
EFX_NVRAM_LICENSE,
|
||||||
EFX_NVRAM_NTYPES,
|
EFX_NVRAM_NTYPES,
|
||||||
} efx_nvram_type_t;
|
} efx_nvram_type_t;
|
||||||
|
|
||||||
@@ -1817,15 +1820,6 @@ extern void
|
|||||||
efx_rx_fini(
|
efx_rx_fini(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
__checkReturn efx_rc_t
|
|
||||||
efx_rx_hdr_split_enable(
|
|
||||||
__in efx_nic_t *enp,
|
|
||||||
__in unsigned int hdr_buf_size,
|
|
||||||
__in unsigned int pld_buf_size);
|
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
efx_rx_scatter_enable(
|
efx_rx_scatter_enable(
|
||||||
@@ -1892,7 +1886,7 @@ efx_rx_scale_key_set(
|
|||||||
__in_ecount(n) uint8_t *key,
|
__in_ecount(n) uint8_t *key,
|
||||||
__in size_t n);
|
__in size_t n);
|
||||||
|
|
||||||
extern uint32_t
|
extern __checkReturn uint32_t
|
||||||
efx_psuedo_hdr_hash_get(
|
efx_psuedo_hdr_hash_get(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__in efx_rx_hash_alg_t func,
|
__in efx_rx_hash_alg_t func,
|
||||||
@@ -2011,6 +2005,7 @@ efx_tx_fini(
|
|||||||
|
|
||||||
#define EFX_TXQ_CKSUM_IPV4 0x0001
|
#define EFX_TXQ_CKSUM_IPV4 0x0001
|
||||||
#define EFX_TXQ_CKSUM_TCPUDP 0x0002
|
#define EFX_TXQ_CKSUM_TCPUDP 0x0002
|
||||||
|
#define EFX_TXQ_FATSOV2 0x0004
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
efx_tx_qcreate(
|
efx_tx_qcreate(
|
||||||
@@ -2098,6 +2093,21 @@ efx_tx_qdesc_tso_create(
|
|||||||
__in uint8_t tcp_flags,
|
__in uint8_t tcp_flags,
|
||||||
__out efx_desc_t *edp);
|
__out efx_desc_t *edp);
|
||||||
|
|
||||||
|
/* Number of FATSOv2 option descriptors */
|
||||||
|
#define EFX_TX_FATSOV2_OPT_NDESCS 2
|
||||||
|
|
||||||
|
/* Maximum number of DMA segments per TSO packet (not superframe) */
|
||||||
|
#define EFX_TX_FATSOV2_DMA_SEGS_PER_PKT_MAX 24
|
||||||
|
|
||||||
|
extern void
|
||||||
|
efx_tx_qdesc_tso2_create(
|
||||||
|
__in efx_txq_t *etp,
|
||||||
|
__in uint16_t ipv4_id,
|
||||||
|
__in uint32_t tcp_seq,
|
||||||
|
__in uint16_t tcp_mss,
|
||||||
|
__out_ecount(count) efx_desc_t *edp,
|
||||||
|
__in int count);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
efx_tx_qdesc_vlantci_create(
|
efx_tx_qdesc_vlantci_create(
|
||||||
__in efx_txq_t *etp,
|
__in efx_txq_t *etp,
|
||||||
@@ -2244,14 +2254,14 @@ efx_filter_supported_filters(
|
|||||||
|
|
||||||
extern void
|
extern void
|
||||||
efx_filter_spec_init_rx(
|
efx_filter_spec_init_rx(
|
||||||
__inout efx_filter_spec_t *spec,
|
__out efx_filter_spec_t *spec,
|
||||||
__in efx_filter_priority_t priority,
|
__in efx_filter_priority_t priority,
|
||||||
__in efx_filter_flag_t flags,
|
__in efx_filter_flag_t flags,
|
||||||
__in efx_rxq_t *erp);
|
__in efx_rxq_t *erp);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
efx_filter_spec_init_tx(
|
efx_filter_spec_init_tx(
|
||||||
__inout efx_filter_spec_t *spec,
|
__out efx_filter_spec_t *spec,
|
||||||
__in efx_txq_t *etp);
|
__in efx_txq_t *etp);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
@@ -2300,6 +2310,57 @@ efx_hash_bytes(
|
|||||||
__in size_t length,
|
__in size_t length,
|
||||||
__in uint32_t init);
|
__in uint32_t init);
|
||||||
|
|
||||||
|
#if EFSYS_OPT_LICENSING
|
||||||
|
|
||||||
|
/* LICENSING */
|
||||||
|
|
||||||
|
typedef struct efx_key_stats_s {
|
||||||
|
uint32_t eks_valid;
|
||||||
|
uint32_t eks_invalid;
|
||||||
|
uint32_t eks_blacklisted;
|
||||||
|
uint32_t eks_unverifiable;
|
||||||
|
uint32_t eks_wrong_node;
|
||||||
|
uint32_t eks_licensed_apps_lo;
|
||||||
|
uint32_t eks_licensed_apps_hi;
|
||||||
|
uint32_t eks_licensed_features_lo;
|
||||||
|
uint32_t eks_licensed_features_hi;
|
||||||
|
} efx_key_stats_t;
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_lic_init(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
extern void
|
||||||
|
efx_lic_fini(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_lic_update_licenses(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_lic_get_key_stats(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *ksp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_lic_app_state(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint64_t app_id,
|
||||||
|
__out boolean_t *licensedp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
efx_lic_get_id(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in size_t buffer_size,
|
||||||
|
__out uint32_t *typep,
|
||||||
|
__out size_t *lengthp,
|
||||||
|
__out_opt uint8_t *bufferp);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_LICENSING */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,9 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_BOOTCFG
|
#if EFSYS_OPT_BOOTCFG
|
||||||
|
|||||||
@@ -347,12 +347,9 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif /* EFSYS_OPT_QSTATS */
|
#endif /* EFSYS_OPT_QSTATS */
|
||||||
|
|
||||||
/* Support receive header split */
|
/* Obsolete option */
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
#ifdef EFSYS_OPT_RX_HDR_SPLIT
|
||||||
# if !(EFSYS_OPT_FALCON || EFSYS_OPT_SIENA || \
|
# error "RX_HDR_SPLIT is obsolete and is not supported"
|
||||||
EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD)
|
|
||||||
# error "RX_HDR_SPLIT requires FALCON or SIENA or HUNTINGTON or MEDFORD"
|
|
||||||
# endif
|
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
||||||
|
|
||||||
/* Support receive scaling (RSS) */
|
/* Support receive scaling (RSS) */
|
||||||
@@ -404,4 +401,15 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif /* EFSYS_OPT_BIST */
|
#endif /* EFSYS_OPT_BIST */
|
||||||
|
|
||||||
|
/* Support MCDI licensing API */
|
||||||
|
#if EFSYS_OPT_LICENSING
|
||||||
|
# if !EFSYS_OPT_MCDI
|
||||||
|
# error "LICENSING requires MCDI"
|
||||||
|
# endif
|
||||||
|
# if !EFSYS_HAS_UINT64
|
||||||
|
# error "LICENSING requires UINT64"
|
||||||
|
# endif
|
||||||
|
#endif /* EFSYS_OPT_LICENSING */
|
||||||
|
|
||||||
|
|
||||||
#endif /* _SYS_EFX_CHECK_H */
|
#endif /* _SYS_EFX_CHECK_H */
|
||||||
|
|||||||
@@ -31,9 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -31,12 +31,11 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
#if EFSYS_OPT_MON_MCDI
|
||||||
#include "mcdi_mon.h"
|
#include "mcdi_mon.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if EFSYS_OPT_QSTATS
|
#if EFSYS_OPT_QSTATS
|
||||||
#define EFX_EV_QSTAT_INCR(_eep, _stat) \
|
#define EFX_EV_QSTAT_INCR(_eep, _stat) \
|
||||||
@@ -498,7 +497,7 @@ falconsiena_ev_rx_not_ok(
|
|||||||
EFX_EV_QSTAT_INCR(eep, EV_RX_FRM_TRUNC);
|
EFX_EV_QSTAT_INCR(eep, EV_RX_FRM_TRUNC);
|
||||||
(*flagsp) |= EFX_DISCARD;
|
(*flagsp) |= EFX_DISCARD;
|
||||||
|
|
||||||
#if (EFSYS_OPT_RX_HDR_SPLIT || EFSYS_OPT_RX_SCATTER)
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
/*
|
/*
|
||||||
* Lookout for payload queue ran dry errors and ignore them.
|
* Lookout for payload queue ran dry errors and ignore them.
|
||||||
*
|
*
|
||||||
@@ -513,7 +512,7 @@ falconsiena_ev_rx_not_ok(
|
|||||||
(EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_JUMBO_CONT) == 0) &&
|
(EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_JUMBO_CONT) == 0) &&
|
||||||
(EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_BYTE_CNT) == 0))
|
(EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_BYTE_CNT) == 0))
|
||||||
ignore = B_TRUE;
|
ignore = B_TRUE;
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT || EFSYS_OPT_RX_SCATTER */
|
#endif /* EFSYS_OPT_RX_SCATTER */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_ETH_CRC_ERR) != 0) {
|
if (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_ETH_CRC_ERR) != 0) {
|
||||||
@@ -574,10 +573,10 @@ falconsiena_ev_rx(
|
|||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint32_t label;
|
uint32_t label;
|
||||||
boolean_t ok;
|
boolean_t ok;
|
||||||
#if (EFSYS_OPT_RX_HDR_SPLIT || EFSYS_OPT_RX_SCATTER)
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
boolean_t sop;
|
boolean_t sop;
|
||||||
boolean_t jumbo_cont;
|
boolean_t jumbo_cont;
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT || EFSYS_OPT_RX_SCATTER */
|
#endif /* EFSYS_OPT_RX_SCATTER */
|
||||||
uint32_t hdr_type;
|
uint32_t hdr_type;
|
||||||
boolean_t is_v6;
|
boolean_t is_v6;
|
||||||
uint16_t flags;
|
uint16_t flags;
|
||||||
@@ -592,10 +591,10 @@ falconsiena_ev_rx(
|
|||||||
label = EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_Q_LABEL);
|
label = EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_Q_LABEL);
|
||||||
ok = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_PKT_OK) != 0);
|
ok = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_PKT_OK) != 0);
|
||||||
|
|
||||||
#if (EFSYS_OPT_RX_HDR_SPLIT || EFSYS_OPT_RX_SCATTER)
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
sop = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_SOP) != 0);
|
sop = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_SOP) != 0);
|
||||||
jumbo_cont = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_JUMBO_CONT) != 0);
|
jumbo_cont = (EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_JUMBO_CONT) != 0);
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT || EFSYS_OPT_RX_SCATTER */
|
#endif /* EFSYS_OPT_RX_SCATTER */
|
||||||
|
|
||||||
hdr_type = EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_HDR_TYPE);
|
hdr_type = EFX_QWORD_FIELD(*eqp, FSF_AZ_RX_EV_HDR_TYPE);
|
||||||
|
|
||||||
@@ -650,13 +649,13 @@ falconsiena_ev_rx(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCATTER || EFSYS_OPT_RX_HDR_SPLIT
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
/* Report scatter and header/lookahead split buffer flags */
|
/* Report scatter and header/lookahead split buffer flags */
|
||||||
if (sop)
|
if (sop)
|
||||||
flags |= EFX_PKT_START;
|
flags |= EFX_PKT_START;
|
||||||
if (jumbo_cont)
|
if (jumbo_cont)
|
||||||
flags |= EFX_PKT_CONT;
|
flags |= EFX_PKT_CONT;
|
||||||
#endif /* EFSYS_OPT_RX_SCATTER || EFSYS_OPT_RX_HDR_SPLIT */
|
#endif /* EFSYS_OPT_RX_SCATTER */
|
||||||
|
|
||||||
/* Detect errors included in the FSF_AZ_RX_EV_PKT_OK indication */
|
/* Detect errors included in the FSF_AZ_RX_EV_PKT_OK indication */
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -295,7 +292,7 @@ efx_filter_reconfigure(
|
|||||||
|
|
||||||
void
|
void
|
||||||
efx_filter_spec_init_rx(
|
efx_filter_spec_init_rx(
|
||||||
__inout efx_filter_spec_t *spec,
|
__out efx_filter_spec_t *spec,
|
||||||
__in efx_filter_priority_t priority,
|
__in efx_filter_priority_t priority,
|
||||||
__in efx_filter_flag_t flags,
|
__in efx_filter_flag_t flags,
|
||||||
__in efx_rxq_t *erp)
|
__in efx_rxq_t *erp)
|
||||||
@@ -314,7 +311,7 @@ efx_filter_spec_init_rx(
|
|||||||
|
|
||||||
void
|
void
|
||||||
efx_filter_spec_init_tx(
|
efx_filter_spec_init_tx(
|
||||||
__inout efx_filter_spec_t *spec,
|
__out efx_filter_spec_t *spec,
|
||||||
__in efx_txq_t *etp)
|
__in efx_txq_t *etp)
|
||||||
{
|
{
|
||||||
EFSYS_ASSERT3P(spec, !=, NULL);
|
EFSYS_ASSERT3P(spec, !=, NULL);
|
||||||
|
|||||||
@@ -42,9 +42,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
/* Hash initial value */
|
/* Hash initial value */
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ extern "C" {
|
|||||||
#define EFX_MOD_WOL 0x00000800
|
#define EFX_MOD_WOL 0x00000800
|
||||||
#define EFX_MOD_FILTER 0x00001000
|
#define EFX_MOD_FILTER 0x00001000
|
||||||
#define EFX_MOD_PKTFILTER 0x00002000
|
#define EFX_MOD_PKTFILTER 0x00002000
|
||||||
|
#define EFX_MOD_LIC 0x00004000
|
||||||
|
|
||||||
#define EFX_RESET_MAC 0x00000001
|
#define EFX_RESET_MAC 0x00000001
|
||||||
#define EFX_RESET_PHY 0x00000002
|
#define EFX_RESET_PHY 0x00000002
|
||||||
@@ -146,6 +147,9 @@ typedef struct efx_tx_ops_s {
|
|||||||
void (*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t,
|
void (*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t,
|
||||||
uint32_t, uint8_t,
|
uint32_t, uint8_t,
|
||||||
efx_desc_t *);
|
efx_desc_t *);
|
||||||
|
void (*etxo_qdesc_tso2_create)(efx_txq_t *, uint16_t,
|
||||||
|
uint32_t, uint16_t,
|
||||||
|
efx_desc_t *, int);
|
||||||
void (*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t,
|
void (*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t,
|
||||||
efx_desc_t *);
|
efx_desc_t *);
|
||||||
#if EFSYS_OPT_QSTATS
|
#if EFSYS_OPT_QSTATS
|
||||||
@@ -157,10 +161,6 @@ typedef struct efx_tx_ops_s {
|
|||||||
typedef struct efx_rx_ops_s {
|
typedef struct efx_rx_ops_s {
|
||||||
efx_rc_t (*erxo_init)(efx_nic_t *);
|
efx_rc_t (*erxo_init)(efx_nic_t *);
|
||||||
void (*erxo_fini)(efx_nic_t *);
|
void (*erxo_fini)(efx_nic_t *);
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
efx_rc_t (*erxo_hdr_split_enable)(efx_nic_t *, unsigned int,
|
|
||||||
unsigned int);
|
|
||||||
#endif
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
efx_rc_t (*erxo_scatter_enable)(efx_nic_t *, unsigned int);
|
efx_rc_t (*erxo_scatter_enable)(efx_nic_t *, unsigned int);
|
||||||
#endif
|
#endif
|
||||||
@@ -170,7 +170,11 @@ typedef struct efx_rx_ops_s {
|
|||||||
efx_rc_t (*erxo_scale_key_set)(efx_nic_t *, uint8_t *, size_t);
|
efx_rc_t (*erxo_scale_key_set)(efx_nic_t *, uint8_t *, size_t);
|
||||||
efx_rc_t (*erxo_scale_tbl_set)(efx_nic_t *, unsigned int *,
|
efx_rc_t (*erxo_scale_tbl_set)(efx_nic_t *, unsigned int *,
|
||||||
size_t);
|
size_t);
|
||||||
#endif
|
uint32_t (*erxo_prefix_hash)(efx_nic_t *, efx_rx_hash_alg_t,
|
||||||
|
uint8_t *);
|
||||||
|
#endif /* EFSYS_OPT_RX_SCALE */
|
||||||
|
efx_rc_t (*erxo_prefix_pktlen)(efx_nic_t *, uint8_t *,
|
||||||
|
uint16_t *);
|
||||||
void (*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t,
|
void (*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t,
|
||||||
unsigned int, unsigned int,
|
unsigned int, unsigned int,
|
||||||
unsigned int);
|
unsigned int);
|
||||||
@@ -358,6 +362,7 @@ typedef struct efx_intr_s {
|
|||||||
|
|
||||||
typedef struct efx_nic_ops_s {
|
typedef struct efx_nic_ops_s {
|
||||||
efx_rc_t (*eno_probe)(efx_nic_t *);
|
efx_rc_t (*eno_probe)(efx_nic_t *);
|
||||||
|
efx_rc_t (*eno_board_cfg)(efx_nic_t *);
|
||||||
efx_rc_t (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*);
|
efx_rc_t (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*);
|
||||||
efx_rc_t (*eno_reset)(efx_nic_t *);
|
efx_rc_t (*eno_reset)(efx_nic_t *);
|
||||||
efx_rc_t (*eno_init)(efx_nic_t *);
|
efx_rc_t (*eno_init)(efx_nic_t *);
|
||||||
@@ -456,8 +461,8 @@ falconsiena_filter_tbl_clear(
|
|||||||
|
|
||||||
typedef struct efx_mcdi_ops_s {
|
typedef struct efx_mcdi_ops_s {
|
||||||
efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *);
|
efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *);
|
||||||
void (*emco_request_copyin)(efx_nic_t *, efx_mcdi_req_t *,
|
void (*emco_send_request)(efx_nic_t *, void *, size_t,
|
||||||
unsigned int, boolean_t, boolean_t);
|
void *, size_t);
|
||||||
void (*emco_request_copyout)(efx_nic_t *, efx_mcdi_req_t *);
|
void (*emco_request_copyout)(efx_nic_t *, efx_mcdi_req_t *);
|
||||||
efx_rc_t (*emco_poll_reboot)(efx_nic_t *);
|
efx_rc_t (*emco_poll_reboot)(efx_nic_t *);
|
||||||
boolean_t (*emco_poll_response)(efx_nic_t *);
|
boolean_t (*emco_poll_response)(efx_nic_t *);
|
||||||
@@ -479,7 +484,6 @@ typedef struct efx_nvram_ops_s {
|
|||||||
#if EFSYS_OPT_DIAG
|
#if EFSYS_OPT_DIAG
|
||||||
efx_rc_t (*envo_test)(efx_nic_t *);
|
efx_rc_t (*envo_test)(efx_nic_t *);
|
||||||
#endif /* EFSYS_OPT_DIAG */
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
efx_rc_t (*envo_size)(efx_nic_t *, efx_nvram_type_t, size_t *);
|
|
||||||
efx_rc_t (*envo_get_version)(efx_nic_t *, efx_nvram_type_t,
|
efx_rc_t (*envo_get_version)(efx_nic_t *, efx_nvram_type_t,
|
||||||
uint32_t *, uint16_t *);
|
uint32_t *, uint16_t *);
|
||||||
efx_rc_t (*envo_rw_start)(efx_nic_t *, efx_nvram_type_t, size_t *);
|
efx_rc_t (*envo_rw_start)(efx_nic_t *, efx_nvram_type_t, size_t *);
|
||||||
@@ -492,6 +496,9 @@ typedef struct efx_nvram_ops_s {
|
|||||||
efx_rc_t (*envo_set_version)(efx_nic_t *, efx_nvram_type_t,
|
efx_rc_t (*envo_set_version)(efx_nic_t *, efx_nvram_type_t,
|
||||||
uint16_t *);
|
uint16_t *);
|
||||||
|
|
||||||
|
efx_rc_t (*envo_type_to_partn)(efx_nic_t *, efx_nvram_type_t,
|
||||||
|
uint32_t *);
|
||||||
|
efx_rc_t (*envo_partn_size)(efx_nic_t *, uint32_t, size_t *);
|
||||||
} efx_nvram_ops_t;
|
} efx_nvram_ops_t;
|
||||||
#endif /* EFSYS_OPT_NVRAM */
|
#endif /* EFSYS_OPT_NVRAM */
|
||||||
|
|
||||||
@@ -585,6 +592,18 @@ efx_mcdi_nvram_test(
|
|||||||
|
|
||||||
#endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
|
#endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_LICENSING
|
||||||
|
|
||||||
|
typedef struct efx_lic_ops_s {
|
||||||
|
efx_rc_t (*elo_update_licenses)(efx_nic_t *);
|
||||||
|
efx_rc_t (*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *);
|
||||||
|
efx_rc_t (*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *);
|
||||||
|
efx_rc_t (*elo_get_id)(efx_nic_t *, size_t, uint32_t *,
|
||||||
|
size_t *, uint8_t *);
|
||||||
|
} efx_lic_ops_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct efx_drv_cfg_s {
|
typedef struct efx_drv_cfg_s {
|
||||||
uint32_t edc_min_vi_count;
|
uint32_t edc_min_vi_count;
|
||||||
uint32_t edc_max_vi_count;
|
uint32_t edc_max_vi_count;
|
||||||
@@ -634,6 +653,9 @@ struct efx_nic_s {
|
|||||||
uint32_t en_rss_context;
|
uint32_t en_rss_context;
|
||||||
#endif /* EFSYS_OPT_RX_SCALE */
|
#endif /* EFSYS_OPT_RX_SCALE */
|
||||||
uint32_t en_vport_id;
|
uint32_t en_vport_id;
|
||||||
|
#if EFSYS_OPT_LICENSING
|
||||||
|
efx_lic_ops_t *en_elop;
|
||||||
|
#endif
|
||||||
union {
|
union {
|
||||||
#if EFSYS_OPT_FALCON
|
#if EFSYS_OPT_FALCON
|
||||||
struct {
|
struct {
|
||||||
@@ -672,6 +694,7 @@ struct efx_nic_s {
|
|||||||
struct {
|
struct {
|
||||||
int ena_vi_base;
|
int ena_vi_base;
|
||||||
int ena_vi_count;
|
int ena_vi_count;
|
||||||
|
int ena_vi_shift;
|
||||||
#if EFSYS_OPT_VPD
|
#if EFSYS_OPT_VPD
|
||||||
caddr_t ena_svpd;
|
caddr_t ena_svpd;
|
||||||
size_t ena_svpd_length;
|
size_t ena_svpd_length;
|
||||||
@@ -1117,7 +1140,7 @@ efx_vpd_hunk_next(
|
|||||||
__in size_t size,
|
__in size_t size,
|
||||||
__out efx_vpd_tag_t *tagp,
|
__out efx_vpd_tag_t *tagp,
|
||||||
__out efx_vpd_keyword_t *keyword,
|
__out efx_vpd_keyword_t *keyword,
|
||||||
__out_bcount_opt(*paylenp) unsigned int *payloadp,
|
__out_opt unsigned int *payloadp,
|
||||||
__out_opt uint8_t *paylenp,
|
__out_opt uint8_t *paylenp,
|
||||||
__inout unsigned int *contp);
|
__inout unsigned int *contp);
|
||||||
|
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,792 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2009-2015 Solarflare Communications Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
|
||||||
|
*
|
||||||
|
* The views and conclusions contained in the software and documentation are
|
||||||
|
* those of the authors and should not be interpreted as representing official
|
||||||
|
* policies, either expressed or implied, of the FreeBSD Project.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include "efx.h"
|
||||||
|
#include "efx_impl.h"
|
||||||
|
|
||||||
|
#if EFSYS_OPT_LICENSING
|
||||||
|
|
||||||
|
#if EFSYS_OPT_SIENA
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_fc_license_update_license(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_fc_license_get_key_stats(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *eksp);
|
||||||
|
|
||||||
|
static efx_lic_ops_t __efx_lic_v1_ops = {
|
||||||
|
efx_mcdi_fc_license_update_license, /* elo_update_licenses */
|
||||||
|
efx_mcdi_fc_license_get_key_stats, /* elo_get_key_stats */
|
||||||
|
NULL, /* elo_app_state */
|
||||||
|
NULL, /* elo_get_id */
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_SIENA */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_HUNTINGTON
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_update_licenses(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_get_key_stats(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *eksp);
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensed_app_state(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint64_t app_id,
|
||||||
|
__out boolean_t *licensedp);
|
||||||
|
|
||||||
|
static efx_lic_ops_t __efx_lic_v2_ops = {
|
||||||
|
efx_mcdi_licensing_update_licenses, /* elo_update_licenses */
|
||||||
|
efx_mcdi_licensing_get_key_stats, /* elo_get_key_stats */
|
||||||
|
efx_mcdi_licensed_app_state, /* elo_app_state */
|
||||||
|
NULL, /* elo_get_id */
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_HUNTINGTON */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_MEDFORD
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_update_licenses(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_report_license(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *eksp);
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_app_state(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint64_t app_id,
|
||||||
|
__out boolean_t *licensedp);
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_get_id(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in size_t buffer_size,
|
||||||
|
__out uint32_t *typep,
|
||||||
|
__out size_t *lengthp,
|
||||||
|
__out_bcount_part_opt(buffer_size, *lengthp)
|
||||||
|
uint8_t *bufferp);
|
||||||
|
|
||||||
|
static efx_lic_ops_t __efx_lic_v3_ops = {
|
||||||
|
efx_mcdi_licensing_v3_update_licenses, /* elo_update_licenses */
|
||||||
|
efx_mcdi_licensing_v3_report_license, /* elo_get_key_stats */
|
||||||
|
efx_mcdi_licensing_v3_app_state, /* elo_app_state */
|
||||||
|
efx_mcdi_licensing_v3_get_id, /* elo_get_id */
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_MEDFORD */
|
||||||
|
|
||||||
|
|
||||||
|
/* V1 Licensing - used in Siena Modena only */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_SIENA
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_fc_license_update_license(
|
||||||
|
__in efx_nic_t *enp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MC_CMD_FC_IN_LICENSE_LEN];
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_SIENA);
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_FC_OP_LICENSE;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_FC_IN_LICENSE_LEN;
|
||||||
|
req.emr_out_buf = payload;
|
||||||
|
req.emr_out_length = 0;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, FC_IN_LICENSE_OP,
|
||||||
|
MC_CMD_FC_IN_LICENSE_UPDATE_LICENSE);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used != 0) {
|
||||||
|
rc = EIO;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_fc_license_get_key_stats(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *eksp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MAX(MC_CMD_FC_IN_LICENSE_LEN,
|
||||||
|
MC_CMD_FC_OUT_LICENSE_LEN)];
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_SIENA);
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_FC_OP_LICENSE;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_FC_IN_LICENSE_LEN;
|
||||||
|
req.emr_out_buf = payload;
|
||||||
|
req.emr_out_length = MC_CMD_FC_OUT_LICENSE_LEN;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, FC_IN_LICENSE_OP,
|
||||||
|
MC_CMD_FC_IN_LICENSE_GET_KEY_STATS);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used < MC_CMD_FC_OUT_LICENSE_LEN) {
|
||||||
|
rc = EMSGSIZE;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
eksp->eks_valid =
|
||||||
|
MCDI_OUT_DWORD(req, FC_OUT_LICENSE_VALID_KEYS);
|
||||||
|
eksp->eks_invalid =
|
||||||
|
MCDI_OUT_DWORD(req, FC_OUT_LICENSE_INVALID_KEYS);
|
||||||
|
eksp->eks_blacklisted =
|
||||||
|
MCDI_OUT_DWORD(req, FC_OUT_LICENSE_BLACKLISTED_KEYS);
|
||||||
|
eksp->eks_unverifiable = 0;
|
||||||
|
eksp->eks_wrong_node = 0;
|
||||||
|
eksp->eks_licensed_apps_lo = 0;
|
||||||
|
eksp->eks_licensed_apps_hi = 0;
|
||||||
|
eksp->eks_licensed_features_lo = 0;
|
||||||
|
eksp->eks_licensed_features_hi = 0;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_SIENA */
|
||||||
|
|
||||||
|
/* V2 Licensing - used by Huntington family only. See SF-113611-TC */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_HUNTINGTON
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensed_app_state(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint64_t app_id,
|
||||||
|
__out boolean_t *licensedp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MAX(MC_CMD_GET_LICENSED_APP_STATE_IN_LEN,
|
||||||
|
MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN)];
|
||||||
|
uint32_t app_state;
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
|
||||||
|
|
||||||
|
/* V2 licensing supports 32bit app id only */
|
||||||
|
if ((app_id >> 32) != 0) {
|
||||||
|
rc = EINVAL;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_GET_LICENSED_APP_STATE;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_GET_LICENSED_APP_STATE_IN_LEN;
|
||||||
|
req.emr_out_buf = payload;
|
||||||
|
req.emr_out_length = MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, GET_LICENSED_APP_STATE_IN_APP_ID,
|
||||||
|
app_id & 0xffffffff);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used < MC_CMD_GET_LICENSED_APP_STATE_OUT_LEN) {
|
||||||
|
rc = EMSGSIZE;
|
||||||
|
goto fail3;
|
||||||
|
}
|
||||||
|
|
||||||
|
app_state = (MCDI_OUT_DWORD(req, GET_LICENSED_APP_STATE_OUT_STATE));
|
||||||
|
if (app_state != MC_CMD_GET_LICENSED_APP_STATE_OUT_NOT_LICENSED) {
|
||||||
|
*licensedp = B_TRUE;
|
||||||
|
} else {
|
||||||
|
*licensedp = B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail3:
|
||||||
|
EFSYS_PROBE(fail3);
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_update_licenses(
|
||||||
|
__in efx_nic_t *enp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MC_CMD_LICENSING_IN_LEN];
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_LICENSING;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_LICENSING_IN_LEN;
|
||||||
|
req.emr_out_buf = payload;
|
||||||
|
req.emr_out_length = 0;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, LICENSING_IN_OP,
|
||||||
|
MC_CMD_LICENSING_IN_OP_UPDATE_LICENSE);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used != 0) {
|
||||||
|
rc = EIO;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_get_key_stats(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *eksp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MAX(MC_CMD_LICENSING_IN_LEN,
|
||||||
|
MC_CMD_LICENSING_OUT_LEN)];
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_LICENSING;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_LICENSING_IN_LEN;
|
||||||
|
req.emr_out_buf = payload;
|
||||||
|
req.emr_out_length = MC_CMD_LICENSING_OUT_LEN;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, LICENSING_IN_OP,
|
||||||
|
MC_CMD_LICENSING_IN_OP_GET_KEY_STATS);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used < MC_CMD_LICENSING_OUT_LEN) {
|
||||||
|
rc = EMSGSIZE;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
eksp->eks_valid =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_OUT_VALID_APP_KEYS);
|
||||||
|
eksp->eks_invalid =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_OUT_INVALID_APP_KEYS);
|
||||||
|
eksp->eks_blacklisted =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_OUT_BLACKLISTED_APP_KEYS);
|
||||||
|
eksp->eks_unverifiable =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_OUT_UNVERIFIABLE_APP_KEYS);
|
||||||
|
eksp->eks_wrong_node =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_OUT_WRONG_NODE_APP_KEYS);
|
||||||
|
eksp->eks_licensed_apps_lo = 0;
|
||||||
|
eksp->eks_licensed_apps_hi = 0;
|
||||||
|
eksp->eks_licensed_features_lo = 0;
|
||||||
|
eksp->eks_licensed_features_hi = 0;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_HUNTINGTON */
|
||||||
|
|
||||||
|
/* V3 Licensing - used starting from Medford family. See SF-114884-SW */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_MEDFORD
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_update_licenses(
|
||||||
|
__in efx_nic_t *enp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MC_CMD_LICENSING_V3_IN_LEN];
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_LICENSING_V3;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_LICENSING_V3_IN_LEN;
|
||||||
|
req.emr_out_buf = NULL;
|
||||||
|
req.emr_out_length = 0;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, LICENSING_V3_IN_OP,
|
||||||
|
MC_CMD_LICENSING_V3_IN_OP_UPDATE_LICENSE);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_report_license(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *eksp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MAX(MC_CMD_LICENSING_V3_IN_LEN,
|
||||||
|
MC_CMD_LICENSING_V3_OUT_LEN)];
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_LICENSING_V3;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_LICENSING_V3_IN_LEN;
|
||||||
|
req.emr_out_buf = payload;
|
||||||
|
req.emr_out_length = MC_CMD_LICENSING_V3_OUT_LEN;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, LICENSING_V3_IN_OP,
|
||||||
|
MC_CMD_LICENSING_V3_IN_OP_REPORT_LICENSE);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used < MC_CMD_LICENSING_V3_OUT_LEN) {
|
||||||
|
rc = EMSGSIZE;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
eksp->eks_valid =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_VALID_KEYS);
|
||||||
|
eksp->eks_invalid =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_INVALID_KEYS);
|
||||||
|
eksp->eks_blacklisted = 0;
|
||||||
|
eksp->eks_unverifiable =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_UNVERIFIABLE_KEYS);
|
||||||
|
eksp->eks_wrong_node =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_WRONG_NODE_KEYS);
|
||||||
|
eksp->eks_licensed_apps_lo =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_APPS_LO);
|
||||||
|
eksp->eks_licensed_apps_hi =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_APPS_HI);
|
||||||
|
eksp->eks_licensed_features_lo =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_FEATURES_LO);
|
||||||
|
eksp->eks_licensed_features_hi =
|
||||||
|
MCDI_OUT_DWORD(req, LICENSING_V3_OUT_LICENSED_FEATURES_HI);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_app_state(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint64_t app_id,
|
||||||
|
__out boolean_t *licensedp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MAX(MC_CMD_GET_LICENSED_V3_APP_STATE_IN_LEN,
|
||||||
|
MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN)];
|
||||||
|
uint32_t app_state;
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_MEDFORD);
|
||||||
|
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
req.emr_cmd = MC_CMD_GET_LICENSED_V3_APP_STATE;
|
||||||
|
req.emr_in_buf = payload;
|
||||||
|
req.emr_in_length = MC_CMD_GET_LICENSED_V3_APP_STATE_IN_LEN;
|
||||||
|
req.emr_out_buf = payload;
|
||||||
|
req.emr_out_length = MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN;
|
||||||
|
|
||||||
|
MCDI_IN_SET_DWORD(req, GET_LICENSED_V3_APP_STATE_IN_APP_ID_LO,
|
||||||
|
app_id & 0xffffffff);
|
||||||
|
MCDI_IN_SET_DWORD(req, GET_LICENSED_V3_APP_STATE_IN_APP_ID_HI,
|
||||||
|
app_id >> 32);
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used < MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_LEN) {
|
||||||
|
rc = EMSGSIZE;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
app_state = (MCDI_OUT_DWORD(req, GET_LICENSED_V3_APP_STATE_OUT_STATE));
|
||||||
|
if (app_state != MC_CMD_GET_LICENSED_V3_APP_STATE_OUT_NOT_LICENSED) {
|
||||||
|
*licensedp = B_TRUE;
|
||||||
|
} else {
|
||||||
|
*licensedp = B_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
efx_mcdi_licensing_v3_get_id(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in size_t buffer_size,
|
||||||
|
__out uint32_t *typep,
|
||||||
|
__out size_t *lengthp,
|
||||||
|
__out_bcount_part_opt(buffer_size, *lengthp)
|
||||||
|
uint8_t *bufferp)
|
||||||
|
{
|
||||||
|
efx_mcdi_req_t req;
|
||||||
|
uint8_t payload[MAX(MC_CMD_LICENSING_GET_ID_V3_IN_LEN,
|
||||||
|
MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN)];
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
req.emr_cmd = MC_CMD_LICENSING_GET_ID_V3;
|
||||||
|
|
||||||
|
if (bufferp == NULL) {
|
||||||
|
/* Request id type and length only */
|
||||||
|
req.emr_in_buf = bufferp;
|
||||||
|
req.emr_in_length = MC_CMD_LICENSING_GET_ID_V3_IN_LEN;
|
||||||
|
req.emr_out_buf = bufferp;
|
||||||
|
req.emr_out_length = MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN;
|
||||||
|
(void) memset(payload, 0, sizeof (payload));
|
||||||
|
} else {
|
||||||
|
/* Request full buffer */
|
||||||
|
req.emr_in_buf = bufferp;
|
||||||
|
req.emr_in_length = MC_CMD_LICENSING_GET_ID_V3_IN_LEN;
|
||||||
|
req.emr_out_buf = bufferp;
|
||||||
|
req.emr_out_length = MIN(buffer_size, MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN);
|
||||||
|
(void) memset(bufferp, 0, req.emr_out_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
efx_mcdi_execute(enp, &req);
|
||||||
|
|
||||||
|
if (req.emr_rc != 0) {
|
||||||
|
rc = req.emr_rc;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.emr_out_length_used < MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN) {
|
||||||
|
rc = EMSGSIZE;
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
|
||||||
|
*typep = MCDI_OUT_DWORD(req, LICENSING_GET_ID_V3_OUT_LICENSE_TYPE);
|
||||||
|
*lengthp = MCDI_OUT_DWORD(req, LICENSING_GET_ID_V3_OUT_LICENSE_ID_LENGTH);
|
||||||
|
|
||||||
|
if (bufferp == NULL) {
|
||||||
|
/* modify length requirements to indicate to caller the extra buffering
|
||||||
|
** needed to read the complete output.
|
||||||
|
*/
|
||||||
|
*lengthp += MC_CMD_LICENSING_GET_ID_V3_OUT_LENMIN;
|
||||||
|
} else {
|
||||||
|
/* Shift ID down to start of buffer */
|
||||||
|
memmove(bufferp,
|
||||||
|
bufferp+MC_CMD_LICENSING_GET_ID_V3_OUT_LICENSE_ID_OFST,
|
||||||
|
*lengthp);
|
||||||
|
memset(bufferp+(*lengthp), 0, MC_CMD_LICENSING_GET_ID_V3_OUT_LICENSE_ID_OFST);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_MEDFORD */
|
||||||
|
|
||||||
|
__checkReturn efx_rc_t
|
||||||
|
efx_lic_init(
|
||||||
|
__in efx_nic_t *enp)
|
||||||
|
{
|
||||||
|
efx_lic_ops_t *elop;
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
|
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
|
||||||
|
EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_LIC));
|
||||||
|
|
||||||
|
switch (enp->en_family) {
|
||||||
|
|
||||||
|
#if EFSYS_OPT_SIENA
|
||||||
|
case EFX_FAMILY_SIENA:
|
||||||
|
elop = (efx_lic_ops_t *)&__efx_lic_v1_ops;
|
||||||
|
break;
|
||||||
|
#endif /* EFSYS_OPT_SIENA */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_HUNTINGTON
|
||||||
|
case EFX_FAMILY_HUNTINGTON:
|
||||||
|
elop = (efx_lic_ops_t *)&__efx_lic_v2_ops;
|
||||||
|
break;
|
||||||
|
#endif /* EFSYS_OPT_HUNTINGTON */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_MEDFORD
|
||||||
|
case EFX_FAMILY_MEDFORD:
|
||||||
|
elop = (efx_lic_ops_t *)&__efx_lic_v3_ops;
|
||||||
|
break;
|
||||||
|
#endif /* EFSYS_OPT_MEDFORD */
|
||||||
|
|
||||||
|
default:
|
||||||
|
EFSYS_ASSERT(0);
|
||||||
|
rc = ENOTSUP;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
enp->en_elop = elop;
|
||||||
|
enp->en_mod_flags |= EFX_MOD_LIC;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
efx_lic_fini(
|
||||||
|
__in efx_nic_t *enp)
|
||||||
|
{
|
||||||
|
efx_lic_ops_t *elop = enp->en_elop;
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
|
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
|
||||||
|
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);
|
||||||
|
|
||||||
|
enp->en_elop = NULL;
|
||||||
|
enp->en_mod_flags &= ~EFX_MOD_LIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__checkReturn efx_rc_t
|
||||||
|
efx_lic_update_licenses(
|
||||||
|
__in efx_nic_t *enp)
|
||||||
|
{
|
||||||
|
efx_lic_ops_t *elop = enp->en_elop;
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
|
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);
|
||||||
|
|
||||||
|
if ((rc = elop->elo_update_licenses(enp)) != 0)
|
||||||
|
goto fail1;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
__checkReturn efx_rc_t
|
||||||
|
efx_lic_get_key_stats(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__out efx_key_stats_t *eksp)
|
||||||
|
{
|
||||||
|
efx_lic_ops_t *elop = enp->en_elop;
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
|
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);
|
||||||
|
|
||||||
|
if ((rc = elop->elo_get_key_stats(enp, eksp)) != 0)
|
||||||
|
goto fail1;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
__checkReturn efx_rc_t
|
||||||
|
efx_lic_app_state(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint64_t app_id,
|
||||||
|
__out boolean_t *licensedp)
|
||||||
|
{
|
||||||
|
efx_lic_ops_t *elop = enp->en_elop;
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
|
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);
|
||||||
|
|
||||||
|
if (elop->elo_app_state == NULL) {
|
||||||
|
rc = ENOTSUP;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
if ((rc = elop->elo_app_state(enp, app_id, licensedp)) != 0)
|
||||||
|
goto fail2;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
__checkReturn efx_rc_t
|
||||||
|
efx_lic_get_id(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in size_t buffer_size,
|
||||||
|
__out uint32_t *typep,
|
||||||
|
__out size_t *lengthp,
|
||||||
|
__out_opt uint8_t *bufferp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
efx_lic_ops_t *elop = enp->en_elop;
|
||||||
|
efx_rc_t rc;
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
|
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_LIC);
|
||||||
|
|
||||||
|
if (elop->elo_get_id == NULL) {
|
||||||
|
rc = ENOTSUP;
|
||||||
|
goto fail1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((rc = elop->elo_get_id(enp, buffer_size, typep,
|
||||||
|
lengthp, bufferp)) != 0)
|
||||||
|
goto fail2;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
|
fail1:
|
||||||
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
|
||||||
|
return (rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_LICENSING */
|
||||||
@@ -31,9 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_MAC_FALCON_GMAC
|
#if EFSYS_OPT_MAC_FALCON_GMAC
|
||||||
|
|||||||
@@ -31,21 +31,37 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_regs_mcdi.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_MCDI
|
#if EFSYS_OPT_MCDI
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There are three versions of the MCDI interface:
|
||||||
|
* - MCDIv0: Siena BootROM. Transport uses MCDIv1 headers.
|
||||||
|
* - MCDIv1: Siena firmware and Huntington BootROM.
|
||||||
|
* - MCDIv2: EF10 firmware (Huntington/Medford) and Medford BootROM.
|
||||||
|
* Transport uses MCDIv2 headers.
|
||||||
|
*
|
||||||
|
* MCDIv2 Header NOT_EPOCH flag
|
||||||
|
* ----------------------------
|
||||||
|
* A new epoch begins at initial startup or after an MC reboot, and defines when
|
||||||
|
* the MC should reject stale MCDI requests.
|
||||||
|
*
|
||||||
|
* The first MCDI request sent by the host should contain NOT_EPOCH=0, and all
|
||||||
|
* subsequent requests (until the next MC reboot) should contain NOT_EPOCH=1.
|
||||||
|
*
|
||||||
|
* After rebooting the MC will fail all requests with NOT_EPOCH=1 by writing a
|
||||||
|
* response with ERROR=1 and DATALEN=0 until a request is seen with NOT_EPOCH=0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if EFSYS_OPT_SIENA
|
#if EFSYS_OPT_SIENA
|
||||||
|
|
||||||
static efx_mcdi_ops_t __efx_mcdi_siena_ops = {
|
static efx_mcdi_ops_t __efx_mcdi_siena_ops = {
|
||||||
siena_mcdi_init, /* emco_init */
|
siena_mcdi_init, /* emco_init */
|
||||||
siena_mcdi_request_copyin, /* emco_request_copyin */
|
siena_mcdi_send_request, /* emco_send_request */
|
||||||
siena_mcdi_request_copyout, /* emco_request_copyout */
|
siena_mcdi_request_copyout, /* emco_request_copyout */
|
||||||
siena_mcdi_poll_reboot, /* emco_poll_reboot */
|
siena_mcdi_poll_reboot, /* emco_poll_reboot */
|
||||||
siena_mcdi_poll_response, /* emco_poll_response */
|
siena_mcdi_poll_response, /* emco_poll_response */
|
||||||
@@ -60,7 +76,7 @@ static efx_mcdi_ops_t __efx_mcdi_siena_ops = {
|
|||||||
|
|
||||||
static efx_mcdi_ops_t __efx_mcdi_ef10_ops = {
|
static efx_mcdi_ops_t __efx_mcdi_ef10_ops = {
|
||||||
ef10_mcdi_init, /* emco_init */
|
ef10_mcdi_init, /* emco_init */
|
||||||
ef10_mcdi_request_copyin, /* emco_request_copyin */
|
ef10_mcdi_send_request, /* emco_send_request */
|
||||||
ef10_mcdi_request_copyout, /* emco_request_copyout */
|
ef10_mcdi_request_copyout, /* emco_request_copyout */
|
||||||
ef10_mcdi_poll_reboot, /* emco_poll_reboot */
|
ef10_mcdi_poll_reboot, /* emco_poll_reboot */
|
||||||
ef10_mcdi_poll_response, /* emco_poll_response */
|
ef10_mcdi_poll_response, /* emco_poll_response */
|
||||||
@@ -183,16 +199,16 @@ efx_mcdi_new_epoch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
efx_mcdi_request_copyin(
|
efx_mcdi_send_request(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__in efx_mcdi_req_t *emrp,
|
__in void *hdrp,
|
||||||
__in unsigned int seq,
|
__in size_t hdr_len,
|
||||||
__in boolean_t ev_cpl,
|
__in void *sdup,
|
||||||
__in boolean_t new_epoch)
|
__in size_t sdu_len)
|
||||||
{
|
{
|
||||||
efx_mcdi_ops_t *emcop = enp->en_mcdi.em_emcop;
|
efx_mcdi_ops_t *emcop = enp->en_mcdi.em_emcop;
|
||||||
|
|
||||||
emcop->emco_request_copyin(enp, emrp, seq, ev_cpl, new_epoch);
|
emcop->emco_send_request(enp, hdrp, hdr_len, sdup, sdu_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -245,8 +261,15 @@ efx_mcdi_request_start(
|
|||||||
__in efx_mcdi_req_t *emrp,
|
__in efx_mcdi_req_t *emrp,
|
||||||
__in boolean_t ev_cpl)
|
__in boolean_t ev_cpl)
|
||||||
{
|
{
|
||||||
|
#if EFSYS_OPT_MCDI_LOGGING
|
||||||
|
const efx_mcdi_transport_t *emtp = enp->en_mcdi.em_emtp;
|
||||||
|
#endif
|
||||||
efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
|
efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
|
||||||
|
efx_dword_t hdr[2];
|
||||||
|
size_t hdr_len;
|
||||||
|
unsigned int max_version;
|
||||||
unsigned int seq;
|
unsigned int seq;
|
||||||
|
unsigned int xflags;
|
||||||
boolean_t new_epoch;
|
boolean_t new_epoch;
|
||||||
int state;
|
int state;
|
||||||
|
|
||||||
@@ -273,9 +296,60 @@ efx_mcdi_request_start(
|
|||||||
emip->emi_poll_cnt = 0;
|
emip->emi_poll_cnt = 0;
|
||||||
seq = emip->emi_seq++ & EFX_MASK32(MCDI_HEADER_SEQ);
|
seq = emip->emi_seq++ & EFX_MASK32(MCDI_HEADER_SEQ);
|
||||||
new_epoch = emip->emi_new_epoch;
|
new_epoch = emip->emi_new_epoch;
|
||||||
|
max_version = emip->emi_max_version;
|
||||||
EFSYS_UNLOCK(enp->en_eslp, state);
|
EFSYS_UNLOCK(enp->en_eslp, state);
|
||||||
|
|
||||||
efx_mcdi_request_copyin(enp, emrp, seq, ev_cpl, new_epoch);
|
xflags = 0;
|
||||||
|
if (ev_cpl)
|
||||||
|
xflags |= MCDI_HEADER_XFLAGS_EVREQ;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Huntington firmware supports MCDIv2, but the Huntington BootROM only
|
||||||
|
* supports MCDIv1. Use MCDIv1 headers for MCDIv1 commands where
|
||||||
|
* possible to support this.
|
||||||
|
*/
|
||||||
|
if ((max_version >= 2) &&
|
||||||
|
((emrp->emr_cmd > MC_CMD_CMD_SPACE_ESCAPE_7) ||
|
||||||
|
(emrp->emr_in_length > MCDI_CTL_SDU_LEN_MAX_V1))) {
|
||||||
|
/* Construct MCDI v2 header */
|
||||||
|
hdr_len = sizeof (hdr);
|
||||||
|
EFX_POPULATE_DWORD_8(hdr[0],
|
||||||
|
MCDI_HEADER_CODE, MC_CMD_V2_EXTN,
|
||||||
|
MCDI_HEADER_RESYNC, 1,
|
||||||
|
MCDI_HEADER_DATALEN, 0,
|
||||||
|
MCDI_HEADER_SEQ, seq,
|
||||||
|
MCDI_HEADER_NOT_EPOCH, new_epoch ? 0 : 1,
|
||||||
|
MCDI_HEADER_ERROR, 0,
|
||||||
|
MCDI_HEADER_RESPONSE, 0,
|
||||||
|
MCDI_HEADER_XFLAGS, xflags);
|
||||||
|
|
||||||
|
EFX_POPULATE_DWORD_2(hdr[1],
|
||||||
|
MC_CMD_V2_EXTN_IN_EXTENDED_CMD, emrp->emr_cmd,
|
||||||
|
MC_CMD_V2_EXTN_IN_ACTUAL_LEN, emrp->emr_in_length);
|
||||||
|
} else {
|
||||||
|
/* Construct MCDI v1 header */
|
||||||
|
hdr_len = sizeof (hdr[0]);
|
||||||
|
EFX_POPULATE_DWORD_8(hdr[0],
|
||||||
|
MCDI_HEADER_CODE, emrp->emr_cmd,
|
||||||
|
MCDI_HEADER_RESYNC, 1,
|
||||||
|
MCDI_HEADER_DATALEN, emrp->emr_in_length,
|
||||||
|
MCDI_HEADER_SEQ, seq,
|
||||||
|
MCDI_HEADER_NOT_EPOCH, new_epoch ? 0 : 1,
|
||||||
|
MCDI_HEADER_ERROR, 0,
|
||||||
|
MCDI_HEADER_RESPONSE, 0,
|
||||||
|
MCDI_HEADER_XFLAGS, xflags);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if EFSYS_OPT_MCDI_LOGGING
|
||||||
|
if (emtp->emt_logger != NULL) {
|
||||||
|
emtp->emt_logger(emtp->emt_context, EFX_LOG_MCDI_REQUEST,
|
||||||
|
&hdr, hdr_len,
|
||||||
|
emrp->emr_in_buf, emrp->emr_in_length);
|
||||||
|
}
|
||||||
|
#endif /* EFSYS_OPT_MCDI_LOGGING */
|
||||||
|
|
||||||
|
efx_mcdi_send_request(enp, &hdr[0], hdr_len,
|
||||||
|
emrp->emr_in_buf, emrp->emr_in_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -388,15 +462,8 @@ efx_mcdi_read_response_header(
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
fail3:
|
fail3:
|
||||||
if (!emrp->emr_quiet)
|
|
||||||
EFSYS_PROBE(fail3);
|
|
||||||
fail2:
|
fail2:
|
||||||
if (!emrp->emr_quiet)
|
|
||||||
EFSYS_PROBE(fail2);
|
|
||||||
fail1:
|
fail1:
|
||||||
if (!emrp->emr_quiet)
|
|
||||||
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
|
||||||
|
|
||||||
emrp->emr_rc = rc;
|
emrp->emr_rc = rc;
|
||||||
emrp->emr_out_length_used = 0;
|
emrp->emr_out_length_used = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
#define _SYS_EFX_MCDI_H
|
#define _SYS_EFX_MCDI_H
|
||||||
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_regs_mcdi.h"
|
#include "efx_regs_mcdi.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -55,7 +54,7 @@ struct efx_mcdi_req_s {
|
|||||||
uint8_t *emr_in_buf;
|
uint8_t *emr_in_buf;
|
||||||
size_t emr_in_length;
|
size_t emr_in_length;
|
||||||
/* Outputs: retcode, buffer, length, and length used*/
|
/* Outputs: retcode, buffer, length, and length used*/
|
||||||
int emr_rc;
|
efx_rc_t emr_rc;
|
||||||
uint8_t *emr_out_buf;
|
uint8_t *emr_out_buf;
|
||||||
size_t emr_out_length;
|
size_t emr_out_length;
|
||||||
size_t emr_out_length_used;
|
size_t emr_out_length_used;
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_MON_NULL
|
#if EFSYS_OPT_MON_NULL
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
@@ -247,6 +244,7 @@ efx_nic_biu_test(
|
|||||||
|
|
||||||
static efx_nic_ops_t __efx_nic_falcon_ops = {
|
static efx_nic_ops_t __efx_nic_falcon_ops = {
|
||||||
falcon_nic_probe, /* eno_probe */
|
falcon_nic_probe, /* eno_probe */
|
||||||
|
NULL, /* eno_board_cfg */
|
||||||
NULL, /* eno_set_drv_limits */
|
NULL, /* eno_set_drv_limits */
|
||||||
falcon_nic_reset, /* eno_reset */
|
falcon_nic_reset, /* eno_reset */
|
||||||
falcon_nic_init, /* eno_init */
|
falcon_nic_init, /* eno_init */
|
||||||
@@ -266,6 +264,7 @@ static efx_nic_ops_t __efx_nic_falcon_ops = {
|
|||||||
|
|
||||||
static efx_nic_ops_t __efx_nic_siena_ops = {
|
static efx_nic_ops_t __efx_nic_siena_ops = {
|
||||||
siena_nic_probe, /* eno_probe */
|
siena_nic_probe, /* eno_probe */
|
||||||
|
NULL, /* eno_board_cfg */
|
||||||
NULL, /* eno_set_drv_limits */
|
NULL, /* eno_set_drv_limits */
|
||||||
siena_nic_reset, /* eno_reset */
|
siena_nic_reset, /* eno_reset */
|
||||||
siena_nic_init, /* eno_init */
|
siena_nic_init, /* eno_init */
|
||||||
@@ -284,22 +283,44 @@ static efx_nic_ops_t __efx_nic_siena_ops = {
|
|||||||
#if EFSYS_OPT_HUNTINGTON
|
#if EFSYS_OPT_HUNTINGTON
|
||||||
|
|
||||||
static efx_nic_ops_t __efx_nic_hunt_ops = {
|
static efx_nic_ops_t __efx_nic_hunt_ops = {
|
||||||
hunt_nic_probe, /* eno_probe */
|
ef10_nic_probe, /* eno_probe */
|
||||||
hunt_nic_set_drv_limits, /* eno_set_drv_limits */
|
hunt_board_cfg, /* eno_board_cfg */
|
||||||
hunt_nic_reset, /* eno_reset */
|
ef10_nic_set_drv_limits, /* eno_set_drv_limits */
|
||||||
hunt_nic_init, /* eno_init */
|
ef10_nic_reset, /* eno_reset */
|
||||||
hunt_nic_get_vi_pool, /* eno_get_vi_pool */
|
ef10_nic_init, /* eno_init */
|
||||||
hunt_nic_get_bar_region, /* eno_get_bar_region */
|
ef10_nic_get_vi_pool, /* eno_get_vi_pool */
|
||||||
|
ef10_nic_get_bar_region, /* eno_get_bar_region */
|
||||||
#if EFSYS_OPT_DIAG
|
#if EFSYS_OPT_DIAG
|
||||||
ef10_sram_test, /* eno_sram_test */
|
ef10_sram_test, /* eno_sram_test */
|
||||||
hunt_nic_register_test, /* eno_register_test */
|
ef10_nic_register_test, /* eno_register_test */
|
||||||
#endif /* EFSYS_OPT_DIAG */
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
hunt_nic_fini, /* eno_fini */
|
ef10_nic_fini, /* eno_fini */
|
||||||
hunt_nic_unprobe, /* eno_unprobe */
|
ef10_nic_unprobe, /* eno_unprobe */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_HUNTINGTON */
|
#endif /* EFSYS_OPT_HUNTINGTON */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_MEDFORD
|
||||||
|
|
||||||
|
static efx_nic_ops_t __efx_nic_medford_ops = {
|
||||||
|
ef10_nic_probe, /* eno_probe */
|
||||||
|
medford_board_cfg, /* eno_board_cfg */
|
||||||
|
ef10_nic_set_drv_limits, /* eno_set_drv_limits */
|
||||||
|
ef10_nic_reset, /* eno_reset */
|
||||||
|
ef10_nic_init, /* eno_init */
|
||||||
|
ef10_nic_get_vi_pool, /* eno_get_vi_pool */
|
||||||
|
ef10_nic_get_bar_region, /* eno_get_bar_region */
|
||||||
|
#if EFSYS_OPT_DIAG
|
||||||
|
ef10_sram_test, /* eno_sram_test */
|
||||||
|
ef10_nic_register_test, /* eno_register_test */
|
||||||
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
|
ef10_nic_fini, /* eno_fini */
|
||||||
|
ef10_nic_unprobe, /* eno_unprobe */
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* EFSYS_OPT_MEDFORD */
|
||||||
|
|
||||||
|
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
efx_nic_create(
|
efx_nic_create(
|
||||||
__in efx_family_t family,
|
__in efx_family_t family,
|
||||||
@@ -360,10 +381,29 @@ efx_nic_create(
|
|||||||
EFX_FEATURE_MAC_HEADER_FILTERS |
|
EFX_FEATURE_MAC_HEADER_FILTERS |
|
||||||
EFX_FEATURE_MCDI_DMA |
|
EFX_FEATURE_MCDI_DMA |
|
||||||
EFX_FEATURE_PIO_BUFFERS |
|
EFX_FEATURE_PIO_BUFFERS |
|
||||||
EFX_FEATURE_FW_ASSISTED_TSO;
|
EFX_FEATURE_FW_ASSISTED_TSO |
|
||||||
|
EFX_FEATURE_FW_ASSISTED_TSO_V2;
|
||||||
break;
|
break;
|
||||||
#endif /* EFSYS_OPT_HUNTINGTON */
|
#endif /* EFSYS_OPT_HUNTINGTON */
|
||||||
|
|
||||||
|
#if EFSYS_OPT_MEDFORD
|
||||||
|
case EFX_FAMILY_MEDFORD:
|
||||||
|
enp->en_enop = (efx_nic_ops_t *)&__efx_nic_medford_ops;
|
||||||
|
/*
|
||||||
|
* FW_ASSISTED_TSO ommitted as Medford only supports firmware
|
||||||
|
* assisted TSO version 2, not the v1 scheme used on Huntington.
|
||||||
|
*/
|
||||||
|
enp->en_features =
|
||||||
|
EFX_FEATURE_IPV6 |
|
||||||
|
EFX_FEATURE_LINK_EVENTS |
|
||||||
|
EFX_FEATURE_PERIODIC_MAC_STATS |
|
||||||
|
EFX_FEATURE_MCDI |
|
||||||
|
EFX_FEATURE_MAC_HEADER_FILTERS |
|
||||||
|
EFX_FEATURE_MCDI_DMA |
|
||||||
|
EFX_FEATURE_PIO_BUFFERS;
|
||||||
|
break;
|
||||||
|
#endif /* EFSYS_OPT_MEDFORD */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
rc = ENOTSUP;
|
rc = ENOTSUP;
|
||||||
goto fail2;
|
goto fail2;
|
||||||
@@ -668,8 +708,9 @@ efx_nic_reset(
|
|||||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
|
EFSYS_ASSERT(enp->en_mod_flags & EFX_MOD_PROBE);
|
||||||
/*
|
/*
|
||||||
* All modules except the MCDI, PROBE, NVRAM, VPD, MON (which we
|
* All modules except the MCDI, PROBE, NVRAM, VPD, MON, LIC
|
||||||
* do not reset here) must have been shut down or never initialized.
|
* (which we do not reset here) must have been shut down or never
|
||||||
|
* initialized.
|
||||||
*
|
*
|
||||||
* A rule of thumb here is: If the controller or MC reboots, is *any*
|
* A rule of thumb here is: If the controller or MC reboots, is *any*
|
||||||
* state lost. If it's lost and needs reapplying, then the module
|
* state lost. If it's lost and needs reapplying, then the module
|
||||||
@@ -677,7 +718,7 @@ efx_nic_reset(
|
|||||||
*/
|
*/
|
||||||
mod_flags = enp->en_mod_flags;
|
mod_flags = enp->en_mod_flags;
|
||||||
mod_flags &= ~(EFX_MOD_MCDI | EFX_MOD_PROBE | EFX_MOD_NVRAM |
|
mod_flags &= ~(EFX_MOD_MCDI | EFX_MOD_PROBE | EFX_MOD_NVRAM |
|
||||||
EFX_MOD_VPD | EFX_MOD_MON);
|
EFX_MOD_VPD | EFX_MOD_MON | EFX_MOD_LIC);
|
||||||
EFSYS_ASSERT3U(mod_flags, ==, 0);
|
EFSYS_ASSERT3U(mod_flags, ==, 0);
|
||||||
if (mod_flags != 0) {
|
if (mod_flags != 0) {
|
||||||
rc = EINVAL;
|
rc = EINVAL;
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_NVRAM
|
#if EFSYS_OPT_NVRAM
|
||||||
@@ -45,7 +42,6 @@ static efx_nvram_ops_t __efx_nvram_falcon_ops = {
|
|||||||
#if EFSYS_OPT_DIAG
|
#if EFSYS_OPT_DIAG
|
||||||
falcon_nvram_test, /* envo_test */
|
falcon_nvram_test, /* envo_test */
|
||||||
#endif /* EFSYS_OPT_DIAG */
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
falcon_nvram_size, /* envo_size */
|
|
||||||
falcon_nvram_get_version, /* envo_get_version */
|
falcon_nvram_get_version, /* envo_get_version */
|
||||||
falcon_nvram_rw_start, /* envo_rw_start */
|
falcon_nvram_rw_start, /* envo_rw_start */
|
||||||
falcon_nvram_read_chunk, /* envo_read_chunk */
|
falcon_nvram_read_chunk, /* envo_read_chunk */
|
||||||
@@ -53,6 +49,8 @@ static efx_nvram_ops_t __efx_nvram_falcon_ops = {
|
|||||||
falcon_nvram_write_chunk, /* envo_write_chunk */
|
falcon_nvram_write_chunk, /* envo_write_chunk */
|
||||||
falcon_nvram_rw_finish, /* envo_rw_finish */
|
falcon_nvram_rw_finish, /* envo_rw_finish */
|
||||||
falcon_nvram_set_version, /* envo_set_version */
|
falcon_nvram_set_version, /* envo_set_version */
|
||||||
|
falcon_nvram_type_to_partn, /* envo_type_to_partn */
|
||||||
|
falcon_nvram_partn_size, /* envo_partn_size */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_FALCON */
|
#endif /* EFSYS_OPT_FALCON */
|
||||||
@@ -63,7 +61,6 @@ static efx_nvram_ops_t __efx_nvram_siena_ops = {
|
|||||||
#if EFSYS_OPT_DIAG
|
#if EFSYS_OPT_DIAG
|
||||||
siena_nvram_test, /* envo_test */
|
siena_nvram_test, /* envo_test */
|
||||||
#endif /* EFSYS_OPT_DIAG */
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
siena_nvram_size, /* envo_size */
|
|
||||||
siena_nvram_get_version, /* envo_get_version */
|
siena_nvram_get_version, /* envo_get_version */
|
||||||
siena_nvram_rw_start, /* envo_rw_start */
|
siena_nvram_rw_start, /* envo_rw_start */
|
||||||
siena_nvram_read_chunk, /* envo_read_chunk */
|
siena_nvram_read_chunk, /* envo_read_chunk */
|
||||||
@@ -71,6 +68,8 @@ static efx_nvram_ops_t __efx_nvram_siena_ops = {
|
|||||||
siena_nvram_write_chunk, /* envo_write_chunk */
|
siena_nvram_write_chunk, /* envo_write_chunk */
|
||||||
siena_nvram_rw_finish, /* envo_rw_finish */
|
siena_nvram_rw_finish, /* envo_rw_finish */
|
||||||
siena_nvram_set_version, /* envo_set_version */
|
siena_nvram_set_version, /* envo_set_version */
|
||||||
|
siena_nvram_type_to_partn, /* envo_type_to_partn */
|
||||||
|
siena_nvram_partn_size, /* envo_partn_size */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_SIENA */
|
#endif /* EFSYS_OPT_SIENA */
|
||||||
@@ -81,7 +80,6 @@ static efx_nvram_ops_t __efx_nvram_ef10_ops = {
|
|||||||
#if EFSYS_OPT_DIAG
|
#if EFSYS_OPT_DIAG
|
||||||
ef10_nvram_test, /* envo_test */
|
ef10_nvram_test, /* envo_test */
|
||||||
#endif /* EFSYS_OPT_DIAG */
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
ef10_nvram_size, /* envo_size */
|
|
||||||
ef10_nvram_get_version, /* envo_get_version */
|
ef10_nvram_get_version, /* envo_get_version */
|
||||||
ef10_nvram_rw_start, /* envo_rw_start */
|
ef10_nvram_rw_start, /* envo_rw_start */
|
||||||
ef10_nvram_read_chunk, /* envo_read_chunk */
|
ef10_nvram_read_chunk, /* envo_read_chunk */
|
||||||
@@ -89,6 +87,8 @@ static efx_nvram_ops_t __efx_nvram_ef10_ops = {
|
|||||||
ef10_nvram_write_chunk, /* envo_write_chunk */
|
ef10_nvram_write_chunk, /* envo_write_chunk */
|
||||||
ef10_nvram_rw_finish, /* envo_rw_finish */
|
ef10_nvram_rw_finish, /* envo_rw_finish */
|
||||||
ef10_nvram_set_version, /* envo_set_version */
|
ef10_nvram_set_version, /* envo_set_version */
|
||||||
|
ef10_nvram_type_to_partn, /* envo_type_to_partn */
|
||||||
|
ef10_nvram_partn_size, /* envo_partn_size */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */
|
#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */
|
||||||
@@ -178,6 +178,7 @@ efx_nvram_size(
|
|||||||
__out size_t *sizep)
|
__out size_t *sizep)
|
||||||
{
|
{
|
||||||
efx_nvram_ops_t *envop = enp->en_envop;
|
efx_nvram_ops_t *envop = enp->en_envop;
|
||||||
|
uint32_t partn;
|
||||||
efx_rc_t rc;
|
efx_rc_t rc;
|
||||||
|
|
||||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
||||||
@@ -185,13 +186,19 @@ efx_nvram_size(
|
|||||||
|
|
||||||
EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
|
EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
|
||||||
|
|
||||||
if ((rc = envop->envo_size(enp, type, sizep)) != 0)
|
if ((rc = envop->envo_type_to_partn(enp, type, &partn)) != 0)
|
||||||
goto fail1;
|
goto fail1;
|
||||||
|
|
||||||
|
if ((rc = envop->envo_partn_size(enp, partn, sizep)) != 0)
|
||||||
|
goto fail2;
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
|
fail2:
|
||||||
|
EFSYS_PROBE(fail2);
|
||||||
fail1:
|
fail1:
|
||||||
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
||||||
|
*sizep = 0;
|
||||||
|
|
||||||
return (rc);
|
return (rc);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
#if EFSYS_OPT_FALCON
|
#if EFSYS_OPT_FALCON
|
||||||
#include "falcon_nvram.h"
|
#include "falcon_nvram.h"
|
||||||
|
|||||||
@@ -31,9 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
|
|||||||
@@ -429,6 +429,48 @@ extern "C" {
|
|||||||
#define ESF_DZ_TX_TSO_TCP_SEQNO_WIDTH 32
|
#define ESF_DZ_TX_TSO_TCP_SEQNO_WIDTH 32
|
||||||
|
|
||||||
|
|
||||||
|
/* TX_TSO_FATSO2A_DESC */
|
||||||
|
#define ESF_DZ_TX_DESC_IS_OPT_LBN 63
|
||||||
|
#define ESF_DZ_TX_DESC_IS_OPT_WIDTH 1
|
||||||
|
#define ESF_DZ_TX_OPTION_TYPE_LBN 60
|
||||||
|
#define ESF_DZ_TX_OPTION_TYPE_WIDTH 3
|
||||||
|
#define ESE_DZ_TX_OPTION_DESC_TSO 7
|
||||||
|
#define ESE_DZ_TX_OPTION_DESC_VLAN 6
|
||||||
|
#define ESE_DZ_TX_OPTION_DESC_CRC_CSUM 0
|
||||||
|
#define ESF_DZ_TX_TSO_OPTION_TYPE_LBN 56
|
||||||
|
#define ESF_DZ_TX_TSO_OPTION_TYPE_WIDTH 4
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_FATSO2B 3
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_FATSO2A 2
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_ENCAP 1
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_NORMAL 0
|
||||||
|
#define ESF_DZ_TX_TSO_IP_ID_LBN 32
|
||||||
|
#define ESF_DZ_TX_TSO_IP_ID_WIDTH 16
|
||||||
|
#define ESF_DZ_TX_TSO_TCP_SEQNO_LBN 0
|
||||||
|
#define ESF_DZ_TX_TSO_TCP_SEQNO_WIDTH 32
|
||||||
|
|
||||||
|
|
||||||
|
/* TX_TSO_FATSO2B_DESC */
|
||||||
|
#define ESF_DZ_TX_DESC_IS_OPT_LBN 63
|
||||||
|
#define ESF_DZ_TX_DESC_IS_OPT_WIDTH 1
|
||||||
|
#define ESF_DZ_TX_OPTION_TYPE_LBN 60
|
||||||
|
#define ESF_DZ_TX_OPTION_TYPE_WIDTH 3
|
||||||
|
#define ESE_DZ_TX_OPTION_DESC_TSO 7
|
||||||
|
#define ESE_DZ_TX_OPTION_DESC_VLAN 6
|
||||||
|
#define ESE_DZ_TX_OPTION_DESC_CRC_CSUM 0
|
||||||
|
#define ESF_DZ_TX_TSO_OPTION_TYPE_LBN 56
|
||||||
|
#define ESF_DZ_TX_TSO_OPTION_TYPE_WIDTH 4
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_FATSO2B 3
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_FATSO2A 2
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_ENCAP 1
|
||||||
|
#define ESE_DZ_TX_TSO_OPTION_DESC_NORMAL 0
|
||||||
|
#define ESF_DZ_TX_TSO_OUTER_IP_ID_LBN 16
|
||||||
|
#define ESF_DZ_TX_TSO_OUTER_IP_ID_WIDTH 16
|
||||||
|
#define ESF_DZ_TX_TSO_TCP_MSS_LBN 32
|
||||||
|
#define ESF_DZ_TX_TSO_TCP_MSS_WIDTH 16
|
||||||
|
#define ESF_DZ_TX_TSO_INNER_PE_CSUM_LBN 0
|
||||||
|
#define ESF_DZ_TX_TSO_INNER_PE_CSUM_WIDTH 16
|
||||||
|
|
||||||
|
|
||||||
/* ES_TX_VLAN_DESC */
|
/* ES_TX_VLAN_DESC */
|
||||||
#define ESF_DZ_TX_DESC_IS_OPT_LBN 63
|
#define ESF_DZ_TX_DESC_IS_OPT_LBN 63
|
||||||
#define ESF_DZ_TX_DESC_IS_OPT_WIDTH 1
|
#define ESF_DZ_TX_DESC_IS_OPT_WIDTH 1
|
||||||
|
|||||||
+78
-191
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -48,14 +45,6 @@ static void
|
|||||||
falconsiena_rx_fini(
|
falconsiena_rx_fini(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
static __checkReturn efx_rc_t
|
|
||||||
falconsiena_rx_hdr_split_enable(
|
|
||||||
__in efx_nic_t *enp,
|
|
||||||
__in unsigned int hdr_buf_size,
|
|
||||||
__in unsigned int pld_buf_size);
|
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
static __checkReturn efx_rc_t
|
static __checkReturn efx_rc_t
|
||||||
falconsiena_rx_scatter_enable(
|
falconsiena_rx_scatter_enable(
|
||||||
@@ -83,8 +72,20 @@ falconsiena_rx_scale_tbl_set(
|
|||||||
__in_ecount(n) unsigned int *table,
|
__in_ecount(n) unsigned int *table,
|
||||||
__in size_t n);
|
__in size_t n);
|
||||||
|
|
||||||
|
static __checkReturn uint32_t
|
||||||
|
falconsiena_rx_prefix_hash(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in efx_rx_hash_alg_t func,
|
||||||
|
__in uint8_t *buffer);
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_RX_SCALE */
|
#endif /* EFSYS_OPT_RX_SCALE */
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
falconsiena_rx_prefix_pktlen(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint8_t *buffer,
|
||||||
|
__out uint16_t *lengthp);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
falconsiena_rx_qpost(
|
falconsiena_rx_qpost(
|
||||||
__in efx_rxq_t *erp,
|
__in efx_rxq_t *erp,
|
||||||
@@ -131,9 +132,6 @@ falconsiena_rx_qdestroy(
|
|||||||
static efx_rx_ops_t __efx_rx_falcon_ops = {
|
static efx_rx_ops_t __efx_rx_falcon_ops = {
|
||||||
falconsiena_rx_init, /* erxo_init */
|
falconsiena_rx_init, /* erxo_init */
|
||||||
falconsiena_rx_fini, /* erxo_fini */
|
falconsiena_rx_fini, /* erxo_fini */
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
falconsiena_rx_hdr_split_enable, /* erxo_hdr_split_enable */
|
|
||||||
#endif
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
falconsiena_rx_scatter_enable, /* erxo_scatter_enable */
|
falconsiena_rx_scatter_enable, /* erxo_scatter_enable */
|
||||||
#endif
|
#endif
|
||||||
@@ -141,7 +139,9 @@ static efx_rx_ops_t __efx_rx_falcon_ops = {
|
|||||||
falconsiena_rx_scale_mode_set, /* erxo_scale_mode_set */
|
falconsiena_rx_scale_mode_set, /* erxo_scale_mode_set */
|
||||||
falconsiena_rx_scale_key_set, /* erxo_scale_key_set */
|
falconsiena_rx_scale_key_set, /* erxo_scale_key_set */
|
||||||
falconsiena_rx_scale_tbl_set, /* erxo_scale_tbl_set */
|
falconsiena_rx_scale_tbl_set, /* erxo_scale_tbl_set */
|
||||||
|
falconsiena_rx_prefix_hash, /* erxo_prefix_hash */
|
||||||
#endif
|
#endif
|
||||||
|
falconsiena_rx_prefix_pktlen, /* erxo_prefix_pktlen */
|
||||||
falconsiena_rx_qpost, /* erxo_qpost */
|
falconsiena_rx_qpost, /* erxo_qpost */
|
||||||
falconsiena_rx_qpush, /* erxo_qpush */
|
falconsiena_rx_qpush, /* erxo_qpush */
|
||||||
falconsiena_rx_qflush, /* erxo_qflush */
|
falconsiena_rx_qflush, /* erxo_qflush */
|
||||||
@@ -155,9 +155,6 @@ static efx_rx_ops_t __efx_rx_falcon_ops = {
|
|||||||
static efx_rx_ops_t __efx_rx_siena_ops = {
|
static efx_rx_ops_t __efx_rx_siena_ops = {
|
||||||
falconsiena_rx_init, /* erxo_init */
|
falconsiena_rx_init, /* erxo_init */
|
||||||
falconsiena_rx_fini, /* erxo_fini */
|
falconsiena_rx_fini, /* erxo_fini */
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
falconsiena_rx_hdr_split_enable, /* erxo_hdr_split_enable */
|
|
||||||
#endif
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
falconsiena_rx_scatter_enable, /* erxo_scatter_enable */
|
falconsiena_rx_scatter_enable, /* erxo_scatter_enable */
|
||||||
#endif
|
#endif
|
||||||
@@ -165,7 +162,9 @@ static efx_rx_ops_t __efx_rx_siena_ops = {
|
|||||||
falconsiena_rx_scale_mode_set, /* erxo_scale_mode_set */
|
falconsiena_rx_scale_mode_set, /* erxo_scale_mode_set */
|
||||||
falconsiena_rx_scale_key_set, /* erxo_scale_key_set */
|
falconsiena_rx_scale_key_set, /* erxo_scale_key_set */
|
||||||
falconsiena_rx_scale_tbl_set, /* erxo_scale_tbl_set */
|
falconsiena_rx_scale_tbl_set, /* erxo_scale_tbl_set */
|
||||||
|
falconsiena_rx_prefix_hash, /* erxo_prefix_hash */
|
||||||
#endif
|
#endif
|
||||||
|
falconsiena_rx_prefix_pktlen, /* erxo_prefix_pktlen */
|
||||||
falconsiena_rx_qpost, /* erxo_qpost */
|
falconsiena_rx_qpost, /* erxo_qpost */
|
||||||
falconsiena_rx_qpush, /* erxo_qpush */
|
falconsiena_rx_qpush, /* erxo_qpush */
|
||||||
falconsiena_rx_qflush, /* erxo_qflush */
|
falconsiena_rx_qflush, /* erxo_qflush */
|
||||||
@@ -179,9 +178,6 @@ static efx_rx_ops_t __efx_rx_siena_ops = {
|
|||||||
static efx_rx_ops_t __efx_rx_ef10_ops = {
|
static efx_rx_ops_t __efx_rx_ef10_ops = {
|
||||||
ef10_rx_init, /* erxo_init */
|
ef10_rx_init, /* erxo_init */
|
||||||
ef10_rx_fini, /* erxo_fini */
|
ef10_rx_fini, /* erxo_fini */
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
ef10_rx_hdr_split_enable, /* erxo_hdr_split_enable */
|
|
||||||
#endif
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
ef10_rx_scatter_enable, /* erxo_scatter_enable */
|
ef10_rx_scatter_enable, /* erxo_scatter_enable */
|
||||||
#endif
|
#endif
|
||||||
@@ -189,7 +185,9 @@ static efx_rx_ops_t __efx_rx_ef10_ops = {
|
|||||||
ef10_rx_scale_mode_set, /* erxo_scale_mode_set */
|
ef10_rx_scale_mode_set, /* erxo_scale_mode_set */
|
||||||
ef10_rx_scale_key_set, /* erxo_scale_key_set */
|
ef10_rx_scale_key_set, /* erxo_scale_key_set */
|
||||||
ef10_rx_scale_tbl_set, /* erxo_scale_tbl_set */
|
ef10_rx_scale_tbl_set, /* erxo_scale_tbl_set */
|
||||||
|
ef10_rx_prefix_hash, /* erxo_prefix_hash */
|
||||||
#endif
|
#endif
|
||||||
|
ef10_rx_prefix_pktlen, /* erxo_prefix_pktlen */
|
||||||
ef10_rx_qpost, /* erxo_qpost */
|
ef10_rx_qpost, /* erxo_qpost */
|
||||||
ef10_rx_qpush, /* erxo_qpush */
|
ef10_rx_qpush, /* erxo_qpush */
|
||||||
ef10_rx_qflush, /* erxo_qflush */
|
ef10_rx_qflush, /* erxo_qflush */
|
||||||
@@ -289,32 +287,6 @@ efx_rx_fini(
|
|||||||
enp->en_mod_flags &= ~EFX_MOD_RX;
|
enp->en_mod_flags &= ~EFX_MOD_RX;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
__checkReturn efx_rc_t
|
|
||||||
efx_rx_hdr_split_enable(
|
|
||||||
__in efx_nic_t *enp,
|
|
||||||
__in unsigned int hdr_buf_size,
|
|
||||||
__in unsigned int pld_buf_size)
|
|
||||||
{
|
|
||||||
efx_rx_ops_t *erxop = enp->en_erxop;
|
|
||||||
efx_rc_t rc;
|
|
||||||
|
|
||||||
EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
|
|
||||||
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
|
|
||||||
EFSYS_ASSERT3U(enp->en_family, >=, EFX_FAMILY_SIENA);
|
|
||||||
|
|
||||||
if ((rc = erxop->erxo_hdr_split_enable(enp, hdr_buf_size,
|
|
||||||
pld_buf_size)) != 0)
|
|
||||||
goto fail1;
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
fail1:
|
|
||||||
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
|
||||||
return (rc);
|
|
||||||
}
|
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
efx_rx_scatter_enable(
|
efx_rx_scatter_enable(
|
||||||
@@ -596,92 +568,29 @@ efx_rx_qdestroy(
|
|||||||
erxop->erxo_qdestroy(erp);
|
erxop->erxo_qdestroy(erp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Psuedo-header info for Siena/Falcon.
|
|
||||||
*
|
|
||||||
* The psuedo-header is a byte array of one of the forms:
|
|
||||||
*
|
|
||||||
* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
|
||||||
* XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.TT.TT.TT.TT
|
|
||||||
* XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.LL.LL
|
|
||||||
*
|
|
||||||
* where:
|
|
||||||
*
|
|
||||||
* TT.TT.TT.TT is a 32-bit Toeplitz hash
|
|
||||||
* LL.LL is a 16-bit LFSR hash
|
|
||||||
*
|
|
||||||
* Hash values are in network (big-endian) byte order.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* On EF10 the pseudo-header is laid out as:
|
|
||||||
* (See also SF-109306-TC section 9)
|
|
||||||
*
|
|
||||||
* Toeplitz hash (32 bits, little-endian)
|
|
||||||
* Out-of-band outer VLAN tag
|
|
||||||
* (16 bits, big-endian, 0 if the packet did not have an outer VLAN tag)
|
|
||||||
* Out-of-band inner VLAN tag
|
|
||||||
* (16 bits, big-endian, 0 if the packet did not have an inner VLAN tag)
|
|
||||||
* Packet length (16 bits, little-endian, may be 0)
|
|
||||||
* MAC timestamp (32 bits, little-endian, may be 0)
|
|
||||||
* VLAN tag
|
|
||||||
* (16 bits, big-endian, 0 if the packet did not have an outer VLAN tag)
|
|
||||||
* VLAN tag
|
|
||||||
* (16 bits, big-endian, 0 if the packet did not have an inner VLAN tag)
|
|
||||||
*/
|
|
||||||
|
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
efx_psuedo_hdr_pkt_length_get(
|
efx_psuedo_hdr_pkt_length_get(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__in uint8_t *buffer,
|
__in uint8_t *buffer,
|
||||||
__out uint16_t *pkt_lengthp)
|
__out uint16_t *lengthp)
|
||||||
{
|
{
|
||||||
if (enp->en_family != EFX_FAMILY_HUNTINGTON &&
|
efx_rx_ops_t *erxop = enp->en_erxop;
|
||||||
enp->en_family != EFX_FAMILY_MEDFORD) {
|
|
||||||
EFSYS_ASSERT(0);
|
|
||||||
return (ENOTSUP);
|
|
||||||
}
|
|
||||||
|
|
||||||
*pkt_lengthp = buffer[8] | (buffer[9] << 8);
|
return (erxop->erxo_prefix_pktlen(enp, buffer, lengthp));
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCALE
|
#if EFSYS_OPT_RX_SCALE
|
||||||
|
__checkReturn uint32_t
|
||||||
uint32_t
|
|
||||||
efx_psuedo_hdr_hash_get(
|
efx_psuedo_hdr_hash_get(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__in efx_rx_hash_alg_t func,
|
__in efx_rx_hash_alg_t func,
|
||||||
__in uint8_t *buffer)
|
__in uint8_t *buffer)
|
||||||
{
|
{
|
||||||
if (func == EFX_RX_HASHALG_TOEPLITZ) {
|
efx_rx_ops_t *erxop = enp->en_erxop;
|
||||||
switch (enp->en_family) {
|
|
||||||
case EFX_FAMILY_FALCON:
|
|
||||||
case EFX_FAMILY_SIENA:
|
|
||||||
return ((buffer[12] << 24) |
|
|
||||||
(buffer[13] << 16) |
|
|
||||||
(buffer[14] << 8) |
|
|
||||||
buffer[15]);
|
|
||||||
case EFX_FAMILY_HUNTINGTON:
|
|
||||||
case EFX_FAMILY_MEDFORD:
|
|
||||||
return (buffer[0] |
|
|
||||||
(buffer[1] << 8) |
|
|
||||||
(buffer[2] << 16) |
|
|
||||||
(buffer[3] << 24));
|
|
||||||
default:
|
|
||||||
EFSYS_ASSERT(0);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
} else if (func == EFX_RX_HASHALG_LFSR) {
|
|
||||||
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_FALCON ||
|
|
||||||
enp->en_family == EFX_FAMILY_SIENA);
|
|
||||||
return ((buffer[14] << 8) | buffer[15]);
|
|
||||||
} else {
|
|
||||||
EFSYS_ASSERT(0);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(enp->en_hash_support, ==, EFX_RX_HASH_AVAILABLE);
|
||||||
|
return (erxop->erxo_prefix_hash(enp, func, buffer));
|
||||||
|
}
|
||||||
#endif /* EFSYS_OPT_RX_SCALE */
|
#endif /* EFSYS_OPT_RX_SCALE */
|
||||||
|
|
||||||
#if EFSYS_OPT_FALCON || EFSYS_OPT_SIENA
|
#if EFSYS_OPT_FALCON || EFSYS_OPT_SIENA
|
||||||
@@ -722,60 +631,6 @@ falconsiena_rx_init(
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
static __checkReturn efx_rc_t
|
|
||||||
falconsiena_rx_hdr_split_enable(
|
|
||||||
__in efx_nic_t *enp,
|
|
||||||
__in unsigned int hdr_buf_size,
|
|
||||||
__in unsigned int pld_buf_size)
|
|
||||||
{
|
|
||||||
unsigned int nhdr32;
|
|
||||||
unsigned int npld32;
|
|
||||||
efx_oword_t oword;
|
|
||||||
efx_rc_t rc;
|
|
||||||
|
|
||||||
nhdr32 = hdr_buf_size / 32;
|
|
||||||
if ((nhdr32 == 0) ||
|
|
||||||
(nhdr32 >= (1 << FRF_CZ_RX_HDR_SPLIT_HDR_BUF_SIZE_WIDTH)) ||
|
|
||||||
((hdr_buf_size % 32) != 0)) {
|
|
||||||
rc = EINVAL;
|
|
||||||
goto fail1;
|
|
||||||
}
|
|
||||||
|
|
||||||
npld32 = pld_buf_size / 32;
|
|
||||||
if ((npld32 == 0) ||
|
|
||||||
(npld32 >= (1 << FRF_CZ_RX_HDR_SPLIT_PLD_BUF_SIZE_WIDTH)) ||
|
|
||||||
((pld_buf_size % 32) != 0)) {
|
|
||||||
rc = EINVAL;
|
|
||||||
goto fail2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (enp->en_rx_qcount > 0) {
|
|
||||||
rc = EBUSY;
|
|
||||||
goto fail3;
|
|
||||||
}
|
|
||||||
|
|
||||||
EFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);
|
|
||||||
|
|
||||||
EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_HDR_SPLIT_EN, 1);
|
|
||||||
EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_HDR_SPLIT_HDR_BUF_SIZE, nhdr32);
|
|
||||||
EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_HDR_SPLIT_PLD_BUF_SIZE, npld32);
|
|
||||||
|
|
||||||
EFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
fail3:
|
|
||||||
EFSYS_PROBE(fail3);
|
|
||||||
fail2:
|
|
||||||
EFSYS_PROBE(fail2);
|
|
||||||
fail1:
|
|
||||||
EFSYS_PROBE1(fail1, efx_rc_t, rc);
|
|
||||||
|
|
||||||
return (rc);
|
|
||||||
}
|
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
static __checkReturn efx_rc_t
|
static __checkReturn efx_rc_t
|
||||||
falconsiena_rx_scatter_enable(
|
falconsiena_rx_scatter_enable(
|
||||||
@@ -1123,6 +978,58 @@ falconsiena_rx_scale_tbl_set(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Falcon/Siena psuedo-header
|
||||||
|
* --------------------------
|
||||||
|
*
|
||||||
|
* Receive packets are prefixed by an optional 16 byte pseudo-header.
|
||||||
|
* The psuedo-header is a byte array of one of the forms:
|
||||||
|
*
|
||||||
|
* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||||
|
* xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.TT.TT.TT.TT
|
||||||
|
* xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.xx.LL.LL
|
||||||
|
*
|
||||||
|
* where:
|
||||||
|
* TT.TT.TT.TT Toeplitz hash (32-bit big-endian)
|
||||||
|
* LL.LL LFSR hash (16-bit big-endian)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if EFSYS_OPT_RX_SCALE
|
||||||
|
static __checkReturn uint32_t
|
||||||
|
falconsiena_rx_prefix_hash(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in efx_rx_hash_alg_t func,
|
||||||
|
__in uint8_t *buffer)
|
||||||
|
{
|
||||||
|
switch (func) {
|
||||||
|
case EFX_RX_HASHALG_TOEPLITZ:
|
||||||
|
return ((buffer[12] << 24) |
|
||||||
|
(buffer[13] << 16) |
|
||||||
|
(buffer[14] << 8) |
|
||||||
|
buffer[15]);
|
||||||
|
|
||||||
|
case EFX_RX_HASHALG_LFSR:
|
||||||
|
return ((buffer[14] << 8) | buffer[15]);
|
||||||
|
|
||||||
|
default:
|
||||||
|
EFSYS_ASSERT(0);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* EFSYS_OPT_RX_SCALE */
|
||||||
|
|
||||||
|
static __checkReturn efx_rc_t
|
||||||
|
falconsiena_rx_prefix_pktlen(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint8_t *buffer,
|
||||||
|
__out uint16_t *lengthp)
|
||||||
|
{
|
||||||
|
/* Not supported by Falcon/Siena hardware */
|
||||||
|
EFSYS_ASSERT(0);
|
||||||
|
return (ENOTSUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
falconsiena_rx_qpost(
|
falconsiena_rx_qpost(
|
||||||
__in efx_rxq_t *erp,
|
__in efx_rxq_t *erp,
|
||||||
@@ -1279,26 +1186,6 @@ falconsiena_rx_qcreate(
|
|||||||
jumbo = B_FALSE;
|
jumbo = B_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
case EFX_RXQ_TYPE_SPLIT_HEADER:
|
|
||||||
if ((enp->en_family < EFX_FAMILY_SIENA) || ((index & 1) != 0)) {
|
|
||||||
rc = EINVAL;
|
|
||||||
goto fail4;
|
|
||||||
}
|
|
||||||
split = B_TRUE;
|
|
||||||
jumbo = B_TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFX_RXQ_TYPE_SPLIT_PAYLOAD:
|
|
||||||
if ((enp->en_family < EFX_FAMILY_SIENA) || ((index & 1) == 0)) {
|
|
||||||
rc = EINVAL;
|
|
||||||
goto fail4;
|
|
||||||
}
|
|
||||||
split = B_FALSE;
|
|
||||||
jumbo = B_TRUE;
|
|
||||||
break;
|
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
case EFX_RXQ_TYPE_SCATTER:
|
case EFX_RXQ_TYPE_SCATTER:
|
||||||
if (enp->en_family < EFX_FAMILY_SIENA) {
|
if (enp->en_family < EFX_FAMILY_SIENA) {
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_QSTATS
|
#if EFSYS_OPT_QSTATS
|
||||||
@@ -145,6 +142,7 @@ static efx_tx_ops_t __efx_tx_falcon_ops = {
|
|||||||
falconsiena_tx_qdesc_post, /* etxo_qdesc_post */
|
falconsiena_tx_qdesc_post, /* etxo_qdesc_post */
|
||||||
falconsiena_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
falconsiena_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
||||||
NULL, /* etxo_qdesc_tso_create */
|
NULL, /* etxo_qdesc_tso_create */
|
||||||
|
NULL, /* etxo_qdesc_tso2_create */
|
||||||
NULL, /* etxo_qdesc_vlantci_create */
|
NULL, /* etxo_qdesc_vlantci_create */
|
||||||
#if EFSYS_OPT_QSTATS
|
#if EFSYS_OPT_QSTATS
|
||||||
falconsiena_tx_qstats_update, /* etxo_qstats_update */
|
falconsiena_tx_qstats_update, /* etxo_qstats_update */
|
||||||
@@ -170,6 +168,7 @@ static efx_tx_ops_t __efx_tx_siena_ops = {
|
|||||||
falconsiena_tx_qdesc_post, /* etxo_qdesc_post */
|
falconsiena_tx_qdesc_post, /* etxo_qdesc_post */
|
||||||
falconsiena_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
falconsiena_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
||||||
NULL, /* etxo_qdesc_tso_create */
|
NULL, /* etxo_qdesc_tso_create */
|
||||||
|
NULL, /* etxo_qdesc_tso2_create */
|
||||||
NULL, /* etxo_qdesc_vlantci_create */
|
NULL, /* etxo_qdesc_vlantci_create */
|
||||||
#if EFSYS_OPT_QSTATS
|
#if EFSYS_OPT_QSTATS
|
||||||
falconsiena_tx_qstats_update, /* etxo_qstats_update */
|
falconsiena_tx_qstats_update, /* etxo_qstats_update */
|
||||||
@@ -195,6 +194,7 @@ static efx_tx_ops_t __efx_tx_hunt_ops = {
|
|||||||
ef10_tx_qdesc_post, /* etxo_qdesc_post */
|
ef10_tx_qdesc_post, /* etxo_qdesc_post */
|
||||||
ef10_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
ef10_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
||||||
hunt_tx_qdesc_tso_create, /* etxo_qdesc_tso_create */
|
hunt_tx_qdesc_tso_create, /* etxo_qdesc_tso_create */
|
||||||
|
ef10_tx_qdesc_tso2_create, /* etxo_qdesc_tso2_create */
|
||||||
ef10_tx_qdesc_vlantci_create, /* etxo_qdesc_vlantci_create */
|
ef10_tx_qdesc_vlantci_create, /* etxo_qdesc_vlantci_create */
|
||||||
#if EFSYS_OPT_QSTATS
|
#if EFSYS_OPT_QSTATS
|
||||||
ef10_tx_qstats_update, /* etxo_qstats_update */
|
ef10_tx_qstats_update, /* etxo_qstats_update */
|
||||||
@@ -220,6 +220,7 @@ static efx_tx_ops_t __efx_tx_medford_ops = {
|
|||||||
ef10_tx_qdesc_post, /* etxo_qdesc_post */
|
ef10_tx_qdesc_post, /* etxo_qdesc_post */
|
||||||
ef10_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
ef10_tx_qdesc_dma_create, /* etxo_qdesc_dma_create */
|
||||||
NULL, /* etxo_qdesc_tso_create */
|
NULL, /* etxo_qdesc_tso_create */
|
||||||
|
ef10_tx_qdesc_tso2_create, /* etxo_qdesc_tso2_create */
|
||||||
ef10_tx_qdesc_vlantci_create, /* etxo_qdesc_vlantci_create */
|
ef10_tx_qdesc_vlantci_create, /* etxo_qdesc_vlantci_create */
|
||||||
#if EFSYS_OPT_QSTATS
|
#if EFSYS_OPT_QSTATS
|
||||||
ef10_tx_qstats_update, /* etxo_qstats_update */
|
ef10_tx_qstats_update, /* etxo_qstats_update */
|
||||||
@@ -643,6 +644,24 @@ efx_tx_qdesc_tso_create(
|
|||||||
etxop->etxo_qdesc_tso_create(etp, ipv4_id, tcp_seq, tcp_flags, edp);
|
etxop->etxo_qdesc_tso_create(etp, ipv4_id, tcp_seq, tcp_flags, edp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
efx_tx_qdesc_tso2_create(
|
||||||
|
__in efx_txq_t *etp,
|
||||||
|
__in uint16_t ipv4_id,
|
||||||
|
__in uint32_t tcp_seq,
|
||||||
|
__in uint16_t mss,
|
||||||
|
__out_ecount(count) efx_desc_t *edp,
|
||||||
|
__in int count)
|
||||||
|
{
|
||||||
|
efx_nic_t *enp = etp->et_enp;
|
||||||
|
efx_tx_ops_t *etxop = enp->en_etxop;
|
||||||
|
|
||||||
|
EFSYS_ASSERT3U(etp->et_magic, ==, EFX_TXQ_MAGIC);
|
||||||
|
EFSYS_ASSERT(etxop->etxo_qdesc_tso2_create != NULL);
|
||||||
|
|
||||||
|
etxop->etxo_qdesc_tso2_create(etp, ipv4_id, tcp_seq, mss, edp, count);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
efx_tx_qdesc_vlantci_create(
|
efx_tx_qdesc_vlantci_create(
|
||||||
__in efx_txq_t *etp,
|
__in efx_txq_t *etp,
|
||||||
|
|||||||
@@ -536,7 +536,7 @@ extern int fix_lint;
|
|||||||
(_oword).eo_u32[3]) == ~((uint32_t)0))
|
(_oword).eo_u32[3]) == ~((uint32_t)0))
|
||||||
|
|
||||||
#define EFX_QWORD_IS_SET64(_qword) \
|
#define EFX_QWORD_IS_SET64(_qword) \
|
||||||
(((_qword).eq_u64[0]) == ~((uint32_t)0))
|
(((_qword).eq_u64[0]) == ~((uint64_t)0))
|
||||||
|
|
||||||
#define EFX_QWORD_IS_SET32(_qword) \
|
#define EFX_QWORD_IS_SET32(_qword) \
|
||||||
(((_qword).eq_u32[0] & \
|
(((_qword).eq_u32[0] & \
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_VPD
|
#if EFSYS_OPT_VPD
|
||||||
@@ -672,7 +669,7 @@ efx_vpd_hunk_next(
|
|||||||
__in size_t size,
|
__in size_t size,
|
||||||
__out efx_vpd_tag_t *tagp,
|
__out efx_vpd_tag_t *tagp,
|
||||||
__out efx_vpd_keyword_t *keywordp,
|
__out efx_vpd_keyword_t *keywordp,
|
||||||
__out_bcount_opt(*paylenp) unsigned int *payloadp,
|
__out_opt unsigned int *payloadp,
|
||||||
__out_opt uint8_t *paylenp,
|
__out_opt uint8_t *paylenp,
|
||||||
__inout unsigned int *contp)
|
__inout unsigned int *contp)
|
||||||
{
|
{
|
||||||
@@ -692,12 +689,18 @@ efx_vpd_hunk_next(
|
|||||||
if ((rc = efx_vpd_next_tag(data, size, &offset,
|
if ((rc = efx_vpd_next_tag(data, size, &offset,
|
||||||
&tag, &taglen)) != 0)
|
&tag, &taglen)) != 0)
|
||||||
goto fail1;
|
goto fail1;
|
||||||
if (tag == EFX_VPD_END)
|
|
||||||
|
if (tag == EFX_VPD_END) {
|
||||||
|
keyword = 0;
|
||||||
|
paylen = 0;
|
||||||
|
index = 0;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (tag == EFX_VPD_ID) {
|
if (tag == EFX_VPD_ID) {
|
||||||
if (index == *contp) {
|
if (index++ == *contp) {
|
||||||
EFSYS_ASSERT3U(taglen, <, 0x100);
|
EFSYS_ASSERT3U(taglen, <, 0x100);
|
||||||
|
keyword = 0;
|
||||||
paylen = (uint8_t)MIN(taglen, 0xff);
|
paylen = (uint8_t)MIN(taglen, 0xff);
|
||||||
|
|
||||||
goto done;
|
goto done;
|
||||||
@@ -708,7 +711,7 @@ efx_vpd_hunk_next(
|
|||||||
taglen, pos, &keyword, &keylen)) != 0)
|
taglen, pos, &keyword, &keylen)) != 0)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
|
|
||||||
if (index == *contp) {
|
if (index++ == *contp) {
|
||||||
offset += pos + 3;
|
offset += pos + 3;
|
||||||
paylen = keylen;
|
paylen = keylen;
|
||||||
|
|
||||||
@@ -720,9 +723,6 @@ efx_vpd_hunk_next(
|
|||||||
offset += taglen;
|
offset += taglen;
|
||||||
}
|
}
|
||||||
|
|
||||||
*contp = 0;
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
*tagp = tag;
|
*tagp = tag;
|
||||||
*keywordp = keyword;
|
*keywordp = keyword;
|
||||||
@@ -731,7 +731,7 @@ efx_vpd_hunk_next(
|
|||||||
if (paylenp != NULL)
|
if (paylenp != NULL)
|
||||||
*paylenp = paylen;
|
*paylenp = paylen;
|
||||||
|
|
||||||
++(*contp);
|
*contp = index;
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
fail2:
|
fail2:
|
||||||
|
|||||||
@@ -31,9 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_WOL
|
#if EFSYS_OPT_WOL
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
#if EFSYS_OPT_MON_STATS
|
#if EFSYS_OPT_MON_STATS
|
||||||
#include "mcdi_mon.h"
|
#include "mcdi_mon.h"
|
||||||
@@ -447,9 +444,9 @@ ef10_ev_qmoderate(
|
|||||||
eep->ee_index, &dword, 0);
|
eep->ee_index, &dword, 0);
|
||||||
} else {
|
} else {
|
||||||
EFX_POPULATE_DWORD_2(dword,
|
EFX_POPULATE_DWORD_2(dword,
|
||||||
FRF_CZ_TC_TIMER_MODE, mode,
|
ERF_DZ_TC_TIMER_MODE, mode,
|
||||||
FRF_CZ_TC_TIMER_VAL, timer_val);
|
ERF_DZ_TC_TIMER_VAL, timer_val);
|
||||||
EFX_BAR_TBL_WRITED(enp, FR_BZ_TIMER_COMMAND_REGP0,
|
EFX_BAR_TBL_WRITED(enp, ER_DZ_EVQ_TMR_REG,
|
||||||
eep->ee_index, &dword, 0);
|
eep->ee_index, &dword, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,10 +31,7 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_types.h"
|
|
||||||
#include "efx_regs_mcdi.h"
|
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
#if EFSYS_OPT_HUNTINGTON
|
#if EFSYS_OPT_HUNTINGTON
|
||||||
|
|||||||
@@ -52,7 +52,14 @@ extern "C" {
|
|||||||
/* Alignment requirement for value written to RX WPTR:
|
/* Alignment requirement for value written to RX WPTR:
|
||||||
* the WPTR must be aligned to an 8 descriptor boundary
|
* the WPTR must be aligned to an 8 descriptor boundary
|
||||||
*/
|
*/
|
||||||
#define HUNTINGTON_RX_WPTR_ALIGN 8
|
#define EF10_RX_WPTR_ALIGN 8
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Max byte offset into the packet the TCP header must start for the hardware
|
||||||
|
* to be able to parse the packet correctly.
|
||||||
|
* FIXME: Move to ef10_impl.h when it is included in all driver builds.
|
||||||
|
*/
|
||||||
|
#define EF10_TCP_HEADER_OFFSET_LIMIT 208
|
||||||
|
|
||||||
/* Invalid RSS context handle */
|
/* Invalid RSS context handle */
|
||||||
#define EF10_RSS_CONTEXT_INVALID (0xffffffff)
|
#define EF10_RSS_CONTEXT_INVALID (0xffffffff)
|
||||||
@@ -161,48 +168,52 @@ ef10_intr_fini(
|
|||||||
/* NIC */
|
/* NIC */
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_probe(
|
ef10_nic_probe(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_set_drv_limits(
|
hunt_board_cfg(
|
||||||
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
ef10_nic_set_drv_limits(
|
||||||
__inout efx_nic_t *enp,
|
__inout efx_nic_t *enp,
|
||||||
__in efx_drv_limits_t *edlp);
|
__in efx_drv_limits_t *edlp);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_get_vi_pool(
|
ef10_nic_get_vi_pool(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__out uint32_t *vi_countp);
|
__out uint32_t *vi_countp);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_get_bar_region(
|
ef10_nic_get_bar_region(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__in efx_nic_region_t region,
|
__in efx_nic_region_t region,
|
||||||
__out uint32_t *offsetp,
|
__out uint32_t *offsetp,
|
||||||
__out size_t *sizep);
|
__out size_t *sizep);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_reset(
|
ef10_nic_reset(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_init(
|
ef10_nic_init(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
#if EFSYS_OPT_DIAG
|
#if EFSYS_OPT_DIAG
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_register_test(
|
ef10_nic_register_test(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_DIAG */
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
hunt_nic_fini(
|
ef10_nic_fini(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
hunt_nic_unprobe(
|
ef10_nic_unprobe(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
|
|
||||||
@@ -276,12 +287,12 @@ ef10_mcdi_fini(
|
|||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
ef10_mcdi_request_copyin(
|
ef10_mcdi_send_request(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__in efx_mcdi_req_t *emrp,
|
__in void *hdrp,
|
||||||
__in unsigned int seq,
|
__in size_t hdr_len,
|
||||||
__in boolean_t ev_cpl,
|
__in void *sdup,
|
||||||
__in boolean_t new_epoch);
|
__in size_t sdu_len);
|
||||||
|
|
||||||
extern __checkReturn boolean_t
|
extern __checkReturn boolean_t
|
||||||
ef10_mcdi_poll_response(
|
ef10_mcdi_poll_response(
|
||||||
@@ -290,7 +301,7 @@ ef10_mcdi_poll_response(
|
|||||||
extern void
|
extern void
|
||||||
ef10_mcdi_read_response(
|
ef10_mcdi_read_response(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__out void *bufferp,
|
__out_bcount(length) void *bufferp,
|
||||||
__in size_t offset,
|
__in size_t offset,
|
||||||
__in size_t length);
|
__in size_t length);
|
||||||
|
|
||||||
@@ -358,12 +369,6 @@ ef10_nvram_partn_write_segment_tlv(
|
|||||||
__in size_t size,
|
__in size_t size,
|
||||||
__in boolean_t all_segments);
|
__in boolean_t all_segments);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
|
||||||
ef10_nvram_partn_size(
|
|
||||||
__in efx_nic_t *enp,
|
|
||||||
__in uint32_t partn,
|
|
||||||
__out size_t *sizep);
|
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
ef10_nvram_partn_lock(
|
ef10_nvram_partn_lock(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
@@ -409,12 +414,6 @@ ef10_nvram_test(
|
|||||||
|
|
||||||
#endif /* EFSYS_OPT_DIAG */
|
#endif /* EFSYS_OPT_DIAG */
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
|
||||||
ef10_nvram_size(
|
|
||||||
__in efx_nic_t *enp,
|
|
||||||
__in efx_nvram_type_t type,
|
|
||||||
__out size_t *sizep);
|
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
ef10_nvram_get_version(
|
ef10_nvram_get_version(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
@@ -466,6 +465,18 @@ ef10_nvram_set_version(
|
|||||||
__in efx_nvram_type_t type,
|
__in efx_nvram_type_t type,
|
||||||
__in_ecount(4) uint16_t version[4]);
|
__in_ecount(4) uint16_t version[4]);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
ef10_nvram_type_to_partn(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in efx_nvram_type_t type,
|
||||||
|
__out uint32_t *partnp);
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
ef10_nvram_partn_size(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint32_t partn,
|
||||||
|
__out size_t *sizep);
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_NVRAM */
|
#endif /* EFSYS_OPT_NVRAM */
|
||||||
|
|
||||||
|
|
||||||
@@ -689,6 +700,15 @@ hunt_tx_qdesc_tso_create(
|
|||||||
__in uint8_t tcp_flags,
|
__in uint8_t tcp_flags,
|
||||||
__out efx_desc_t *edp);
|
__out efx_desc_t *edp);
|
||||||
|
|
||||||
|
extern void
|
||||||
|
ef10_tx_qdesc_tso2_create(
|
||||||
|
__in efx_txq_t *etp,
|
||||||
|
__in uint16_t ipv4_id,
|
||||||
|
__in uint32_t tcp_seq,
|
||||||
|
__in uint16_t tcp_mss,
|
||||||
|
__out_ecount(count) efx_desc_t *edp,
|
||||||
|
__in int count);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
ef10_tx_qdesc_vlantci_create(
|
ef10_tx_qdesc_vlantci_create(
|
||||||
__in efx_txq_t *etp,
|
__in efx_txq_t *etp,
|
||||||
@@ -747,7 +767,7 @@ typedef uint32_t efx_piobuf_handle_t;
|
|||||||
#define EFX_PIOBUF_HANDLE_INVALID ((efx_piobuf_handle_t) -1)
|
#define EFX_PIOBUF_HANDLE_INVALID ((efx_piobuf_handle_t) -1)
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_pio_alloc(
|
ef10_nic_pio_alloc(
|
||||||
__inout efx_nic_t *enp,
|
__inout efx_nic_t *enp,
|
||||||
__out uint32_t *bufnump,
|
__out uint32_t *bufnump,
|
||||||
__out efx_piobuf_handle_t *handlep,
|
__out efx_piobuf_handle_t *handlep,
|
||||||
@@ -756,19 +776,19 @@ hunt_nic_pio_alloc(
|
|||||||
__out size_t *sizep);
|
__out size_t *sizep);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_pio_free(
|
ef10_nic_pio_free(
|
||||||
__inout efx_nic_t *enp,
|
__inout efx_nic_t *enp,
|
||||||
__in uint32_t bufnum,
|
__in uint32_t bufnum,
|
||||||
__in uint32_t blknum);
|
__in uint32_t blknum);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_pio_link(
|
ef10_nic_pio_link(
|
||||||
__inout efx_nic_t *enp,
|
__inout efx_nic_t *enp,
|
||||||
__in uint32_t vi_index,
|
__in uint32_t vi_index,
|
||||||
__in efx_piobuf_handle_t handle);
|
__in efx_piobuf_handle_t handle);
|
||||||
|
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
hunt_nic_pio_unlink(
|
ef10_nic_pio_unlink(
|
||||||
__inout efx_nic_t *enp,
|
__inout efx_nic_t *enp,
|
||||||
__in uint32_t vi_index);
|
__in uint32_t vi_index);
|
||||||
|
|
||||||
@@ -845,14 +865,6 @@ extern __checkReturn efx_rc_t
|
|||||||
ef10_rx_init(
|
ef10_rx_init(
|
||||||
__in efx_nic_t *enp);
|
__in efx_nic_t *enp);
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_HDR_SPLIT
|
|
||||||
extern __checkReturn efx_rc_t
|
|
||||||
ef10_rx_hdr_split_enable(
|
|
||||||
__in efx_nic_t *enp,
|
|
||||||
__in unsigned int hdr_buf_size,
|
|
||||||
__in unsigned int pld_buf_size);
|
|
||||||
#endif /* EFSYS_OPT_RX_HDR_SPLIT */
|
|
||||||
|
|
||||||
#if EFSYS_OPT_RX_SCATTER
|
#if EFSYS_OPT_RX_SCATTER
|
||||||
extern __checkReturn efx_rc_t
|
extern __checkReturn efx_rc_t
|
||||||
ef10_rx_scatter_enable(
|
ef10_rx_scatter_enable(
|
||||||
@@ -882,8 +894,20 @@ ef10_rx_scale_tbl_set(
|
|||||||
__in_ecount(n) unsigned int *table,
|
__in_ecount(n) unsigned int *table,
|
||||||
__in size_t n);
|
__in size_t n);
|
||||||
|
|
||||||
|
extern __checkReturn uint32_t
|
||||||
|
ef10_rx_prefix_hash(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in efx_rx_hash_alg_t func,
|
||||||
|
__in uint8_t *buffer);
|
||||||
|
|
||||||
#endif /* EFSYS_OPT_RX_SCALE */
|
#endif /* EFSYS_OPT_RX_SCALE */
|
||||||
|
|
||||||
|
extern __checkReturn efx_rc_t
|
||||||
|
ef10_rx_prefix_pktlen(
|
||||||
|
__in efx_nic_t *enp,
|
||||||
|
__in uint8_t *buffer,
|
||||||
|
__out uint16_t *lengthp);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
ef10_rx_qpost(
|
ef10_rx_qpost(
|
||||||
__in efx_rxq_t *erp,
|
__in efx_rxq_t *erp,
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "efsys.h"
|
|
||||||
#include "efx.h"
|
#include "efx.h"
|
||||||
#include "efx_impl.h"
|
#include "efx_impl.h"
|
||||||
|
|
||||||
@@ -44,37 +43,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
#error "WITH_MCDI_V2 required for EF10 MCDIv2 commands."
|
#error "WITH_MCDI_V2 required for EF10 MCDIv2 commands."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef enum efx_mcdi_header_type_e {
|
|
||||||
EFX_MCDI_HEADER_TYPE_V1, /* MCDIv0 (BootROM), MCDIv1 commands */
|
|
||||||
EFX_MCDI_HEADER_TYPE_V2, /* MCDIv2 commands */
|
|
||||||
} efx_mcdi_header_type_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the header format to use for sending an MCDI request.
|
|
||||||
*
|
|
||||||
* An MCDIv1 (Siena compatible) command should use MCDIv2 encapsulation if the
|
|
||||||
* request input buffer or response output buffer are too large for the MCDIv1
|
|
||||||
* format. An MCDIv2 command must always be sent using MCDIv2 encapsulation.
|
|
||||||
*/
|
|
||||||
#define EFX_MCDI_HEADER_TYPE(_cmd, _length) \
|
|
||||||
((((_cmd) & ~EFX_MASK32(MCDI_HEADER_CODE)) || \
|
|
||||||
((_length) & ~EFX_MASK32(MCDI_HEADER_DATALEN))) ? \
|
|
||||||
EFX_MCDI_HEADER_TYPE_V2 : EFX_MCDI_HEADER_TYPE_V1)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MCDI Header NOT_EPOCH flag
|
|
||||||
* ==========================
|
|
||||||
* A new epoch begins at initial startup or after an MC reboot, and defines when
|
|
||||||
* the MC should reject stale MCDI requests.
|
|
||||||
*
|
|
||||||
* The first MCDI request sent by the host should contain NOT_EPOCH=0, and all
|
|
||||||
* subsequent requests (until the next MC reboot) should contain NOT_EPOCH=1.
|
|
||||||
*
|
|
||||||
* After rebooting the MC will fail all requests with NOT_EPOCH=1 by writing a
|
|
||||||
* response with ERROR=1 and DATALEN=0 until a request is seen with NOT_EPOCH=0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
__checkReturn efx_rc_t
|
__checkReturn efx_rc_t
|
||||||
ef10_mcdi_init(
|
ef10_mcdi_init(
|
||||||
@@ -141,96 +109,44 @@ ef10_mcdi_fini(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ef10_mcdi_request_copyin(
|
ef10_mcdi_send_request(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__in efx_mcdi_req_t *emrp,
|
__in void *hdrp,
|
||||||
__in unsigned int seq,
|
__in size_t hdr_len,
|
||||||
__in boolean_t ev_cpl,
|
__in void *sdup,
|
||||||
__in boolean_t new_epoch)
|
__in size_t sdu_len)
|
||||||
{
|
{
|
||||||
const efx_mcdi_transport_t *emtp = enp->en_mcdi.em_emtp;
|
const efx_mcdi_transport_t *emtp = enp->en_mcdi.em_emtp;
|
||||||
efsys_mem_t *esmp = emtp->emt_dma_mem;
|
efsys_mem_t *esmp = emtp->emt_dma_mem;
|
||||||
efx_mcdi_header_type_t hdr_type;
|
|
||||||
efx_dword_t dword;
|
efx_dword_t dword;
|
||||||
efx_dword_t hdr[2];
|
|
||||||
unsigned int xflags;
|
|
||||||
unsigned int pos;
|
unsigned int pos;
|
||||||
size_t offset;
|
|
||||||
|
|
||||||
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
|
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
|
||||||
enp->en_family == EFX_FAMILY_MEDFORD);
|
enp->en_family == EFX_FAMILY_MEDFORD);
|
||||||
|
|
||||||
xflags = 0;
|
/* Write the header */
|
||||||
if (ev_cpl)
|
for (pos = 0; pos < hdr_len; pos += sizeof (efx_dword_t)) {
|
||||||
xflags |= MCDI_HEADER_XFLAGS_EVREQ;
|
dword = *(efx_dword_t *)((uint8_t *)hdrp + pos);
|
||||||
|
EFSYS_MEM_WRITED(esmp, pos, &dword);
|
||||||
offset = 0;
|
|
||||||
|
|
||||||
hdr_type = EFX_MCDI_HEADER_TYPE(emrp->emr_cmd,
|
|
||||||
MAX(emrp->emr_in_length, emrp->emr_out_length));
|
|
||||||
|
|
||||||
if (hdr_type == EFX_MCDI_HEADER_TYPE_V2) {
|
|
||||||
/* Construct MCDI v2 header */
|
|
||||||
EFX_POPULATE_DWORD_8(hdr[0],
|
|
||||||
MCDI_HEADER_CODE, MC_CMD_V2_EXTN,
|
|
||||||
MCDI_HEADER_RESYNC, 1,
|
|
||||||
MCDI_HEADER_DATALEN, 0,
|
|
||||||
MCDI_HEADER_SEQ, seq,
|
|
||||||
MCDI_HEADER_NOT_EPOCH, new_epoch ? 0 : 1,
|
|
||||||
MCDI_HEADER_ERROR, 0,
|
|
||||||
MCDI_HEADER_RESPONSE, 0,
|
|
||||||
MCDI_HEADER_XFLAGS, xflags);
|
|
||||||
EFSYS_MEM_WRITED(esmp, offset, &hdr[0]);
|
|
||||||
offset += sizeof (efx_dword_t);
|
|
||||||
|
|
||||||
EFX_POPULATE_DWORD_2(hdr[1],
|
|
||||||
MC_CMD_V2_EXTN_IN_EXTENDED_CMD, emrp->emr_cmd,
|
|
||||||
MC_CMD_V2_EXTN_IN_ACTUAL_LEN, emrp->emr_in_length);
|
|
||||||
EFSYS_MEM_WRITED(esmp, offset, &hdr[1]);
|
|
||||||
offset += sizeof (efx_dword_t);
|
|
||||||
} else {
|
|
||||||
/* Construct MCDI v1 header */
|
|
||||||
EFX_POPULATE_DWORD_8(hdr[0],
|
|
||||||
MCDI_HEADER_CODE, emrp->emr_cmd,
|
|
||||||
MCDI_HEADER_RESYNC, 1,
|
|
||||||
MCDI_HEADER_DATALEN, emrp->emr_in_length,
|
|
||||||
MCDI_HEADER_SEQ, seq,
|
|
||||||
MCDI_HEADER_NOT_EPOCH, new_epoch ? 0 : 1,
|
|
||||||
MCDI_HEADER_ERROR, 0,
|
|
||||||
MCDI_HEADER_RESPONSE, 0,
|
|
||||||
MCDI_HEADER_XFLAGS, xflags);
|
|
||||||
EFSYS_MEM_WRITED(esmp, 0, &hdr[0]);
|
|
||||||
offset += sizeof (efx_dword_t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EFSYS_OPT_MCDI_LOGGING
|
/* Write the payload */
|
||||||
if (emtp->emt_logger != NULL) {
|
for (pos = 0; pos < sdu_len; pos += sizeof (efx_dword_t)) {
|
||||||
emtp->emt_logger(emtp->emt_context, EFX_LOG_MCDI_REQUEST,
|
dword = *(efx_dword_t *)((uint8_t *)sdup + pos);
|
||||||
&hdr, offset,
|
EFSYS_MEM_WRITED(esmp, hdr_len + pos, &dword);
|
||||||
emrp->emr_in_buf, emrp->emr_in_length);
|
|
||||||
}
|
}
|
||||||
#endif /* EFSYS_OPT_MCDI_LOGGING */
|
|
||||||
|
|
||||||
/* Construct the payload */
|
|
||||||
for (pos = 0; pos < emrp->emr_in_length; pos += sizeof (efx_dword_t)) {
|
|
||||||
memcpy(&dword, MCDI_IN(*emrp, efx_dword_t, pos),
|
|
||||||
MIN(sizeof (dword), emrp->emr_in_length - pos));
|
|
||||||
EFSYS_MEM_WRITED(esmp, offset + pos, &dword);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ring the doorbell to post the command DMA address to the MC */
|
|
||||||
EFSYS_ASSERT((EFSYS_MEM_ADDR(esmp) & 0xFF) == 0);
|
|
||||||
|
|
||||||
/* Guarantee ordering of memory (MCDI request) and PIO (MC doorbell) */
|
/* Guarantee ordering of memory (MCDI request) and PIO (MC doorbell) */
|
||||||
EFSYS_DMA_SYNC_FOR_DEVICE(esmp, 0, offset + emrp->emr_in_length);
|
EFSYS_DMA_SYNC_FOR_DEVICE(esmp, 0, hdr_len + sdu_len);
|
||||||
EFSYS_PIO_WRITE_BARRIER();
|
EFSYS_PIO_WRITE_BARRIER();
|
||||||
|
|
||||||
EFX_POPULATE_DWORD_1(dword,
|
/* Ring the doorbell to post the command DMA address to the MC */
|
||||||
EFX_DWORD_0, EFSYS_MEM_ADDR(esmp) >> 32);
|
EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
|
||||||
|
EFSYS_MEM_ADDR(esmp) >> 32);
|
||||||
EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
|
EFX_BAR_WRITED(enp, ER_DZ_MC_DB_LWRD_REG, &dword, B_FALSE);
|
||||||
|
|
||||||
EFX_POPULATE_DWORD_1(dword,
|
EFX_POPULATE_DWORD_1(dword, EFX_DWORD_0,
|
||||||
EFX_DWORD_0, EFSYS_MEM_ADDR(esmp) & 0xffffffff);
|
EFSYS_MEM_ADDR(esmp) & 0xffffffff);
|
||||||
EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
|
EFX_BAR_WRITED(enp, ER_DZ_MC_DB_HWRD_REG, &dword, B_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +209,7 @@ ef10_mcdi_poll_response(
|
|||||||
void
|
void
|
||||||
ef10_mcdi_read_response(
|
ef10_mcdi_read_response(
|
||||||
__in efx_nic_t *enp,
|
__in efx_nic_t *enp,
|
||||||
__out void *bufferp,
|
__out_bcount(length) void *bufferp,
|
||||||
__in size_t offset,
|
__in size_t offset,
|
||||||
__in size_t length)
|
__in size_t length)
|
||||||
{
|
{
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user