Lines Matching refs:cm_id_priv

124 static struct iwcm_work *get_work(struct iwcm_id_private *cm_id_priv)
128 if (TAILQ_EMPTY(&cm_id_priv->work_free_list))
130 work = TAILQ_FIRST(&cm_id_priv->work_free_list);
131 TAILQ_REMOVE(&cm_id_priv->work_free_list, work, free_list);
140 static void dealloc_work_entries(struct iwcm_id_private *cm_id_priv)
144 TAILQ_FOREACH_SAFE(e, &cm_id_priv->work_free_list, free_list, tmp)
148 static int alloc_work_entries(struct iwcm_id_private *cm_id_priv, int count)
152 PANIC_IF(!TAILQ_EMPTY(&cm_id_priv->work_free_list));
156 dealloc_work_entries(cm_id_priv);
159 work->cm_id = cm_id_priv;
182 static void free_cm_id(struct iwcm_id_private *cm_id_priv)
184 dealloc_work_entries(cm_id_priv);
185 free(cm_id_priv, M_DEVBUF);
193 static int iwcm_deref_id(struct iwcm_id_private *cm_id_priv)
195 mtx_lock(&cm_id_priv->lock);
196 PANIC_IF(atomic_load_acq_int(&cm_id_priv->refcount)==0);
197 if (atomic_fetchadd_int(&cm_id_priv->refcount, -1) == 1) {
198 PANIC_IF(!TAILQ_EMPTY(&cm_id_priv->work_list));
199 wakeup(&cm_id_priv->destroy_comp);
200 mtx_unlock(&cm_id_priv->lock);
203 mtx_unlock(&cm_id_priv->lock);
210 struct iwcm_id_private *cm_id_priv;
211 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
212 mtx_lock(&cm_id_priv->lock);
213 atomic_add_int(&cm_id_priv->refcount, 1);
214 mtx_unlock(&cm_id_priv->lock);
219 struct iwcm_id_private *cm_id_priv;
220 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
221 if (iwcm_deref_id(cm_id_priv) &&
222 isset(&cm_id_priv->flags, IWCM_F_CALLBACK_DESTROY)) {
223 PANIC_IF(!TAILQ_EMPTY(&cm_id_priv->work_list));
224 free_cm_id(cm_id_priv);
235 struct iwcm_id_private *cm_id_priv;
238 cm_id_priv = malloc(sizeof(*cm_id_priv), M_DEVBUF, M_NOWAIT);
239 if (!cm_id_priv)
241 bzero(cm_id_priv, sizeof *cm_id_priv);
243 cm_id_priv->state = IW_CM_STATE_IDLE;
244 cm_id_priv->id.device = device;
245 cm_id_priv->id.cm_handler = cm_handler;
246 cm_id_priv->id.context = context;
247 cm_id_priv->id.event_handler = cm_event_handler;
248 cm_id_priv->id.add_ref = add_ref;
249 cm_id_priv->id.rem_ref = rem_ref;
250 cm_id_priv->id.so = so;
251 mtx_init(&cm_id_priv->lock, "cm_id_priv", NULL, MTX_DUPOK|MTX_DEF);
252 atomic_store_rel_int(&cm_id_priv->refcount, 1);
253 TAILQ_INIT(&cm_id_priv->work_list);
254 TAILQ_INIT(&cm_id_priv->work_free_list);
256 return &cm_id_priv->id;
298 struct iwcm_id_private *cm_id_priv;
302 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
304 mtx_lock(&cm_id_priv->lock);
305 if (isset(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT))
306 msleep(&cm_id_priv->connect_wait, &cm_id_priv->lock, 0, "iwcm connect1", 0);
308 switch (cm_id_priv->state) {
310 cm_id_priv->state = IW_CM_STATE_CLOSING;
313 if (cm_id_priv->qp)
314 qp = cm_id_priv->qp;
337 mtx_unlock(&cm_id_priv->lock);
363 struct iwcm_id_private *cm_id_priv;
366 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
371 mtx_lock(&cm_id_priv->lock);
372 if (isset(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT))
373 msleep(&cm_id_priv->connect_wait, &cm_id_priv->lock, 0, "iwcm connect2", 0);
375 switch (cm_id_priv->state) {
377 cm_id_priv->state = IW_CM_STATE_DESTROYING;
378 mtx_unlock(&cm_id_priv->lock);
381 mtx_lock(&cm_id_priv->lock);
384 cm_id_priv->state = IW_CM_STATE_DESTROYING;
385 mtx_unlock(&cm_id_priv->lock);
387 (void)iwcm_modify_qp_err(cm_id_priv->qp);
388 mtx_lock(&cm_id_priv->lock);
392 cm_id_priv->state = IW_CM_STATE_DESTROYING;
401 cm_id_priv->state = IW_CM_STATE_DESTROYING;
409 if (cm_id_priv->qp) {
410 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
411 cm_id_priv->qp = NULL;
413 mtx_unlock(&cm_id_priv->lock);
415 (void)iwcm_deref_id(cm_id_priv);
426 struct iwcm_id_private *cm_id_priv;
428 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
429 PANIC_IF(isset(&cm_id_priv->flags, IWCM_F_CALLBACK_DESTROY));
433 mtx_lock(&cm_id_priv->lock);
434 if (atomic_load_acq_int(&cm_id_priv->refcount))
435 msleep(&cm_id_priv->destroy_comp, &cm_id_priv->lock, 0, "iwcm destroy", 0);
436 mtx_unlock(&cm_id_priv->lock);
438 free_cm_id(cm_id_priv);
449 struct iwcm_id_private *cm_id_priv;
452 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
454 ret = alloc_work_entries(cm_id_priv, backlog);
458 mtx_lock(&cm_id_priv->lock);
459 switch (cm_id_priv->state) {
461 cm_id_priv->state = IW_CM_STATE_LISTEN;
462 mtx_unlock(&cm_id_priv->lock);
465 cm_id_priv->state = IW_CM_STATE_IDLE;
466 mtx_lock(&cm_id_priv->lock);
471 mtx_unlock(&cm_id_priv->lock);
485 struct iwcm_id_private *cm_id_priv;
488 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
489 setbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
491 mtx_lock(&cm_id_priv->lock);
492 if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
493 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
494 wakeup(&cm_id_priv->connect_wait);
495 mtx_unlock(&cm_id_priv->lock);
498 cm_id_priv->state = IW_CM_STATE_IDLE;
499 mtx_unlock(&cm_id_priv->lock);
504 mtx_lock(&cm_id_priv->lock);
505 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
506 wakeup(&cm_id_priv->connect_wait);
507 mtx_unlock(&cm_id_priv->lock);
522 struct iwcm_id_private *cm_id_priv;
526 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
527 setbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
529 mtx_lock(&cm_id_priv->lock);
530 if (cm_id_priv->state != IW_CM_STATE_CONN_RECV) {
531 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
532 wakeup(&cm_id_priv->connect_wait);
533 mtx_unlock(&cm_id_priv->lock);
540 mtx_unlock(&cm_id_priv->lock);
544 cm_id_priv->qp = qp;
545 mtx_unlock(&cm_id_priv->lock);
550 PANIC_IF(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
551 cm_id_priv->state = IW_CM_STATE_IDLE;
552 mtx_lock(&cm_id_priv->lock);
553 if (cm_id_priv->qp) {
555 cm_id_priv->qp = NULL;
557 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
558 wakeup(&cm_id_priv->connect_wait);
559 mtx_unlock(&cm_id_priv->lock);
574 struct iwcm_id_private *cm_id_priv;
578 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
580 ret = alloc_work_entries(cm_id_priv, 4);
584 setbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
585 mtx_lock(&cm_id_priv->lock);
587 if (cm_id_priv->state != IW_CM_STATE_IDLE) {
588 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
589 wakeup(&cm_id_priv->connect_wait);
590 mtx_unlock(&cm_id_priv->lock);
598 mtx_unlock(&cm_id_priv->lock);
602 cm_id_priv->qp = qp;
603 cm_id_priv->state = IW_CM_STATE_CONN_SENT;
604 mtx_unlock(&cm_id_priv->lock);
608 mtx_lock(&cm_id_priv->lock);
609 if (cm_id_priv->qp) {
611 cm_id_priv->qp = NULL;
613 PANIC_IF(cm_id_priv->state != IW_CM_STATE_CONN_SENT);
614 cm_id_priv->state = IW_CM_STATE_IDLE;
615 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
616 wakeup(&cm_id_priv->connect_wait);
617 mtx_unlock(&cm_id_priv->lock);
643 struct iwcm_id_private *cm_id_priv;
675 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
676 cm_id_priv->state = IW_CM_STATE_CONN_RECV;
678 ret = alloc_work_entries(cm_id_priv, 3);
689 setbit(&cm_id_priv->flags, IWCM_F_CALLBACK_DESTROY);
692 if (atomic_load_acq_int(&cm_id_priv->refcount)==0)
693 free_cm_id(cm_id_priv);
713 static int cm_conn_est_handler(struct iwcm_id_private *cm_id_priv,
718 mtx_lock(&cm_id_priv->lock);
725 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
726 PANIC_IF(cm_id_priv->state != IW_CM_STATE_CONN_RECV);
727 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
728 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
729 wakeup(&cm_id_priv->connect_wait);
730 mtx_unlock(&cm_id_priv->lock);
742 static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv,
747 mtx_lock(&cm_id_priv->lock);
752 clrbit(&cm_id_priv->flags, IWCM_F_CONNECT_WAIT);
753 PANIC_IF(cm_id_priv->state != IW_CM_STATE_CONN_SENT);
755 cm_id_priv->id.local_addr = iw_event->local_addr;
756 cm_id_priv->id.remote_addr = iw_event->remote_addr;
757 cm_id_priv->state = IW_CM_STATE_ESTABLISHED;
760 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
761 cm_id_priv->qp = NULL;
762 cm_id_priv->state = IW_CM_STATE_IDLE;
764 mtx_unlock(&cm_id_priv->lock);
765 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
767 mtx_lock(&cm_id_priv->lock);
772 wakeup(&cm_id_priv->connect_wait);
773 mtx_unlock(&cm_id_priv->lock);
783 static void cm_disconnect_handler(struct iwcm_id_private *cm_id_priv,
787 mtx_lock(&cm_id_priv->lock);
788 if (cm_id_priv->state == IW_CM_STATE_ESTABLISHED)
789 cm_id_priv->state = IW_CM_STATE_CLOSING;
790 mtx_unlock(&cm_id_priv->lock);
804 static int cm_close_handler(struct iwcm_id_private *cm_id_priv,
808 mtx_lock(&cm_id_priv->lock);
810 if (cm_id_priv->qp) {
811 cm_id_priv->id.device->iwcm->rem_ref(cm_id_priv->qp);
812 cm_id_priv->qp = NULL;
814 switch (cm_id_priv->state) {
817 cm_id_priv->state = IW_CM_STATE_IDLE;
818 mtx_unlock(&cm_id_priv->lock);
819 ret = cm_id_priv->id.cm_handler(&cm_id_priv->id, iw_event);
820 mtx_lock(&cm_id_priv->lock);
827 mtx_unlock(&cm_id_priv->lock);
832 static int process_event(struct iwcm_id_private *cm_id_priv,
839 cm_conn_req_handler(cm_id_priv, iw_event);
842 ret = cm_conn_rep_handler(cm_id_priv, iw_event);
845 ret = cm_conn_est_handler(cm_id_priv, iw_event);
848 cm_disconnect_handler(cm_id_priv, iw_event);
851 ret = cm_close_handler(cm_id_priv, iw_event);
873 struct iwcm_id_private *cm_id_priv = work->cm_id;
877 mtx_lock(&cm_id_priv->lock);
878 empty = TAILQ_EMPTY(&cm_id_priv->work_list);
880 work = TAILQ_FIRST(&cm_id_priv->work_list);
881 TAILQ_REMOVE(&cm_id_priv->work_list, work, list);
882 empty = TAILQ_EMPTY(&cm_id_priv->work_list);
885 mtx_unlock(&cm_id_priv->lock);
887 ret = process_event(cm_id_priv, &levent);
889 setbit(&cm_id_priv->flags, IWCM_F_CALLBACK_DESTROY);
890 destroy_cm_id(&cm_id_priv->id);
892 PANIC_IF(atomic_load_acq_int(&cm_id_priv->refcount)==0);
893 if (iwcm_deref_id(cm_id_priv)) {
894 if (isset(&cm_id_priv->flags,
896 PANIC_IF(!TAILQ_EMPTY(&cm_id_priv->work_list));
897 free_cm_id(cm_id_priv);
901 mtx_lock(&cm_id_priv->lock);
903 mtx_unlock(&cm_id_priv->lock);
925 struct iwcm_id_private *cm_id_priv;
928 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
930 mtx_lock(&cm_id_priv->lock);
931 work = get_work(cm_id_priv);
938 work->cm_id = cm_id_priv;
951 atomic_add_acq_int(&cm_id_priv->refcount, 1);
952 if (TAILQ_EMPTY(&cm_id_priv->work_list)) {
953 TAILQ_INSERT_TAIL(&cm_id_priv->work_list, work, list);
956 TAILQ_INSERT_TAIL(&cm_id_priv->work_list, work, list);
958 mtx_unlock(&cm_id_priv->lock);
962 static int iwcm_init_qp_init_attr(struct iwcm_id_private *cm_id_priv,
968 mtx_lock(&cm_id_priv->lock);
969 switch (cm_id_priv->state) {
984 mtx_unlock(&cm_id_priv->lock);
988 static int iwcm_init_qp_rts_attr(struct iwcm_id_private *cm_id_priv,
994 mtx_lock(&cm_id_priv->lock);
995 switch (cm_id_priv->state) {
1007 mtx_unlock(&cm_id_priv->lock);
1015 struct iwcm_id_private *cm_id_priv;
1018 cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
1022 ret = iwcm_init_qp_init_attr(cm_id_priv,
1026 ret = iwcm_init_qp_rts_attr(cm_id_priv,