diff options
Diffstat (limited to 'drivers/infiniband/hw/nes/nes_utils.c')
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_utils.c | 53 | 
1 files changed, 42 insertions, 11 deletions
diff --git a/drivers/infiniband/hw/nes/nes_utils.c b/drivers/infiniband/hw/nes/nes_utils.c index f9c417c6b3b..cd10968bfa2 100644 --- a/drivers/infiniband/hw/nes/nes_utils.c +++ b/drivers/infiniband/hw/nes/nes_utils.c @@ -51,13 +51,34 @@  #include "nes.h" - -  static u16 nes_read16_eeprom(void __iomem *addr, u16 offset);  u32 mh_detected;  u32 mh_pauses_sent; +u32 nes_set_pau(struct nes_device *nesdev) +{ +	u32 ret = 0; +	u32 counter; + +	nes_write_indexed(nesdev, NES_IDX_GPR2, NES_ENABLE_PAU); +	nes_write_indexed(nesdev, NES_IDX_GPR_TRIGGER, 1); + +	for (counter = 0; counter < NES_PAU_COUNTER; counter++) { +		udelay(30); +		if (!nes_read_indexed(nesdev, NES_IDX_GPR2)) { +			printk(KERN_INFO PFX "PAU is supported.\n"); +			break; +		} +		nes_write_indexed(nesdev, NES_IDX_GPR_TRIGGER, 1); +	} +	if (counter == NES_PAU_COUNTER) { +		printk(KERN_INFO PFX "PAU is not supported.\n"); +		return -EPERM; +	} +	return ret; +} +  /**   * nes_read_eeprom_values -   */ @@ -187,6 +208,11 @@ int nes_read_eeprom_values(struct nes_device *nesdev, struct nes_adapter *nesada  		if (((major_ver == 3) && (minor_ver >= 16)) || (major_ver > 3))  			nesadapter->send_term_ok = 1; +		if (nes_drv_opt & NES_DRV_OPT_ENABLE_PAU) { +			if (!nes_set_pau(nesdev)) +				nesadapter->allow_unaligned_fpdus = 1; +		} +  		nesadapter->firmware_version = (((u32)(u8)(eeprom_data>>8))  <<  16) +  				(u32)((u8)eeprom_data); @@ -594,6 +620,7 @@ void nes_put_cqp_request(struct nes_device *nesdev,  		nes_free_cqp_request(nesdev, cqp_request);  } +  /**   * nes_post_cqp_request   */ @@ -604,6 +631,8 @@ void nes_post_cqp_request(struct nes_device *nesdev,  	unsigned long flags;  	u32 cqp_head;  	u64 u64temp; +	u32 opcode; +	int ctx_index = NES_CQP_WQE_COMP_CTX_LOW_IDX;  	spin_lock_irqsave(&nesdev->cqp.lock, flags); @@ -614,17 +643,20 @@ void nes_post_cqp_request(struct nes_device *nesdev,  		nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1;  		cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head];  		memcpy(cqp_wqe, &cqp_request->cqp_wqe, sizeof(*cqp_wqe)); +		opcode = le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX]); +		if ((opcode & NES_CQP_OPCODE_MASK) == NES_CQP_DOWNLOAD_SEGMENT) +			ctx_index = NES_CQP_WQE_DL_COMP_CTX_LOW_IDX;  		barrier();  		u64temp = (unsigned long)cqp_request; -		set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_COMP_SCRATCH_LOW_IDX, -				    u64temp); +		set_wqe_64bit_value(cqp_wqe->wqe_words, ctx_index, u64temp);  		nes_debug(NES_DBG_CQP, "CQP request (opcode 0x%02X), line 1 = 0x%08X put on CQPs SQ," -				" request = %p, cqp_head = %u, cqp_tail = %u, cqp_size = %u," -				" waiting = %d, refcount = %d.\n", -				le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX])&0x3f, -				le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX]), cqp_request, -				nesdev->cqp.sq_head, nesdev->cqp.sq_tail, nesdev->cqp.sq_size, -				cqp_request->waiting, atomic_read(&cqp_request->refcount)); +			" request = %p, cqp_head = %u, cqp_tail = %u, cqp_size = %u," +			" waiting = %d, refcount = %d.\n", +			opcode & NES_CQP_OPCODE_MASK, +			le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX]), cqp_request, +			nesdev->cqp.sq_head, nesdev->cqp.sq_tail, nesdev->cqp.sq_size, +			cqp_request->waiting, atomic_read(&cqp_request->refcount)); +  		barrier();  		/* Ring doorbell (1 WQEs) */ @@ -645,7 +677,6 @@ void nes_post_cqp_request(struct nes_device *nesdev,  	return;  } -  /**   * nes_arp_table   */  |