#include <linux/tty_driver.h>
#include <linux/slab.h>
#include <linux/init.h>
+#include <linux/bitops.h>
#ifndef MODULE
#include <linux/ctype.h> /* We only need it for parsing the "digi="-line */
#include <asm/system.h>
#include <asm/io.h>
#include <asm/uaccess.h>
-#include <asm/bitops.h>
#include <asm/semaphore.h>
#define VERSION "1.6.3"
MODULE_AUTHOR("Bernhard Kaindl");
MODULE_DESCRIPTION("Digiboard PC/X{i,e,eve} driver");
MODULE_LICENSE("GPL");
-MODULE_PARM(verbose, "i");
-MODULE_PARM(debug, "i");
-MODULE_PARM(io, "1-4i");
-MODULE_PARM(membase, "1-4i");
-MODULE_PARM(memsize, "1-4i");
-MODULE_PARM(altpin, "1-4i");
-MODULE_PARM(numports, "1-4i");
+module_param(verbose, bool, 0644);
+module_param(debug, bool, 0644);
+module_param_array(io, int, NULL, 0);
+module_param_array(membase, int, NULL, 0);
+module_param_array(memsize, int, NULL, 0);
+module_param_array(altpin, int, NULL, 0);
+module_param_array(numports, int, NULL, 0);
#endif /* MODULE */
static void pcxe_close(struct tty_struct *, struct file *);
static int pcxe_ioctl(struct tty_struct *, struct file *, unsigned int, unsigned long);
static void pcxe_set_termios(struct tty_struct *, struct termios *);
-static int pcxe_write(struct tty_struct *, int, const unsigned char *, int);
+static int pcxe_write(struct tty_struct *, const unsigned char *, int);
static int pcxe_write_room(struct tty_struct *);
static int pcxe_chars_in_buffer(struct tty_struct *);
static void pcxe_flush_buffer(struct tty_struct *);
info->tty = NULL;
if(info->blocked_open) {
if(info->close_delay) {
- current->state = TASK_INTERRUPTIBLE;
- schedule_timeout(info->close_delay);
+ msleep_interruptible(jiffies_to_msecs(info->close_delay));
}
wake_up_interruptible(&info->open_wait);
}
-static int pcxe_write(struct tty_struct * tty, int from_user, const unsigned char *buf, int count)
+static int pcxe_write(struct tty_struct * tty, const unsigned char *buf, int count)
{
struct channel *ch;
volatile struct board_chan *bc;
bc = ch->brdchan;
size = ch->txbufsize;
- if (from_user) {
-
- down(&ch->tmp_buf_sem);
- save_flags(flags);
- cli();
- globalwinon(ch);
- head = bc->tin & (size - 1);
- /* It seems to be necessary to make sure that the value is stable here somehow
- This is a rather odd pice of code here. */
- do
- {
- tail = bc->tout;
- } while (tail != bc->tout);
-
- tail &= (size - 1);
- stlen = (head >= tail) ? (size - (head - tail) - 1) : (tail - head - 1);
- count = min(stlen, count);
- memoff(ch);
- restore_flags(flags);
-
- if (count)
- if (copy_from_user(ch->tmp_buf, buf, count))
- count = 0;
-
- buf = ch->tmp_buf;
- }
-
/*
* All data is now local
*/
memoff(ch);
restore_flags(flags);
- if(from_user)
- up(&ch->tmp_buf_sem);
-
return(total);
}
static void pcxe_put_char(struct tty_struct *tty, unsigned char c)
{
- pcxe_write(tty, 0, &c, 1);
+ pcxe_write(tty, &c, 1);
return;
}