11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************
26819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Filename:      timer.c
46819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * Version:
56819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki * Description:
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Status:        Experimental.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author:        Dag Brattli <dagb@cs.uit.no>
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Created at:    Sat Aug 16 00:59:29 1997
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified at:   Wed Dec  8 12:50:34 1999
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified by:   Dag Brattli <dagb@cs.uit.no>
116819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *
126819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *     Copyright (c) 1997, 1999 Dag Brattli <dagb@cs.uit.no>,
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     All Rights Reserved.
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
156819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *
166819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *     This program is free software; you can redistribute it and/or
176819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *     modify it under the terms of the GNU General Public License as
186819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *     published by the Free Software Foundation; either version 2 of
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     the License, or (at your option) any later version.
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
21db955170d40601d9925f01712782fbe3ce362b7eMarcin Garski *     Neither Dag Brattli nor University of Tromsø admit liability nor
226819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *     provide warranty for any of this software. This material is
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *     provided "AS-IS" and at no charge.
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ********************************************************************/
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/timer.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irda.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irda_device.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irlap.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/irda/irlmp.h>
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int  sysctl_slot_timeout;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_slot_timer_expired(void* data);
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_query_timer_expired(void* data);
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_final_timer_expired(void* data);
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_wd_timer_expired(void* data);
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_backoff_timer_expired(void* data);
426819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakistatic void irlap_media_busy_expired(void* data);
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlap_start_slot_timer(struct irlap_cb *self, int timeout)
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
466819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki	irda_start_timer(&self->slot_timer, timeout, (void *) self,
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 irlap_slot_timer_expired);
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlap_start_query_timer(struct irlap_cb *self, int S, int s)
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int timeout;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Calculate when the peer discovery should end. Normally, we
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * get the end-of-discovery frame, so this is just in case
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * we miss it.
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Basically, we multiply the number of remaining slots by our
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * slot time, plus add some extra time to properly receive the last
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * discovery packet (which is longer due to extra discovery info),
60d82603c6da7579c50ebe3fe7da6e3e267d9f6427Jorrit Schippers	 * to avoid messing with for incoming connections requests and
6125985edcedea6396277003854657b5f3cb31a628Lucas De Marchi	 * to accommodate devices that perform discovery slower than us.
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Jean II */
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	timeout = ((sysctl_slot_timeout * HZ / 1000) * (S - s)
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   + XIDEXTRA_TIMEOUT + SMALLBUSY_TIMEOUT);
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set or re-set the timer. We reset the timer for each received
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * discovery query, which allow us to automatically adjust to
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * the speed of the peer discovery (faster or slower). Jean II */
696819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki	irda_start_timer( &self->query_timer, timeout, (void *) self,
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			  irlap_query_timer_expired);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlap_start_final_timer(struct irlap_cb *self, int timeout)
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
756819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki	irda_start_timer(&self->final_timer, timeout, (void *) self,
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 irlap_final_timer_expired);
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlap_start_wd_timer(struct irlap_cb *self, int timeout)
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
816819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki	irda_start_timer(&self->wd_timer, timeout, (void *) self,
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 irlap_wd_timer_expired);
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlap_start_backoff_timer(struct irlap_cb *self, int timeout)
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
876819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki	irda_start_timer(&self->backoff_timer, timeout, (void *) self,
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 irlap_backoff_timer_expired);
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlap_start_mbusy_timer(struct irlap_cb *self, int timeout)
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
936819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki	irda_start_timer(&self->media_busy_timer, timeout,
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 (void *) self, irlap_media_busy_expired);
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid irlap_stop_mbusy_timer(struct irlap_cb *self)
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* If timer is activated, kill it! */
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	del_timer(&self->media_busy_timer);
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* If we are in NDM, there is a bunch of events in LAP that
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * that be pending due to the media_busy condition, such as
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * CONNECT_REQUEST and SEND_UI_FRAME. If we don't generate
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * an event, they will wait forever...
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Jean II */
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (self->state == LAP_NDM)
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		irlap_do_event(self, MEDIA_BUSY_TIMER_EXPIRED, NULL, NULL);
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1116819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakivoid irlmp_start_watchdog_timer(struct lsap_cb *self, int timeout)
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_start_timer(&self->watchdog_timer, timeout, (void *) self,
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 irlmp_watchdog_timer_expired);
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1176819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakivoid irlmp_start_discovery_timer(struct irlmp_cb *self, int timeout)
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_start_timer(&self->discovery_timer, timeout, (void *) self,
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 irlmp_discovery_timer_expired);
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1236819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakivoid irlmp_start_idle_timer(struct lap_cb *self, int timeout)
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_start_timer(&self->idle_timer, timeout, (void *) self,
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 irlmp_idle_timer_expired);
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1296819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideakivoid irlmp_stop_idle_timer(struct lap_cb *self)
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* If timer is activated, kill it! */
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	del_timer(&self->idle_timer);
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irlap_slot_timer_expired (data)
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    IrLAP slot timer has expired
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_slot_timer_expired(void *data)
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct irlap_cb *self = (struct irlap_cb *) data;
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self != NULL, return;);
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irlap_do_event(self, SLOT_TIMER_EXPIRED, NULL, NULL);
1496819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki}
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irlap_query_timer_expired (data)
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    IrLAP query timer has expired
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_query_timer_expired(void *data)
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct irlap_cb *self = (struct irlap_cb *) data;
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self != NULL, return;);
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irlap_do_event(self, QUERY_TIMER_EXPIRED, NULL, NULL);
1656819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki}
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irda_final_timer_expired (data)
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1706819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_final_timer_expired(void *data)
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct irlap_cb *self = (struct irlap_cb *) data;
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self != NULL, return;);
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irlap_do_event(self, FINAL_TIMER_EXPIRED, NULL, NULL);
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irda_wd_timer_expired (data)
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1866819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_wd_timer_expired(void *data)
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct irlap_cb *self = (struct irlap_cb *) data;
1926819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self != NULL, return;);
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
1956819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irlap_do_event(self, WD_TIMER_EXPIRED, NULL, NULL);
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irda_backoff_timer_expired (data)
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2026819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void irlap_backoff_timer_expired(void *data)
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct irlap_cb *self = (struct irlap_cb *) data;
2086819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self != NULL, return;);
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
2116819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irlap_do_event(self, BACKOFF_TIMER_EXPIRED, NULL, NULL);
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Function irtty_media_busy_expired (data)
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2196819bc2e1e46c71711a8dddf4040e706b02973c0YOSHIFUJI Hideaki *
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2215eaa65b240c5eb7bf2235eb9dd177c83e6e3832cRoel Kluinstatic void irlap_media_busy_expired(void *data)
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct irlap_cb *self = (struct irlap_cb *) data;
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IRDA_ASSERT(self != NULL, return;);
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	irda_device_set_media_busy(self->netdev, FALSE);
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Note : the LAP event will be send in irlap_stop_mbusy_timer(),
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	* to catch other cases where the flag is cleared (for example
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	* after a discovery) - Jean II */
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
232