27 #include <linux/kernel.h>
46 "LSAP_DATA_TRANSFER_READY",
51 #ifdef CONFIG_IRDA_DEBUG
52 static const char *
const irlmp_event[] = {
55 "LM_CONNECT_RESPONSE",
56 "LM_CONNECT_INDICATION",
58 "LM_DISCONNECT_INDICATION",
59 "LM_DISCONNECT_REQUEST",
64 "LM_UDATA_INDICATION",
66 "LM_WATCHDOG_TIMEOUT",
69 "LM_LAP_CONNECT_REQUEST",
70 "LM_LAP_CONNECT_INDICATION",
71 "LM_LAP_CONNECT_CONFIRM",
72 "LM_LAP_DISCONNECT_INDICATION",
73 "LM_LAP_DISCONNECT_REQUEST",
74 "LM_LAP_DISCOVERY_REQUEST",
75 "LM_LAP_DISCOVERY_CONFIRM",
76 "LM_LAP_IDLE_TIMEOUT",
105 irlmp_state_u_connect,
111 irlmp_state_disconnected,
113 irlmp_state_connect_pend,
116 irlmp_state_setup_pend
119 static inline void irlmp_next_lap_state(
struct lap_cb *
self,
125 self->lap_state =
state;
128 static inline void irlmp_next_lsap_state(
struct lsap_cb *
self,
135 self->lsap_state =
state;
145 IRDA_DEBUG(4,
"%s(), EVENT = %s, STATE = %s\n",
146 __func__, irlmp_event[event],
irlsap_state[ self->lsap_state]);
148 return (*lsap_state[self->lsap_state]) (
self,
event,
skb);
163 IRDA_DEBUG(4,
"%s(), EVENT = %s, STATE = %s\n", __func__,
167 (*lap_state[
self->lap_state]) (
self, event, skb);
211 irlmp_do_all_lsap_event(
hashbin_t * lsap_hashbin,
238 (
void *) &lsap_next) ) {
256 static void irlmp_state_standby(
struct lap_cb *
self, IRLMP_EVENT event,
279 IRDA_DEBUG(4,
"%s() LS_CONNECT_REQUEST\n", __func__);
287 IRDA_DEBUG(4,
"%s(), Error LM_LAP_DISCONNECT_INDICATION\n",
294 __func__, irlmp_event[event]);
306 static void irlmp_state_u_connect(
struct lap_cb *
self, IRLMP_EVENT event,
309 IRDA_DEBUG(2,
"%s(), event=%s\n", __func__, irlmp_event[event]);
352 IRDA_DEBUG(4,
"%s(), LM_LAP_DISCONNECT_INDICATION\n", __func__);
356 irlmp_do_all_lsap_event(self->lsaps,
360 IRDA_DEBUG(4,
"%s(), LM_LAP_DISCONNECT_REQUEST\n", __func__);
370 __func__, irlmp_event[event]);
381 static void irlmp_state_active(
struct lap_cb *
self, IRLMP_EVENT event,
388 IRDA_DEBUG(4,
"%s(), LS_CONNECT_REQUEST\n", __func__);
396 irlap_clear_disconnect(self->irlap);
407 irlmp_do_all_lsap_event(
irlmp->unconnected_lsaps,
457 irlmp_do_all_lsap_event(self->lsaps,
471 __func__, irlmp_event[event]);
488 static int irlmp_state_disconnected(
struct lsap_cb *
self, IRLMP_EVENT event,
499 #ifdef CONFIG_IRDA_ULTRA
504 irlmp_connless_data_indication(
self, skb);
508 IRDA_DEBUG(4,
"%s(), LM_CONNECT_REQUEST\n", __func__);
510 if (self->conn_skb) {
517 self->conn_skb =
skb;
527 if (self->conn_skb) {
534 self->conn_skb =
skb;
554 IRDA_DEBUG(1,
"%s(), Unknown event %s on LSAP %#02x\n",
555 __func__, irlmp_event[event], self->slsap_sel);
567 static int irlmp_state_connect(
struct lsap_cb *
self, IRLMP_EVENT event,
606 IRDA_DEBUG(0,
"%s() WATCHDOG_TIMEOUT!\n", __func__);
616 IRDA_DEBUG(0,
"%s(), Unknown event %s on LSAP %#02x\n",
617 __func__, irlmp_event[event], self->slsap_sel);
629 static int irlmp_state_connect_pend(
struct lsap_cb *
self, IRLMP_EVENT event,
646 "no indication issued yet\n", __func__);
651 "not yet bound to IrLAP connection\n", __func__);
655 IRDA_DEBUG(4,
"%s(), LS_CONNECT_CONFIRM\n", __func__);
658 tx_skb =
self->conn_skb;
659 self->conn_skb =
NULL;
663 dev_kfree_skb(tx_skb);
669 IRDA_DEBUG(0,
"%s() WATCHDOG_TIMEOUT!\n", __func__);
675 dev_kfree_skb(self->conn_skb);
676 self->conn_skb =
NULL;
682 IRDA_DEBUG(0,
"%s(), Unknown event %s on LSAP %#02x\n",
683 __func__, irlmp_event[event], self->slsap_sel);
695 static int irlmp_state_dtr(
struct lsap_cb *
self, IRLMP_EVENT event,
710 self->slsap_sel,
FALSE, skb);
718 self->slsap_sel,
TRUE, skb);
725 "error, LSAP already connected\n", __func__);
730 "error, LSAP already connected\n", __func__);
742 IRDA_DEBUG(4,
"%s(), trying to close IrLAP\n",
764 reason = skb->
data[3];
767 IRDA_DEBUG(4,
"%s(), trying to close IrLAP\n", __func__);
773 IRDA_DEBUG(0,
"%s(), Unknown event %s on LSAP %#02x\n",
774 __func__, irlmp_event[event], self->slsap_sel);
787 static int irlmp_state_setup(
struct lsap_cb *
self, IRLMP_EVENT event,
814 reason = skb->
data[3];
817 IRDA_DEBUG(4,
"%s(), trying to close IrLAP\n", __func__);
835 IRDA_DEBUG(0,
"%s() WATCHDOG_TIMEOUT!\n", __func__);
844 IRDA_DEBUG(0,
"%s(), Unknown event %s on LSAP %#02x\n",
845 __func__, irlmp_event[event], self->slsap_sel);
859 static int irlmp_state_setup_pend(
struct lsap_cb *
self, IRLMP_EVENT event,
875 tx_skb =
self->conn_skb;
876 self->conn_skb =
NULL;
881 dev_kfree_skb(tx_skb);
886 IRDA_DEBUG(0,
"%s() : WATCHDOG_TIMEOUT !\n", __func__);
904 IRDA_DEBUG(0,
"%s(), Unknown event %s on LSAP %#02x\n",
905 __func__, irlmp_event[event], self->slsap_sel);