diff options
Diffstat (limited to 'drivers/infiniband/hw/hfi1/init.c')
| -rw-r--r-- | drivers/infiniband/hw/hfi1/init.c | 40 | 
1 files changed, 17 insertions, 23 deletions
| diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c index dbd1c31830b9..4436ed41547c 100644 --- a/drivers/infiniband/hw/hfi1/init.c +++ b/drivers/infiniband/hw/hfi1/init.c @@ -113,7 +113,6 @@ static int hfi1_create_kctxt(struct hfi1_devdata *dd,  	rcd->fast_handler = get_dma_rtail_setting(rcd) ?  				handle_receive_interrupt_dma_rtail :  				handle_receive_interrupt_nodma_rtail; -	rcd->slow_handler = handle_receive_interrupt;  	hfi1_set_seq_cnt(rcd, 1); @@ -334,6 +333,8 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,  		rcd->numa_id = numa;  		rcd->rcv_array_groups = dd->rcv_entries.ngroups;  		rcd->rhf_rcv_function_map = normal_rhf_rcv_functions; +		rcd->slow_handler = handle_receive_interrupt; +		rcd->do_interrupt = rcd->slow_handler;  		rcd->msix_intr = CCE_NUM_MSIX_VECTORS;  		mutex_init(&rcd->exp_mutex); @@ -874,18 +875,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)  	if (ret)  		goto done; -	/* allocate dummy tail memory for all receive contexts */ -	dd->rcvhdrtail_dummy_kvaddr = dma_alloc_coherent(&dd->pcidev->dev, -							 sizeof(u64), -							 &dd->rcvhdrtail_dummy_dma, -							 GFP_KERNEL); - -	if (!dd->rcvhdrtail_dummy_kvaddr) { -		dd_dev_err(dd, "cannot allocate dummy tail memory\n"); -		ret = -ENOMEM; -		goto done; -	} -  	/* dd->rcd can be NULL if early initialization failed */  	for (i = 0; dd->rcd && i < dd->first_dyn_alloc_ctxt; ++i) {  		/* @@ -898,8 +887,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)  		if (!rcd)  			continue; -		rcd->do_interrupt = &handle_receive_interrupt; -  		lastfail = hfi1_create_rcvhdrq(dd, rcd);  		if (!lastfail)  			lastfail = hfi1_setup_eagerbufs(rcd); @@ -1120,7 +1107,7 @@ void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)  	rcd->egrbufs.rcvtids = NULL;  	for (e = 0; e < rcd->egrbufs.alloced; e++) { -		if (rcd->egrbufs.buffers[e].dma) +		if (rcd->egrbufs.buffers[e].addr)  			dma_free_coherent(&dd->pcidev->dev,  					  rcd->egrbufs.buffers[e].len,  					  rcd->egrbufs.buffers[e].addr, @@ -1201,6 +1188,11 @@ void hfi1_free_devdata(struct hfi1_devdata *dd)  	dd->tx_opstats    = NULL;  	kfree(dd->comp_vect);  	dd->comp_vect = NULL; +	if (dd->rcvhdrtail_dummy_kvaddr) +		dma_free_coherent(&dd->pcidev->dev, sizeof(u64), +				  (void *)dd->rcvhdrtail_dummy_kvaddr, +				  dd->rcvhdrtail_dummy_dma); +	dd->rcvhdrtail_dummy_kvaddr = NULL;  	sdma_clean(dd, dd->num_sdma);  	rvt_dealloc_device(&dd->verbs_dev.rdi);  } @@ -1298,6 +1290,15 @@ static struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev,  		goto bail;  	} +	/* allocate dummy tail memory for all receive contexts */ +	dd->rcvhdrtail_dummy_kvaddr = +		dma_alloc_coherent(&dd->pcidev->dev, sizeof(u64), +				   &dd->rcvhdrtail_dummy_dma, GFP_KERNEL); +	if (!dd->rcvhdrtail_dummy_kvaddr) { +		ret = -ENOMEM; +		goto bail; +	} +  	atomic_set(&dd->ipoib_rsm_usr_num, 0);  	return dd; @@ -1505,13 +1506,6 @@ static void cleanup_device_data(struct hfi1_devdata *dd)  	free_credit_return(dd); -	if (dd->rcvhdrtail_dummy_kvaddr) { -		dma_free_coherent(&dd->pcidev->dev, sizeof(u64), -				  (void *)dd->rcvhdrtail_dummy_kvaddr, -				  dd->rcvhdrtail_dummy_dma); -		dd->rcvhdrtail_dummy_kvaddr = NULL; -	} -  	/*  	 * Free any resources still in use (usually just kernel contexts)  	 * at unload; we do for ctxtcnt, because that's what we allocate. |