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;