PERFORCE change 132741 for review

Steve Wise swise at FreeBSD.org
Mon Jan 7 13:28:56 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=132741

Change 132741 by swise at 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) <<<


More information about the p4-projects mailing list