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