X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fchar%2Fsynclinkmp.c;h=5c1eadb8f49f80666aed133a1fce3257d581ae22;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=5648ed35562f0f6323a6e7655a162ef99dae669e;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c index 5648ed355..5c1eadb8f 100644 --- a/drivers/char/synclinkmp.c +++ b/drivers/char/synclinkmp.c @@ -63,7 +63,7 @@ #include #include #include -#include +#include #include #include #include @@ -480,11 +480,11 @@ 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 $"; @@ -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; @@ -3847,7 +3831,11 @@ SLMP_INFO *alloc_dev(int adapter_num, int port_num, struct pci_dev *pdev) INIT_WORK(&info->task, bh_handler, info); info->max_frame_size = 4096; info->close_delay = 5*HZ/10; + #if HZ < 2185 info->closing_wait = 30*HZ; + #else + info->closing_wait = 65534; + #endif init_waitqueue_head(&info->open_wait); init_waitqueue_head(&info->close_wait); init_waitqueue_head(&info->status_event_wait_q); @@ -5209,8 +5197,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); @@ -5360,8 +5347,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;