diff options
| author | Chien Tung <chien.tin.tung@intel.com> | 2010-03-03 14:13:28 -0500 |
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2010-03-11 18:12:15 -0500 |
| commit | 9f29006ae8c85746e5a52d557f689359149a0793 (patch) | |
| tree | 838686f9d7ee2f124b17f6f00c22b1406e14f91c | |
| parent | 883c699241f48667ff59277d8c20790868fd4829 (diff) | |
RDMA/nes: Clear stall bit before destroying NIC QP
Clear the stall bit to drop any incoming packets while destroying NIC
QP. This will prevent a chip resource leak.
Signed-off-by: Chien Tung <chien.tin.tung@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 8 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.h | 1 |
2 files changed, 9 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index ce7f53833577..925075557dc2 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
| @@ -1899,9 +1899,14 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic) | |||
| 1899 | u16 wqe_fragment_index; | 1899 | u16 wqe_fragment_index; |
| 1900 | u64 wqe_frag; | 1900 | u64 wqe_frag; |
| 1901 | u32 cqp_head; | 1901 | u32 cqp_head; |
| 1902 | u32 wqm_cfg0; | ||
| 1902 | unsigned long flags; | 1903 | unsigned long flags; |
| 1903 | int ret; | 1904 | int ret; |
| 1904 | 1905 | ||
| 1906 | /* clear wqe stall before destroying NIC QP */ | ||
| 1907 | wqm_cfg0 = nes_read_indexed(nesdev, NES_IDX_WQM_CONFIG0); | ||
| 1908 | nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0 & 0xFFFF7FFF); | ||
| 1909 | |||
| 1905 | /* Free remaining NIC receive buffers */ | 1910 | /* Free remaining NIC receive buffers */ |
| 1906 | while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) { | 1911 | while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) { |
| 1907 | nic_rqe = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail]; | 1912 | nic_rqe = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail]; |
| @@ -2020,6 +2025,9 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic) | |||
| 2020 | 2025 | ||
| 2021 | pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase, | 2026 | pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase, |
| 2022 | nesvnic->nic_pbase); | 2027 | nesvnic->nic_pbase); |
| 2028 | |||
| 2029 | /* restore old wqm_cfg0 value */ | ||
| 2030 | nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0); | ||
| 2023 | } | 2031 | } |
| 2024 | 2032 | ||
| 2025 | /** | 2033 | /** |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 9b1e7f869d83..bbbfe9fc5a5a 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
| @@ -160,6 +160,7 @@ enum indexed_regs { | |||
| 160 | NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004, | 160 | NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004, |
| 161 | NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008, | 161 | NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008, |
| 162 | NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c, | 162 | NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c, |
| 163 | NES_IDX_WQM_CONFIG0 = 0x5000, | ||
| 163 | NES_IDX_WQM_CONFIG1 = 0x5004, | 164 | NES_IDX_WQM_CONFIG1 = 0x5004, |
| 164 | NES_IDX_CM_CONFIG = 0x5100, | 165 | NES_IDX_CM_CONFIG = 0x5100, |
| 165 | NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000, | 166 | NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000, |
