aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2016-09-01 12:33:46 -0400
committerThomas Gleixner <tglx@linutronix.de>2016-09-01 12:33:46 -0400
commit0cb7bf61b1e9f05027de58c80f9b46a714d24e35 (patch)
tree41fb55cf62d07b425122f9a8b96412c0d8eb99c5 /drivers/infiniband/hw
parentaa877175e7a9982233ed8f10cb4bfddd78d82741 (diff)
parent3eab887a55424fc2c27553b7bfe32330df83f7b8 (diff)
Merge branch 'linus' into smp/hotplug
Apply upstream changes to avoid conflicts with pending patches.
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r--drivers/infiniband/hw/cxgb4/cm.c6
-rw-r--r--drivers/infiniband/hw/cxgb4/cq.c10
-rw-r--r--drivers/infiniband/hw/cxgb4/t4.h5
-rw-r--r--drivers/infiniband/hw/hfi1/affinity.c21
-rw-r--r--drivers/infiniband/hw/hfi1/debugfs.c14
-rw-r--r--drivers/infiniband/hw/hfi1/driver.c11
-rw-r--r--drivers/infiniband/hw/hfi1/file_ops.c4
-rw-r--r--drivers/infiniband/hw/hfi1/hfi.h20
-rw-r--r--drivers/infiniband/hw/hfi1/init.c2
-rw-r--r--drivers/infiniband/hw/hfi1/mad.c14
-rw-r--r--drivers/infiniband/hw/hfi1/qp.c4
-rw-r--r--drivers/infiniband/hw/hfi1/qsfp.c32
-rw-r--r--drivers/infiniband/hw/hfi1/qsfp.h3
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw.h4
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_cm.c26
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_main.c4
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_utils.c5
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c4
-rw-r--r--drivers/infiniband/hw/mlx4/cq.c20
-rw-r--r--drivers/infiniband/hw/mlx5/main.c1
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c14
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_sli.h12
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c4
-rw-r--r--drivers/infiniband/hw/qib/qib_debugfs.c12
-rw-r--r--drivers/infiniband/hw/qib/qib_fs.c26
-rw-r--r--drivers/infiniband/hw/qib/qib_qp.c4
-rw-r--r--drivers/infiniband/hw/usnic/usnic_ib_main.c3
27 files changed, 161 insertions, 124 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
index 3aca7f6171b4..b6a953aed7e8 100644
--- a/drivers/infiniband/hw/cxgb4/cm.c
+++ b/drivers/infiniband/hw/cxgb4/cm.c
@@ -1827,8 +1827,12 @@ static int process_mpa_request(struct c4iw_ep *ep, struct sk_buff *skb)
1827 (ep->mpa_pkt + sizeof(*mpa)); 1827 (ep->mpa_pkt + sizeof(*mpa));
1828 ep->ird = ntohs(mpa_v2_params->ird) & 1828 ep->ird = ntohs(mpa_v2_params->ird) &
1829 MPA_V2_IRD_ORD_MASK; 1829 MPA_V2_IRD_ORD_MASK;
1830 ep->ird = min_t(u32, ep->ird,
1831 cur_max_read_depth(ep->com.dev));
1830 ep->ord = ntohs(mpa_v2_params->ord) & 1832 ep->ord = ntohs(mpa_v2_params->ord) &
1831 MPA_V2_IRD_ORD_MASK; 1833 MPA_V2_IRD_ORD_MASK;
1834 ep->ord = min_t(u32, ep->ord,
1835 cur_max_read_depth(ep->com.dev));
1832 PDBG("%s initiator ird %u ord %u\n", __func__, ep->ird, 1836 PDBG("%s initiator ird %u ord %u\n", __func__, ep->ird,
1833 ep->ord); 1837 ep->ord);
1834 if (ntohs(mpa_v2_params->ird) & MPA_V2_PEER2PEER_MODEL) 1838 if (ntohs(mpa_v2_params->ird) & MPA_V2_PEER2PEER_MODEL)
@@ -3136,7 +3140,7 @@ int c4iw_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3136 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) { 3140 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) {
3137 if (conn_param->ord > ep->ird) { 3141 if (conn_param->ord > ep->ird) {
3138 if (RELAXED_IRD_NEGOTIATION) { 3142 if (RELAXED_IRD_NEGOTIATION) {
3139 ep->ord = ep->ird; 3143 conn_param->ord = ep->ird;
3140 } else { 3144 } else {
3141 ep->ird = conn_param->ird; 3145 ep->ird = conn_param->ird;
3142 ep->ord = conn_param->ord; 3146 ep->ord = conn_param->ord;
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
index 812ab7278b8e..ac926c942fee 100644
--- a/drivers/infiniband/hw/cxgb4/cq.c
+++ b/drivers/infiniband/hw/cxgb4/cq.c
@@ -1016,15 +1016,15 @@ int c4iw_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata)
1016int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags) 1016int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
1017{ 1017{
1018 struct c4iw_cq *chp; 1018 struct c4iw_cq *chp;
1019 int ret; 1019 int ret = 0;
1020 unsigned long flag; 1020 unsigned long flag;
1021 1021
1022 chp = to_c4iw_cq(ibcq); 1022 chp = to_c4iw_cq(ibcq);
1023 spin_lock_irqsave(&chp->lock, flag); 1023 spin_lock_irqsave(&chp->lock, flag);
1024 ret = t4_arm_cq(&chp->cq, 1024 t4_arm_cq(&chp->cq,
1025 (flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED); 1025 (flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED);
1026 if (flags & IB_CQ_REPORT_MISSED_EVENTS)
1027 ret = t4_cq_notempty(&chp->cq);
1026 spin_unlock_irqrestore(&chp->lock, flag); 1028 spin_unlock_irqrestore(&chp->lock, flag);
1027 if (ret && !(flags & IB_CQ_REPORT_MISSED_EVENTS))
1028 ret = 0;
1029 return ret; 1029 return ret;
1030} 1030}
diff --git a/drivers/infiniband/hw/cxgb4/t4.h b/drivers/infiniband/hw/cxgb4/t4.h
index 6126bbe36095..02173f4315fa 100644
--- a/drivers/infiniband/hw/cxgb4/t4.h
+++ b/drivers/infiniband/hw/cxgb4/t4.h
@@ -634,6 +634,11 @@ static inline int t4_valid_cqe(struct t4_cq *cq, struct t4_cqe *cqe)
634 return (CQE_GENBIT(cqe) == cq->gen); 634 return (CQE_GENBIT(cqe) == cq->gen);
635} 635}
636 636
637static inline int t4_cq_notempty(struct t4_cq *cq)
638{
639 return cq->sw_in_use || t4_valid_cqe(cq, &cq->queue[cq->cidx]);
640}
641
637static inline int t4_next_hw_cqe(struct t4_cq *cq, struct t4_cqe **cqe) 642static inline int t4_next_hw_cqe(struct t4_cq *cq, struct t4_cqe **cqe)
638{ 643{
639 int ret; 644 int ret;
diff --git a/drivers/infiniband/hw/hfi1/affinity.c b/drivers/infiniband/hw/hfi1/affinity.c
index 79575ee873f2..0566393e5aba 100644
--- a/drivers/infiniband/hw/hfi1/affinity.c
+++ b/drivers/infiniband/hw/hfi1/affinity.c
@@ -47,7 +47,6 @@
47#include <linux/topology.h> 47#include <linux/topology.h>
48#include <linux/cpumask.h> 48#include <linux/cpumask.h>
49#include <linux/module.h> 49#include <linux/module.h>
50#include <linux/cpumask.h>
51 50
52#include "hfi.h" 51#include "hfi.h"
53#include "affinity.h" 52#include "affinity.h"
@@ -682,7 +681,7 @@ int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf,
682 size_t count) 681 size_t count)
683{ 682{
684 struct hfi1_affinity_node *entry; 683 struct hfi1_affinity_node *entry;
685 struct cpumask mask; 684 cpumask_var_t mask;
686 int ret, i; 685 int ret, i;
687 686
688 spin_lock(&node_affinity.lock); 687 spin_lock(&node_affinity.lock);
@@ -692,19 +691,24 @@ int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf,
692 if (!entry) 691 if (!entry)
693 return -EINVAL; 692 return -EINVAL;
694 693
695 ret = cpulist_parse(buf, &mask); 694 ret = zalloc_cpumask_var(&mask, GFP_KERNEL);
695 if (!ret)
696 return -ENOMEM;
697
698 ret = cpulist_parse(buf, mask);
696 if (ret) 699 if (ret)
697 return ret; 700 goto out;
698 701
699 if (!cpumask_subset(&mask, cpu_online_mask) || cpumask_empty(&mask)) { 702 if (!cpumask_subset(mask, cpu_online_mask) || cpumask_empty(mask)) {
700 dd_dev_warn(dd, "Invalid CPU mask\n"); 703 dd_dev_warn(dd, "Invalid CPU mask\n");
701 return -EINVAL; 704 ret = -EINVAL;
705 goto out;
702 } 706 }
703 707
704 mutex_lock(&sdma_affinity_mutex); 708 mutex_lock(&sdma_affinity_mutex);
705 /* reset the SDMA interrupt affinity details */ 709 /* reset the SDMA interrupt affinity details */
706 init_cpu_mask_set(&entry->def_intr); 710 init_cpu_mask_set(&entry->def_intr);
707 cpumask_copy(&entry->def_intr.mask, &mask); 711 cpumask_copy(&entry->def_intr.mask, mask);
708 /* 712 /*
709 * Reassign the affinity for each SDMA interrupt. 713 * Reassign the affinity for each SDMA interrupt.
710 */ 714 */
@@ -720,8 +724,9 @@ int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf,
720 if (ret) 724 if (ret)
721 break; 725 break;
722 } 726 }
723
724 mutex_unlock(&sdma_affinity_mutex); 727 mutex_unlock(&sdma_affinity_mutex);
728out:
729 free_cpumask_var(mask);
725 return ret ? ret : strnlen(buf, PAGE_SIZE); 730 return ret ? ret : strnlen(buf, PAGE_SIZE);
726} 731}
727 732
diff --git a/drivers/infiniband/hw/hfi1/debugfs.c b/drivers/infiniband/hw/hfi1/debugfs.c
index dbab9d9cc288..a49cc88f08a2 100644
--- a/drivers/infiniband/hw/hfi1/debugfs.c
+++ b/drivers/infiniband/hw/hfi1/debugfs.c
@@ -223,28 +223,32 @@ DEBUGFS_SEQ_FILE_OPEN(ctx_stats)
223DEBUGFS_FILE_OPS(ctx_stats); 223DEBUGFS_FILE_OPS(ctx_stats);
224 224
225static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) 225static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos)
226__acquires(RCU) 226 __acquires(RCU)
227{ 227{
228 struct qp_iter *iter; 228 struct qp_iter *iter;
229 loff_t n = *pos; 229 loff_t n = *pos;
230 230
231 rcu_read_lock();
232 iter = qp_iter_init(s->private); 231 iter = qp_iter_init(s->private);
232
233 /* stop calls rcu_read_unlock */
234 rcu_read_lock();
235
233 if (!iter) 236 if (!iter)
234 return NULL; 237 return NULL;
235 238
236 while (n--) { 239 do {
237 if (qp_iter_next(iter)) { 240 if (qp_iter_next(iter)) {
238 kfree(iter); 241 kfree(iter);
239 return NULL; 242 return NULL;
240 } 243 }
241 } 244 } while (n--);
242 245
243 return iter; 246 return iter;
244} 247}
245 248
246static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, 249static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr,
247 loff_t *pos) 250 loff_t *pos)
251 __must_hold(RCU)
248{ 252{
249 struct qp_iter *iter = iter_ptr; 253 struct qp_iter *iter = iter_ptr;
250 254
@@ -259,7 +263,7 @@ static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr,
259} 263}
260 264
261static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) 265static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr)
262__releases(RCU) 266 __releases(RCU)
263{ 267{
264 rcu_read_unlock(); 268 rcu_read_unlock();
265} 269}
diff --git a/drivers/infiniband/hw/hfi1/driver.c b/drivers/infiniband/hw/hfi1/driver.c
index 8246dc7d0573..303f10555729 100644
--- a/drivers/infiniband/hw/hfi1/driver.c
+++ b/drivers/infiniband/hw/hfi1/driver.c
@@ -888,14 +888,15 @@ void set_all_slowpath(struct hfi1_devdata *dd)
888} 888}
889 889
890static inline int set_armed_to_active(struct hfi1_ctxtdata *rcd, 890static inline int set_armed_to_active(struct hfi1_ctxtdata *rcd,
891 struct hfi1_packet packet, 891 struct hfi1_packet *packet,
892 struct hfi1_devdata *dd) 892 struct hfi1_devdata *dd)
893{ 893{
894 struct work_struct *lsaw = &rcd->ppd->linkstate_active_work; 894 struct work_struct *lsaw = &rcd->ppd->linkstate_active_work;
895 struct hfi1_message_header *hdr = hfi1_get_msgheader(packet.rcd->dd, 895 struct hfi1_message_header *hdr = hfi1_get_msgheader(packet->rcd->dd,
896 packet.rhf_addr); 896 packet->rhf_addr);
897 u8 etype = rhf_rcv_type(packet->rhf);
897 898
898 if (hdr2sc(hdr, packet.rhf) != 0xf) { 899 if (etype == RHF_RCV_TYPE_IB && hdr2sc(hdr, packet->rhf) != 0xf) {
899 int hwstate = read_logical_state(dd); 900 int hwstate = read_logical_state(dd);
900 901
901 if (hwstate != LSTATE_ACTIVE) { 902 if (hwstate != LSTATE_ACTIVE) {
@@ -979,7 +980,7 @@ int handle_receive_interrupt(struct hfi1_ctxtdata *rcd, int thread)
979 /* Auto activate link on non-SC15 packet receive */ 980 /* Auto activate link on non-SC15 packet receive */
980 if (unlikely(rcd->ppd->host_link_state == 981 if (unlikely(rcd->ppd->host_link_state ==
981 HLS_UP_ARMED) && 982 HLS_UP_ARMED) &&
982 set_armed_to_active(rcd, packet, dd)) 983 set_armed_to_active(rcd, &packet, dd))
983 goto bail; 984 goto bail;
984 last = process_rcv_packet(&packet, thread); 985 last = process_rcv_packet(&packet, thread);
985 } 986 }
diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
index 1ecbec192358..7e03ccd2554d 100644
--- a/drivers/infiniband/hw/hfi1/file_ops.c
+++ b/drivers/infiniband/hw/hfi1/file_ops.c
@@ -183,6 +183,7 @@ static int hfi1_file_open(struct inode *inode, struct file *fp)
183 if (fd) { 183 if (fd) {
184 fd->rec_cpu_num = -1; /* no cpu affinity by default */ 184 fd->rec_cpu_num = -1; /* no cpu affinity by default */
185 fd->mm = current->mm; 185 fd->mm = current->mm;
186 atomic_inc(&fd->mm->mm_count);
186 } 187 }
187 188
188 fp->private_data = fd; 189 fp->private_data = fd;
@@ -222,7 +223,7 @@ static long hfi1_file_ioctl(struct file *fp, unsigned int cmd,
222 ret = assign_ctxt(fp, &uinfo); 223 ret = assign_ctxt(fp, &uinfo);
223 if (ret < 0) 224 if (ret < 0)
224 return ret; 225 return ret;
225 setup_ctxt(fp); 226 ret = setup_ctxt(fp);
226 if (ret) 227 if (ret)
227 return ret; 228 return ret;
228 ret = user_init(fp); 229 ret = user_init(fp);
@@ -779,6 +780,7 @@ static int hfi1_file_close(struct inode *inode, struct file *fp)
779 mutex_unlock(&hfi1_mutex); 780 mutex_unlock(&hfi1_mutex);
780 hfi1_free_ctxtdata(dd, uctxt); 781 hfi1_free_ctxtdata(dd, uctxt);
781done: 782done:
783 mmdrop(fdata->mm);
782 kobject_put(&dd->kobj); 784 kobject_put(&dd->kobj);
783 kfree(fdata); 785 kfree(fdata);
784 return 0; 786 return 0;
diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h
index 1000e0fd96d9..a021e660d482 100644
--- a/drivers/infiniband/hw/hfi1/hfi.h
+++ b/drivers/infiniband/hw/hfi1/hfi.h
@@ -1272,9 +1272,26 @@ static inline int hdr2sc(struct hfi1_message_header *hdr, u64 rhf)
1272 ((!!(rhf_dc_info(rhf))) << 4); 1272 ((!!(rhf_dc_info(rhf))) << 4);
1273} 1273}
1274 1274
1275#define HFI1_JKEY_WIDTH 16
1276#define HFI1_JKEY_MASK (BIT(16) - 1)
1277#define HFI1_ADMIN_JKEY_RANGE 32
1278
1279/*
1280 * J_KEYs are split and allocated in the following groups:
1281 * 0 - 31 - users with administrator privileges
1282 * 32 - 63 - kernel protocols using KDETH packets
1283 * 64 - 65535 - all other users using KDETH packets
1284 */
1275static inline u16 generate_jkey(kuid_t uid) 1285static inline u16 generate_jkey(kuid_t uid)
1276{ 1286{
1277 return from_kuid(current_user_ns(), uid) & 0xffff; 1287 u16 jkey = from_kuid(current_user_ns(), uid) & HFI1_JKEY_MASK;
1288
1289 if (capable(CAP_SYS_ADMIN))
1290 jkey &= HFI1_ADMIN_JKEY_RANGE - 1;
1291 else if (jkey < 64)
1292 jkey |= BIT(HFI1_JKEY_WIDTH - 1);
1293
1294 return jkey;
1278} 1295}
1279 1296
1280/* 1297/*
@@ -1656,7 +1673,6 @@ struct cc_state *get_cc_state_protected(struct hfi1_pportdata *ppd)
1656struct hfi1_devdata *hfi1_init_dd(struct pci_dev *, 1673struct hfi1_devdata *hfi1_init_dd(struct pci_dev *,
1657 const struct pci_device_id *); 1674 const struct pci_device_id *);
1658void hfi1_free_devdata(struct hfi1_devdata *); 1675void hfi1_free_devdata(struct hfi1_devdata *);
1659void cc_state_reclaim(struct rcu_head *rcu);
1660struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, size_t extra); 1676struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, size_t extra);
1661 1677
1662/* LED beaconing functions */ 1678/* LED beaconing functions */
diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c
index a358d23ecd54..b7935451093c 100644
--- a/drivers/infiniband/hw/hfi1/init.c
+++ b/drivers/infiniband/hw/hfi1/init.c
@@ -1333,7 +1333,7 @@ static void cleanup_device_data(struct hfi1_devdata *dd)
1333 spin_unlock(&ppd->cc_state_lock); 1333 spin_unlock(&ppd->cc_state_lock);
1334 1334
1335 if (cc_state) 1335 if (cc_state)
1336 call_rcu(&cc_state->rcu, cc_state_reclaim); 1336 kfree_rcu(cc_state, rcu);
1337 } 1337 }
1338 1338
1339 free_credit_return(dd); 1339 free_credit_return(dd);
diff --git a/drivers/infiniband/hw/hfi1/mad.c b/drivers/infiniband/hw/hfi1/mad.c
index 1263abe01999..39e42c373a01 100644
--- a/drivers/infiniband/hw/hfi1/mad.c
+++ b/drivers/infiniband/hw/hfi1/mad.c
@@ -1819,6 +1819,11 @@ static int __subn_get_opa_cable_info(struct opa_smp *smp, u32 am, u8 *data,
1819 u32 len = OPA_AM_CI_LEN(am) + 1; 1819 u32 len = OPA_AM_CI_LEN(am) + 1;
1820 int ret; 1820 int ret;
1821 1821
1822 if (dd->pport->port_type != PORT_TYPE_QSFP) {
1823 smp->status |= IB_SMP_INVALID_FIELD;
1824 return reply((struct ib_mad_hdr *)smp);
1825 }
1826
1822#define __CI_PAGE_SIZE BIT(7) /* 128 bytes */ 1827#define __CI_PAGE_SIZE BIT(7) /* 128 bytes */
1823#define __CI_PAGE_MASK ~(__CI_PAGE_SIZE - 1) 1828#define __CI_PAGE_MASK ~(__CI_PAGE_SIZE - 1)
1824#define __CI_PAGE_NUM(a) ((a) & __CI_PAGE_MASK) 1829#define __CI_PAGE_NUM(a) ((a) & __CI_PAGE_MASK)
@@ -3398,7 +3403,7 @@ static void apply_cc_state(struct hfi1_pportdata *ppd)
3398 3403
3399 spin_unlock(&ppd->cc_state_lock); 3404 spin_unlock(&ppd->cc_state_lock);
3400 3405
3401 call_rcu(&old_cc_state->rcu, cc_state_reclaim); 3406 kfree_rcu(old_cc_state, rcu);
3402} 3407}
3403 3408
3404static int __subn_set_opa_cong_setting(struct opa_smp *smp, u32 am, u8 *data, 3409static int __subn_set_opa_cong_setting(struct opa_smp *smp, u32 am, u8 *data,
@@ -3553,13 +3558,6 @@ static int __subn_get_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data,
3553 return reply((struct ib_mad_hdr *)smp); 3558 return reply((struct ib_mad_hdr *)smp);
3554} 3559}
3555 3560
3556void cc_state_reclaim(struct rcu_head *rcu)
3557{
3558 struct cc_state *cc_state = container_of(rcu, struct cc_state, rcu);
3559
3560 kfree(cc_state);
3561}
3562
3563static int __subn_set_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data, 3561static int __subn_set_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data,
3564 struct ib_device *ibdev, u8 port, 3562 struct ib_device *ibdev, u8 port,
3565 u32 *resp_len) 3563 u32 *resp_len)
diff --git a/drivers/infiniband/hw/hfi1/qp.c b/drivers/infiniband/hw/hfi1/qp.c
index a5aa3517e7d5..4e4d8317c281 100644
--- a/drivers/infiniband/hw/hfi1/qp.c
+++ b/drivers/infiniband/hw/hfi1/qp.c
@@ -656,10 +656,6 @@ struct qp_iter *qp_iter_init(struct hfi1_ibdev *dev)
656 656
657 iter->dev = dev; 657 iter->dev = dev;
658 iter->specials = dev->rdi.ibdev.phys_port_cnt * 2; 658 iter->specials = dev->rdi.ibdev.phys_port_cnt * 2;
659 if (qp_iter_next(iter)) {
660 kfree(iter);
661 return NULL;
662 }
663 659
664 return iter; 660 return iter;
665} 661}
diff --git a/drivers/infiniband/hw/hfi1/qsfp.c b/drivers/infiniband/hw/hfi1/qsfp.c
index a207717ade2a..4e95ad810847 100644
--- a/drivers/infiniband/hw/hfi1/qsfp.c
+++ b/drivers/infiniband/hw/hfi1/qsfp.c
@@ -706,8 +706,8 @@ int get_cable_info(struct hfi1_devdata *dd, u32 port_num, u32 addr, u32 len,
706 u8 *data) 706 u8 *data)
707{ 707{
708 struct hfi1_pportdata *ppd; 708 struct hfi1_pportdata *ppd;
709 u32 excess_len = 0; 709 u32 excess_len = len;
710 int ret = 0; 710 int ret = 0, offset = 0;
711 711
712 if (port_num > dd->num_pports || port_num < 1) { 712 if (port_num > dd->num_pports || port_num < 1) {
713 dd_dev_info(dd, "%s: Invalid port number %d\n", 713 dd_dev_info(dd, "%s: Invalid port number %d\n",
@@ -740,6 +740,34 @@ int get_cable_info(struct hfi1_devdata *dd, u32 port_num, u32 addr, u32 len,
740 } 740 }
741 741
742 memcpy(data, &ppd->qsfp_info.cache[addr], len); 742 memcpy(data, &ppd->qsfp_info.cache[addr], len);
743
744 if (addr <= QSFP_MONITOR_VAL_END &&
745 (addr + len) >= QSFP_MONITOR_VAL_START) {
746 /* Overlap with the dynamic channel monitor range */
747 if (addr < QSFP_MONITOR_VAL_START) {
748 if (addr + len <= QSFP_MONITOR_VAL_END)
749 len = addr + len - QSFP_MONITOR_VAL_START;
750 else
751 len = QSFP_MONITOR_RANGE;
752 offset = QSFP_MONITOR_VAL_START - addr;
753 addr = QSFP_MONITOR_VAL_START;
754 } else if (addr == QSFP_MONITOR_VAL_START) {
755 offset = 0;
756 if (addr + len > QSFP_MONITOR_VAL_END)
757 len = QSFP_MONITOR_RANGE;
758 } else {
759 offset = 0;
760 if (addr + len > QSFP_MONITOR_VAL_END)
761 len = QSFP_MONITOR_VAL_END - addr + 1;
762 }
763 /* Refresh the values of the dynamic monitors from the cable */
764 ret = one_qsfp_read(ppd, dd->hfi1_id, addr, data + offset, len);
765 if (ret != len) {
766 ret = -EAGAIN;
767 goto set_zeroes;
768 }
769 }
770
743 return 0; 771 return 0;
744 772
745set_zeroes: 773set_zeroes:
diff --git a/drivers/infiniband/hw/hfi1/qsfp.h b/drivers/infiniband/hw/hfi1/qsfp.h
index 69275ebd9597..36cf52359848 100644
--- a/drivers/infiniband/hw/hfi1/qsfp.h
+++ b/drivers/infiniband/hw/hfi1/qsfp.h
@@ -74,6 +74,9 @@
74/* Defined fields that Intel requires of qualified cables */ 74/* Defined fields that Intel requires of qualified cables */
75/* Byte 0 is Identifier, not checked */ 75/* Byte 0 is Identifier, not checked */
76/* Byte 1 is reserved "status MSB" */ 76/* Byte 1 is reserved "status MSB" */
77#define QSFP_MONITOR_VAL_START 22
78#define QSFP_MONITOR_VAL_END 81
79#define QSFP_MONITOR_RANGE (QSFP_MONITOR_VAL_END - QSFP_MONITOR_VAL_START + 1)
77#define QSFP_TX_CTRL_BYTE_OFFS 86 80#define QSFP_TX_CTRL_BYTE_OFFS 86
78#define QSFP_PWR_CTRL_BYTE_OFFS 93 81#define QSFP_PWR_CTRL_BYTE_OFFS 93
79#define QSFP_CDR_CTRL_BYTE_OFFS 98 82#define QSFP_CDR_CTRL_BYTE_OFFS 98
diff --git a/drivers/infiniband/hw/i40iw/i40iw.h b/drivers/infiniband/hw/i40iw/i40iw.h
index b738acdb9b02..8ec09e470f84 100644
--- a/drivers/infiniband/hw/i40iw/i40iw.h
+++ b/drivers/infiniband/hw/i40iw/i40iw.h
@@ -232,7 +232,7 @@ struct i40iw_device {
232 struct i40e_client *client; 232 struct i40e_client *client;
233 struct i40iw_hw hw; 233 struct i40iw_hw hw;
234 struct i40iw_cm_core cm_core; 234 struct i40iw_cm_core cm_core;
235 unsigned long *mem_resources; 235 u8 *mem_resources;
236 unsigned long *allocated_qps; 236 unsigned long *allocated_qps;
237 unsigned long *allocated_cqs; 237 unsigned long *allocated_cqs;
238 unsigned long *allocated_mrs; 238 unsigned long *allocated_mrs;
@@ -435,8 +435,8 @@ static inline int i40iw_alloc_resource(struct i40iw_device *iwdev,
435 *next = resource_num + 1; 435 *next = resource_num + 1;
436 if (*next == max_resources) 436 if (*next == max_resources)
437 *next = 0; 437 *next = 0;
438 spin_unlock_irqrestore(&iwdev->resource_lock, flags);
439 *req_resource_num = resource_num; 438 *req_resource_num = resource_num;
439 spin_unlock_irqrestore(&iwdev->resource_lock, flags);
440 440
441 return 0; 441 return 0;
442} 442}
diff --git a/drivers/infiniband/hw/i40iw/i40iw_cm.c b/drivers/infiniband/hw/i40iw/i40iw_cm.c
index 5026dc79978a..7ca0638579c0 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_cm.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_cm.c
@@ -535,8 +535,8 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,
535 buf += hdr_len; 535 buf += hdr_len;
536 } 536 }
537 537
538 if (pd_len) 538 if (pdata && pdata->addr)
539 memcpy(buf, pdata->addr, pd_len); 539 memcpy(buf, pdata->addr, pdata->size);
540 540
541 atomic_set(&sqbuf->refcount, 1); 541 atomic_set(&sqbuf->refcount, 1);
542 542
@@ -3347,26 +3347,6 @@ int i40iw_cm_disconn(struct i40iw_qp *iwqp)
3347} 3347}
3348 3348
3349/** 3349/**
3350 * i40iw_loopback_nop - Send a nop
3351 * @qp: associated hw qp
3352 */
3353static void i40iw_loopback_nop(struct i40iw_sc_qp *qp)
3354{
3355 u64 *wqe;
3356 u64 header;
3357
3358 wqe = qp->qp_uk.sq_base->elem;
3359 set_64bit_val(wqe, 0, 0);
3360 set_64bit_val(wqe, 8, 0);
3361 set_64bit_val(wqe, 16, 0);
3362
3363 header = LS_64(I40IWQP_OP_NOP, I40IWQPSQ_OPCODE) |
3364 LS_64(0, I40IWQPSQ_SIGCOMPL) |
3365 LS_64(qp->qp_uk.swqe_polarity, I40IWQPSQ_VALID);
3366 set_64bit_val(wqe, 24, header);
3367}
3368
3369/**
3370 * i40iw_qp_disconnect - free qp and close cm 3350 * i40iw_qp_disconnect - free qp and close cm
3371 * @iwqp: associate qp for the connection 3351 * @iwqp: associate qp for the connection
3372 */ 3352 */
@@ -3638,7 +3618,7 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3638 } else { 3618 } else {
3639 if (iwqp->page) 3619 if (iwqp->page)
3640 iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page); 3620 iwqp->sc_qp.qp_uk.sq_base = kmap(iwqp->page);
3641 i40iw_loopback_nop(&iwqp->sc_qp); 3621 dev->iw_priv_qp_ops->qp_send_lsmm(&iwqp->sc_qp, NULL, 0, 0);
3642 } 3622 }
3643 3623
3644 if (iwqp->page) 3624 if (iwqp->page)
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c
index 6e9081380a27..0cbbe4038298 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_main.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
@@ -1558,6 +1558,10 @@ static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client)
1558 enum i40iw_status_code status; 1558 enum i40iw_status_code status;
1559 struct i40iw_handler *hdl; 1559 struct i40iw_handler *hdl;
1560 1560
1561 hdl = i40iw_find_netdev(ldev->netdev);
1562 if (hdl)
1563 return 0;
1564
1561 hdl = kzalloc(sizeof(*hdl), GFP_KERNEL); 1565 hdl = kzalloc(sizeof(*hdl), GFP_KERNEL);
1562 if (!hdl) 1566 if (!hdl)
1563 return -ENOMEM; 1567 return -ENOMEM;
diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c b/drivers/infiniband/hw/i40iw/i40iw_utils.c
index 0e8db0a35141..6fd043b1d714 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_utils.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c
@@ -673,8 +673,11 @@ enum i40iw_status_code i40iw_free_virt_mem(struct i40iw_hw *hw,
673{ 673{
674 if (!mem) 674 if (!mem)
675 return I40IW_ERR_PARAM; 675 return I40IW_ERR_PARAM;
676 /*
677 * mem->va points to the parent of mem, so both mem and mem->va
678 * can not be touched once mem->va is freed
679 */
676 kfree(mem->va); 680 kfree(mem->va);
677 mem->va = NULL;
678 return 0; 681 return 0;
679} 682}
680 683
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
index 2360338877bf..6329c971c22f 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c
@@ -794,7 +794,6 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd,
794 return &iwqp->ibqp; 794 return &iwqp->ibqp;
795error: 795error:
796 i40iw_free_qp_resources(iwdev, iwqp, qp_num); 796 i40iw_free_qp_resources(iwdev, iwqp, qp_num);
797 kfree(mem);
798 return ERR_PTR(err_code); 797 return ERR_PTR(err_code);
799} 798}
800 799
@@ -1926,8 +1925,7 @@ static int i40iw_dereg_mr(struct ib_mr *ib_mr)
1926 } 1925 }
1927 if (iwpbl->pbl_allocated) 1926 if (iwpbl->pbl_allocated)
1928 i40iw_free_pble(iwdev->pble_rsrc, palloc); 1927 i40iw_free_pble(iwdev->pble_rsrc, palloc);
1929 kfree(iwpbl->iwmr); 1928 kfree(iwmr);
1930 iwpbl->iwmr = NULL;
1931 return 0; 1929 return 0;
1932 } 1930 }
1933 1931
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index d6fc8a6e8c33..006db6436e3b 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -576,8 +576,8 @@ static int mlx4_ib_ipoib_csum_ok(__be16 status, __be16 checksum)
576 checksum == cpu_to_be16(0xffff); 576 checksum == cpu_to_be16(0xffff);
577} 577}
578 578
579static int use_tunnel_data(struct mlx4_ib_qp *qp, struct mlx4_ib_cq *cq, struct ib_wc *wc, 579static void use_tunnel_data(struct mlx4_ib_qp *qp, struct mlx4_ib_cq *cq, struct ib_wc *wc,
580 unsigned tail, struct mlx4_cqe *cqe, int is_eth) 580 unsigned tail, struct mlx4_cqe *cqe, int is_eth)
581{ 581{
582 struct mlx4_ib_proxy_sqp_hdr *hdr; 582 struct mlx4_ib_proxy_sqp_hdr *hdr;
583 583
@@ -600,8 +600,6 @@ static int use_tunnel_data(struct mlx4_ib_qp *qp, struct mlx4_ib_cq *cq, struct
600 wc->slid = be16_to_cpu(hdr->tun.slid_mac_47_32); 600 wc->slid = be16_to_cpu(hdr->tun.slid_mac_47_32);
601 wc->sl = (u8) (be16_to_cpu(hdr->tun.sl_vid) >> 12); 601 wc->sl = (u8) (be16_to_cpu(hdr->tun.sl_vid) >> 12);
602 } 602 }
603
604 return 0;
605} 603}
606 604
607static void mlx4_ib_qp_sw_comp(struct mlx4_ib_qp *qp, int num_entries, 605static void mlx4_ib_qp_sw_comp(struct mlx4_ib_qp *qp, int num_entries,
@@ -692,7 +690,7 @@ repoll:
692 if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_OPCODE_NOP && 690 if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_OPCODE_NOP &&
693 is_send)) { 691 is_send)) {
694 pr_warn("Completion for NOP opcode detected!\n"); 692 pr_warn("Completion for NOP opcode detected!\n");
695 return -EINVAL; 693 return -EAGAIN;
696 } 694 }
697 695
698 /* Resize CQ in progress */ 696 /* Resize CQ in progress */
@@ -723,7 +721,7 @@ repoll:
723 if (unlikely(!mqp)) { 721 if (unlikely(!mqp)) {
724 pr_warn("CQ %06x with entry for unknown QPN %06x\n", 722 pr_warn("CQ %06x with entry for unknown QPN %06x\n",
725 cq->mcq.cqn, be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK); 723 cq->mcq.cqn, be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK);
726 return -EINVAL; 724 return -EAGAIN;
727 } 725 }
728 726
729 *cur_qp = to_mibqp(mqp); 727 *cur_qp = to_mibqp(mqp);
@@ -741,7 +739,7 @@ repoll:
741 if (unlikely(!msrq)) { 739 if (unlikely(!msrq)) {
742 pr_warn("CQ %06x with entry for unknown SRQN %06x\n", 740 pr_warn("CQ %06x with entry for unknown SRQN %06x\n",
743 cq->mcq.cqn, srq_num); 741 cq->mcq.cqn, srq_num);
744 return -EINVAL; 742 return -EAGAIN;
745 } 743 }
746 } 744 }
747 745
@@ -852,9 +850,11 @@ repoll:
852 if (mlx4_is_mfunc(to_mdev(cq->ibcq.device)->dev)) { 850 if (mlx4_is_mfunc(to_mdev(cq->ibcq.device)->dev)) {
853 if ((*cur_qp)->mlx4_ib_qp_type & 851 if ((*cur_qp)->mlx4_ib_qp_type &
854 (MLX4_IB_QPT_PROXY_SMI_OWNER | 852 (MLX4_IB_QPT_PROXY_SMI_OWNER |
855 MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI)) 853 MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI)) {
856 return use_tunnel_data(*cur_qp, cq, wc, tail, 854 use_tunnel_data(*cur_qp, cq, wc, tail, cqe,
857 cqe, is_eth); 855 is_eth);
856 return 0;
857 }
858 } 858 }
859 859
860 wc->slid = be16_to_cpu(cqe->rlid); 860 wc->slid = be16_to_cpu(cqe->rlid);
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index a84bb766fc62..1b4094baa2de 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -37,7 +37,6 @@
37#include <linux/pci.h> 37#include <linux/pci.h>
38#include <linux/dma-mapping.h> 38#include <linux/dma-mapping.h>
39#include <linux/slab.h> 39#include <linux/slab.h>
40#include <linux/io-mapping.h>
41#if defined(CONFIG_X86) 40#if defined(CONFIG_X86)
42#include <asm/pat.h> 41#include <asm/pat.h>
43#endif 42#endif
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index 16740dcb876b..67fc0b6857e1 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -1156,18 +1156,18 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev,
1156 attr->max_srq = 1156 attr->max_srq =
1157 (rsp->max_srq_rpir_qps & OCRDMA_MBX_QUERY_CFG_MAX_SRQ_MASK) >> 1157 (rsp->max_srq_rpir_qps & OCRDMA_MBX_QUERY_CFG_MAX_SRQ_MASK) >>
1158 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_OFFSET; 1158 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_OFFSET;
1159 attr->max_send_sge = ((rsp->max_write_send_sge & 1159 attr->max_send_sge = ((rsp->max_recv_send_sge &
1160 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> 1160 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >>
1161 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT); 1161 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT);
1162 attr->max_recv_sge = (rsp->max_write_send_sge & 1162 attr->max_recv_sge = (rsp->max_recv_send_sge &
1163 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK) >> 1163 OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_MASK) >>
1164 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT; 1164 OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_SHIFT;
1165 attr->max_srq_sge = (rsp->max_srq_rqe_sge & 1165 attr->max_srq_sge = (rsp->max_srq_rqe_sge &
1166 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> 1166 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >>
1167 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; 1167 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET;
1168 attr->max_rdma_sge = (rsp->max_write_send_sge & 1168 attr->max_rdma_sge = (rsp->max_wr_rd_sge &
1169 OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK) >> 1169 OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_MASK) >>
1170 OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT; 1170 OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_SHIFT;
1171 attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & 1171 attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp &
1172 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> 1172 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >>
1173 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; 1173 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT;
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
index 0efc9662c6d8..37df4481bb8f 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
@@ -554,9 +554,9 @@ enum {
554 OCRDMA_MBX_QUERY_CFG_L3_TYPE_MASK = 0x18, 554 OCRDMA_MBX_QUERY_CFG_L3_TYPE_MASK = 0x18,
555 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0, 555 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_SHIFT = 0,
556 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF, 556 OCRDMA_MBX_QUERY_CFG_MAX_SEND_SGE_MASK = 0xFFFF,
557 OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT = 16, 557 OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_SHIFT = 16,
558 OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK = 0xFFFF << 558 OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_MASK = 0xFFFF <<
559 OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT, 559 OCRDMA_MBX_QUERY_CFG_MAX_RECV_SGE_SHIFT,
560 560
561 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0, 561 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT = 0,
562 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF, 562 OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK = 0xFFFF,
@@ -612,6 +612,8 @@ enum {
612 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET = 0, 612 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET = 0,
613 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK = 0xFFFF << 613 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK = 0xFFFF <<
614 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET, 614 OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET,
615 OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_SHIFT = 0,
616 OCRDMA_MBX_QUERY_CFG_MAX_RD_SGE_MASK = 0xFFFF,
615}; 617};
616 618
617struct ocrdma_mbx_query_config { 619struct ocrdma_mbx_query_config {
@@ -619,7 +621,7 @@ struct ocrdma_mbx_query_config {
619 struct ocrdma_mbx_rsp rsp; 621 struct ocrdma_mbx_rsp rsp;
620 u32 qp_srq_cq_ird_ord; 622 u32 qp_srq_cq_ird_ord;
621 u32 max_pd_ca_ack_delay; 623 u32 max_pd_ca_ack_delay;
622 u32 max_write_send_sge; 624 u32 max_recv_send_sge;
623 u32 max_ird_ord_per_qp; 625 u32 max_ird_ord_per_qp;
624 u32 max_shared_ird_ord; 626 u32 max_shared_ird_ord;
625 u32 max_mr; 627 u32 max_mr;
@@ -639,6 +641,8 @@ struct ocrdma_mbx_query_config {
639 u32 max_wqes_rqes_per_q; 641 u32 max_wqes_rqes_per_q;
640 u32 max_cq_cqes_per_cq; 642 u32 max_cq_cqes_per_cq;
641 u32 max_srq_rqe_sge; 643 u32 max_srq_rqe_sge;
644 u32 max_wr_rd_sge;
645 u32 ird_pgsz_num_pages;
642}; 646};
643 647
644struct ocrdma_fw_ver_rsp { 648struct ocrdma_fw_ver_rsp {
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
index b1a3d91fe8b9..0aa854737e74 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
@@ -125,8 +125,8 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr,
125 IB_DEVICE_SYS_IMAGE_GUID | 125 IB_DEVICE_SYS_IMAGE_GUID |
126 IB_DEVICE_LOCAL_DMA_LKEY | 126 IB_DEVICE_LOCAL_DMA_LKEY |
127 IB_DEVICE_MEM_MGT_EXTENSIONS; 127 IB_DEVICE_MEM_MGT_EXTENSIONS;
128 attr->max_sge = dev->attr.max_send_sge; 128 attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_recv_sge);
129 attr->max_sge_rd = attr->max_sge; 129 attr->max_sge_rd = dev->attr.max_rdma_sge;
130 attr->max_cq = dev->attr.max_cq; 130 attr->max_cq = dev->attr.max_cq;
131 attr->max_cqe = dev->attr.max_cqe; 131 attr->max_cqe = dev->attr.max_cqe;
132 attr->max_mr = dev->attr.max_mr; 132 attr->max_mr = dev->attr.max_mr;
diff --git a/drivers/infiniband/hw/qib/qib_debugfs.c b/drivers/infiniband/hw/qib/qib_debugfs.c
index 5e75b43c596b..5bad8e3b40bb 100644
--- a/drivers/infiniband/hw/qib/qib_debugfs.c
+++ b/drivers/infiniband/hw/qib/qib_debugfs.c
@@ -189,27 +189,32 @@ static int _ctx_stats_seq_show(struct seq_file *s, void *v)
189DEBUGFS_FILE(ctx_stats) 189DEBUGFS_FILE(ctx_stats)
190 190
191static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos) 191static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos)
192 __acquires(RCU)
192{ 193{
193 struct qib_qp_iter *iter; 194 struct qib_qp_iter *iter;
194 loff_t n = *pos; 195 loff_t n = *pos;
195 196
196 rcu_read_lock();
197 iter = qib_qp_iter_init(s->private); 197 iter = qib_qp_iter_init(s->private);
198
199 /* stop calls rcu_read_unlock */
200 rcu_read_lock();
201
198 if (!iter) 202 if (!iter)
199 return NULL; 203 return NULL;
200 204
201 while (n--) { 205 do {
202 if (qib_qp_iter_next(iter)) { 206 if (qib_qp_iter_next(iter)) {
203 kfree(iter); 207 kfree(iter);
204 return NULL; 208 return NULL;
205 } 209 }
206 } 210 } while (n--);
207 211
208 return iter; 212 return iter;
209} 213}
210 214
211static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr, 215static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr,
212 loff_t *pos) 216 loff_t *pos)
217 __must_hold(RCU)
213{ 218{
214 struct qib_qp_iter *iter = iter_ptr; 219 struct qib_qp_iter *iter = iter_ptr;
215 220
@@ -224,6 +229,7 @@ static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr,
224} 229}
225 230
226static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr) 231static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr)
232 __releases(RCU)
227{ 233{
228 rcu_read_unlock(); 234 rcu_read_unlock();
229} 235}
diff --git a/drivers/infiniband/hw/qib/qib_fs.c b/drivers/infiniband/hw/qib/qib_fs.c
index fcdf37913a26..c3edc033f7c4 100644
--- a/drivers/infiniband/hw/qib/qib_fs.c
+++ b/drivers/infiniband/hw/qib/qib_fs.c
@@ -328,26 +328,12 @@ static ssize_t flash_write(struct file *file, const char __user *buf,
328 328
329 pos = *ppos; 329 pos = *ppos;
330 330
331 if (pos != 0) { 331 if (pos != 0 || count != sizeof(struct qib_flash))
332 ret = -EINVAL; 332 return -EINVAL;
333 goto bail;
334 }
335
336 if (count != sizeof(struct qib_flash)) {
337 ret = -EINVAL;
338 goto bail;
339 }
340
341 tmp = kmalloc(count, GFP_KERNEL);
342 if (!tmp) {
343 ret = -ENOMEM;
344 goto bail;
345 }
346 333
347 if (copy_from_user(tmp, buf, count)) { 334 tmp = memdup_user(buf, count);
348 ret = -EFAULT; 335 if (IS_ERR(tmp))
349 goto bail_tmp; 336 return PTR_ERR(tmp);
350 }
351 337
352 dd = private2dd(file); 338 dd = private2dd(file);
353 if (qib_eeprom_write(dd, pos, tmp, count)) { 339 if (qib_eeprom_write(dd, pos, tmp, count)) {
@@ -361,8 +347,6 @@ static ssize_t flash_write(struct file *file, const char __user *buf,
361 347
362bail_tmp: 348bail_tmp:
363 kfree(tmp); 349 kfree(tmp);
364
365bail:
366 return ret; 350 return ret;
367} 351}
368 352
diff --git a/drivers/infiniband/hw/qib/qib_qp.c b/drivers/infiniband/hw/qib/qib_qp.c
index 9cc0aae1d781..f9b8cd2354d1 100644
--- a/drivers/infiniband/hw/qib/qib_qp.c
+++ b/drivers/infiniband/hw/qib/qib_qp.c
@@ -573,10 +573,6 @@ struct qib_qp_iter *qib_qp_iter_init(struct qib_ibdev *dev)
573 return NULL; 573 return NULL;
574 574
575 iter->dev = dev; 575 iter->dev = dev;
576 if (qib_qp_iter_next(iter)) {
577 kfree(iter);
578 return NULL;
579 }
580 576
581 return iter; 577 return iter;
582} 578}
diff --git a/drivers/infiniband/hw/usnic/usnic_ib_main.c b/drivers/infiniband/hw/usnic/usnic_ib_main.c
index c229b9f4a52d..0a89a955550b 100644
--- a/drivers/infiniband/hw/usnic/usnic_ib_main.c
+++ b/drivers/infiniband/hw/usnic/usnic_ib_main.c
@@ -664,7 +664,8 @@ static int __init usnic_ib_init(void)
664 return err; 664 return err;
665 } 665 }
666 666
667 if (pci_register_driver(&usnic_ib_pci_driver)) { 667 err = pci_register_driver(&usnic_ib_pci_driver);
668 if (err) {
668 usnic_err("Unable to register with PCI\n"); 669 usnic_err("Unable to register with PCI\n");
669 goto out_umem_fini; 670 goto out_umem_fini;
670 } 671 }