From owner-p4-projects@FreeBSD.ORG Mon Jan 7 21:28:55 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BBE6816A421; Mon, 7 Jan 2008 21:28:55 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8013D16A418 for ; Mon, 7 Jan 2008 21:28:55 +0000 (UTC) (envelope-from swise@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 5EB6113C458 for ; Mon, 7 Jan 2008 21:28:55 +0000 (UTC) (envelope-from swise@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m07LStK6043959 for ; Mon, 7 Jan 2008 21:28:55 GMT (envelope-from swise@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m07LSsap043956 for perforce@freebsd.org; Mon, 7 Jan 2008 21:28:54 GMT (envelope-from swise@FreeBSD.org) Date: Mon, 7 Jan 2008 21:28:54 GMT Message-Id: <200801072128.m07LSsap043956@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to swise@FreeBSD.org using -f From: Steve Wise To: Perforce Change Reviews Cc: Subject: PERFORCE change 132741 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Jan 2008 21:28:56 -0000 http://perforce.freebsd.org/chv.cgi?CH=132741 Change 132741 by swise@swise:vic10:iwarp on 2008/01/07 21:28:08 Sending mpa start response. Lots of fixes: - go back to negative errnos for now because otherwise it breaks the logic in several places - 4.7.1 debug firmware support - 4.3+ connection transition support - use msleep and wakeup as needed to support interrupt-level callbacks Affected files ... .. //depot/projects/iwarp/sys/dev/cxgb/common/cxgb_common.h#2 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_hal.c#5 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_hal.h#5 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_resource.c#3 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_wr.h#4 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch.c#4 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch.h#3 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#5 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.h#3 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cq.c#2 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_ev.c#2 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_mem.c#2 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_provider.c#4 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_provider.h#3 edit .. //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_qp.c#2 edit .. //depot/projects/iwarp/sys/modules/cxgb/cxgb/Makefile#3 edit Differences ... ==== //depot/projects/iwarp/sys/dev/cxgb/common/cxgb_common.h#2 (text+ko) ==== @@ -100,7 +100,7 @@ enum { FW_VERSION_MAJOR = 4, FW_VERSION_MINOR = 7, - FW_VERSION_MICRO = 0 + FW_VERSION_MICRO = 1 }; enum { ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_hal.c#5 (text+ko) ==== @@ -152,7 +152,7 @@ BUG_ON(1); log(LOG_ERR, "%s: stalled rnic\n", rdev_p->dev_name); - return (EIO); + return (-EIO); } } @@ -183,7 +183,7 @@ struct mbuf *skb = m_gethdr(MT_DATA, M_WAITOK); if (!skb) { PDBG("%s alloc_skb failed\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } wqe = (struct t3_modify_qp_wr *) mbuf_put(skb, sizeof(*wqe)); memset(wqe, 0, sizeof(*wqe)); @@ -192,6 +192,8 @@ sge_cmd = qpid << 8 | 3; wqe->sge_cmd = cpu_to_be64(sge_cmd); m_set_priority(skb, CPL_PRIORITY_CONTROL); + m_set_sgl(skb, NULL); + m_set_sgllen(skb, 0); return (cxgb_ofld_send(rdev_p->t3cdev_p, skb)); } @@ -203,17 +205,17 @@ cq->cqid = cxio_hal_get_cqid(rdev_p->rscp); if (!cq->cqid) - return (ENOMEM); + return (-ENOMEM); cq->sw_queue = malloc(size, M_DEVBUF, M_WAITOK|M_ZERO); if (!cq->sw_queue) - return (ENOMEM); + return (-ENOMEM); cq->queue = dma_alloc_coherent(rdev_p->rnic_info.pdev, (1UL << (cq->size_log2)) * sizeof(struct t3_cqe), &(cq->dma_addr), M_WAITOK); if (!cq->queue) { free(cq->sw_queue, M_DEVBUF); - return (ENOMEM); + return (-ENOMEM); } pci_unmap_addr_set(cq, mapping, cq->dma_addr); memset(cq->queue, 0, size); @@ -319,7 +321,7 @@ wq->qpid = get_qpid(rdev_p, uctx); if (!wq->qpid) - return (ENOMEM); + return (-ENOMEM); wq->rq = malloc(depth * sizeof(u64), M_DEVBUF, M_WAITOK|M_ZERO); if (!wq->rq) @@ -356,7 +358,7 @@ free(wq->rq, M_DEVBUF); err1: put_qpid(rdev_p, wq->qpid, uctx); - return (ENOMEM); + return (-ENOMEM); } int @@ -563,7 +565,7 @@ skb = m_gethdr(MT_DATA, M_WAITOK); if (!skb) { PDBG("%s alloc_skb failed\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } err = cxio_hal_init_ctrl_cq(rdev_p); if (err) { @@ -578,7 +580,7 @@ M_WAITOK); if (!rdev_p->ctrl_qp.workq) { PDBG("%s dma_alloc_coherent failed\n", __FUNCTION__); - err = ENOMEM; + err = -ENOMEM; goto err; } pci_unmap_addr_set(&rdev_p->ctrl_qp, mapping, @@ -587,8 +589,8 @@ memset(rdev_p->ctrl_qp.workq, 0, (1 << T3_CTRL_QP_SIZE_LOG2) * sizeof(union t3_wr)); - mtx_init(&rdev_p->ctrl_qp.lock, "ctrl-qp lock", NULL, MTX_DEF|MTX_DUPOK); - cv_init(&rdev_p->ctrl_qp.waitq, "ctrl-qp wait"); + mtx_init(&rdev_p->ctrl_qp.lock, "ctrl-qp lock", NULL, + MTX_SPIN|MTX_DUPOK); /* update HW Ctrl QP context */ base_addr = rdev_p->ctrl_qp.dma_addr; @@ -616,6 +618,8 @@ (unsigned long long) rdev_p->ctrl_qp.dma_addr, rdev_p->ctrl_qp.workq, 1 << T3_CTRL_QP_SIZE_LOG2); m_set_priority(skb, CPL_PRIORITY_CONTROL); + m_set_sgl(skb, NULL); + m_set_sgllen(skb, 0); return (cxgb_ofld_send(rdev_p->t3cdev_p, skb)); err: m_free(skb); @@ -658,11 +662,14 @@ PDBG("%s ctrl_qp full wtpr 0x%0x rptr 0x%0x, " "wait for more space i %d\n", __FUNCTION__, rdev_p->ctrl_qp.wptr, rdev_p->ctrl_qp.rptr, i); - if (wait_event_interruptible(&rdev_p->ctrl_qp.waitq, - &rdev_p->ctrl_qp.lock)) { + if (cxio_wait(&rdev_p->ctrl_qp, + &rdev_p->ctrl_qp.lock, + !Q_FULL(rdev_p->ctrl_qp.rptr, + rdev_p->ctrl_qp.wptr, + T3_CTRL_QP_SIZE_LOG2))) { PDBG("%s ctrl_qp workq interrupted\n", __FUNCTION__); - return (ERESTART); + return (-ERESTART); } PDBG("%s ctrl_qp wakeup, continue posting work request " "i %d\n", __FUNCTION__, i); @@ -755,7 +762,7 @@ if ((!reset_tpt_entry) && !(*stag != T3_STAG_UNSET)) { stag_idx = cxio_hal_get_stag(rdev_p->rscp); if (!stag_idx) - return (ENOMEM); + return (-ENOMEM); *stag = (stag_idx << 8) | ((*stag) & 0xFF); } PDBG("%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n", @@ -766,11 +773,11 @@ else if (!rereg) { *pbl_addr = cxio_hal_pblpool_alloc(rdev_p, *pbl_size << 3); if (!*pbl_addr) { - return (ENOMEM); + return (-ENOMEM); } } - mtx_lock(&rdev_p->ctrl_qp.lock); + mtx_lock_spin(&rdev_p->ctrl_qp.lock); /* write PBL first if any - update pbl only if pbl list exist */ if (pbl) { @@ -817,10 +824,12 @@ cxio_hal_put_stag(rdev_p->rscp, stag_idx); ret: wptr = rdev_p->ctrl_qp.wptr; - mtx_unlock(&rdev_p->ctrl_qp.lock); + mtx_unlock_spin(&rdev_p->ctrl_qp.lock); if (!err) - if (wait_event_interruptible(&rdev_p->ctrl_qp.waitq, &rdev_p->ctrl_qp.lock)) - return (ERESTART); + if (cxio_wait(&rdev_p->ctrl_qp, + &rdev_p->ctrl_qp.lock, + SEQ32_GE(rdev_p->ctrl_qp.rptr, wptr))) + return (-ERESTART); return err; } @@ -875,7 +884,7 @@ struct t3_rdma_init_wr *wqe; struct mbuf *skb = m_gethdr(MT_DATA, M_NOWAIT); if (!skb) - return (ENOMEM); + return (-ENOMEM); PDBG("%s rdev_p %p\n", __FUNCTION__, rdev_p); wqe = (struct t3_rdma_init_wr *) mbuf_put(skb, sizeof(*wqe)); wqe->wrh.op_seop_flags = cpu_to_be32(V_FW_RIWR_OP(T3_WR_INIT)); @@ -896,8 +905,10 @@ wqe->ird = cpu_to_be32(attr->ird); wqe->qp_dma_addr = cpu_to_be64(attr->qp_dma_addr); wqe->qp_dma_size = cpu_to_be32(attr->qp_dma_size); - wqe->rsvd = 0; + wqe->irs = cpu_to_be32(attr->irs); m_set_priority(skb, 0); /* 0=>ToeQ; 1=>CtrlQ */ + m_set_sgl(skb, NULL); + m_set_sgllen(skb, 0); return (cxgb_ofld_send(rdev_p->t3cdev_p, skb)); } @@ -939,8 +950,10 @@ return 0; } if (CQE_QPID(rsp_msg->cqe) == T3_CTRL_QP_ID) { + mtx_lock_spin(&rdev_p->ctrl_qp.lock); rdev_p->ctrl_qp.rptr = CQE_WRID_LOW(rsp_msg->cqe) + 1; - wake_up(&rdev_p->ctrl_qp.waitq, &rdev_p->ctrl_qp.lock); + wakeup(&rdev_p->ctrl_qp); + mtx_unlock_spin(&rdev_p->ctrl_qp.lock); m_free(m); } else if (CQE_QPID(rsp_msg->cqe) == 0xfff8) m_free(m); @@ -961,21 +974,21 @@ if (strlen(rdev_p->dev_name)) { if (cxio_hal_find_rdev_by_name(rdev_p->dev_name)) { - return (EBUSY); + return (-EBUSY); } ifp = rdev_p->ifp; if (ifp == NULL) - return (EINVAL); + return (-EINVAL); if_free(ifp); } else if (rdev_p->t3cdev_p) { if (cxio_hal_find_rdev_by_t3cdev(rdev_p->t3cdev_p)) - return (EBUSY); + return (-EBUSY); ifp = rdev_p->t3cdev_p->lldev; strncpy(rdev_p->dev_name, rdev_p->t3cdev_p->name, T3_MAX_DEV_NAME_LEN); } else { PDBG("%s t3cdev_p or dev_name must be set\n", __FUNCTION__); - return (EINVAL); + return (-EINVAL); } TAILQ_INSERT_TAIL(&rdev_list, rdev_p, entry); @@ -1081,7 +1094,7 @@ TAILQ_INIT(&rdev_list); #ifdef needed if (cxio_hal_init_rhdl_resource(T3_MAX_NUM_RI)) - return (ENOMEM); + return (-ENOMEM); #endif t3_register_cpl_handler(CPL_ASYNC_NOTIF, cxio_hal_ev_handler); return 0; ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_hal.h#5 (text+ko) ==== @@ -26,7 +26,6 @@ u32 wptr; u32 rptr; struct mtx lock; /* for the wtpr, can sleep */ - struct cv waitq;/* wait for RspQ/CQE msg */ #ifdef notyet DECLARE_PCI_UNMAP_ADDR(mapping) #endif @@ -257,6 +256,22 @@ return (gp->gen_base + blkno); } +#define cxio_wait(ctx, lockp, cond) \ +({ \ + int __ret = 0; \ + mtx_lock_spin(lockp); \ + while (!cond) { \ + msleep_spin(ctx, lockp, "cxio_wait", hz); \ + if (SIGPENDING(curthread)) { \ + __ret = ERESTART; \ + break; \ + } \ + } \ + mtx_unlock_spin(lockp); \ + __ret; \ +}) + + static __inline void gen_pool_free(struct gen_pool *gp, daddr_t address, int size) { ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_resource.c#3 (text+ko) ==== @@ -107,7 +107,7 @@ *fifo = buf_ring_alloc(nr, M_WAITOK); if (*fifo == NULL) - return (ENOMEM); + return (-ENOMEM); #if 0 for (i = 0; i < skip_low + skip_high; i++) { u32 entry = 0; @@ -166,7 +166,7 @@ rdev_p->rscp->qpid_fifo = buf_ring_alloc(T3_MAX_NUM_QP, M_WAITOK); if (rdev_p->rscp->qpid_fifo == NULL) - return (ENOMEM); + return (-ENOMEM); for (i = 16; i < T3_MAX_NUM_QP; i++) if (!(i & rdev_p->qpmask)) @@ -197,7 +197,7 @@ rscp = malloc(sizeof(*rscp), M_DEVBUF, M_WAITOK|M_ZERO); if (!rscp) - return (ENOMEM); + return (-ENOMEM); rdev_p->rscp = rscp; err = cxio_init_resource_fifo_random(&rscp->tpt_fifo, &rscp->tpt_fifo_lock, @@ -223,7 +223,7 @@ qpid_err: buf_ring_free(rscp->tpt_fifo); tpt_err: - return (ENOMEM); + return (-ENOMEM); } /* @@ -331,7 +331,7 @@ gen_pool_add(rdev_p->pbl_pool, i, PBL_CHUNK, -1); } #endif - return rdev_p->pbl_pool ? 0 : (ENOMEM); + return rdev_p->pbl_pool ? 0 : (-ENOMEM); } void cxio_hal_pblpool_destroy(struct cxio_rdev *rdev_p) @@ -374,7 +374,7 @@ gen_pool_add(rdev_p->rqt_pool, i, RQT_CHUNK, -1); } #endif - return rdev_p->rqt_pool ? 0 : (ENOMEM); + return rdev_p->rqt_pool ? 0 : (-ENOMEM); } void cxio_hal_rqtpool_destroy(struct cxio_rdev *rdev_p) ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cxio_wr.h#4 (text+ko) ==== @@ -257,6 +257,7 @@ u64 qp_dma_addr; u32 qp_dma_size; u32 flags; + u32 irs; }; struct t3_rdma_init_wr { @@ -277,7 +278,7 @@ __be32 ird; __be64 qp_dma_addr; /* 7 */ __be32 qp_dma_size; /* 8 */ - u32 rsvd; + u32 irs; }; struct t3_genbit { ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch.c#4 (text+ko) ==== @@ -105,7 +105,7 @@ idr_init(&rnicp->cqidr); idr_init(&rnicp->qpidr); idr_init(&rnicp->mmidr); - mtx_init(&rnicp->lock, "iwch rnic lock", NULL, MTX_DEF|MTX_DUPOK); + mtx_init(&rnicp->lock, "iwch rnic lock", NULL, MTX_SPIN|MTX_DUPOK); rnicp->attr.vendor_id = 0x168; rnicp->attr.vendor_part_id = 7; ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch.h#3 (text+ko) ==== @@ -148,10 +148,10 @@ if (!idr_pre_get(idr, M_NOWAIT)) { return -ENOMEM; } - mtx_lock(&rhp->lock); + mtx_lock_spin(&rhp->lock); ret = idr_get_new_above(idr, handle, id, &newid); BUG_ON(newid != id); - mtx_unlock(&rhp->lock); + mtx_unlock_spin(&rhp->lock); } while (ret == -EAGAIN); return ret; @@ -159,9 +159,9 @@ static inline void remove_handle(struct iwch_dev *rhp, struct idr *idr, u32 id) { - mtx_lock(&rhp->lock); + mtx_lock_spin(&rhp->lock); idr_remove(idr, id); - mtx_unlock(&rhp->lock); + mtx_unlock_spin(&rhp->lock); } extern struct cxgb_client t3c_client; ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.c#5 (text+ko) ==== @@ -199,7 +199,7 @@ struct mbuf *m = get_mbuf(NULL, sizeof(*req), M_NOWAIT); if (m == NULL) - return (ENOMEM); + return (-ENOMEM); req = (struct cpl_set_tcb_field *) mbuf_put(m, sizeof(*req)); req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); @@ -222,7 +222,7 @@ struct mbuf *m = get_mbuf(NULL, sizeof(*req), M_NOWAIT); if (m == NULL) - return (ENOMEM); + return (-ENOMEM); req = (struct cpl_set_tcb_field *) mbuf_put(m, sizeof(*req)); req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); @@ -288,6 +288,7 @@ memset(epc, 0, size); refcount_init(&epc->refcount, 1); mtx_init(&epc->lock, "iwch_epc lock", NULL, MTX_DEF); + cv_init(&epc->waitq, "iwch_epc cv"); } PDBG("%s alloc ep %p\n", __FUNCTION__, epc); return epc; @@ -322,7 +323,7 @@ while ((m = mbufq_dequeue(&rxq))) { ep = m->m_pkthdr.rcvif; tdev = (struct t3cdev *)m->m_pkthdr.header; - PDBG("%s dequeued mbuf %p ep %p tdev %p\n", __FUNCTION__, m, ep, tdev); + PDBG("%s dequeued mbuf %p ep %p tdev %p opcode %u\n", __FUNCTION__, m, ep, tdev, G_OPCODE(ntohl(m->m_pkthdr.csum_data))); ret = work_handlers[G_OPCODE(ntohl(m->m_pkthdr.csum_data))](tdev, m, ep); if (ret & CPL_RET_BUF_DONE) m_free(m); @@ -341,17 +342,17 @@ case CPL_ERR_NONE: return 0; case CPL_ERR_CONN_RESET: - return (ECONNRESET); + return (-ECONNRESET); case CPL_ERR_ARP_MISS: - return (EHOSTUNREACH); + return (-EHOSTUNREACH); case CPL_ERR_CONN_TIMEDOUT: - return (ETIMEDOUT); + return (-ETIMEDOUT); case CPL_ERR_TCAM_FULL: - return (ENOMEM); + return (-ENOMEM); case CPL_ERR_CONN_EXIST: - return (EADDRINUSE); + return (-EADDRINUSE); default: - return (EIO); + return (-EIO); } } @@ -369,6 +370,8 @@ */ m = m_gethdr(MT_DATA, M_DONTWAIT); } + m_set_sgl(m, NULL); + m_set_sgllen(m, 0); return (m); } @@ -440,7 +443,7 @@ m = get_mbuf(NULL, sizeof(*req), flags); if (m == NULL) { printf("%s - failed to alloc mbuf\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } m_set_priority(m, CPL_PRIORITY_DATA); set_arp_failure_handler(m, arp_failure_discard); @@ -462,7 +465,7 @@ if (m == NULL) { printf("%s - failed to alloc mbuf.\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } m_set_priority(m, CPL_PRIORITY_DATA); set_arp_failure_handler(m, abort_arp_failure); @@ -490,7 +493,7 @@ if (m == NULL) { printf("%s - failed to alloc mbuf.\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } mtu_idx = find_best_mtu(T3C_DATA(ep->com.tdev), dst_mtu(ep->dst)); wscale = compute_wscale(rcv_win); @@ -569,7 +572,7 @@ req->len = htonl(len); req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) | V_TX_SNDBUF(snd_win>>15)); - req->flags = htonl(F_TX_IMM_ACK|F_TX_INIT); + req->flags = htonl(F_TX_INIT); req->sndseq = htonl(ep->snd_seq); BUG_ON(ep->mpa_mbuf); ep->mpa_mbuf = m; @@ -594,7 +597,7 @@ m = get_mbuf(NULL, mpalen + sizeof(*req), M_NOWAIT); if (m == NULL) { printf("%s - cannot alloc mbuf!\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } req = (struct tx_data_wr *)mbuf_put(m, sizeof(*req)); mpa = (struct mpa_message *) mbuf_put(m, mpalen); @@ -613,7 +616,7 @@ req->len = htonl(mpalen); req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) | V_TX_SNDBUF(snd_win>>15)); - req->flags = htonl(F_TX_IMM_ACK|F_TX_INIT); + req->flags = htonl(F_TX_INIT); req->sndseq = htonl(ep->snd_seq); BUG_ON(ep->mpa_mbuf); ep->mpa_mbuf = m; @@ -637,7 +640,7 @@ m = get_mbuf(NULL, mpalen + sizeof(*req), M_NOWAIT); if (m == NULL) { printf("%s - cannot alloc mbuf!\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } m_set_priority(m, CPL_PRIORITY_DATA); req = (struct tx_data_wr *)mbuf_put(m, sizeof(*req)); @@ -658,7 +661,7 @@ req->len = htonl(len); req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) | V_TX_SNDBUF(snd_win>>15)); - req->flags = htonl(F_TX_MORE | F_TX_IMM_ACK | F_TX_INIT); + req->flags = htonl(F_TX_INIT); req->sndseq = htonl(ep->snd_seq); ep->mpa_mbuf = m; state_set(&ep->com, MPA_REP_SENT); @@ -680,6 +683,7 @@ cxgb_insert_tid(ep->com.tdev, &t3c_client, ep, tid); ep->snd_seq = ntohl(req->snd_isn); + ep->rcv_seq = ntohl(req->rcv_isn); set_emss(ep, ntohs(req->tcp_opt)); @@ -862,7 +866,7 @@ * then we must fail this connection. */ if (ep->mpa_pkt_len + m->m_len > sizeof(ep->mpa_pkt)) { - err = (EINVAL); + err = (-EINVAL); goto err; } @@ -1087,6 +1091,9 @@ */ m->m_pkthdr.len = m->m_len = dlen; + ep->rcv_seq += dlen; + BUG_ON(ep->rcv_seq != (ntohl(hdr->seq) + dlen)); + switch (state_read(&ep->com)) { case MPA_REQ_SENT: process_mpa_reply(ep, m); @@ -1125,7 +1132,6 @@ struct iwch_ep *ep = ctx; struct cpl_wr_ack *hdr = cplhdr(m); unsigned int credits = ntohs(hdr->credits); - enum iwch_qp_attr_mask mask; PDBG("%s ep %p credits %u\n", __FUNCTION__, ep, credits); @@ -1137,32 +1143,8 @@ ep->mpa_mbuf = NULL; if (state_read(&ep->com) == MPA_REP_SENT) { - struct iwch_qp_attributes attrs; - - /* bind QP to EP and move to RTS */ - attrs.mpa_attr = ep->mpa_attr; - attrs.max_ird = ep->ord; - attrs.max_ord = ep->ord; - attrs.llp_stream_handle = ep; - attrs.next_state = IWCH_QP_STATE_RTS; - - /* bind QP and TID with INIT_WR */ - mask = IWCH_QP_ATTR_NEXT_STATE | - IWCH_QP_ATTR_LLP_STREAM_HANDLE | - IWCH_QP_ATTR_MPA_ATTR | - IWCH_QP_ATTR_MAX_IRD | - IWCH_QP_ATTR_MAX_ORD; - - ep->com.rpl_err = iwch_modify_qp(ep->com.qp->rhp, - ep->com.qp, mask, &attrs, 1); - - if (!ep->com.rpl_err) { - state_set(&ep->com, FPDU_MODE); - established_upcall(ep); - } - PDBG("waking up ep %p\n", ep); - wake_up(&ep->com.waitq, &ep->com.lock); + iwch_wakeup(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); } return CPL_RET_BUF_DONE; } @@ -1217,7 +1199,7 @@ m = get_mbuf(NULL, sizeof(*req), M_NOWAIT); if (m == NULL) { printf("t3c_listen_start failed to alloc mbuf!\n"); - return (ENOMEM); + return (-ENOMEM); } req = (struct cpl_pass_open_req *) mbuf_put(m, sizeof(*req)); @@ -1245,7 +1227,7 @@ PDBG("%s ep %p status %d error %d\n", __FUNCTION__, ep, rpl->status, status2errno(rpl->status)); ep->com.rpl_err = status2errno(rpl->status); - wake_up(&ep->com.waitq, &ep->com.lock); + iwch_wakeup(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); return CPL_RET_BUF_DONE; } @@ -1260,7 +1242,7 @@ m = get_mbuf(NULL, sizeof(*req), M_NOWAIT); if (m == NULL) { printf("%s - failed to alloc mbuf\n", __FUNCTION__); - return (ENOMEM); + return (-ENOMEM); } req = (struct cpl_close_listserv_req *) mbuf_put(m, sizeof(*req)); req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); @@ -1279,7 +1261,7 @@ PDBG("%s ep %p\n", __FUNCTION__, ep); ep->com.rpl_err = status2errno(rpl->status); - wake_up(&ep->com.waitq, &ep->com.lock); + iwch_wakeup(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); return CPL_RET_BUF_DONE; } @@ -1447,6 +1429,7 @@ PDBG("%s ep %p\n", __FUNCTION__, ep); ep->snd_seq = ntohl(req->snd_isn); + ep->rcv_seq = ntohl(req->rcv_isn); set_emss(ep, ntohs(req->tcp_opt)); @@ -1489,7 +1472,7 @@ __state_set(&ep->com, CLOSING); ep->com.rpl_err = ECONNRESET; PDBG("waking up ep %p\n", ep); - wake_up(&ep->com.waitq, &ep->com.lock); + iwch_wakeup(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); break; case FPDU_MODE: start_ep_timer(ep); @@ -1584,7 +1567,7 @@ case MPA_REP_SENT: ep->com.rpl_err = ECONNRESET; PDBG("waking up ep %p\n", ep); - wake_up(&ep->com.waitq, &ep->com.lock); + iwch_wakeup(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); break; case MPA_REQ_RCVD: @@ -1781,7 +1764,7 @@ if (state_read(&ep->com) == DEAD) { put_ep(&ep->com); - return (ECONNRESET); + return (-ECONNRESET); } BUG_ON(state_read(&ep->com) != MPA_REQ_RCVD); if (mpa_rev == 0) @@ -1804,10 +1787,8 @@ struct iwch_qp *qp = get_qhp(h, conn_param->qpn); PDBG("%s ep %p tid %u\n", __FUNCTION__, ep, ep->hwtid); - if (state_read(&ep->com) == DEAD) { - put_ep(&ep->com); - return (ECONNRESET); - } + if (state_read(&ep->com) == DEAD) + return (-ECONNRESET); BUG_ON(state_read(&ep->com) != MPA_REQ_RCVD); BUG_ON(!qp); @@ -1815,7 +1796,7 @@ if ((conn_param->ord > qp->rhp->attr.max_rdma_read_qp_depth) || (conn_param->ird > qp->rhp->attr.max_rdma_reads_per_qp)) { abort_connection(ep, NULL, M_NOWAIT); - return (EINVAL); + return (-EINVAL); } cm_id->add_ref(cm_id); @@ -1823,20 +1804,11 @@ ep->com.qp = qp; ep->com.rpl_err = 0; + ep->com.rpl_done = 0; ep->ird = conn_param->ird; ep->ord = conn_param->ord; PDBG("%s %d ird %d ord %d\n", __FUNCTION__, __LINE__, ep->ird, ep->ord); get_ep(&ep->com); - err = send_mpa_reply(ep, conn_param->private_data, - conn_param->private_data_len); - if (err) { - ep->com.cm_id = NULL; - ep->com.qp = NULL; - cm_id->rem_ref(cm_id); - abort_connection(ep, NULL, M_NOWAIT); - put_ep(&ep->com); - return err; - } /* bind QP to EP and move to RTS */ attrs.mpa_attr = ep->mpa_attr; @@ -1855,15 +1827,28 @@ err = iwch_modify_qp(ep->com.qp->rhp, ep->com.qp, mask, &attrs, 1); - if (err) { - ep->com.cm_id = NULL; - ep->com.qp = NULL; - cm_id->rem_ref(cm_id); - abort_connection(ep, NULL, M_NOWAIT); - } else { - state_set(&ep->com, FPDU_MODE); - established_upcall(ep); - } + if (err) + goto err; + + err = send_mpa_reply(ep, conn_param->private_data, + conn_param->private_data_len); + if (err) + goto err; + + /* wait for wr_ack */ + iwch_wait(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); + err = ep->com.rpl_err; + if (err) + goto err; + + state_set(&ep->com, FPDU_MODE); + established_upcall(ep); + put_ep(&ep->com); + return 0; +err: + ep->com.cm_id = NULL; + ep->com.qp = NULL; + cm_id->rem_ref(cm_id); put_ep(&ep->com); return err; } @@ -1880,7 +1865,7 @@ ep = alloc_ep(sizeof(*ep), M_NOWAIT); if (!ep) { printf("%s - cannot alloc ep.\n", __FUNCTION__); - err = (ENOMEM); + err = (-ENOMEM); goto out; } callout_init(&ep->timer, TRUE); @@ -1991,7 +1976,7 @@ goto fail3; /* wait for pass_open_rpl */ - wait_event(&ep->com.waitq, &ep->com.lock); + iwch_wait(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); err = ep->com.rpl_err; if (!err) { cm_id->provider_data = ep; @@ -2016,8 +2001,9 @@ state_set(&ep->com, DEAD); ep->com.rpl_err = 0; + ep->com.rpl_done = 0; err = listen_stop(ep); - wait_event(&ep->com.waitq, &ep->com.lock); + iwch_wait(&ep->com.waitq, &ep->com.lock, &ep->com.rpl_done); cxgb_free_stid(ep->com.tdev, ep->stid); err = ep->com.rpl_err; cm_id->rem_ref(cm_id); @@ -2143,7 +2129,7 @@ taskqueue_thread_enqueue, &mbuf_taskq); if (mbuf_taskq == NULL) { printf("failed to allocate iw_cxgb taskqueue\n"); - return (ENOMEM); + return (-ENOMEM); } taskqueue_start_threads(&mbuf_taskq, 1, PI_NET, "iw_cxgb taskq"); ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cm.h#3 (text+ko) ==== @@ -124,6 +124,7 @@ struct sockaddr_in local_addr; struct sockaddr_in remote_addr; int rpl_err; + int rpl_done; }; struct iwch_listen_ep { @@ -139,6 +140,7 @@ unsigned int atid; u32 hwtid; u32 snd_seq; + u32 rcv_seq; struct l2t_entry *l2t; struct rtentry *dst; struct mbuf *mpa_mbuf; @@ -173,32 +175,25 @@ } static __inline void -wait_event(struct cv *cv, struct mtx *lock) +iwch_wait(struct cv *cv, struct mtx *lock, int *rpl_done) { mtx_lock(lock); - cv_wait_unlock(cv, lock); + if (!*rpl_done) { + PDBG("sleeping for rpl_done\n"); + cv_wait_unlock(cv, lock); + } + PDBG("*rpl_done=%d\n", *rpl_done); } -static __inline int -wait_event_interruptible(struct cv *cv, struct mtx *lock) -{ - int err; - - mtx_lock(lock); - err = cv_wait_sig(cv, lock); - mtx_unlock(lock); - - return (err); -} - static __inline void -wake_up(struct cv *cv, struct mtx *lock) +iwch_wakeup(struct cv *cv, struct mtx *lock, int *rpl_done) { mtx_lock(lock); + *rpl_done=1; + PDBG("wakeup for rpl_done\n"); cv_broadcast(cv); mtx_unlock(lock); } - /* CM prototypes */ ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_cq.c#2 (text+ko) ==== @@ -93,9 +93,9 @@ * * Returns: * 0 cqe returned - * ENOBUFS EMPTY; - * EAGAIN caller must try again - * any other errno fatal error + * -ENOBUFS EMPTY; + * -EAGAIN caller must try again + * any other neg errno fatal error */ static int iwch_poll_cq_one(struct iwch_dev *rhp, struct iwch_cq *chp, struct ib_wc *wc) @@ -106,18 +106,18 @@ u32 credit = 0; u8 cqe_flushed; u64 cookie; - int ret = 0; + int ret = 1; rd_cqe = cxio_next_cqe(&chp->cq); if (!rd_cqe) - return (ENOBUFS); + return 0; qhp = get_qhp(rhp, CQE_QPID(*rd_cqe)); if (!qhp) wq = NULL; else { - mtx_lock(&qhp->lock); + mtx_lock_spin(&qhp->lock); wq = &(qhp->wq); } ret = cxio_poll_cq(wq, &(chp->cq), &cqe, &cqe_flushed, &cookie, @@ -129,10 +129,10 @@ } if (ret) { - ret = EAGAIN; + ret = -EAGAIN; goto out; } - ret = 0; + ret = 1; wc->wr_id = cookie; wc->qp = &qhp->ibqp; @@ -176,7 +176,7 @@ log(LOG_ERR, "Unexpected opcode %d " "in the CQE received for QPID=0x%0x\n", CQE_OPCODE(cqe), CQE_QPID(cqe)); - ret = EINVAL; + ret = -EINVAL; goto out; } } @@ -230,12 +230,12 @@ default: log(LOG_ERR, "Unexpected cqe_status 0x%x for " "QPID=0x%0x\n", CQE_STATUS(cqe), CQE_QPID(cqe)); - ret = EINVAL; + ret = -EINVAL; } } out: if (wq) - mtx_unlock(&qhp->lock); + mtx_unlock_spin(&qhp->lock); return ret; } @@ -249,7 +249,7 @@ chp = to_iwch_cq(ibcq); rhp = chp->rhp; - mtx_lock(&chp->lock); + mtx_lock_spin(&chp->lock); for (npolled = 0; npolled < num_entries; ++npolled) { #ifdef DEBUG int i=0; @@ -269,11 +269,11 @@ if (err <= 0) break; } - mtx_unlock(&chp->lock); + mtx_unlock_spin(&chp->lock); - if (err < 0) + if (err < 0) { return err; - else { + } else { return npolled; } } ==== //depot/projects/iwarp/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_iwch_ev.c#2 (text+ko) ==== @@ -88,32 +88,19 @@ #endif static void -post_qp_event(struct iwch_dev *rnicp, struct iwch_cq *chp, +post_qp_event(struct iwch_dev *rnicp, struct iwch_qp *qhp, struct iwch_cq *chp, struct respQ_msg_t *rsp_msg, enum ib_event_type ib_event, int send_term) >>> TRUNCATED FOR MAIL (1000 lines) <<<