/********************************************************************* * * Filename: irmod.c * Version: 0.9 * Description: IrDA stack main entry points * Status: Experimental. * Author: Dag Brattli * Created at: Mon Dec 15 13:55:39 1997 * Modified at: Wed Jan 5 15:12:41 2000 * Modified by: Dag Brattli * * Copyright (c) 1997, 1999-2000 Dag Brattli, All Rights Reserved. * Copyright (c) 2000-2004 Jean Tourrilhes * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * Neither Dag Brattli nor University of Tromsø admit liability nor * provide warranty for any of this software. This material is * provided "AS-IS" and at no charge. * ********************************************************************/ /* * This file contains the main entry points of the IrDA stack. * They are in this file and not af_irda.c because some developpers * are using the IrDA stack without the socket API (compiling out * af_irda.c). * Jean II */ #include #include #include #include /* notify_t */ #include /* irlap_init */ #include /* irlmp_init */ #include /* iriap_init */ #include /* irttp_init */ #include /* irda_device_init */ /* Packet type handler. * Tell the kernel how IrDA packets should be handled. */ static struct packet_type irda_packet_type __read_mostly = { .type = cpu_to_be16(ETH_P_IRDA), .func = irlap_driver_rcv, /* Packet type handler irlap_frame.c */ }; /* * Function irda_notify_init (notify) * * Used for initializing the notify structure * */ void irda_notify_init(notify_t *notify) { notify->data_indication = NULL; notify->udata_indication = NULL; notify->connect_confirm = NULL; notify->connect_indication = NULL; notify->disconnect_indication = NULL; notify->flow_indication = NULL; notify->status_indication = NULL; notify->instance = NULL; strlcpy(notify->name, "Unknown", sizeof(notify->name)); } EXPORT_SYMBOL(irda_notify_init); /* * Function irda_init (void) * * Protocol stack initialisation entry point. * Initialise the various components of the IrDA stack */ static int __init irda_init(void) { int ret = 0; /* Lower layer of the stack */ irlmp_init(); irlap_init(); /* Driver/dongle support */ irda_device_init(); /* Higher layers of the stack */ iriap_init(); irttp_init(); ret = irsock_init(); if (ret < 0) goto out_err_1; /* Add IrDA packet type (Start receiving packets) */ dev_add_pack(&irda_packet_type); /* External APIs */ #ifdef CONFIG_PROC_FS irda_proc_register(); #endif #ifdef CONFIG_SYSCTL ret = irda_sysctl_register(); if (ret < 0) goto out_err_2; #endif ret = irda_nl_register(); if (ret < 0) goto out_err_3; return 0; out_err_3: #ifdef CONFIG_SYSCTL irda_sysctl_unregister(); out_err_2: #endif #ifdef CONFIG_PROC_FS irda_proc_unregister(); #endif /* Remove IrDA packet type (stop receiving packets) */ dev_remove_pack(&irda_packet_type); /* Remove higher layers */ irsock_cleanup(); out_err_1: irttp_cleanup(); iriap_cleanup(); /* Remove lower layers */ irda_device_cleanup(); irlap_cleanup(); /* Must be done before irlmp_cleanup()! DB */ /* Remove middle layer */ irlmp_cleanup(); return ret; } /* * Function irda_cleanup (void) * * Protocol stack cleanup/removal entry point. * Cleanup the various components of the IrDA stack */ static void __exit irda_cleanup(void) { /* Remove External APIs */ irda_nl_unregister(); #ifdef CONFIG_SYSCTL irda_sysctl_unregister(); #endif #ifdef CONFIG_PROC_FS irda_proc_unregister(); #endif /* Remove IrDA packet type (stop receiving packets) */ dev_remove_pack(&irda_packet_type); /* Remove higher layers */ irsock_cleanup(); irttp_cleanup(); iriap_cleanup(); /* Remove lower layers */ irda_device_cleanup(); irlap_cleanup(); /* Must be done before irlmp_cleanup()! DB */ /* Remove middle layer */ irlmp_cleanup(); } /* * The IrDA stack must be initialised *before* drivers get initialised, * and *before* higher protocols (IrLAN/IrCOMM/IrNET) get initialised, * otherwise bad things will happen (hashbins will be NULL for example). * Those modules are at module_init()/device_initcall() level. * * On the other hand, it needs to be initialised *after* the basic * networking, the /proc/net filesystem and sysctl module. Those are * currently initialised in .../init/main.c (before initcalls). * Also, IrDA drivers needs to be initialised *after* the random number * generator (main stack and higher layer init don't need it anymore). * * Jean II */ subsys_initcall(irda_init); module_exit(irda_cleanup); MODULE_AUTHOR("Dag Brattli & Jean Tourrilhes "); MODULE_DESCRIPTION("The Linux IrDA Protocol Stack"); MODULE_LICENSE("GPL"); MODULE_ALIAS_NETPROTO(PF_IRDA); rameter set to 2: suddenly the test would fail. It turns out that this happens when the test configures the adapter in non-blocking mode, then it waits for the CEC_EVENT_STATE_CHANGE event and once the event is received it unconfigures the adapter. What happened was that the unconfigure was executed while the configure was still transmitting the Report Features and Report Physical Address messages. This messed up the internal state of the cec_adapter. The fix is to transmit those messages with the adap->lock mutex held (this will just queue them up in the internal transmit queue, and not actually transmit anything yet). Only unlock the mutex once everything is done. The main thread will dequeue the messages from the internal transmit queue and transmit them one by one, unless an unconfigure was done, and in that case any messages are just dropped. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>