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