From: Potnuri Bharat Teja <bharat@chelsio.com>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, kuba@kernel.org, edumazet@google.com,
pabeni@redhat.com, andrew+netdev@lunn.ch, bharat@chelsio.com
Subject: [PATCH net-next v3 12/12] cxgb4: select ULD Tx and control queues by TID on T7
Date: Mon, 5 Oct 2026 18:48:30 -0400 [thread overview]
Message-ID: <20261005224830.377752-13-bharat@chelsio.com> (raw)
In-Reply-To: <20261005224830.377752-1-bharat@chelsio.com>
On T7 adapters with more than one uP core, TIDs are distributed over
core groups and a work request carrying a TID must be sent on an egress
queue allocated in the core group owning that TID. Firmware reports the
TID bits selecting the group through the TID_QID_SEL_MASK device
parameter.
- Query TID_QID_SEL_MASK on T7 adapters with multiple cores and add
helpers returning the number of core groups and the group of a TID.
- Allocate the shared ULD offload Tx queues of each port round robin
over the core groups, passing the group to firmware in
FW_EQ_OFLD_CMD, with at least one queue per group and port.
- Add cxgb4_uld_tid_qid_sel_update() and
cxgb4_uld_tid_ctrlq_id_sel_update() for ULDs to move a connection's
Tx and control queue to the TID's core group once the TID is known.
Tx queues of a group are used round robin.
- Send CPL_TID_RELEASE on the control queue of the TID's group.
cxgb4_remove_tid() keeps taking a port, so ULDs that do not select
queues by TID release TIDs on the right queue as well.
- Control queues are now allocated num_up_cores per port. Route the
completions of all of them to the RDMA response queue, stopping at
the first failure, and pass num_up_cores to ULDs.
Without TID based queue selection, on T4 - T6 and single core T7, all
queues stay in group 0, the number of queues is unchanged and the
helpers leave queue indexes unchanged.
Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
---
drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 28 +++-
.../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 27 +++-
.../net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 140 +++++++++++++++---
.../net/ethernet/chelsio/cxgb4/cxgb4_uld.h | 5 +
drivers/net/ethernet/chelsio/cxgb4/sge.c | 14 +-
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h | 5 +
6 files changed, 186 insertions(+), 33 deletions(-)
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index 8a483db4f72c..9eacf1638487 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -903,6 +903,7 @@ struct sge_uld_txq { /* state for an SGE offload Tx queue */
struct tasklet_struct qresume_tsk; /* restarts the queue */
bool service_ofldq_running; /* service_ofldq() is processing sendq */
u8 full; /* the Tx ring is full */
+ u8 tid_qid_group_id; /* uP core group of the queue */
unsigned long mapping_err; /* # of I/O MMU packet mapping errors */
} ____cacheline_aligned_in_smp;
@@ -928,6 +929,7 @@ struct sge_uld_txq_info {
struct sge_uld_txq *uldtxq; /* Txq's for ULD */
atomic_t users; /* num users */
u16 ntxq; /* # of egress uld queues */
+ atomic_t *tid_qid_rr; /* per port, per core group round robin */
};
/* struct to maintain ULD list to reallocate ULD resources on hotplug */
@@ -1503,6 +1505,30 @@ struct filter_entry {
struct ch_filter_specification fs;
};
+static inline unsigned int cxgb4_tid_qid_ngroups(const struct adapter *adap)
+{
+ if (!adap->params.tid_qid_sel_mask)
+ return 1;
+ return (adap->params.tid_qid_sel_mask >>
+ adap->params.tid_qid_sel_shift) + 1;
+}
+
+static inline unsigned int cxgb4_tid_qid_group(const struct adapter *adap,
+ u32 tid)
+{
+ return (tid & adap->params.tid_qid_sel_mask) >>
+ adap->params.tid_qid_sel_shift;
+}
+
+static inline u16 cxgb4_tid_ctrlq_idx(const struct adapter *adap,
+ unsigned int port, u32 tid)
+{
+ if (port >= adap->params.nports)
+ port = 0;
+ return port * adap->params.num_up_cores +
+ cxgb4_tid_qid_group(adap, tid);
+}
+
static inline int is_offload(const struct adapter *adap)
{
return adap->params.offload;
@@ -1662,7 +1688,7 @@ int t4_sge_mod_ctrl_txq(struct adapter *adap, unsigned int eqid,
unsigned int cmplqid);
int t4_sge_alloc_uld_txq(struct adapter *adap, struct sge_uld_txq *txq,
struct net_device *dev, unsigned int iqid,
- unsigned int uld_type);
+ unsigned int uld_type, u8 group);
int t4_sge_alloc_ethofld_txq(struct adapter *adap, struct sge_eohw_txq *txq,
struct net_device *dev, u32 iqid);
void t4_sge_free_ethofld_txq(struct adapter *adap, struct sge_eohw_txq *txq);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 563a0ee1ce2c..7a004b2de9c1 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -1749,13 +1749,15 @@ EXPORT_SYMBOL(cxgb4_free_stid);
/*
* Populate a TID_RELEASE WR. Caller must properly size the skb.
+ * @chan is the port whose control queues are used.
*/
-static void mk_tid_release(struct sk_buff *skb, unsigned int chan,
- unsigned int tid)
+static void mk_tid_release(const struct adapter *adap, struct sk_buff *skb,
+ unsigned int chan, unsigned int tid)
{
struct cpl_tid_release *req;
- set_wr_txq(skb, CPL_PRIORITY_SETUP, chan);
+ set_wr_txq(skb, CPL_PRIORITY_SETUP,
+ cxgb4_tid_ctrlq_idx(adap, chan, tid));
req = __skb_put(skb, sizeof(*req));
INIT_TP_WR(req, tid);
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, tid));
@@ -1806,7 +1808,7 @@ static void process_tid_release_list(struct work_struct *work)
GFP_KERNEL)))
schedule_timeout_uninterruptible(1);
- mk_tid_release(skb, chan, p - adap->tids.tid_tab);
+ mk_tid_release(adap, skb, chan, p - adap->tids.tid_tab);
t4_ofld_send(adap, skb);
spin_lock_bh(&adap->tid_release_lock);
}
@@ -1847,7 +1849,7 @@ void cxgb4_remove_tid(struct tid_info *t, unsigned int chan, unsigned int tid,
skb = alloc_skb(sizeof(struct cpl_tid_release), GFP_ATOMIC);
if (likely(skb)) {
- mk_tid_release(skb, chan, tid);
+ mk_tid_release(adap, skb, chan, tid);
t4_ofld_send(adap, skb);
} else
cxgb4_queue_tid_release(t, chan, tid);
@@ -5453,6 +5455,21 @@ static int adap_init0(struct adapter *adap, int vpd_skip)
adap->vres.ddp.size = val[4] - val[3] + 1;
adap->params.ofldq_wr_cred = val[5];
+ /* On T7 with multiple uP cores, each TID is owned by one core
+ * group and TID bound work requests must be sent on an egress
+ * queue of that group.
+ */
+ if (CHELSIO_CHIP_VERSION(adap->params.chip) >= CHELSIO_T7 &&
+ adap->params.num_up_cores > 1) {
+ params[0] = FW_PARAM_DEV(TID_QID_SEL_MASK);
+ ret = t4_query_params(adap, adap->mbox, adap->pf, 0, 1,
+ params, val);
+ if (!ret && val[0]) {
+ adap->params.tid_qid_sel_mask = val[0];
+ adap->params.tid_qid_sel_shift = ffs(val[0]) - 1;
+ }
+ }
+
if (caps_cmd.niccaps & htons(FW_CAPS_CONFIG_NIC_HASHFILTER)) {
init_hash_filter(adap);
} else {
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
index 23244cdfc1bc..2be70ccb6a96 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
@@ -170,6 +170,28 @@ static int alloc_uld_rxqs(struct adapter *adap,
return err;
}
+/* Route the completions of all control queues of @port to @cmplqid.
+ * Control queues are allocated num_up_cores per port.
+ */
+static int uld_set_ctrlq_cmplqid(struct adapter *adap, int port, u32 cmplqid)
+{
+ struct sge *s = &adap->sge;
+ int k, idx, ret = 0;
+ u32 param;
+
+ for (k = 0; k < adap->params.num_up_cores; k++) {
+ idx = port * adap->params.num_up_cores + k;
+ param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DMAQ) |
+ FW_PARAMS_PARAM_X_V(FW_PARAMS_PARAM_DMAQ_EQ_CMPLIQID_CTRL) |
+ FW_PARAMS_PARAM_YZ_V(s->ctrlq[idx].q.cntxt_id));
+ ret = t4_set_params(adap, adap->mbox, adap->pf, 0, 1,
+ ¶m, &cmplqid);
+ if (ret)
+ break;
+ }
+ return ret;
+}
+
static int
setup_sge_queues_uld(struct adapter *adap, unsigned int uld_type, bool lro)
{
@@ -182,18 +204,11 @@ setup_sge_queues_uld(struct adapter *adap, unsigned int uld_type, bool lro)
/* Tell uP to route control queue completions to rdma rspq */
if (adap->flags & CXGB4_FULL_INIT_DONE && uld_type == CXGB4_ULD_RDMA) {
- struct sge *s = &adap->sge;
- unsigned int cmplqid;
- u32 param, cmdop;
-
- cmdop = FW_PARAMS_PARAM_DMAQ_EQ_CMPLIQID_CTRL;
for_each_port(adap, i) {
- cmplqid = rxq_info->uldrxq[i].rspq.cntxt_id;
- param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DMAQ) |
- FW_PARAMS_PARAM_X_V(cmdop) |
- FW_PARAMS_PARAM_YZ_V(s->ctrlq[i].q.cntxt_id));
- ret = t4_set_params(adap, adap->mbox, adap->pf,
- 0, 1, ¶m, &cmplqid);
+ ret = uld_set_ctrlq_cmplqid(adap, i,
+ rxq_info->uldrxq[i].rspq.cntxt_id);
+ if (ret)
+ break;
}
}
return ret;
@@ -214,18 +229,10 @@ static void free_sge_queues_uld(struct adapter *adap, unsigned int uld_type)
struct sge_uld_rxq_info *rxq_info = adap->sge.uld_rxq_info[uld_type];
if (adap->flags & CXGB4_FULL_INIT_DONE && uld_type == CXGB4_ULD_RDMA) {
- struct sge *s = &adap->sge;
- u32 param, cmdop, cmplqid = 0;
int i;
- cmdop = FW_PARAMS_PARAM_DMAQ_EQ_CMPLIQID_CTRL;
- for_each_port(adap, i) {
- param = (FW_PARAMS_MNEM_V(FW_PARAMS_MNEM_DMAQ) |
- FW_PARAMS_PARAM_X_V(cmdop) |
- FW_PARAMS_PARAM_YZ_V(s->ctrlq[i].q.cntxt_id));
- t4_set_params(adap, adap->mbox, adap->pf,
- 0, 1, ¶m, &cmplqid);
- }
+ for_each_port(adap, i)
+ uld_set_ctrlq_cmplqid(adap, i, 0);
}
if (rxq_info->nciq)
@@ -428,10 +435,15 @@ alloc_sge_txq_uld(struct adapter *adap, struct sge_uld_txq_info *txq_info,
j = nq / adap->params.nports;
for (i = 0; i < nq; i++) {
struct sge_uld_txq *txq = &txq_info->uldtxq[i];
+ u8 group = 0;
+
+ /* Spread the queues of each port over all uP core groups */
+ if (uld_type == CXGB4_TX_OFLD)
+ group = (i % j) % cxgb4_tid_qid_ngroups(adap);
txq->q.size = 1024;
err = t4_sge_alloc_uld_txq(adap, txq, adap->port[i / j],
- s->fw_evtq.cntxt_id, uld_type);
+ s->fw_evtq.cntxt_id, uld_type, group);
if (err)
goto freeout;
}
@@ -451,6 +463,7 @@ release_sge_txq_uld(struct adapter *adap, unsigned int uld_type)
if (txq_info && atomic_dec_and_test(&txq_info->users)) {
free_sge_txq_uld(adap, txq_info);
+ kfree(txq_info->tid_qid_rr);
kfree(txq_info->uldtxq);
kfree(txq_info);
adap->sge.uld_txq_info[tx_uld_type] = NULL;
@@ -487,6 +500,9 @@ setup_sge_txq_uld(struct adapter *adap, unsigned int uld_type,
} else {
i = min_t(int, uld_info->ntxq, num_online_cpus());
txq_info->ntxq = roundup(i, adap->params.nports);
+ /* Each port needs at least one queue per uP core group */
+ i = cxgb4_tid_qid_ngroups(adap) * adap->params.nports;
+ txq_info->ntxq = max_t(int, txq_info->ntxq, i);
}
txq_info->uldtxq = kzalloc_objs(struct sge_uld_txq, txq_info->ntxq);
if (!txq_info->uldtxq) {
@@ -494,7 +510,18 @@ setup_sge_txq_uld(struct adapter *adap, unsigned int uld_type,
return -ENOMEM;
}
+ if (tx_uld_type == CXGB4_TX_OFLD && adap->params.tid_qid_sel_mask) {
+ i = cxgb4_tid_qid_ngroups(adap) * adap->params.nports;
+ txq_info->tid_qid_rr = kcalloc(i, sizeof(atomic_t), GFP_KERNEL);
+ if (!txq_info->tid_qid_rr) {
+ kfree(txq_info->uldtxq);
+ kfree(txq_info);
+ return -ENOMEM;
+ }
+ }
+
if (alloc_sge_txq_uld(adap, txq_info, tx_uld_type)) {
+ kfree(txq_info->tid_qid_rr);
kfree(txq_info->uldtxq);
kfree(txq_info);
return -ENOMEM;
@@ -601,6 +628,7 @@ static void uld_init(struct adapter *adap, struct cxgb4_lld_info *lld)
lld->mtus = adap->params.mtus;
lld->nchan = adap->params.nports;
lld->nports = adap->params.nports;
+ lld->num_up_cores = adap->params.num_up_cores;
lld->wr_cred = adap->params.ofldq_wr_cred;
lld->crypto = adap->params.crypto;
lld->iscsi_iolen = MAXRXDATA_G(t4_read_reg(adap, TP_PARA_REG2_A));
@@ -783,6 +811,74 @@ void cxgb4_uld_enable(struct adapter *adap)
mutex_unlock(&uld_mutex);
}
+/**
+ * cxgb4_uld_tid_ctrlq_id_sel_update - select the control queue for a TID
+ * @dev: net device of the adapter
+ * @tid: TID the work requests will carry
+ * @ctrlq_index: in: any control queue index of the port, normally the base
+ * index port * num_up_cores; out: the port's control queue in
+ * the uP core group owning @tid. Calling it again on the result
+ * is harmless.
+ *
+ * Work requests carrying a TID must be sent on a control queue of the
+ * core group owning the TID. Without TID based queue selection the index
+ * is left unchanged.
+ */
+void cxgb4_uld_tid_ctrlq_id_sel_update(struct net_device *dev, u32 tid,
+ u16 *ctrlq_index)
+{
+ struct adapter *adap = netdev2adap(dev);
+
+ if (!adap->params.tid_qid_sel_mask)
+ return;
+
+ *ctrlq_index = cxgb4_tid_ctrlq_idx(adap,
+ *ctrlq_index / adap->params.num_up_cores,
+ tid);
+}
+EXPORT_SYMBOL(cxgb4_uld_tid_ctrlq_id_sel_update);
+
+/**
+ * cxgb4_uld_tid_qid_sel_update - select the offload Tx queue for a TID
+ * @dev: net device of the adapter
+ * @uld: ULD type
+ * @tid: TID the work requests will carry
+ * @qid: in: an index into the ULD offload Tx queue array of the port;
+ * out: the index of a queue of the port in the uP core group owning
+ * @tid. This is an index into the uldtxq[] array, as used by
+ * cxgb4_ofld_send(), not a hardware queue context id.
+ *
+ * The queues of a port in the TID's core group are used round robin.
+ * Without TID based queue selection the index is left unchanged.
+ */
+void cxgb4_uld_tid_qid_sel_update(struct net_device *dev, enum cxgb4_uld uld,
+ u32 tid, u16 *qid)
+{
+ struct adapter *adap = netdev2adap(dev);
+ struct sge_uld_txq_info *txq_info;
+ unsigned int ngroups, per_port, port, group, n;
+
+ if (!adap->params.tid_qid_sel_mask)
+ return;
+
+ txq_info = adap->sge.uld_txq_info[TX_ULD(uld)];
+ if (!txq_info || !txq_info->tid_qid_rr)
+ return;
+
+ ngroups = cxgb4_tid_qid_ngroups(adap);
+ per_port = txq_info->ntxq / adap->params.nports;
+ port = *qid / per_port;
+ if (WARN_ON_ONCE(port >= adap->params.nports))
+ port = 0;
+ group = cxgb4_tid_qid_group(adap, tid);
+
+ /* Queue i of a port is in group i % ngroups, see alloc_sge_txq_uld() */
+ n = atomic_inc_return(&txq_info->tid_qid_rr[port * ngroups + group]);
+ n %= DIV_ROUND_UP(per_port - group, ngroups);
+ *qid = port * per_port + group + n * ngroups;
+}
+EXPORT_SYMBOL(cxgb4_uld_tid_qid_sel_update);
+
/* cxgb4_register_uld - register an upper-layer driver
* @type: the ULD type
* @p: the ULD methods
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
index d7713038386c..fd48886603d7 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h
@@ -433,6 +433,7 @@ struct cxgb4_lld_info {
unsigned short nciq; /* # of concentrator IQ */
unsigned char nchan:4; /* # of channels */
unsigned char nports:4; /* # of ports */
+ u8 num_up_cores; /* # of control queues per port */
unsigned char wr_cred; /* WR 16-byte credits */
unsigned char adapter_type; /* type of adapter */
unsigned char fw_api_ver; /* FW API version */
@@ -500,6 +501,10 @@ struct cxgb4_uld_info {
void cxgb4_uld_enable(struct adapter *adap);
void cxgb4_register_uld(enum cxgb4_uld type, const struct cxgb4_uld_info *p);
int cxgb4_unregister_uld(enum cxgb4_uld type);
+void cxgb4_uld_tid_ctrlq_id_sel_update(struct net_device *dev, u32 tid,
+ u16 *ctrlq_index);
+void cxgb4_uld_tid_qid_sel_update(struct net_device *dev, enum cxgb4_uld uld,
+ u32 tid, u16 *qid);
int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb);
int cxgb4_immdata_send(struct net_device *dev, unsigned int idx,
const void *src, unsigned int len);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
index cd151696b82c..fa7e822b43f7 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
@@ -4778,7 +4778,8 @@ int t4_sge_mod_ctrl_txq(struct adapter *adap, unsigned int eqid,
}
static int t4_sge_alloc_ofld_txq(struct adapter *adap, struct sge_txq *q,
- struct net_device *dev, u32 cmd, u32 iqid)
+ struct net_device *dev, u32 cmd, u32 iqid,
+ u8 group)
{
unsigned int chip_ver = CHELSIO_CHIP_VERSION(adap->params.chip);
struct port_info *pi = netdev_priv(dev);
@@ -4806,7 +4807,8 @@ static int t4_sge_alloc_ofld_txq(struct adapter *adap, struct sge_txq *q,
FW_EQ_OFLD_CMD_PFN_V(adap->pf) |
FW_EQ_OFLD_CMD_VFN_V(0));
c.alloc_to_len16 = htonl(FW_EQ_OFLD_CMD_ALLOC_F |
- FW_EQ_OFLD_CMD_EQSTART_F | FW_LEN16(c));
+ FW_EQ_OFLD_CMD_EQSTART_F |
+ FW_EQ_OFLD_CMD_COREGROUP_V(group) | FW_LEN16(c));
c.fetchszm_to_iqid =
htonl(FW_EQ_OFLD_CMD_HOSTFCMODE_V(HOSTFCMODE_STATUS_PAGE_X) |
FW_EQ_OFLD_CMD_PCIECHN_V(pi->tx_chan) |
@@ -4835,7 +4837,7 @@ static int t4_sge_alloc_ofld_txq(struct adapter *adap, struct sge_txq *q,
int t4_sge_alloc_uld_txq(struct adapter *adap, struct sge_uld_txq *txq,
struct net_device *dev, unsigned int iqid,
- unsigned int uld_type)
+ unsigned int uld_type, u8 group)
{
u32 cmd = FW_EQ_OFLD_CMD;
int ret;
@@ -4843,7 +4845,7 @@ int t4_sge_alloc_uld_txq(struct adapter *adap, struct sge_uld_txq *txq,
if (unlikely(uld_type == CXGB4_TX_CRYPTO))
cmd = FW_EQ_CTRL_CMD;
- ret = t4_sge_alloc_ofld_txq(adap, &txq->q, dev, cmd, iqid);
+ ret = t4_sge_alloc_ofld_txq(adap, &txq->q, dev, cmd, iqid, group);
if (ret)
return ret;
@@ -4852,6 +4854,7 @@ int t4_sge_alloc_uld_txq(struct adapter *adap, struct sge_uld_txq *txq,
skb_queue_head_init(&txq->sendq);
tasklet_setup(&txq->qresume_tsk, restart_ofldq);
txq->full = 0;
+ txq->tid_qid_group_id = group;
txq->mapping_err = 0;
return 0;
}
@@ -4861,7 +4864,8 @@ int t4_sge_alloc_ethofld_txq(struct adapter *adap, struct sge_eohw_txq *txq,
{
int ret;
- ret = t4_sge_alloc_ofld_txq(adap, &txq->q, dev, FW_EQ_OFLD_CMD, iqid);
+ ret = t4_sge_alloc_ofld_txq(adap, &txq->q, dev, FW_EQ_OFLD_CMD, iqid,
+ 0);
if (ret)
return ret;
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
index 7bd0c0d8a73c..778b2341e74a 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
@@ -1346,6 +1346,7 @@ enum fw_params_param_dev {
FW_PARAMS_PARAM_DEV_NUM_TM_CLASS = 0x2B,
FW_PARAMS_PARAM_DEV_FILTER = 0x2E,
FW_PARAMS_PARAM_DEV_KTLS_HW = 0x31,
+ FW_PARAMS_PARAM_DEV_TID_QID_SEL_MASK = 0x33,
};
/*
@@ -2139,6 +2140,10 @@ struct fw_eq_ofld_cmd {
#define FW_EQ_OFLD_CMD_EQSTART_V(x) ((x) << FW_EQ_OFLD_CMD_EQSTART_S)
#define FW_EQ_OFLD_CMD_EQSTART_F FW_EQ_OFLD_CMD_EQSTART_V(1U)
+#define FW_EQ_OFLD_CMD_COREGROUP_S 16
+#define FW_EQ_OFLD_CMD_COREGROUP_M 0x3f
+#define FW_EQ_OFLD_CMD_COREGROUP_V(x) ((x) << FW_EQ_OFLD_CMD_COREGROUP_S)
+
#define FW_EQ_OFLD_CMD_EQSTOP_S 27
#define FW_EQ_OFLD_CMD_EQSTOP_V(x) ((x) << FW_EQ_OFLD_CMD_EQSTOP_S)
#define FW_EQ_OFLD_CMD_EQSTOP_F FW_EQ_OFLD_CMD_EQSTOP_V(1U)
--
2.39.1
prev parent reply other threads:[~2026-10-05 13:21 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-05 22:48 [PATCH net-next v3 00/12] cxgb4: Add T7 adapter support Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 01/12] cxgb4: add T7 hardware definitions and firmware interfaces Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 02/12] cxgb4: rework the interrupt handling framework Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 03/12] cxgb4: add T7 hardware management support Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 04/12] cxgb4: move PCI device management into cxgb4_pci.c and rework driver helpers Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 05/12] cxgb4: add T7 support to the main driver Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 06/12] cxgb4: update PTP register access for T7 Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 07/12] cxgb4: extend ethtool support for T7 adapters Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 08/12] cxgb4: Add T7 support to the filter infrastructure Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 09/12] cxgb4: Add indirect register definitions for T7 Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 10/12] cxgb4: extend CUDBG support for T7 adapters Potnuri Bharat Teja
2026-10-05 22:48 ` [PATCH net-next v3 11/12] cxgb4: extend debugfs " Potnuri Bharat Teja
2026-10-05 22:48 ` Potnuri Bharat Teja [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261005224830.377752-13-bharat@chelsio.com \
--to=bharat@chelsio.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox