From owner-svn-src-all@FreeBSD.ORG Thu Aug 16 20:15:29 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id D3867106566B; Thu, 16 Aug 2012 20:15:29 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B4B068FC1A; Thu, 16 Aug 2012 20:15:29 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q7GKFTnK063771; Thu, 16 Aug 2012 20:15:29 GMT (envelope-from np@svn.freebsd.org) Received: (from np@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q7GKFTgU063766; Thu, 16 Aug 2012 20:15:29 GMT (envelope-from np@svn.freebsd.org) Message-Id: <201208162015.q7GKFTgU063766@svn.freebsd.org> From: Navdeep Parhar Date: Thu, 16 Aug 2012 20:15:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r239338 - in head/sys/dev/cxgbe: . tom X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 16 Aug 2012 20:15:29 -0000 Author: np Date: Thu Aug 16 20:15:29 2012 New Revision: 239338 URL: http://svn.freebsd.org/changeset/base/239338 Log: Add a routine (t4_set_tcb_field) to update arbitrary parts of a hardware TCB. Filters are programmed by modifying the TCB too (via a different routine) and the reply to any TCB update is delivered via a CPL_SET_TCB_RPL. Figure out whether the reply is for a filter-write or something else and route it appropriately. MFC after: 2 weeks Modified: head/sys/dev/cxgbe/adapter.h head/sys/dev/cxgbe/t4_main.c head/sys/dev/cxgbe/tom/t4_cpl_io.c head/sys/dev/cxgbe/tom/t4_tom.h Modified: head/sys/dev/cxgbe/adapter.h ============================================================================== --- head/sys/dev/cxgbe/adapter.h Thu Aug 16 19:22:34 2012 (r239337) +++ head/sys/dev/cxgbe/adapter.h Thu Aug 16 20:15:29 2012 (r239338) @@ -744,6 +744,7 @@ void t4_iterate(void (*)(struct adapter int t4_register_cpl_handler(struct adapter *, int, cpl_handler_t); int t4_register_an_handler(struct adapter *, an_handler_t); int t4_register_fw_msg_handler(struct adapter *, int, fw_msg_handler_t); +int t4_filter_rpl(struct sge_iq *, const struct rss_header *, struct mbuf *); /* t4_sge.c */ void t4_sge_modload(void); Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Thu Aug 16 19:22:34 2012 (r239337) +++ head/sys/dev/cxgbe/t4_main.c Thu Aug 16 20:15:29 2012 (r239338) @@ -346,8 +346,6 @@ static int del_filter(struct adapter *, static void clear_filter(struct filter_entry *); static int set_filter_wr(struct adapter *, int); static int del_filter_wr(struct adapter *, int); -static int filter_rpl(struct sge_iq *, const struct rss_header *, - struct mbuf *); static int get_sge_context(struct adapter *, struct t4_sge_context *); static int read_card_mem(struct adapter *, struct t4_mem_range *); #ifdef TCP_OFFLOAD @@ -465,7 +463,7 @@ t4_attach(device_t dev) sc->cpl_handler[i] = cpl_not_handled; for (i = 0; i < ARRAY_SIZE(sc->fw_msg_handler); i++) sc->fw_msg_handler[i] = fw_msg_not_handled; - t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, filter_rpl); + t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, t4_filter_rpl); /* Prepare the adapter for operation */ rc = -t4_prep_adapter(sc); @@ -5000,8 +4998,8 @@ del_filter_wr(struct adapter *sc, int fi return (0); } -static int -filter_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) +int +t4_filter_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) { struct adapter *sc = iq->adapter; const struct cpl_set_tcb_rpl *rpl = (const void *)(rss + 1); Modified: head/sys/dev/cxgbe/tom/t4_cpl_io.c ============================================================================== --- head/sys/dev/cxgbe/tom/t4_cpl_io.c Thu Aug 16 19:22:34 2012 (r239337) +++ head/sys/dev/cxgbe/tom/t4_cpl_io.c Thu Aug 16 20:15:29 2012 (r239338) @@ -1262,6 +1262,51 @@ do_fw4_ack(struct sge_iq *iq, const stru return (0); } +static int +do_set_tcb_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m) +{ + struct adapter *sc = iq->adapter; + const struct cpl_set_tcb_rpl *cpl = (const void *)(rss + 1); + unsigned int tid = GET_TID(cpl); +#ifdef INVARIANTS + unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl))); +#endif + + KASSERT(opcode == CPL_SET_TCB_RPL, + ("%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) + return (t4_filter_rpl(iq, rss, m)); /* TCB is a filter */ + + CXGBE_UNIMPLEMENTED(__func__); +} + +void +t4_set_tcb_field(struct adapter *sc, struct toepcb *toep, uint16_t word, + uint64_t mask, uint64_t val) +{ + struct wrqe *wr; + struct cpl_set_tcb_field *req; + + wr = alloc_wrqe(sizeof(*req), toep->ctrlq); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + req = wrtod(wr); + + INIT_TP_WR_MIT_CPL(req, CPL_SET_TCB_FIELD, toep->tid); + req->reply_ctrl = htobe16(V_NO_REPLY(1) | + V_QUEUENO(toep->ofld_rxq->iq.abs_id)); + req->word_cookie = htobe16(V_WORD(word) | V_COOKIE(0)); + req->mask = htobe64(mask); + req->val = htobe64(val); + + t4_wrq_tx(sc, wr); +} + void t4_init_cpl_io_handlers(struct adapter *sc) { @@ -1272,5 +1317,13 @@ t4_init_cpl_io_handlers(struct adapter * t4_register_cpl_handler(sc, CPL_ABORT_RPL_RSS, do_abort_rpl); t4_register_cpl_handler(sc, CPL_RX_DATA, do_rx_data); t4_register_cpl_handler(sc, CPL_FW4_ACK, do_fw4_ack); + t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, do_set_tcb_rpl); +} + +void +t4_uninit_cpl_io_handlers(struct adapter *sc) +{ + + t4_register_cpl_handler(sc, CPL_SET_TCB_RPL, t4_filter_rpl); } #endif Modified: head/sys/dev/cxgbe/tom/t4_tom.h ============================================================================== --- head/sys/dev/cxgbe/tom/t4_tom.h Thu Aug 16 19:22:34 2012 (r239337) +++ head/sys/dev/cxgbe/tom/t4_tom.h Thu Aug 16 20:15:29 2012 (r239338) @@ -236,6 +236,7 @@ void t4_offload_socket(struct toedev *, /* t4_cpl_io.c */ void t4_init_cpl_io_handlers(struct adapter *); +void t4_uninit_cpl_io_handlers(struct adapter *); void send_abort_rpl(struct adapter *, struct sge_wrq *, int , int); void send_flowc_wr(struct toepcb *, struct flowc_tx_params *); void send_reset(struct adapter *, struct toepcb *, uint32_t); @@ -244,5 +245,7 @@ void t4_rcvd(struct toedev *, struct tcp int t4_tod_output(struct toedev *, struct tcpcb *); int t4_send_fin(struct toedev *, struct tcpcb *); int t4_send_rst(struct toedev *, struct tcpcb *); +void t4_set_tcb_field(struct adapter *, struct toepcb *, uint16_t, uint64_t, + uint64_t); #endif