diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/cm.c')
-rw-r--r-- | drivers/infiniband/hw/cxgb4/cm.c | 178 |
1 files changed, 82 insertions, 96 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index 32d352a88d50..0dc62b1438be 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
@@ -117,9 +117,9 @@ static int rcv_win = 256 * 1024; | |||
117 | module_param(rcv_win, int, 0644); | 117 | module_param(rcv_win, int, 0644); |
118 | MODULE_PARM_DESC(rcv_win, "TCP receive window in bytes (default=256KB)"); | 118 | MODULE_PARM_DESC(rcv_win, "TCP receive window in bytes (default=256KB)"); |
119 | 119 | ||
120 | static int snd_win = 32 * 1024; | 120 | static int snd_win = 128 * 1024; |
121 | module_param(snd_win, int, 0644); | 121 | module_param(snd_win, int, 0644); |
122 | MODULE_PARM_DESC(snd_win, "TCP send window in bytes (default=32KB)"); | 122 | MODULE_PARM_DESC(snd_win, "TCP send window in bytes (default=128KB)"); |
123 | 123 | ||
124 | static struct workqueue_struct *workq; | 124 | static struct workqueue_struct *workq; |
125 | 125 | ||
@@ -172,7 +172,7 @@ static int c4iw_l2t_send(struct c4iw_rdev *rdev, struct sk_buff *skb, | |||
172 | error = cxgb4_l2t_send(rdev->lldi.ports[0], skb, l2e); | 172 | error = cxgb4_l2t_send(rdev->lldi.ports[0], skb, l2e); |
173 | if (error < 0) | 173 | if (error < 0) |
174 | kfree_skb(skb); | 174 | kfree_skb(skb); |
175 | return error; | 175 | return error < 0 ? error : 0; |
176 | } | 176 | } |
177 | 177 | ||
178 | int c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb) | 178 | int c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb) |
@@ -187,7 +187,7 @@ int c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb) | |||
187 | error = cxgb4_ofld_send(rdev->lldi.ports[0], skb); | 187 | error = cxgb4_ofld_send(rdev->lldi.ports[0], skb); |
188 | if (error < 0) | 188 | if (error < 0) |
189 | kfree_skb(skb); | 189 | kfree_skb(skb); |
190 | return error; | 190 | return error < 0 ? error : 0; |
191 | } | 191 | } |
192 | 192 | ||
193 | static void release_tid(struct c4iw_rdev *rdev, u32 hwtid, struct sk_buff *skb) | 193 | static void release_tid(struct c4iw_rdev *rdev, u32 hwtid, struct sk_buff *skb) |
@@ -219,12 +219,11 @@ static void set_emss(struct c4iw_ep *ep, u16 opt) | |||
219 | 219 | ||
220 | static enum c4iw_ep_state state_read(struct c4iw_ep_common *epc) | 220 | static enum c4iw_ep_state state_read(struct c4iw_ep_common *epc) |
221 | { | 221 | { |
222 | unsigned long flags; | ||
223 | enum c4iw_ep_state state; | 222 | enum c4iw_ep_state state; |
224 | 223 | ||
225 | spin_lock_irqsave(&epc->lock, flags); | 224 | mutex_lock(&epc->mutex); |
226 | state = epc->state; | 225 | state = epc->state; |
227 | spin_unlock_irqrestore(&epc->lock, flags); | 226 | mutex_unlock(&epc->mutex); |
228 | return state; | 227 | return state; |
229 | } | 228 | } |
230 | 229 | ||
@@ -235,12 +234,10 @@ static void __state_set(struct c4iw_ep_common *epc, enum c4iw_ep_state new) | |||
235 | 234 | ||
236 | static void state_set(struct c4iw_ep_common *epc, enum c4iw_ep_state new) | 235 | static void state_set(struct c4iw_ep_common *epc, enum c4iw_ep_state new) |
237 | { | 236 | { |
238 | unsigned long flags; | 237 | mutex_lock(&epc->mutex); |
239 | |||
240 | spin_lock_irqsave(&epc->lock, flags); | ||
241 | PDBG("%s - %s -> %s\n", __func__, states[epc->state], states[new]); | 238 | PDBG("%s - %s -> %s\n", __func__, states[epc->state], states[new]); |
242 | __state_set(epc, new); | 239 | __state_set(epc, new); |
243 | spin_unlock_irqrestore(&epc->lock, flags); | 240 | mutex_unlock(&epc->mutex); |
244 | return; | 241 | return; |
245 | } | 242 | } |
246 | 243 | ||
@@ -251,8 +248,8 @@ static void *alloc_ep(int size, gfp_t gfp) | |||
251 | epc = kzalloc(size, gfp); | 248 | epc = kzalloc(size, gfp); |
252 | if (epc) { | 249 | if (epc) { |
253 | kref_init(&epc->kref); | 250 | kref_init(&epc->kref); |
254 | spin_lock_init(&epc->lock); | 251 | mutex_init(&epc->mutex); |
255 | init_waitqueue_head(&epc->waitq); | 252 | c4iw_init_wr_wait(&epc->wr_wait); |
256 | } | 253 | } |
257 | PDBG("%s alloc ep %p\n", __func__, epc); | 254 | PDBG("%s alloc ep %p\n", __func__, epc); |
258 | return epc; | 255 | return epc; |
@@ -1131,7 +1128,6 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1131 | { | 1128 | { |
1132 | struct c4iw_ep *ep; | 1129 | struct c4iw_ep *ep; |
1133 | struct cpl_abort_rpl_rss *rpl = cplhdr(skb); | 1130 | struct cpl_abort_rpl_rss *rpl = cplhdr(skb); |
1134 | unsigned long flags; | ||
1135 | int release = 0; | 1131 | int release = 0; |
1136 | unsigned int tid = GET_TID(rpl); | 1132 | unsigned int tid = GET_TID(rpl); |
1137 | struct tid_info *t = dev->rdev.lldi.tids; | 1133 | struct tid_info *t = dev->rdev.lldi.tids; |
@@ -1139,7 +1135,7 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1139 | ep = lookup_tid(t, tid); | 1135 | ep = lookup_tid(t, tid); |
1140 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | 1136 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); |
1141 | BUG_ON(!ep); | 1137 | BUG_ON(!ep); |
1142 | spin_lock_irqsave(&ep->com.lock, flags); | 1138 | mutex_lock(&ep->com.mutex); |
1143 | switch (ep->com.state) { | 1139 | switch (ep->com.state) { |
1144 | case ABORTING: | 1140 | case ABORTING: |
1145 | __state_set(&ep->com, DEAD); | 1141 | __state_set(&ep->com, DEAD); |
@@ -1150,7 +1146,7 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1150 | __func__, ep, ep->com.state); | 1146 | __func__, ep, ep->com.state); |
1151 | break; | 1147 | break; |
1152 | } | 1148 | } |
1153 | spin_unlock_irqrestore(&ep->com.lock, flags); | 1149 | mutex_unlock(&ep->com.mutex); |
1154 | 1150 | ||
1155 | if (release) | 1151 | if (release) |
1156 | release_ep_resources(ep); | 1152 | release_ep_resources(ep); |
@@ -1213,9 +1209,9 @@ static int pass_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1213 | } | 1209 | } |
1214 | PDBG("%s ep %p status %d error %d\n", __func__, ep, | 1210 | PDBG("%s ep %p status %d error %d\n", __func__, ep, |
1215 | rpl->status, status2errno(rpl->status)); | 1211 | rpl->status, status2errno(rpl->status)); |
1216 | ep->com.rpl_err = status2errno(rpl->status); | 1212 | ep->com.wr_wait.ret = status2errno(rpl->status); |
1217 | ep->com.rpl_done = 1; | 1213 | ep->com.wr_wait.done = 1; |
1218 | wake_up(&ep->com.waitq); | 1214 | wake_up(&ep->com.wr_wait.wait); |
1219 | 1215 | ||
1220 | return 0; | 1216 | return 0; |
1221 | } | 1217 | } |
@@ -1249,9 +1245,9 @@ static int close_listsrv_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1249 | struct c4iw_listen_ep *ep = lookup_stid(t, stid); | 1245 | struct c4iw_listen_ep *ep = lookup_stid(t, stid); |
1250 | 1246 | ||
1251 | PDBG("%s ep %p\n", __func__, ep); | 1247 | PDBG("%s ep %p\n", __func__, ep); |
1252 | ep->com.rpl_err = status2errno(rpl->status); | 1248 | ep->com.wr_wait.ret = status2errno(rpl->status); |
1253 | ep->com.rpl_done = 1; | 1249 | ep->com.wr_wait.done = 1; |
1254 | wake_up(&ep->com.waitq); | 1250 | wake_up(&ep->com.wr_wait.wait); |
1255 | return 0; | 1251 | return 0; |
1256 | } | 1252 | } |
1257 | 1253 | ||
@@ -1478,7 +1474,6 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1478 | struct cpl_peer_close *hdr = cplhdr(skb); | 1474 | struct cpl_peer_close *hdr = cplhdr(skb); |
1479 | struct c4iw_ep *ep; | 1475 | struct c4iw_ep *ep; |
1480 | struct c4iw_qp_attributes attrs; | 1476 | struct c4iw_qp_attributes attrs; |
1481 | unsigned long flags; | ||
1482 | int disconnect = 1; | 1477 | int disconnect = 1; |
1483 | int release = 0; | 1478 | int release = 0; |
1484 | int closing = 0; | 1479 | int closing = 0; |
@@ -1489,7 +1484,7 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1489 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | 1484 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); |
1490 | dst_confirm(ep->dst); | 1485 | dst_confirm(ep->dst); |
1491 | 1486 | ||
1492 | spin_lock_irqsave(&ep->com.lock, flags); | 1487 | mutex_lock(&ep->com.mutex); |
1493 | switch (ep->com.state) { | 1488 | switch (ep->com.state) { |
1494 | case MPA_REQ_WAIT: | 1489 | case MPA_REQ_WAIT: |
1495 | __state_set(&ep->com, CLOSING); | 1490 | __state_set(&ep->com, CLOSING); |
@@ -1507,17 +1502,17 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1507 | * in rdma connection migration (see c4iw_accept_cr()). | 1502 | * in rdma connection migration (see c4iw_accept_cr()). |
1508 | */ | 1503 | */ |
1509 | __state_set(&ep->com, CLOSING); | 1504 | __state_set(&ep->com, CLOSING); |
1510 | ep->com.rpl_done = 1; | 1505 | ep->com.wr_wait.done = 1; |
1511 | ep->com.rpl_err = -ECONNRESET; | 1506 | ep->com.wr_wait.ret = -ECONNRESET; |
1512 | PDBG("waking up ep %p tid %u\n", ep, ep->hwtid); | 1507 | PDBG("waking up ep %p tid %u\n", ep, ep->hwtid); |
1513 | wake_up(&ep->com.waitq); | 1508 | wake_up(&ep->com.wr_wait.wait); |
1514 | break; | 1509 | break; |
1515 | case MPA_REP_SENT: | 1510 | case MPA_REP_SENT: |
1516 | __state_set(&ep->com, CLOSING); | 1511 | __state_set(&ep->com, CLOSING); |
1517 | ep->com.rpl_done = 1; | 1512 | ep->com.wr_wait.done = 1; |
1518 | ep->com.rpl_err = -ECONNRESET; | 1513 | ep->com.wr_wait.ret = -ECONNRESET; |
1519 | PDBG("waking up ep %p tid %u\n", ep, ep->hwtid); | 1514 | PDBG("waking up ep %p tid %u\n", ep, ep->hwtid); |
1520 | wake_up(&ep->com.waitq); | 1515 | wake_up(&ep->com.wr_wait.wait); |
1521 | break; | 1516 | break; |
1522 | case FPDU_MODE: | 1517 | case FPDU_MODE: |
1523 | start_ep_timer(ep); | 1518 | start_ep_timer(ep); |
@@ -1550,7 +1545,7 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1550 | default: | 1545 | default: |
1551 | BUG_ON(1); | 1546 | BUG_ON(1); |
1552 | } | 1547 | } |
1553 | spin_unlock_irqrestore(&ep->com.lock, flags); | 1548 | mutex_unlock(&ep->com.mutex); |
1554 | if (closing) { | 1549 | if (closing) { |
1555 | attrs.next_state = C4IW_QP_STATE_CLOSING; | 1550 | attrs.next_state = C4IW_QP_STATE_CLOSING; |
1556 | c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, | 1551 | c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, |
@@ -1581,7 +1576,6 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1581 | struct c4iw_qp_attributes attrs; | 1576 | struct c4iw_qp_attributes attrs; |
1582 | int ret; | 1577 | int ret; |
1583 | int release = 0; | 1578 | int release = 0; |
1584 | unsigned long flags; | ||
1585 | struct tid_info *t = dev->rdev.lldi.tids; | 1579 | struct tid_info *t = dev->rdev.lldi.tids; |
1586 | unsigned int tid = GET_TID(req); | 1580 | unsigned int tid = GET_TID(req); |
1587 | 1581 | ||
@@ -1591,9 +1585,17 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1591 | ep->hwtid); | 1585 | ep->hwtid); |
1592 | return 0; | 1586 | return 0; |
1593 | } | 1587 | } |
1594 | spin_lock_irqsave(&ep->com.lock, flags); | ||
1595 | PDBG("%s ep %p tid %u state %u\n", __func__, ep, ep->hwtid, | 1588 | PDBG("%s ep %p tid %u state %u\n", __func__, ep, ep->hwtid, |
1596 | ep->com.state); | 1589 | ep->com.state); |
1590 | |||
1591 | /* | ||
1592 | * Wake up any threads in rdma_init() or rdma_fini(). | ||
1593 | */ | ||
1594 | ep->com.wr_wait.done = 1; | ||
1595 | ep->com.wr_wait.ret = -ECONNRESET; | ||
1596 | wake_up(&ep->com.wr_wait.wait); | ||
1597 | |||
1598 | mutex_lock(&ep->com.mutex); | ||
1597 | switch (ep->com.state) { | 1599 | switch (ep->com.state) { |
1598 | case CONNECTING: | 1600 | case CONNECTING: |
1599 | break; | 1601 | break; |
@@ -1605,23 +1607,8 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1605 | connect_reply_upcall(ep, -ECONNRESET); | 1607 | connect_reply_upcall(ep, -ECONNRESET); |
1606 | break; | 1608 | break; |
1607 | case MPA_REP_SENT: | 1609 | case MPA_REP_SENT: |
1608 | ep->com.rpl_done = 1; | ||
1609 | ep->com.rpl_err = -ECONNRESET; | ||
1610 | PDBG("waking up ep %p\n", ep); | ||
1611 | wake_up(&ep->com.waitq); | ||
1612 | break; | 1610 | break; |
1613 | case MPA_REQ_RCVD: | 1611 | case MPA_REQ_RCVD: |
1614 | |||
1615 | /* | ||
1616 | * We're gonna mark this puppy DEAD, but keep | ||
1617 | * the reference on it until the ULP accepts or | ||
1618 | * rejects the CR. Also wake up anyone waiting | ||
1619 | * in rdma connection migration (see c4iw_accept_cr()). | ||
1620 | */ | ||
1621 | ep->com.rpl_done = 1; | ||
1622 | ep->com.rpl_err = -ECONNRESET; | ||
1623 | PDBG("waking up ep %p tid %u\n", ep, ep->hwtid); | ||
1624 | wake_up(&ep->com.waitq); | ||
1625 | break; | 1612 | break; |
1626 | case MORIBUND: | 1613 | case MORIBUND: |
1627 | case CLOSING: | 1614 | case CLOSING: |
@@ -1644,7 +1631,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1644 | break; | 1631 | break; |
1645 | case DEAD: | 1632 | case DEAD: |
1646 | PDBG("%s PEER_ABORT IN DEAD STATE!!!!\n", __func__); | 1633 | PDBG("%s PEER_ABORT IN DEAD STATE!!!!\n", __func__); |
1647 | spin_unlock_irqrestore(&ep->com.lock, flags); | 1634 | mutex_unlock(&ep->com.mutex); |
1648 | return 0; | 1635 | return 0; |
1649 | default: | 1636 | default: |
1650 | BUG_ON(1); | 1637 | BUG_ON(1); |
@@ -1655,7 +1642,7 @@ static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1655 | __state_set(&ep->com, DEAD); | 1642 | __state_set(&ep->com, DEAD); |
1656 | release = 1; | 1643 | release = 1; |
1657 | } | 1644 | } |
1658 | spin_unlock_irqrestore(&ep->com.lock, flags); | 1645 | mutex_unlock(&ep->com.mutex); |
1659 | 1646 | ||
1660 | rpl_skb = get_skb(skb, sizeof(*rpl), GFP_KERNEL); | 1647 | rpl_skb = get_skb(skb, sizeof(*rpl), GFP_KERNEL); |
1661 | if (!rpl_skb) { | 1648 | if (!rpl_skb) { |
@@ -1681,7 +1668,6 @@ static int close_con_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1681 | struct c4iw_ep *ep; | 1668 | struct c4iw_ep *ep; |
1682 | struct c4iw_qp_attributes attrs; | 1669 | struct c4iw_qp_attributes attrs; |
1683 | struct cpl_close_con_rpl *rpl = cplhdr(skb); | 1670 | struct cpl_close_con_rpl *rpl = cplhdr(skb); |
1684 | unsigned long flags; | ||
1685 | int release = 0; | 1671 | int release = 0; |
1686 | struct tid_info *t = dev->rdev.lldi.tids; | 1672 | struct tid_info *t = dev->rdev.lldi.tids; |
1687 | unsigned int tid = GET_TID(rpl); | 1673 | unsigned int tid = GET_TID(rpl); |
@@ -1692,7 +1678,7 @@ static int close_con_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1692 | BUG_ON(!ep); | 1678 | BUG_ON(!ep); |
1693 | 1679 | ||
1694 | /* The cm_id may be null if we failed to connect */ | 1680 | /* The cm_id may be null if we failed to connect */ |
1695 | spin_lock_irqsave(&ep->com.lock, flags); | 1681 | mutex_lock(&ep->com.mutex); |
1696 | switch (ep->com.state) { | 1682 | switch (ep->com.state) { |
1697 | case CLOSING: | 1683 | case CLOSING: |
1698 | __state_set(&ep->com, MORIBUND); | 1684 | __state_set(&ep->com, MORIBUND); |
@@ -1717,7 +1703,7 @@ static int close_con_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1717 | BUG_ON(1); | 1703 | BUG_ON(1); |
1718 | break; | 1704 | break; |
1719 | } | 1705 | } |
1720 | spin_unlock_irqrestore(&ep->com.lock, flags); | 1706 | mutex_unlock(&ep->com.mutex); |
1721 | if (release) | 1707 | if (release) |
1722 | release_ep_resources(ep); | 1708 | release_ep_resources(ep); |
1723 | return 0; | 1709 | return 0; |
@@ -1725,23 +1711,24 @@ static int close_con_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1725 | 1711 | ||
1726 | static int terminate(struct c4iw_dev *dev, struct sk_buff *skb) | 1712 | static int terminate(struct c4iw_dev *dev, struct sk_buff *skb) |
1727 | { | 1713 | { |
1728 | struct c4iw_ep *ep; | 1714 | struct cpl_rdma_terminate *rpl = cplhdr(skb); |
1729 | struct cpl_rdma_terminate *term = cplhdr(skb); | ||
1730 | struct tid_info *t = dev->rdev.lldi.tids; | 1715 | struct tid_info *t = dev->rdev.lldi.tids; |
1731 | unsigned int tid = GET_TID(term); | 1716 | unsigned int tid = GET_TID(rpl); |
1717 | struct c4iw_ep *ep; | ||
1718 | struct c4iw_qp_attributes attrs; | ||
1732 | 1719 | ||
1733 | ep = lookup_tid(t, tid); | 1720 | ep = lookup_tid(t, tid); |
1721 | BUG_ON(!ep); | ||
1734 | 1722 | ||
1735 | if (state_read(&ep->com) != FPDU_MODE) | 1723 | if (ep->com.qp) { |
1736 | return 0; | 1724 | printk(KERN_WARNING MOD "TERM received tid %u qpid %u\n", tid, |
1725 | ep->com.qp->wq.sq.qid); | ||
1726 | attrs.next_state = C4IW_QP_STATE_TERMINATE; | ||
1727 | c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, | ||
1728 | C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); | ||
1729 | } else | ||
1730 | printk(KERN_WARNING MOD "TERM received tid %u no qp\n", tid); | ||
1737 | 1731 | ||
1738 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | ||
1739 | skb_pull(skb, sizeof *term); | ||
1740 | PDBG("%s saving %d bytes of term msg\n", __func__, skb->len); | ||
1741 | skb_copy_from_linear_data(skb, ep->com.qp->attr.terminate_buffer, | ||
1742 | skb->len); | ||
1743 | ep->com.qp->attr.terminate_msg_len = skb->len; | ||
1744 | ep->com.qp->attr.is_terminate_local = 0; | ||
1745 | return 0; | 1732 | return 0; |
1746 | } | 1733 | } |
1747 | 1734 | ||
@@ -1762,8 +1749,8 @@ static int fw4_ack(struct c4iw_dev *dev, struct sk_buff *skb) | |||
1762 | ep = lookup_tid(t, tid); | 1749 | ep = lookup_tid(t, tid); |
1763 | PDBG("%s ep %p tid %u credits %u\n", __func__, ep, ep->hwtid, credits); | 1750 | PDBG("%s ep %p tid %u credits %u\n", __func__, ep, ep->hwtid, credits); |
1764 | if (credits == 0) { | 1751 | if (credits == 0) { |
1765 | PDBG(KERN_ERR "%s 0 credit ack ep %p tid %u state %u\n", | 1752 | PDBG("%s 0 credit ack ep %p tid %u state %u\n", |
1766 | __func__, ep, ep->hwtid, state_read(&ep->com)); | 1753 | __func__, ep, ep->hwtid, state_read(&ep->com)); |
1767 | return 0; | 1754 | return 0; |
1768 | } | 1755 | } |
1769 | 1756 | ||
@@ -2042,6 +2029,7 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
2042 | } | 2029 | } |
2043 | 2030 | ||
2044 | state_set(&ep->com, LISTEN); | 2031 | state_set(&ep->com, LISTEN); |
2032 | c4iw_init_wr_wait(&ep->com.wr_wait); | ||
2045 | err = cxgb4_create_server(ep->com.dev->rdev.lldi.ports[0], ep->stid, | 2033 | err = cxgb4_create_server(ep->com.dev->rdev.lldi.ports[0], ep->stid, |
2046 | ep->com.local_addr.sin_addr.s_addr, | 2034 | ep->com.local_addr.sin_addr.s_addr, |
2047 | ep->com.local_addr.sin_port, | 2035 | ep->com.local_addr.sin_port, |
@@ -2050,15 +2038,8 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog) | |||
2050 | goto fail3; | 2038 | goto fail3; |
2051 | 2039 | ||
2052 | /* wait for pass_open_rpl */ | 2040 | /* wait for pass_open_rpl */ |
2053 | wait_event_timeout(ep->com.waitq, ep->com.rpl_done, C4IW_WR_TO); | 2041 | err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait, 0, 0, |
2054 | if (ep->com.rpl_done) | 2042 | __func__); |
2055 | err = ep->com.rpl_err; | ||
2056 | else { | ||
2057 | printk(KERN_ERR MOD "Device %s not responding!\n", | ||
2058 | pci_name(ep->com.dev->rdev.lldi.pdev)); | ||
2059 | ep->com.dev->rdev.flags = T4_FATAL_ERROR; | ||
2060 | err = -EIO; | ||
2061 | } | ||
2062 | if (!err) { | 2043 | if (!err) { |
2063 | cm_id->provider_data = ep; | 2044 | cm_id->provider_data = ep; |
2064 | goto out; | 2045 | goto out; |
@@ -2082,20 +2063,12 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id) | |||
2082 | 2063 | ||
2083 | might_sleep(); | 2064 | might_sleep(); |
2084 | state_set(&ep->com, DEAD); | 2065 | state_set(&ep->com, DEAD); |
2085 | ep->com.rpl_done = 0; | 2066 | c4iw_init_wr_wait(&ep->com.wr_wait); |
2086 | ep->com.rpl_err = 0; | ||
2087 | err = listen_stop(ep); | 2067 | err = listen_stop(ep); |
2088 | if (err) | 2068 | if (err) |
2089 | goto done; | 2069 | goto done; |
2090 | wait_event_timeout(ep->com.waitq, ep->com.rpl_done, C4IW_WR_TO); | 2070 | err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait, 0, 0, |
2091 | if (ep->com.rpl_done) | 2071 | __func__); |
2092 | err = ep->com.rpl_err; | ||
2093 | else { | ||
2094 | printk(KERN_ERR MOD "Device %s not responding!\n", | ||
2095 | pci_name(ep->com.dev->rdev.lldi.pdev)); | ||
2096 | ep->com.dev->rdev.flags = T4_FATAL_ERROR; | ||
2097 | err = -EIO; | ||
2098 | } | ||
2099 | cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid, PF_INET); | 2072 | cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid, PF_INET); |
2100 | done: | 2073 | done: |
2101 | cm_id->rem_ref(cm_id); | 2074 | cm_id->rem_ref(cm_id); |
@@ -2106,12 +2079,11 @@ done: | |||
2106 | int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) | 2079 | int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) |
2107 | { | 2080 | { |
2108 | int ret = 0; | 2081 | int ret = 0; |
2109 | unsigned long flags; | ||
2110 | int close = 0; | 2082 | int close = 0; |
2111 | int fatal = 0; | 2083 | int fatal = 0; |
2112 | struct c4iw_rdev *rdev; | 2084 | struct c4iw_rdev *rdev; |
2113 | 2085 | ||
2114 | spin_lock_irqsave(&ep->com.lock, flags); | 2086 | mutex_lock(&ep->com.mutex); |
2115 | 2087 | ||
2116 | PDBG("%s ep %p state %s, abrupt %d\n", __func__, ep, | 2088 | PDBG("%s ep %p state %s, abrupt %d\n", __func__, ep, |
2117 | states[ep->com.state], abrupt); | 2089 | states[ep->com.state], abrupt); |
@@ -2158,7 +2130,7 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) | |||
2158 | break; | 2130 | break; |
2159 | } | 2131 | } |
2160 | 2132 | ||
2161 | spin_unlock_irqrestore(&ep->com.lock, flags); | 2133 | mutex_unlock(&ep->com.mutex); |
2162 | if (close) { | 2134 | if (close) { |
2163 | if (abrupt) | 2135 | if (abrupt) |
2164 | ret = abort_connection(ep, NULL, gfp); | 2136 | ret = abort_connection(ep, NULL, gfp); |
@@ -2172,6 +2144,13 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) | |||
2172 | return ret; | 2144 | return ret; |
2173 | } | 2145 | } |
2174 | 2146 | ||
2147 | static int async_event(struct c4iw_dev *dev, struct sk_buff *skb) | ||
2148 | { | ||
2149 | struct cpl_fw6_msg *rpl = cplhdr(skb); | ||
2150 | c4iw_ev_dispatch(dev, (struct t4_cqe *)&rpl->data[0]); | ||
2151 | return 0; | ||
2152 | } | ||
2153 | |||
2175 | /* | 2154 | /* |
2176 | * These are the real handlers that are called from a | 2155 | * These are the real handlers that are called from a |
2177 | * work queue. | 2156 | * work queue. |
@@ -2190,7 +2169,8 @@ static c4iw_handler_func work_handlers[NUM_CPL_CMDS] = { | |||
2190 | [CPL_ABORT_REQ_RSS] = peer_abort, | 2169 | [CPL_ABORT_REQ_RSS] = peer_abort, |
2191 | [CPL_CLOSE_CON_RPL] = close_con_rpl, | 2170 | [CPL_CLOSE_CON_RPL] = close_con_rpl, |
2192 | [CPL_RDMA_TERMINATE] = terminate, | 2171 | [CPL_RDMA_TERMINATE] = terminate, |
2193 | [CPL_FW4_ACK] = fw4_ack | 2172 | [CPL_FW4_ACK] = fw4_ack, |
2173 | [CPL_FW6_MSG] = async_event | ||
2194 | }; | 2174 | }; |
2195 | 2175 | ||
2196 | static void process_timeout(struct c4iw_ep *ep) | 2176 | static void process_timeout(struct c4iw_ep *ep) |
@@ -2198,7 +2178,7 @@ static void process_timeout(struct c4iw_ep *ep) | |||
2198 | struct c4iw_qp_attributes attrs; | 2178 | struct c4iw_qp_attributes attrs; |
2199 | int abort = 1; | 2179 | int abort = 1; |
2200 | 2180 | ||
2201 | spin_lock_irq(&ep->com.lock); | 2181 | mutex_lock(&ep->com.mutex); |
2202 | PDBG("%s ep %p tid %u state %d\n", __func__, ep, ep->hwtid, | 2182 | PDBG("%s ep %p tid %u state %d\n", __func__, ep, ep->hwtid, |
2203 | ep->com.state); | 2183 | ep->com.state); |
2204 | switch (ep->com.state) { | 2184 | switch (ep->com.state) { |
@@ -2225,7 +2205,7 @@ static void process_timeout(struct c4iw_ep *ep) | |||
2225 | WARN_ON(1); | 2205 | WARN_ON(1); |
2226 | abort = 0; | 2206 | abort = 0; |
2227 | } | 2207 | } |
2228 | spin_unlock_irq(&ep->com.lock); | 2208 | mutex_unlock(&ep->com.mutex); |
2229 | if (abort) | 2209 | if (abort) |
2230 | abort_connection(ep, NULL, GFP_KERNEL); | 2210 | abort_connection(ep, NULL, GFP_KERNEL); |
2231 | c4iw_put_ep(&ep->com); | 2211 | c4iw_put_ep(&ep->com); |
@@ -2309,6 +2289,7 @@ static int set_tcb_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2309 | printk(KERN_ERR MOD "Unexpected SET_TCB_RPL status %u " | 2289 | printk(KERN_ERR MOD "Unexpected SET_TCB_RPL status %u " |
2310 | "for tid %u\n", rpl->status, GET_TID(rpl)); | 2290 | "for tid %u\n", rpl->status, GET_TID(rpl)); |
2311 | } | 2291 | } |
2292 | kfree_skb(skb); | ||
2312 | return 0; | 2293 | return 0; |
2313 | } | 2294 | } |
2314 | 2295 | ||
@@ -2323,20 +2304,25 @@ static int fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb) | |||
2323 | switch (rpl->type) { | 2304 | switch (rpl->type) { |
2324 | case 1: | 2305 | case 1: |
2325 | ret = (int)((be64_to_cpu(rpl->data[0]) >> 8) & 0xff); | 2306 | ret = (int)((be64_to_cpu(rpl->data[0]) >> 8) & 0xff); |
2326 | wr_waitp = (__force struct c4iw_wr_wait *)rpl->data[1]; | 2307 | wr_waitp = (struct c4iw_wr_wait *)(__force unsigned long) rpl->data[1]; |
2327 | PDBG("%s wr_waitp %p ret %u\n", __func__, wr_waitp, ret); | 2308 | PDBG("%s wr_waitp %p ret %u\n", __func__, wr_waitp, ret); |
2328 | if (wr_waitp) { | 2309 | if (wr_waitp) { |
2329 | wr_waitp->ret = ret; | 2310 | if (ret) |
2311 | wr_waitp->ret = -ret; | ||
2312 | else | ||
2313 | wr_waitp->ret = 0; | ||
2330 | wr_waitp->done = 1; | 2314 | wr_waitp->done = 1; |
2331 | wake_up(&wr_waitp->wait); | 2315 | wake_up(&wr_waitp->wait); |
2332 | } | 2316 | } |
2317 | kfree_skb(skb); | ||
2333 | break; | 2318 | break; |
2334 | case 2: | 2319 | case 2: |
2335 | c4iw_ev_dispatch(dev, (struct t4_cqe *)&rpl->data[0]); | 2320 | sched(dev, skb); |
2336 | break; | 2321 | break; |
2337 | default: | 2322 | default: |
2338 | printk(KERN_ERR MOD "%s unexpected fw6 msg type %u\n", __func__, | 2323 | printk(KERN_ERR MOD "%s unexpected fw6 msg type %u\n", __func__, |
2339 | rpl->type); | 2324 | rpl->type); |
2325 | kfree_skb(skb); | ||
2340 | break; | 2326 | break; |
2341 | } | 2327 | } |
2342 | return 0; | 2328 | return 0; |