diff options
Diffstat (limited to 'drivers/infiniband/hw/hfi1/init.c')
| -rw-r--r-- | drivers/infiniband/hw/hfi1/init.c | 87 | 
1 files changed, 13 insertions, 74 deletions
| diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c index 26b792bb1027..e3acda7a0800 100644 --- a/drivers/infiniband/hw/hfi1/init.c +++ b/drivers/infiniband/hw/hfi1/init.c @@ -78,8 +78,6 @@   */  #define HFI1_MIN_USER_CTXT_BUFCNT 7 -#define HFI1_MIN_HDRQ_EGRBUF_CNT 2 -#define HFI1_MAX_HDRQ_EGRBUF_CNT 16352  #define HFI1_MIN_EAGER_BUFFER_SIZE (4 * 1024) /* 4KB */  #define HFI1_MAX_EAGER_BUFFER_SIZE (256 * 1024) /* 256KB */ @@ -122,8 +120,6 @@ unsigned int user_credit_return_threshold = 33;	/* default is 33% */  module_param(user_credit_return_threshold, uint, S_IRUGO);  MODULE_PARM_DESC(user_credit_return_threshold, "Credit return threshold for user send contexts, return when unreturned credits passes this many blocks (in percent of allocated blocks, 0 is off)"); -static inline u64 encode_rcv_header_entry_size(u16 size); -  DEFINE_XARRAY_FLAGS(hfi1_dev_table, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_IRQ);  static int hfi1_create_kctxt(struct hfi1_devdata *dd, @@ -154,7 +150,12 @@ static int hfi1_create_kctxt(struct hfi1_devdata *dd,  	/* Control context must use DMA_RTAIL */  	if (rcd->ctxt == HFI1_CTRL_CTXT)  		rcd->flags |= HFI1_CAP_DMA_RTAIL; -	rcd->seq_cnt = 1; +	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);  	rcd->sc = sc_alloc(dd, SC_ACK, rcd->rcvhdrqentsize, dd->node);  	if (!rcd->sc) { @@ -511,23 +512,6 @@ void hfi1_free_ctxt(struct hfi1_ctxtdata *rcd)  }  /* - * Convert a receive header entry size that to the encoding used in the CSR. - * - * Return a zero if the given size is invalid. - */ -static inline u64 encode_rcv_header_entry_size(u16 size) -{ -	/* there are only 3 valid receive header entry sizes */ -	if (size == 2) -		return 1; -	if (size == 16) -		return 2; -	else if (size == 32) -		return 4; -	return 0; /* invalid */ -} - -/*   * Select the largest ccti value over all SLs to determine the intra-   * packet gap for the link.   * @@ -892,10 +876,10 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)  	if (is_ax(dd)) {  		atomic_set(&dd->drop_packet, DROP_PACKET_ON); -		dd->do_drop = 1; +		dd->do_drop = true;  	} else {  		atomic_set(&dd->drop_packet, DROP_PACKET_OFF); -		dd->do_drop = 0; +		dd->do_drop = false;  	}  	/* make sure the link is not "up" */ @@ -1149,9 +1133,9 @@ void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)  		dma_free_coherent(&dd->pcidev->dev, rcvhdrq_size(rcd),  				  rcd->rcvhdrq, rcd->rcvhdrq_dma);  		rcd->rcvhdrq = NULL; -		if (rcd->rcvhdrtail_kvaddr) { +		if (hfi1_rcvhdrtail_kvaddr(rcd)) {  			dma_free_coherent(&dd->pcidev->dev, PAGE_SIZE, -					  (void *)rcd->rcvhdrtail_kvaddr, +					  (void *)hfi1_rcvhdrtail_kvaddr(rcd),  					  rcd->rcvhdrqtailaddr_dma);  			rcd->rcvhdrtail_kvaddr = NULL;  		} @@ -1611,29 +1595,6 @@ static void postinit_cleanup(struct hfi1_devdata *dd)  	hfi1_free_devdata(dd);  } -static int init_validate_rcvhdrcnt(struct hfi1_devdata *dd, uint thecnt) -{ -	if (thecnt <= HFI1_MIN_HDRQ_EGRBUF_CNT) { -		dd_dev_err(dd, "Receive header queue count too small\n"); -		return -EINVAL; -	} - -	if (thecnt > HFI1_MAX_HDRQ_EGRBUF_CNT) { -		dd_dev_err(dd, -			   "Receive header queue count cannot be greater than %u\n", -			   HFI1_MAX_HDRQ_EGRBUF_CNT); -		return -EINVAL; -	} - -	if (thecnt % HDRQ_INCREMENT) { -		dd_dev_err(dd, "Receive header queue count %d must be divisible by %lu\n", -			   thecnt, HDRQ_INCREMENT); -		return -EINVAL; -	} - -	return 0; -} -  static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	int ret = 0, j, pidx, initfail; @@ -1661,7 +1622,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	}  	/* Validate some global module parameters */ -	ret = init_validate_rcvhdrcnt(dd, rcvhdrcnt); +	ret = hfi1_validate_rcvhdrcnt(dd, rcvhdrcnt);  	if (ret)  		goto bail; @@ -1842,7 +1803,6 @@ static void shutdown_one(struct pci_dev *pdev)  int hfi1_create_rcvhdrq(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)  {  	unsigned amt; -	u64 reg;  	if (!rcd->rcvhdrq) {  		gfp_t gfp_flags; @@ -1874,30 +1834,9 @@ int hfi1_create_rcvhdrq(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)  				goto bail_free;  		}  	} -	/* -	 * These values are per-context: -	 *	RcvHdrCnt -	 *	RcvHdrEntSize -	 *	RcvHdrSize -	 */ -	reg = ((u64)(rcd->rcvhdrq_cnt >> HDRQ_SIZE_SHIFT) -			& RCV_HDR_CNT_CNT_MASK) -		<< RCV_HDR_CNT_CNT_SHIFT; -	write_kctxt_csr(dd, rcd->ctxt, RCV_HDR_CNT, reg); -	reg = (encode_rcv_header_entry_size(rcd->rcvhdrqentsize) -			& RCV_HDR_ENT_SIZE_ENT_SIZE_MASK) -		<< RCV_HDR_ENT_SIZE_ENT_SIZE_SHIFT; -	write_kctxt_csr(dd, rcd->ctxt, RCV_HDR_ENT_SIZE, reg); -	reg = ((u64)DEFAULT_RCVHDRSIZE & RCV_HDR_SIZE_HDR_SIZE_MASK) -		<< RCV_HDR_SIZE_HDR_SIZE_SHIFT; -	write_kctxt_csr(dd, rcd->ctxt, RCV_HDR_SIZE, reg); -	/* -	 * Program dummy tail address for every receive context -	 * before enabling any receive context -	 */ -	write_kctxt_csr(dd, rcd->ctxt, RCV_HDR_TAIL_ADDR, -			dd->rcvhdrtail_dummy_dma); +	set_hdrq_regs(rcd->dd, rcd->ctxt, rcd->rcvhdrqentsize, +		      rcd->rcvhdrq_cnt);  	return 0; |