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 f9c417c6b3b3..cd10968bfa22 100644 --- a/drivers/infiniband/hw/nes/nes_utils.c +++ b/drivers/infiniband/hw/nes/nes_utils.c | |||
@@ -51,13 +51,34 @@ | |||
51 | 51 | ||
52 | #include "nes.h" | 52 | #include "nes.h" |
53 | 53 | ||
54 | |||
55 | |||
56 | static u16 nes_read16_eeprom(void __iomem *addr, u16 offset); | 54 | static u16 nes_read16_eeprom(void __iomem *addr, u16 offset); |
57 | 55 | ||
58 | u32 mh_detected; | 56 | u32 mh_detected; |
59 | u32 mh_pauses_sent; | 57 | u32 mh_pauses_sent; |
60 | 58 | ||
59 | u32 nes_set_pau(struct nes_device *nesdev) | ||
60 | { | ||
61 | u32 ret = 0; | ||
62 | u32 counter; | ||
63 | |||
64 | nes_write_indexed(nesdev, NES_IDX_GPR2, NES_ENABLE_PAU); | ||
65 | nes_write_indexed(nesdev, NES_IDX_GPR_TRIGGER, 1); | ||
66 | |||
67 | for (counter = 0; counter < NES_PAU_COUNTER; counter++) { | ||
68 | udelay(30); | ||
69 | if (!nes_read_indexed(nesdev, NES_IDX_GPR2)) { | ||
70 | printk(KERN_INFO PFX "PAU is supported.\n"); | ||
71 | break; | ||
72 | } | ||
73 | nes_write_indexed(nesdev, NES_IDX_GPR_TRIGGER, 1); | ||
74 | } | ||
75 | if (counter == NES_PAU_COUNTER) { | ||
76 | printk(KERN_INFO PFX "PAU is not supported.\n"); | ||
77 | return -EPERM; | ||
78 | } | ||
79 | return ret; | ||
80 | } | ||
81 | |||
61 | /** | 82 | /** |
62 | * nes_read_eeprom_values - | 83 | * nes_read_eeprom_values - |
63 | */ | 84 | */ |
@@ -187,6 +208,11 @@ int nes_read_eeprom_values(struct nes_device *nesdev, struct nes_adapter *nesada | |||
187 | if (((major_ver == 3) && (minor_ver >= 16)) || (major_ver > 3)) | 208 | if (((major_ver == 3) && (minor_ver >= 16)) || (major_ver > 3)) |
188 | nesadapter->send_term_ok = 1; | 209 | nesadapter->send_term_ok = 1; |
189 | 210 | ||
211 | if (nes_drv_opt & NES_DRV_OPT_ENABLE_PAU) { | ||
212 | if (!nes_set_pau(nesdev)) | ||
213 | nesadapter->allow_unaligned_fpdus = 1; | ||
214 | } | ||
215 | |||
190 | nesadapter->firmware_version = (((u32)(u8)(eeprom_data>>8)) << 16) + | 216 | nesadapter->firmware_version = (((u32)(u8)(eeprom_data>>8)) << 16) + |
191 | (u32)((u8)eeprom_data); | 217 | (u32)((u8)eeprom_data); |
192 | 218 | ||
@@ -594,6 +620,7 @@ void nes_put_cqp_request(struct nes_device *nesdev, | |||
594 | nes_free_cqp_request(nesdev, cqp_request); | 620 | nes_free_cqp_request(nesdev, cqp_request); |
595 | } | 621 | } |
596 | 622 | ||
623 | |||
597 | /** | 624 | /** |
598 | * nes_post_cqp_request | 625 | * nes_post_cqp_request |
599 | */ | 626 | */ |
@@ -604,6 +631,8 @@ void nes_post_cqp_request(struct nes_device *nesdev, | |||
604 | unsigned long flags; | 631 | unsigned long flags; |
605 | u32 cqp_head; | 632 | u32 cqp_head; |
606 | u64 u64temp; | 633 | u64 u64temp; |
634 | u32 opcode; | ||
635 | int ctx_index = NES_CQP_WQE_COMP_CTX_LOW_IDX; | ||
607 | 636 | ||
608 | spin_lock_irqsave(&nesdev->cqp.lock, flags); | 637 | spin_lock_irqsave(&nesdev->cqp.lock, flags); |
609 | 638 | ||
@@ -614,17 +643,20 @@ void nes_post_cqp_request(struct nes_device *nesdev, | |||
614 | nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1; | 643 | nesdev->cqp.sq_head &= nesdev->cqp.sq_size-1; |
615 | cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head]; | 644 | cqp_wqe = &nesdev->cqp.sq_vbase[cqp_head]; |
616 | memcpy(cqp_wqe, &cqp_request->cqp_wqe, sizeof(*cqp_wqe)); | 645 | memcpy(cqp_wqe, &cqp_request->cqp_wqe, sizeof(*cqp_wqe)); |
646 | opcode = le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX]); | ||
647 | if ((opcode & NES_CQP_OPCODE_MASK) == NES_CQP_DOWNLOAD_SEGMENT) | ||
648 | ctx_index = NES_CQP_WQE_DL_COMP_CTX_LOW_IDX; | ||
617 | barrier(); | 649 | barrier(); |
618 | u64temp = (unsigned long)cqp_request; | 650 | u64temp = (unsigned long)cqp_request; |
619 | set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_COMP_SCRATCH_LOW_IDX, | 651 | set_wqe_64bit_value(cqp_wqe->wqe_words, ctx_index, u64temp); |
620 | u64temp); | ||
621 | nes_debug(NES_DBG_CQP, "CQP request (opcode 0x%02X), line 1 = 0x%08X put on CQPs SQ," | 652 | nes_debug(NES_DBG_CQP, "CQP request (opcode 0x%02X), line 1 = 0x%08X put on CQPs SQ," |
622 | " request = %p, cqp_head = %u, cqp_tail = %u, cqp_size = %u," | 653 | " request = %p, cqp_head = %u, cqp_tail = %u, cqp_size = %u," |
623 | " waiting = %d, refcount = %d.\n", | 654 | " waiting = %d, refcount = %d.\n", |
624 | le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX])&0x3f, | 655 | opcode & NES_CQP_OPCODE_MASK, |
625 | le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX]), cqp_request, | 656 | le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_ID_IDX]), cqp_request, |
626 | nesdev->cqp.sq_head, nesdev->cqp.sq_tail, nesdev->cqp.sq_size, | 657 | nesdev->cqp.sq_head, nesdev->cqp.sq_tail, nesdev->cqp.sq_size, |
627 | cqp_request->waiting, atomic_read(&cqp_request->refcount)); | 658 | cqp_request->waiting, atomic_read(&cqp_request->refcount)); |
659 | |||
628 | barrier(); | 660 | barrier(); |
629 | 661 | ||
630 | /* Ring doorbell (1 WQEs) */ | 662 | /* Ring doorbell (1 WQEs) */ |
@@ -645,7 +677,6 @@ void nes_post_cqp_request(struct nes_device *nesdev, | |||
645 | return; | 677 | return; |
646 | } | 678 | } |
647 | 679 | ||
648 | |||
649 | /** | 680 | /** |
650 | * nes_arp_table | 681 | * nes_arp_table |
651 | */ | 682 | */ |