static void llt_ndlc_sm_work(struct work_struct *work) { struct llt_ndlc *ndlc = container_of(work, struct llt_ndlc, sm_work); llt_ndlc_send_queue(ndlc); llt_ndlc_rcv_queue(ndlc); if (ndlc->t1_active && timer_pending(&ndlc->t1_timer) == 0) { pr_debug ("Handle T1(recv SUPERVISOR) elapsed (T1 now inactive)\n"); ndlc->t1_active = false; llt_ndlc_requeue_data_pending(ndlc); llt_ndlc_send_queue(ndlc); } if (ndlc->t2_active && timer_pending(&ndlc->t2_timer) == 0) { pr_debug("Handle T2(recv DATA) elapsed (T2 now inactive)\n"); ndlc->t2_active = false; ndlc->t1_active = false; del_timer_sync(&ndlc->t1_timer); ndlc_close(ndlc); ndlc->hard_fault = -EREMOTEIO; } }
void st_nci_remove(struct nci_dev *ndev) { struct st_nci_info *info = nci_get_drvdata(ndev); ndlc_close(info->ndlc); nci_unregister_device(ndev); nci_free_device(ndev); }
static int st21nfcb_nci_close(struct nci_dev *ndev) { struct st21nfcb_nci_info *info = nci_get_drvdata(ndev); if (!test_and_clear_bit(ST21NFCB_NCI_RUNNING, &info->flags)) return 0; ndlc_close(info->ndlc); return 0; }
void ndlc_recv(struct llt_ndlc *ndlc, struct sk_buff *skb) { if (skb == NULL) { pr_err("NULL Frame -> link is dead\n"); ndlc->hard_fault = -EREMOTEIO; ndlc_close(ndlc); } else { NDLC_DUMP_SKB("incoming frame", skb); skb_queue_tail(&ndlc->rcv_q, skb); } schedule_work(&ndlc->sm_work); }