aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-05-26 15:13:57 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-05-26 15:13:57 -0400
commit4c171acc20794af16a27da25e11ec4e9cad5d9fa (patch)
treefb097384d709b7bda982902d999f658bb4f07b2c /drivers/infiniband/hw
parent20e0ec119b2c6cc412addefbe169f4f5e38701e8 (diff)
parent8dc4abdf4c82d0e1c47f14b6615406d31975ea66 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: RDMA/cma: Save PID of ID's owner RDMA/cma: Add support for netlink statistics export RDMA/cma: Pass QP type into rdma_create_id() RDMA: Update exported headers list RDMA/cma: Export enum cma_state in <rdma/rdma_cm.h> RDMA/nes: Add a check for strict_strtoul() RDMA/cxgb3: Don't post zero-byte read if endpoint is going away RDMA/cxgb4: Use completion objects for event blocking IB/srp: Fix integer -> pointer cast warnings IB: Add devnode methods to cm_class and umad_class IB/mad: Return EPROTONOSUPPORT when an RDMA device lacks the QP required IB/uverbs: Add devnode method to set path/mode RDMA/ucma: Add .nodename/.mode to tell userspace where to create device node RDMA: Add netlink infrastructure RDMA: Add error handling to ib_core_init()
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_cm.c26
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_provider.h2
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_qp.c6
-rw-r--r--drivers/infiniband/hw/cxgb4/iw_cxgb4.h18
-rw-r--r--drivers/infiniband/hw/nes/nes.c4
-rw-r--r--drivers/infiniband/hw/qib/Kconfig2
6 files changed, 30 insertions, 28 deletions
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
index 23918413899..0a5008fbeba 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c
@@ -914,7 +914,7 @@ static void process_mpa_reply(struct iwch_ep *ep, struct sk_buff *skb)
914 goto err; 914 goto err;
915 915
916 if (peer2peer && iwch_rqes_posted(ep->com.qp) == 0) { 916 if (peer2peer && iwch_rqes_posted(ep->com.qp) == 0) {
917 iwch_post_zb_read(ep->com.qp); 917 iwch_post_zb_read(ep);
918 } 918 }
919 919
920 goto out; 920 goto out;
@@ -1078,6 +1078,8 @@ static int tx_ack(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
1078 struct iwch_ep *ep = ctx; 1078 struct iwch_ep *ep = ctx;
1079 struct cpl_wr_ack *hdr = cplhdr(skb); 1079 struct cpl_wr_ack *hdr = cplhdr(skb);
1080 unsigned int credits = ntohs(hdr->credits); 1080 unsigned int credits = ntohs(hdr->credits);
1081 unsigned long flags;
1082 int post_zb = 0;
1081 1083
1082 PDBG("%s ep %p credits %u\n", __func__, ep, credits); 1084 PDBG("%s ep %p credits %u\n", __func__, ep, credits);
1083 1085
@@ -1087,28 +1089,34 @@ static int tx_ack(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
1087 return CPL_RET_BUF_DONE; 1089 return CPL_RET_BUF_DONE;
1088 } 1090 }
1089 1091
1092 spin_lock_irqsave(&ep->com.lock, flags);
1090 BUG_ON(credits != 1); 1093 BUG_ON(credits != 1);
1091 dst_confirm(ep->dst); 1094 dst_confirm(ep->dst);
1092 if (!ep->mpa_skb) { 1095 if (!ep->mpa_skb) {
1093 PDBG("%s rdma_init wr_ack ep %p state %u\n", 1096 PDBG("%s rdma_init wr_ack ep %p state %u\n",
1094 __func__, ep, state_read(&ep->com)); 1097 __func__, ep, ep->com.state);
1095 if (ep->mpa_attr.initiator) { 1098 if (ep->mpa_attr.initiator) {
1096 PDBG("%s initiator ep %p state %u\n", 1099 PDBG("%s initiator ep %p state %u\n",
1097 __func__, ep, state_read(&ep->com)); 1100 __func__, ep, ep->com.state);
1098 if (peer2peer) 1101 if (peer2peer && ep->com.state == FPDU_MODE)
1099 iwch_post_zb_read(ep->com.qp); 1102 post_zb = 1;
1100 } else { 1103 } else {
1101 PDBG("%s responder ep %p state %u\n", 1104 PDBG("%s responder ep %p state %u\n",
1102 __func__, ep, state_read(&ep->com)); 1105 __func__, ep, ep->com.state);
1103 ep->com.rpl_done = 1; 1106 if (ep->com.state == MPA_REQ_RCVD) {
1104 wake_up(&ep->com.waitq); 1107 ep->com.rpl_done = 1;
1108 wake_up(&ep->com.waitq);
1109 }
1105 } 1110 }
1106 } else { 1111 } else {
1107 PDBG("%s lsm ack ep %p state %u freeing skb\n", 1112 PDBG("%s lsm ack ep %p state %u freeing skb\n",
1108 __func__, ep, state_read(&ep->com)); 1113 __func__, ep, ep->com.state);
1109 kfree_skb(ep->mpa_skb); 1114 kfree_skb(ep->mpa_skb);
1110 ep->mpa_skb = NULL; 1115 ep->mpa_skb = NULL;
1111 } 1116 }
1117 spin_unlock_irqrestore(&ep->com.lock, flags);
1118 if (post_zb)
1119 iwch_post_zb_read(ep);
1112 return CPL_RET_BUF_DONE; 1120 return CPL_RET_BUF_DONE;
1113} 1121}
1114 1122
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.h b/drivers/infiniband/hw/cxgb3/iwch_provider.h
index c5406da3f4c..9a342c9b220 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.h
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.h
@@ -332,7 +332,7 @@ int iwch_bind_mw(struct ib_qp *qp,
332 struct ib_mw_bind *mw_bind); 332 struct ib_mw_bind *mw_bind);
333int iwch_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); 333int iwch_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);
334int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg); 334int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg);
335int iwch_post_zb_read(struct iwch_qp *qhp); 335int iwch_post_zb_read(struct iwch_ep *ep);
336int iwch_register_device(struct iwch_dev *dev); 336int iwch_register_device(struct iwch_dev *dev);
337void iwch_unregister_device(struct iwch_dev *dev); 337void iwch_unregister_device(struct iwch_dev *dev);
338void stop_read_rep_timer(struct iwch_qp *qhp); 338void stop_read_rep_timer(struct iwch_qp *qhp);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 1b4cd09f74d..ecd313f359a 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -738,7 +738,7 @@ static inline void build_term_codes(struct respQ_msg_t *rsp_msg,
738 } 738 }
739} 739}
740 740
741int iwch_post_zb_read(struct iwch_qp *qhp) 741int iwch_post_zb_read(struct iwch_ep *ep)
742{ 742{
743 union t3_wr *wqe; 743 union t3_wr *wqe;
744 struct sk_buff *skb; 744 struct sk_buff *skb;
@@ -761,10 +761,10 @@ int iwch_post_zb_read(struct iwch_qp *qhp)
761 wqe->read.local_len = cpu_to_be32(0); 761 wqe->read.local_len = cpu_to_be32(0);
762 wqe->read.local_to = cpu_to_be64(1); 762 wqe->read.local_to = cpu_to_be64(1);
763 wqe->send.wrh.op_seop_flags = cpu_to_be32(V_FW_RIWR_OP(T3_WR_READ)); 763 wqe->send.wrh.op_seop_flags = cpu_to_be32(V_FW_RIWR_OP(T3_WR_READ));
764 wqe->send.wrh.gen_tid_len = cpu_to_be32(V_FW_RIWR_TID(qhp->ep->hwtid)| 764 wqe->send.wrh.gen_tid_len = cpu_to_be32(V_FW_RIWR_TID(ep->hwtid)|
765 V_FW_RIWR_LEN(flit_cnt)); 765 V_FW_RIWR_LEN(flit_cnt));
766 skb->priority = CPL_PRIORITY_DATA; 766 skb->priority = CPL_PRIORITY_DATA;
767 return iwch_cxgb3_ofld_send(qhp->rhp->rdev.t3cdev_p, skb); 767 return iwch_cxgb3_ofld_send(ep->com.qp->rhp->rdev.t3cdev_p, skb);
768} 768}
769 769
770/* 770/*
diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
index 35d2a5dd9bb..4f045375c8e 100644
--- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
@@ -35,7 +35,7 @@
35#include <linux/list.h> 35#include <linux/list.h>
36#include <linux/spinlock.h> 36#include <linux/spinlock.h>
37#include <linux/idr.h> 37#include <linux/idr.h>
38#include <linux/workqueue.h> 38#include <linux/completion.h>
39#include <linux/netdevice.h> 39#include <linux/netdevice.h>
40#include <linux/sched.h> 40#include <linux/sched.h>
41#include <linux/pci.h> 41#include <linux/pci.h>
@@ -131,28 +131,21 @@ static inline int c4iw_num_stags(struct c4iw_rdev *rdev)
131 131
132#define C4IW_WR_TO (10*HZ) 132#define C4IW_WR_TO (10*HZ)
133 133
134enum {
135 REPLY_READY = 0,
136};
137
138struct c4iw_wr_wait { 134struct c4iw_wr_wait {
139 wait_queue_head_t wait; 135 struct completion completion;
140 unsigned long status;
141 int ret; 136 int ret;
142}; 137};
143 138
144static inline void c4iw_init_wr_wait(struct c4iw_wr_wait *wr_waitp) 139static inline void c4iw_init_wr_wait(struct c4iw_wr_wait *wr_waitp)
145{ 140{
146 wr_waitp->ret = 0; 141 wr_waitp->ret = 0;
147 wr_waitp->status = 0; 142 init_completion(&wr_waitp->completion);
148 init_waitqueue_head(&wr_waitp->wait);
149} 143}
150 144
151static inline void c4iw_wake_up(struct c4iw_wr_wait *wr_waitp, int ret) 145static inline void c4iw_wake_up(struct c4iw_wr_wait *wr_waitp, int ret)
152{ 146{
153 wr_waitp->ret = ret; 147 wr_waitp->ret = ret;
154 set_bit(REPLY_READY, &wr_waitp->status); 148 complete(&wr_waitp->completion);
155 wake_up(&wr_waitp->wait);
156} 149}
157 150
158static inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev, 151static inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev,
@@ -164,8 +157,7 @@ static inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev,
164 int ret; 157 int ret;
165 158
166 do { 159 do {
167 ret = wait_event_timeout(wr_waitp->wait, 160 ret = wait_for_completion_timeout(&wr_waitp->completion, to);
168 test_and_clear_bit(REPLY_READY, &wr_waitp->status), to);
169 if (!ret) { 161 if (!ret) {
170 printk(KERN_ERR MOD "%s - Device %s not responding - " 162 printk(KERN_ERR MOD "%s - Device %s not responding - "
171 "tid %u qpid %u\n", func, 163 "tid %u qpid %u\n", func,
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c
index 13de1192927..2d668c69f6d 100644
--- a/drivers/infiniband/hw/nes/nes.c
+++ b/drivers/infiniband/hw/nes/nes.c
@@ -1138,7 +1138,9 @@ static ssize_t nes_store_wqm_quanta(struct device_driver *ddp,
1138 u32 i = 0; 1138 u32 i = 0;
1139 struct nes_device *nesdev; 1139 struct nes_device *nesdev;
1140 1140
1141 strict_strtoul(buf, 0, &wqm_quanta_value); 1141 if (kstrtoul(buf, 0, &wqm_quanta_value) < 0)
1142 return -EINVAL;
1143
1142 list_for_each_entry(nesdev, &nes_dev_list, list) { 1144 list_for_each_entry(nesdev, &nes_dev_list, list) {
1143 if (i == ee_flsh_adapter) { 1145 if (i == ee_flsh_adapter) {
1144 nesdev->nesadapter->wqm_quanta = wqm_quanta_value; 1146 nesdev->nesadapter->wqm_quanta = wqm_quanta_value;
diff --git a/drivers/infiniband/hw/qib/Kconfig b/drivers/infiniband/hw/qib/Kconfig
index 7c03a70c55a..8349f9c5064 100644
--- a/drivers/infiniband/hw/qib/Kconfig
+++ b/drivers/infiniband/hw/qib/Kconfig
@@ -1,6 +1,6 @@
1config INFINIBAND_QIB 1config INFINIBAND_QIB
2 tristate "QLogic PCIe HCA support" 2 tristate "QLogic PCIe HCA support"
3 depends on 64BIT && NET 3 depends on 64BIT
4 ---help--- 4 ---help---
5 This is a low-level driver for QLogic PCIe QLE InfiniBand host 5 This is a low-level driver for QLogic PCIe QLE InfiniBand host
6 channel adapters. This driver does not support the QLogic 6 channel adapters. This driver does not support the QLogic