Commit ee105769 authored by Stephen Hemminger's avatar Stephen Hemminger

[IRDA]: Fix irtty line disc and module semantics.

The irda tty line discipline does not handle the new module
paradigm well.  This patch fixes that:
- initialize line discipline as data, not with code
- set module owner
- make prototype for irtty_ioctl match expected
  arguments from tty discipline
- get rid of explicit MOD_INC/MOD_DEC
parent 9d4d51cc
...@@ -39,8 +39,6 @@ ...@@ -39,8 +39,6 @@
#include <net/irda/wrapper.h> #include <net/irda/wrapper.h>
#include <net/irda/irda_device.h> #include <net/irda/irda_device.h>
static struct tty_ldisc irda_ldisc;
static int qos_mtt_bits = 0x03; /* 5 ms or more */ static int qos_mtt_bits = 0x03; /* 5 ms or more */
/* Network device fuction prototypes */ /* Network device fuction prototypes */
...@@ -54,7 +52,8 @@ static struct net_device_stats *irtty_net_get_stats(struct net_device *dev); ...@@ -54,7 +52,8 @@ static struct net_device_stats *irtty_net_get_stats(struct net_device *dev);
/* Line discipline function prototypes */ /* Line discipline function prototypes */
static int irtty_open(struct tty_struct *tty); static int irtty_open(struct tty_struct *tty);
static void irtty_close(struct tty_struct *tty); static void irtty_close(struct tty_struct *tty);
static int irtty_ioctl(struct tty_struct *, void *, int, void *); static int irtty_ioctl(struct tty_struct *, struct file *,
unsigned int, unsigned long);
static int irtty_receive_room(struct tty_struct *tty); static int irtty_receive_room(struct tty_struct *tty);
static void irtty_write_wakeup(struct tty_struct *tty); static void irtty_write_wakeup(struct tty_struct *tty);
static void irtty_receive_buf(struct tty_struct *, const unsigned char *, static void irtty_receive_buf(struct tty_struct *, const unsigned char *,
...@@ -68,29 +67,22 @@ static int irtty_raw_read(struct net_device *dev, __u8 *buf, int len); ...@@ -68,29 +67,22 @@ static int irtty_raw_read(struct net_device *dev, __u8 *buf, int len);
static int irtty_set_mode(struct net_device *dev, int mode); static int irtty_set_mode(struct net_device *dev, int mode);
static int irtty_change_speed(struct irda_task *task); static int irtty_change_speed(struct irda_task *task);
char *driver_name = "irtty"; static struct tty_ldisc irda_ldisc = {
.owner = THIS_MODULE,
.magic = TTY_LDISC_MAGIC,
.name = "irda",
.open = irtty_open,
.close = irtty_close,
.ioctl = irtty_ioctl,
.receive_buf = irtty_receive_buf,
.receive_room = irtty_receive_room,
.write_wakeup = irtty_write_wakeup,
};
int __init irtty_init(void) int __init irtty_init(void)
{ {
int status; int status;
/* Fill in our line protocol discipline, and register it */
memset(&irda_ldisc, 0, sizeof( irda_ldisc));
irda_ldisc.magic = TTY_LDISC_MAGIC;
irda_ldisc.name = "irda";
irda_ldisc.flags = 0;
irda_ldisc.open = irtty_open;
irda_ldisc.close = irtty_close;
irda_ldisc.read = NULL;
irda_ldisc.write = NULL;
irda_ldisc.ioctl = (int (*)(struct tty_struct *, struct file *,
unsigned int, unsigned long)) irtty_ioctl;
irda_ldisc.poll = NULL;
irda_ldisc.receive_buf = irtty_receive_buf;
irda_ldisc.receive_room = irtty_receive_room;
irda_ldisc.write_wakeup = irtty_write_wakeup;
if ((status = tty_register_ldisc(N_IRDA, &irda_ldisc)) != 0) { if ((status = tty_register_ldisc(N_IRDA, &irda_ldisc)) != 0) {
ERROR("IrDA: can't register line discipline (err = %d)\n", ERROR("IrDA: can't register line discipline (err = %d)\n",
status); status);
...@@ -234,8 +226,6 @@ static int irtty_open(struct tty_struct *tty) ...@@ -234,8 +226,6 @@ static int irtty_open(struct tty_struct *tty)
MESSAGE("IrDA: Registered device %s\n", dev->name); MESSAGE("IrDA: Registered device %s\n", dev->name);
MOD_INC_USE_COUNT;
return 0; return 0;
} }
...@@ -286,8 +276,6 @@ static void irtty_close(struct tty_struct *tty) ...@@ -286,8 +276,6 @@ static void irtty_close(struct tty_struct *tty)
spin_unlock_irqrestore(&self->lock, flags); spin_unlock_irqrestore(&self->lock, flags);
kfree(self); kfree(self);
MOD_DEC_USE_COUNT;
} }
/* /*
...@@ -468,7 +456,8 @@ static int irtty_change_speed(struct irda_task *task) ...@@ -468,7 +456,8 @@ static int irtty_change_speed(struct irda_task *task)
* The Swiss army knife of system calls :-) * The Swiss army knife of system calls :-)
* *
*/ */
static int irtty_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg) static int irtty_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg)
{ {
dongle_t *dongle; dongle_t *dongle;
struct irtty_info info; struct irtty_info info;
...@@ -492,8 +481,7 @@ static int irtty_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg) ...@@ -492,8 +481,7 @@ static int irtty_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
case TCGETS: case TCGETS:
case TCGETA: case TCGETA:
/* Unsure about locking here, to check - Jean II */ /* Unsure about locking here, to check - Jean II */
return n_tty_ioctl(tty, (struct file *) file, cmd, return n_tty_ioctl(tty, (struct file *) file, cmd, arg);
(unsigned long) arg);
break; break;
case IRTTY_IOCTDONGLE: case IRTTY_IOCTDONGLE:
/* Initialize dongle */ /* Initialize dongle */
...@@ -524,7 +512,7 @@ static int irtty_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg) ...@@ -524,7 +512,7 @@ static int irtty_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
memset(&info, 0, sizeof(struct irtty_info)); memset(&info, 0, sizeof(struct irtty_info));
strncpy(info.name, self->netdev->name, 5); strncpy(info.name, self->netdev->name, 5);
if (copy_to_user(arg, &info, sizeof(struct irtty_info))) if (copy_to_user((void *) arg, &info, sizeof(struct irtty_info)))
return -EFAULT; return -EFAULT;
break; break;
default: default:
...@@ -941,8 +929,6 @@ static int irtty_net_open(struct net_device *dev) ...@@ -941,8 +929,6 @@ static int irtty_net_open(struct net_device *dev)
*/ */
self->irlap = irlap_open(dev, &self->qos, hwname); self->irlap = irlap_open(dev, &self->qos, hwname);
MOD_INC_USE_COUNT;
return 0; return 0;
} }
...@@ -964,8 +950,6 @@ static int irtty_net_close(struct net_device *dev) ...@@ -964,8 +950,6 @@ static int irtty_net_close(struct net_device *dev)
irlap_close(self->irlap); irlap_close(self->irlap);
self->irlap = NULL; self->irlap = NULL;
MOD_DEC_USE_COUNT;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment