svn commit: r265553 - in stable/9/sys/dev/cxgbe: . common tom
Navdeep Parhar
np at FreeBSD.org
Wed May 7 15:34:06 UTC 2014
Author: np
Date: Wed May 7 15:34:04 2014
New Revision: 265553
URL: http://svnweb.freebsd.org/changeset/base/265553
Log:
MFC r259103 and r259382.
r259103:
cxgbe(4): save a copy of the RSS map for each port for the driver's use.
r259382:
Read card capabilities after firmware initialization, instead of setting
them up as part of firmware initialization (which the driver gets to do
only if it's the master driver).
Read the range of tids available for the ETHOFLD functionality if it's
enabled.
New is_ftid() and is_etid() functions to test whether a tid falls within
the range of filter tids or ETHOFLD tids respectively.
Modified:
stable/9/sys/dev/cxgbe/adapter.h
stable/9/sys/dev/cxgbe/common/common.h
stable/9/sys/dev/cxgbe/offload.h
stable/9/sys/dev/cxgbe/t4_main.c
stable/9/sys/dev/cxgbe/t4_sge.c
stable/9/sys/dev/cxgbe/tom/t4_cpl_io.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/dev/ (props changed)
Modified: stable/9/sys/dev/cxgbe/adapter.h
==============================================================================
--- stable/9/sys/dev/cxgbe/adapter.h Wed May 7 15:24:24 2014 (r265552)
+++ stable/9/sys/dev/cxgbe/adapter.h Wed May 7 15:34:04 2014 (r265553)
@@ -193,6 +193,7 @@ struct port_info {
unsigned long flags;
int if_flags;
+ uint16_t *rss;
uint16_t viid;
int16_t xact_addr_filt;/* index of exact MAC address filter */
uint16_t rss_size; /* size of VI's RSS table slice */
Modified: stable/9/sys/dev/cxgbe/common/common.h
==============================================================================
--- stable/9/sys/dev/cxgbe/common/common.h Wed May 7 15:24:24 2014 (r265552)
+++ stable/9/sys/dev/cxgbe/common/common.h Wed May 7 15:34:04 2014 (r265553)
@@ -267,8 +267,10 @@ struct adapter_params {
unsigned short a_wnd[NCCTRL_WIN];
unsigned short b_wnd[NCCTRL_WIN];
- unsigned int mc_size; /* MC memory size */
- unsigned int nfilters; /* size of filter region */
+ u_int ftid_min;
+ u_int ftid_max;
+ u_int etid_min;
+ u_int netids;
unsigned int cim_la_size;
@@ -280,8 +282,10 @@ struct adapter_params {
unsigned int offload:1; /* hw is TOE capable, fw has divvied up card
resources for TOE operation. */
unsigned int bypass:1; /* this is a bypass card */
+ unsigned int ethoffload:1;
unsigned int ofldq_wr_cred;
+ unsigned int eo_wr_cred;
};
#define CHELSIO_T4 0x4
@@ -318,11 +322,28 @@ struct link_config {
#define for_each_port(adapter, iter) \
for (iter = 0; iter < (adapter)->params.nports; ++iter)
+static inline int is_ftid(const struct adapter *sc, u_int tid)
+{
+
+ return (tid >= sc->params.ftid_min && tid <= sc->params.ftid_max);
+}
+
+static inline int is_etid(const struct adapter *sc, u_int tid)
+{
+
+ return (tid >= sc->params.etid_min);
+}
+
static inline int is_offload(const struct adapter *adap)
{
return adap->params.offload;
}
+static inline int is_ethoffload(const struct adapter *adap)
+{
+ return adap->params.ethoffload;
+}
+
static inline int chip_id(struct adapter *adap)
{
return adap->params.chipid;
Modified: stable/9/sys/dev/cxgbe/offload.h
==============================================================================
--- stable/9/sys/dev/cxgbe/offload.h Wed May 7 15:24:24 2014 (r265552)
+++ stable/9/sys/dev/cxgbe/offload.h Wed May 7 15:34:04 2014 (r265553)
@@ -101,6 +101,11 @@ struct tid_info {
u_int nftids;
u_int ftid_base;
u_int ftids_in_use;
+
+ struct mtx etid_lock __aligned(CACHE_LINE_SIZE);
+ struct etid_entry *etid_tab;
+ u_int netids;
+ u_int etid_base;
};
struct t4_range {
Modified: stable/9/sys/dev/cxgbe/t4_main.c
==============================================================================
--- stable/9/sys/dev/cxgbe/t4_main.c Wed May 7 15:24:24 2014 (r265552)
+++ stable/9/sys/dev/cxgbe/t4_main.c Wed May 7 15:34:04 2014 (r265553)
@@ -2328,7 +2328,6 @@ use_config_on_flash:
#define LIMIT_CAPS(x) do { \
caps.x &= htobe16(t4_##x##_allowed); \
- sc->x = htobe16(caps.x); \
} while (0)
/*
@@ -2430,6 +2429,8 @@ get_params__post_init(struct adapter *sc
sc->sge.eq_start = val[1];
sc->tids.ftid_base = val[2];
sc->tids.nftids = val[3] - val[2] + 1;
+ sc->params.ftid_min = val[2];
+ sc->params.ftid_max = val[3];
sc->vres.l2t.start = val[4];
sc->vres.l2t.size = val[5] - val[4] + 1;
KASSERT(sc->vres.l2t.size <= L2T_SIZE,
@@ -2448,7 +2449,35 @@ get_params__post_init(struct adapter *sc
return (rc);
}
- if (caps.toecaps) {
+#define READ_CAPS(x) do { \
+ sc->x = htobe16(caps.x); \
+} while (0)
+ READ_CAPS(linkcaps);
+ READ_CAPS(niccaps);
+ READ_CAPS(toecaps);
+ READ_CAPS(rdmacaps);
+ READ_CAPS(iscsicaps);
+ READ_CAPS(fcoecaps);
+
+ if (sc->niccaps & FW_CAPS_CONFIG_NIC_ETHOFLD) {
+ param[0] = FW_PARAM_PFVF(ETHOFLD_START);
+ param[1] = FW_PARAM_PFVF(ETHOFLD_END);
+ param[2] = FW_PARAM_DEV(FLOWC_BUFFIFO_SZ);
+ rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 3, param, val);
+ if (rc != 0) {
+ device_printf(sc->dev,
+ "failed to query NIC parameters: %d.\n", rc);
+ return (rc);
+ }
+ sc->tids.etid_base = val[0];
+ sc->params.etid_min = val[0];
+ sc->tids.netids = val[1] - val[0] + 1;
+ sc->params.netids = sc->tids.netids;
+ sc->params.eo_wr_cred = val[2];
+ sc->params.ethoffload = 1;
+ }
+
+ if (sc->toecaps) {
/* query offload-related parameters */
param[0] = FW_PARAM_DEV(NTID);
param[1] = FW_PARAM_PFVF(SERVER_START);
@@ -2471,7 +2500,7 @@ get_params__post_init(struct adapter *sc
sc->params.ofldq_wr_cred = val[5];
sc->params.offload = 1;
}
- if (caps.rdmacaps) {
+ if (sc->rdmacaps) {
param[0] = FW_PARAM_PFVF(STAG_START);
param[1] = FW_PARAM_PFVF(STAG_END);
param[2] = FW_PARAM_PFVF(RQ_START);
@@ -2510,7 +2539,7 @@ get_params__post_init(struct adapter *sc
sc->vres.ocq.start = val[4];
sc->vres.ocq.size = val[5] - val[4] + 1;
}
- if (caps.iscsicaps) {
+ if (sc->iscsicaps) {
param[0] = FW_PARAM_PFVF(ISCSI_START);
param[1] = FW_PARAM_PFVF(ISCSI_END);
rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
@@ -3131,7 +3160,7 @@ port_full_init(struct port_info *pi)
struct ifnet *ifp = pi->ifp;
uint16_t *rss;
struct sge_rxq *rxq;
- int rc, i;
+ int rc, i, j;
ASSERT_SYNCHRONIZED_OP(sc);
KASSERT((pi->flags & PORT_INIT_DONE) == 0,
@@ -3148,21 +3177,25 @@ port_full_init(struct port_info *pi)
goto done; /* error message displayed already */
/*
- * Setup RSS for this port.
+ * Setup RSS for this port. Save a copy of the RSS table for later use.
*/
- rss = malloc(pi->nrxq * sizeof (*rss), M_CXGBE,
- M_ZERO | M_WAITOK);
- for_each_rxq(pi, i, rxq) {
- rss[i] = rxq->iq.abs_id;
+ rss = malloc(pi->rss_size * sizeof (*rss), M_CXGBE, M_ZERO | M_WAITOK);
+ for (i = 0; i < pi->rss_size;) {
+ for_each_rxq(pi, j, rxq) {
+ rss[i++] = rxq->iq.abs_id;
+ if (i == pi->rss_size)
+ break;
+ }
}
- rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0,
- pi->rss_size, rss, pi->nrxq);
- free(rss, M_CXGBE);
+
+ rc = -t4_config_rss_range(sc, sc->mbox, pi->viid, 0, pi->rss_size, rss,
+ pi->rss_size);
if (rc != 0) {
if_printf(ifp, "rss_config failed: %d\n", rc);
goto done;
}
+ pi->rss = rss;
pi->flags |= PORT_INIT_DONE;
done:
if (rc != 0)
@@ -3211,6 +3244,7 @@ port_full_uninit(struct port_info *pi)
quiesce_fl(sc, &ofld_rxq->fl);
}
#endif
+ free(pi->rss, M_CXGBE);
}
t4_teardown_port_queues(pi);
@@ -4436,6 +4470,7 @@ cxgbe_sysctls(struct port_info *pi)
struct sysctl_ctx_list *ctx;
struct sysctl_oid *oid;
struct sysctl_oid_list *children;
+ struct adapter *sc = pi->adapter;
ctx = device_get_sysctl_ctx(pi->dev);
@@ -4465,7 +4500,7 @@ cxgbe_sysctls(struct port_info *pi)
&pi->first_txq, 0, "index of first tx queue");
#ifdef TCP_OFFLOAD
- if (is_offload(pi->adapter)) {
+ if (is_offload(sc)) {
SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldrxq", CTLFLAG_RD,
&pi->nofldrxq, 0,
"# of rx queues for offloaded TCP connections");
@@ -4504,7 +4539,7 @@ cxgbe_sysctls(struct port_info *pi)
#define SYSCTL_ADD_T4_REG64(pi, name, desc, reg) \
SYSCTL_ADD_OID(ctx, children, OID_AUTO, name, \
- CTLTYPE_U64 | CTLFLAG_RD, pi->adapter, reg, \
+ CTLTYPE_U64 | CTLFLAG_RD, sc, reg, \
sysctl_handle_t4_reg64, "QU", desc)
SYSCTL_ADD_T4_REG64(pi, "tx_octets", "# of octets in good frames",
@@ -6074,6 +6109,11 @@ sysctl_tids(SYSCTL_HANDLER_ARGS)
t->ftid_base + t->nftids - 1);
}
+ if (t->netids) {
+ sbuf_printf(sb, "ETID range: %u-%u\n", t->etid_base,
+ t->etid_base + t->netids - 1);
+ }
+
sbuf_printf(sb, "HW TID usage: %u IP users, %u IPv6 users",
t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV4),
t4_read_reg(sc, A_LE_DB_ACT_CNT_IPV6));
@@ -7105,14 +7145,17 @@ t4_filter_rpl(struct sge_iq *iq, const s
struct adapter *sc = iq->adapter;
const struct cpl_set_tcb_rpl *rpl = (const void *)(rss + 1);
unsigned int idx = GET_TID(rpl);
+ unsigned int rc;
+ struct filter_entry *f;
KASSERT(m == NULL, ("%s: payload with opcode %02x", __func__,
rss->opcode));
- if (idx >= sc->tids.ftid_base &&
- (idx -= sc->tids.ftid_base) < sc->tids.nftids) {
- unsigned int rc = G_COOKIE(rpl->cookie);
- struct filter_entry *f = &sc->tids.ftid_tab[idx];
+ if (is_ftid(sc, idx)) {
+
+ idx -= sc->tids.ftid_base;
+ f = &sc->tids.ftid_tab[idx];
+ rc = G_COOKIE(rpl->cookie);
mtx_lock(&sc->tids.ftid_lock);
if (rc == FW_FILTER_WR_FLT_ADDED) {
Modified: stable/9/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- stable/9/sys/dev/cxgbe/t4_sge.c Wed May 7 15:24:24 2014 (r265552)
+++ stable/9/sys/dev/cxgbe/t4_sge.c Wed May 7 15:34:04 2014 (r265553)
@@ -1648,7 +1648,7 @@ t4_eth_rx(struct sge_iq *iq, const struc
m0->m_pkthdr.rcvif = ifp;
m0->m_flags |= M_FLOWID;
- m0->m_pkthdr.flowid = rss->hash_val;
+ m0->m_pkthdr.flowid = be32toh(rss->hash_val);
if (cpl->csum_calc && !cpl->err_vec) {
if (ifp->if_capenable & IFCAP_RXCSUM &&
@@ -2871,7 +2871,6 @@ alloc_wrq(struct adapter *sc, struct por
SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "unstalled", CTLFLAG_RD,
&wrq->eq.unstalled, 0, "# of times queue recovered after stall");
-
return (rc);
}
Modified: stable/9/sys/dev/cxgbe/tom/t4_cpl_io.c
==============================================================================
--- stable/9/sys/dev/cxgbe/tom/t4_cpl_io.c Wed May 7 15:24:24 2014 (r265552)
+++ stable/9/sys/dev/cxgbe/tom/t4_cpl_io.c Wed May 7 15:34:04 2014 (r265553)
@@ -1296,18 +1296,18 @@ do_rx_data(struct sge_iq *iq, const stru
#define V_CPL_FW4_ACK_OPCODE(x) ((x) << S_CPL_FW4_ACK_OPCODE)
#define G_CPL_FW4_ACK_OPCODE(x) \
(((x) >> S_CPL_FW4_ACK_OPCODE) & M_CPL_FW4_ACK_OPCODE)
-
+
#define S_CPL_FW4_ACK_FLOWID 0
#define M_CPL_FW4_ACK_FLOWID 0xffffff
#define V_CPL_FW4_ACK_FLOWID(x) ((x) << S_CPL_FW4_ACK_FLOWID)
#define G_CPL_FW4_ACK_FLOWID(x) \
(((x) >> S_CPL_FW4_ACK_FLOWID) & M_CPL_FW4_ACK_FLOWID)
-
+
#define S_CPL_FW4_ACK_CR 24
#define M_CPL_FW4_ACK_CR 0xff
#define V_CPL_FW4_ACK_CR(x) ((x) << S_CPL_FW4_ACK_CR)
#define G_CPL_FW4_ACK_CR(x) (((x) >> S_CPL_FW4_ACK_CR) & M_CPL_FW4_ACK_CR)
-
+
#define S_CPL_FW4_ACK_SEQVAL 0
#define M_CPL_FW4_ACK_SEQVAL 0x1
#define V_CPL_FW4_ACK_SEQVAL(x) ((x) << S_CPL_FW4_ACK_SEQVAL)
@@ -1434,8 +1434,7 @@ do_set_tcb_rpl(struct sge_iq *iq, const
("%s: unexpected opcode 0x%x", __func__, opcode));
KASSERT(m == NULL, ("%s: wasn't expecting payload", __func__));
- if (tid >= sc->tids.ftid_base &&
- tid < sc->tids.ftid_base + sc->tids.nftids)
+ if (is_ftid(sc, tid))
return (t4_filter_rpl(iq, rss, m)); /* TCB is a filter */
CXGBE_UNIMPLEMENTED(__func__);
More information about the svn-src-stable-9
mailing list