aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/cxgb4/cm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/cm.c')
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c178
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;
117module_param(rcv_win, int, 0644); 117module_param(rcv_win, int, 0644);
118MODULE_PARM_DESC(rcv_win, "TCP receive window in bytes (default=256KB)"); 118MODULE_PARM_DESC(rcv_win, "TCP receive window in bytes (default=256KB)");
119 119
120static int snd_win = 32 * 1024; 120static int snd_win = 128 * 1024;
121module_param(snd_win, int, 0644); 121module_param(snd_win, int, 0644);
122MODULE_PARM_DESC(snd_win, "TCP send window in bytes (default=32KB)"); 122MODULE_PARM_DESC(snd_win, "TCP send window in bytes (default=128KB)");
123 123
124static struct workqueue_struct *workq; 124static 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
178int c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb) 178int 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
193static void release_tid(struct c4iw_rdev *rdev, u32 hwtid, struct sk_buff *skb) 193static 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
220static enum c4iw_ep_state state_read(struct c4iw_ep_common *epc) 220static 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
236static void state_set(struct c4iw_ep_common *epc, enum c4iw_ep_state new) 235static 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
1726static int terminate(struct c4iw_dev *dev, struct sk_buff *skb) 1712static 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);
2100done: 2073done:
2101 cm_id->rem_ref(cm_id); 2074 cm_id->rem_ref(cm_id);
@@ -2106,12 +2079,11 @@ done:
2106int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp) 2079int 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
2147static 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
2196static void process_timeout(struct c4iw_ep *ep) 2176static 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;