patch-2.3.16 linux/net/irda/irlpt/irlpt_common.c
Next file: linux/net/irda/irlpt/irlpt_srvr.c
Previous file: linux/net/irda/irlpt/irlpt_cli_fsm.c
Back to the patch index
Back to the overall index
- Lines: 510
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.3.15/linux/net/irda/irlpt/irlpt_common.c
- Orig date:
Sun May 30 10:27:04 1999
diff -u --recursive --new-file v2.3.15/linux/net/irda/irlpt/irlpt_common.c linux/net/irda/irlpt/irlpt_common.c
@@ -1,509 +0,0 @@
-/*********************************************************************
- *
- * Filename: irlpt_common.c
- * Version:
- * Description:
- * Status: Experimental.
- * Author: Thomas Davis, <ratbert@radiks.net>
- * Created at: Sat Feb 21 18:54:38 1998
- * Modified at: Sun Mar 8 23:44:19 1998
- * Modified by: Dag Brattli <dagb@cs.uit.no>
- * Sources: irlpt.c
- *
- * Copyright (c) 1998, Thomas Davis, <ratbert@radiks.net>,
- * Copyright (c) 1998, Dag Brattli, <dagb@cs.uit.no>
- * All Rights Reserved.
- *
- * 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.
- *
- * I, Thomas Davis, provide no warranty for any of this software.
- * This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-#include <linux/module.h>
-
-#include <asm/segment.h>
-
-#include <net/irda/irda.h>
-#include <net/irda/irlap.h>
-#include <net/irda/irlmp.h>
-#include <net/irda/iriap.h>
-#include <net/irda/irttp.h>
-#include <net/irda/timer.h>
-
-#include <net/irda/irlpt_common.h>
-/* #include "irlpt_client.h" */
-/* #include "irlpt_server.h" */
-
-#include <asm/uaccess.h>
-#include <linux/miscdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/fs.h>
-
-char *irlpt_service_type[] = {
- "IRLPT_UNKNOWN",
- "IRLPT_THREE_WIRE_RAW",
- "IRLPT_THREE_WIRE",
- "IRLPT_NINE_WIRE",
- "IRLPT_CENTRONICS",
- "IRLPT_SERVER_MODE",
-};
-
-char *irlpt_port_type[] = {
- "IRLPT_UNKNOWN",
- "IRLPT_SERIAL",
- "IRLPT_PARALLEL",
-};
-
-char *irlpt_connected[] = {
- "IRLPT_DISCONNECTED",
- "IRLPT_WAITING",
- "IRLPT_CONNECTED",
- "IRLPT_FLUSHED",
-};
-
-char *irlpt_reasons[] = {
- "SERVICE_CLOSE", /* Service has closed the connection */
- "DISC_INDICATION", /* Received disconnect request from peer entity*/
- "NO_RESPONSE", /* To many retransmits without response */
- "DEADLOCK_DETECTED", /* To many retransmits _with_ response */
- "FOUND_NONE", /* No devices were discovered */
- "MEDIA_BUSY",
-
-};
-
-char *irlpt_client_fsm_state[] = {
- "IRLPT_CLIENT_IDLE",
- "IRLPT_CLIENT_QUERY",
- "IRLPT_CLIENT_READY",
- "IRLPT_CLIENT_WAITI",
- "IRLPT_CLIENT_CONN"
-};
-
-char *irlpt_server_fsm_state[] = {
- "IRLPT_SERVER_IDLE",
- "IRLPT_SERVER_CONN"
-};
-
-char *irlpt_fsm_event[] = {
- "QUERY_REMOTE_IAS",
- "IAS_PROVIDER_AVAIL",
- "IAS_PROVIDER_NOT_AVAIL",
- "LAP_DISCONNECT",
- "LMP_CONNECT",
- "LMP_DISCONNECT",
- "LMP_CONNECT_INDICATION",
- "LMP_DISCONNECT_INDICATION",
- "IRLPT_DISCOVERY_INDICATION",
- "IRLPT_CONNECT_REQUEST",
- "IRLPT_DISCONNECT_REQUEST",
- "CLIENT_DATA_INDICATION",
-};
-
-hashbin_t *irlpt_clients = NULL;
-struct irlpt_cb *irlpt_server = NULL;
-int irlpt_common_debug = 4; /* want to change this? please don't!
- use irlpt_common_debug=3 on the
- command line! */
-
-#if 0
-static char *rcsid = "$Id: irlpt_common.c,v 1.6 1998/11/10 22:50:58 dagb Exp $";
-#endif
-
-struct irlpt_cb *irlpt_find_handle(unsigned int minor)
-{
- struct irlpt_cb *self;
-
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- /* Check for server */
- if (irlpt_server != NULL && irlpt_server->ir_dev.minor == minor) {
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": irlpt_server file handle!\n");
- return irlpt_server;
- }
-
- /* Check the clients */
- self = (struct irlpt_cb *) hashbin_get_first( irlpt_clients);
- while ( self) {
- ASSERT( self->magic == IRLPT_MAGIC, return NULL;);
-
- if ( minor == self->ir_dev.minor)
- return self;
-
- self = (struct irlpt_cb *) hashbin_get_next( irlpt_clients);
- }
-
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
-
- return NULL;
-}
-
-ssize_t irlpt_read( struct file *file, char *buffer, size_t count, loff_t
- *noidea)
-{
- int len=0;
- char *ptr = buffer;
- struct irlpt_cb *self;
- struct sk_buff *skb = NULL;
-
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- self = irlpt_find_handle(MINOR( file->f_dentry->d_inode->i_rdev));
-
- ASSERT( self != NULL, return 0;);
- ASSERT( self->magic == IRLPT_MAGIC, return 0;);
-
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": count=%d, skb_len=%d, connected=%d (%s) eof=%d\n",
- count, skb_queue_len(&self->rx_queue), self->connected,
- irlpt_connected[self->connected], self->eof);
-
- if (self->eof && !skb_queue_len(&self->rx_queue)) {
- switch (self->eof) {
- case LM_USER_REQUEST:
- self->eof = FALSE;
- DEBUG(irlpt_common_debug,
- __FUNCTION__ ": returning 0\n");
- return 0;
- case LM_LAP_DISCONNECT:
- self->eof = FALSE;
- return 0;
- case LM_LAP_RESET:
- self->eof = FALSE;
- return -ECONNRESET;
- default:
- self->eof = FALSE;
- return -EIO;
- }
- }
-
- while (len <= count) {
- skb = skb_dequeue(&self->rx_queue);
-
- if (skb != NULL) {
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": len=%d, skb->len=%d, count=%d\n",
- len, (int) skb->len, count);
-
- if ((skb->len + len) < count) {
- copy_to_user(ptr, skb->data, skb->len);
- len += skb->len;
- ptr += skb->len;
-
- dev_kfree_skb( skb);
- } else {
- skb_queue_head(&self->rx_queue, skb);
- break;
- }
- } else {
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": skb=NULL, len=%d, count=%d, eof=%d\n",
- len, count, self->eof);
-
- if (!signal_pending(current) && !self->eof) {
- interruptible_sleep_on(&self->read_wait);
- } else
- break;
- }
- }
-
- DEBUG(irlpt_common_debug, __FUNCTION__ ": len=%d\n", len);
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
- return len;
-}
-
-ssize_t irlpt_write(struct file *file, const char *buffer,
- size_t count, loff_t *noidea)
-{
- struct irlpt_cb *self;
- struct sk_buff *skb;
-
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- self = irlpt_find_handle(MINOR( file->f_dentry->d_inode->i_rdev));
-
- ASSERT( self != NULL, return 0;);
- ASSERT( self->magic == IRLPT_MAGIC, return 0;);
-
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": count = %d\n", count);
-
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": pkt_count = %d\n", self->pkt_count);
- if (self->pkt_count > 8) {
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": too many outstanding buffers, going to sleep\n");
- interruptible_sleep_on(&self->write_wait);
- }
-
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": pkt_count = %d\n", self->pkt_count);
-
- if (self->state != IRLPT_CLIENT_CONN) {
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": state != IRLPT_CONN (possible link problems?)\n");
- return -ENOLINK;
- }
-
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": count = %d, max_data_size = %d, IRLPT_MAX_HEADER = %d\n",
- count, self->max_data_size, IRLPT_MAX_HEADER);
-
- if (count > self->max_data_size) {
- count = self->max_data_size;
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": setting count to %d\n", count);
- }
-
- DEBUG( irlpt_common_debug, __FUNCTION__ ": count = %d\n", count);
-
- skb = dev_alloc_skb(count + self->max_header_size);
- if ( skb == NULL) {
- printk( KERN_INFO
- __FUNCTION__ ": couldn't allocate skbuff!\n");
- return 0;
- }
-
- /*
- * we use the unused stamp field to hold the device minor
- * number, so we can look it up when the skb is destroyed.
- */
- *((__u32 *) &skb->stamp) = MINOR( file->f_dentry->d_inode->i_rdev);
-
- skb_reserve( skb, IRLPT_MAX_HEADER);
- skb_put( skb, count);
-
- skb->destructor = irlpt_flow_control;
- self->pkt_count++;
-
- copy_from_user( skb->data, buffer, count);
-
- irlmp_data_request(self->lsap, skb);
-
- irda_start_timer( &self->lpt_timer, 5000, (unsigned long) self,
- self->timeout);
-
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
-
- return(count);
-}
-
-loff_t irlpt_seek( struct file *file, loff_t offset, int count)
-{
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
- return -ESPIPE;
-}
-
-/*
- * Function irlpt_poll (file, wait)
- *
- *
- *
- */
-u_int irlpt_poll(struct file *file, poll_table *wait)
-{
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- /* check out /usr/src/pcmcia/modules/ds.c for an example */
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
- return 0;
-}
-
-/*
- * Function open_irlpt (inode, file)
- *
- *
- *
- */
-int irlpt_open(struct inode *inode, struct file *file)
-{
- struct irlpt_cb *self;
- struct irlpt_info info;
-
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- self = irlpt_find_handle(MINOR( file->f_dentry->d_inode->i_rdev));
-
- ASSERT( self != NULL, return -1;);
- ASSERT( self->magic == IRLPT_MAGIC, return -1;);
-
- if (self->count++) {
- DEBUG( irlpt_common_debug, __FUNCTION__
- ": count not zero; actual = %d\n", self->count);
- self->count--;
- return -EBUSY;
- }
-
- self->eof = FALSE;
-
- /* ok, now, if it's idle, try to get some information
- about the remote end, and sleep till we get totally connected.. */
-
- if ((self->servicetype != IRLPT_SERVER_MODE) &&
- self->state != IRLPT_CLIENT_CONN) {
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": self->state != IRLPT_CLIENT_CONN\n");
-
- info.daddr = self->daddr;
- info.saddr = self->saddr;
-
- if (self->do_event != NULL) {
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": doing a discovery..\n");
- self->do_event( self,
- IRLPT_DISCOVERY_INDICATION,
- NULL, &info);
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": sleeping until connected.\n");
- interruptible_sleep_on(&self->read_wait);
- }
- }
-
- /* at this point, if it's a client, we have a connection.
- * if it's the server, it's waiting for a connection.
- */
-
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
-
- return 0;
-}
-
-/*
- * Function close_irlpt (inode, file)
- *
- *
- *
- */
-int irlpt_close(struct inode *inode,
- struct file *file)
-{
- struct irlpt_cb *self;
- struct sk_buff *skb;
- struct irlpt_info info;
-
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- self = irlpt_find_handle(MINOR( file->f_dentry->d_inode->i_rdev));
-
- DEBUG(irlpt_common_debug, __FUNCTION__ ": have handle!\n");
-
- ASSERT( self != NULL, return -1;);
- ASSERT( self->magic == IRLPT_MAGIC, return -1;);
-
- DEBUG(irlpt_common_debug,
- __FUNCTION__ ": self->count=%d\n", self->count);
-
- if (self->count > 0)
- self->count--;
-
- while (self->pkt_count > 0) {
- interruptible_sleep_on(&self->write_wait);
- }
-
- /* all done, tear down the connection and wait for the next open */
- if ((self->servicetype != IRLPT_SERVER_MODE) &&
- self->state == IRLPT_CLIENT_CONN) {
- skb = dev_alloc_skb(64);
- if (skb == NULL) {
- DEBUG( 0, __FUNCTION__ "(: Could not allocate an "
- "sk_buff of length %d\n", 64);
- return 0;
- }
-
- skb_reserve( skb, LMP_MAX_HEADER);
- irlmp_disconnect_request(self->lsap, skb);
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": irlmp_close_slap(self->lsap)\n");
- irlmp_close_lsap(self->lsap);
- }
-
- info.daddr = self->daddr;
-
- if (self->do_event != NULL) {
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": closing connection..\n");
- self->do_event( self, LMP_DISCONNECT, NULL, &info);
- }
-
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
- return 0;
-}
-
-void irlpt_dump_buffer( struct sk_buff *skb)
-{
- int i;
-
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- for(i=0;i<skb->len;i++)
- if (skb->data[i] > 31 && skb->data[i] < 128) {
- printk("%c", skb->data[i]);
- } else {
- if (skb->data[i] == 0x0d) {
- printk("\n");
- } else {
- printk(".");
- }
- }
-
- printk("\n");
-
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
-}
-
-void irlpt_flow_control(struct sk_buff *skb)
-{
- struct irlpt_cb *self;
-
- DEBUG(irlpt_common_debug, "--> " __FUNCTION__ "\n");
-
- self = irlpt_find_handle( *((__u32 *) &skb->stamp));
-
- self->pkt_count--;
-
- ASSERT(self->pkt_count >= 0, return;);
-
- DEBUG(irlpt_common_debug, __FUNCTION__
- ": packet destroyed, count = %d\n", self->pkt_count);
-
- wake_up_interruptible( &self->write_wait);
-
- DEBUG(irlpt_common_debug, __FUNCTION__ " -->\n");
-}
-
-#ifdef MODULE
-
-MODULE_AUTHOR("Thomas Davis <ratbert@radiks.net>");
-MODULE_DESCRIPTION("The Linux IrDA/IrLPT common");
-MODULE_PARM(irlpt_common_debug,"1i");
-
-/*
- * Function init_module (void)
- *
- * Initialize the module, this function is called by the
- * modprobe(1) program.
- */
-int init_module(void)
-{
- return 0;
-}
-
-/*
- * Function cleanup_module (void)
- *
- * Remove the module, this function is called by the rmmod(1)
- * program
- */
-void cleanup_module(void)
-{
-
-}
-
-#endif /* MODULE */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)