cregit-Linux how code gets into the kernel

Release 4.8 net/irda/ircomm/ircomm_tty_attach.c

Directory: net/irda/ircomm
/*********************************************************************
 *
 * Filename:      ircomm_tty_attach.c
 * Version:
 * Description:   Code for attaching the serial driver to IrCOMM
 * Status:        Experimental.
 * Author:        Dag Brattli <dagb@cs.uit.no>
 * Created at:    Sat Jun  5 17:42:00 1999
 * Modified at:   Tue Jan  4 14:20:49 2000
 * Modified by:   Dag Brattli <dagb@cs.uit.no>
 *
 *     Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved.
 *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.com>
 *
 *     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.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *     GNU General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 *     along with this program; if not, see <http://www.gnu.org/licenses/>.
 *
 ********************************************************************/

#include <linux/init.h>
#include <linux/sched.h>

#include <net/irda/irda.h>
#include <net/irda/irlmp.h>
#include <net/irda/iriap.h>
#include <net/irda/irttp.h>
#include <net/irda/irias_object.h>
#include <net/irda/parameters.h>

#include <net/irda/ircomm_core.h>
#include <net/irda/ircomm_param.h>
#include <net/irda/ircomm_event.h>

#include <net/irda/ircomm_tty.h>
#include <net/irda/ircomm_tty_attach.h>

static void ircomm_tty_ias_register(struct ircomm_tty_cb *self);
static void ircomm_tty_discovery_indication(discinfo_t *discovery,
					    DISCOVERY_MODE mode,
					    void *priv);
static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id,
					struct ias_value *value, void *priv);
static void ircomm_tty_start_watchdog_timer(struct ircomm_tty_cb *self,
					    int timeout);
static void ircomm_tty_watchdog_timer_expired(void *data);

static int ircomm_tty_state_idle(struct ircomm_tty_cb *self,
				 IRCOMM_TTY_EVENT event,
				 struct sk_buff *skb,
				 struct ircomm_tty_info *info);
static int ircomm_tty_state_search(struct ircomm_tty_cb *self,
				   IRCOMM_TTY_EVENT event,
				   struct sk_buff *skb,
				   struct ircomm_tty_info *info);
static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self,
					     IRCOMM_TTY_EVENT event,
					     struct sk_buff *skb,
					     struct ircomm_tty_info *info);
static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self,
					   IRCOMM_TTY_EVENT event,
					   struct sk_buff *skb,
					   struct ircomm_tty_info *info);
static int ircomm_tty_state_setup(struct ircomm_tty_cb *self,
				  IRCOMM_TTY_EVENT event,
				  struct sk_buff *skb,
				  struct ircomm_tty_info *info);
static int ircomm_tty_state_ready(struct ircomm_tty_cb *self,
				  IRCOMM_TTY_EVENT event,
				  struct sk_buff *skb,
				  struct ircomm_tty_info *info);


const char *const ircomm_tty_state[] = {
	"IRCOMM_TTY_IDLE",
	"IRCOMM_TTY_SEARCH",
	"IRCOMM_TTY_QUERY_PARAMETERS",
	"IRCOMM_TTY_QUERY_LSAP_SEL",
	"IRCOMM_TTY_SETUP",
	"IRCOMM_TTY_READY",
	"*** ERROR *** ",
};


static const char *const ircomm_tty_event[] __maybe_unused = {
	"IRCOMM_TTY_ATTACH_CABLE",
	"IRCOMM_TTY_DETACH_CABLE",
	"IRCOMM_TTY_DATA_REQUEST",
	"IRCOMM_TTY_DATA_INDICATION",
	"IRCOMM_TTY_DISCOVERY_REQUEST",
	"IRCOMM_TTY_DISCOVERY_INDICATION",
	"IRCOMM_TTY_CONNECT_CONFIRM",
	"IRCOMM_TTY_CONNECT_INDICATION",
	"IRCOMM_TTY_DISCONNECT_REQUEST",
	"IRCOMM_TTY_DISCONNECT_INDICATION",
	"IRCOMM_TTY_WD_TIMER_EXPIRED",
	"IRCOMM_TTY_GOT_PARAMETERS",
	"IRCOMM_TTY_GOT_LSAPSEL",
	"*** ERROR ****",
};


static int (*state[])(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
		      struct sk_buff *skb, struct ircomm_tty_info *info) =
{
	ircomm_tty_state_idle,
	ircomm_tty_state_search,
	ircomm_tty_state_query_parameters,
	ircomm_tty_state_query_lsap_sel,
	ircomm_tty_state_setup,
	ircomm_tty_state_ready,
};

/*
 * Function ircomm_tty_attach_cable (driver)
 *
 *    Try to attach cable (IrCOMM link). This function will only return
 *    when the link has been connected, or if an error condition occurs.
 *    If success, the return value is the resulting service type.
 */

int ircomm_tty_attach_cable(struct ircomm_tty_cb *self) { struct tty_struct *tty; IRDA_ASSERT(self != NULL, return -1;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); /* Check if somebody has already connected to us */ if (ircomm_is_connected(self->ircomm)) { pr_debug("%s(), already connected!\n", __func__); return 0; } /* Make sure nobody tries to write before the link is up */ tty = tty_port_tty_get(&self->port); if (tty) { tty->hw_stopped = 1; tty_kref_put(tty); } ircomm_tty_ias_register(self); ircomm_tty_do_event(self, IRCOMM_TTY_ATTACH_CABLE, NULL, NULL); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git7270.59%116.67%
jiri slabyjiri slaby2423.53%116.67%
jean tourrilhesjean tourrilhes43.92%233.33%
joe perchesjoe perches10.98%116.67%
harvey harrisonharvey harrison10.98%116.67%
Total102100.00%6100.00%

/* * Function ircomm_detach_cable (driver) * * Detach cable, or cable has been detached by peer * */
void ircomm_tty_detach_cable(struct ircomm_tty_cb *self) { IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); del_timer(&self->watchdog_timer); /* Remove discovery handler */ if (self->ckey) { irlmp_unregister_client(self->ckey); self->ckey = NULL; } /* Remove IrCOMM hint bits */ if (self->skey) { irlmp_unregister_service(self->skey); self->skey = NULL; } if (self->iriap) { iriap_close(self->iriap); self->iriap = NULL; } /* Remove LM-IAS object */ if (self->obj) { irias_delete_object(self->obj); self->obj = NULL; } ircomm_tty_do_event(self, IRCOMM_TTY_DETACH_CABLE, NULL, NULL); /* Reset some values */ self->daddr = self->saddr = 0; self->dlsap_sel = self->slsap_sel = 0; memset(&self->settings, 0, sizeof(struct ircomm_params)); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git13580.84%466.67%
jean tourrilhesjean tourrilhes3219.16%233.33%
Total167100.00%6100.00%

/* * Function ircomm_tty_ias_register (self) * * Register with LM-IAS depending on which service type we are * */
static void ircomm_tty_ias_register(struct ircomm_tty_cb *self) { __u8 oct_seq[6]; __u16 hints; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); /* Compute hint bits based on service */ hints = irlmp_service_to_hint(S_COMM); if (self->service_type & IRCOMM_3_WIRE_RAW) hints |= irlmp_service_to_hint(S_PRINTER); /* Advertise IrCOMM hint bit in discovery */ if (!self->skey) self->skey = irlmp_register_service(hints); /* Set up a discovery handler */ if (!self->ckey) self->ckey = irlmp_register_client(hints, ircomm_tty_discovery_indication, NULL, (void *) self); /* If already done, no need to do it again */ if (self->obj) return; if (self->service_type & IRCOMM_3_WIRE_RAW) { /* Register IrLPT with LM-IAS */ self->obj = irias_new_object("IrLPT", IAS_IRLPT_ID); irias_add_integer_attrib(self->obj, "IrDA:IrLMP:LsapSel", self->slsap_sel, IAS_KERNEL_ATTR); } else { /* Register IrCOMM with LM-IAS */ self->obj = irias_new_object("IrDA:IrCOMM", IAS_IRCOMM_ID); irias_add_integer_attrib(self->obj, "IrDA:TinyTP:LsapSel", self->slsap_sel, IAS_KERNEL_ATTR); /* Code the parameters into the buffer */ irda_param_pack(oct_seq, "bbbbbb", IRCOMM_SERVICE_TYPE, 1, self->service_type, IRCOMM_PORT_TYPE, 1, IRCOMM_SERIAL); /* Register parameters with LM-IAS */ irias_add_octseq_attrib(self->obj, "Parameters", oct_seq, 6, IAS_KERNEL_ATTR); } irias_insert_object(self->obj); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git15268.78%250.00%
jean tourrilhesjean tourrilhes6931.22%250.00%
Total221100.00%4100.00%

/* * Function ircomm_tty_ias_unregister (self) * * Remove our IAS object and client hook while connected. * */
static void ircomm_tty_ias_unregister(struct ircomm_tty_cb *self) { /* Remove LM-IAS object now so it is not reused. * IrCOMM deals very poorly with multiple incoming connections. * It should looks a lot more like IrNET, and "dup" a server TSAP * to the application TSAP (based on various rules). * This is a cheap workaround allowing multiple clients to * connect to us. It will not always work. * Each IrCOMM socket has an IAS entry. Incoming connection will * pick the first one found. So, when we are fully connected, * we remove our IAS entries so that the next IAS entry is used. * We do that for *both* client and server, because a server * can also create client instances. * Jean II */ if (self->obj) { irias_delete_object(self->obj); self->obj = NULL; } #if 0 /* Remove discovery handler. * While we are connected, we no longer need to receive * discovery events. This would be the case if there is * multiple IrLAP interfaces. Jean II */ if (self->ckey) { irlmp_unregister_client(self->ckey); self->ckey = NULL; } #endif }

Contributors

PersonTokensPropCommitsCommitProp
jean tourrilhesjean tourrilhes2972.50%150.00%
pre-gitpre-git1127.50%150.00%
Total40100.00%2100.00%

/* * Function ircomm_send_initial_parameters (self) * * Send initial parameters to the remote IrCOMM device. These parameters * must be sent before any data. */
int ircomm_tty_send_initial_parameters(struct ircomm_tty_cb *self) { IRDA_ASSERT(self != NULL, return -1;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); if (self->service_type & IRCOMM_3_WIRE_RAW) return 0; /* * Set default values, but only if the application for some reason * haven't set them already */ pr_debug("%s(), data-rate = %d\n", __func__ , self->settings.data_rate); if (!self->settings.data_rate) self->settings.data_rate = 9600; pr_debug("%s(), data-format = %d\n", __func__ , self->settings.data_format); if (!self->settings.data_format) self->settings.data_format = IRCOMM_WSIZE_8; /* 8N1 */ pr_debug("%s(), flow-control = %d\n", __func__ , self->settings.flow_control); /*self->settings.flow_control = IRCOMM_RTS_CTS_IN|IRCOMM_RTS_CTS_OUT;*/ /* Do not set delta values for the initial parameters */ self->settings.dte = IRCOMM_DTR | IRCOMM_RTS; /* Only send service type parameter when we are the client */ if (self->client) ircomm_param_request(self, IRCOMM_SERVICE_TYPE, FALSE); ircomm_param_request(self, IRCOMM_DATA_RATE, FALSE); ircomm_param_request(self, IRCOMM_DATA_FORMAT, FALSE); /* For a 3 wire service, we just flush the last parameter and return */ if (self->settings.service_type == IRCOMM_3_WIRE) { ircomm_param_request(self, IRCOMM_FLOW_CONTROL, TRUE); return 0; } /* Only 9-wire service types continue here */ ircomm_param_request(self, IRCOMM_FLOW_CONTROL, FALSE); #if 0 ircomm_param_request(self, IRCOMM_XON_XOFF, FALSE); ircomm_param_request(self, IRCOMM_ENQ_ACK, FALSE); #endif /* Notify peer that we are ready to receive data */ ircomm_param_request(self, IRCOMM_DTE, TRUE); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git19992.99%444.44%
jean tourrilhesjean tourrilhes83.74%222.22%
harvey harrisonharvey harrison31.40%111.11%
joe perchesjoe perches31.40%111.11%
hideaki yoshifujihideaki yoshifuji10.47%111.11%
Total214100.00%9100.00%

/* * Function ircomm_tty_discovery_indication (discovery) * * Remote device is discovered, try query the remote IAS to see which * device it is, and which services it has. * */
static void ircomm_tty_discovery_indication(discinfo_t *discovery, DISCOVERY_MODE mode, void *priv) { struct ircomm_tty_cb *self; struct ircomm_tty_info info; /* Important note : * We need to drop all passive discoveries. * The LSAP management of IrComm is deficient and doesn't deal * with the case of two instance connecting to each other * simultaneously (it will deadlock in LMP). * The proper fix would be to use the same technique as in IrNET, * to have one server socket and separate instances for the * connecting/connected socket. * The workaround is to drop passive discovery, which drastically * reduce the probability of this happening. * Jean II */ if(mode == DISCOVERY_PASSIVE) return; info.daddr = discovery->daddr; info.saddr = discovery->saddr; self = priv; ircomm_tty_do_event(self, IRCOMM_TTY_DISCOVERY_INDICATION, NULL, &info); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git5380.30%240.00%
jean tourrilhesjean tourrilhes1218.18%240.00%
ryan readingryan reading11.52%120.00%
Total66100.00%5100.00%

/* * Function ircomm_tty_disconnect_indication (instance, sap, reason, skb) * * Link disconnected * */
void ircomm_tty_disconnect_indication(void *instance, void *sap, LM_REASON reason, struct sk_buff *skb) { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; struct tty_struct *tty; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); tty = tty_port_tty_get(&self->port); if (!tty) return; /* This will stop control data transfers */ self->flow = FLOW_STOP; /* Stop data transfers */ tty->hw_stopped = 1; ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL, NULL); tty_kref_put(tty); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git7677.55%250.00%
jiri slabyjiri slaby2020.41%125.00%
jean tourrilhesjean tourrilhes22.04%125.00%
Total98100.00%4100.00%

/* * Function ircomm_tty_getvalue_confirm (result, obj_id, value, priv) * * Got result from the IAS query we make * */
static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id, struct ias_value *value, void *priv) { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) priv; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); /* We probably don't need to make any more queries */ iriap_close(self->iriap); self->iriap = NULL; /* Check if request succeeded */ if (result != IAS_SUCCESS) { pr_debug("%s(), got NULL value!\n", __func__); return; } switch (value->type) { case IAS_OCT_SEQ: pr_debug("%s(), got octet sequence\n", __func__); irda_param_extract_all(self, value->t.oct_seq, value->len, &ircomm_param_info); ircomm_tty_do_event(self, IRCOMM_TTY_GOT_PARAMETERS, NULL, NULL); break; case IAS_INTEGER: /* Got LSAP selector */ pr_debug("%s(), got lsapsel = %d\n", __func__ , value->t.integer); if (value->t.integer == -1) { pr_debug("%s(), invalid value!\n", __func__); } else self->dlsap_sel = value->t.integer; ircomm_tty_do_event(self, IRCOMM_TTY_GOT_LSAPSEL, NULL, NULL); break; case IAS_MISSING: pr_debug("%s(), got IAS_MISSING\n", __func__); break; default: pr_debug("%s(), got unknown type!\n", __func__); break; } irias_delete_value(value); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git18587.68%342.86%
jean tourrilhesjean tourrilhes146.64%228.57%
harvey harrisonharvey harrison62.84%114.29%
joe perchesjoe perches62.84%114.29%
Total211100.00%7100.00%

/* * Function ircomm_tty_connect_confirm (instance, sap, qos, max_sdu_size, skb) * * Connection confirmed * */
void ircomm_tty_connect_confirm(void *instance, void *sap, struct qos_info *qos, __u32 max_data_size, __u8 max_header_size, struct sk_buff *skb) { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); self->client = TRUE; self->max_data_size = max_data_size; self->max_header_size = max_header_size; self->flow = FLOW_START; ircomm_tty_do_event(self, IRCOMM_TTY_CONNECT_CONFIRM, NULL, NULL); /* No need to kfree_skb - see ircomm_ttp_connect_confirm() */ }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git8896.70%250.00%
jean tourrilhesjean tourrilhes33.30%250.00%
Total91100.00%4100.00%

/* * Function ircomm_tty_connect_indication (instance, sap, qos, max_sdu_size, * skb) * * we are discovered and being requested to connect by remote device ! * */
void ircomm_tty_connect_indication(void *instance, void *sap, struct qos_info *qos, __u32 max_data_size, __u8 max_header_size, struct sk_buff *skb) { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; int clen; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); self->client = FALSE; self->max_data_size = max_data_size; self->max_header_size = max_header_size; self->flow = FLOW_START; clen = skb->data[0]; if (clen) irda_param_extract_all(self, skb->data+1, IRDA_MIN(skb->len, clen), &ircomm_param_info); ircomm_tty_do_event(self, IRCOMM_TTY_CONNECT_INDICATION, NULL, NULL); /* No need to kfree_skb - see ircomm_ttp_connect_indication() */ }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git12797.69%360.00%
jean tourrilhesjean tourrilhes32.31%240.00%
Total130100.00%5100.00%

/* * Function ircomm_tty_link_established (self) * * Called when the IrCOMM link is established * */
void ircomm_tty_link_established(struct ircomm_tty_cb *self) { struct tty_struct *tty; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); tty = tty_port_tty_get(&self->port); if (!tty) return; del_timer(&self->watchdog_timer); /* * IrCOMM link is now up, and if we are not using hardware * flow-control, then declare the hardware as running. Otherwise we * will have to wait for the peer device (DCE) to raise the CTS * line. */ if (tty_port_cts_enabled(&self->port) && ((self->settings.dce & IRCOMM_CTS) == 0)) { pr_debug("%s(), waiting for CTS ...\n", __func__); goto put; } else { pr_debug("%s(), starting hardware!\n", __func__); tty->hw_stopped = 0; /* Wake up processes blocked on open */ wake_up_interruptible(&self->port.open_wait); } schedule_work(&self->tqueue); put: tty_kref_put(tty); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git7456.06%321.43%
jiri slabyjiri slaby2821.21%321.43%
linus torvaldslinus torvalds1410.61%17.14%
jean tourrilhesjean tourrilhes64.55%214.29%
huang shijiehuang shijie43.03%17.14%
harvey harrisonharvey harrison21.52%17.14%
joe perchesjoe perches21.52%17.14%
hideaki yoshifujihideaki yoshifuji10.76%17.14%
ingo molnaringo molnar10.76%17.14%
Total132100.00%14100.00%

/* * Function ircomm_tty_start_watchdog_timer (self, timeout) * * Start the watchdog timer. This timer is used to make sure that any * connection attempt is successful, and if not, we will retry after * the timeout */
static void ircomm_tty_start_watchdog_timer(struct ircomm_tty_cb *self, int timeout) { IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); irda_start_timer(&self->watchdog_timer, timeout, (void *) self, ircomm_tty_watchdog_timer_expired); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4393.48%250.00%
jean tourrilhesjean tourrilhes24.35%125.00%
adrian bunkadrian bunk12.17%125.00%
Total46100.00%4100.00%

/* * Function ircomm_tty_watchdog_timer_expired (data) * * Called when the connect procedure have taken to much time. * */
static void ircomm_tty_watchdog_timer_expired(void *data) { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) data; IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); ircomm_tty_do_event(self, IRCOMM_TTY_WD_TIMER_EXPIRED, NULL, NULL); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4493.62%133.33%
jean tourrilhesjean tourrilhes24.26%133.33%
adrian bunkadrian bunk12.13%133.33%
Total47100.00%3100.00%

/* * Function ircomm_tty_do_event (self, event, skb) * * Process event * */
int ircomm_tty_do_event(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, struct sk_buff *skb, struct ircomm_tty_info *info) { IRDA_ASSERT(self != NULL, return -1;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); pr_debug("%s: state=%s, event=%s\n", __func__ , ircomm_tty_state[self->state], ircomm_tty_event[event]); return (*state[self->state])(self, event, skb, info); }

Contributors

PersonTokensPropCommitsCommitProp
jean tourrilhesjean tourrilhes7897.50%250.00%
joe perchesjoe perches11.25%125.00%
harvey harrisonharvey harrison11.25%125.00%
Total80100.00%4100.00%

/* * Function ircomm_tty_next_state (self, state) * * Switch state * */
static inline void ircomm_tty_next_state(struct ircomm_tty_cb *self, IRCOMM_TTY_STATE state) { /* IRDA_ASSERT(self != NULL, return;); IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); pr_debug("%s: next state=%s, service type=%d\n", __func__ , ircomm_tty_state[self->state], self->service_type); */ self->state = state; }

Contributors

PersonTokensPropCommitsCommitProp
jean tourrilhesjean tourrilhes2195.45%150.00%
joe perchesjoe perches14.55%150.00%
Total22100.00%2100.00%

/* * Function ircomm_tty_state_idle (self, event, skb, info) * * Just hanging around * */
static int ircomm_tty_state_idle(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, struct sk_buff *skb, struct ircomm_tty_info *info) { int ret = 0; pr_debug("%s: state=%s, event=%s\n", __func__ , ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { case IRCOMM_TTY_ATTACH_CABLE: /* Try to discover any remote devices */ ircomm_tty_start_watchdog_timer(self, 3*HZ); ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); irlmp_discovery_request(DISCOVERY_DEFAULT_SLOTS); break; case IRCOMM_TTY_DISCOVERY_INDICATION: self->daddr = info->daddr; self->saddr = info->saddr; if (self->iriap) { net_warn_ratelimited("%s(), busy with a previous query\n", __func__); return -EBUSY; } self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self, ircomm_tty_getvalue_confirm); iriap_getvaluebyclass_request(self->iriap, self->saddr, self->daddr, "IrDA:IrCOMM", "Parameters"); ircomm_tty_start_watchdog_timer(self, 3*HZ); ircomm_tty_next_state(self, IRCOMM_TTY_QUERY_PARAMETERS); break; case IRCOMM_TTY_CONNECT_INDICATION: del_timer(&self->watchdog_timer); /* Accept connection */ ircomm_connect_response(self->ircomm, NULL); ircomm_tty_next_state(self, IRCOMM_TTY_READY); break; case IRCOMM_TTY_WD_TIMER_EXPIRED: /* Just stay idle */ break; case IRCOMM_TTY_DETACH_CABLE: ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: pr_debug("%s(), unknown event: %s\n", __func__ , ircomm_tty_event[event]); ret = -EINVAL; } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git22093.62%333.33%
jean tourrilhesjean tourrilhes72.98%222.22%
joe perchesjoe perches31.28%222.22%
harvey harrisonharvey harrison31.28%111.11%
jeff garzikjeff garzik20.85%111.11%
Total235100.00%9100.00%

/* * Function ircomm_tty_state_search (self, event, skb, info) * * Trying to discover an IrCOMM device * */
static int ircomm_tty_state_search(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, struct sk_buff *skb, struct ircomm_tty_info *info) { int ret = 0; pr_debug("%s: state=%s, event=%s\n", __func__ , ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { case IRCOMM_TTY_DISCOVERY_INDICATION: self->daddr = info->daddr; self->saddr = info->saddr; if (self->iriap) { net_warn_ratelimited("%s(), busy with a previous query\n", __func__); return -EBUSY; } self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self, ircomm_tty_getvalue_confirm); if (self->service_type == IRCOMM_3_WIRE_RAW) { iriap_getvaluebyclass_request(self->iriap, self->saddr, self->daddr, "IrLPT", "IrDA:IrLMP:LsapSel"); ircomm_tty_next_state(self, IRCOMM_TTY_QUERY_LSAP_SEL); } else { iriap_getvaluebyclass_request(self->iriap, self->saddr, self->daddr, "IrDA:IrCOMM", "Parameters"); ircomm_tty_next_state(self, IRCOMM_TTY_QUERY_PARAMETERS); } ircomm_tty_start_watchdog_timer(self, 3*HZ); break; case IRCOMM_TTY_CONNECT_INDICATION: del_timer(&self->watchdog_timer); ircomm_tty_ias_unregister(self); /* Accept connection */ ircomm_connect_response(self->ircomm, NULL); ircomm_tty_next_state(self, IRCOMM_TTY_READY); break; case IRCOMM_TTY_WD_TIMER_EXPIRED: #if 1 /* Give up */ #else /* Try to discover any remote devices */ ircomm_tty_start_watchdog_timer(self, 3*HZ); irlmp_discovery_request(DISCOVERY_DEFAULT_SLOTS); #endif break; case IRCOMM_TTY_DETACH_CABLE: ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: pr_debug("%s(), unknown event: %s\n", __func__ , ircomm_tty_event[event]); ret = -EINVAL; } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git25592.73%436.36%
jean tourrilhesjean tourrilhes124.36%327.27%
harvey harrisonharvey harrison31.09%19.09%
joe perchesjoe perches31.09%218.18%
jeff garzikjeff garzik20.73%19.09%
Total275100.00%11100.00%

/* * Function ircomm_tty_state_query (self, event, skb, info) * * Querying the remote LM-IAS for IrCOMM parameters * */
static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, struct sk_buff *skb, struct ircomm_tty_info *info) { int ret = 0; pr_debug("%s: state=%s, event=%s\n", __func__ , ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { case IRCOMM_TTY_GOT_PARAMETERS: if (self->iriap) { net_warn_ratelimited("%s(), busy with a previous query\n", __func__); return -EBUSY; } self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self, ircomm_tty_getvalue_confirm); iriap_getvaluebyclass_request(self->iriap, self->saddr, self->daddr, "IrDA:IrCOMM", "IrDA:TinyTP:LsapSel"); ircomm_tty_start_watchdog_timer(self, 3*HZ); ircomm_tty_next_state(self, IRCOMM_TTY_QUERY_LSAP_SEL); break; case IRCOMM_TTY_WD_TIMER_EXPIRED: /* Go back to search mode */ ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); ircomm_tty_start_watchdog_timer(self, 3*HZ); break; case IRCOMM_TTY_CONNECT_INDICATION: del_timer(&self->watchdog_timer); ircomm_tty_ias_unregister(self); /* Accept connection */ ircomm_connect_response(self->ircomm, NULL); ircomm_tty_next_state(self, IRCOMM_TTY_READY); break; case IRCOMM_TTY_DETACH_CABLE: ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: pr_debug("%s(), unknown event: %s\n", __func__ , ircomm_tty_event[event]); ret = -EINVAL; } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git19490.65%330.00%
jean tourrilhesjean tourrilhes125.61%330.00%
harvey harrisonharvey harrison31.40%110.00%
joe perchesjoe perches31.40%220.00%
jeff garzikjeff garzik20.93%110.00%
Total214100.00%10100.00%

/* * Function ircomm_tty_state_query_lsap_sel (self, event, skb, info) * * Query remote LM-IAS for the LSAP selector which we can connect to * */
static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, struct sk_buff *skb, struct ircomm_tty_info *info) { int ret = 0; pr_debug("%s: state=%s, event=%s\n", __func__ , ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { case IRCOMM_TTY_GOT_LSAPSEL: /* Connect to remote device */ ret = ircomm_connect_request(self->ircomm, self->dlsap_sel, self->saddr, self->daddr, NULL, self->service_type); ircomm_tty_start_watchdog_timer(self, 3*HZ); ircomm_tty_next_state(self, IRCOMM_TTY_SETUP); break; case IRCOMM_TTY_WD_TIMER_EXPIRED: /* Go back to search mode */ ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); ircomm_tty_start_watchdog_timer(self, 3*HZ); break; case IRCOMM_TTY_CONNECT_INDICATION: del_timer(&self->watchdog_timer); ircomm_tty_ias_unregister(self); /* Accept connection */ ircomm_connect_response(self->ircomm, NULL); ircomm_tty_next_state(self, IRCOMM_TTY_READY); break; case IRCOMM_TTY_DETACH_CABLE: ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: pr_debug("%s(), unknown event: %s\n", __func__ , ircomm_tty_event[event]); ret = -EINVAL; } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git17391.53%228.57%
jean tourrilhesjean tourrilhes126.35%342.86%
harvey harrisonharvey harrison21.06%114.29%
joe perchesjoe perches21.06%114.29%
Total189100.00%7100.00%

/* * Function ircomm_tty_state_setup (self, event, skb, info) * * Trying to connect * */
static int ircomm_tty_state_setup(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, struct sk_buff *skb, struct ircomm_tty_info *info) { int ret = 0; pr_debug("%s: state=%s, event=%s\n", __func__ , ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { case IRCOMM_TTY_CONNECT_CONFIRM: del_timer(&self->watchdog_timer); ircomm_tty_ias_unregister(self); /* * Send initial parameters. This will also send out queued * parameters waiting for the connection to come up */ ircomm_tty_send_initial_parameters(self); ircomm_tty_link_established(self); ircomm_tty_next_state(self, IRCOMM_TTY_READY); break; case IRCOMM_TTY_CONNECT_INDICATION: del_timer(&self->watchdog_timer); ircomm_tty_ias_unregister(self); /* Accept connection */ ircomm_connect_response(self->ircomm, NULL); ircomm_tty_next_state(self, IRCOMM_TTY_READY); break; case IRCOMM_TTY_WD_TIMER_EXPIRED: /* Go back to search mode */ ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); ircomm_tty_start_watchdog_timer(self, 3*HZ); break; case IRCOMM_TTY_DETACH_CABLE: /* ircomm_disconnect_request(self->ircomm, NULL); */ ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: pr_debug("%s(), unknown event: %s\n", __func__ , ircomm_tty_event[event]); ret = -EINVAL; } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git15285.88%333.33%
jean tourrilhesjean tourrilhes2011.30%333.33%
harvey harrisonharvey harrison21.13%111.11%
joe perchesjoe perches21.13%111.11%
hideaki yoshifujihideaki yoshifuji10.56%111.11%
Total177100.00%9100.00%

/* * Function ircomm_tty_state_ready (self, event, skb, info) * * IrCOMM is now connected * */
static int ircomm_tty_state_ready(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event, struct sk_buff *skb, struct ircomm_tty_info *info) { int ret = 0; switch (event) { case IRCOMM_TTY_DATA_REQUEST: ret = ircomm_data_request(self->ircomm, skb); break; case IRCOMM_TTY_DETACH_CABLE: ircomm_disconnect_request(self->ircomm, NULL); ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; case IRCOMM_TTY_DISCONNECT_INDICATION: ircomm_tty_ias_register(self); ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH); ircomm_tty_start_watchdog_timer(self, 3*HZ); if (tty_port_check_carrier(&self->port)) { /* Drop carrier */ self->settings.dce = IRCOMM_DELTA_CD; ircomm_tty_check_modem_status(self); } else { pr_debug("%s(), hanging up!\n", __func__); tty_port_tty_hangup(&self->port, false); } break; default: pr_debug("%s(), unknown event: %s\n", __func__ , ircomm_tty_event[event]); ret = -EINVAL; } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git13080.25%325.00%
jean tourrilhesjean tourrilhes127.41%325.00%
jiri slabyjiri slaby127.41%325.00%
peter hurleypeter hurley42.47%18.33%
harvey harrisonharvey harrison21.23%18.33%
joe perchesjoe perches21.23%18.33%
Total162100.00%12100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git273183.03%619.35%
jean tourrilhesjean tourrilhes36711.16%619.35%
jiri slabyjiri slaby842.55%412.90%
joe perchesjoe perches300.91%39.68%
harvey harrisonharvey harrison280.85%13.23%
linus torvaldslinus torvalds140.43%13.23%
jeff garzikjeff garzik60.18%13.23%
hideaki yoshifujihideaki yoshifuji60.18%13.23%
adrian bunkadrian bunk50.15%13.23%
jan engelhardtjan engelhardt40.12%13.23%
huang shijiehuang shijie40.12%13.23%
peter hurleypeter hurley40.12%13.23%
alexey dobriyanalexey dobriyan30.09%13.23%
ingo molnaringo molnar10.03%13.23%
ryan readingryan reading10.03%13.23%
jeff kirsherjeff kirsher10.03%13.23%
Total3289100.00%31100.00%
Directory: net/irda/ircomm
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.