svn commit: r301547 - in projects/vnet: release/doc/en_US.ISO8859-1/relnotes share/man/man5 sys/compat/linuxkpi/common/include/linux sys/dev/cxgb sys/dev/cxgbe sys/dev/e1000 sys/dev/gpio sys/dev/hy...
Bjoern A. Zeeb
bz at FreeBSD.org
Tue Jun 7 14:16:12 UTC 2016
Author: bz
Date: Tue Jun 7 14:16:10 2016
New Revision: 301547
URL: https://svnweb.freebsd.org/changeset/base/301547
Log:
MfH @r301546
Sponsored by: The FreeBSD Foundation
Added:
projects/vnet/usr.sbin/bluetooth/ath3kfw/ath3k_dbg.h
- copied unchanged from r301546, head/usr.sbin/bluetooth/ath3kfw/ath3k_dbg.h
projects/vnet/usr.sbin/bluetooth/ath3kfw/ath3k_fw.c
- copied unchanged from r301546, head/usr.sbin/bluetooth/ath3kfw/ath3k_fw.c
projects/vnet/usr.sbin/bluetooth/ath3kfw/ath3k_fw.h
- copied unchanged from r301546, head/usr.sbin/bluetooth/ath3kfw/ath3k_fw.h
projects/vnet/usr.sbin/bluetooth/ath3kfw/ath3k_hw.c
- copied unchanged from r301546, head/usr.sbin/bluetooth/ath3kfw/ath3k_hw.c
projects/vnet/usr.sbin/bluetooth/ath3kfw/ath3k_hw.h
- copied unchanged from r301546, head/usr.sbin/bluetooth/ath3kfw/ath3k_hw.h
projects/vnet/usr.sbin/bluetooth/ath3kfw/main.c
- copied unchanged from r301546, head/usr.sbin/bluetooth/ath3kfw/main.c
Deleted:
projects/vnet/usr.sbin/bluetooth/ath3kfw/ath3kfw.c
Modified:
projects/vnet/release/doc/en_US.ISO8859-1/relnotes/article.xml
projects/vnet/share/man/man5/rc.conf.5
projects/vnet/sys/compat/linuxkpi/common/include/linux/etherdevice.h
projects/vnet/sys/compat/linuxkpi/common/include/linux/random.h
projects/vnet/sys/dev/cxgb/cxgb_sge.c
projects/vnet/sys/dev/cxgbe/adapter.h
projects/vnet/sys/dev/cxgbe/t4_main.c
projects/vnet/sys/dev/e1000/if_igb.c
projects/vnet/sys/dev/gpio/gpiobus.c
projects/vnet/sys/dev/gpio/gpiobusvar.h
projects/vnet/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
projects/vnet/sys/dev/ixgbe/ix_txrx.c
projects/vnet/sys/dev/ixl/ixl_txrx.c
projects/vnet/sys/dev/mlx5/driver.h
projects/vnet/sys/dev/mlx5/mlx5_core/mlx5_vport.c
projects/vnet/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c
projects/vnet/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
projects/vnet/sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
projects/vnet/sys/dev/mlx5/vport.h
projects/vnet/sys/dev/qlxgbe/ql_isr.c
projects/vnet/sys/dev/qlxge/qls_isr.c
projects/vnet/sys/kern/subr_intr.c
projects/vnet/sys/net/flowtable.c
projects/vnet/sys/net/if_vxlan.c
projects/vnet/sys/netinet/sctp_input.c
projects/vnet/sys/netinet/sctp_pcb.c
projects/vnet/sys/ofed/drivers/net/mlx4/en_rx.c
projects/vnet/sys/sys/intr.h
projects/vnet/usr.sbin/bluetooth/ath3kfw/Makefile
projects/vnet/usr.sbin/bluetooth/ath3kfw/ath3kfw.8
projects/vnet/usr.sbin/newsyslog/newsyslog.c
projects/vnet/usr.sbin/ypldap/ypldap.8
Directory Properties:
projects/vnet/ (props changed)
Modified: projects/vnet/release/doc/en_US.ISO8859-1/relnotes/article.xml
==============================================================================
--- projects/vnet/release/doc/en_US.ISO8859-1/relnotes/article.xml Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/release/doc/en_US.ISO8859-1/relnotes/article.xml Tue Jun 7 14:16:10 2016 (r301547)
@@ -1771,6 +1771,10 @@
</tgroup>
</informaltable>
+ <para revision="300779">Dummynet AQM, an independent implementation of
+ CoDel and FQ-CoDel for ipfw/dummynet has been imported to the base
+ system.</para>
+
</sect2>
</sect1>
Modified: projects/vnet/share/man/man5/rc.conf.5
==============================================================================
--- projects/vnet/share/man/man5/rc.conf.5 Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/share/man/man5/rc.conf.5 Tue Jun 7 14:16:10 2016 (r301547)
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd April 30, 2016
+.Dd June 8, 2016
.Dt RC.CONF 5
.Os
.Sh NAME
@@ -2559,6 +2559,22 @@ is set to
these are the flags to pass to the
.Xr ypbind 8
service.
+.It Va nis_ypldap_enable
+.Pq Vt bool
+If set to
+.Dq Li YES ,
+run the
+.Xr ypldap 8
+daemon at system boot time.
+.It Va nis_ypldap_flags
+.Pq Vt str
+If
+.Va nis.ypldap_enable
+is set to
+.Dq Li YES ,
+these are the flags to pass to the
+.Xr ypldap 8
+daemon.
.It Va nis_ypset_enable
.Pq Vt bool
If set to
Modified: projects/vnet/sys/compat/linuxkpi/common/include/linux/etherdevice.h
==============================================================================
--- projects/vnet/sys/compat/linuxkpi/common/include/linux/etherdevice.h Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/compat/linuxkpi/common/include/linux/etherdevice.h Tue Jun 7 14:16:10 2016 (r301547)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2015 Mellanox Technologies, Ltd. All rights reserved.
+ * Copyright (c) 2015-2016 Mellanox Technologies, Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -102,7 +102,8 @@ eth_broadcast_addr(u8 *pa)
static inline void
random_ether_addr(u8 * dst)
{
- read_random(dst, 6);
+ if (read_random(dst, 6) == 0)
+ arc4rand(dst, 6, 0);
dst[0] &= 0xfe;
dst[0] |= 0x02;
Modified: projects/vnet/sys/compat/linuxkpi/common/include/linux/random.h
==============================================================================
--- projects/vnet/sys/compat/linuxkpi/common/include/linux/random.h Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/compat/linuxkpi/common/include/linux/random.h Tue Jun 7 14:16:10 2016 (r301547)
@@ -2,7 +2,7 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -32,11 +32,13 @@
#define _LINUX_RANDOM_H_
#include <sys/random.h>
+#include <sys/libkern.h>
static inline void
get_random_bytes(void *buf, int nbytes)
{
- read_random(buf, nbytes);
+ if (read_random(buf, nbytes) == 0)
+ arc4rand(buf, nbytes, 0);
}
#endif /* _LINUX_RANDOM_H_ */
Modified: projects/vnet/sys/dev/cxgb/cxgb_sge.c
==============================================================================
--- projects/vnet/sys/dev/cxgb/cxgb_sge.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/cxgb/cxgb_sge.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -2900,7 +2900,8 @@ process_responses(adapter_t *adap, struc
eop = get_packet(adap, drop_thresh, qs, mh, r);
if (eop) {
if (r->rss_hdr.hash_type && !adap->timestamp) {
- M_HASHTYPE_SET(mh->mh_head, M_HASHTYPE_OPAQUE);
+ M_HASHTYPE_SET(mh->mh_head,
+ M_HASHTYPE_OPAQUE_HASH);
mh->mh_head->m_pkthdr.flowid = rss_hash;
}
}
Modified: projects/vnet/sys/dev/cxgbe/adapter.h
==============================================================================
--- projects/vnet/sys/dev/cxgbe/adapter.h Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/cxgbe/adapter.h Tue Jun 7 14:16:10 2016 (r301547)
@@ -54,6 +54,7 @@
#include <netinet/tcp_lro.h>
#include "offload.h"
+#include "t4_ioctl.h"
#include "common/t4_msg.h"
#include "firmware/t4fw_interface.h"
@@ -264,6 +265,17 @@ struct vi_info {
uint8_t hw_addr[ETHER_ADDR_LEN]; /* factory MAC address, won't change */
};
+enum {
+ /* tx_sched_class flags */
+ TX_SC_OK = (1 << 0), /* Set up in hardware, active. */
+};
+
+struct tx_sched_class {
+ int refcount;
+ int flags;
+ struct t4_sched_class_params params;
+};
+
struct port_info {
device_t dev;
struct adapter *adapter;
@@ -273,6 +285,8 @@ struct port_info {
int up_vis;
int uld_vis;
+ struct tx_sched_class *tc; /* traffic classes for this channel */
+
struct mtx pi_lock;
char lockname[16];
unsigned long flags;
Modified: projects/vnet/sys/dev/cxgbe/t4_main.c
==============================================================================
--- projects/vnet/sys/dev/cxgbe/t4_main.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/cxgbe/t4_main.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -496,6 +496,7 @@ static int sysctl_tp_la(SYSCTL_HANDLER_A
static int sysctl_tx_rate(SYSCTL_HANDLER_ARGS);
static int sysctl_ulprx_la(SYSCTL_HANDLER_ARGS);
static int sysctl_wcwr_stats(SYSCTL_HANDLER_ARGS);
+static int sysctl_tc_params(SYSCTL_HANDLER_ARGS);
#endif
#ifdef TCP_OFFLOAD
static int sysctl_tp_tick(SYSCTL_HANDLER_ARGS);
@@ -875,6 +876,9 @@ t4_attach(device_t dev)
mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF);
sc->chan_map[pi->tx_chan] = i;
+ pi->tc = malloc(sizeof(struct tx_sched_class) *
+ sc->chip_params->nsched_cls, M_CXGBE, M_ZERO | M_WAITOK);
+
if (is_10G_port(pi) || is_40G_port(pi)) {
n10g++;
for_each_vi(pi, j, vi) {
@@ -1131,6 +1135,7 @@ t4_detach(device_t dev)
mtx_destroy(&pi->pi_lock);
free(pi->vi, M_CXGBE);
+ free(pi->tc, M_CXGBE);
free(pi, M_CXGBE);
}
}
@@ -5030,8 +5035,10 @@ cxgbe_sysctls(struct port_info *pi)
{
struct sysctl_ctx_list *ctx;
struct sysctl_oid *oid;
- struct sysctl_oid_list *children;
+ struct sysctl_oid_list *children, *children2;
struct adapter *sc = pi->adapter;
+ int i;
+ char name[16];
ctx = device_get_sysctl_ctx(pi->dev);
@@ -5060,6 +5067,29 @@ cxgbe_sysctls(struct port_info *pi)
port_top_speed(pi), "max speed (in Gbps)");
/*
+ * dev.(cxgbe|cxl).X.tc.
+ */
+ oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "tc", CTLFLAG_RD, NULL,
+ "Tx scheduler traffic classes");
+ for (i = 0; i < sc->chip_params->nsched_cls; i++) {
+ struct tx_sched_class *tc = &pi->tc[i];
+
+ snprintf(name, sizeof(name), "%d", i);
+ children2 = SYSCTL_CHILDREN(SYSCTL_ADD_NODE(ctx,
+ SYSCTL_CHILDREN(oid), OID_AUTO, name, CTLFLAG_RD, NULL,
+ "traffic class"));
+ SYSCTL_ADD_UINT(ctx, children2, OID_AUTO, "flags", CTLFLAG_RD,
+ &tc->flags, 0, "flags");
+ SYSCTL_ADD_UINT(ctx, children2, OID_AUTO, "refcount",
+ CTLFLAG_RD, &tc->refcount, 0, "references to this class");
+#ifdef SBUF_DRAIN
+ SYSCTL_ADD_PROC(ctx, children2, OID_AUTO, "params",
+ CTLTYPE_STRING | CTLFLAG_RD, sc, (pi->port_id << 16) | i,
+ sysctl_tc_params, "A", "traffic class parameters");
+#endif
+ }
+
+ /*
* dev.cxgbe.X.stats.
*/
oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "stats", CTLFLAG_RD,
@@ -7452,6 +7482,101 @@ sysctl_wcwr_stats(SYSCTL_HANDLER_ARGS)
return (rc);
}
+
+static int
+sysctl_tc_params(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *sc = arg1;
+ struct tx_sched_class *tc;
+ struct t4_sched_class_params p;
+ struct sbuf *sb;
+ int i, rc, port_id, flags, mbps, gbps;
+
+ rc = sysctl_wire_old_buffer(req, 0);
+ if (rc != 0)
+ return (rc);
+
+ sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
+ if (sb == NULL)
+ return (ENOMEM);
+
+ port_id = arg2 >> 16;
+ MPASS(port_id < sc->params.nports);
+ MPASS(sc->port[port_id] != NULL);
+ i = arg2 & 0xffff;
+ MPASS(i < sc->chip_params->nsched_cls);
+ tc = &sc->port[port_id]->tc[i];
+
+ rc = begin_synchronized_op(sc, NULL, HOLD_LOCK | SLEEP_OK | INTR_OK,
+ "t4tc_p");
+ if (rc)
+ goto done;
+ flags = tc->flags;
+ p = tc->params;
+ end_synchronized_op(sc, LOCK_HELD);
+
+ if ((flags & TX_SC_OK) == 0) {
+ sbuf_printf(sb, "none");
+ goto done;
+ }
+
+ if (p.level == SCHED_CLASS_LEVEL_CL_WRR) {
+ sbuf_printf(sb, "cl-wrr weight %u", p.weight);
+ goto done;
+ } else if (p.level == SCHED_CLASS_LEVEL_CL_RL)
+ sbuf_printf(sb, "cl-rl");
+ else if (p.level == SCHED_CLASS_LEVEL_CH_RL)
+ sbuf_printf(sb, "ch-rl");
+ else {
+ rc = ENXIO;
+ goto done;
+ }
+
+ if (p.ratemode == SCHED_CLASS_RATEMODE_REL) {
+ /* XXX: top speed or actual link speed? */
+ gbps = port_top_speed(sc->port[port_id]);
+ sbuf_printf(sb, " %u%% of %uGbps", p.maxrate, gbps);
+ }
+ else if (p.ratemode == SCHED_CLASS_RATEMODE_ABS) {
+ switch (p.rateunit) {
+ case SCHED_CLASS_RATEUNIT_BITS:
+ mbps = p.maxrate / 1000;
+ gbps = p.maxrate / 1000000;
+ if (p.maxrate == gbps * 1000000)
+ sbuf_printf(sb, " %uGbps", gbps);
+ else if (p.maxrate == mbps * 1000)
+ sbuf_printf(sb, " %uMbps", mbps);
+ else
+ sbuf_printf(sb, " %uKbps", p.maxrate);
+ break;
+ case SCHED_CLASS_RATEUNIT_PKTS:
+ sbuf_printf(sb, " %upps", p.maxrate);
+ break;
+ default:
+ rc = ENXIO;
+ goto done;
+ }
+ }
+
+ switch (p.mode) {
+ case SCHED_CLASS_MODE_CLASS:
+ sbuf_printf(sb, " aggregate");
+ break;
+ case SCHED_CLASS_MODE_FLOW:
+ sbuf_printf(sb, " per-flow");
+ break;
+ default:
+ rc = ENXIO;
+ goto done;
+ }
+
+done:
+ if (rc == 0)
+ rc = sbuf_finish(sb);
+ sbuf_delete(sb);
+
+ return (rc);
+}
#endif
#ifdef TCP_OFFLOAD
@@ -8297,155 +8422,147 @@ in_range(int val, int lo, int hi)
}
static int
-set_sched_class(struct adapter *sc, struct t4_sched_params *p)
+set_sched_class_config(struct adapter *sc, int minmax)
{
- int fw_subcmd, fw_type, rc;
+ int rc;
+
+ if (minmax < 0)
+ return (EINVAL);
- rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4setsc");
+ rc = begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4sscc");
if (rc)
return (rc);
+ rc = -t4_sched_config(sc, FW_SCHED_TYPE_PKTSCHED, minmax, 1);
+ end_synchronized_op(sc, 0);
- if (!(sc->flags & FULL_INIT_DONE)) {
- rc = EAGAIN;
- goto done;
- }
+ return (rc);
+}
- /*
- * Translate the cxgbetool parameters into T4 firmware parameters. (The
- * sub-command and type are in common locations.)
- */
- if (p->subcmd == SCHED_CLASS_SUBCMD_CONFIG)
- fw_subcmd = FW_SCHED_SC_CONFIG;
- else if (p->subcmd == SCHED_CLASS_SUBCMD_PARAMS)
- fw_subcmd = FW_SCHED_SC_PARAMS;
- else {
- rc = EINVAL;
- goto done;
- }
- if (p->type == SCHED_CLASS_TYPE_PACKET)
- fw_type = FW_SCHED_TYPE_PKTSCHED;
- else {
- rc = EINVAL;
- goto done;
- }
+static int
+set_sched_class_params(struct adapter *sc, struct t4_sched_class_params *p,
+ int sleep_ok)
+{
+ int rc, top_speed, fw_level, fw_mode, fw_rateunit, fw_ratemode;
+ struct port_info *pi;
+ struct tx_sched_class *tc;
- if (fw_subcmd == FW_SCHED_SC_CONFIG) {
- /* Vet our parameters ..*/
- if (p->u.config.minmax < 0) {
- rc = EINVAL;
- goto done;
- }
+ if (p->level == SCHED_CLASS_LEVEL_CL_RL)
+ fw_level = FW_SCHED_PARAMS_LEVEL_CL_RL;
+ else if (p->level == SCHED_CLASS_LEVEL_CL_WRR)
+ fw_level = FW_SCHED_PARAMS_LEVEL_CL_WRR;
+ else if (p->level == SCHED_CLASS_LEVEL_CH_RL)
+ fw_level = FW_SCHED_PARAMS_LEVEL_CH_RL;
+ else
+ return (EINVAL);
- /* And pass the request to the firmware ...*/
- rc = -t4_sched_config(sc, fw_type, p->u.config.minmax, 1);
- goto done;
- }
+ if (p->mode == SCHED_CLASS_MODE_CLASS)
+ fw_mode = FW_SCHED_PARAMS_MODE_CLASS;
+ else if (p->mode == SCHED_CLASS_MODE_FLOW)
+ fw_mode = FW_SCHED_PARAMS_MODE_FLOW;
+ else
+ return (EINVAL);
- if (fw_subcmd == FW_SCHED_SC_PARAMS) {
- int fw_level;
- int fw_mode;
- int fw_rateunit;
- int fw_ratemode;
-
- if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL)
- fw_level = FW_SCHED_PARAMS_LEVEL_CL_RL;
- else if (p->u.params.level == SCHED_CLASS_LEVEL_CL_WRR)
- fw_level = FW_SCHED_PARAMS_LEVEL_CL_WRR;
- else if (p->u.params.level == SCHED_CLASS_LEVEL_CH_RL)
- fw_level = FW_SCHED_PARAMS_LEVEL_CH_RL;
- else {
- rc = EINVAL;
- goto done;
- }
+ if (p->rateunit == SCHED_CLASS_RATEUNIT_BITS)
+ fw_rateunit = FW_SCHED_PARAMS_UNIT_BITRATE;
+ else if (p->rateunit == SCHED_CLASS_RATEUNIT_PKTS)
+ fw_rateunit = FW_SCHED_PARAMS_UNIT_PKTRATE;
+ else
+ return (EINVAL);
- if (p->u.params.mode == SCHED_CLASS_MODE_CLASS)
- fw_mode = FW_SCHED_PARAMS_MODE_CLASS;
- else if (p->u.params.mode == SCHED_CLASS_MODE_FLOW)
- fw_mode = FW_SCHED_PARAMS_MODE_FLOW;
- else {
- rc = EINVAL;
- goto done;
- }
+ if (p->ratemode == SCHED_CLASS_RATEMODE_REL)
+ fw_ratemode = FW_SCHED_PARAMS_RATE_REL;
+ else if (p->ratemode == SCHED_CLASS_RATEMODE_ABS)
+ fw_ratemode = FW_SCHED_PARAMS_RATE_ABS;
+ else
+ return (EINVAL);
- if (p->u.params.rateunit == SCHED_CLASS_RATEUNIT_BITS)
- fw_rateunit = FW_SCHED_PARAMS_UNIT_BITRATE;
- else if (p->u.params.rateunit == SCHED_CLASS_RATEUNIT_PKTS)
- fw_rateunit = FW_SCHED_PARAMS_UNIT_PKTRATE;
- else {
- rc = EINVAL;
- goto done;
- }
+ /* Vet our parameters ... */
+ if (!in_range(p->channel, 0, sc->chip_params->nchan - 1))
+ return (ERANGE);
- if (p->u.params.ratemode == SCHED_CLASS_RATEMODE_REL)
- fw_ratemode = FW_SCHED_PARAMS_RATE_REL;
- else if (p->u.params.ratemode == SCHED_CLASS_RATEMODE_ABS)
- fw_ratemode = FW_SCHED_PARAMS_RATE_ABS;
- else {
- rc = EINVAL;
- goto done;
- }
+ pi = sc->port[sc->chan_map[p->channel]];
+ if (pi == NULL)
+ return (ENXIO);
+ MPASS(pi->tx_chan == p->channel);
+ top_speed = port_top_speed(pi) * 1000000; /* Gbps -> Kbps */
- /* Vet our parameters ... */
- if (!in_range(p->u.params.channel, 0, 3) ||
- !in_range(p->u.params.cl, 0, sc->chip_params->nsched_cls) ||
- !in_range(p->u.params.minrate, 0, 10000000) ||
- !in_range(p->u.params.maxrate, 0, 10000000) ||
- !in_range(p->u.params.weight, 0, 100)) {
- rc = ERANGE;
- goto done;
- }
+ if (!in_range(p->cl, 0, sc->chip_params->nsched_cls) ||
+ !in_range(p->minrate, 0, top_speed) ||
+ !in_range(p->maxrate, 0, top_speed) ||
+ !in_range(p->weight, 0, 100))
+ return (ERANGE);
+
+ /*
+ * Translate any unset parameters into the firmware's
+ * nomenclature and/or fail the call if the parameters
+ * are required ...
+ */
+ if (p->rateunit < 0 || p->ratemode < 0 || p->channel < 0 || p->cl < 0)
+ return (EINVAL);
+
+ if (p->minrate < 0)
+ p->minrate = 0;
+ if (p->maxrate < 0) {
+ if (p->level == SCHED_CLASS_LEVEL_CL_RL ||
+ p->level == SCHED_CLASS_LEVEL_CH_RL)
+ return (EINVAL);
+ else
+ p->maxrate = 0;
+ }
+ if (p->weight < 0) {
+ if (p->level == SCHED_CLASS_LEVEL_CL_WRR)
+ return (EINVAL);
+ else
+ p->weight = 0;
+ }
+ if (p->pktsize < 0) {
+ if (p->level == SCHED_CLASS_LEVEL_CL_RL ||
+ p->level == SCHED_CLASS_LEVEL_CH_RL)
+ return (EINVAL);
+ else
+ p->pktsize = 0;
+ }
+ rc = begin_synchronized_op(sc, NULL,
+ sleep_ok ? (SLEEP_OK | INTR_OK) : HOLD_LOCK, "t4sscp");
+ if (rc)
+ return (rc);
+ tc = &pi->tc[p->cl];
+ tc->params = *p;
+ rc = -t4_sched_params(sc, FW_SCHED_TYPE_PKTSCHED, fw_level, fw_mode,
+ fw_rateunit, fw_ratemode, p->channel, p->cl, p->minrate, p->maxrate,
+ p->weight, p->pktsize, sleep_ok);
+ if (rc == 0)
+ tc->flags |= TX_SC_OK;
+ else {
/*
- * Translate any unset parameters into the firmware's
- * nomenclature and/or fail the call if the parameters
- * are required ...
+ * Unknown state at this point, see tc->params for what was
+ * attempted.
*/
- if (p->u.params.rateunit < 0 || p->u.params.ratemode < 0 ||
- p->u.params.channel < 0 || p->u.params.cl < 0) {
- rc = EINVAL;
- goto done;
- }
- if (p->u.params.minrate < 0)
- p->u.params.minrate = 0;
- if (p->u.params.maxrate < 0) {
- if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL ||
- p->u.params.level == SCHED_CLASS_LEVEL_CH_RL) {
- rc = EINVAL;
- goto done;
- } else
- p->u.params.maxrate = 0;
- }
- if (p->u.params.weight < 0) {
- if (p->u.params.level == SCHED_CLASS_LEVEL_CL_WRR) {
- rc = EINVAL;
- goto done;
- } else
- p->u.params.weight = 0;
- }
- if (p->u.params.pktsize < 0) {
- if (p->u.params.level == SCHED_CLASS_LEVEL_CL_RL ||
- p->u.params.level == SCHED_CLASS_LEVEL_CH_RL) {
- rc = EINVAL;
- goto done;
- } else
- p->u.params.pktsize = 0;
- }
-
- /* See what the firmware thinks of the request ... */
- rc = -t4_sched_params(sc, fw_type, fw_level, fw_mode,
- fw_rateunit, fw_ratemode, p->u.params.channel,
- p->u.params.cl, p->u.params.minrate, p->u.params.maxrate,
- p->u.params.weight, p->u.params.pktsize, 1);
- goto done;
+ tc->flags &= ~TX_SC_OK;
}
+ end_synchronized_op(sc, sleep_ok ? 0 : LOCK_HELD);
- rc = EINVAL;
-done:
- end_synchronized_op(sc, 0);
return (rc);
}
static int
+set_sched_class(struct adapter *sc, struct t4_sched_params *p)
+{
+
+ if (p->type != SCHED_CLASS_TYPE_PACKET)
+ return (EINVAL);
+
+ if (p->subcmd == SCHED_CLASS_SUBCMD_CONFIG)
+ return (set_sched_class_config(sc, p->u.config.minmax));
+
+ if (p->subcmd == SCHED_CLASS_SUBCMD_PARAMS)
+ return (set_sched_class_params(sc, &p->u.params, 1));
+
+ return (EINVAL);
+}
+
+static int
set_sched_queue(struct adapter *sc, struct t4_sched_queue *p)
{
struct port_info *pi = NULL;
@@ -8458,11 +8575,6 @@ set_sched_queue(struct adapter *sc, stru
if (rc)
return (rc);
- if (!(sc->flags & FULL_INIT_DONE)) {
- rc = EAGAIN;
- goto done;
- }
-
if (p->port >= sc->params.nports) {
rc = EINVAL;
goto done;
@@ -8471,7 +8583,14 @@ set_sched_queue(struct adapter *sc, stru
/* XXX: Only supported for the main VI. */
pi = sc->port[p->port];
vi = &pi->vi[0];
- if (!in_range(p->queue, 0, vi->ntxq - 1) || !in_range(p->cl, 0, 7)) {
+ if (!(vi->flags & VI_INIT_DONE)) {
+ /* tx queues not set up yet */
+ rc = EAGAIN;
+ goto done;
+ }
+
+ if (!in_range(p->queue, 0, vi->ntxq - 1) ||
+ !in_range(p->cl, 0, sc->chip_params->nsched_cls - 1)) {
rc = EINVAL;
goto done;
}
Modified: projects/vnet/sys/dev/e1000/if_igb.c
==============================================================================
--- projects/vnet/sys/dev/e1000/if_igb.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/e1000/if_igb.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -5154,7 +5154,7 @@ igb_rxeof(struct igb_queue *que, int cou
default:
/* XXX fallthrough */
M_HASHTYPE_SET(rxr->fmp,
- M_HASHTYPE_OPAQUE);
+ M_HASHTYPE_OPAQUE_HASH);
}
} else {
#ifndef IGB_LEGACY_TX
Modified: projects/vnet/sys/dev/gpio/gpiobus.c
==============================================================================
--- projects/vnet/sys/dev/gpio/gpiobus.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/gpio/gpiobus.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -79,22 +79,47 @@ static int gpiobus_pin_toggle(device_t,
* data will be moved into struct resource.
*/
#ifdef INTRNG
+static void
+gpio_destruct_map_data(struct intr_map_data *map_data)
+{
+
+ KASSERT(map_data->type == INTR_MAP_DATA_GPIO,
+ ("%s: bad map_data type %d", __func__, map_data->type));
+
+ free(map_data, M_DEVBUF);
+}
+
struct resource *
gpio_alloc_intr_resource(device_t consumer_dev, int *rid, u_int alloc_flags,
gpio_pin_t pin, uint32_t intr_mode)
{
- u_int irqnum;
-
- /*
- * Allocate new fictitious interrupt number and store configuration
- * into it.
- */
- irqnum = intr_gpio_map_irq(pin->dev, pin->pin, pin->flags, intr_mode);
- if (irqnum == INTR_IRQ_INVALID)
+ int rv;
+ u_int irq;
+ struct intr_map_data_gpio *gpio_data;
+ struct resource *res;
+
+ gpio_data = malloc(sizeof(*gpio_data), M_DEVBUF, M_WAITOK | M_ZERO);
+ gpio_data->hdr.type = INTR_MAP_DATA_GPIO;
+ gpio_data->hdr.destruct = gpio_destruct_map_data;
+ gpio_data->gpio_pin_num = pin->pin;
+ gpio_data->gpio_pin_flags = pin->flags;
+ gpio_data->gpio_intr_mode = intr_mode;
+
+ rv = intr_map_irq(pin->dev, 0, (struct intr_map_data *)gpio_data,
+ &irq);
+ if (rv != 0) {
+ gpio_destruct_map_data((struct intr_map_data *)gpio_data);
return (NULL);
+ }
- return (bus_alloc_resource(consumer_dev, SYS_RES_IRQ, rid,
- irqnum, irqnum, 1, alloc_flags));
+ res = bus_alloc_resource(consumer_dev, SYS_RES_IRQ, rid, irq, irq, 1,
+ alloc_flags);
+ if (res == NULL) {
+ gpio_destruct_map_data((struct intr_map_data *)gpio_data);
+ return (NULL);
+ }
+ rman_set_virtual(res, gpio_data);
+ return (res);
}
#else
struct resource *
Modified: projects/vnet/sys/dev/gpio/gpiobusvar.h
==============================================================================
--- projects/vnet/sys/dev/gpio/gpiobusvar.h Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/gpio/gpiobusvar.h Tue Jun 7 14:16:10 2016 (r301547)
@@ -70,6 +70,13 @@ struct gpiobus_pin_data
char *name; /* pin name. */
};
+struct intr_map_data_gpio {
+ struct intr_map_data hdr;
+ u_int gpio_pin_num;
+ u_int gpio_pin_flags;
+ u_int gpio_intr_mode;
+};
+
struct gpiobus_softc
{
struct mtx sc_mtx; /* bus mutex */
Modified: projects/vnet/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- projects/vnet/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -1300,6 +1300,7 @@ netvsc_recv(struct hv_vmbus_channel *cha
struct ifnet *ifp = rxr->hn_ifp;
struct mbuf *m_new;
int size, do_lro = 0, do_csum = 1;
+ int hash_type = M_HASHTYPE_OPAQUE_HASH;
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
return (0);
@@ -1430,8 +1431,6 @@ skip:
}
if (hash_info != NULL && hash_value != NULL) {
- int hash_type = M_HASHTYPE_OPAQUE;
-
rxr->hn_rss_pkts++;
m_new->m_pkthdr.flowid = hash_value->hash_value;
if ((hash_info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
@@ -1465,14 +1464,15 @@ skip:
break;
}
}
- M_HASHTYPE_SET(m_new, hash_type);
} else {
- if (hash_value != NULL)
+ if (hash_value != NULL) {
m_new->m_pkthdr.flowid = hash_value->hash_value;
- else
+ } else {
m_new->m_pkthdr.flowid = rxr->hn_rx_idx;
- M_HASHTYPE_SET(m_new, M_HASHTYPE_OPAQUE);
+ hash_type = M_HASHTYPE_OPAQUE;
+ }
}
+ M_HASHTYPE_SET(m_new, hash_type);
/*
* Note: Moved RX completion back to hv_nv_on_receive() so all
Modified: projects/vnet/sys/dev/ixgbe/ix_txrx.c
==============================================================================
--- projects/vnet/sys/dev/ixgbe/ix_txrx.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/ixgbe/ix_txrx.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -1964,7 +1964,7 @@ ixgbe_rxeof(struct ix_queue *que)
#endif
default:
M_HASHTYPE_SET(sendmp,
- M_HASHTYPE_OPAQUE);
+ M_HASHTYPE_OPAQUE_HASH);
}
} else {
sendmp->m_pkthdr.flowid = que->msix;
Modified: projects/vnet/sys/dev/ixl/ixl_txrx.c
==============================================================================
--- projects/vnet/sys/dev/ixl/ixl_txrx.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/ixl/ixl_txrx.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -1453,10 +1453,10 @@ ixl_ptype_to_hash(u8 ptype)
ex = decoded.outer_frag;
if (!decoded.known)
- return M_HASHTYPE_OPAQUE;
+ return M_HASHTYPE_OPAQUE_HASH;
if (decoded.outer_ip == I40E_RX_PTYPE_OUTER_L2)
- return M_HASHTYPE_OPAQUE;
+ return M_HASHTYPE_OPAQUE_HASH;
/* Note: anything that gets to this point is IP */
if (decoded.outer_ip_ver == I40E_RX_PTYPE_OUTER_IPV6) {
@@ -1492,7 +1492,7 @@ ixl_ptype_to_hash(u8 ptype)
}
}
/* We should never get here!! */
- return M_HASHTYPE_OPAQUE;
+ return M_HASHTYPE_OPAQUE_HASH;
}
#endif /* RSS */
Modified: projects/vnet/sys/dev/mlx5/driver.h
==============================================================================
--- projects/vnet/sys/dev/mlx5/driver.h Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/mlx5/driver.h Tue Jun 7 14:16:10 2016 (r301547)
@@ -33,6 +33,7 @@
#include <linux/pci.h>
#include <linux/cache.h>
#include <linux/rbtree.h>
+#include <linux/if_ether.h>
#include <linux/semaphore.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
Modified: projects/vnet/sys/dev/mlx5/mlx5_core/mlx5_vport.c
==============================================================================
--- projects/vnet/sys/dev/mlx5/mlx5_core/mlx5_vport.c Tue Jun 7 14:11:15 2016 (r301546)
+++ projects/vnet/sys/dev/mlx5/mlx5_core/mlx5_vport.c Tue Jun 7 14:16:10 2016 (r301547)
@@ -471,6 +471,241 @@ int mlx5_set_nic_vport_promisc(struct ml
return mlx5_modify_nic_vport_context(mdev, in, sizeof(in));
}
EXPORT_SYMBOL_GPL(mlx5_set_nic_vport_promisc);
+
+int mlx5_query_nic_vport_mac_list(struct mlx5_core_dev *dev,
+ u32 vport,
+ enum mlx5_list_type list_type,
+ u8 addr_list[][ETH_ALEN],
+ int *list_size)
+{
+ u32 in[MLX5_ST_SZ_DW(query_nic_vport_context_in)];
+ void *nic_vport_ctx;
+ int max_list_size;
+ int req_list_size;
+ u8 *mac_addr;
+ int out_sz;
+ void *out;
+ int err;
+ int i;
+
+ req_list_size = *list_size;
+
+ max_list_size = (list_type == MLX5_NIC_VPORT_LIST_TYPE_UC) ?
+ 1 << MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list) :
+ 1 << MLX5_CAP_GEN_MAX(dev, log_max_current_mc_list);
+
+ if (req_list_size > max_list_size) {
+ mlx5_core_warn(dev, "Requested list size (%d) > (%d) max_list_size\n",
+ req_list_size, max_list_size);
+ req_list_size = max_list_size;
+ }
+
+ out_sz = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in) +
+ req_list_size * MLX5_ST_SZ_BYTES(mac_address_layout);
+
+ memset(in, 0, sizeof(in));
+ out = kzalloc(out_sz, GFP_KERNEL);
+ if (!out)
+ return -ENOMEM;
+
+ MLX5_SET(query_nic_vport_context_in, in, opcode,
+ MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT);
+ MLX5_SET(query_nic_vport_context_in, in, allowed_list_type, list_type);
+ MLX5_SET(query_nic_vport_context_in, in, vport_number, vport);
+
+ if (vport)
+ MLX5_SET(query_nic_vport_context_in, in, other_vport, 1);
+
+ err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, out_sz);
+ if (err)
+ goto out;
+
+ nic_vport_ctx = MLX5_ADDR_OF(query_nic_vport_context_out, out,
+ nic_vport_context);
+ req_list_size = MLX5_GET(nic_vport_context, nic_vport_ctx,
+ allowed_list_size);
+
+ *list_size = req_list_size;
+ for (i = 0; i < req_list_size; i++) {
+ mac_addr = MLX5_ADDR_OF(nic_vport_context,
+ nic_vport_ctx,
+ current_uc_mac_address[i]) + 2;
+ ether_addr_copy(addr_list[i], mac_addr);
+ }
+out:
+ kfree(out);
+ return err;
+}
+EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_mac_list);
+
+int mlx5_modify_nic_vport_mac_list(struct mlx5_core_dev *dev,
+ enum mlx5_list_type list_type,
+ u8 addr_list[][ETH_ALEN],
+ int list_size)
+{
+ u32 out[MLX5_ST_SZ_DW(modify_nic_vport_context_out)];
+ void *nic_vport_ctx;
+ int max_list_size;
+ int in_sz;
+ void *in;
+ int err;
+ int i;
+
+ max_list_size = list_type == MLX5_NIC_VPORT_LIST_TYPE_UC ?
+ 1 << MLX5_CAP_GEN(dev, log_max_current_uc_list) :
+ 1 << MLX5_CAP_GEN(dev, log_max_current_mc_list);
+
+ if (list_size > max_list_size)
+ return -ENOSPC;
+
+ in_sz = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in) +
+ list_size * MLX5_ST_SZ_BYTES(mac_address_layout);
+
+ memset(out, 0, sizeof(out));
+ in = kzalloc(in_sz, GFP_KERNEL);
+ if (!in)
+ return -ENOMEM;
+
+ MLX5_SET(modify_nic_vport_context_in, in, opcode,
+ MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT);
+ MLX5_SET(modify_nic_vport_context_in, in,
+ field_select.addresses_list, 1);
+
+ nic_vport_ctx = MLX5_ADDR_OF(modify_nic_vport_context_in, in,
+ nic_vport_context);
+
+ MLX5_SET(nic_vport_context, nic_vport_ctx,
+ allowed_list_type, list_type);
+ MLX5_SET(nic_vport_context, nic_vport_ctx,
+ allowed_list_size, list_size);
+
+ for (i = 0; i < list_size; i++) {
+ u8 *curr_mac = MLX5_ADDR_OF(nic_vport_context,
+ nic_vport_ctx,
+ current_uc_mac_address[i]) + 2;
+ ether_addr_copy(curr_mac, addr_list[i]);
+ }
+
+ err = mlx5_cmd_exec_check_status(dev, in, in_sz, out, sizeof(out));
+ kfree(in);
+ return err;
+}
+EXPORT_SYMBOL_GPL(mlx5_modify_nic_vport_mac_list);
+
+int mlx5_query_nic_vport_vlan_list(struct mlx5_core_dev *dev,
+ u32 vport,
+ u16 *vlan_list,
+ int *list_size)
+{
+ u32 in[MLX5_ST_SZ_DW(query_nic_vport_context_in)];
+ void *nic_vport_ctx;
+ int max_list_size;
+ int req_list_size;
+ int out_sz;
+ void *out;
+ void *vlan_addr;
+ int err;
+ int i;
+
+ req_list_size = *list_size;
+
+ max_list_size = 1 << MLX5_CAP_GEN_MAX(dev, log_max_vlan_list);
+
+ if (req_list_size > max_list_size) {
+ mlx5_core_warn(dev, "Requested list size (%d) > (%d) max_list_size\n",
+ req_list_size, max_list_size);
+ req_list_size = max_list_size;
+ }
+
+ out_sz = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in) +
+ req_list_size * MLX5_ST_SZ_BYTES(vlan_layout);
+
+ memset(in, 0, sizeof(in));
+ out = kzalloc(out_sz, GFP_KERNEL);
+ if (!out)
+ return -ENOMEM;
+
+ MLX5_SET(query_nic_vport_context_in, in, opcode,
+ MLX5_CMD_OP_QUERY_NIC_VPORT_CONTEXT);
+ MLX5_SET(query_nic_vport_context_in, in, allowed_list_type,
+ MLX5_NIC_VPORT_CONTEXT_ALLOWED_LIST_TYPE_VLAN_LIST);
+ MLX5_SET(query_nic_vport_context_in, in, vport_number, vport);
+
+ if (vport)
+ MLX5_SET(query_nic_vport_context_in, in, other_vport, 1);
+
+ err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, out_sz);
+ if (err)
+ goto out;
+
+ nic_vport_ctx = MLX5_ADDR_OF(query_nic_vport_context_out, out,
+ nic_vport_context);
+ req_list_size = MLX5_GET(nic_vport_context, nic_vport_ctx,
+ allowed_list_size);
+
+ *list_size = req_list_size;
+ for (i = 0; i < req_list_size; i++) {
+ vlan_addr = MLX5_ADDR_OF(nic_vport_context, nic_vport_ctx,
+ current_uc_mac_address[i]);
+ vlan_list[i] = MLX5_GET(vlan_layout, vlan_addr, vlan);
+ }
+out:
+ kfree(out);
+ return err;
+}
+EXPORT_SYMBOL_GPL(mlx5_query_nic_vport_vlan_list);
+
+int mlx5_modify_nic_vport_vlans(struct mlx5_core_dev *dev,
+ u16 vlans[],
+ int list_size)
+{
+ u32 out[MLX5_ST_SZ_DW(modify_nic_vport_context_out)];
+ void *nic_vport_ctx;
+ int max_list_size;
+ int in_sz;
+ void *in;
+ int err;
+ int i;
+
+ max_list_size = 1 << MLX5_CAP_GEN(dev, log_max_vlan_list);
+
+ if (list_size > max_list_size)
+ return -ENOSPC;
+
+ in_sz = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in) +
+ list_size * MLX5_ST_SZ_BYTES(vlan_layout);
+
+ memset(out, 0, sizeof(out));
+ in = kzalloc(in_sz, GFP_KERNEL);
+ if (!in)
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list