X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fchar%2Fsynclinkmp.c;h=e31235ce35190706c46274365e435953f6ad576e;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=5648ed35562f0f6323a6e7655a162ef99dae669e;hpb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;p=linux-2.6.git diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c index 5648ed355..e31235ce3 100644 --- a/drivers/char/synclinkmp.c +++ b/drivers/char/synclinkmp.c @@ -1,5 +1,5 @@ /* - * $Id: synclinkmp.c,v 4.29 2004/08/27 20:06:41 paulkf Exp $ + * $Id: synclinkmp.c,v 4.34 2005/03/04 15:07:10 paulkf Exp $ * * Device driver for Microgate SyncLink Multiport * high speed multiprotocol serial adapter. @@ -63,7 +63,7 @@ #include #include #include -#include +#include #include #include #include @@ -157,8 +157,8 @@ typedef struct _synclinkmp_info { int flags; int count; /* count of opens */ int line; - unsigned short close_delay; - unsigned short closing_wait; /* time to wait before closing */ + unsigned int close_delay; + unsigned int closing_wait; /* time to wait before closing */ struct mgsl_icount icount; @@ -480,14 +480,14 @@ static int debug_level = 0; static int maxframe[MAX_DEVICES] = {0,}; static int dosyncppp[MAX_DEVICES] = {0,}; -MODULE_PARM(break_on_load,"i"); -MODULE_PARM(ttymajor,"i"); -MODULE_PARM(debug_level,"i"); -MODULE_PARM(maxframe,"1-" __MODULE_STRING(MAX_DEVICES) "i"); -MODULE_PARM(dosyncppp,"1-" __MODULE_STRING(MAX_DEVICES) "i"); +module_param(break_on_load, bool, 0); +module_param(ttymajor, int, 0); +module_param(debug_level, int, 0); +module_param_array(maxframe, int, NULL, 0); +module_param_array(dosyncppp, int, NULL, 0); static char *driver_name = "SyncLink MultiPort driver"; -static char *driver_version = "$Revision: 4.29 $"; +static char *driver_version = "$Revision: 4.34 $"; static int synclinkmp_init_one(struct pci_dev *dev,const struct pci_device_id *ent); static void synclinkmp_remove_one(struct pci_dev *dev); @@ -521,7 +521,7 @@ static void close(struct tty_struct *tty, struct file * filp); static void hangup(struct tty_struct *tty); static void set_termios(struct tty_struct *tty, struct termios *old_termios); -static int write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count); +static int write(struct tty_struct *tty, const unsigned char *buf, int count); static void put_char(struct tty_struct *tty, unsigned char ch); static void send_xchar(struct tty_struct *tty, char ch); static void wait_until_sent(struct tty_struct *tty, int timeout); @@ -878,8 +878,7 @@ static void close(struct tty_struct *tty, struct file *filp) if (info->blocked_open) { if (info->close_delay) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(info->close_delay); + msleep_interruptible(jiffies_to_msecs(info->close_delay)); } wake_up_interruptible(&info->open_wait); } @@ -972,16 +971,15 @@ static void set_termios(struct tty_struct *tty, struct termios *old_termios) * Arguments: * * tty pointer to tty information structure - * from_user flag: 1 = from user process * buf pointer to buffer containing send data * count size of send data in bytes * * Return Value: number of characters written */ -static int write(struct tty_struct *tty, int from_user, +static int write(struct tty_struct *tty, const unsigned char *buf, int count) { - int c, ret = 0, err; + int c, ret = 0; SLMP_INFO *info = (SLMP_INFO *)tty->driver_data; unsigned long flags; @@ -1008,11 +1006,9 @@ static int write(struct tty_struct *tty, int from_user, tx_load_dma_buffer(info, info->tx_buf, info->tx_count); goto start; } - if (!from_user) { - ret = info->tx_count = count; - tx_load_dma_buffer(info, buf, count); - goto start; - } + ret = info->tx_count = count; + tx_load_dma_buffer(info, buf, count); + goto start; } for (;;) { @@ -1022,15 +1018,7 @@ static int write(struct tty_struct *tty, int from_user, if (c <= 0) break; - if (from_user) { - COPY_FROM_USER(err, info->tx_buf + info->tx_put, buf, c); - if (err) { - if (!ret) - ret = -EFAULT; - break; - } - } else - memcpy(info->tx_buf + info->tx_put, buf, c); + memcpy(info->tx_buf + info->tx_put, buf, c); spin_lock_irqsave(&info->lock,flags); info->tx_put += c; @@ -1164,8 +1152,7 @@ static void wait_until_sent(struct tty_struct *tty, int timeout) if ( info->params.mode == MGSL_MODE_HDLC ) { while (info->tx_active) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(char_time); + msleep_interruptible(jiffies_to_msecs(char_time)); if (signal_pending(current)) break; if (timeout && time_after(jiffies, orig_jiffies + timeout)) @@ -1175,8 +1162,7 @@ static void wait_until_sent(struct tty_struct *tty, int timeout) //TODO: determine if there is something similar to USC16C32 // TXSTATUS_ALL_SENT status while ( info->tx_active && info->tx_enabled) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(char_time); + msleep_interruptible(jiffies_to_msecs(char_time)); if (signal_pending(current)) break; if (timeout && time_after(jiffies, orig_jiffies + timeout)) @@ -1968,9 +1954,7 @@ static void hdlcdev_rx(SLMP_INFO *info, char *buf, int size) memcpy(skb_put(skb, size),buf,size); - skb->dev = info->netdev; - skb->mac.raw = skb->data; - skb->protocol = hdlc_type_trans(skb, skb->dev); + skb->protocol = hdlc_type_trans(skb, info->netdev); stats->rx_packets++; stats->rx_bytes += size; @@ -2329,7 +2313,7 @@ void isr_rxrdy(SLMP_INFO * info) tty_flip_buffer_push(tty); } -void isr_txeom(SLMP_INFO * info, unsigned char status) +static void isr_txeom(SLMP_INFO * info, unsigned char status) { if ( debug_level >= DEBUG_LEVEL_ISR ) printk("%s(%d):%s isr_txeom status=%02x\n", @@ -3831,7 +3815,7 @@ void add_device(SLMP_INFO *info) * * Return Value: pointer to SLMP_INFO if success, otherwise NULL */ -SLMP_INFO *alloc_dev(int adapter_num, int port_num, struct pci_dev *pdev) +static SLMP_INFO *alloc_dev(int adapter_num, int port_num, struct pci_dev *pdev) { SLMP_INFO *info; @@ -4544,7 +4528,7 @@ void async_mode(SLMP_INFO *info) * 07..05 Reserved, must be 0 * 04..00 RRC<4..0> Rx FIFO trigger active 0x00 = 1 byte */ - write_reg(info, TRC0, 0x00); + write_reg(info, RRC, 0x00); /* TRC0 Transmit Ready Control 0 * @@ -5209,8 +5193,7 @@ int irq_test(SLMP_INFO *info) timeout=100; while( timeout-- && !info->irq_occurred ) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(msecs_to_jiffies(10)); + msleep_interruptible(10); } spin_lock_irqsave(&info->lock,flags); @@ -5222,7 +5205,7 @@ int irq_test(SLMP_INFO *info) /* initialize individual SCA device (2 ports) */ -int sca_init(SLMP_INFO *info) +static int sca_init(SLMP_INFO *info) { /* set wait controller to single mem partition (low), no wait states */ write_reg(info, PABR0, 0); /* wait controller addr boundary 0 */ @@ -5360,8 +5343,7 @@ int loopback_test(SLMP_INFO *info) /* wait for receive complete */ /* Set a timeout for waiting for interrupt. */ for ( timeout = 100; timeout; --timeout ) { - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(msecs_to_jiffies(10)); + msleep_interruptible(10); if (rx_get_frame(info)) { rc = TRUE;