Lines Matching refs:cm_id_priv

90 static struct iwcm_work *get_work(struct iwcm_id_private *cm_id_priv)
94 if (list_empty(&cm_id_priv->work_free_list))
96 work = list_entry(cm_id_priv->work_free_list.next, struct iwcm_work,
107 static void dealloc_work_entries(struct iwcm_id_private *cm_id_priv)
111 list_for_each_safe(e, tmp, &cm_id_priv->work_free_list)
115 static int alloc_work_entries(struct iwcm_id_private *cm_id_priv, int count)
119 BUG_ON(!list_empty(&cm_id_priv->work_free_list));
123 dealloc_work_entries(cm_id_priv);
126 work->cm_id = cm_id_priv;
149 static void free_cm_id(struct iwcm_id_private *cm_id_priv)
151 dealloc_work_entries(cm_id_priv);
152 kfree(cm_id_priv);
160 static int iwcm_deref_id(struct iwcm_id_private *cm_id_priv)
162 BUG_ON(atomic_read(&cm_id_priv->refcount)==0);
163 if (atomic_dec_and_test(&cm_id_priv->refcount)) {
164 BUG_ON(!list_empty(&cm_id_priv->work_list));
165 complete(&cm_id_priv->destroy_comp);
174 struct iwcm_id_private *cm_id_priv;
175 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
176 atomic_inc(&cm_id_priv->refcount);
181 struct iwcm_id_private *cm_id_priv;
182 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
183 if (iwcm_deref_id(cm_id_priv) &&
184 test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags)) {
185 BUG_ON(!list_empty(&cm_id_priv->work_list));
186 free_cm_id(cm_id_priv);
197 struct iwcm_id_private *cm_id_priv;
199 cm_id_priv = kzalloc(sizeof(*cm_id_priv), GFP_KERNEL);
200 if (!cm_id_priv)
203 cm_id_priv->state = IW_CM_STATE_IDLE;
204 cm_id_priv->id.device = device;
205 cm_id_priv->id.cm_handler = cm_handler;
206 cm_id_priv->id.context = context;
207 cm_id_priv->id.event_handler = cm_event_handler;
208 cm_id_priv->id.add_ref = add_ref;
209 cm_id_priv->id.rem_ref = rem_ref;
210 cm_id_priv->id.so = so;
211 spin_lock_init(&cm_id_priv->lock);
212 atomic_set(&cm_id_priv->refcount, 1);
213 init_waitqueue_head(&cm_id_priv->connect_wait);
214 init_completion(&cm_id_priv->destroy_comp);
215 INIT_LIST_HEAD(&cm_id_priv->work_list);
216 INIT_LIST_HEAD(&cm_id_priv->work_free_list);
218 return &cm_id_priv->id;
261 struct iwcm_id_private *cm_id_priv;
266 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
268 wait_event(cm_id_priv->connect_wait,
269 !test_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags));
271 spin_lock_irqsave(&cm_id_priv->lock, flags);
272 switch (cm_id_priv->state) {
274 cm_id_priv->state = IW_CM_STATE_CLOSING;
277 if (cm_id_priv->qp)
278 qp = cm_id_priv->qp;
301 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
328 struct iwcm_id_private *cm_id_priv;
332 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
337 wait_event(cm_id_priv->connect_wait,
338 !test_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags));
340 spin_lock_irqsave(&cm_id_priv->lock, flags);
341 switch (cm_id_priv->state) {
343 cm_id_priv->state = IW_CM_STATE_DESTROYING;
344 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
347 spin_lock_irqsave(&cm_id_priv->lock, flags);
350 cm_id_priv->state = IW_CM_STATE_DESTROYING;
351 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
353 (void)iwcm_modify_qp_err(cm_id_priv->qp);
354 spin_lock_irqsave(&cm_id_priv->lock, flags);
358 cm_id_priv->state = IW_CM_STATE_DESTROYING;
367 cm_id_priv->state = IW_CM_STATE_DESTROYING;
368 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
370 spin_lock_irqsave(&cm_id_priv->lock, flags);
378 if (cm_id_priv->qp) {
379 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
380 cm_id_priv->qp = NULL;
382 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
384 (void)iwcm_deref_id(cm_id_priv);
395 struct iwcm_id_private *cm_id_priv;
397 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
398 BUG_ON(test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags));
402 wait_for_completion(&cm_id_priv->destroy_comp);
404 free_cm_id(cm_id_priv);
416 struct iwcm_id_private *cm_id_priv;
420 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
422 ret = alloc_work_entries(cm_id_priv, backlog);
426 spin_lock_irqsave(&cm_id_priv->lock, flags);
427 switch (cm_id_priv->state) {
429 cm_id_priv->state = IW_CM_STATE_LISTEN;
430 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
433 cm_id_priv->state = IW_CM_STATE_IDLE;
434 spin_lock_irqsave(&cm_id_priv->lock, flags);
439 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
454 struct iwcm_id_private *cm_id_priv;
458 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
459 set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
461 spin_lock_irqsave(&cm_id_priv->lock, flags);
462 if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
463 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
464 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
465 wake_up_all(&cm_id_priv->connect_wait);
468 cm_id_priv->state = IW_CM_STATE_IDLE;
469 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
474 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
475 wake_up_all(&cm_id_priv->connect_wait);
491 struct iwcm_id_private *cm_id_priv;
496 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
497 set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
499 spin_lock_irqsave(&cm_id_priv->lock, flags);
500 if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
501 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
502 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
503 wake_up_all(&cm_id_priv->connect_wait);
509 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
513 cm_id_priv->qp = qp;
514 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
519 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
520 cm_id_priv->state = IW_CM_STATE_IDLE;
521 spin_lock_irqsave(&cm_id_priv->lock, flags);
522 if (cm_id_priv->qp) {
524 cm_id_priv->qp = NULL;
526 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
527 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
528 wake_up_all(&cm_id_priv->connect_wait);
544 struct iwcm_id_private *cm_id_priv;
549 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
551 ret = alloc_work_entries(cm_id_priv, 4);
555 set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
556 spin_lock_irqsave(&cm_id_priv->lock, flags);
558 if (cm_id_priv->state != IW_CM_STATE_IDLE) {
559 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
560 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
561 wake_up_all(&cm_id_priv->connect_wait);
568 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
572 cm_id_priv->qp = qp;
573 cm_id_priv->state = IW_CM_STATE_CONN_SENT;
574 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
578 spin_lock_irqsave(&cm_id_priv->lock, flags);
579 if (cm_id_priv->qp) {
581 cm_id_priv->qp = NULL;
583 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
584 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT);
585 cm_id_priv->state = IW_CM_STATE_IDLE;
586 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
587 wake_up_all(&cm_id_priv->connect_wait);
614 struct iwcm_id_private *cm_id_priv;
646 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
647 cm_id_priv->state = IW_CM_STATE_CONN_RECV;
649 ret = alloc_work_entries(cm_id_priv, 3);
660 set_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
662 if (atomic_read(&cm_id_priv->refcount)==0)
663 free_cm_id(cm_id_priv);
683 static int cm_conn_est_handler(struct iwcm_id_private *cm_id_priv,
689 spin_lock_irqsave(&cm_id_priv->lock, flags);
696 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
697 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
698 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
699 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
700 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
701 wake_up_all(&cm_id_priv->connect_wait);
713 static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv,
719 spin_lock_irqsave(&cm_id_priv->lock, flags);
724 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
725 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT);
727 cm_id_priv->id.local_addr = iw_event->local_addr;
728 cm_id_priv->id.remote_addr = iw_event->remote_addr;
729 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
732 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
733 cm_id_priv->qp = NULL;
734 cm_id_priv->state = IW_CM_STATE_IDLE;
736 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
737 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
743 wake_up_all(&cm_id_priv->connect_wait);
753 static void cm_disconnect_handler(struct iwcm_id_private *cm_id_priv,
758 spin_lock_irqsave(&cm_id_priv->lock, flags);
759 if (cm_id_priv->state == IW_CM_STATE_ESTABLISHED)
760 cm_id_priv->state = IW_CM_STATE_CLOSING;
761 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
775 static int cm_close_handler(struct iwcm_id_private *cm_id_priv,
780 spin_lock_irqsave(&cm_id_priv->lock, flags);
782 if (cm_id_priv->qp) {
783 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
784 cm_id_priv->qp = NULL;
786 switch (cm_id_priv->state) {
789 cm_id_priv->state = IW_CM_STATE_IDLE;
790 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
791 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
792 spin_lock_irqsave(&cm_id_priv->lock, flags);
799 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
804 static int process_event(struct iwcm_id_private *cm_id_priv,
811 cm_conn_req_handler(cm_id_priv, iw_event);
814 ret = cm_conn_rep_handler(cm_id_priv, iw_event);
817 ret = cm_conn_est_handler(cm_id_priv, iw_event);
820 cm_disconnect_handler(cm_id_priv, iw_event);
823 ret = cm_close_handler(cm_id_priv, iw_event);
845 struct iwcm_id_private *cm_id_priv = work->cm_id;
851 spin_lock_irqsave(&cm_id_priv->lock, flags);
852 empty = list_empty(&cm_id_priv->work_list);
854 work = list_entry(cm_id_priv->work_list.next,
857 empty = list_empty(&cm_id_priv->work_list);
860 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
862 ret = process_event(cm_id_priv, &levent);
864 set_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
865 destroy_cm_id(&cm_id_priv->id);
867 BUG_ON(atomic_read(&cm_id_priv->refcount)==0);
868 destroy_id = test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
869 if (iwcm_deref_id(cm_id_priv)) {
871 BUG_ON(!list_empty(&cm_id_priv->work_list));
872 free_cm_id(cm_id_priv);
876 spin_lock_irqsave(&cm_id_priv->lock, flags);
878 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
900 struct iwcm_id_private *cm_id_priv;
904 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
906 spin_lock_irqsave(&cm_id_priv->lock, flags);
907 work = get_work(cm_id_priv);
914 work->cm_id = cm_id_priv;
927 atomic_inc(&cm_id_priv->refcount);
928 if (list_empty(&cm_id_priv->work_list)) {
929 list_add_tail(&work->list, &cm_id_priv->work_list);
932 list_add_tail(&work->list, &cm_id_priv->work_list);
934 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
938 static int iwcm_init_qp_init_attr(struct iwcm_id_private *cm_id_priv,
945 spin_lock_irqsave(&cm_id_priv->lock, flags);
946 switch (cm_id_priv->state) {
960 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
964 static int iwcm_init_qp_rts_attr(struct iwcm_id_private *cm_id_priv,
971 spin_lock_irqsave(&cm_id_priv->lock, flags);
972 switch (cm_id_priv->state) {
984 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
992 struct iwcm_id_private *cm_id_priv;
995 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
999 ret = iwcm_init_qp_init_attr(cm_id_priv,
1003 ret = iwcm_init_qp_rts_attr(cm_id_priv,