rmpp_recv 74 drivers/infiniband/core/mad_rmpp.c static inline void deref_rmpp_recv(struct mad_rmpp_recv *rmpp_recv) rmpp_recv 76 drivers/infiniband/core/mad_rmpp.c if (atomic_dec_and_test(&rmpp_recv->refcount)) rmpp_recv 77 drivers/infiniband/core/mad_rmpp.c complete(&rmpp_recv->comp); rmpp_recv 80 drivers/infiniband/core/mad_rmpp.c static void destroy_rmpp_recv(struct mad_rmpp_recv *rmpp_recv) rmpp_recv 82 drivers/infiniband/core/mad_rmpp.c deref_rmpp_recv(rmpp_recv); rmpp_recv 83 drivers/infiniband/core/mad_rmpp.c wait_for_completion(&rmpp_recv->comp); rmpp_recv 84 drivers/infiniband/core/mad_rmpp.c rdma_destroy_ah(rmpp_recv->ah, RDMA_DESTROY_AH_SLEEPABLE); rmpp_recv 85 drivers/infiniband/core/mad_rmpp.c kfree(rmpp_recv); rmpp_recv 90 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv, *temp_rmpp_recv; rmpp_recv 94 drivers/infiniband/core/mad_rmpp.c list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) { rmpp_recv 95 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->state != RMPP_STATE_COMPLETE) rmpp_recv 96 drivers/infiniband/core/mad_rmpp.c ib_free_recv_mad(rmpp_recv->rmpp_wc); rmpp_recv 97 drivers/infiniband/core/mad_rmpp.c rmpp_recv->state = RMPP_STATE_CANCELING; rmpp_recv 101 drivers/infiniband/core/mad_rmpp.c list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) { rmpp_recv 102 drivers/infiniband/core/mad_rmpp.c cancel_delayed_work(&rmpp_recv->timeout_work); rmpp_recv 103 drivers/infiniband/core/mad_rmpp.c cancel_delayed_work(&rmpp_recv->cleanup_work); rmpp_recv 108 drivers/infiniband/core/mad_rmpp.c list_for_each_entry_safe(rmpp_recv, temp_rmpp_recv, rmpp_recv 110 drivers/infiniband/core/mad_rmpp.c list_del(&rmpp_recv->list); rmpp_recv 111 drivers/infiniband/core/mad_rmpp.c destroy_rmpp_recv(rmpp_recv); rmpp_recv 117 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv) rmpp_recv 128 drivers/infiniband/core/mad_rmpp.c spin_lock_irqsave(&rmpp_recv->lock, flags); rmpp_recv 129 drivers/infiniband/core/mad_rmpp.c rmpp_recv->last_ack = rmpp_recv->seg_num; rmpp_recv 130 drivers/infiniband/core/mad_rmpp.c ack->rmpp_hdr.seg_num = cpu_to_be32(rmpp_recv->seg_num); rmpp_recv 131 drivers/infiniband/core/mad_rmpp.c ack->rmpp_hdr.paylen_newwin = cpu_to_be32(rmpp_recv->newwin); rmpp_recv 132 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->lock, flags); rmpp_recv 135 drivers/infiniband/core/mad_rmpp.c static void ack_recv(struct mad_rmpp_recv *rmpp_recv, rmpp_recv 142 drivers/infiniband/core/mad_rmpp.c msg = ib_create_send_mad(&rmpp_recv->agent->agent, recv_wc->wc->src_qp, rmpp_recv 149 drivers/infiniband/core/mad_rmpp.c format_ack(msg, (struct ib_rmpp_mad *) recv_wc->recv_buf.mad, rmpp_recv); rmpp_recv 150 drivers/infiniband/core/mad_rmpp.c msg->ah = rmpp_recv->ah; rmpp_recv 248 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv = rmpp_recv 253 drivers/infiniband/core/mad_rmpp.c spin_lock_irqsave(&rmpp_recv->agent->lock, flags); rmpp_recv 254 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->state != RMPP_STATE_ACTIVE) { rmpp_recv 255 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags); rmpp_recv 258 drivers/infiniband/core/mad_rmpp.c rmpp_recv->state = RMPP_STATE_TIMEOUT; rmpp_recv 259 drivers/infiniband/core/mad_rmpp.c list_del(&rmpp_recv->list); rmpp_recv 260 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags); rmpp_recv 262 drivers/infiniband/core/mad_rmpp.c rmpp_wc = rmpp_recv->rmpp_wc; rmpp_recv 263 drivers/infiniband/core/mad_rmpp.c nack_recv(rmpp_recv->agent, rmpp_wc, IB_MGMT_RMPP_STATUS_T2L); rmpp_recv 264 drivers/infiniband/core/mad_rmpp.c destroy_rmpp_recv(rmpp_recv); rmpp_recv 270 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv = rmpp_recv 274 drivers/infiniband/core/mad_rmpp.c spin_lock_irqsave(&rmpp_recv->agent->lock, flags); rmpp_recv 275 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->state == RMPP_STATE_CANCELING) { rmpp_recv 276 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags); rmpp_recv 279 drivers/infiniband/core/mad_rmpp.c list_del(&rmpp_recv->list); rmpp_recv 280 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->agent->lock, flags); rmpp_recv 281 drivers/infiniband/core/mad_rmpp.c destroy_rmpp_recv(rmpp_recv); rmpp_recv 288 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv; rmpp_recv 291 drivers/infiniband/core/mad_rmpp.c rmpp_recv = kmalloc(sizeof *rmpp_recv, GFP_KERNEL); rmpp_recv 292 drivers/infiniband/core/mad_rmpp.c if (!rmpp_recv) rmpp_recv 295 drivers/infiniband/core/mad_rmpp.c rmpp_recv->ah = ib_create_ah_from_wc(agent->agent.qp->pd, rmpp_recv 299 drivers/infiniband/core/mad_rmpp.c if (IS_ERR(rmpp_recv->ah)) rmpp_recv 302 drivers/infiniband/core/mad_rmpp.c rmpp_recv->agent = agent; rmpp_recv 303 drivers/infiniband/core/mad_rmpp.c init_completion(&rmpp_recv->comp); rmpp_recv 304 drivers/infiniband/core/mad_rmpp.c INIT_DELAYED_WORK(&rmpp_recv->timeout_work, recv_timeout_handler); rmpp_recv 305 drivers/infiniband/core/mad_rmpp.c INIT_DELAYED_WORK(&rmpp_recv->cleanup_work, recv_cleanup_handler); rmpp_recv 306 drivers/infiniband/core/mad_rmpp.c spin_lock_init(&rmpp_recv->lock); rmpp_recv 307 drivers/infiniband/core/mad_rmpp.c rmpp_recv->state = RMPP_STATE_ACTIVE; rmpp_recv 308 drivers/infiniband/core/mad_rmpp.c atomic_set(&rmpp_recv->refcount, 1); rmpp_recv 310 drivers/infiniband/core/mad_rmpp.c rmpp_recv->rmpp_wc = mad_recv_wc; rmpp_recv 311 drivers/infiniband/core/mad_rmpp.c rmpp_recv->cur_seg_buf = &mad_recv_wc->recv_buf; rmpp_recv 312 drivers/infiniband/core/mad_rmpp.c rmpp_recv->newwin = 1; rmpp_recv 313 drivers/infiniband/core/mad_rmpp.c rmpp_recv->seg_num = 1; rmpp_recv 314 drivers/infiniband/core/mad_rmpp.c rmpp_recv->last_ack = 0; rmpp_recv 315 drivers/infiniband/core/mad_rmpp.c rmpp_recv->repwin = 1; rmpp_recv 318 drivers/infiniband/core/mad_rmpp.c rmpp_recv->tid = mad_hdr->tid; rmpp_recv 319 drivers/infiniband/core/mad_rmpp.c rmpp_recv->src_qp = mad_recv_wc->wc->src_qp; rmpp_recv 320 drivers/infiniband/core/mad_rmpp.c rmpp_recv->slid = mad_recv_wc->wc->slid; rmpp_recv 321 drivers/infiniband/core/mad_rmpp.c rmpp_recv->mgmt_class = mad_hdr->mgmt_class; rmpp_recv 322 drivers/infiniband/core/mad_rmpp.c rmpp_recv->class_version = mad_hdr->class_version; rmpp_recv 323 drivers/infiniband/core/mad_rmpp.c rmpp_recv->method = mad_hdr->method; rmpp_recv 324 drivers/infiniband/core/mad_rmpp.c rmpp_recv->base_version = mad_hdr->base_version; rmpp_recv 325 drivers/infiniband/core/mad_rmpp.c return rmpp_recv; rmpp_recv 327 drivers/infiniband/core/mad_rmpp.c error: kfree(rmpp_recv); rmpp_recv 335 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv; rmpp_recv 338 drivers/infiniband/core/mad_rmpp.c list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) { rmpp_recv 339 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->tid == mad_hdr->tid && rmpp_recv 340 drivers/infiniband/core/mad_rmpp.c rmpp_recv->src_qp == mad_recv_wc->wc->src_qp && rmpp_recv 341 drivers/infiniband/core/mad_rmpp.c rmpp_recv->slid == mad_recv_wc->wc->slid && rmpp_recv 342 drivers/infiniband/core/mad_rmpp.c rmpp_recv->mgmt_class == mad_hdr->mgmt_class && rmpp_recv 343 drivers/infiniband/core/mad_rmpp.c rmpp_recv->class_version == mad_hdr->class_version && rmpp_recv 344 drivers/infiniband/core/mad_rmpp.c rmpp_recv->method == mad_hdr->method) rmpp_recv 345 drivers/infiniband/core/mad_rmpp.c return rmpp_recv; rmpp_recv 354 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv; rmpp_recv 358 drivers/infiniband/core/mad_rmpp.c rmpp_recv = find_rmpp_recv(agent, mad_recv_wc); rmpp_recv 359 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv) rmpp_recv 360 drivers/infiniband/core/mad_rmpp.c atomic_inc(&rmpp_recv->refcount); rmpp_recv 362 drivers/infiniband/core/mad_rmpp.c return rmpp_recv; rmpp_recv 367 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv) rmpp_recv 371 drivers/infiniband/core/mad_rmpp.c cur_rmpp_recv = find_rmpp_recv(agent, rmpp_recv->rmpp_wc); rmpp_recv 373 drivers/infiniband/core/mad_rmpp.c list_add_tail(&rmpp_recv->list, &agent->rmpp_list); rmpp_recv 424 drivers/infiniband/core/mad_rmpp.c static void update_seg_num(struct mad_rmpp_recv *rmpp_recv, rmpp_recv 427 drivers/infiniband/core/mad_rmpp.c struct list_head *rmpp_list = &rmpp_recv->rmpp_wc->rmpp_list; rmpp_recv 429 drivers/infiniband/core/mad_rmpp.c while (new_buf && (get_seg_num(new_buf) == rmpp_recv->seg_num + 1)) { rmpp_recv 430 drivers/infiniband/core/mad_rmpp.c rmpp_recv->cur_seg_buf = new_buf; rmpp_recv 431 drivers/infiniband/core/mad_rmpp.c rmpp_recv->seg_num++; rmpp_recv 436 drivers/infiniband/core/mad_rmpp.c static inline int get_mad_len(struct mad_rmpp_recv *rmpp_recv) rmpp_recv 440 drivers/infiniband/core/mad_rmpp.c bool opa = rdma_cap_opa_mad(rmpp_recv->agent->qp_info->port_priv->device, rmpp_recv 441 drivers/infiniband/core/mad_rmpp.c rmpp_recv->agent->qp_info->port_priv->port_num); rmpp_recv 443 drivers/infiniband/core/mad_rmpp.c rmpp_mad = (struct ib_rmpp_mad *)rmpp_recv->cur_seg_buf->mad; rmpp_recv 446 drivers/infiniband/core/mad_rmpp.c if (opa && rmpp_recv->base_version == OPA_MGMT_BASE_VERSION) { rmpp_recv 458 drivers/infiniband/core/mad_rmpp.c return hdr_size + rmpp_recv->seg_num * data_size - pad; rmpp_recv 461 drivers/infiniband/core/mad_rmpp.c static struct ib_mad_recv_wc * complete_rmpp(struct mad_rmpp_recv *rmpp_recv) rmpp_recv 465 drivers/infiniband/core/mad_rmpp.c ack_recv(rmpp_recv, rmpp_recv->rmpp_wc); rmpp_recv 466 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->seg_num > 1) rmpp_recv 467 drivers/infiniband/core/mad_rmpp.c cancel_delayed_work(&rmpp_recv->timeout_work); rmpp_recv 469 drivers/infiniband/core/mad_rmpp.c rmpp_wc = rmpp_recv->rmpp_wc; rmpp_recv 470 drivers/infiniband/core/mad_rmpp.c rmpp_wc->mad_len = get_mad_len(rmpp_recv); rmpp_recv 472 drivers/infiniband/core/mad_rmpp.c queue_delayed_work(rmpp_recv->agent->qp_info->port_priv->wq, rmpp_recv 473 drivers/infiniband/core/mad_rmpp.c &rmpp_recv->cleanup_work, msecs_to_jiffies(10000)); rmpp_recv 481 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv; rmpp_recv 487 drivers/infiniband/core/mad_rmpp.c rmpp_recv = acquire_rmpp_recv(agent, mad_recv_wc); rmpp_recv 488 drivers/infiniband/core/mad_rmpp.c if (!rmpp_recv) rmpp_recv 493 drivers/infiniband/core/mad_rmpp.c spin_lock_irqsave(&rmpp_recv->lock, flags); rmpp_recv 494 drivers/infiniband/core/mad_rmpp.c if ((rmpp_recv->state == RMPP_STATE_TIMEOUT) || rmpp_recv 495 drivers/infiniband/core/mad_rmpp.c (seg_num > rmpp_recv->newwin)) rmpp_recv 498 drivers/infiniband/core/mad_rmpp.c if ((seg_num <= rmpp_recv->last_ack) || rmpp_recv 499 drivers/infiniband/core/mad_rmpp.c (rmpp_recv->state == RMPP_STATE_COMPLETE)) { rmpp_recv 500 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->lock, flags); rmpp_recv 501 drivers/infiniband/core/mad_rmpp.c ack_recv(rmpp_recv, mad_recv_wc); rmpp_recv 505 drivers/infiniband/core/mad_rmpp.c prev_buf = find_seg_location(&rmpp_recv->rmpp_wc->rmpp_list, seg_num); rmpp_recv 511 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->cur_seg_buf == prev_buf) { rmpp_recv 512 drivers/infiniband/core/mad_rmpp.c update_seg_num(rmpp_recv, &mad_recv_wc->recv_buf); rmpp_recv 513 drivers/infiniband/core/mad_rmpp.c if (get_last_flag(rmpp_recv->cur_seg_buf)) { rmpp_recv 514 drivers/infiniband/core/mad_rmpp.c rmpp_recv->state = RMPP_STATE_COMPLETE; rmpp_recv 515 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->lock, flags); rmpp_recv 516 drivers/infiniband/core/mad_rmpp.c done_wc = complete_rmpp(rmpp_recv); rmpp_recv 518 drivers/infiniband/core/mad_rmpp.c } else if (rmpp_recv->seg_num == rmpp_recv->newwin) { rmpp_recv 519 drivers/infiniband/core/mad_rmpp.c rmpp_recv->newwin += window_size(agent); rmpp_recv 520 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->lock, flags); rmpp_recv 521 drivers/infiniband/core/mad_rmpp.c ack_recv(rmpp_recv, mad_recv_wc); rmpp_recv 525 drivers/infiniband/core/mad_rmpp.c spin_unlock_irqrestore(&rmpp_recv->lock, flags); rmpp_recv 527 drivers/infiniband/core/mad_rmpp.c deref_rmpp_recv(rmpp_recv); rmpp_recv 530 drivers/infiniband/core/mad_rmpp.c drop3: spin_unlock_irqrestore(&rmpp_recv->lock, flags); rmpp_recv 531 drivers/infiniband/core/mad_rmpp.c drop2: deref_rmpp_recv(rmpp_recv); rmpp_recv 540 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv; rmpp_recv 543 drivers/infiniband/core/mad_rmpp.c rmpp_recv = create_rmpp_recv(agent, mad_recv_wc); rmpp_recv 544 drivers/infiniband/core/mad_rmpp.c if (!rmpp_recv) { rmpp_recv 550 drivers/infiniband/core/mad_rmpp.c if (insert_rmpp_recv(agent, rmpp_recv)) { rmpp_recv 553 drivers/infiniband/core/mad_rmpp.c destroy_rmpp_recv(rmpp_recv); rmpp_recv 556 drivers/infiniband/core/mad_rmpp.c atomic_inc(&rmpp_recv->refcount); rmpp_recv 559 drivers/infiniband/core/mad_rmpp.c rmpp_recv->state = RMPP_STATE_COMPLETE; rmpp_recv 561 drivers/infiniband/core/mad_rmpp.c complete_rmpp(rmpp_recv); rmpp_recv 566 drivers/infiniband/core/mad_rmpp.c &rmpp_recv->timeout_work, rmpp_recv 568 drivers/infiniband/core/mad_rmpp.c rmpp_recv->newwin += window_size(agent); rmpp_recv 569 drivers/infiniband/core/mad_rmpp.c ack_recv(rmpp_recv, mad_recv_wc); rmpp_recv 572 drivers/infiniband/core/mad_rmpp.c deref_rmpp_recv(rmpp_recv); rmpp_recv 650 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv; rmpp_recv 652 drivers/infiniband/core/mad_rmpp.c rmpp_recv = find_rmpp_recv(agent, mad_recv_wc); rmpp_recv 653 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv && rmpp_recv->state == RMPP_STATE_COMPLETE) rmpp_recv 654 drivers/infiniband/core/mad_rmpp.c rmpp_recv->repwin = newwin; rmpp_recv 855 drivers/infiniband/core/mad_rmpp.c struct mad_rmpp_recv *rmpp_recv; rmpp_recv 864 drivers/infiniband/core/mad_rmpp.c list_for_each_entry(rmpp_recv, &agent->rmpp_list, list) { rmpp_recv 865 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->tid != mad_hdr->tid || rmpp_recv 866 drivers/infiniband/core/mad_rmpp.c rmpp_recv->mgmt_class != mad_hdr->mgmt_class || rmpp_recv 867 drivers/infiniband/core/mad_rmpp.c rmpp_recv->class_version != mad_hdr->class_version || rmpp_recv 868 drivers/infiniband/core/mad_rmpp.c (rmpp_recv->method & IB_MGMT_METHOD_RESP)) rmpp_recv 874 drivers/infiniband/core/mad_rmpp.c if (rmpp_recv->slid == rdma_ah_get_dlid(&ah_attr)) { rmpp_recv 875 drivers/infiniband/core/mad_rmpp.c newwin = rmpp_recv->repwin;