1/*********************************************************************
2 *
3 * Filename:      irlap_event.c
4 * Version:       0.9
5 * Description:   IrLAP state machine implementation
6 * Status:        Experimental.
7 * Author:        Dag Brattli <dag@brattli.net>
8 * Created at:    Sat Aug 16 00:59:29 1997
9 * Modified at:   Sat Dec 25 21:07:57 1999
10 * Modified by:   Dag Brattli <dag@brattli.net>
11 *
12 *     Copyright (c) 1998-2000 Dag Brattli <dag@brattli.net>,
13 *     Copyright (c) 1998      Thomas Davis <ratbert@radiks.net>
14 *     All Rights Reserved.
15 *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.com>
16 *
17 *     This program is free software; you can redistribute it and/or
18 *     modify it under the terms of the GNU General Public License as
19 *     published by the Free Software Foundation; either version 2 of
20 *     the License, or (at your option) any later version.
21 *
22 *     Neither Dag Brattli nor University of Tromsø admit liability nor
23 *     provide warranty for any of this software. This material is
24 *     provided "AS-IS" and at no charge.
25 *
26 ********************************************************************/
27
28#include <linux/string.h>
29#include <linux/kernel.h>
30#include <linux/delay.h>
31#include <linux/skbuff.h>
32#include <linux/slab.h>
33
34#include <net/irda/irda.h>
35#include <net/irda/irlap_event.h>
36
37#include <net/irda/timer.h>
38#include <net/irda/irlap.h>
39#include <net/irda/irlap_frame.h>
40#include <net/irda/qos.h>
41#include <net/irda/parameters.h>
42#include <net/irda/irlmp.h>		/* irlmp_flow_indication(), ... */
43
44#include <net/irda/irda_device.h>
45
46#ifdef CONFIG_IRDA_FAST_RR
47int sysctl_fast_poll_increase = 50;
48#endif
49
50static int irlap_state_ndm    (struct irlap_cb *self, IRLAP_EVENT event,
51			       struct sk_buff *skb, struct irlap_info *info);
52static int irlap_state_query  (struct irlap_cb *self, IRLAP_EVENT event,
53			       struct sk_buff *skb, struct irlap_info *info);
54static int irlap_state_reply  (struct irlap_cb *self, IRLAP_EVENT event,
55			       struct sk_buff *skb, struct irlap_info *info);
56static int irlap_state_conn   (struct irlap_cb *self, IRLAP_EVENT event,
57			       struct sk_buff *skb, struct irlap_info *info);
58static int irlap_state_setup  (struct irlap_cb *self, IRLAP_EVENT event,
59			       struct sk_buff *skb, struct irlap_info *info);
60static int irlap_state_offline(struct irlap_cb *self, IRLAP_EVENT event,
61			       struct sk_buff *skb, struct irlap_info *info);
62static int irlap_state_xmit_p (struct irlap_cb *self, IRLAP_EVENT event,
63			       struct sk_buff *skb, struct irlap_info *info);
64static int irlap_state_pclose (struct irlap_cb *self, IRLAP_EVENT event,
65			       struct sk_buff *skb, struct irlap_info *info);
66static int irlap_state_nrm_p  (struct irlap_cb *self, IRLAP_EVENT event,
67			       struct sk_buff *skb, struct irlap_info *info);
68static int irlap_state_reset_wait(struct irlap_cb *self, IRLAP_EVENT event,
69				  struct sk_buff *skb, struct irlap_info *info);
70static int irlap_state_reset  (struct irlap_cb *self, IRLAP_EVENT event,
71			       struct sk_buff *skb, struct irlap_info *info);
72static int irlap_state_nrm_s  (struct irlap_cb *self, IRLAP_EVENT event,
73			       struct sk_buff *skb, struct irlap_info *info);
74static int irlap_state_xmit_s (struct irlap_cb *self, IRLAP_EVENT event,
75			       struct sk_buff *skb, struct irlap_info *info);
76static int irlap_state_sclose (struct irlap_cb *self, IRLAP_EVENT event,
77			       struct sk_buff *skb, struct irlap_info *info);
78static int irlap_state_reset_check(struct irlap_cb *, IRLAP_EVENT event,
79				   struct sk_buff *, struct irlap_info *);
80
81static const char *const irlap_event[] __maybe_unused = {
82	"DISCOVERY_REQUEST",
83	"CONNECT_REQUEST",
84	"CONNECT_RESPONSE",
85	"DISCONNECT_REQUEST",
86	"DATA_REQUEST",
87	"RESET_REQUEST",
88	"RESET_RESPONSE",
89	"SEND_I_CMD",
90	"SEND_UI_FRAME",
91	"RECV_DISCOVERY_XID_CMD",
92	"RECV_DISCOVERY_XID_RSP",
93	"RECV_SNRM_CMD",
94	"RECV_TEST_CMD",
95	"RECV_TEST_RSP",
96	"RECV_UA_RSP",
97	"RECV_DM_RSP",
98	"RECV_RD_RSP",
99	"RECV_I_CMD",
100	"RECV_I_RSP",
101	"RECV_UI_FRAME",
102	"RECV_FRMR_RSP",
103	"RECV_RR_CMD",
104	"RECV_RR_RSP",
105	"RECV_RNR_CMD",
106	"RECV_RNR_RSP",
107	"RECV_REJ_CMD",
108	"RECV_REJ_RSP",
109	"RECV_SREJ_CMD",
110	"RECV_SREJ_RSP",
111	"RECV_DISC_CMD",
112	"SLOT_TIMER_EXPIRED",
113	"QUERY_TIMER_EXPIRED",
114	"FINAL_TIMER_EXPIRED",
115	"POLL_TIMER_EXPIRED",
116	"DISCOVERY_TIMER_EXPIRED",
117	"WD_TIMER_EXPIRED",
118	"BACKOFF_TIMER_EXPIRED",
119	"MEDIA_BUSY_TIMER_EXPIRED",
120};
121
122const char *const irlap_state[] = {
123	"LAP_NDM",
124	"LAP_QUERY",
125	"LAP_REPLY",
126	"LAP_CONN",
127	"LAP_SETUP",
128	"LAP_OFFLINE",
129	"LAP_XMIT_P",
130	"LAP_PCLOSE",
131	"LAP_NRM_P",
132	"LAP_RESET_WAIT",
133	"LAP_RESET",
134	"LAP_NRM_S",
135	"LAP_XMIT_S",
136	"LAP_SCLOSE",
137	"LAP_RESET_CHECK",
138};
139
140static int (*state[])(struct irlap_cb *self, IRLAP_EVENT event,
141		      struct sk_buff *skb, struct irlap_info *info) =
142{
143	irlap_state_ndm,
144	irlap_state_query,
145	irlap_state_reply,
146	irlap_state_conn,
147	irlap_state_setup,
148	irlap_state_offline,
149	irlap_state_xmit_p,
150	irlap_state_pclose,
151	irlap_state_nrm_p,
152	irlap_state_reset_wait,
153	irlap_state_reset,
154	irlap_state_nrm_s,
155	irlap_state_xmit_s,
156	irlap_state_sclose,
157	irlap_state_reset_check,
158};
159
160/*
161 * Function irda_poll_timer_expired (data)
162 *
163 *    Poll timer has expired. Normally we must now send a RR frame to the
164 *    remote device
165 */
166static void irlap_poll_timer_expired(void *data)
167{
168	struct irlap_cb *self = (struct irlap_cb *) data;
169
170	IRDA_ASSERT(self != NULL, return;);
171	IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
172
173	irlap_do_event(self, POLL_TIMER_EXPIRED, NULL, NULL);
174}
175
176/*
177 * Calculate and set time before we will have to send back the pf bit
178 * to the peer. Use in primary.
179 * Make sure that state is XMIT_P/XMIT_S when calling this function
180 * (and that nobody messed up with the state). - Jean II
181 */
182static void irlap_start_poll_timer(struct irlap_cb *self, int timeout)
183{
184	IRDA_ASSERT(self != NULL, return;);
185	IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
186
187#ifdef CONFIG_IRDA_FAST_RR
188	/*
189	 * Send out the RR frames faster if our own transmit queue is empty, or
190	 * if the peer is busy. The effect is a much faster conversation
191	 */
192	if (skb_queue_empty(&self->txq) || self->remote_busy) {
193		if (self->fast_RR == TRUE) {
194			/*
195			 *  Assert that the fast poll timer has not reached the
196			 *  normal poll timer yet
197			 */
198			if (self->fast_RR_timeout < timeout) {
199				/*
200				 *  FIXME: this should be a more configurable
201				 *         function
202				 */
203				self->fast_RR_timeout +=
204					(sysctl_fast_poll_increase * HZ/1000);
205
206				/* Use this fast(er) timeout instead */
207				timeout = self->fast_RR_timeout;
208			}
209		} else {
210			self->fast_RR = TRUE;
211
212			/* Start with just 0 ms */
213			self->fast_RR_timeout = 0;
214			timeout = 0;
215		}
216	} else
217		self->fast_RR = FALSE;
218
219	pr_debug("%s(), timeout=%d (%ld)\n", __func__, timeout, jiffies);
220#endif /* CONFIG_IRDA_FAST_RR */
221
222	if (timeout == 0)
223		irlap_do_event(self, POLL_TIMER_EXPIRED, NULL, NULL);
224	else
225		irda_start_timer(&self->poll_timer, timeout, self,
226				 irlap_poll_timer_expired);
227}
228
229/*
230 * Function irlap_do_event (event, skb, info)
231 *
232 *    Rushes through the state machine without any delay. If state == XMIT
233 *    then send queued data frames.
234 */
235void irlap_do_event(struct irlap_cb *self, IRLAP_EVENT event,
236		    struct sk_buff *skb, struct irlap_info *info)
237{
238	int ret;
239
240	if (!self || self->magic != LAP_MAGIC)
241		return;
242
243	pr_debug("%s(), event = %s, state = %s\n", __func__,
244		 irlap_event[event], irlap_state[self->state]);
245
246	ret = (*state[self->state])(self, event, skb, info);
247
248	/*
249	 *  Check if there are any pending events that needs to be executed
250	 */
251	switch (self->state) {
252	case LAP_XMIT_P: /* FALLTHROUGH */
253	case LAP_XMIT_S:
254		/*
255		 * We just received the pf bit and are at the beginning
256		 * of a new LAP transmit window.
257		 * Check if there are any queued data frames, and do not
258		 * try to disconnect link if we send any data frames, since
259		 * that will change the state away form XMIT
260		 */
261		pr_debug("%s() : queue len = %d\n", __func__,
262			 skb_queue_len(&self->txq));
263
264		if (!skb_queue_empty(&self->txq)) {
265			/* Prevent race conditions with irlap_data_request() */
266			self->local_busy = TRUE;
267
268			/* Theory of operation.
269			 * We send frames up to when we fill the window or
270			 * reach line capacity. Those frames will queue up
271			 * in the device queue, and the driver will slowly
272			 * send them.
273			 * After each frame that we send, we poll the higher
274			 * layer for more data. It's the right time to do
275			 * that because the link layer need to perform the mtt
276			 * and then send the first frame, so we can afford
277			 * to send a bit of time in kernel space.
278			 * The explicit flow indication allow to minimise
279			 * buffers (== lower latency), to avoid higher layer
280			 * polling via timers (== less context switches) and
281			 * to implement a crude scheduler - Jean II */
282
283			/* Try to send away all queued data frames */
284			while ((skb = skb_dequeue(&self->txq)) != NULL) {
285				/* Send one frame */
286				ret = (*state[self->state])(self, SEND_I_CMD,
287							    skb, NULL);
288				/* Drop reference count.
289				 * It will be increase as needed in
290				 * irlap_send_data_xxx() */
291				kfree_skb(skb);
292
293				/* Poll the higher layers for one more frame */
294				irlmp_flow_indication(self->notify.instance,
295						      FLOW_START);
296
297				if (ret == -EPROTO)
298					break; /* Try again later! */
299			}
300			/* Finished transmitting */
301			self->local_busy = FALSE;
302		} else if (self->disconnect_pending) {
303			self->disconnect_pending = FALSE;
304
305			ret = (*state[self->state])(self, DISCONNECT_REQUEST,
306						    NULL, NULL);
307		}
308		break;
309/*	case LAP_NDM: */
310/*	case LAP_CONN: */
311/*	case LAP_RESET_WAIT: */
312/*	case LAP_RESET_CHECK: */
313	default:
314		break;
315	}
316}
317
318/*
319 * Function irlap_state_ndm (event, skb, frame)
320 *
321 *    NDM (Normal Disconnected Mode) state
322 *
323 */
324static int irlap_state_ndm(struct irlap_cb *self, IRLAP_EVENT event,
325			   struct sk_buff *skb, struct irlap_info *info)
326{
327	discovery_t *discovery_rsp;
328	int ret = 0;
329
330	IRDA_ASSERT(self != NULL, return -1;);
331	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
332
333	switch (event) {
334	case CONNECT_REQUEST:
335		IRDA_ASSERT(self->netdev != NULL, return -1;);
336
337		if (self->media_busy) {
338			/* Note : this will never happen, because we test
339			 * media busy in irlap_connect_request() and
340			 * postpone the event... - Jean II */
341			pr_debug("%s(), CONNECT_REQUEST: media busy!\n",
342				 __func__);
343
344			/* Always switch state before calling upper layers */
345			irlap_next_state(self, LAP_NDM);
346
347			irlap_disconnect_indication(self, LAP_MEDIA_BUSY);
348		} else {
349			irlap_send_snrm_frame(self, &self->qos_rx);
350
351			/* Start Final-bit timer */
352			irlap_start_final_timer(self, self->final_timeout);
353
354			self->retry_count = 0;
355			irlap_next_state(self, LAP_SETUP);
356		}
357		break;
358	case RECV_SNRM_CMD:
359		/* Check if the frame contains and I field */
360		if (info) {
361			self->daddr = info->daddr;
362			self->caddr = info->caddr;
363
364			irlap_next_state(self, LAP_CONN);
365
366			irlap_connect_indication(self, skb);
367		} else {
368			pr_debug("%s(), SNRM frame does not contain an I field!\n",
369				 __func__);
370		}
371		break;
372	case DISCOVERY_REQUEST:
373		IRDA_ASSERT(info != NULL, return -1;);
374
375		if (self->media_busy) {
376			pr_debug("%s(), DISCOVERY_REQUEST: media busy!\n",
377				 __func__);
378			/* irlap->log.condition = MEDIA_BUSY; */
379
380			/* This will make IrLMP try again */
381			irlap_discovery_confirm(self, NULL);
382			/* Note : the discovery log is not cleaned up here,
383			 * it will be done in irlap_discovery_request()
384			 * Jean II */
385			return 0;
386		}
387
388		self->S = info->S;
389		self->s = info->s;
390		irlap_send_discovery_xid_frame(self, info->S, info->s, TRUE,
391					       info->discovery);
392		self->frame_sent = FALSE;
393		self->s++;
394
395		irlap_start_slot_timer(self, self->slot_timeout);
396		irlap_next_state(self, LAP_QUERY);
397		break;
398	case RECV_DISCOVERY_XID_CMD:
399		IRDA_ASSERT(info != NULL, return -1;);
400
401		/* Assert that this is not the final slot */
402		if (info->s <= info->S) {
403			self->slot = irlap_generate_rand_time_slot(info->S,
404								   info->s);
405			if (self->slot == info->s) {
406				discovery_rsp = irlmp_get_discovery_response();
407				discovery_rsp->data.daddr = info->daddr;
408
409				irlap_send_discovery_xid_frame(self, info->S,
410							       self->slot,
411							       FALSE,
412							       discovery_rsp);
413				self->frame_sent = TRUE;
414			} else
415				self->frame_sent = FALSE;
416
417			/*
418			 * Go to reply state until end of discovery to
419			 * inhibit our own transmissions. Set the timer
420			 * to not stay forever there... Jean II
421			 */
422			irlap_start_query_timer(self, info->S, info->s);
423			irlap_next_state(self, LAP_REPLY);
424		} else {
425		/* This is the final slot. How is it possible ?
426		 * This would happen is both discoveries are just slightly
427		 * offset (if they are in sync, all packets are lost).
428		 * Most often, all the discovery requests will be received
429		 * in QUERY state (see my comment there), except for the
430		 * last frame that will come here.
431		 * The big trouble when it happen is that active discovery
432		 * doesn't happen, because nobody answer the discoveries
433		 * frame of the other guy, so the log shows up empty.
434		 * What should we do ?
435		 * Not much. It's too late to answer those discovery frames,
436		 * so we just pass the info to IrLMP who will put it in the
437		 * log (and post an event).
438		 * Another cause would be devices that do discovery much
439		 * slower than us, however the latest fixes should minimise
440		 * those cases...
441		 * Jean II
442		 */
443			pr_debug("%s(), Receiving final discovery request, missed the discovery slots :-(\n",
444				 __func__);
445
446			/* Last discovery request -> in the log */
447			irlap_discovery_indication(self, info->discovery);
448		}
449		break;
450	case MEDIA_BUSY_TIMER_EXPIRED:
451		/* A bunch of events may be postponed because the media is
452		 * busy (usually immediately after we close a connection),
453		 * or while we are doing discovery (state query/reply).
454		 * In all those cases, the media busy flag will be cleared
455		 * when it's OK for us to process those postponed events.
456		 * This event is not mentioned in the state machines in the
457		 * IrLAP spec. It's because they didn't consider Ultra and
458		 * postponing connection request is optional.
459		 * Jean II */
460#ifdef CONFIG_IRDA_ULTRA
461		/* Send any pending Ultra frames if any */
462		if (!skb_queue_empty(&self->txq_ultra)) {
463			/* We don't send the frame, just post an event.
464			 * Also, previously this code was in timer.c...
465			 * Jean II */
466			ret = (*state[self->state])(self, SEND_UI_FRAME,
467						    NULL, NULL);
468		}
469#endif /* CONFIG_IRDA_ULTRA */
470		/* Check if we should try to connect.
471		 * This code was previously in irlap_do_event() */
472		if (self->connect_pending) {
473			self->connect_pending = FALSE;
474
475			/* This one *should* not pend in this state, except
476			 * if a socket try to connect and immediately
477			 * disconnect. - clear - Jean II */
478			if (self->disconnect_pending)
479				irlap_disconnect_indication(self, LAP_DISC_INDICATION);
480			else
481				ret = (*state[self->state])(self,
482							    CONNECT_REQUEST,
483							    NULL, NULL);
484			self->disconnect_pending = FALSE;
485		}
486		/* Note : one way to test if this code works well (including
487		 * media busy and small busy) is to create a user space
488		 * application generating an Ultra packet every 3.05 sec (or
489		 * 2.95 sec) and to see how it interact with discovery.
490		 * It's fairly easy to check that no packet is lost, that the
491		 * packets are postponed during discovery and that after
492		 * discovery indication you have a 100ms "gap".
493		 * As connection request and Ultra are now processed the same
494		 * way, this avoid the tedious job of trying IrLAP connection
495		 * in all those cases...
496		 * Jean II */
497		break;
498#ifdef CONFIG_IRDA_ULTRA
499	case SEND_UI_FRAME:
500	{
501		int i;
502		/* Only allowed to repeat an operation twice */
503		for (i=0; ((i<2) && (self->media_busy == FALSE)); i++) {
504			skb = skb_dequeue(&self->txq_ultra);
505			if (skb)
506				irlap_send_ui_frame(self, skb, CBROADCAST,
507						    CMD_FRAME);
508			else
509				break;
510			/* irlap_send_ui_frame() won't increase skb reference
511			 * count, so no dev_kfree_skb() - Jean II */
512		}
513		if (i == 2) {
514			/* Force us to listen 500 ms again */
515			irda_device_set_media_busy(self->netdev, TRUE);
516		}
517		break;
518	}
519	case RECV_UI_FRAME:
520		/* Only accept broadcast frames in NDM mode */
521		if (info->caddr != CBROADCAST) {
522			pr_debug("%s(), not a broadcast frame!\n",
523				 __func__);
524		} else
525			irlap_unitdata_indication(self, skb);
526		break;
527#endif /* CONFIG_IRDA_ULTRA */
528	case RECV_TEST_CMD:
529		/* Remove test frame header */
530		skb_pull(skb, sizeof(struct test_frame));
531
532		/*
533		 * Send response. This skb will not be sent out again, and
534		 * will only be used to send out the same info as the cmd
535		 */
536		irlap_send_test_frame(self, CBROADCAST, info->daddr, skb);
537		break;
538	case RECV_TEST_RSP:
539		pr_debug("%s() not implemented!\n", __func__);
540		break;
541	default:
542		pr_debug("%s(), Unknown event %s\n", __func__,
543			 irlap_event[event]);
544
545		ret = -1;
546		break;
547	}
548	return ret;
549}
550
551/*
552 * Function irlap_state_query (event, skb, info)
553 *
554 *    QUERY state
555 *
556 */
557static int irlap_state_query(struct irlap_cb *self, IRLAP_EVENT event,
558			     struct sk_buff *skb, struct irlap_info *info)
559{
560	int ret = 0;
561
562	IRDA_ASSERT(self != NULL, return -1;);
563	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
564
565	switch (event) {
566	case RECV_DISCOVERY_XID_RSP:
567		IRDA_ASSERT(info != NULL, return -1;);
568		IRDA_ASSERT(info->discovery != NULL, return -1;);
569
570		pr_debug("%s(), daddr=%08x\n", __func__,
571			 info->discovery->data.daddr);
572
573		if (!self->discovery_log) {
574			net_warn_ratelimited("%s: discovery log is gone! maybe the discovery timeout has been set too short?\n",
575					     __func__);
576			break;
577		}
578		hashbin_insert(self->discovery_log,
579			       (irda_queue_t *) info->discovery,
580			       info->discovery->data.daddr, NULL);
581
582		/* Keep state */
583		/* irlap_next_state(self, LAP_QUERY);  */
584
585		break;
586	case RECV_DISCOVERY_XID_CMD:
587		/* Yes, it is possible to receive those frames in this mode.
588		 * Note that most often the last discovery request won't
589		 * occur here but in NDM state (see my comment there).
590		 * What should we do ?
591		 * Not much. We are currently performing our own discovery,
592		 * therefore we can't answer those frames. We don't want
593		 * to change state either. We just pass the info to
594		 * IrLMP who will put it in the log (and post an event).
595		 * Jean II
596		 */
597
598		IRDA_ASSERT(info != NULL, return -1;);
599
600		pr_debug("%s(), Receiving discovery request (s = %d) while performing discovery :-(\n",
601			 __func__, info->s);
602
603		/* Last discovery request ? */
604		if (info->s == 0xff)
605			irlap_discovery_indication(self, info->discovery);
606		break;
607	case SLOT_TIMER_EXPIRED:
608		/*
609		 * Wait a little longer if we detect an incoming frame. This
610		 * is not mentioned in the spec, but is a good thing to do,
611		 * since we want to work even with devices that violate the
612		 * timing requirements.
613		 */
614		if (irda_device_is_receiving(self->netdev) && !self->add_wait) {
615			pr_debug("%s(), device is slow to answer, waiting some more!\n",
616				 __func__);
617			irlap_start_slot_timer(self, msecs_to_jiffies(10));
618			self->add_wait = TRUE;
619			return ret;
620		}
621		self->add_wait = FALSE;
622
623		if (self->s < self->S) {
624			irlap_send_discovery_xid_frame(self, self->S,
625						       self->s, TRUE,
626						       self->discovery_cmd);
627			self->s++;
628			irlap_start_slot_timer(self, self->slot_timeout);
629
630			/* Keep state */
631			irlap_next_state(self, LAP_QUERY);
632		} else {
633			/* This is the final slot! */
634			irlap_send_discovery_xid_frame(self, self->S, 0xff,
635						       TRUE,
636						       self->discovery_cmd);
637
638			/* Always switch state before calling upper layers */
639			irlap_next_state(self, LAP_NDM);
640
641			/*
642			 *  We are now finished with the discovery procedure,
643			 *  so now we must return the results
644			 */
645			irlap_discovery_confirm(self, self->discovery_log);
646
647			/* IrLMP should now have taken care of the log */
648			self->discovery_log = NULL;
649		}
650		break;
651	default:
652		pr_debug("%s(), Unknown event %s\n", __func__,
653			 irlap_event[event]);
654
655		ret = -1;
656		break;
657	}
658	return ret;
659}
660
661/*
662 * Function irlap_state_reply (self, event, skb, info)
663 *
664 *    REPLY, we have received a XID discovery frame from a device and we
665 *    are waiting for the right time slot to send a response XID frame
666 *
667 */
668static int irlap_state_reply(struct irlap_cb *self, IRLAP_EVENT event,
669			     struct sk_buff *skb, struct irlap_info *info)
670{
671	discovery_t *discovery_rsp;
672	int ret=0;
673
674	IRDA_ASSERT(self != NULL, return -1;);
675	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
676
677	switch (event) {
678	case QUERY_TIMER_EXPIRED:
679		pr_debug("%s(), QUERY_TIMER_EXPIRED <%ld>\n",
680			 __func__, jiffies);
681		irlap_next_state(self, LAP_NDM);
682		break;
683	case RECV_DISCOVERY_XID_CMD:
684		IRDA_ASSERT(info != NULL, return -1;);
685		/* Last frame? */
686		if (info->s == 0xff) {
687			del_timer(&self->query_timer);
688
689			/* info->log.condition = REMOTE; */
690
691			/* Always switch state before calling upper layers */
692			irlap_next_state(self, LAP_NDM);
693
694			irlap_discovery_indication(self, info->discovery);
695		} else {
696			/* If it's our slot, send our reply */
697			if ((info->s >= self->slot) && (!self->frame_sent)) {
698				discovery_rsp = irlmp_get_discovery_response();
699				discovery_rsp->data.daddr = info->daddr;
700
701				irlap_send_discovery_xid_frame(self, info->S,
702							       self->slot,
703							       FALSE,
704							       discovery_rsp);
705
706				self->frame_sent = TRUE;
707			}
708			/* Readjust our timer to accommodate devices
709			 * doing faster or slower discovery than us...
710			 * Jean II */
711			irlap_start_query_timer(self, info->S, info->s);
712
713			/* Keep state */
714			//irlap_next_state(self, LAP_REPLY);
715		}
716		break;
717	default:
718		pr_debug("%s(), Unknown event %d, %s\n", __func__,
719			 event, irlap_event[event]);
720
721		ret = -1;
722		break;
723	}
724	return ret;
725}
726
727/*
728 * Function irlap_state_conn (event, skb, info)
729 *
730 *    CONN, we have received a SNRM command and is waiting for the upper
731 *    layer to accept or refuse connection
732 *
733 */
734static int irlap_state_conn(struct irlap_cb *self, IRLAP_EVENT event,
735			    struct sk_buff *skb, struct irlap_info *info)
736{
737	int ret = 0;
738
739	pr_debug("%s(), event=%s\n", __func__, irlap_event[event]);
740
741	IRDA_ASSERT(self != NULL, return -1;);
742	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
743
744	switch (event) {
745	case CONNECT_RESPONSE:
746		skb_pull(skb, sizeof(struct snrm_frame));
747
748		IRDA_ASSERT(self->netdev != NULL, return -1;);
749
750		irlap_qos_negotiate(self, skb);
751
752		irlap_initiate_connection_state(self);
753
754		/*
755		 * Applying the parameters now will make sure we change speed
756		 * *after* we have sent the next frame
757		 */
758		irlap_apply_connection_parameters(self, FALSE);
759
760		/*
761		 * Sending this frame will force a speed change after it has
762		 * been sent (i.e. the frame will be sent at 9600).
763		 */
764		irlap_send_ua_response_frame(self, &self->qos_rx);
765
766#if 0
767		/*
768		 * We are allowed to send two frames, but this may increase
769		 * the connect latency, so lets not do it for now.
770		 */
771		/* This is full of good intentions, but doesn't work in
772		 * practice.
773		 * After sending the first UA response, we switch the
774		 * dongle to the negotiated speed, which is usually
775		 * different than 9600 kb/s.
776		 * From there, there is two solutions :
777		 * 1) The other end has received the first UA response :
778		 * it will set up the connection, move to state LAP_NRM_P,
779		 * and will ignore and drop the second UA response.
780		 * Actually, it's even worse : the other side will almost
781		 * immediately send a RR that will likely collide with the
782		 * UA response (depending on negotiated turnaround).
783		 * 2) The other end has not received the first UA response,
784		 * will stay at 9600 and will never see the second UA response.
785		 * Jean II */
786		irlap_send_ua_response_frame(self, &self->qos_rx);
787#endif
788
789		/*
790		 *  The WD-timer could be set to the duration of the P-timer
791		 *  for this case, but it is recommended to use twice the
792		 *  value (note 3 IrLAP p. 60).
793		 */
794		irlap_start_wd_timer(self, self->wd_timeout);
795		irlap_next_state(self, LAP_NRM_S);
796
797		break;
798	case RECV_DISCOVERY_XID_CMD:
799		pr_debug("%s(), event RECV_DISCOVER_XID_CMD!\n",
800			 __func__);
801		irlap_next_state(self, LAP_NDM);
802
803		break;
804	case DISCONNECT_REQUEST:
805		pr_debug("%s(), Disconnect request!\n", __func__);
806		irlap_send_dm_frame(self);
807		irlap_next_state( self, LAP_NDM);
808		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
809		break;
810	default:
811		pr_debug("%s(), Unknown event %d, %s\n", __func__,
812			 event, irlap_event[event]);
813
814		ret = -1;
815		break;
816	}
817
818	return ret;
819}
820
821/*
822 * Function irlap_state_setup (event, skb, frame)
823 *
824 *    SETUP state, The local layer has transmitted a SNRM command frame to
825 *    a remote peer layer and is awaiting a reply .
826 *
827 */
828static int irlap_state_setup(struct irlap_cb *self, IRLAP_EVENT event,
829			     struct sk_buff *skb, struct irlap_info *info)
830{
831	int ret = 0;
832
833	IRDA_ASSERT(self != NULL, return -1;);
834	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
835
836	switch (event) {
837	case FINAL_TIMER_EXPIRED:
838		if (self->retry_count < self->N3) {
839/*
840 *  Perform random backoff, Wait a random number of time units, minimum
841 *  duration half the time taken to transmitt a SNRM frame, maximum duration
842 *  1.5 times the time taken to transmit a SNRM frame. So this time should
843 *  between 15 msecs and 45 msecs.
844 */
845			irlap_start_backoff_timer(self, msecs_to_jiffies(20 +
846							(jiffies % 30)));
847		} else {
848			/* Always switch state before calling upper layers */
849			irlap_next_state(self, LAP_NDM);
850
851			irlap_disconnect_indication(self, LAP_FOUND_NONE);
852		}
853		break;
854	case BACKOFF_TIMER_EXPIRED:
855		irlap_send_snrm_frame(self, &self->qos_rx);
856		irlap_start_final_timer(self, self->final_timeout);
857		self->retry_count++;
858		break;
859	case RECV_SNRM_CMD:
860		pr_debug("%s(), SNRM battle!\n", __func__);
861
862		IRDA_ASSERT(skb != NULL, return 0;);
863		IRDA_ASSERT(info != NULL, return 0;);
864
865		/*
866		 *  The device with the largest device address wins the battle
867		 *  (both have sent a SNRM command!)
868		 */
869		if (info &&(info->daddr > self->saddr)) {
870			del_timer(&self->final_timer);
871			irlap_initiate_connection_state(self);
872
873			IRDA_ASSERT(self->netdev != NULL, return -1;);
874
875			skb_pull(skb, sizeof(struct snrm_frame));
876
877			irlap_qos_negotiate(self, skb);
878
879			/* Send UA frame and then change link settings */
880			irlap_apply_connection_parameters(self, FALSE);
881			irlap_send_ua_response_frame(self, &self->qos_rx);
882
883			irlap_next_state(self, LAP_NRM_S);
884			irlap_connect_confirm(self, skb);
885
886			/*
887			 *  The WD-timer could be set to the duration of the
888			 *  P-timer for this case, but it is recommended
889			 *  to use twice the value (note 3 IrLAP p. 60).
890			 */
891			irlap_start_wd_timer(self, self->wd_timeout);
892		} else {
893			/* We just ignore the other device! */
894			irlap_next_state(self, LAP_SETUP);
895		}
896		break;
897	case RECV_UA_RSP:
898		/* Stop F-timer */
899		del_timer(&self->final_timer);
900
901		/* Initiate connection state */
902		irlap_initiate_connection_state(self);
903
904		/* Negotiate connection parameters */
905		IRDA_ASSERT(skb->len > 10, return -1;);
906
907		skb_pull(skb, sizeof(struct ua_frame));
908
909		IRDA_ASSERT(self->netdev != NULL, return -1;);
910
911		irlap_qos_negotiate(self, skb);
912
913		/* Set the new link setting *now* (before the rr frame) */
914		irlap_apply_connection_parameters(self, TRUE);
915		self->retry_count = 0;
916
917		/* Wait for turnaround time to give a chance to the other
918		 * device to be ready to receive us.
919		 * Note : the time to switch speed is typically larger
920		 * than the turnaround time, but as we don't have the other
921		 * side speed switch time, that's our best guess...
922		 * Jean II */
923		irlap_wait_min_turn_around(self, &self->qos_tx);
924
925		/* This frame will actually be sent at the new speed */
926		irlap_send_rr_frame(self, CMD_FRAME);
927
928		/* The timer is set to half the normal timer to quickly
929		 * detect a failure to negotiate the new connection
930		 * parameters. IrLAP 6.11.3.2, note 3.
931		 * Note that currently we don't process this failure
932		 * properly, as we should do a quick disconnect.
933		 * Jean II */
934		irlap_start_final_timer(self, self->final_timeout/2);
935		irlap_next_state(self, LAP_NRM_P);
936
937		irlap_connect_confirm(self, skb);
938		break;
939	case RECV_DM_RSP:     /* FALLTHROUGH */
940	case RECV_DISC_CMD:
941		del_timer(&self->final_timer);
942		irlap_next_state(self, LAP_NDM);
943
944		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
945		break;
946	default:
947		pr_debug("%s(), Unknown event %d, %s\n", __func__,
948			 event, irlap_event[event]);
949
950		ret = -1;
951		break;
952	}
953	return ret;
954}
955
956/*
957 * Function irlap_state_offline (self, event, skb, info)
958 *
959 *    OFFLINE state, not used for now!
960 *
961 */
962static int irlap_state_offline(struct irlap_cb *self, IRLAP_EVENT event,
963			       struct sk_buff *skb, struct irlap_info *info)
964{
965	pr_debug("%s(), Unknown event\n", __func__);
966
967	return -1;
968}
969
970/*
971 * Function irlap_state_xmit_p (self, event, skb, info)
972 *
973 *    XMIT, Only the primary station has right to transmit, and we
974 *    therefore do not expect to receive any transmissions from other
975 *    stations.
976 *
977 */
978static int irlap_state_xmit_p(struct irlap_cb *self, IRLAP_EVENT event,
979			      struct sk_buff *skb, struct irlap_info *info)
980{
981	int ret = 0;
982
983	switch (event) {
984	case SEND_I_CMD:
985		/*
986		 *  Only send frame if send-window > 0.
987		 */
988		if ((self->window > 0) && (!self->remote_busy)) {
989			int nextfit;
990#ifdef CONFIG_IRDA_DYNAMIC_WINDOW
991			struct sk_buff *skb_next;
992
993			/* With DYNAMIC_WINDOW, we keep the window size
994			 * maximum, and adapt on the packets we are sending.
995			 * At 115k, we can send only 2 packets of 2048 bytes
996			 * in a 500 ms turnaround. Without this option, we
997			 * would always limit the window to 2. With this
998			 * option, if we send smaller packets, we can send
999			 * up to 7 of them (always depending on QoS).
1000			 * Jean II */
1001
1002			/* Look at the next skb. This is safe, as we are
1003			 * the only consumer of the Tx queue (if we are not,
1004			 * we have other problems) - Jean II */
1005			skb_next = skb_peek(&self->txq);
1006
1007			/* Check if a subsequent skb exist and would fit in
1008			 * the current window (with respect to turnaround
1009			 * time).
1010			 * This allow us to properly mark the current packet
1011			 * with the pf bit, to avoid falling back on the
1012			 * second test below, and avoid waiting the
1013			 * end of the window and sending a extra RR.
1014			 * Note : (skb_next != NULL) <=> (skb_queue_len() > 0)
1015			 * Jean II */
1016			nextfit = ((skb_next != NULL) &&
1017				   ((skb_next->len + skb->len) <=
1018				    self->bytes_left));
1019
1020			/*
1021			 * The current packet may not fit ! Because of test
1022			 * above, this should not happen any more !!!
1023			 *  Test if we have transmitted more bytes over the
1024			 *  link than its possible to do with the current
1025			 *  speed and turn-around-time.
1026			 */
1027			if((!nextfit) && (skb->len > self->bytes_left)) {
1028				pr_debug("%s(), Not allowed to transmit more bytes!\n",
1029					 __func__);
1030				/* Requeue the skb */
1031				skb_queue_head(&self->txq, skb_get(skb));
1032				/*
1033				 *  We should switch state to LAP_NRM_P, but
1034				 *  that is not possible since we must be sure
1035				 *  that we poll the other side. Since we have
1036				 *  used up our time, the poll timer should
1037				 *  trigger anyway now, so we just wait for it
1038				 *  DB
1039				 */
1040				/*
1041				 * Sorry, but that's not totally true. If
1042				 * we send 2000B packets, we may wait another
1043				 * 1000B until our turnaround expire. That's
1044				 * why we need to be proactive in avoiding
1045				 * coming here. - Jean II
1046				 */
1047				return -EPROTO;
1048			}
1049
1050			/* Subtract space used by this skb */
1051			self->bytes_left -= skb->len;
1052#else	/* CONFIG_IRDA_DYNAMIC_WINDOW */
1053			/* Window has been adjusted for the max packet
1054			 * size, so much simpler... - Jean II */
1055			nextfit = !skb_queue_empty(&self->txq);
1056#endif	/* CONFIG_IRDA_DYNAMIC_WINDOW */
1057			/*
1058			 *  Send data with poll bit cleared only if window > 1
1059			 *  and there is more frames after this one to be sent
1060			 */
1061			if ((self->window > 1) && (nextfit)) {
1062				/* More packet to send in current window */
1063				irlap_send_data_primary(self, skb);
1064				irlap_next_state(self, LAP_XMIT_P);
1065			} else {
1066				/* Final packet of window */
1067				irlap_send_data_primary_poll(self, skb);
1068
1069				/*
1070				 * Make sure state machine does not try to send
1071				 * any more frames
1072				 */
1073				ret = -EPROTO;
1074			}
1075#ifdef CONFIG_IRDA_FAST_RR
1076			/* Peer may want to reply immediately */
1077			self->fast_RR = FALSE;
1078#endif /* CONFIG_IRDA_FAST_RR */
1079		} else {
1080			pr_debug("%s(), Unable to send! remote busy?\n",
1081				 __func__);
1082			skb_queue_head(&self->txq, skb_get(skb));
1083
1084			/*
1085			 *  The next ret is important, because it tells
1086			 *  irlap_next_state _not_ to deliver more frames
1087			 */
1088			ret = -EPROTO;
1089		}
1090		break;
1091	case POLL_TIMER_EXPIRED:
1092		pr_debug("%s(), POLL_TIMER_EXPIRED <%ld>\n",
1093			 __func__, jiffies);
1094		irlap_send_rr_frame(self, CMD_FRAME);
1095		/* Return to NRM properly - Jean II  */
1096		self->window = self->window_size;
1097#ifdef CONFIG_IRDA_DYNAMIC_WINDOW
1098		/* Allowed to transmit a maximum number of bytes again. */
1099		self->bytes_left = self->line_capacity;
1100#endif /* CONFIG_IRDA_DYNAMIC_WINDOW */
1101		irlap_start_final_timer(self, self->final_timeout);
1102		irlap_next_state(self, LAP_NRM_P);
1103		break;
1104	case DISCONNECT_REQUEST:
1105		del_timer(&self->poll_timer);
1106		irlap_wait_min_turn_around(self, &self->qos_tx);
1107		irlap_send_disc_frame(self);
1108		irlap_flush_all_queues(self);
1109		irlap_start_final_timer(self, self->final_timeout);
1110		self->retry_count = 0;
1111		irlap_next_state(self, LAP_PCLOSE);
1112		break;
1113	case DATA_REQUEST:
1114		/* Nothing to do, irlap_do_event() will send the packet
1115		 * when we return... - Jean II */
1116		break;
1117	default:
1118		pr_debug("%s(), Unknown event %s\n",
1119			 __func__, irlap_event[event]);
1120
1121		ret = -EINVAL;
1122		break;
1123	}
1124	return ret;
1125}
1126
1127/*
1128 * Function irlap_state_pclose (event, skb, info)
1129 *
1130 *    PCLOSE state
1131 */
1132static int irlap_state_pclose(struct irlap_cb *self, IRLAP_EVENT event,
1133			      struct sk_buff *skb, struct irlap_info *info)
1134{
1135	int ret = 0;
1136
1137	IRDA_ASSERT(self != NULL, return -1;);
1138	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
1139
1140	switch (event) {
1141	case RECV_UA_RSP: /* FALLTHROUGH */
1142	case RECV_DM_RSP:
1143		del_timer(&self->final_timer);
1144
1145		/* Set new link parameters */
1146		irlap_apply_default_connection_parameters(self);
1147
1148		/* Always switch state before calling upper layers */
1149		irlap_next_state(self, LAP_NDM);
1150
1151		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
1152		break;
1153	case FINAL_TIMER_EXPIRED:
1154		if (self->retry_count < self->N3) {
1155			irlap_wait_min_turn_around(self, &self->qos_tx);
1156			irlap_send_disc_frame(self);
1157			irlap_start_final_timer(self, self->final_timeout);
1158			self->retry_count++;
1159			/* Keep state */
1160		} else {
1161			irlap_apply_default_connection_parameters(self);
1162
1163			/*  Always switch state before calling upper layers */
1164			irlap_next_state(self, LAP_NDM);
1165
1166			irlap_disconnect_indication(self, LAP_NO_RESPONSE);
1167		}
1168		break;
1169	default:
1170		pr_debug("%s(), Unknown event %d\n", __func__, event);
1171
1172		ret = -1;
1173		break;
1174	}
1175	return ret;
1176}
1177
1178/*
1179 * Function irlap_state_nrm_p (self, event, skb, info)
1180 *
1181 *   NRM_P (Normal Response Mode as Primary), The primary station has given
1182 *   permissions to a secondary station to transmit IrLAP resonse frames
1183 *   (by sending a frame with the P bit set). The primary station will not
1184 *   transmit any frames and is expecting to receive frames only from the
1185 *   secondary to which transmission permissions has been given.
1186 */
1187static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event,
1188			     struct sk_buff *skb, struct irlap_info *info)
1189{
1190	int ret = 0;
1191	int ns_status;
1192	int nr_status;
1193
1194	switch (event) {
1195	case RECV_I_RSP: /* Optimize for the common case */
1196		if (unlikely(skb->len <= LAP_ADDR_HEADER + LAP_CTRL_HEADER)) {
1197			/*
1198			 * Input validation check: a stir4200/mcp2150
1199			 * combination sometimes results in an empty i:rsp.
1200			 * This makes no sense; we can just ignore the frame
1201			 * and send an rr:cmd immediately. This happens before
1202			 * changing nr or ns so triggers a retransmit
1203			 */
1204			irlap_wait_min_turn_around(self, &self->qos_tx);
1205			irlap_send_rr_frame(self, CMD_FRAME);
1206			/* Keep state */
1207			break;
1208		}
1209		/* FIXME: must check for remote_busy below */
1210#ifdef CONFIG_IRDA_FAST_RR
1211		/*
1212		 *  Reset the fast_RR so we can use the fast RR code with
1213		 *  full speed the next time since peer may have more frames
1214		 *  to transmitt
1215		 */
1216		self->fast_RR = FALSE;
1217#endif /* CONFIG_IRDA_FAST_RR */
1218		IRDA_ASSERT( info != NULL, return -1;);
1219
1220		ns_status = irlap_validate_ns_received(self, info->ns);
1221		nr_status = irlap_validate_nr_received(self, info->nr);
1222
1223		/*
1224		 *  Check for expected I(nformation) frame
1225		 */
1226		if ((ns_status == NS_EXPECTED) && (nr_status == NR_EXPECTED)) {
1227
1228			/* Update Vr (next frame for us to receive) */
1229			self->vr = (self->vr + 1) % 8;
1230
1231			/* Update Nr received, cleanup our retry queue */
1232			irlap_update_nr_received(self, info->nr);
1233
1234			/*
1235			 *  Got expected NR, so reset the
1236			 *  retry_count. This is not done by IrLAP spec,
1237			 *  which is strange!
1238			 */
1239			self->retry_count = 0;
1240			self->ack_required = TRUE;
1241
1242			/*  poll bit cleared?  */
1243			if (!info->pf) {
1244				/* Keep state, do not move this line */
1245				irlap_next_state(self, LAP_NRM_P);
1246
1247				irlap_data_indication(self, skb, FALSE);
1248			} else {
1249				/* No longer waiting for pf */
1250				del_timer(&self->final_timer);
1251
1252				irlap_wait_min_turn_around(self, &self->qos_tx);
1253
1254				/* Call higher layer *before* changing state
1255				 * to give them a chance to send data in the
1256				 * next LAP frame.
1257				 * Jean II */
1258				irlap_data_indication(self, skb, FALSE);
1259
1260				/* XMIT states are the most dangerous state
1261				 * to be in, because user requests are
1262				 * processed directly and may change state.
1263				 * On the other hand, in NDM_P, those
1264				 * requests are queued and we will process
1265				 * them when we return to irlap_do_event().
1266				 * Jean II
1267				 */
1268				irlap_next_state(self, LAP_XMIT_P);
1269
1270				/* This is the last frame.
1271				 * Make sure it's always called in XMIT state.
1272				 * - Jean II */
1273				irlap_start_poll_timer(self, self->poll_timeout);
1274			}
1275			break;
1276
1277		}
1278		/* Unexpected next to send (Ns) */
1279		if ((ns_status == NS_UNEXPECTED) && (nr_status == NR_EXPECTED))
1280		{
1281			if (!info->pf) {
1282				irlap_update_nr_received(self, info->nr);
1283
1284				/*
1285				 *  Wait until the last frame before doing
1286				 *  anything
1287				 */
1288
1289				/* Keep state */
1290				irlap_next_state(self, LAP_NRM_P);
1291			} else {
1292				pr_debug("%s(), missing or duplicate frame!\n",
1293					 __func__);
1294
1295				/* Update Nr received */
1296				irlap_update_nr_received(self, info->nr);
1297
1298				irlap_wait_min_turn_around(self, &self->qos_tx);
1299				irlap_send_rr_frame(self, CMD_FRAME);
1300
1301				self->ack_required = FALSE;
1302
1303				irlap_start_final_timer(self, self->final_timeout);
1304				irlap_next_state(self, LAP_NRM_P);
1305			}
1306			break;
1307		}
1308		/*
1309		 *  Unexpected next to receive (Nr)
1310		 */
1311		if ((ns_status == NS_EXPECTED) && (nr_status == NR_UNEXPECTED))
1312		{
1313			if (info->pf) {
1314				self->vr = (self->vr + 1) % 8;
1315
1316				/* Update Nr received */
1317				irlap_update_nr_received(self, info->nr);
1318
1319				/* Resend rejected frames */
1320				irlap_resend_rejected_frames(self, CMD_FRAME);
1321
1322				self->ack_required = FALSE;
1323
1324				/* Make sure we account for the time
1325				 * to transmit our frames. See comemnts
1326				 * in irlap_send_data_primary_poll().
1327				 * Jean II */
1328				irlap_start_final_timer(self, 2 * self->final_timeout);
1329
1330				/* Keep state, do not move this line */
1331				irlap_next_state(self, LAP_NRM_P);
1332
1333				irlap_data_indication(self, skb, FALSE);
1334			} else {
1335				/*
1336				 *  Do not resend frames until the last
1337				 *  frame has arrived from the other
1338				 *  device. This is not documented in
1339				 *  IrLAP!!
1340				 */
1341				self->vr = (self->vr + 1) % 8;
1342
1343				/* Update Nr received */
1344				irlap_update_nr_received(self, info->nr);
1345
1346				self->ack_required = FALSE;
1347
1348				/* Keep state, do not move this line!*/
1349				irlap_next_state(self, LAP_NRM_P);
1350
1351				irlap_data_indication(self, skb, FALSE);
1352			}
1353			break;
1354		}
1355		/*
1356		 *  Unexpected next to send (Ns) and next to receive (Nr)
1357		 *  Not documented by IrLAP!
1358		 */
1359		if ((ns_status == NS_UNEXPECTED) &&
1360		    (nr_status == NR_UNEXPECTED))
1361		{
1362			pr_debug("%s(), unexpected nr and ns!\n",
1363				 __func__);
1364			if (info->pf) {
1365				/* Resend rejected frames */
1366				irlap_resend_rejected_frames(self, CMD_FRAME);
1367
1368				/* Give peer some time to retransmit!
1369				 * But account for our own Tx. */
1370				irlap_start_final_timer(self, 2 * self->final_timeout);
1371
1372				/* Keep state, do not move this line */
1373				irlap_next_state(self, LAP_NRM_P);
1374			} else {
1375				/* Update Nr received */
1376				/* irlap_update_nr_received( info->nr); */
1377
1378				self->ack_required = FALSE;
1379			}
1380			break;
1381		}
1382
1383		/*
1384		 *  Invalid NR or NS
1385		 */
1386		if ((nr_status == NR_INVALID) || (ns_status == NS_INVALID)) {
1387			if (info->pf) {
1388				del_timer(&self->final_timer);
1389
1390				irlap_next_state(self, LAP_RESET_WAIT);
1391
1392				irlap_disconnect_indication(self, LAP_RESET_INDICATION);
1393				self->xmitflag = TRUE;
1394			} else {
1395				del_timer(&self->final_timer);
1396
1397				irlap_disconnect_indication(self, LAP_RESET_INDICATION);
1398
1399				self->xmitflag = FALSE;
1400			}
1401			break;
1402		}
1403		pr_debug("%s(), Not implemented!\n", __func__);
1404		pr_debug("%s(), event=%s, ns_status=%d, nr_status=%d\n",
1405			 __func__, irlap_event[event], ns_status, nr_status);
1406		break;
1407	case RECV_UI_FRAME:
1408		/* Poll bit cleared? */
1409		if (!info->pf) {
1410			irlap_data_indication(self, skb, TRUE);
1411			irlap_next_state(self, LAP_NRM_P);
1412		} else {
1413			del_timer(&self->final_timer);
1414			irlap_data_indication(self, skb, TRUE);
1415			irlap_next_state(self, LAP_XMIT_P);
1416			pr_debug("%s: RECV_UI_FRAME: next state %s\n",
1417				 __func__, irlap_state[self->state]);
1418			irlap_start_poll_timer(self, self->poll_timeout);
1419		}
1420		break;
1421	case RECV_RR_RSP:
1422		/*
1423		 *  If you get a RR, the remote isn't busy anymore,
1424		 *  no matter what the NR
1425		 */
1426		self->remote_busy = FALSE;
1427
1428		/* Stop final timer */
1429		del_timer(&self->final_timer);
1430
1431		/*
1432		 *  Nr as expected?
1433		 */
1434		ret = irlap_validate_nr_received(self, info->nr);
1435		if (ret == NR_EXPECTED) {
1436			/* Update Nr received */
1437			irlap_update_nr_received(self, info->nr);
1438
1439			/*
1440			 *  Got expected NR, so reset the retry_count. This
1441			 *  is not done by the IrLAP standard , which is
1442			 *  strange! DB.
1443			 */
1444			self->retry_count = 0;
1445			irlap_wait_min_turn_around(self, &self->qos_tx);
1446
1447			irlap_next_state(self, LAP_XMIT_P);
1448
1449			/* Start poll timer */
1450			irlap_start_poll_timer(self, self->poll_timeout);
1451		} else if (ret == NR_UNEXPECTED) {
1452			IRDA_ASSERT(info != NULL, return -1;);
1453			/*
1454			 *  Unexpected nr!
1455			 */
1456
1457			/* Update Nr received */
1458			irlap_update_nr_received(self, info->nr);
1459
1460			pr_debug("RECV_RR_FRAME: Retrans:%d, nr=%d, va=%d, vs=%d, vr=%d\n",
1461				 self->retry_count, info->nr, self->va,
1462				 self->vs, self->vr);
1463
1464			/* Resend rejected frames */
1465			irlap_resend_rejected_frames(self, CMD_FRAME);
1466			irlap_start_final_timer(self, self->final_timeout * 2);
1467
1468			irlap_next_state(self, LAP_NRM_P);
1469		} else if (ret == NR_INVALID) {
1470			pr_debug("%s(), Received RR with invalid nr !\n",
1471				 __func__);
1472
1473			irlap_next_state(self, LAP_RESET_WAIT);
1474
1475			irlap_disconnect_indication(self, LAP_RESET_INDICATION);
1476			self->xmitflag = TRUE;
1477		}
1478		break;
1479	case RECV_RNR_RSP:
1480		IRDA_ASSERT(info != NULL, return -1;);
1481
1482		/* Stop final timer */
1483		del_timer(&self->final_timer);
1484		self->remote_busy = TRUE;
1485
1486		/* Update Nr received */
1487		irlap_update_nr_received(self, info->nr);
1488		irlap_next_state(self, LAP_XMIT_P);
1489
1490		/* Start poll timer */
1491		irlap_start_poll_timer(self, self->poll_timeout);
1492		break;
1493	case RECV_FRMR_RSP:
1494		del_timer(&self->final_timer);
1495		self->xmitflag = TRUE;
1496		irlap_next_state(self, LAP_RESET_WAIT);
1497		irlap_reset_indication(self);
1498		break;
1499	case FINAL_TIMER_EXPIRED:
1500		/*
1501		 *  We are allowed to wait for additional 300 ms if
1502		 *  final timer expires when we are in the middle
1503		 *  of receiving a frame (page 45, IrLAP). Check that
1504		 *  we only do this once for each frame.
1505		 */
1506		if (irda_device_is_receiving(self->netdev) && !self->add_wait) {
1507			pr_debug("FINAL_TIMER_EXPIRED when receiving a frame! Waiting a little bit more!\n");
1508			irlap_start_final_timer(self, msecs_to_jiffies(300));
1509
1510			/*
1511			 *  Don't allow this to happen one more time in a row,
1512			 *  or else we can get a pretty tight loop here if
1513			 *  if we only receive half a frame. DB.
1514			 */
1515			self->add_wait = TRUE;
1516			break;
1517		}
1518		self->add_wait = FALSE;
1519
1520		/* N2 is the disconnect timer. Until we reach it, we retry */
1521		if (self->retry_count < self->N2) {
1522			if (skb_peek(&self->wx_list) == NULL) {
1523				/* Retry sending the pf bit to the secondary */
1524				pr_debug("nrm_p: resending rr");
1525				irlap_wait_min_turn_around(self, &self->qos_tx);
1526				irlap_send_rr_frame(self, CMD_FRAME);
1527			} else {
1528				pr_debug("nrm_p: resend frames");
1529				irlap_resend_rejected_frames(self, CMD_FRAME);
1530			}
1531
1532			irlap_start_final_timer(self, self->final_timeout);
1533			self->retry_count++;
1534			pr_debug("irlap_state_nrm_p: FINAL_TIMER_EXPIRED: retry_count=%d\n",
1535				 self->retry_count);
1536
1537			/* Early warning event. I'm using a pretty liberal
1538			 * interpretation of the spec and generate an event
1539			 * every time the timer is multiple of N1 (and not
1540			 * only the first time). This allow application
1541			 * to know precisely if connectivity restart...
1542			 * Jean II */
1543			if((self->retry_count % self->N1) == 0)
1544				irlap_status_indication(self,
1545							STATUS_NO_ACTIVITY);
1546
1547			/* Keep state */
1548		} else {
1549			irlap_apply_default_connection_parameters(self);
1550
1551			/* Always switch state before calling upper layers */
1552			irlap_next_state(self, LAP_NDM);
1553			irlap_disconnect_indication(self, LAP_NO_RESPONSE);
1554		}
1555		break;
1556	case RECV_REJ_RSP:
1557		irlap_update_nr_received(self, info->nr);
1558		if (self->remote_busy) {
1559			irlap_wait_min_turn_around(self, &self->qos_tx);
1560			irlap_send_rr_frame(self, CMD_FRAME);
1561		} else
1562			irlap_resend_rejected_frames(self, CMD_FRAME);
1563		irlap_start_final_timer(self, 2 * self->final_timeout);
1564		break;
1565	case RECV_SREJ_RSP:
1566		irlap_update_nr_received(self, info->nr);
1567		if (self->remote_busy) {
1568			irlap_wait_min_turn_around(self, &self->qos_tx);
1569			irlap_send_rr_frame(self, CMD_FRAME);
1570		} else
1571			irlap_resend_rejected_frame(self, CMD_FRAME);
1572		irlap_start_final_timer(self, 2 * self->final_timeout);
1573		break;
1574	case RECV_RD_RSP:
1575		pr_debug("%s(), RECV_RD_RSP\n", __func__);
1576
1577		irlap_flush_all_queues(self);
1578		irlap_next_state(self, LAP_XMIT_P);
1579		/* Call back the LAP state machine to do a proper disconnect */
1580		irlap_disconnect_request(self);
1581		break;
1582	default:
1583		pr_debug("%s(), Unknown event %s\n",
1584			 __func__, irlap_event[event]);
1585
1586		ret = -1;
1587		break;
1588	}
1589	return ret;
1590}
1591
1592/*
1593 * Function irlap_state_reset_wait (event, skb, info)
1594 *
1595 *    We have informed the service user of a reset condition, and is
1596 *    awaiting reset of disconnect request.
1597 *
1598 */
1599static int irlap_state_reset_wait(struct irlap_cb *self, IRLAP_EVENT event,
1600				  struct sk_buff *skb, struct irlap_info *info)
1601{
1602	int ret = 0;
1603
1604	pr_debug("%s(), event = %s\n", __func__, irlap_event[event]);
1605
1606	IRDA_ASSERT(self != NULL, return -1;);
1607	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
1608
1609	switch (event) {
1610	case RESET_REQUEST:
1611		if (self->xmitflag) {
1612			irlap_wait_min_turn_around(self, &self->qos_tx);
1613			irlap_send_snrm_frame(self, NULL);
1614			irlap_start_final_timer(self, self->final_timeout);
1615			irlap_next_state(self, LAP_RESET);
1616		} else {
1617			irlap_start_final_timer(self, self->final_timeout);
1618			irlap_next_state(self, LAP_RESET);
1619		}
1620		break;
1621	case DISCONNECT_REQUEST:
1622		irlap_wait_min_turn_around( self, &self->qos_tx);
1623		irlap_send_disc_frame( self);
1624		irlap_flush_all_queues( self);
1625		irlap_start_final_timer( self, self->final_timeout);
1626		self->retry_count = 0;
1627		irlap_next_state( self, LAP_PCLOSE);
1628		break;
1629	default:
1630		pr_debug("%s(), Unknown event %s\n", __func__,
1631			 irlap_event[event]);
1632
1633		ret = -1;
1634		break;
1635	}
1636	return ret;
1637}
1638
1639/*
1640 * Function irlap_state_reset (self, event, skb, info)
1641 *
1642 *    We have sent a SNRM reset command to the peer layer, and is awaiting
1643 *    reply.
1644 *
1645 */
1646static int irlap_state_reset(struct irlap_cb *self, IRLAP_EVENT event,
1647			     struct sk_buff *skb, struct irlap_info *info)
1648{
1649	int ret = 0;
1650
1651	pr_debug("%s(), event = %s\n", __func__, irlap_event[event]);
1652
1653	IRDA_ASSERT(self != NULL, return -1;);
1654	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
1655
1656	switch (event) {
1657	case RECV_DISC_CMD:
1658		del_timer(&self->final_timer);
1659
1660		irlap_apply_default_connection_parameters(self);
1661
1662		/* Always switch state before calling upper layers */
1663		irlap_next_state(self, LAP_NDM);
1664
1665		irlap_disconnect_indication(self, LAP_NO_RESPONSE);
1666
1667		break;
1668	case RECV_UA_RSP:
1669		del_timer(&self->final_timer);
1670
1671		/* Initiate connection state */
1672		irlap_initiate_connection_state(self);
1673
1674		irlap_reset_confirm();
1675
1676		self->remote_busy = FALSE;
1677
1678		irlap_next_state(self, LAP_XMIT_P);
1679
1680		irlap_start_poll_timer(self, self->poll_timeout);
1681
1682		break;
1683	case FINAL_TIMER_EXPIRED:
1684		if (self->retry_count < 3) {
1685			irlap_wait_min_turn_around(self, &self->qos_tx);
1686
1687			IRDA_ASSERT(self->netdev != NULL, return -1;);
1688			irlap_send_snrm_frame(self, self->qos_dev);
1689
1690			self->retry_count++; /* Experimental!! */
1691
1692			irlap_start_final_timer(self, self->final_timeout);
1693			irlap_next_state(self, LAP_RESET);
1694		} else if (self->retry_count >= self->N3) {
1695			irlap_apply_default_connection_parameters(self);
1696
1697			/* Always switch state before calling upper layers */
1698			irlap_next_state(self, LAP_NDM);
1699
1700			irlap_disconnect_indication(self, LAP_NO_RESPONSE);
1701		}
1702		break;
1703	case RECV_SNRM_CMD:
1704		/*
1705		 * SNRM frame is not allowed to contain an I-field in this
1706		 * state
1707		 */
1708		if (!info) {
1709			pr_debug("%s(), RECV_SNRM_CMD\n", __func__);
1710			irlap_initiate_connection_state(self);
1711			irlap_wait_min_turn_around(self, &self->qos_tx);
1712			irlap_send_ua_response_frame(self, &self->qos_rx);
1713			irlap_reset_confirm();
1714			irlap_start_wd_timer(self, self->wd_timeout);
1715			irlap_next_state(self, LAP_NDM);
1716		} else {
1717			pr_debug("%s(), SNRM frame contained an I field!\n",
1718				 __func__);
1719		}
1720		break;
1721	default:
1722		pr_debug("%s(), Unknown event %s\n",
1723			 __func__, irlap_event[event]);
1724
1725		ret = -1;
1726		break;
1727	}
1728	return ret;
1729}
1730
1731/*
1732 * Function irlap_state_xmit_s (event, skb, info)
1733 *
1734 *   XMIT_S, The secondary station has been given the right to transmit,
1735 *   and we therefore do not expect to receive any transmissions from other
1736 *   stations.
1737 */
1738static int irlap_state_xmit_s(struct irlap_cb *self, IRLAP_EVENT event,
1739			      struct sk_buff *skb, struct irlap_info *info)
1740{
1741	int ret = 0;
1742
1743	pr_debug("%s(), event=%s\n", __func__, irlap_event[event]);
1744
1745	IRDA_ASSERT(self != NULL, return -ENODEV;);
1746	IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
1747
1748	switch (event) {
1749	case SEND_I_CMD:
1750		/*
1751		 *  Send frame only if send window > 0
1752		 */
1753		if ((self->window > 0) && (!self->remote_busy)) {
1754			int nextfit;
1755#ifdef CONFIG_IRDA_DYNAMIC_WINDOW
1756			struct sk_buff *skb_next;
1757
1758			/*
1759			 * Same deal as in irlap_state_xmit_p(), so see
1760			 * the comments at that point.
1761			 * We are the secondary, so there are only subtle
1762			 * differences. - Jean II
1763			 */
1764
1765			/* Check if a subsequent skb exist and would fit in
1766			 * the current window (with respect to turnaround
1767			 * time). - Jean II */
1768			skb_next = skb_peek(&self->txq);
1769			nextfit = ((skb_next != NULL) &&
1770				   ((skb_next->len + skb->len) <=
1771				    self->bytes_left));
1772
1773			/*
1774			 *  Test if we have transmitted more bytes over the
1775			 *  link than its possible to do with the current
1776			 *  speed and turn-around-time.
1777			 */
1778			if((!nextfit) && (skb->len > self->bytes_left)) {
1779				pr_debug("%s(), Not allowed to transmit more bytes!\n",
1780					 __func__);
1781				/* Requeue the skb */
1782				skb_queue_head(&self->txq, skb_get(skb));
1783
1784				/*
1785				 *  Switch to NRM_S, this is only possible
1786				 *  when we are in secondary mode, since we
1787				 *  must be sure that we don't miss any RR
1788				 *  frames
1789				 */
1790				self->window = self->window_size;
1791				self->bytes_left = self->line_capacity;
1792				irlap_start_wd_timer(self, self->wd_timeout);
1793
1794				irlap_next_state(self, LAP_NRM_S);
1795				/* Slight difference with primary :
1796				 * here we would wait for the other side to
1797				 * expire the turnaround. - Jean II */
1798
1799				return -EPROTO; /* Try again later */
1800			}
1801			/* Subtract space used by this skb */
1802			self->bytes_left -= skb->len;
1803#else	/* CONFIG_IRDA_DYNAMIC_WINDOW */
1804			/* Window has been adjusted for the max packet
1805			 * size, so much simpler... - Jean II */
1806			nextfit = !skb_queue_empty(&self->txq);
1807#endif /* CONFIG_IRDA_DYNAMIC_WINDOW */
1808			/*
1809			 *  Send data with final bit cleared only if window > 1
1810			 *  and there is more frames to be sent
1811			 */
1812			if ((self->window > 1) && (nextfit)) {
1813				irlap_send_data_secondary(self, skb);
1814				irlap_next_state(self, LAP_XMIT_S);
1815			} else {
1816				irlap_send_data_secondary_final(self, skb);
1817				irlap_next_state(self, LAP_NRM_S);
1818
1819				/*
1820				 * Make sure state machine does not try to send
1821				 * any more frames
1822				 */
1823				ret = -EPROTO;
1824			}
1825		} else {
1826			pr_debug("%s(), Unable to send!\n", __func__);
1827			skb_queue_head(&self->txq, skb_get(skb));
1828			ret = -EPROTO;
1829		}
1830		break;
1831	case DISCONNECT_REQUEST:
1832		irlap_send_rd_frame(self);
1833		irlap_flush_all_queues(self);
1834		irlap_start_wd_timer(self, self->wd_timeout);
1835		irlap_next_state(self, LAP_SCLOSE);
1836		break;
1837	case DATA_REQUEST:
1838		/* Nothing to do, irlap_do_event() will send the packet
1839		 * when we return... - Jean II */
1840		break;
1841	default:
1842		pr_debug("%s(), Unknown event %s\n", __func__,
1843			 irlap_event[event]);
1844
1845		ret = -EINVAL;
1846		break;
1847	}
1848	return ret;
1849}
1850
1851/*
1852 * Function irlap_state_nrm_s (event, skb, info)
1853 *
1854 *    NRM_S (Normal Response Mode as Secondary) state, in this state we are
1855 *    expecting to receive frames from the primary station
1856 *
1857 */
1858static int irlap_state_nrm_s(struct irlap_cb *self, IRLAP_EVENT event,
1859			     struct sk_buff *skb, struct irlap_info *info)
1860{
1861	int ns_status;
1862	int nr_status;
1863	int ret = 0;
1864
1865	pr_debug("%s(), event=%s\n", __func__, irlap_event[event]);
1866
1867	IRDA_ASSERT(self != NULL, return -1;);
1868	IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
1869
1870	switch (event) {
1871	case RECV_I_CMD: /* Optimize for the common case */
1872		/* FIXME: must check for remote_busy below */
1873		pr_debug("%s(), event=%s nr=%d, vs=%d, ns=%d, vr=%d, pf=%d\n",
1874			 __func__, irlap_event[event], info->nr,
1875			 self->vs, info->ns, self->vr, info->pf);
1876
1877		self->retry_count = 0;
1878
1879		ns_status = irlap_validate_ns_received(self, info->ns);
1880		nr_status = irlap_validate_nr_received(self, info->nr);
1881		/*
1882		 *  Check for expected I(nformation) frame
1883		 */
1884		if ((ns_status == NS_EXPECTED) && (nr_status == NR_EXPECTED)) {
1885
1886			/* Update Vr (next frame for us to receive) */
1887			self->vr = (self->vr + 1) % 8;
1888
1889			/* Update Nr received */
1890			irlap_update_nr_received(self, info->nr);
1891
1892			/*
1893			 *  poll bit cleared?
1894			 */
1895			if (!info->pf) {
1896
1897				self->ack_required = TRUE;
1898
1899				/*
1900				 *  Starting WD-timer here is optional, but
1901				 *  not recommended. Note 6 IrLAP p. 83
1902				 */
1903#if 0
1904				irda_start_timer(WD_TIMER, self->wd_timeout);
1905#endif
1906				/* Keep state, do not move this line */
1907				irlap_next_state(self, LAP_NRM_S);
1908
1909				irlap_data_indication(self, skb, FALSE);
1910				break;
1911			} else {
1912				/*
1913				 *  We should wait before sending RR, and
1914				 *  also before changing to XMIT_S
1915				 *  state. (note 1, IrLAP p. 82)
1916				 */
1917				irlap_wait_min_turn_around(self, &self->qos_tx);
1918
1919				/*
1920				 * Give higher layers a chance to
1921				 * immediately reply with some data before
1922				 * we decide if we should send a RR frame
1923				 * or not
1924				 */
1925				irlap_data_indication(self, skb, FALSE);
1926
1927				/* Any pending data requests?  */
1928				if (!skb_queue_empty(&self->txq) &&
1929				    (self->window > 0))
1930				{
1931					self->ack_required = TRUE;
1932
1933					del_timer(&self->wd_timer);
1934
1935					irlap_next_state(self, LAP_XMIT_S);
1936				} else {
1937					irlap_send_rr_frame(self, RSP_FRAME);
1938					irlap_start_wd_timer(self,
1939							     self->wd_timeout);
1940
1941					/* Keep the state */
1942					irlap_next_state(self, LAP_NRM_S);
1943				}
1944				break;
1945			}
1946		}
1947		/*
1948		 *  Check for Unexpected next to send (Ns)
1949		 */
1950		if ((ns_status == NS_UNEXPECTED) && (nr_status == NR_EXPECTED))
1951		{
1952			/* Unexpected next to send, with final bit cleared */
1953			if (!info->pf) {
1954				irlap_update_nr_received(self, info->nr);
1955
1956				irlap_start_wd_timer(self, self->wd_timeout);
1957			} else {
1958				/* Update Nr received */
1959				irlap_update_nr_received(self, info->nr);
1960
1961				irlap_wait_min_turn_around(self, &self->qos_tx);
1962				irlap_send_rr_frame(self, RSP_FRAME);
1963
1964				irlap_start_wd_timer(self, self->wd_timeout);
1965			}
1966			break;
1967		}
1968
1969		/*
1970		 *  Unexpected Next to Receive(NR) ?
1971		 */
1972		if ((ns_status == NS_EXPECTED) && (nr_status == NR_UNEXPECTED))
1973		{
1974			if (info->pf) {
1975				pr_debug("RECV_I_RSP: frame(s) lost\n");
1976
1977				self->vr = (self->vr + 1) % 8;
1978
1979				/* Update Nr received */
1980				irlap_update_nr_received(self, info->nr);
1981
1982				/* Resend rejected frames */
1983				irlap_resend_rejected_frames(self, RSP_FRAME);
1984
1985				/* Keep state, do not move this line */
1986				irlap_next_state(self, LAP_NRM_S);
1987
1988				irlap_data_indication(self, skb, FALSE);
1989				irlap_start_wd_timer(self, self->wd_timeout);
1990				break;
1991			}
1992			/*
1993			 *  This is not documented in IrLAP!! Unexpected NR
1994			 *  with poll bit cleared
1995			 */
1996			if (!info->pf) {
1997				self->vr = (self->vr + 1) % 8;
1998
1999				/* Update Nr received */
2000				irlap_update_nr_received(self, info->nr);
2001
2002				/* Keep state, do not move this line */
2003				irlap_next_state(self, LAP_NRM_S);
2004
2005				irlap_data_indication(self, skb, FALSE);
2006				irlap_start_wd_timer(self, self->wd_timeout);
2007			}
2008			break;
2009		}
2010
2011		if (ret == NR_INVALID) {
2012			pr_debug("NRM_S, NR_INVALID not implemented!\n");
2013		}
2014		if (ret == NS_INVALID) {
2015			pr_debug("NRM_S, NS_INVALID not implemented!\n");
2016		}
2017		break;
2018	case RECV_UI_FRAME:
2019		/*
2020		 *  poll bit cleared?
2021		 */
2022		if (!info->pf) {
2023			irlap_data_indication(self, skb, TRUE);
2024			irlap_next_state(self, LAP_NRM_S); /* Keep state */
2025		} else {
2026			/*
2027			 *  Any pending data requests?
2028			 */
2029			if (!skb_queue_empty(&self->txq) &&
2030			    (self->window > 0) && !self->remote_busy)
2031			{
2032				irlap_data_indication(self, skb, TRUE);
2033
2034				del_timer(&self->wd_timer);
2035
2036				irlap_next_state(self, LAP_XMIT_S);
2037			} else {
2038				irlap_data_indication(self, skb, TRUE);
2039
2040				irlap_wait_min_turn_around(self, &self->qos_tx);
2041
2042				irlap_send_rr_frame(self, RSP_FRAME);
2043				self->ack_required = FALSE;
2044
2045				irlap_start_wd_timer(self, self->wd_timeout);
2046
2047				/* Keep the state */
2048				irlap_next_state(self, LAP_NRM_S);
2049			}
2050		}
2051		break;
2052	case RECV_RR_CMD:
2053		self->retry_count = 0;
2054
2055		/*
2056		 *  Nr as expected?
2057		 */
2058		nr_status = irlap_validate_nr_received(self, info->nr);
2059		if (nr_status == NR_EXPECTED) {
2060			if (!skb_queue_empty(&self->txq) &&
2061			    (self->window > 0)) {
2062				self->remote_busy = FALSE;
2063
2064				/* Update Nr received */
2065				irlap_update_nr_received(self, info->nr);
2066				del_timer(&self->wd_timer);
2067
2068				irlap_wait_min_turn_around(self, &self->qos_tx);
2069				irlap_next_state(self, LAP_XMIT_S);
2070			} else {
2071				self->remote_busy = FALSE;
2072				/* Update Nr received */
2073				irlap_update_nr_received(self, info->nr);
2074				irlap_wait_min_turn_around(self, &self->qos_tx);
2075				irlap_start_wd_timer(self, self->wd_timeout);
2076
2077				/* Note : if the link is idle (this case),
2078				 * we never go in XMIT_S, so we never get a
2079				 * chance to process any DISCONNECT_REQUEST.
2080				 * Do it now ! - Jean II */
2081				if (self->disconnect_pending) {
2082					/* Disconnect */
2083					irlap_send_rd_frame(self);
2084					irlap_flush_all_queues(self);
2085
2086					irlap_next_state(self, LAP_SCLOSE);
2087				} else {
2088					/* Just send back pf bit */
2089					irlap_send_rr_frame(self, RSP_FRAME);
2090
2091					irlap_next_state(self, LAP_NRM_S);
2092				}
2093			}
2094		} else if (nr_status == NR_UNEXPECTED) {
2095			self->remote_busy = FALSE;
2096			irlap_update_nr_received(self, info->nr);
2097			irlap_resend_rejected_frames(self, RSP_FRAME);
2098
2099			irlap_start_wd_timer(self, self->wd_timeout);
2100
2101			/* Keep state */
2102			irlap_next_state(self, LAP_NRM_S);
2103		} else {
2104			pr_debug("%s(), invalid nr not implemented!\n",
2105				 __func__);
2106		}
2107		break;
2108	case RECV_SNRM_CMD:
2109		/* SNRM frame is not allowed to contain an I-field */
2110		if (!info) {
2111			del_timer(&self->wd_timer);
2112			pr_debug("%s(), received SNRM cmd\n", __func__);
2113			irlap_next_state(self, LAP_RESET_CHECK);
2114
2115			irlap_reset_indication(self);
2116		} else {
2117			pr_debug("%s(), SNRM frame contained an I-field!\n",
2118				 __func__);
2119
2120		}
2121		break;
2122	case RECV_REJ_CMD:
2123		irlap_update_nr_received(self, info->nr);
2124		if (self->remote_busy) {
2125			irlap_wait_min_turn_around(self, &self->qos_tx);
2126			irlap_send_rr_frame(self, RSP_FRAME);
2127		} else
2128			irlap_resend_rejected_frames(self, RSP_FRAME);
2129		irlap_start_wd_timer(self, self->wd_timeout);
2130		break;
2131	case RECV_SREJ_CMD:
2132		irlap_update_nr_received(self, info->nr);
2133		if (self->remote_busy) {
2134			irlap_wait_min_turn_around(self, &self->qos_tx);
2135			irlap_send_rr_frame(self, RSP_FRAME);
2136		} else
2137			irlap_resend_rejected_frame(self, RSP_FRAME);
2138		irlap_start_wd_timer(self, self->wd_timeout);
2139		break;
2140	case WD_TIMER_EXPIRED:
2141		/*
2142		 *  Wait until retry_count * n matches negotiated threshold/
2143		 *  disconnect time (note 2 in IrLAP p. 82)
2144		 *
2145		 * Similar to irlap_state_nrm_p() -> FINAL_TIMER_EXPIRED
2146		 * Note : self->wd_timeout = (self->final_timeout * 2),
2147		 *   which explain why we use (self->N2 / 2) here !!!
2148		 * Jean II
2149		 */
2150		pr_debug("%s(), retry_count = %d\n", __func__,
2151			 self->retry_count);
2152
2153		if (self->retry_count < (self->N2 / 2)) {
2154			/* No retry, just wait for primary */
2155			irlap_start_wd_timer(self, self->wd_timeout);
2156			self->retry_count++;
2157
2158			if((self->retry_count % (self->N1 / 2)) == 0)
2159				irlap_status_indication(self,
2160							STATUS_NO_ACTIVITY);
2161		} else {
2162			irlap_apply_default_connection_parameters(self);
2163
2164			/* Always switch state before calling upper layers */
2165			irlap_next_state(self, LAP_NDM);
2166			irlap_disconnect_indication(self, LAP_NO_RESPONSE);
2167		}
2168		break;
2169	case RECV_DISC_CMD:
2170		/* Always switch state before calling upper layers */
2171		irlap_next_state(self, LAP_NDM);
2172
2173		/* Send disconnect response */
2174		irlap_wait_min_turn_around(self, &self->qos_tx);
2175		irlap_send_ua_response_frame(self, NULL);
2176
2177		del_timer(&self->wd_timer);
2178		irlap_flush_all_queues(self);
2179		/* Set default link parameters */
2180		irlap_apply_default_connection_parameters(self);
2181
2182		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
2183		break;
2184	case RECV_DISCOVERY_XID_CMD:
2185		irlap_wait_min_turn_around(self, &self->qos_tx);
2186		irlap_send_rr_frame(self, RSP_FRAME);
2187		self->ack_required = TRUE;
2188		irlap_start_wd_timer(self, self->wd_timeout);
2189		irlap_next_state(self, LAP_NRM_S);
2190
2191		break;
2192	case RECV_TEST_CMD:
2193		/* Remove test frame header (only LAP header in NRM) */
2194		skb_pull(skb, LAP_ADDR_HEADER + LAP_CTRL_HEADER);
2195
2196		irlap_wait_min_turn_around(self, &self->qos_tx);
2197		irlap_start_wd_timer(self, self->wd_timeout);
2198
2199		/* Send response (info will be copied) */
2200		irlap_send_test_frame(self, self->caddr, info->daddr, skb);
2201		break;
2202	default:
2203		pr_debug("%s(), Unknown event %d, (%s)\n", __func__,
2204			 event, irlap_event[event]);
2205
2206		ret = -EINVAL;
2207		break;
2208	}
2209	return ret;
2210}
2211
2212/*
2213 * Function irlap_state_sclose (self, event, skb, info)
2214 */
2215static int irlap_state_sclose(struct irlap_cb *self, IRLAP_EVENT event,
2216			      struct sk_buff *skb, struct irlap_info *info)
2217{
2218	IRDA_ASSERT(self != NULL, return -ENODEV;);
2219	IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
2220
2221	switch (event) {
2222	case RECV_DISC_CMD:
2223		/* Always switch state before calling upper layers */
2224		irlap_next_state(self, LAP_NDM);
2225
2226		/* Send disconnect response */
2227		irlap_wait_min_turn_around(self, &self->qos_tx);
2228		irlap_send_ua_response_frame(self, NULL);
2229
2230		del_timer(&self->wd_timer);
2231		/* Set default link parameters */
2232		irlap_apply_default_connection_parameters(self);
2233
2234		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
2235		break;
2236	case RECV_DM_RSP:
2237		/* IrLAP-1.1 p.82: in SCLOSE, S and I type RSP frames
2238		 * shall take us down into default NDM state, like DM_RSP
2239		 */
2240	case RECV_RR_RSP:
2241	case RECV_RNR_RSP:
2242	case RECV_REJ_RSP:
2243	case RECV_SREJ_RSP:
2244	case RECV_I_RSP:
2245		/* Always switch state before calling upper layers */
2246		irlap_next_state(self, LAP_NDM);
2247
2248		del_timer(&self->wd_timer);
2249		irlap_apply_default_connection_parameters(self);
2250
2251		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
2252		break;
2253	case WD_TIMER_EXPIRED:
2254		/* Always switch state before calling upper layers */
2255		irlap_next_state(self, LAP_NDM);
2256
2257		irlap_apply_default_connection_parameters(self);
2258
2259		irlap_disconnect_indication(self, LAP_DISC_INDICATION);
2260		break;
2261	default:
2262		/* IrLAP-1.1 p.82: in SCLOSE, basically any received frame
2263		 * with pf=1 shall restart the wd-timer and resend the rd:rsp
2264		 */
2265		if (info != NULL  &&  info->pf) {
2266			del_timer(&self->wd_timer);
2267			irlap_wait_min_turn_around(self, &self->qos_tx);
2268			irlap_send_rd_frame(self);
2269			irlap_start_wd_timer(self, self->wd_timeout);
2270			break;		/* stay in SCLOSE */
2271		}
2272
2273		pr_debug("%s(), Unknown event %d, (%s)\n", __func__,
2274			 event, irlap_event[event]);
2275
2276		break;
2277	}
2278
2279	return -1;
2280}
2281
2282static int irlap_state_reset_check( struct irlap_cb *self, IRLAP_EVENT event,
2283				   struct sk_buff *skb,
2284				   struct irlap_info *info)
2285{
2286	int ret = 0;
2287
2288	pr_debug("%s(), event=%s\n", __func__, irlap_event[event]);
2289
2290	IRDA_ASSERT(self != NULL, return -ENODEV;);
2291	IRDA_ASSERT(self->magic == LAP_MAGIC, return -EBADR;);
2292
2293	switch (event) {
2294	case RESET_RESPONSE:
2295		irlap_send_ua_response_frame(self, &self->qos_rx);
2296		irlap_initiate_connection_state(self);
2297		irlap_start_wd_timer(self, WD_TIMEOUT);
2298		irlap_flush_all_queues(self);
2299
2300		irlap_next_state(self, LAP_NRM_S);
2301		break;
2302	case DISCONNECT_REQUEST:
2303		irlap_wait_min_turn_around(self, &self->qos_tx);
2304		irlap_send_rd_frame(self);
2305		irlap_start_wd_timer(self, WD_TIMEOUT);
2306		irlap_next_state(self, LAP_SCLOSE);
2307		break;
2308	default:
2309		pr_debug("%s(), Unknown event %d, (%s)\n", __func__,
2310			 event, irlap_event[event]);
2311
2312		ret = -EINVAL;
2313		break;
2314	}
2315	return ret;
2316}
2317