diff options
Diffstat (limited to 'drivers/infiniband/hw')
| -rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_cm.c | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/cxgb4/cm.c | 10 | ||||
| -rw-r--r-- | drivers/infiniband/hw/cxgb4/cq.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 6 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.c | 6 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_file_ops.c | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_iba7322.c | 18 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_qsfp.c | 12 | 
8 files changed, 33 insertions, 29 deletions
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index de6d0774e60..c88b12beef2 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c @@ -1375,8 +1375,10 @@ static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)  		goto reject;  	}  	dst = &rt->dst; +	rcu_read_lock();  	neigh = dst_get_neighbour(dst);  	l2t = t3_l2t_get(tdev, neigh, neigh->dev); +	rcu_read_unlock();  	if (!l2t) {  		printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n",  		       __func__); @@ -1946,10 +1948,12 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)  	}  	ep->dst = &rt->dst; +	rcu_read_lock();  	neigh = dst_get_neighbour(ep->dst);  	/* get a l2t entry */  	ep->l2t = t3_l2t_get(ep->com.tdev, neigh, neigh->dev); +	rcu_read_unlock();  	if (!ep->l2t) {  		printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);  		err = -ENOMEM; diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index b36cdac9c55..0747004313a 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c @@ -542,8 +542,10 @@ static void send_mpa_req(struct c4iw_ep *ep, struct sk_buff *skb,  		     (mpa_rev_to_use == 2 ? MPA_ENHANCED_RDMA_CONN : 0);  	mpa->private_data_size = htons(ep->plen);  	mpa->revision = mpa_rev_to_use; -	if (mpa_rev_to_use == 1) +	if (mpa_rev_to_use == 1) {  		ep->tried_with_mpa_v1 = 1; +		ep->retry_with_mpa_v1 = 0; +	}  	if (mpa_rev_to_use == 2) {  		mpa->private_data_size += @@ -1594,6 +1596,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)  		goto reject;  	}  	dst = &rt->dst; +	rcu_read_lock();  	neigh = dst_get_neighbour(dst);  	if (neigh->dev->flags & IFF_LOOPBACK) {  		pdev = ip_dev_find(&init_net, peer_ip); @@ -1620,6 +1623,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)  		rss_qid = dev->rdev.lldi.rxq_ids[  			  cxgb4_port_idx(neigh->dev) * step];  	} +	rcu_read_unlock();  	if (!l2t) {  		printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n",  		       __func__); @@ -1820,6 +1824,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)  	}  	ep->dst = &rt->dst; +	rcu_read_lock();  	neigh = dst_get_neighbour(ep->dst);  	/* get a l2t entry */ @@ -1856,6 +1861,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)  		ep->rss_qid = ep->com.dev->rdev.lldi.rxq_ids[  			cxgb4_port_idx(neigh->dev) * step];  	} +	rcu_read_unlock();  	if (!ep->l2t) {  		printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);  		err = -ENOMEM; @@ -2301,6 +2307,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)  	}  	ep->dst = &rt->dst; +	rcu_read_lock();  	neigh = dst_get_neighbour(ep->dst);  	/* get a l2t entry */ @@ -2339,6 +2346,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)  		ep->retry_with_mpa_v1 = 0;  		ep->tried_with_mpa_v1 = 0;  	} +	rcu_read_unlock();  	if (!ep->l2t) {  		printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);  		err = -ENOMEM; diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c index f35a935267e..0f1607c8325 100644 --- a/drivers/infiniband/hw/cxgb4/cq.c +++ b/drivers/infiniband/hw/cxgb4/cq.c @@ -311,7 +311,7 @@ void c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count)  	while (ptr != cq->sw_pidx) {  		cqe = &cq->sw_queue[ptr];  		if (RQ_TYPE(cqe) && (CQE_OPCODE(cqe) != FW_RI_READ_RESP) && -		    (CQE_QPID(cqe) == wq->rq.qid) && cqe_completes_wr(cqe, wq)) +		    (CQE_QPID(cqe) == wq->sq.qid) && cqe_completes_wr(cqe, wq))  			(*count)++;  		if (++ptr == cq->size)  			ptr = 0; diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 77f3dbc0aaa..18836cdf1e1 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c @@ -1244,7 +1244,8 @@ err_reg:  err_counter:  	for (; i; --i) -		mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]); +		if (ibdev->counters[i - 1] != -1) +			mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]);  err_map:  	iounmap(ibdev->uar_map); @@ -1275,7 +1276,8 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)  	}  	iounmap(ibdev->uar_map);  	for (p = 0; p < ibdev->num_ports; ++p) -		mlx4_counter_free(ibdev->dev, ibdev->counters[p]); +		if (ibdev->counters[p] != -1) +			mlx4_counter_free(ibdev->dev, ibdev->counters[p]);  	mlx4_foreach_port(p, dev, MLX4_PORT_TYPE_IB)  		mlx4_CLOSE_PORT(dev, p); diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index dfce9ea98a3..0a52d72371e 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c @@ -1377,9 +1377,11 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpi  		neigh_release(neigh);  	} -	if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) +	if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID))) { +		rcu_read_lock();  		neigh_event_send(dst_get_neighbour(&rt->dst), NULL); - +		rcu_read_unlock(); +	}  	ip_rt_put(rt);  	return rc;  } diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c index 574600ef5b4..a7403248d83 100644 --- a/drivers/infiniband/hw/qib/qib_file_ops.c +++ b/drivers/infiniband/hw/qib/qib_file_ops.c @@ -1285,7 +1285,7 @@ static int setup_ctxt(struct qib_pportdata *ppd, int ctxt,  	strlcpy(rcd->comm, current->comm, sizeof(rcd->comm));  	ctxt_fp(fp) = rcd;  	qib_stats.sps_ctxts++; -	dd->freectxts++; +	dd->freectxts--;  	ret = 0;  	goto bail; @@ -1794,7 +1794,7 @@ static int qib_close(struct inode *in, struct file *fp)  		if (dd->pageshadow)  			unlock_expected_tids(rcd);  		qib_stats.sps_ctxts--; -		dd->freectxts--; +		dd->freectxts++;  	}  	mutex_unlock(&qib_mutex); diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c index 5bd2162b95d..1d5895941e1 100644 --- a/drivers/infiniband/hw/qib/qib_iba7322.c +++ b/drivers/infiniband/hw/qib/qib_iba7322.c @@ -2307,19 +2307,11 @@ static int qib_7322_bringup_serdes(struct qib_pportdata *ppd)  		SYM_LSB(IBCCtrlA_0, MaxPktLen);  	ppd->cpspec->ibcctrl_a = ibc; /* without linkcmd or linkinitcmd! */ -	/* initially come up waiting for TS1, without sending anything. */ -	val = ppd->cpspec->ibcctrl_a | (QLOGIC_IB_IBCC_LINKINITCMD_DISABLE << -		QLOGIC_IB_IBCC_LINKINITCMD_SHIFT); - -	ppd->cpspec->ibcctrl_a = val;  	/*  	 * Reset the PCS interface to the serdes (and also ibc, which is still  	 * in reset from above).  Writes new value of ibcctrl_a as last step.  	 */  	qib_7322_mini_pcs_reset(ppd); -	qib_write_kreg(dd, kr_scratch, 0ULL); -	/* clear the linkinit cmds */ -	ppd->cpspec->ibcctrl_a &= ~SYM_MASK(IBCCtrlA_0, LinkInitCmd);  	if (!ppd->cpspec->ibcctrl_b) {  		unsigned lse = ppd->link_speed_enabled; @@ -2385,6 +2377,14 @@ static int qib_7322_bringup_serdes(struct qib_pportdata *ppd)  	ppd->cpspec->ibcctrl_a |= SYM_MASK(IBCCtrlA_0, IBLinkEn);  	set_vls(ppd); +	/* initially come up DISABLED, without sending anything. */ +	val = ppd->cpspec->ibcctrl_a | (QLOGIC_IB_IBCC_LINKINITCMD_DISABLE << +					QLOGIC_IB_IBCC_LINKINITCMD_SHIFT); +	qib_write_kreg_port(ppd, krp_ibcctrl_a, val); +	qib_write_kreg(dd, kr_scratch, 0ULL); +	/* clear the linkinit cmds */ +	ppd->cpspec->ibcctrl_a = val & ~SYM_MASK(IBCCtrlA_0, LinkInitCmd); +  	/* be paranoid against later code motion, etc. */  	spin_lock_irqsave(&dd->cspec->rcvmod_lock, flags);  	ppd->p_rcvctrl |= SYM_MASK(RcvCtrl_0, RcvIBPortEnable); @@ -5241,7 +5241,7 @@ static int qib_7322_ib_updown(struct qib_pportdata *ppd, int ibup, u64 ibcs)  			   off */  			if (ppd->dd->flags & QIB_HAS_QSFP) {  				qd->t_insert = get_jiffies_64(); -				schedule_work(&qd->work); +				queue_work(ib_wq, &qd->work);  			}  			spin_lock_irqsave(&ppd->sdma_lock, flags);  			if (__qib_sdma_running(ppd)) diff --git a/drivers/infiniband/hw/qib/qib_qsfp.c b/drivers/infiniband/hw/qib/qib_qsfp.c index e06c4ed383f..fa71b1e666c 100644 --- a/drivers/infiniband/hw/qib/qib_qsfp.c +++ b/drivers/infiniband/hw/qib/qib_qsfp.c @@ -480,18 +480,6 @@ void qib_qsfp_init(struct qib_qsfp_data *qd,  	udelay(20); /* Generous RST dwell */  	dd->f_gpio_mod(dd, mask, mask, mask); -	/* Spec says module can take up to two seconds! */ -	mask = QSFP_GPIO_MOD_PRS_N; -	if (qd->ppd->hw_pidx) -		mask <<= QSFP_GPIO_PORT2_SHIFT; - -	/* Do not try to wait here. Better to let event handle it */ -	if (!qib_qsfp_mod_present(qd->ppd)) -		goto bail; -	/* We see a module, but it may be unwise to look yet. Just schedule */ -	qd->t_insert = get_jiffies_64(); -	queue_work(ib_wq, &qd->work); -bail:  	return;  }  |