Lines Matching refs:cm_id_priv

89 static struct iwcm_work *get_work(struct iwcm_id_private *cm_id_priv)
93 if (list_empty(&cm_id_priv->work_free_list))
95 work = list_entry(cm_id_priv->work_free_list.next, struct iwcm_work,
106 static void dealloc_work_entries(struct iwcm_id_private *cm_id_priv)
110 list_for_each_safe(e, tmp, &cm_id_priv->work_free_list)
114 static int alloc_work_entries(struct iwcm_id_private *cm_id_priv, int count)
118 BUG_ON(!list_empty(&cm_id_priv->work_free_list));
122 dealloc_work_entries(cm_id_priv);
125 work->cm_id = cm_id_priv;
148 static void free_cm_id(struct iwcm_id_private *cm_id_priv)
150 dealloc_work_entries(cm_id_priv);
151 kfree(cm_id_priv);
159 static int iwcm_deref_id(struct iwcm_id_private *cm_id_priv)
161 BUG_ON(atomic_read(&cm_id_priv->refcount)==0);
162 if (atomic_dec_and_test(&cm_id_priv->refcount)) {
163 BUG_ON(!list_empty(&cm_id_priv->work_list));
164 complete(&cm_id_priv->destroy_comp);
173 struct iwcm_id_private *cm_id_priv;
174 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
175 atomic_inc(&cm_id_priv->refcount);
180 struct iwcm_id_private *cm_id_priv;
181 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
182 if (iwcm_deref_id(cm_id_priv) &&
183 test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags)) {
184 BUG_ON(!list_empty(&cm_id_priv->work_list));
185 free_cm_id(cm_id_priv);
196 struct iwcm_id_private *cm_id_priv;
198 cm_id_priv = kzalloc(sizeof(*cm_id_priv), GFP_KERNEL);
199 if (!cm_id_priv)
202 cm_id_priv->state = IW_CM_STATE_IDLE;
203 cm_id_priv->id.device = device;
204 cm_id_priv->id.cm_handler = cm_handler;
205 cm_id_priv->id.context = context;
206 cm_id_priv->id.event_handler = cm_event_handler;
207 cm_id_priv->id.add_ref = add_ref;
208 cm_id_priv->id.rem_ref = rem_ref;
209 cm_id_priv->id.so = so;
210 spin_lock_init(&cm_id_priv->lock);
211 atomic_set(&cm_id_priv->refcount, 1);
212 init_waitqueue_head(&cm_id_priv->connect_wait);
213 init_completion(&cm_id_priv->destroy_comp);
214 INIT_LIST_HEAD(&cm_id_priv->work_list);
215 INIT_LIST_HEAD(&cm_id_priv->work_free_list);
217 return &cm_id_priv->id;
260 struct iwcm_id_private *cm_id_priv;
265 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
267 wait_event(cm_id_priv->connect_wait,
268 !test_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags));
270 spin_lock_irqsave(&cm_id_priv->lock, flags);
271 switch (cm_id_priv->state) {
273 cm_id_priv->state = IW_CM_STATE_CLOSING;
276 if (cm_id_priv->qp)
277 qp = cm_id_priv->qp;
300 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
327 struct iwcm_id_private *cm_id_priv;
331 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
336 wait_event(cm_id_priv->connect_wait,
337 !test_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags));
339 spin_lock_irqsave(&cm_id_priv->lock, flags);
340 switch (cm_id_priv->state) {
342 cm_id_priv->state = IW_CM_STATE_DESTROYING;
343 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
346 spin_lock_irqsave(&cm_id_priv->lock, flags);
349 cm_id_priv->state = IW_CM_STATE_DESTROYING;
350 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
352 (void)iwcm_modify_qp_err(cm_id_priv->qp);
353 spin_lock_irqsave(&cm_id_priv->lock, flags);
357 cm_id_priv->state = IW_CM_STATE_DESTROYING;
366 cm_id_priv->state = IW_CM_STATE_DESTROYING;
367 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
369 spin_lock_irqsave(&cm_id_priv->lock, flags);
377 if (cm_id_priv->qp) {
378 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
379 cm_id_priv->qp = NULL;
381 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
383 (void)iwcm_deref_id(cm_id_priv);
394 struct iwcm_id_private *cm_id_priv;
396 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
397 BUG_ON(test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags));
401 wait_for_completion(&cm_id_priv->destroy_comp);
403 free_cm_id(cm_id_priv);
415 struct iwcm_id_private *cm_id_priv;
419 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
421 ret = alloc_work_entries(cm_id_priv, backlog);
425 spin_lock_irqsave(&cm_id_priv->lock, flags);
426 switch (cm_id_priv->state) {
428 cm_id_priv->state = IW_CM_STATE_LISTEN;
429 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
432 cm_id_priv->state = IW_CM_STATE_IDLE;
433 spin_lock_irqsave(&cm_id_priv->lock, flags);
438 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
453 struct iwcm_id_private *cm_id_priv;
457 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
458 set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
460 spin_lock_irqsave(&cm_id_priv->lock, flags);
461 if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
462 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
463 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
464 wake_up_all(&cm_id_priv->connect_wait);
467 cm_id_priv->state = IW_CM_STATE_IDLE;
468 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
473 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
474 wake_up_all(&cm_id_priv->connect_wait);
490 struct iwcm_id_private *cm_id_priv;
495 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
496 set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
498 spin_lock_irqsave(&cm_id_priv->lock, flags);
499 if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
500 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
501 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
502 wake_up_all(&cm_id_priv->connect_wait);
508 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
512 cm_id_priv->qp = qp;
513 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
518 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
519 cm_id_priv->state = IW_CM_STATE_IDLE;
520 spin_lock_irqsave(&cm_id_priv->lock, flags);
521 if (cm_id_priv->qp) {
523 cm_id_priv->qp = NULL;
525 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
526 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
527 wake_up_all(&cm_id_priv->connect_wait);
543 struct iwcm_id_private *cm_id_priv;
548 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
550 ret = alloc_work_entries(cm_id_priv, 4);
554 set_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
555 spin_lock_irqsave(&cm_id_priv->lock, flags);
557 if (cm_id_priv->state != IW_CM_STATE_IDLE) {
558 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
559 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
560 wake_up_all(&cm_id_priv->connect_wait);
567 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
571 cm_id_priv->qp = qp;
572 cm_id_priv->state = IW_CM_STATE_CONN_SENT;
573 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
577 spin_lock_irqsave(&cm_id_priv->lock, flags);
578 if (cm_id_priv->qp) {
580 cm_id_priv->qp = NULL;
582 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
583 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT);
584 cm_id_priv->state = IW_CM_STATE_IDLE;
585 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
586 wake_up_all(&cm_id_priv->connect_wait);
613 struct iwcm_id_private *cm_id_priv;
645 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
646 cm_id_priv->state = IW_CM_STATE_CONN_RECV;
648 ret = alloc_work_entries(cm_id_priv, 3);
659 set_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
661 if (atomic_read(&cm_id_priv->refcount)==0)
662 free_cm_id(cm_id_priv);
682 static int cm_conn_est_handler(struct iwcm_id_private *cm_id_priv,
688 spin_lock_irqsave(&cm_id_priv->lock, flags);
695 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
696 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
697 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
698 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
699 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
700 wake_up_all(&cm_id_priv->connect_wait);
712 static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv,
718 spin_lock_irqsave(&cm_id_priv->lock, flags);
723 clear_bit(IWCM_F_CONNECT_WAIT, &cm_id_priv->flags);
724 BUG_ON(cm_id_priv->state != IW_CM_STATE_CONN_SENT);
726 cm_id_priv->id.local_addr = iw_event->local_addr;
727 cm_id_priv->id.remote_addr = iw_event->remote_addr;
728 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
731 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
732 cm_id_priv->qp = NULL;
733 cm_id_priv->state = IW_CM_STATE_IDLE;
735 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
736 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
742 wake_up_all(&cm_id_priv->connect_wait);
752 static void cm_disconnect_handler(struct iwcm_id_private *cm_id_priv,
757 spin_lock_irqsave(&cm_id_priv->lock, flags);
758 if (cm_id_priv->state == IW_CM_STATE_ESTABLISHED)
759 cm_id_priv->state = IW_CM_STATE_CLOSING;
760 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
774 static int cm_close_handler(struct iwcm_id_private *cm_id_priv,
779 spin_lock_irqsave(&cm_id_priv->lock, flags);
781 if (cm_id_priv->qp) {
782 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
783 cm_id_priv->qp = NULL;
785 switch (cm_id_priv->state) {
788 cm_id_priv->state = IW_CM_STATE_IDLE;
789 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
790 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
791 spin_lock_irqsave(&cm_id_priv->lock, flags);
798 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
803 static int process_event(struct iwcm_id_private *cm_id_priv,
810 cm_conn_req_handler(cm_id_priv, iw_event);
813 ret = cm_conn_rep_handler(cm_id_priv, iw_event);
816 ret = cm_conn_est_handler(cm_id_priv, iw_event);
819 cm_disconnect_handler(cm_id_priv, iw_event);
822 ret = cm_close_handler(cm_id_priv, iw_event);
844 struct iwcm_id_private *cm_id_priv = work->cm_id;
850 spin_lock_irqsave(&cm_id_priv->lock, flags);
851 empty = list_empty(&cm_id_priv->work_list);
853 work = list_entry(cm_id_priv->work_list.next,
856 empty = list_empty(&cm_id_priv->work_list);
859 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
861 ret = process_event(cm_id_priv, &levent);
863 set_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
864 destroy_cm_id(&cm_id_priv->id);
866 BUG_ON(atomic_read(&cm_id_priv->refcount)==0);
867 destroy_id = test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags);
868 if (iwcm_deref_id(cm_id_priv)) {
870 BUG_ON(!list_empty(&cm_id_priv->work_list));
871 free_cm_id(cm_id_priv);
875 spin_lock_irqsave(&cm_id_priv->lock, flags);
877 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
899 struct iwcm_id_private *cm_id_priv;
903 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
905 spin_lock_irqsave(&cm_id_priv->lock, flags);
906 work = get_work(cm_id_priv);
913 work->cm_id = cm_id_priv;
926 atomic_inc(&cm_id_priv->refcount);
927 if (list_empty(&cm_id_priv->work_list)) {
928 list_add_tail(&work->list, &cm_id_priv->work_list);
931 list_add_tail(&work->list, &cm_id_priv->work_list);
933 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
937 static int iwcm_init_qp_init_attr(struct iwcm_id_private *cm_id_priv,
944 spin_lock_irqsave(&cm_id_priv->lock, flags);
945 switch (cm_id_priv->state) {
959 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
963 static int iwcm_init_qp_rts_attr(struct iwcm_id_private *cm_id_priv,
970 spin_lock_irqsave(&cm_id_priv->lock, flags);
971 switch (cm_id_priv->state) {
983 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
991 struct iwcm_id_private *cm_id_priv;
994 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
998 ret = iwcm_init_qp_init_attr(cm_id_priv,
1002 ret = iwcm_init_qp_rts_attr(cm_id_priv,