Lines Matching refs:self
50 static int irlap_state_ndm (struct irlap_cb *self, IRLAP_EVENT event,
52 static int irlap_state_query (struct irlap_cb *self, IRLAP_EVENT event,
54 static int irlap_state_reply (struct irlap_cb *self, IRLAP_EVENT event,
56 static int irlap_state_conn (struct irlap_cb *self, IRLAP_EVENT event,
58 static int irlap_state_setup (struct irlap_cb *self, IRLAP_EVENT event,
60 static int irlap_state_offline(struct irlap_cb *self, IRLAP_EVENT event,
62 static int irlap_state_xmit_p (struct irlap_cb *self, IRLAP_EVENT event,
64 static int irlap_state_pclose (struct irlap_cb *self, IRLAP_EVENT event,
66 static int irlap_state_nrm_p (struct irlap_cb *self, IRLAP_EVENT event,
68 static int irlap_state_reset_wait(struct irlap_cb *self, IRLAP_EVENT event,
70 static int irlap_state_reset (struct irlap_cb *self, IRLAP_EVENT event,
72 static int irlap_state_nrm_s (struct irlap_cb *self, IRLAP_EVENT event,
74 static int irlap_state_xmit_s (struct irlap_cb *self, IRLAP_EVENT event,
76 static int irlap_state_sclose (struct irlap_cb *self, IRLAP_EVENT event,
142 static int (*state[])(struct irlap_cb *self, IRLAP_EVENT event,
170 struct irlap_cb *self = (struct irlap_cb *) data; in irlap_poll_timer_expired() local
172 IRDA_ASSERT(self != NULL, return;); in irlap_poll_timer_expired()
173 IRDA_ASSERT(self->magic == LAP_MAGIC, return;); in irlap_poll_timer_expired()
175 irlap_do_event(self, POLL_TIMER_EXPIRED, NULL, NULL); in irlap_poll_timer_expired()
184 static void irlap_start_poll_timer(struct irlap_cb *self, int timeout) in irlap_start_poll_timer() argument
186 IRDA_ASSERT(self != NULL, return;); in irlap_start_poll_timer()
187 IRDA_ASSERT(self->magic == LAP_MAGIC, return;); in irlap_start_poll_timer()
194 if (skb_queue_empty(&self->txq) || self->remote_busy) { in irlap_start_poll_timer()
195 if (self->fast_RR == TRUE) { in irlap_start_poll_timer()
200 if (self->fast_RR_timeout < timeout) { in irlap_start_poll_timer()
205 self->fast_RR_timeout += in irlap_start_poll_timer()
209 timeout = self->fast_RR_timeout; in irlap_start_poll_timer()
212 self->fast_RR = TRUE; in irlap_start_poll_timer()
215 self->fast_RR_timeout = 0; in irlap_start_poll_timer()
219 self->fast_RR = FALSE; in irlap_start_poll_timer()
225 irlap_do_event(self, POLL_TIMER_EXPIRED, NULL, NULL); in irlap_start_poll_timer()
227 irda_start_timer(&self->poll_timer, timeout, self, in irlap_start_poll_timer()
237 void irlap_do_event(struct irlap_cb *self, IRLAP_EVENT event, in irlap_do_event() argument
242 if (!self || self->magic != LAP_MAGIC) in irlap_do_event()
246 irlap_event[event], irlap_state[self->state]); in irlap_do_event()
248 ret = (*state[self->state])(self, event, skb, info); in irlap_do_event()
253 switch (self->state) { in irlap_do_event()
264 skb_queue_len(&self->txq)); in irlap_do_event()
266 if (!skb_queue_empty(&self->txq)) { in irlap_do_event()
268 self->local_busy = TRUE; in irlap_do_event()
286 while ((skb = skb_dequeue(&self->txq)) != NULL) { in irlap_do_event()
288 ret = (*state[self->state])(self, SEND_I_CMD, in irlap_do_event()
296 irlmp_flow_indication(self->notify.instance, in irlap_do_event()
303 self->local_busy = FALSE; in irlap_do_event()
304 } else if (self->disconnect_pending) { in irlap_do_event()
305 self->disconnect_pending = FALSE; in irlap_do_event()
307 ret = (*state[self->state])(self, DISCONNECT_REQUEST, in irlap_do_event()
326 static int irlap_state_ndm(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_ndm() argument
332 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_ndm()
333 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_ndm()
337 IRDA_ASSERT(self->netdev != NULL, return -1;); in irlap_state_ndm()
339 if (self->media_busy) { in irlap_state_ndm()
347 irlap_next_state(self, LAP_NDM); in irlap_state_ndm()
349 irlap_disconnect_indication(self, LAP_MEDIA_BUSY); in irlap_state_ndm()
351 irlap_send_snrm_frame(self, &self->qos_rx); in irlap_state_ndm()
354 irlap_start_final_timer(self, self->final_timeout); in irlap_state_ndm()
356 self->retry_count = 0; in irlap_state_ndm()
357 irlap_next_state(self, LAP_SETUP); in irlap_state_ndm()
363 self->daddr = info->daddr; in irlap_state_ndm()
364 self->caddr = info->caddr; in irlap_state_ndm()
366 irlap_next_state(self, LAP_CONN); in irlap_state_ndm()
368 irlap_connect_indication(self, skb); in irlap_state_ndm()
377 if (self->media_busy) { in irlap_state_ndm()
383 irlap_discovery_confirm(self, NULL); in irlap_state_ndm()
390 self->S = info->S; in irlap_state_ndm()
391 self->s = info->s; in irlap_state_ndm()
392 irlap_send_discovery_xid_frame(self, info->S, info->s, TRUE, in irlap_state_ndm()
394 self->frame_sent = FALSE; in irlap_state_ndm()
395 self->s++; in irlap_state_ndm()
397 irlap_start_slot_timer(self, self->slot_timeout); in irlap_state_ndm()
398 irlap_next_state(self, LAP_QUERY); in irlap_state_ndm()
405 self->slot = irlap_generate_rand_time_slot(info->S, in irlap_state_ndm()
407 if (self->slot == info->s) { in irlap_state_ndm()
411 irlap_send_discovery_xid_frame(self, info->S, in irlap_state_ndm()
412 self->slot, in irlap_state_ndm()
415 self->frame_sent = TRUE; in irlap_state_ndm()
417 self->frame_sent = FALSE; in irlap_state_ndm()
424 irlap_start_query_timer(self, info->S, info->s); in irlap_state_ndm()
425 irlap_next_state(self, LAP_REPLY); in irlap_state_ndm()
448 irlap_discovery_indication(self, info->discovery); in irlap_state_ndm()
463 if (!skb_queue_empty(&self->txq_ultra)) { in irlap_state_ndm()
467 ret = (*state[self->state])(self, SEND_UI_FRAME, in irlap_state_ndm()
473 if (self->connect_pending) { in irlap_state_ndm()
474 self->connect_pending = FALSE; in irlap_state_ndm()
479 if (self->disconnect_pending) in irlap_state_ndm()
480 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_ndm()
482 ret = (*state[self->state])(self, in irlap_state_ndm()
485 self->disconnect_pending = FALSE; in irlap_state_ndm()
504 for (i=0; ((i<2) && (self->media_busy == FALSE)); i++) { in irlap_state_ndm()
505 skb = skb_dequeue(&self->txq_ultra); in irlap_state_ndm()
507 irlap_send_ui_frame(self, skb, CBROADCAST, in irlap_state_ndm()
516 irda_device_set_media_busy(self->netdev, TRUE); in irlap_state_ndm()
526 irlap_unitdata_indication(self, skb); in irlap_state_ndm()
537 irlap_send_test_frame(self, CBROADCAST, info->daddr, skb); in irlap_state_ndm()
558 static int irlap_state_query(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_query() argument
563 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_query()
564 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_query()
574 if (!self->discovery_log) { in irlap_state_query()
580 hashbin_insert(self->discovery_log, in irlap_state_query()
606 irlap_discovery_indication(self, info->discovery); in irlap_state_query()
615 if (irda_device_is_receiving(self->netdev) && !self->add_wait) { in irlap_state_query()
618 irlap_start_slot_timer(self, msecs_to_jiffies(10)); in irlap_state_query()
619 self->add_wait = TRUE; in irlap_state_query()
622 self->add_wait = FALSE; in irlap_state_query()
624 if (self->s < self->S) { in irlap_state_query()
625 irlap_send_discovery_xid_frame(self, self->S, in irlap_state_query()
626 self->s, TRUE, in irlap_state_query()
627 self->discovery_cmd); in irlap_state_query()
628 self->s++; in irlap_state_query()
629 irlap_start_slot_timer(self, self->slot_timeout); in irlap_state_query()
632 irlap_next_state(self, LAP_QUERY); in irlap_state_query()
635 irlap_send_discovery_xid_frame(self, self->S, 0xff, in irlap_state_query()
637 self->discovery_cmd); in irlap_state_query()
640 irlap_next_state(self, LAP_NDM); in irlap_state_query()
646 irlap_discovery_confirm(self, self->discovery_log); in irlap_state_query()
649 self->discovery_log = NULL; in irlap_state_query()
669 static int irlap_state_reply(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_reply() argument
677 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_reply()
678 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_reply()
684 irlap_next_state(self, LAP_NDM); in irlap_state_reply()
690 del_timer(&self->query_timer); in irlap_state_reply()
695 irlap_next_state(self, LAP_NDM); in irlap_state_reply()
697 irlap_discovery_indication(self, info->discovery); in irlap_state_reply()
700 if ((info->s >= self->slot) && (!self->frame_sent)) { in irlap_state_reply()
704 irlap_send_discovery_xid_frame(self, info->S, in irlap_state_reply()
705 self->slot, in irlap_state_reply()
709 self->frame_sent = TRUE; in irlap_state_reply()
714 irlap_start_query_timer(self, info->S, info->s); in irlap_state_reply()
737 static int irlap_state_conn(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_conn() argument
744 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_conn()
745 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_conn()
751 IRDA_ASSERT(self->netdev != NULL, return -1;); in irlap_state_conn()
753 irlap_qos_negotiate(self, skb); in irlap_state_conn()
755 irlap_initiate_connection_state(self); in irlap_state_conn()
761 irlap_apply_connection_parameters(self, FALSE); in irlap_state_conn()
767 irlap_send_ua_response_frame(self, &self->qos_rx); in irlap_state_conn()
789 irlap_send_ua_response_frame(self, &self->qos_rx); in irlap_state_conn()
797 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_conn()
798 irlap_next_state(self, LAP_NRM_S); in irlap_state_conn()
804 irlap_next_state(self, LAP_NDM); in irlap_state_conn()
809 irlap_send_dm_frame(self); in irlap_state_conn()
810 irlap_next_state( self, LAP_NDM); in irlap_state_conn()
811 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_conn()
831 static int irlap_state_setup(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_setup() argument
838 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_setup()
839 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_setup()
843 if (self->retry_count < self->N3) { in irlap_state_setup()
850 irlap_start_backoff_timer(self, msecs_to_jiffies(20 + in irlap_state_setup()
854 irlap_next_state(self, LAP_NDM); in irlap_state_setup()
856 irlap_disconnect_indication(self, LAP_FOUND_NONE); in irlap_state_setup()
860 irlap_send_snrm_frame(self, &self->qos_rx); in irlap_state_setup()
861 irlap_start_final_timer(self, self->final_timeout); in irlap_state_setup()
862 self->retry_count++; in irlap_state_setup()
874 if (info &&(info->daddr > self->saddr)) { in irlap_state_setup()
875 del_timer(&self->final_timer); in irlap_state_setup()
876 irlap_initiate_connection_state(self); in irlap_state_setup()
878 IRDA_ASSERT(self->netdev != NULL, return -1;); in irlap_state_setup()
882 irlap_qos_negotiate(self, skb); in irlap_state_setup()
885 irlap_apply_connection_parameters(self, FALSE); in irlap_state_setup()
886 irlap_send_ua_response_frame(self, &self->qos_rx); in irlap_state_setup()
888 irlap_next_state(self, LAP_NRM_S); in irlap_state_setup()
889 irlap_connect_confirm(self, skb); in irlap_state_setup()
896 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_setup()
899 irlap_next_state(self, LAP_SETUP); in irlap_state_setup()
904 del_timer(&self->final_timer); in irlap_state_setup()
907 irlap_initiate_connection_state(self); in irlap_state_setup()
914 IRDA_ASSERT(self->netdev != NULL, return -1;); in irlap_state_setup()
916 irlap_qos_negotiate(self, skb); in irlap_state_setup()
919 irlap_apply_connection_parameters(self, TRUE); in irlap_state_setup()
920 self->retry_count = 0; in irlap_state_setup()
928 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_setup()
931 irlap_send_rr_frame(self, CMD_FRAME); in irlap_state_setup()
939 irlap_start_final_timer(self, self->final_timeout/2); in irlap_state_setup()
940 irlap_next_state(self, LAP_NRM_P); in irlap_state_setup()
942 irlap_connect_confirm(self, skb); in irlap_state_setup()
946 del_timer(&self->final_timer); in irlap_state_setup()
947 irlap_next_state(self, LAP_NDM); in irlap_state_setup()
949 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_setup()
967 static int irlap_state_offline(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_offline() argument
983 static int irlap_state_xmit_p(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_xmit_p() argument
993 if ((self->window > 0) && (!self->remote_busy)) { in irlap_state_xmit_p()
1010 skb_next = skb_peek(&self->txq); in irlap_state_xmit_p()
1023 self->bytes_left)); in irlap_state_xmit_p()
1032 if((!nextfit) && (skb->len > self->bytes_left)) { in irlap_state_xmit_p()
1036 skb_queue_head(&self->txq, skb_get(skb)); in irlap_state_xmit_p()
1056 self->bytes_left -= skb->len; in irlap_state_xmit_p()
1060 nextfit = !skb_queue_empty(&self->txq); in irlap_state_xmit_p()
1066 if ((self->window > 1) && (nextfit)) { in irlap_state_xmit_p()
1068 irlap_send_data_primary(self, skb); in irlap_state_xmit_p()
1069 irlap_next_state(self, LAP_XMIT_P); in irlap_state_xmit_p()
1072 irlap_send_data_primary_poll(self, skb); in irlap_state_xmit_p()
1082 self->fast_RR = FALSE; in irlap_state_xmit_p()
1087 skb_queue_head(&self->txq, skb_get(skb)); in irlap_state_xmit_p()
1099 irlap_send_rr_frame(self, CMD_FRAME); in irlap_state_xmit_p()
1101 self->window = self->window_size; in irlap_state_xmit_p()
1104 self->bytes_left = self->line_capacity; in irlap_state_xmit_p()
1106 irlap_start_final_timer(self, self->final_timeout); in irlap_state_xmit_p()
1107 irlap_next_state(self, LAP_NRM_P); in irlap_state_xmit_p()
1110 del_timer(&self->poll_timer); in irlap_state_xmit_p()
1111 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_xmit_p()
1112 irlap_send_disc_frame(self); in irlap_state_xmit_p()
1113 irlap_flush_all_queues(self); in irlap_state_xmit_p()
1114 irlap_start_final_timer(self, self->final_timeout); in irlap_state_xmit_p()
1115 self->retry_count = 0; in irlap_state_xmit_p()
1116 irlap_next_state(self, LAP_PCLOSE); in irlap_state_xmit_p()
1137 static int irlap_state_pclose(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_pclose() argument
1144 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_pclose()
1145 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_pclose()
1150 del_timer(&self->final_timer); in irlap_state_pclose()
1153 irlap_apply_default_connection_parameters(self); in irlap_state_pclose()
1156 irlap_next_state(self, LAP_NDM); in irlap_state_pclose()
1158 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_pclose()
1161 if (self->retry_count < self->N3) { in irlap_state_pclose()
1162 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_pclose()
1163 irlap_send_disc_frame(self); in irlap_state_pclose()
1164 irlap_start_final_timer(self, self->final_timeout); in irlap_state_pclose()
1165 self->retry_count++; in irlap_state_pclose()
1168 irlap_apply_default_connection_parameters(self); in irlap_state_pclose()
1171 irlap_next_state(self, LAP_NDM); in irlap_state_pclose()
1173 irlap_disconnect_indication(self, LAP_NO_RESPONSE); in irlap_state_pclose()
1194 static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_nrm_p() argument
1211 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_p()
1212 irlap_send_rr_frame(self, CMD_FRAME); in irlap_state_nrm_p()
1223 self->fast_RR = FALSE; in irlap_state_nrm_p()
1227 ns_status = irlap_validate_ns_received(self, info->ns); in irlap_state_nrm_p()
1228 nr_status = irlap_validate_nr_received(self, info->nr); in irlap_state_nrm_p()
1236 self->vr = (self->vr + 1) % 8; in irlap_state_nrm_p()
1239 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1246 self->retry_count = 0; in irlap_state_nrm_p()
1247 self->ack_required = TRUE; in irlap_state_nrm_p()
1252 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1254 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_p()
1257 del_timer(&self->final_timer); in irlap_state_nrm_p()
1259 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_p()
1265 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_p()
1275 irlap_next_state(self, LAP_XMIT_P); in irlap_state_nrm_p()
1280 irlap_start_poll_timer(self, self->poll_timeout); in irlap_state_nrm_p()
1289 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1297 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1304 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1306 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_p()
1307 irlap_send_rr_frame(self, CMD_FRAME); in irlap_state_nrm_p()
1309 self->ack_required = FALSE; in irlap_state_nrm_p()
1311 irlap_start_final_timer(self, self->final_timeout); in irlap_state_nrm_p()
1312 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1322 self->vr = (self->vr + 1) % 8; in irlap_state_nrm_p()
1325 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1328 irlap_resend_rejected_frames(self, CMD_FRAME); in irlap_state_nrm_p()
1330 self->ack_required = FALSE; in irlap_state_nrm_p()
1336 irlap_start_final_timer(self, 2 * self->final_timeout); in irlap_state_nrm_p()
1339 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1341 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_p()
1349 self->vr = (self->vr + 1) % 8; in irlap_state_nrm_p()
1352 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1354 self->ack_required = FALSE; in irlap_state_nrm_p()
1357 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1359 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_p()
1374 irlap_resend_rejected_frames(self, CMD_FRAME); in irlap_state_nrm_p()
1378 irlap_start_final_timer(self, 2 * self->final_timeout); in irlap_state_nrm_p()
1381 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1386 self->ack_required = FALSE; in irlap_state_nrm_p()
1396 del_timer(&self->final_timer); in irlap_state_nrm_p()
1398 irlap_next_state(self, LAP_RESET_WAIT); in irlap_state_nrm_p()
1400 irlap_disconnect_indication(self, LAP_RESET_INDICATION); in irlap_state_nrm_p()
1401 self->xmitflag = TRUE; in irlap_state_nrm_p()
1403 del_timer(&self->final_timer); in irlap_state_nrm_p()
1405 irlap_disconnect_indication(self, LAP_RESET_INDICATION); in irlap_state_nrm_p()
1407 self->xmitflag = FALSE; in irlap_state_nrm_p()
1418 irlap_data_indication(self, skb, TRUE); in irlap_state_nrm_p()
1419 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1421 del_timer(&self->final_timer); in irlap_state_nrm_p()
1422 irlap_data_indication(self, skb, TRUE); in irlap_state_nrm_p()
1423 irlap_next_state(self, LAP_XMIT_P); in irlap_state_nrm_p()
1424 IRDA_DEBUG(1, "%s: RECV_UI_FRAME: next state %s\n", __func__, irlap_state[self->state]); in irlap_state_nrm_p()
1425 irlap_start_poll_timer(self, self->poll_timeout); in irlap_state_nrm_p()
1433 self->remote_busy = FALSE; in irlap_state_nrm_p()
1436 del_timer(&self->final_timer); in irlap_state_nrm_p()
1441 ret = irlap_validate_nr_received(self, info->nr); in irlap_state_nrm_p()
1444 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1451 self->retry_count = 0; in irlap_state_nrm_p()
1452 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_p()
1454 irlap_next_state(self, LAP_XMIT_P); in irlap_state_nrm_p()
1457 irlap_start_poll_timer(self, self->poll_timeout); in irlap_state_nrm_p()
1465 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1469 self->retry_count, info->nr, self->va, in irlap_state_nrm_p()
1470 self->vs, self->vr); in irlap_state_nrm_p()
1473 irlap_resend_rejected_frames(self, CMD_FRAME); in irlap_state_nrm_p()
1474 irlap_start_final_timer(self, self->final_timeout * 2); in irlap_state_nrm_p()
1476 irlap_next_state(self, LAP_NRM_P); in irlap_state_nrm_p()
1481 irlap_next_state(self, LAP_RESET_WAIT); in irlap_state_nrm_p()
1483 irlap_disconnect_indication(self, LAP_RESET_INDICATION); in irlap_state_nrm_p()
1484 self->xmitflag = TRUE; in irlap_state_nrm_p()
1491 del_timer(&self->final_timer); in irlap_state_nrm_p()
1492 self->remote_busy = TRUE; in irlap_state_nrm_p()
1495 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1496 irlap_next_state(self, LAP_XMIT_P); in irlap_state_nrm_p()
1499 irlap_start_poll_timer(self, self->poll_timeout); in irlap_state_nrm_p()
1502 del_timer(&self->final_timer); in irlap_state_nrm_p()
1503 self->xmitflag = TRUE; in irlap_state_nrm_p()
1504 irlap_next_state(self, LAP_RESET_WAIT); in irlap_state_nrm_p()
1505 irlap_reset_indication(self); in irlap_state_nrm_p()
1514 if (irda_device_is_receiving(self->netdev) && !self->add_wait) { in irlap_state_nrm_p()
1517 irlap_start_final_timer(self, msecs_to_jiffies(300)); in irlap_state_nrm_p()
1524 self->add_wait = TRUE; in irlap_state_nrm_p()
1527 self->add_wait = FALSE; in irlap_state_nrm_p()
1530 if (self->retry_count < self->N2) { in irlap_state_nrm_p()
1531 if (skb_peek(&self->wx_list) == NULL) { in irlap_state_nrm_p()
1534 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_p()
1535 irlap_send_rr_frame(self, CMD_FRAME); in irlap_state_nrm_p()
1538 irlap_resend_rejected_frames(self, CMD_FRAME); in irlap_state_nrm_p()
1541 irlap_start_final_timer(self, self->final_timeout); in irlap_state_nrm_p()
1542 self->retry_count++; in irlap_state_nrm_p()
1544 " retry_count=%d\n", self->retry_count); in irlap_state_nrm_p()
1552 if((self->retry_count % self->N1) == 0) in irlap_state_nrm_p()
1553 irlap_status_indication(self, in irlap_state_nrm_p()
1558 irlap_apply_default_connection_parameters(self); in irlap_state_nrm_p()
1561 irlap_next_state(self, LAP_NDM); in irlap_state_nrm_p()
1562 irlap_disconnect_indication(self, LAP_NO_RESPONSE); in irlap_state_nrm_p()
1566 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1567 if (self->remote_busy) { in irlap_state_nrm_p()
1568 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_p()
1569 irlap_send_rr_frame(self, CMD_FRAME); in irlap_state_nrm_p()
1571 irlap_resend_rejected_frames(self, CMD_FRAME); in irlap_state_nrm_p()
1572 irlap_start_final_timer(self, 2 * self->final_timeout); in irlap_state_nrm_p()
1575 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_p()
1576 if (self->remote_busy) { in irlap_state_nrm_p()
1577 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_p()
1578 irlap_send_rr_frame(self, CMD_FRAME); in irlap_state_nrm_p()
1580 irlap_resend_rejected_frame(self, CMD_FRAME); in irlap_state_nrm_p()
1581 irlap_start_final_timer(self, 2 * self->final_timeout); in irlap_state_nrm_p()
1586 irlap_flush_all_queues(self); in irlap_state_nrm_p()
1587 irlap_next_state(self, LAP_XMIT_P); in irlap_state_nrm_p()
1589 irlap_disconnect_request(self); in irlap_state_nrm_p()
1608 static int irlap_state_reset_wait(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_reset_wait() argument
1615 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_reset_wait()
1616 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_reset_wait()
1620 if (self->xmitflag) { in irlap_state_reset_wait()
1621 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_reset_wait()
1622 irlap_send_snrm_frame(self, NULL); in irlap_state_reset_wait()
1623 irlap_start_final_timer(self, self->final_timeout); in irlap_state_reset_wait()
1624 irlap_next_state(self, LAP_RESET); in irlap_state_reset_wait()
1626 irlap_start_final_timer(self, self->final_timeout); in irlap_state_reset_wait()
1627 irlap_next_state(self, LAP_RESET); in irlap_state_reset_wait()
1631 irlap_wait_min_turn_around( self, &self->qos_tx); in irlap_state_reset_wait()
1632 irlap_send_disc_frame( self); in irlap_state_reset_wait()
1633 irlap_flush_all_queues( self); in irlap_state_reset_wait()
1634 irlap_start_final_timer( self, self->final_timeout); in irlap_state_reset_wait()
1635 self->retry_count = 0; in irlap_state_reset_wait()
1636 irlap_next_state( self, LAP_PCLOSE); in irlap_state_reset_wait()
1655 static int irlap_state_reset(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_reset() argument
1662 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_reset()
1663 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_reset()
1667 del_timer(&self->final_timer); in irlap_state_reset()
1669 irlap_apply_default_connection_parameters(self); in irlap_state_reset()
1672 irlap_next_state(self, LAP_NDM); in irlap_state_reset()
1674 irlap_disconnect_indication(self, LAP_NO_RESPONSE); in irlap_state_reset()
1678 del_timer(&self->final_timer); in irlap_state_reset()
1681 irlap_initiate_connection_state(self); in irlap_state_reset()
1685 self->remote_busy = FALSE; in irlap_state_reset()
1687 irlap_next_state(self, LAP_XMIT_P); in irlap_state_reset()
1689 irlap_start_poll_timer(self, self->poll_timeout); in irlap_state_reset()
1693 if (self->retry_count < 3) { in irlap_state_reset()
1694 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_reset()
1696 IRDA_ASSERT(self->netdev != NULL, return -1;); in irlap_state_reset()
1697 irlap_send_snrm_frame(self, self->qos_dev); in irlap_state_reset()
1699 self->retry_count++; /* Experimental!! */ in irlap_state_reset()
1701 irlap_start_final_timer(self, self->final_timeout); in irlap_state_reset()
1702 irlap_next_state(self, LAP_RESET); in irlap_state_reset()
1703 } else if (self->retry_count >= self->N3) { in irlap_state_reset()
1704 irlap_apply_default_connection_parameters(self); in irlap_state_reset()
1707 irlap_next_state(self, LAP_NDM); in irlap_state_reset()
1709 irlap_disconnect_indication(self, LAP_NO_RESPONSE); in irlap_state_reset()
1719 irlap_initiate_connection_state(self); in irlap_state_reset()
1720 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_reset()
1721 irlap_send_ua_response_frame(self, &self->qos_rx); in irlap_state_reset()
1723 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_reset()
1724 irlap_next_state(self, LAP_NDM); in irlap_state_reset()
1748 static int irlap_state_xmit_s(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_xmit_s() argument
1755 IRDA_ASSERT(self != NULL, return -ENODEV;); in irlap_state_xmit_s()
1756 IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;); in irlap_state_xmit_s()
1763 if ((self->window > 0) && (!self->remote_busy)) { in irlap_state_xmit_s()
1778 skb_next = skb_peek(&self->txq); in irlap_state_xmit_s()
1781 self->bytes_left)); in irlap_state_xmit_s()
1788 if((!nextfit) && (skb->len > self->bytes_left)) { in irlap_state_xmit_s()
1792 skb_queue_head(&self->txq, skb_get(skb)); in irlap_state_xmit_s()
1800 self->window = self->window_size; in irlap_state_xmit_s()
1801 self->bytes_left = self->line_capacity; in irlap_state_xmit_s()
1802 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_xmit_s()
1804 irlap_next_state(self, LAP_NRM_S); in irlap_state_xmit_s()
1812 self->bytes_left -= skb->len; in irlap_state_xmit_s()
1816 nextfit = !skb_queue_empty(&self->txq); in irlap_state_xmit_s()
1822 if ((self->window > 1) && (nextfit)) { in irlap_state_xmit_s()
1823 irlap_send_data_secondary(self, skb); in irlap_state_xmit_s()
1824 irlap_next_state(self, LAP_XMIT_S); in irlap_state_xmit_s()
1826 irlap_send_data_secondary_final(self, skb); in irlap_state_xmit_s()
1827 irlap_next_state(self, LAP_NRM_S); in irlap_state_xmit_s()
1837 skb_queue_head(&self->txq, skb_get(skb)); in irlap_state_xmit_s()
1842 irlap_send_rd_frame(self); in irlap_state_xmit_s()
1843 irlap_flush_all_queues(self); in irlap_state_xmit_s()
1844 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_xmit_s()
1845 irlap_next_state(self, LAP_SCLOSE); in irlap_state_xmit_s()
1868 static int irlap_state_nrm_s(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_nrm_s() argument
1877 IRDA_ASSERT(self != NULL, return -1;); in irlap_state_nrm_s()
1878 IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;); in irlap_state_nrm_s()
1886 self->vs, info->ns, self->vr, info->pf); in irlap_state_nrm_s()
1888 self->retry_count = 0; in irlap_state_nrm_s()
1890 ns_status = irlap_validate_ns_received(self, info->ns); in irlap_state_nrm_s()
1891 nr_status = irlap_validate_nr_received(self, info->nr); in irlap_state_nrm_s()
1898 self->vr = (self->vr + 1) % 8; in irlap_state_nrm_s()
1901 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
1908 self->ack_required = TRUE; in irlap_state_nrm_s()
1915 irda_start_timer(WD_TIMER, self->wd_timeout); in irlap_state_nrm_s()
1918 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
1920 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_s()
1928 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
1936 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_s()
1939 if (!skb_queue_empty(&self->txq) && in irlap_state_nrm_s()
1940 (self->window > 0)) in irlap_state_nrm_s()
1942 self->ack_required = TRUE; in irlap_state_nrm_s()
1944 del_timer(&self->wd_timer); in irlap_state_nrm_s()
1946 irlap_next_state(self, LAP_XMIT_S); in irlap_state_nrm_s()
1948 irlap_send_rr_frame(self, RSP_FRAME); in irlap_state_nrm_s()
1949 irlap_start_wd_timer(self, in irlap_state_nrm_s()
1950 self->wd_timeout); in irlap_state_nrm_s()
1953 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
1965 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
1967 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
1970 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
1972 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
1973 irlap_send_rr_frame(self, RSP_FRAME); in irlap_state_nrm_s()
1975 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
1988 self->vr = (self->vr + 1) % 8; in irlap_state_nrm_s()
1991 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
1994 irlap_resend_rejected_frames(self, RSP_FRAME); in irlap_state_nrm_s()
1997 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
1999 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_s()
2000 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2008 self->vr = (self->vr + 1) % 8; in irlap_state_nrm_s()
2011 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
2014 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
2016 irlap_data_indication(self, skb, FALSE); in irlap_state_nrm_s()
2017 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2034 irlap_data_indication(self, skb, TRUE); in irlap_state_nrm_s()
2035 irlap_next_state(self, LAP_NRM_S); /* Keep state */ in irlap_state_nrm_s()
2040 if (!skb_queue_empty(&self->txq) && in irlap_state_nrm_s()
2041 (self->window > 0) && !self->remote_busy) in irlap_state_nrm_s()
2043 irlap_data_indication(self, skb, TRUE); in irlap_state_nrm_s()
2045 del_timer(&self->wd_timer); in irlap_state_nrm_s()
2047 irlap_next_state(self, LAP_XMIT_S); in irlap_state_nrm_s()
2049 irlap_data_indication(self, skb, TRUE); in irlap_state_nrm_s()
2051 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2053 irlap_send_rr_frame(self, RSP_FRAME); in irlap_state_nrm_s()
2054 self->ack_required = FALSE; in irlap_state_nrm_s()
2056 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2059 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
2064 self->retry_count = 0; in irlap_state_nrm_s()
2069 nr_status = irlap_validate_nr_received(self, info->nr); in irlap_state_nrm_s()
2071 if (!skb_queue_empty(&self->txq) && in irlap_state_nrm_s()
2072 (self->window > 0)) { in irlap_state_nrm_s()
2073 self->remote_busy = FALSE; in irlap_state_nrm_s()
2076 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
2077 del_timer(&self->wd_timer); in irlap_state_nrm_s()
2079 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2080 irlap_next_state(self, LAP_XMIT_S); in irlap_state_nrm_s()
2082 self->remote_busy = FALSE; in irlap_state_nrm_s()
2084 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
2085 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2086 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2092 if (self->disconnect_pending) { in irlap_state_nrm_s()
2094 irlap_send_rd_frame(self); in irlap_state_nrm_s()
2095 irlap_flush_all_queues(self); in irlap_state_nrm_s()
2097 irlap_next_state(self, LAP_SCLOSE); in irlap_state_nrm_s()
2100 irlap_send_rr_frame(self, RSP_FRAME); in irlap_state_nrm_s()
2102 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
2106 self->remote_busy = FALSE; in irlap_state_nrm_s()
2107 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
2108 irlap_resend_rejected_frames(self, RSP_FRAME); in irlap_state_nrm_s()
2110 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2113 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
2122 del_timer(&self->wd_timer); in irlap_state_nrm_s()
2124 irlap_next_state(self, LAP_RESET_CHECK); in irlap_state_nrm_s()
2126 irlap_reset_indication(self); in irlap_state_nrm_s()
2135 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
2136 if (self->remote_busy) { in irlap_state_nrm_s()
2137 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2138 irlap_send_rr_frame(self, RSP_FRAME); in irlap_state_nrm_s()
2140 irlap_resend_rejected_frames(self, RSP_FRAME); in irlap_state_nrm_s()
2141 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2144 irlap_update_nr_received(self, info->nr); in irlap_state_nrm_s()
2145 if (self->remote_busy) { in irlap_state_nrm_s()
2146 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2147 irlap_send_rr_frame(self, RSP_FRAME); in irlap_state_nrm_s()
2149 irlap_resend_rejected_frame(self, RSP_FRAME); in irlap_state_nrm_s()
2150 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2163 self->retry_count); in irlap_state_nrm_s()
2165 if (self->retry_count < (self->N2 / 2)) { in irlap_state_nrm_s()
2167 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2168 self->retry_count++; in irlap_state_nrm_s()
2170 if((self->retry_count % (self->N1 / 2)) == 0) in irlap_state_nrm_s()
2171 irlap_status_indication(self, in irlap_state_nrm_s()
2174 irlap_apply_default_connection_parameters(self); in irlap_state_nrm_s()
2177 irlap_next_state(self, LAP_NDM); in irlap_state_nrm_s()
2178 irlap_disconnect_indication(self, LAP_NO_RESPONSE); in irlap_state_nrm_s()
2183 irlap_next_state(self, LAP_NDM); in irlap_state_nrm_s()
2186 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2187 irlap_send_ua_response_frame(self, NULL); in irlap_state_nrm_s()
2189 del_timer(&self->wd_timer); in irlap_state_nrm_s()
2190 irlap_flush_all_queues(self); in irlap_state_nrm_s()
2192 irlap_apply_default_connection_parameters(self); in irlap_state_nrm_s()
2194 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_nrm_s()
2197 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2198 irlap_send_rr_frame(self, RSP_FRAME); in irlap_state_nrm_s()
2199 self->ack_required = TRUE; in irlap_state_nrm_s()
2200 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2201 irlap_next_state(self, LAP_NRM_S); in irlap_state_nrm_s()
2208 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_nrm_s()
2209 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_nrm_s()
2212 irlap_send_test_frame(self, self->caddr, info->daddr, skb); in irlap_state_nrm_s()
2227 static int irlap_state_sclose(struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_sclose() argument
2232 IRDA_ASSERT(self != NULL, return -ENODEV;); in irlap_state_sclose()
2233 IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;); in irlap_state_sclose()
2238 irlap_next_state(self, LAP_NDM); in irlap_state_sclose()
2241 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_sclose()
2242 irlap_send_ua_response_frame(self, NULL); in irlap_state_sclose()
2244 del_timer(&self->wd_timer); in irlap_state_sclose()
2246 irlap_apply_default_connection_parameters(self); in irlap_state_sclose()
2248 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_sclose()
2260 irlap_next_state(self, LAP_NDM); in irlap_state_sclose()
2262 del_timer(&self->wd_timer); in irlap_state_sclose()
2263 irlap_apply_default_connection_parameters(self); in irlap_state_sclose()
2265 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_sclose()
2269 irlap_next_state(self, LAP_NDM); in irlap_state_sclose()
2271 irlap_apply_default_connection_parameters(self); in irlap_state_sclose()
2273 irlap_disconnect_indication(self, LAP_DISC_INDICATION); in irlap_state_sclose()
2280 del_timer(&self->wd_timer); in irlap_state_sclose()
2281 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_sclose()
2282 irlap_send_rd_frame(self); in irlap_state_sclose()
2283 irlap_start_wd_timer(self, self->wd_timeout); in irlap_state_sclose()
2296 static int irlap_state_reset_check( struct irlap_cb *self, IRLAP_EVENT event, in irlap_state_reset_check() argument
2304 IRDA_ASSERT(self != NULL, return -ENODEV;); in irlap_state_reset_check()
2305 IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;); in irlap_state_reset_check()
2309 irlap_send_ua_response_frame(self, &self->qos_rx); in irlap_state_reset_check()
2310 irlap_initiate_connection_state(self); in irlap_state_reset_check()
2311 irlap_start_wd_timer(self, WD_TIMEOUT); in irlap_state_reset_check()
2312 irlap_flush_all_queues(self); in irlap_state_reset_check()
2314 irlap_next_state(self, LAP_NRM_S); in irlap_state_reset_check()
2317 irlap_wait_min_turn_around(self, &self->qos_tx); in irlap_state_reset_check()
2318 irlap_send_rd_frame(self); in irlap_state_reset_check()
2319 irlap_start_wd_timer(self, WD_TIMEOUT); in irlap_state_reset_check()
2320 irlap_next_state(self, LAP_SCLOSE); in irlap_state_reset_check()