diff options
| author | Faisal Latif <faisal.latif@intel.com> | 2011-09-25 21:34:00 -0400 |
|---|---|---|
| committer | Roland Dreier <roland@purestorage.com> | 2011-10-10 13:54:47 -0400 |
| commit | 0f0bee8bbc2b3e49baa703118041f99db9ef41a1 (patch) | |
| tree | 3a4598c74f2dcab76fcf8a6cb3d533f8582bf613 | |
| parent | 6224c7eeff586e9dbf51b872d7e0bae291fa00ed (diff) | |
RDMA/nes: Support for Packed And Unaligned fpdus
Support for Packed and Unaligned (PAU) FPDUs is needed for
interoperability between NES and non-NES nodes. When the NES hardware
detects a PAU frame, it will pass it to the driver to process the
frame. NES driver creates a new frame for each FPDU and forwards it
to the hardware to be sent to its associated qp.
Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Signed-off-by: Faisal Latif <Faisal.Latif@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
| -rw-r--r-- | drivers/infiniband/hw/nes/Makefile | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes.c | 8 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes.h | 17 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.c | 19 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_cm.h | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 73 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.h | 35 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_mgt.c | 1162 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_mgt.h | 97 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_nic.c | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_utils.c | 53 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_verbs.c | 3 | ||||
| -rw-r--r-- | drivers/infiniband/hw/nes/nes_verbs.h | 9 |
13 files changed, 1434 insertions, 50 deletions
diff --git a/drivers/infiniband/hw/nes/Makefile b/drivers/infiniband/hw/nes/Makefile index 35148513c47e..97820c23ecef 100644 --- a/drivers/infiniband/hw/nes/Makefile +++ b/drivers/infiniband/hw/nes/Makefile | |||
| @@ -1,3 +1,3 @@ | |||
| 1 | obj-$(CONFIG_INFINIBAND_NES) += iw_nes.o | 1 | obj-$(CONFIG_INFINIBAND_NES) += iw_nes.o |
| 2 | 2 | ||
| 3 | iw_nes-objs := nes.o nes_hw.o nes_nic.o nes_utils.o nes_verbs.o nes_cm.o | 3 | iw_nes-objs := nes.o nes_hw.o nes_nic.o nes_utils.o nes_verbs.o nes_cm.o nes_mgt.o |
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c index 2d668c69f6d9..5965b3df8f2f 100644 --- a/drivers/infiniband/hw/nes/nes.c +++ b/drivers/infiniband/hw/nes/nes.c | |||
| @@ -84,7 +84,7 @@ module_param(send_first, int, 0644); | |||
| 84 | MODULE_PARM_DESC(send_first, "Send RDMA Message First on Active Connection"); | 84 | MODULE_PARM_DESC(send_first, "Send RDMA Message First on Active Connection"); |
| 85 | 85 | ||
| 86 | 86 | ||
| 87 | unsigned int nes_drv_opt = 0; | 87 | unsigned int nes_drv_opt = NES_DRV_OPT_DISABLE_INT_MOD | NES_DRV_OPT_ENABLE_PAU; |
| 88 | module_param(nes_drv_opt, int, 0644); | 88 | module_param(nes_drv_opt, int, 0644); |
| 89 | MODULE_PARM_DESC(nes_drv_opt, "Driver option parameters"); | 89 | MODULE_PARM_DESC(nes_drv_opt, "Driver option parameters"); |
| 90 | 90 | ||
| @@ -130,9 +130,6 @@ static struct notifier_block nes_net_notifier = { | |||
| 130 | .notifier_call = nes_net_event | 130 | .notifier_call = nes_net_event |
| 131 | }; | 131 | }; |
| 132 | 132 | ||
| 133 | |||
| 134 | |||
| 135 | |||
| 136 | /** | 133 | /** |
| 137 | * nes_inetaddr_event | 134 | * nes_inetaddr_event |
| 138 | */ | 135 | */ |
| @@ -321,6 +318,9 @@ void nes_rem_ref(struct ib_qp *ibqp) | |||
| 321 | } | 318 | } |
| 322 | 319 | ||
| 323 | if (atomic_dec_and_test(&nesqp->refcount)) { | 320 | if (atomic_dec_and_test(&nesqp->refcount)) { |
| 321 | if (nesqp->pau_mode) | ||
| 322 | nes_destroy_pau_qp(nesdev, nesqp); | ||
| 323 | |||
| 324 | /* Destroy the QP */ | 324 | /* Destroy the QP */ |
| 325 | cqp_request = nes_get_cqp_request(nesdev); | 325 | cqp_request = nes_get_cqp_request(nesdev); |
| 326 | if (cqp_request == NULL) { | 326 | if (cqp_request == NULL) { |
diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h index 6fe79876009e..568b4f11380a 100644 --- a/drivers/infiniband/hw/nes/nes.h +++ b/drivers/infiniband/hw/nes/nes.h | |||
| @@ -102,6 +102,7 @@ | |||
| 102 | #define NES_DRV_OPT_NO_INLINE_DATA 0x00000080 | 102 | #define NES_DRV_OPT_NO_INLINE_DATA 0x00000080 |
| 103 | #define NES_DRV_OPT_DISABLE_INT_MOD 0x00000100 | 103 | #define NES_DRV_OPT_DISABLE_INT_MOD 0x00000100 |
| 104 | #define NES_DRV_OPT_DISABLE_VIRT_WQ 0x00000200 | 104 | #define NES_DRV_OPT_DISABLE_VIRT_WQ 0x00000200 |
| 105 | #define NES_DRV_OPT_ENABLE_PAU 0x00000400 | ||
| 105 | 106 | ||
| 106 | #define NES_AEQ_EVENT_TIMEOUT 2500 | 107 | #define NES_AEQ_EVENT_TIMEOUT 2500 |
| 107 | #define NES_DISCONNECT_EVENT_TIMEOUT 2000 | 108 | #define NES_DISCONNECT_EVENT_TIMEOUT 2000 |
| @@ -128,6 +129,7 @@ | |||
| 128 | #define NES_DBG_IW_RX 0x00020000 | 129 | #define NES_DBG_IW_RX 0x00020000 |
| 129 | #define NES_DBG_IW_TX 0x00040000 | 130 | #define NES_DBG_IW_TX 0x00040000 |
| 130 | #define NES_DBG_SHUTDOWN 0x00080000 | 131 | #define NES_DBG_SHUTDOWN 0x00080000 |
| 132 | #define NES_DBG_PAU 0x00100000 | ||
| 131 | #define NES_DBG_RSVD1 0x10000000 | 133 | #define NES_DBG_RSVD1 0x10000000 |
| 132 | #define NES_DBG_RSVD2 0x20000000 | 134 | #define NES_DBG_RSVD2 0x20000000 |
| 133 | #define NES_DBG_RSVD3 0x40000000 | 135 | #define NES_DBG_RSVD3 0x40000000 |
| @@ -162,6 +164,7 @@ do { \ | |||
| 162 | #include "nes_context.h" | 164 | #include "nes_context.h" |
| 163 | #include "nes_user.h" | 165 | #include "nes_user.h" |
| 164 | #include "nes_cm.h" | 166 | #include "nes_cm.h" |
| 167 | #include "nes_mgt.h" | ||
| 165 | 168 | ||
| 166 | extern int max_mtu; | 169 | extern int max_mtu; |
| 167 | #define max_frame_len (max_mtu+ETH_HLEN) | 170 | #define max_frame_len (max_mtu+ETH_HLEN) |
| @@ -202,6 +205,8 @@ extern atomic_t cm_nodes_created; | |||
| 202 | extern atomic_t cm_nodes_destroyed; | 205 | extern atomic_t cm_nodes_destroyed; |
| 203 | extern atomic_t cm_accel_dropped_pkts; | 206 | extern atomic_t cm_accel_dropped_pkts; |
| 204 | extern atomic_t cm_resets_recvd; | 207 | extern atomic_t cm_resets_recvd; |
| 208 | extern atomic_t pau_qps_created; | ||
| 209 | extern atomic_t pau_qps_destroyed; | ||
| 205 | 210 | ||
| 206 | extern u32 int_mod_timer_init; | 211 | extern u32 int_mod_timer_init; |
| 207 | extern u32 int_mod_cq_depth_256; | 212 | extern u32 int_mod_cq_depth_256; |
| @@ -273,6 +278,14 @@ struct nes_device { | |||
| 273 | u8 link_recheck; | 278 | u8 link_recheck; |
| 274 | }; | 279 | }; |
| 275 | 280 | ||
| 281 | /* Receive skb private area - must fit in skb->cb area */ | ||
| 282 | struct nes_rskb_cb { | ||
| 283 | u64 busaddr; | ||
| 284 | u32 maplen; | ||
| 285 | u32 seqnum; | ||
| 286 | u8 *data_start; | ||
| 287 | struct nes_qp *nesqp; | ||
| 288 | }; | ||
| 276 | 289 | ||
| 277 | static inline __le32 get_crc_value(struct nes_v4_quad *nes_quad) | 290 | static inline __le32 get_crc_value(struct nes_v4_quad *nes_quad) |
| 278 | { | 291 | { |
| @@ -305,8 +318,8 @@ set_wqe_32bit_value(__le32 *wqe_words, u32 index, u32 value) | |||
| 305 | static inline void | 318 | static inline void |
| 306 | nes_fill_init_cqp_wqe(struct nes_hw_cqp_wqe *cqp_wqe, struct nes_device *nesdev) | 319 | nes_fill_init_cqp_wqe(struct nes_hw_cqp_wqe *cqp_wqe, struct nes_device *nesdev) |
| 307 | { | 320 | { |
| 308 | set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_COMP_CTX_LOW_IDX, | 321 | cqp_wqe->wqe_words[NES_CQP_WQE_COMP_CTX_LOW_IDX] = 0; |
| 309 | (u64)((unsigned long) &nesdev->cqp)); | 322 | cqp_wqe->wqe_words[NES_CQP_WQE_COMP_CTX_HIGH_IDX] = 0; |
| 310 | cqp_wqe->wqe_words[NES_CQP_WQE_COMP_SCRATCH_LOW_IDX] = 0; | 323 | cqp_wqe->wqe_words[NES_CQP_WQE_COMP_SCRATCH_LOW_IDX] = 0; |
| 311 | cqp_wqe->wqe_words[NES_CQP_WQE_COMP_SCRATCH_HIGH_IDX] = 0; | 324 | cqp_wqe->wqe_words[NES_CQP_WQE_COMP_SCRATCH_HIGH_IDX] = 0; |
| 312 | cqp_wqe->wqe_words[NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX] = 0; | 325 | cqp_wqe->wqe_words[NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX] = 0; |
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index c118663e4437..401b7bb828d0 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
| @@ -159,6 +159,15 @@ atomic_t cm_connecteds; | |||
| 159 | atomic_t cm_connect_reqs; | 159 | atomic_t cm_connect_reqs; |
| 160 | atomic_t cm_rejects; | 160 | atomic_t cm_rejects; |
| 161 | 161 | ||
| 162 | int nes_add_ref_cm_node(struct nes_cm_node *cm_node) | ||
| 163 | { | ||
| 164 | return add_ref_cm_node(cm_node); | ||
| 165 | } | ||
| 166 | |||
| 167 | int nes_rem_ref_cm_node(struct nes_cm_node *cm_node) | ||
| 168 | { | ||
| 169 | return rem_ref_cm_node(cm_node->cm_core, cm_node); | ||
| 170 | } | ||
| 162 | 171 | ||
| 163 | /** | 172 | /** |
| 164 | * create_event | 173 | * create_event |
| @@ -2331,9 +2340,13 @@ static int mini_cm_recv_pkt(struct nes_cm_core *cm_core, | |||
| 2331 | } | 2340 | } |
| 2332 | add_ref_cm_node(cm_node); | 2341 | add_ref_cm_node(cm_node); |
| 2333 | } else if (cm_node->state == NES_CM_STATE_TSA) { | 2342 | } else if (cm_node->state == NES_CM_STATE_TSA) { |
| 2334 | rem_ref_cm_node(cm_core, cm_node); | 2343 | if (cm_node->nesqp->pau_mode) |
| 2335 | atomic_inc(&cm_accel_dropped_pkts); | 2344 | nes_queue_mgt_skbs(skb, nesvnic, cm_node->nesqp); |
| 2336 | dev_kfree_skb_any(skb); | 2345 | else { |
| 2346 | rem_ref_cm_node(cm_core, cm_node); | ||
| 2347 | atomic_inc(&cm_accel_dropped_pkts); | ||
| 2348 | dev_kfree_skb_any(skb); | ||
| 2349 | } | ||
| 2337 | break; | 2350 | break; |
| 2338 | } | 2351 | } |
| 2339 | skb_reset_network_header(skb); | 2352 | skb_reset_network_header(skb); |
diff --git a/drivers/infiniband/hw/nes/nes_cm.h b/drivers/infiniband/hw/nes/nes_cm.h index d9825fda70a1..130c185cde0d 100644 --- a/drivers/infiniband/hw/nes/nes_cm.h +++ b/drivers/infiniband/hw/nes/nes_cm.h | |||
| @@ -422,5 +422,7 @@ int nes_destroy_listen(struct iw_cm_id *); | |||
| 422 | int nes_cm_recv(struct sk_buff *, struct net_device *); | 422 | int nes_cm_recv(struct sk_buff *, struct net_device *); |
| 423 | int nes_cm_start(void); | 423 | int nes_cm_start(void); |
| 424 | int nes_cm_stop(void); | 424 | int nes_cm_stop(void); |
| 425 | int nes_add_ref_cm_node(struct nes_cm_node *cm_node); | ||
| 426 | int nes_rem_ref_cm | ||
