summaryrefslogtreecommitdiffstats
path: root/sys/dev/cxgbe/t4_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/cxgbe/t4_main.c')
-rw-r--r--sys/dev/cxgbe/t4_main.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 90e5001..18b813d 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -313,6 +313,7 @@ static void clear_filter(struct filter_entry *);
static int set_filter_wr(struct adapter *, int);
static int del_filter_wr(struct adapter *, int);
void filter_rpl(struct adapter *, const struct cpl_set_tcb_rpl *);
+static int get_sge_context(struct adapter *, struct t4_sge_context *);
static int t4_mod_event(module_t, int, void *);
struct t4_pciids {
@@ -3417,6 +3418,35 @@ filter_rpl(struct adapter *sc, const struct cpl_set_tcb_rpl *rpl)
}
}
+static int
+get_sge_context(struct adapter *sc, struct t4_sge_context *cntxt)
+{
+ int rc = EINVAL;
+
+ if (cntxt->cid > M_CTXTQID)
+ return (rc);
+
+ if (cntxt->mem_id != CTXT_EGRESS && cntxt->mem_id != CTXT_INGRESS &&
+ cntxt->mem_id != CTXT_FLM && cntxt->mem_id != CTXT_CNM)
+ return (rc);
+
+ if (sc->flags & FW_OK) {
+ ADAPTER_LOCK(sc); /* Avoid parallel t4_wr_mbox */
+ rc = -t4_sge_ctxt_rd(sc, sc->mbox, cntxt->cid, cntxt->mem_id,
+ &cntxt->data[0]);
+ ADAPTER_UNLOCK(sc);
+ }
+
+ if (rc != 0) {
+ /* Read via firmware failed or wasn't even attempted */
+
+ rc = -t4_sge_ctxt_rd_bd(sc, cntxt->cid, cntxt->mem_id,
+ &cntxt->data[0]);
+ }
+
+ return (rc);
+}
+
int
t4_os_find_pci_capability(struct adapter *sc, int cap)
{
@@ -3580,6 +3610,9 @@ t4_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data, int fflag,
rc = del_filter(sc, (struct t4_filter *)data);
ADAPTER_UNLOCK(sc);
break;
+ case CHELSIO_T4_GET_SGE_CONTEXT:
+ rc = get_sge_context(sc, (struct t4_sge_context *)data);
+ break;
default:
rc = EINVAL;
}
OpenPOWER on IntegriCloud