Lines Matching refs:info

321 #define write_reg(info, reg, val) outb((val),(info)->io_base + (reg))  argument
322 #define read_reg(info, reg) inb((info)->io_base + (reg)) argument
324 #define read_reg16(info, reg) inw((info)->io_base + (reg)) argument
325 #define write_reg16(info, reg, val) outw((val), (info)->io_base + (reg)) argument
327 #define set_reg_bits(info, reg, mask) \ argument
328 write_reg(info, (reg), \
329 (unsigned char) (read_reg(info, (reg)) | (mask)))
330 #define clear_reg_bits(info, reg, mask) \ argument
331 write_reg(info, (reg), \
332 (unsigned char) (read_reg(info, (reg)) & ~(mask)))
336 static void irq_disable(MGSLPC_INFO *info, unsigned char channel, unsigned short mask) in irq_disable() argument
339 info->imra_value |= mask; in irq_disable()
340 write_reg16(info, CHA + IMR, info->imra_value); in irq_disable()
342 info->imrb_value |= mask; in irq_disable()
343 write_reg16(info, CHB + IMR, info->imrb_value); in irq_disable()
346 static void irq_enable(MGSLPC_INFO *info, unsigned char channel, unsigned short mask) in irq_enable() argument
349 info->imra_value &= ~mask; in irq_enable()
350 write_reg16(info, CHA + IMR, info->imra_value); in irq_enable()
352 info->imrb_value &= ~mask; in irq_enable()
353 write_reg16(info, CHB + IMR, info->imrb_value); in irq_enable()
357 #define port_irq_disable(info, mask) \ argument
358 { info->pim_value |= (mask); write_reg(info, PIM, info->pim_value); }
360 #define port_irq_enable(info, mask) \ argument
361 { info->pim_value &= ~(mask); write_reg(info, PIM, info->pim_value); }
363 static void rx_start(MGSLPC_INFO *info);
364 static void rx_stop(MGSLPC_INFO *info);
366 static void tx_start(MGSLPC_INFO *info, struct tty_struct *tty);
367 static void tx_stop(MGSLPC_INFO *info);
368 static void tx_set_idle(MGSLPC_INFO *info);
370 static void get_signals(MGSLPC_INFO *info);
371 static void set_signals(MGSLPC_INFO *info);
373 static void reset_device(MGSLPC_INFO *info);
375 static void hdlc_mode(MGSLPC_INFO *info);
376 static void async_mode(MGSLPC_INFO *info);
385 static void hdlcdev_tx_done(MGSLPC_INFO *info);
386 static void hdlcdev_rx(MGSLPC_INFO *info, char *buf, int size);
387 static int hdlcdev_init(MGSLPC_INFO *info);
388 static void hdlcdev_exit(MGSLPC_INFO *info);
391 static void trace_block(MGSLPC_INFO *info,const char* data, int count, int xmit);
393 static bool register_test(MGSLPC_INFO *info);
394 static bool irq_test(MGSLPC_INFO *info);
395 static int adapter_test(MGSLPC_INFO *info);
397 static int claim_resources(MGSLPC_INFO *info);
398 static void release_resources(MGSLPC_INFO *info);
399 static int mgslpc_add_device(MGSLPC_INFO *info);
400 static void mgslpc_remove_device(MGSLPC_INFO *info);
402 static bool rx_get_frame(MGSLPC_INFO *info, struct tty_struct *tty);
403 static void rx_reset_buffers(MGSLPC_INFO *info);
404 static int rx_alloc_buffers(MGSLPC_INFO *info);
405 static void rx_free_buffers(MGSLPC_INFO *info);
413 static void bh_transmit(MGSLPC_INFO *info, struct tty_struct *tty);
414 static void bh_status(MGSLPC_INFO *info);
422 static int get_stats(MGSLPC_INFO *info, struct mgsl_icount __user *user_icount);
423 static int get_params(MGSLPC_INFO *info, MGSL_PARAMS __user *user_params);
424 static int set_params(MGSLPC_INFO *info, MGSL_PARAMS __user *new_params, struct tty_struct *tty);
425 static int get_txidle(MGSLPC_INFO *info, int __user *idle_mode);
426 static int set_txidle(MGSLPC_INFO *info, int idle_mode);
427 static int set_txenable(MGSLPC_INFO *info, int enable, struct tty_struct *tty);
428 static int tx_abort(MGSLPC_INFO *info);
429 static int set_rxenable(MGSLPC_INFO *info, int enable);
430 static int wait_events(MGSLPC_INFO *info, int __user *mask);
466 static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty);
516 MGSLPC_INFO *info; in mgslpc_probe() local
522 info = kzalloc(sizeof(MGSLPC_INFO), GFP_KERNEL); in mgslpc_probe()
523 if (!info) { in mgslpc_probe()
528 info->magic = MGSLPC_MAGIC; in mgslpc_probe()
529 tty_port_init(&info->port); in mgslpc_probe()
530 info->port.ops = &mgslpc_port_ops; in mgslpc_probe()
531 INIT_WORK(&info->task, bh_handler); in mgslpc_probe()
532 info->max_frame_size = 4096; in mgslpc_probe()
533 info->port.close_delay = 5*HZ/10; in mgslpc_probe()
534 info->port.closing_wait = 30*HZ; in mgslpc_probe()
535 init_waitqueue_head(&info->status_event_wait_q); in mgslpc_probe()
536 init_waitqueue_head(&info->event_wait_q); in mgslpc_probe()
537 spin_lock_init(&info->lock); in mgslpc_probe()
538 spin_lock_init(&info->netlock); in mgslpc_probe()
539 memcpy(&info->params,&default_params,sizeof(MGSL_PARAMS)); in mgslpc_probe()
540 info->idle_mode = HDLC_TXIDLE_FLAGS; in mgslpc_probe()
541 info->imra_value = 0xffff; in mgslpc_probe()
542 info->imrb_value = 0xffff; in mgslpc_probe()
543 info->pim_value = 0xff; in mgslpc_probe()
545 info->p_dev = link; in mgslpc_probe()
546 link->priv = info; in mgslpc_probe()
554 ret = mgslpc_add_device(info); in mgslpc_probe()
563 tty_port_destroy(&info->port); in mgslpc_probe()
564 kfree(info); in mgslpc_probe()
578 MGSLPC_INFO *info = link->priv; in mgslpc_config() local
600 info->io_base = link->resource[0]->start; in mgslpc_config()
601 info->irq_level = link->irq; in mgslpc_config()
636 MGSLPC_INFO *info = link->priv; in mgslpc_suspend() local
638 info->stop = 1; in mgslpc_suspend()
645 MGSLPC_INFO *info = link->priv; in mgslpc_resume() local
647 info->stop = 0; in mgslpc_resume()
653 static inline bool mgslpc_paranoia_check(MGSLPC_INFO *info, in mgslpc_paranoia_check() argument
662 if (!info) { in mgslpc_paranoia_check()
666 if (info->magic != MGSLPC_MAGIC) { in mgslpc_paranoia_check()
671 if (!info) in mgslpc_paranoia_check()
686 static bool wait_command_complete(MGSLPC_INFO *info, unsigned char channel) in wait_command_complete() argument
690 while (read_reg(info, (unsigned char)(channel+STAR)) & BIT2) { in wait_command_complete()
698 static void issue_command(MGSLPC_INFO *info, unsigned char channel, unsigned char cmd) in issue_command() argument
700 wait_command_complete(info, channel); in issue_command()
701 write_reg(info, (unsigned char) (channel + CMDR), cmd); in issue_command()
706 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tx_pause() local
709 if (mgslpc_paranoia_check(info, tty->name, "tx_pause")) in tx_pause()
712 printk("tx_pause(%s)\n", info->device_name); in tx_pause()
714 spin_lock_irqsave(&info->lock, flags); in tx_pause()
715 if (info->tx_enabled) in tx_pause()
716 tx_stop(info); in tx_pause()
717 spin_unlock_irqrestore(&info->lock, flags); in tx_pause()
722 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tx_release() local
725 if (mgslpc_paranoia_check(info, tty->name, "tx_release")) in tx_release()
728 printk("tx_release(%s)\n", info->device_name); in tx_release()
730 spin_lock_irqsave(&info->lock, flags); in tx_release()
731 if (!info->tx_enabled) in tx_release()
732 tx_start(info, tty); in tx_release()
733 spin_unlock_irqrestore(&info->lock, flags); in tx_release()
739 static int bh_action(MGSLPC_INFO *info) in bh_action() argument
744 spin_lock_irqsave(&info->lock, flags); in bh_action()
746 if (info->pending_bh & BH_RECEIVE) { in bh_action()
747 info->pending_bh &= ~BH_RECEIVE; in bh_action()
749 } else if (info->pending_bh & BH_TRANSMIT) { in bh_action()
750 info->pending_bh &= ~BH_TRANSMIT; in bh_action()
752 } else if (info->pending_bh & BH_STATUS) { in bh_action()
753 info->pending_bh &= ~BH_STATUS; in bh_action()
759 info->bh_running = false; in bh_action()
760 info->bh_requested = false; in bh_action()
763 spin_unlock_irqrestore(&info->lock, flags); in bh_action()
770 MGSLPC_INFO *info = container_of(work, MGSLPC_INFO, task); in bh_handler() local
776 __FILE__,__LINE__,info->device_name); in bh_handler()
778 info->bh_running = true; in bh_handler()
779 tty = tty_port_tty_get(&info->port); in bh_handler()
781 while((action = bh_action(info)) != 0) { in bh_handler()
791 while(rx_get_frame(info, tty)); in bh_handler()
794 bh_transmit(info, tty); in bh_handler()
797 bh_status(info); in bh_handler()
809 __FILE__,__LINE__,info->device_name); in bh_handler()
812 static void bh_transmit(MGSLPC_INFO *info, struct tty_struct *tty) in bh_transmit() argument
815 printk("bh_transmit() entry on %s\n", info->device_name); in bh_transmit()
821 static void bh_status(MGSLPC_INFO *info) in bh_status() argument
823 info->ri_chkcount = 0; in bh_status()
824 info->dsr_chkcount = 0; in bh_status()
825 info->dcd_chkcount = 0; in bh_status()
826 info->cts_chkcount = 0; in bh_status()
830 static void rx_ready_hdlc(MGSLPC_INFO *info, int eom) in rx_ready_hdlc() argument
834 RXBUF *buf = (RXBUF*)(info->rx_buf + (info->rx_put * info->rx_buf_size)); in rx_ready_hdlc()
839 if (!info->rx_enabled) in rx_ready_hdlc()
842 if (info->rx_frame_count >= info->rx_buf_count) { in rx_ready_hdlc()
844 issue_command(info, CHA, CMD_RXRESET); in rx_ready_hdlc()
845 info->pending_bh |= BH_RECEIVE; in rx_ready_hdlc()
846 info->rx_overflow = true; in rx_ready_hdlc()
847 info->icount.buf_overrun++; in rx_ready_hdlc()
853 fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f); in rx_ready_hdlc()
862 data[0] = read_reg(info, CHA + RXFIFO); in rx_ready_hdlc()
865 *((unsigned short *) data) = read_reg16(info, CHA + RXFIFO); in rx_ready_hdlc()
872 if (buf->count >= info->max_frame_size) { in rx_ready_hdlc()
874 issue_command(info, CHA, CMD_RXRESET); in rx_ready_hdlc()
884 info->pending_bh |= BH_RECEIVE; in rx_ready_hdlc()
885 info->rx_frame_count++; in rx_ready_hdlc()
886 info->rx_put++; in rx_ready_hdlc()
887 if (info->rx_put >= info->rx_buf_count) in rx_ready_hdlc()
888 info->rx_put = 0; in rx_ready_hdlc()
890 issue_command(info, CHA, CMD_RXFIFO); in rx_ready_hdlc()
893 static void rx_ready_async(MGSLPC_INFO *info, int tcd) in rx_ready_async() argument
895 struct tty_port *port = &info->port; in rx_ready_async()
899 struct mgsl_icount *icount = &info->icount; in rx_ready_async()
903 fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f); in rx_ready_async()
908 if (!fifo_count && (read_reg(info,CHA+STAR) & BIT5)) in rx_ready_async()
916 data = read_reg(info, CHA + RXFIFO); in rx_ready_async()
917 status = read_reg(info, CHA + RXFIFO); in rx_ready_async()
934 if (status & info->ignore_status_mask) in rx_ready_async()
937 status &= info->read_status_mask; in rx_ready_async()
946 issue_command(info, CHA, CMD_RXFIFO); in rx_ready_async()
961 static void tx_done(MGSLPC_INFO *info, struct tty_struct *tty) in tx_done() argument
963 if (!info->tx_active) in tx_done()
966 info->tx_active = false; in tx_done()
967 info->tx_aborting = false; in tx_done()
969 if (info->params.mode == MGSL_MODE_ASYNC) in tx_done()
972 info->tx_count = info->tx_put = info->tx_get = 0; in tx_done()
973 del_timer(&info->tx_timer); in tx_done()
975 if (info->drop_rts_on_tx_done) { in tx_done()
976 get_signals(info); in tx_done()
977 if (info->serial_signals & SerialSignal_RTS) { in tx_done()
978 info->serial_signals &= ~SerialSignal_RTS; in tx_done()
979 set_signals(info); in tx_done()
981 info->drop_rts_on_tx_done = false; in tx_done()
985 if (info->netcount) in tx_done()
986 hdlcdev_tx_done(info); in tx_done()
991 tx_stop(info); in tx_done()
994 info->pending_bh |= BH_TRANSMIT; in tx_done()
998 static void tx_ready(MGSLPC_INFO *info, struct tty_struct *tty) in tx_ready() argument
1004 printk("%s(%d):tx_ready(%s)\n", __FILE__, __LINE__, info->device_name); in tx_ready()
1006 if (info->params.mode == MGSL_MODE_HDLC) { in tx_ready()
1007 if (!info->tx_active) in tx_ready()
1011 tx_stop(info); in tx_ready()
1014 if (!info->tx_count) in tx_ready()
1015 info->tx_active = false; in tx_ready()
1018 if (!info->tx_count) in tx_ready()
1021 while (info->tx_count && fifo_count) { in tx_ready()
1022 c = min(2, min_t(int, fifo_count, min(info->tx_count, TXBUFSIZE - info->tx_get))); in tx_ready()
1025 write_reg(info, CHA + TXFIFO, *(info->tx_buf + info->tx_get)); in tx_ready()
1027 write_reg16(info, CHA + TXFIFO, in tx_ready()
1028 *((unsigned short*)(info->tx_buf + info->tx_get))); in tx_ready()
1030 info->tx_count -= c; in tx_ready()
1031 info->tx_get = (info->tx_get + c) & (TXBUFSIZE - 1); in tx_ready()
1035 if (info->params.mode == MGSL_MODE_ASYNC) { in tx_ready()
1036 if (info->tx_count < WAKEUP_CHARS) in tx_ready()
1037 info->pending_bh |= BH_TRANSMIT; in tx_ready()
1038 issue_command(info, CHA, CMD_TXFIFO); in tx_ready()
1040 if (info->tx_count) in tx_ready()
1041 issue_command(info, CHA, CMD_TXFIFO); in tx_ready()
1043 issue_command(info, CHA, CMD_TXFIFO + CMD_TXEOM); in tx_ready()
1047 static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty) in cts_change() argument
1049 get_signals(info); in cts_change()
1050 if ((info->cts_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in cts_change()
1051 irq_disable(info, CHB, IRQ_CTS); in cts_change()
1052 info->icount.cts++; in cts_change()
1053 if (info->serial_signals & SerialSignal_CTS) in cts_change()
1054 info->input_signal_events.cts_up++; in cts_change()
1056 info->input_signal_events.cts_down++; in cts_change()
1057 wake_up_interruptible(&info->status_event_wait_q); in cts_change()
1058 wake_up_interruptible(&info->event_wait_q); in cts_change()
1060 if (tty && tty_port_cts_enabled(&info->port)) { in cts_change()
1062 if (info->serial_signals & SerialSignal_CTS) { in cts_change()
1066 tx_start(info, tty); in cts_change()
1067 info->pending_bh |= BH_TRANSMIT; in cts_change()
1071 if (!(info->serial_signals & SerialSignal_CTS)) { in cts_change()
1075 tx_stop(info); in cts_change()
1079 info->pending_bh |= BH_STATUS; in cts_change()
1082 static void dcd_change(MGSLPC_INFO *info, struct tty_struct *tty) in dcd_change() argument
1084 get_signals(info); in dcd_change()
1085 if ((info->dcd_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in dcd_change()
1086 irq_disable(info, CHB, IRQ_DCD); in dcd_change()
1087 info->icount.dcd++; in dcd_change()
1088 if (info->serial_signals & SerialSignal_DCD) { in dcd_change()
1089 info->input_signal_events.dcd_up++; in dcd_change()
1092 info->input_signal_events.dcd_down++; in dcd_change()
1094 if (info->netcount) { in dcd_change()
1095 if (info->serial_signals & SerialSignal_DCD) in dcd_change()
1096 netif_carrier_on(info->netdev); in dcd_change()
1098 netif_carrier_off(info->netdev); in dcd_change()
1101 wake_up_interruptible(&info->status_event_wait_q); in dcd_change()
1102 wake_up_interruptible(&info->event_wait_q); in dcd_change()
1104 if (info->port.flags & ASYNC_CHECK_CD) { in dcd_change()
1106 printk("%s CD now %s...", info->device_name, in dcd_change()
1107 (info->serial_signals & SerialSignal_DCD) ? "on" : "off"); in dcd_change()
1108 if (info->serial_signals & SerialSignal_DCD) in dcd_change()
1109 wake_up_interruptible(&info->port.open_wait); in dcd_change()
1117 info->pending_bh |= BH_STATUS; in dcd_change()
1120 static void dsr_change(MGSLPC_INFO *info) in dsr_change() argument
1122 get_signals(info); in dsr_change()
1123 if ((info->dsr_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in dsr_change()
1124 port_irq_disable(info, PVR_DSR); in dsr_change()
1125 info->icount.dsr++; in dsr_change()
1126 if (info->serial_signals & SerialSignal_DSR) in dsr_change()
1127 info->input_signal_events.dsr_up++; in dsr_change()
1129 info->input_signal_events.dsr_down++; in dsr_change()
1130 wake_up_interruptible(&info->status_event_wait_q); in dsr_change()
1131 wake_up_interruptible(&info->event_wait_q); in dsr_change()
1132 info->pending_bh |= BH_STATUS; in dsr_change()
1135 static void ri_change(MGSLPC_INFO *info) in ri_change() argument
1137 get_signals(info); in ri_change()
1138 if ((info->ri_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in ri_change()
1139 port_irq_disable(info, PVR_RI); in ri_change()
1140 info->icount.rng++; in ri_change()
1141 if (info->serial_signals & SerialSignal_RI) in ri_change()
1142 info->input_signal_events.ri_up++; in ri_change()
1144 info->input_signal_events.ri_down++; in ri_change()
1145 wake_up_interruptible(&info->status_event_wait_q); in ri_change()
1146 wake_up_interruptible(&info->event_wait_q); in ri_change()
1147 info->pending_bh |= BH_STATUS; in ri_change()
1159 MGSLPC_INFO *info = dev_id; in mgslpc_isr() local
1166 printk("mgslpc_isr(%d) entry.\n", info->irq_level); in mgslpc_isr()
1168 if (!(info->p_dev->_locked)) in mgslpc_isr()
1171 tty = tty_port_tty_get(&info->port); in mgslpc_isr()
1173 spin_lock(&info->lock); in mgslpc_isr()
1175 while ((gis = read_reg(info, CHA + GIS))) { in mgslpc_isr()
1177 printk("mgslpc_isr %s gis=%04X\n", info->device_name,gis); in mgslpc_isr()
1186 isr = read_reg16(info, CHB + ISR); in mgslpc_isr()
1188 dcd_change(info, tty); in mgslpc_isr()
1190 cts_change(info, tty); in mgslpc_isr()
1194 isr = read_reg16(info, CHA + ISR); in mgslpc_isr()
1196 info->irq_occurred = true; in mgslpc_isr()
1197 irq_disable(info, CHA, IRQ_TIMER); in mgslpc_isr()
1202 info->icount.exithunt++; in mgslpc_isr()
1203 wake_up_interruptible(&info->event_wait_q); in mgslpc_isr()
1206 info->icount.brk++; in mgslpc_isr()
1207 if (info->port.flags & ASYNC_SAK) in mgslpc_isr()
1211 issue_command(info, CHA, CMD_RXFIFO_READ); in mgslpc_isr()
1214 if (info->params.mode == MGSL_MODE_HDLC) in mgslpc_isr()
1215 rx_ready_hdlc(info, isr & IRQ_RXEOM); in mgslpc_isr()
1217 rx_ready_async(info, isr & IRQ_RXEOM); in mgslpc_isr()
1222 if (info->tx_aborting) in mgslpc_isr()
1223 info->icount.txabort++; in mgslpc_isr()
1225 info->icount.txunder++; in mgslpc_isr()
1226 tx_done(info, tty); in mgslpc_isr()
1229 info->icount.txok++; in mgslpc_isr()
1230 tx_done(info, tty); in mgslpc_isr()
1233 tx_ready(info, tty); in mgslpc_isr()
1236 pis = read_reg(info, CHA + PIS); in mgslpc_isr()
1238 dsr_change(info); in mgslpc_isr()
1240 ri_change(info); in mgslpc_isr()
1248 if (info->pending_bh && !info->bh_running && !info->bh_requested) { in mgslpc_isr()
1251 __FILE__,__LINE__,info->device_name); in mgslpc_isr()
1252 schedule_work(&info->task); in mgslpc_isr()
1253 info->bh_requested = true; in mgslpc_isr()
1256 spin_unlock(&info->lock); in mgslpc_isr()
1261 __FILE__, __LINE__, info->irq_level); in mgslpc_isr()
1268 static int startup(MGSLPC_INFO * info, struct tty_struct *tty) in startup() argument
1273 printk("%s(%d):startup(%s)\n", __FILE__, __LINE__, info->device_name); in startup()
1275 if (info->port.flags & ASYNC_INITIALIZED) in startup()
1278 if (!info->tx_buf) { in startup()
1280 info->tx_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL); in startup()
1281 if (!info->tx_buf) { in startup()
1283 __FILE__, __LINE__, info->device_name); in startup()
1288 info->pending_bh = 0; in startup()
1290 memset(&info->icount, 0, sizeof(info->icount)); in startup()
1292 setup_timer(&info->tx_timer, tx_timeout, (unsigned long)info); in startup()
1295 retval = claim_resources(info); in startup()
1299 retval = adapter_test(info); in startup()
1304 release_resources(info); in startup()
1309 mgslpc_change_params(info, tty); in startup()
1314 info->port.flags |= ASYNC_INITIALIZED; in startup()
1321 static void shutdown(MGSLPC_INFO * info, struct tty_struct *tty) in shutdown() argument
1325 if (!(info->port.flags & ASYNC_INITIALIZED)) in shutdown()
1330 __FILE__, __LINE__, info->device_name); in shutdown()
1334 wake_up_interruptible(&info->status_event_wait_q); in shutdown()
1335 wake_up_interruptible(&info->event_wait_q); in shutdown()
1337 del_timer_sync(&info->tx_timer); in shutdown()
1339 if (info->tx_buf) { in shutdown()
1340 free_page((unsigned long) info->tx_buf); in shutdown()
1341 info->tx_buf = NULL; in shutdown()
1344 spin_lock_irqsave(&info->lock, flags); in shutdown()
1346 rx_stop(info); in shutdown()
1347 tx_stop(info); in shutdown()
1350 reset_device(info); in shutdown()
1353 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in shutdown()
1354 set_signals(info); in shutdown()
1357 spin_unlock_irqrestore(&info->lock, flags); in shutdown()
1359 release_resources(info); in shutdown()
1364 info->port.flags &= ~ASYNC_INITIALIZED; in shutdown()
1367 static void mgslpc_program_hw(MGSLPC_INFO *info, struct tty_struct *tty) in mgslpc_program_hw() argument
1371 spin_lock_irqsave(&info->lock, flags); in mgslpc_program_hw()
1373 rx_stop(info); in mgslpc_program_hw()
1374 tx_stop(info); in mgslpc_program_hw()
1375 info->tx_count = info->tx_put = info->tx_get = 0; in mgslpc_program_hw()
1377 if (info->params.mode == MGSL_MODE_HDLC || info->netcount) in mgslpc_program_hw()
1378 hdlc_mode(info); in mgslpc_program_hw()
1380 async_mode(info); in mgslpc_program_hw()
1382 set_signals(info); in mgslpc_program_hw()
1384 info->dcd_chkcount = 0; in mgslpc_program_hw()
1385 info->cts_chkcount = 0; in mgslpc_program_hw()
1386 info->ri_chkcount = 0; in mgslpc_program_hw()
1387 info->dsr_chkcount = 0; in mgslpc_program_hw()
1389 irq_enable(info, CHB, IRQ_DCD | IRQ_CTS); in mgslpc_program_hw()
1390 port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI); in mgslpc_program_hw()
1391 get_signals(info); in mgslpc_program_hw()
1393 if (info->netcount || (tty && (tty->termios.c_cflag & CREAD))) in mgslpc_program_hw()
1394 rx_start(info); in mgslpc_program_hw()
1396 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_program_hw()
1401 static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty) in mgslpc_change_params() argument
1411 __FILE__, __LINE__, info->device_name); in mgslpc_change_params()
1418 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in mgslpc_change_params()
1420 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in mgslpc_change_params()
1425 case CS5: info->params.data_bits = 5; break; in mgslpc_change_params()
1426 case CS6: info->params.data_bits = 6; break; in mgslpc_change_params()
1427 case CS7: info->params.data_bits = 7; break; in mgslpc_change_params()
1428 case CS8: info->params.data_bits = 8; break; in mgslpc_change_params()
1429 default: info->params.data_bits = 7; break; in mgslpc_change_params()
1433 info->params.stop_bits = 2; in mgslpc_change_params()
1435 info->params.stop_bits = 1; in mgslpc_change_params()
1437 info->params.parity = ASYNC_PARITY_NONE; in mgslpc_change_params()
1440 info->params.parity = ASYNC_PARITY_ODD; in mgslpc_change_params()
1442 info->params.parity = ASYNC_PARITY_EVEN; in mgslpc_change_params()
1445 info->params.parity = ASYNC_PARITY_SPACE; in mgslpc_change_params()
1452 bits_per_char = info->params.data_bits + in mgslpc_change_params()
1453 info->params.stop_bits + 1; in mgslpc_change_params()
1459 if (info->params.data_rate <= 460800) { in mgslpc_change_params()
1460 info->params.data_rate = tty_get_baud_rate(tty); in mgslpc_change_params()
1463 if (info->params.data_rate) { in mgslpc_change_params()
1464 info->timeout = (32*HZ*bits_per_char) / in mgslpc_change_params()
1465 info->params.data_rate; in mgslpc_change_params()
1467 info->timeout += HZ/50; /* Add .02 seconds of slop */ in mgslpc_change_params()
1470 info->port.flags |= ASYNC_CTS_FLOW; in mgslpc_change_params()
1472 info->port.flags &= ~ASYNC_CTS_FLOW; in mgslpc_change_params()
1475 info->port.flags &= ~ASYNC_CHECK_CD; in mgslpc_change_params()
1477 info->port.flags |= ASYNC_CHECK_CD; in mgslpc_change_params()
1481 info->read_status_mask = 0; in mgslpc_change_params()
1483 info->read_status_mask |= BIT7 | BIT6; in mgslpc_change_params()
1485 info->ignore_status_mask |= BIT7 | BIT6; in mgslpc_change_params()
1487 mgslpc_program_hw(info, tty); in mgslpc_change_params()
1494 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_put_char() local
1499 __FILE__, __LINE__, ch, info->device_name); in mgslpc_put_char()
1502 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_put_char")) in mgslpc_put_char()
1505 if (!info->tx_buf) in mgslpc_put_char()
1508 spin_lock_irqsave(&info->lock, flags); in mgslpc_put_char()
1510 if (info->params.mode == MGSL_MODE_ASYNC || !info->tx_active) { in mgslpc_put_char()
1511 if (info->tx_count < TXBUFSIZE - 1) { in mgslpc_put_char()
1512 info->tx_buf[info->tx_put++] = ch; in mgslpc_put_char()
1513 info->tx_put &= TXBUFSIZE-1; in mgslpc_put_char()
1514 info->tx_count++; in mgslpc_put_char()
1518 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_put_char()
1527 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_flush_chars() local
1532 __FILE__, __LINE__, info->device_name, info->tx_count); in mgslpc_flush_chars()
1534 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_flush_chars")) in mgslpc_flush_chars()
1537 if (info->tx_count <= 0 || tty->stopped || in mgslpc_flush_chars()
1538 tty->hw_stopped || !info->tx_buf) in mgslpc_flush_chars()
1543 __FILE__, __LINE__, info->device_name); in mgslpc_flush_chars()
1545 spin_lock_irqsave(&info->lock, flags); in mgslpc_flush_chars()
1546 if (!info->tx_active) in mgslpc_flush_chars()
1547 tx_start(info, tty); in mgslpc_flush_chars()
1548 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_flush_chars()
1565 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_write() local
1570 __FILE__, __LINE__, info->device_name, count); in mgslpc_write()
1572 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_write") || in mgslpc_write()
1573 !info->tx_buf) in mgslpc_write()
1576 if (info->params.mode == MGSL_MODE_HDLC) { in mgslpc_write()
1581 if (info->tx_active) in mgslpc_write()
1583 else if (info->tx_count) in mgslpc_write()
1589 min(TXBUFSIZE - info->tx_count - 1, in mgslpc_write()
1590 TXBUFSIZE - info->tx_put)); in mgslpc_write()
1594 memcpy(info->tx_buf + info->tx_put, buf, c); in mgslpc_write()
1596 spin_lock_irqsave(&info->lock, flags); in mgslpc_write()
1597 info->tx_put = (info->tx_put + c) & (TXBUFSIZE-1); in mgslpc_write()
1598 info->tx_count += c; in mgslpc_write()
1599 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_write()
1606 if (info->tx_count && !tty->stopped && !tty->hw_stopped) { in mgslpc_write()
1607 spin_lock_irqsave(&info->lock, flags); in mgslpc_write()
1608 if (!info->tx_active) in mgslpc_write()
1609 tx_start(info, tty); in mgslpc_write()
1610 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_write()
1615 __FILE__, __LINE__, info->device_name, ret); in mgslpc_write()
1623 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_write_room() local
1626 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_write_room")) in mgslpc_write_room()
1629 if (info->params.mode == MGSL_MODE_HDLC) { in mgslpc_write_room()
1631 if (info->tx_active) in mgslpc_write_room()
1636 ret = TXBUFSIZE - info->tx_count - 1; in mgslpc_write_room()
1643 __FILE__, __LINE__, info->device_name, ret); in mgslpc_write_room()
1651 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_chars_in_buffer() local
1656 __FILE__, __LINE__, info->device_name); in mgslpc_chars_in_buffer()
1658 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_chars_in_buffer")) in mgslpc_chars_in_buffer()
1661 if (info->params.mode == MGSL_MODE_HDLC) in mgslpc_chars_in_buffer()
1662 rc = info->tx_active ? info->max_frame_size : 0; in mgslpc_chars_in_buffer()
1664 rc = info->tx_count; in mgslpc_chars_in_buffer()
1668 __FILE__, __LINE__, info->device_name, rc); in mgslpc_chars_in_buffer()
1677 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_flush_buffer() local
1682 __FILE__, __LINE__, info->device_name); in mgslpc_flush_buffer()
1684 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_flush_buffer")) in mgslpc_flush_buffer()
1687 spin_lock_irqsave(&info->lock, flags); in mgslpc_flush_buffer()
1688 info->tx_count = info->tx_put = info->tx_get = 0; in mgslpc_flush_buffer()
1689 del_timer(&info->tx_timer); in mgslpc_flush_buffer()
1690 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_flush_buffer()
1700 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_send_xchar() local
1705 __FILE__, __LINE__, info->device_name, ch); in mgslpc_send_xchar()
1707 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_send_xchar")) in mgslpc_send_xchar()
1710 info->x_char = ch; in mgslpc_send_xchar()
1712 spin_lock_irqsave(&info->lock, flags); in mgslpc_send_xchar()
1713 if (!info->tx_enabled) in mgslpc_send_xchar()
1714 tx_start(info, tty); in mgslpc_send_xchar()
1715 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_send_xchar()
1723 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_throttle() local
1728 __FILE__, __LINE__, info->device_name); in mgslpc_throttle()
1730 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_throttle")) in mgslpc_throttle()
1737 spin_lock_irqsave(&info->lock, flags); in mgslpc_throttle()
1738 info->serial_signals &= ~SerialSignal_RTS; in mgslpc_throttle()
1739 set_signals(info); in mgslpc_throttle()
1740 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_throttle()
1748 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_unthrottle() local
1753 __FILE__, __LINE__, info->device_name); in mgslpc_unthrottle()
1755 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_unthrottle")) in mgslpc_unthrottle()
1759 if (info->x_char) in mgslpc_unthrottle()
1760 info->x_char = 0; in mgslpc_unthrottle()
1766 spin_lock_irqsave(&info->lock, flags); in mgslpc_unthrottle()
1767 info->serial_signals |= SerialSignal_RTS; in mgslpc_unthrottle()
1768 set_signals(info); in mgslpc_unthrottle()
1769 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_unthrottle()
1775 static int get_stats(MGSLPC_INFO * info, struct mgsl_icount __user *user_icount) in get_stats() argument
1779 printk("get_params(%s)\n", info->device_name); in get_stats()
1781 memset(&info->icount, 0, sizeof(info->icount)); in get_stats()
1783 COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount)); in get_stats()
1792 static int get_params(MGSLPC_INFO * info, MGSL_PARAMS __user *user_params) in get_params() argument
1796 printk("get_params(%s)\n", info->device_name); in get_params()
1797 COPY_TO_USER(err,user_params, &info->params, sizeof(MGSL_PARAMS)); in get_params()
1812 static int set_params(MGSLPC_INFO * info, MGSL_PARAMS __user *new_params, struct tty_struct *tty) in set_params() argument
1820 info->device_name); in set_params()
1825 __FILE__, __LINE__, info->device_name); in set_params()
1829 spin_lock_irqsave(&info->lock, flags); in set_params()
1830 memcpy(&info->params,&tmp_params,sizeof(MGSL_PARAMS)); in set_params()
1831 spin_unlock_irqrestore(&info->lock, flags); in set_params()
1833 mgslpc_change_params(info, tty); in set_params()
1838 static int get_txidle(MGSLPC_INFO * info, int __user *idle_mode) in get_txidle() argument
1842 printk("get_txidle(%s)=%d\n", info->device_name, info->idle_mode); in get_txidle()
1843 COPY_TO_USER(err,idle_mode, &info->idle_mode, sizeof(int)); in get_txidle()
1849 static int set_txidle(MGSLPC_INFO * info, int idle_mode) in set_txidle() argument
1853 printk("set_txidle(%s,%d)\n", info->device_name, idle_mode); in set_txidle()
1854 spin_lock_irqsave(&info->lock, flags); in set_txidle()
1855 info->idle_mode = idle_mode; in set_txidle()
1856 tx_set_idle(info); in set_txidle()
1857 spin_unlock_irqrestore(&info->lock, flags); in set_txidle()
1861 static int get_interface(MGSLPC_INFO * info, int __user *if_mode) in get_interface() argument
1865 printk("get_interface(%s)=%d\n", info->device_name, info->if_mode); in get_interface()
1866 COPY_TO_USER(err,if_mode, &info->if_mode, sizeof(int)); in get_interface()
1872 static int set_interface(MGSLPC_INFO * info, int if_mode) in set_interface() argument
1877 printk("set_interface(%s,%d)\n", info->device_name, if_mode); in set_interface()
1878 spin_lock_irqsave(&info->lock, flags); in set_interface()
1879 info->if_mode = if_mode; in set_interface()
1881 val = read_reg(info, PVR) & 0x0f; in set_interface()
1882 switch (info->if_mode) in set_interface()
1888 write_reg(info, PVR, val); in set_interface()
1890 spin_unlock_irqrestore(&info->lock, flags); in set_interface()
1894 static int set_txenable(MGSLPC_INFO * info, int enable, struct tty_struct *tty) in set_txenable() argument
1899 printk("set_txenable(%s,%d)\n", info->device_name, enable); in set_txenable()
1901 spin_lock_irqsave(&info->lock, flags); in set_txenable()
1903 if (!info->tx_enabled) in set_txenable()
1904 tx_start(info, tty); in set_txenable()
1906 if (info->tx_enabled) in set_txenable()
1907 tx_stop(info); in set_txenable()
1909 spin_unlock_irqrestore(&info->lock, flags); in set_txenable()
1913 static int tx_abort(MGSLPC_INFO * info) in tx_abort() argument
1918 printk("tx_abort(%s)\n", info->device_name); in tx_abort()
1920 spin_lock_irqsave(&info->lock, flags); in tx_abort()
1921 if (info->tx_active && info->tx_count && in tx_abort()
1922 info->params.mode == MGSL_MODE_HDLC) { in tx_abort()
1926 info->tx_count = info->tx_put = info->tx_get = 0; in tx_abort()
1927 info->tx_aborting = true; in tx_abort()
1929 spin_unlock_irqrestore(&info->lock, flags); in tx_abort()
1933 static int set_rxenable(MGSLPC_INFO * info, int enable) in set_rxenable() argument
1938 printk("set_rxenable(%s,%d)\n", info->device_name, enable); in set_rxenable()
1940 spin_lock_irqsave(&info->lock, flags); in set_rxenable()
1942 if (!info->rx_enabled) in set_rxenable()
1943 rx_start(info); in set_rxenable()
1945 if (info->rx_enabled) in set_rxenable()
1946 rx_stop(info); in set_rxenable()
1948 spin_unlock_irqrestore(&info->lock, flags); in set_rxenable()
1960 static int wait_events(MGSLPC_INFO * info, int __user *mask_ptr) in wait_events() argument
1976 printk("wait_events(%s,%d)\n", info->device_name, mask); in wait_events()
1978 spin_lock_irqsave(&info->lock, flags); in wait_events()
1981 get_signals(info); in wait_events()
1982 s = info->serial_signals; in wait_events()
1989 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
1994 cprev = info->icount; in wait_events()
1995 oldsigs = info->input_signal_events; in wait_events()
1997 if ((info->params.mode == MGSL_MODE_HDLC) && in wait_events()
1999 irq_enable(info, CHA, IRQ_EXITHUNT); in wait_events()
2002 add_wait_queue(&info->event_wait_q, &wait); in wait_events()
2004 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
2015 spin_lock_irqsave(&info->lock, flags); in wait_events()
2016 cnow = info->icount; in wait_events()
2017 newsigs = info->input_signal_events; in wait_events()
2019 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
2054 remove_wait_queue(&info->event_wait_q, &wait); in wait_events()
2058 spin_lock_irqsave(&info->lock, flags); in wait_events()
2059 if (!waitqueue_active(&info->event_wait_q)) in wait_events()
2060 irq_disable(info, CHA, IRQ_EXITHUNT); in wait_events()
2061 spin_unlock_irqrestore(&info->lock, flags); in wait_events()
2069 static int modem_input_wait(MGSLPC_INFO *info,int arg) in modem_input_wait() argument
2077 spin_lock_irqsave(&info->lock, flags); in modem_input_wait()
2078 cprev = info->icount; in modem_input_wait()
2079 add_wait_queue(&info->status_event_wait_q, &wait); in modem_input_wait()
2081 spin_unlock_irqrestore(&info->lock, flags); in modem_input_wait()
2091 spin_lock_irqsave(&info->lock, flags); in modem_input_wait()
2092 cnow = info->icount; in modem_input_wait()
2094 spin_unlock_irqrestore(&info->lock, flags); in modem_input_wait()
2114 remove_wait_queue(&info->status_event_wait_q, &wait); in modem_input_wait()
2123 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tiocmget() local
2127 spin_lock_irqsave(&info->lock, flags); in tiocmget()
2128 get_signals(info); in tiocmget()
2129 spin_unlock_irqrestore(&info->lock, flags); in tiocmget()
2131 result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS:0) + in tiocmget()
2132 ((info->serial_signals & SerialSignal_DTR) ? TIOCM_DTR:0) + in tiocmget()
2133 ((info->serial_signals & SerialSignal_DCD) ? TIOCM_CAR:0) + in tiocmget()
2134 ((info->serial_signals & SerialSignal_RI) ? TIOCM_RNG:0) + in tiocmget()
2135 ((info->serial_signals & SerialSignal_DSR) ? TIOCM_DSR:0) + in tiocmget()
2136 ((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0); in tiocmget()
2140 __FILE__, __LINE__, info->device_name, result); in tiocmget()
2149 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in tiocmset() local
2154 __FILE__, __LINE__, info->device_name, set, clear); in tiocmset()
2157 info->serial_signals |= SerialSignal_RTS; in tiocmset()
2159 info->serial_signals |= SerialSignal_DTR; in tiocmset()
2161 info->serial_signals &= ~SerialSignal_RTS; in tiocmset()
2163 info->serial_signals &= ~SerialSignal_DTR; in tiocmset()
2165 spin_lock_irqsave(&info->lock, flags); in tiocmset()
2166 set_signals(info); in tiocmset()
2167 spin_unlock_irqrestore(&info->lock, flags); in tiocmset()
2179 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_break() local
2184 __FILE__, __LINE__, info->device_name, break_state); in mgslpc_break()
2186 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_break")) in mgslpc_break()
2189 spin_lock_irqsave(&info->lock, flags); in mgslpc_break()
2191 set_reg_bits(info, CHA+DAFO, BIT6); in mgslpc_break()
2193 clear_reg_bits(info, CHA+DAFO, BIT6); in mgslpc_break()
2194 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_break()
2201 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_get_icount() local
2205 spin_lock_irqsave(&info->lock, flags); in mgslpc_get_icount()
2206 cnow = info->icount; in mgslpc_get_icount()
2207 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_get_icount()
2237 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_ioctl() local
2242 info->device_name, cmd); in mgslpc_ioctl()
2244 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_ioctl")) in mgslpc_ioctl()
2255 return get_params(info, argp); in mgslpc_ioctl()
2257 return set_params(info, argp, tty); in mgslpc_ioctl()
2259 return get_txidle(info, argp); in mgslpc_ioctl()
2261 return set_txidle(info, (int)arg); in mgslpc_ioctl()
2263 return get_interface(info, argp); in mgslpc_ioctl()
2265 return set_interface(info,(int)arg); in mgslpc_ioctl()
2267 return set_txenable(info,(int)arg, tty); in mgslpc_ioctl()
2269 return set_rxenable(info,(int)arg); in mgslpc_ioctl()
2271 return tx_abort(info); in mgslpc_ioctl()
2273 return get_stats(info, argp); in mgslpc_ioctl()
2275 return wait_events(info, argp); in mgslpc_ioctl()
2277 return modem_input_wait(info,(int)arg); in mgslpc_ioctl()
2293 MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_set_termios() local
2306 mgslpc_change_params(info, tty); in mgslpc_set_termios()
2311 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in mgslpc_set_termios()
2312 spin_lock_irqsave(&info->lock, flags); in mgslpc_set_termios()
2313 set_signals(info); in mgslpc_set_termios()
2314 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_set_termios()
2320 info->serial_signals |= SerialSignal_DTR; in mgslpc_set_termios()
2323 info->serial_signals |= SerialSignal_RTS; in mgslpc_set_termios()
2325 spin_lock_irqsave(&info->lock, flags); in mgslpc_set_termios()
2326 set_signals(info); in mgslpc_set_termios()
2327 spin_unlock_irqrestore(&info->lock, flags); in mgslpc_set_termios()
2340 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_close() local
2341 struct tty_port *port = &info->port; in mgslpc_close()
2343 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_close")) in mgslpc_close()
2348 __FILE__, __LINE__, info->device_name, port->count); in mgslpc_close()
2354 mgslpc_wait_until_sent(tty, info->timeout); in mgslpc_close()
2359 shutdown(info, tty); in mgslpc_close()
2373 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_wait_until_sent() local
2376 if (!info) in mgslpc_wait_until_sent()
2381 __FILE__, __LINE__, info->device_name); in mgslpc_wait_until_sent()
2383 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_wait_until_sent")) in mgslpc_wait_until_sent()
2386 if (!(info->port.flags & ASYNC_INITIALIZED)) in mgslpc_wait_until_sent()
2397 if (info->params.data_rate) { in mgslpc_wait_until_sent()
2398 char_time = info->timeout/(32 * 5); in mgslpc_wait_until_sent()
2407 if (info->params.mode == MGSL_MODE_HDLC) { in mgslpc_wait_until_sent()
2408 while (info->tx_active) { in mgslpc_wait_until_sent()
2416 while ((info->tx_count || info->tx_active) && in mgslpc_wait_until_sent()
2417 info->tx_enabled) { in mgslpc_wait_until_sent()
2429 __FILE__, __LINE__, info->device_name); in mgslpc_wait_until_sent()
2437 MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; in mgslpc_hangup() local
2441 __FILE__, __LINE__, info->device_name); in mgslpc_hangup()
2443 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_hangup")) in mgslpc_hangup()
2447 shutdown(info, tty); in mgslpc_hangup()
2448 tty_port_hangup(&info->port); in mgslpc_hangup()
2453 MGSLPC_INFO *info = container_of(port, MGSLPC_INFO, port); in carrier_raised() local
2456 spin_lock_irqsave(&info->lock, flags); in carrier_raised()
2457 get_signals(info); in carrier_raised()
2458 spin_unlock_irqrestore(&info->lock, flags); in carrier_raised()
2460 if (info->serial_signals & SerialSignal_DCD) in carrier_raised()
2467 MGSLPC_INFO *info = container_of(port, MGSLPC_INFO, port); in dtr_rts() local
2470 spin_lock_irqsave(&info->lock, flags); in dtr_rts()
2472 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in dtr_rts()
2474 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in dtr_rts()
2475 set_signals(info); in dtr_rts()
2476 spin_unlock_irqrestore(&info->lock, flags); in dtr_rts()
2482 MGSLPC_INFO *info; in mgslpc_open() local
2496 info = mgslpc_device_list; in mgslpc_open()
2497 while(info && info->line != line) in mgslpc_open()
2498 info = info->next_device; in mgslpc_open()
2499 if (mgslpc_paranoia_check(info, tty->name, "mgslpc_open")) in mgslpc_open()
2502 port = &info->port; in mgslpc_open()
2503 tty->driver_data = info; in mgslpc_open()
2512 spin_lock_irqsave(&info->netlock, flags); in mgslpc_open()
2513 if (info->netcount) { in mgslpc_open()
2515 spin_unlock_irqrestore(&info->netlock, flags); in mgslpc_open()
2521 spin_unlock_irqrestore(&info->netlock, flags); in mgslpc_open()
2525 retval = startup(info, tty); in mgslpc_open()
2530 retval = tty_port_block_til_ready(&info->port, tty, filp); in mgslpc_open()
2534 __FILE__, __LINE__, info->device_name, retval); in mgslpc_open()
2540 __FILE__, __LINE__, info->device_name); in mgslpc_open()
2551 static inline void line_info(struct seq_file *m, MGSLPC_INFO *info) in line_info() argument
2557 info->device_name, info->io_base, info->irq_level); in line_info()
2560 spin_lock_irqsave(&info->lock, flags); in line_info()
2561 get_signals(info); in line_info()
2562 spin_unlock_irqrestore(&info->lock, flags); in line_info()
2566 if (info->serial_signals & SerialSignal_RTS) in line_info()
2568 if (info->serial_signals & SerialSignal_CTS) in line_info()
2570 if (info->serial_signals & SerialSignal_DTR) in line_info()
2572 if (info->serial_signals & SerialSignal_DSR) in line_info()
2574 if (info->serial_signals & SerialSignal_DCD) in line_info()
2576 if (info->serial_signals & SerialSignal_RI) in line_info()
2579 if (info->params.mode == MGSL_MODE_HDLC) { in line_info()
2581 info->icount.txok, info->icount.rxok); in line_info()
2582 if (info->icount.txunder) in line_info()
2583 seq_printf(m, " txunder:%d", info->icount.txunder); in line_info()
2584 if (info->icount.txabort) in line_info()
2585 seq_printf(m, " txabort:%d", info->icount.txabort); in line_info()
2586 if (info->icount.rxshort) in line_info()
2587 seq_printf(m, " rxshort:%d", info->icount.rxshort); in line_info()
2588 if (info->icount.rxlong) in line_info()
2589 seq_printf(m, " rxlong:%d", info->icount.rxlong); in line_info()
2590 if (info->icount.rxover) in line_info()
2591 seq_printf(m, " rxover:%d", info->icount.rxover); in line_info()
2592 if (info->icount.rxcrc) in line_info()
2593 seq_printf(m, " rxcrc:%d", info->icount.rxcrc); in line_info()
2596 info->icount.tx, info->icount.rx); in line_info()
2597 if (info->icount.frame) in line_info()
2598 seq_printf(m, " fe:%d", info->icount.frame); in line_info()
2599 if (info->icount.parity) in line_info()
2600 seq_printf(m, " pe:%d", info->icount.parity); in line_info()
2601 if (info->icount.brk) in line_info()
2602 seq_printf(m, " brk:%d", info->icount.brk); in line_info()
2603 if (info->icount.overrun) in line_info()
2604 seq_printf(m, " oe:%d", info->icount.overrun); in line_info()
2611 info->tx_active,info->bh_requested,info->bh_running, in line_info()
2612 info->pending_bh); in line_info()
2619 MGSLPC_INFO *info; in mgslpc_proc_show() local
2623 info = mgslpc_device_list; in mgslpc_proc_show()
2624 while (info) { in mgslpc_proc_show()
2625 line_info(m, info); in mgslpc_proc_show()
2626 info = info->next_device; in mgslpc_proc_show()
2644 static int rx_alloc_buffers(MGSLPC_INFO *info) in rx_alloc_buffers() argument
2647 info->rx_buf_size = sizeof(RXBUF) + info->max_frame_size; in rx_alloc_buffers()
2650 info->rx_buf_total_size = info->rx_buf_size * 8; in rx_alloc_buffers()
2653 if (info->rx_buf_total_size > 0x10000) in rx_alloc_buffers()
2654 info->rx_buf_total_size = 0x10000; in rx_alloc_buffers()
2657 info->rx_buf_count = info->rx_buf_total_size / info->rx_buf_size; in rx_alloc_buffers()
2659 info->rx_buf = kmalloc(info->rx_buf_total_size, GFP_KERNEL); in rx_alloc_buffers()
2660 if (info->rx_buf == NULL) in rx_alloc_buffers()
2664 info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL); in rx_alloc_buffers()
2665 if (!info->flag_buf) { in rx_alloc_buffers()
2666 kfree(info->rx_buf); in rx_alloc_buffers()
2667 info->rx_buf = NULL; in rx_alloc_buffers()
2671 rx_reset_buffers(info); in rx_alloc_buffers()
2675 static void rx_free_buffers(MGSLPC_INFO *info) in rx_free_buffers() argument
2677 kfree(info->rx_buf); in rx_free_buffers()
2678 info->rx_buf = NULL; in rx_free_buffers()
2679 kfree(info->flag_buf); in rx_free_buffers()
2680 info->flag_buf = NULL; in rx_free_buffers()
2683 static int claim_resources(MGSLPC_INFO *info) in claim_resources() argument
2685 if (rx_alloc_buffers(info) < 0) { in claim_resources()
2686 printk("Can't allocate rx buffer %s\n", info->device_name); in claim_resources()
2687 release_resources(info); in claim_resources()
2693 static void release_resources(MGSLPC_INFO *info) in release_resources() argument
2696 printk("release_resources(%s)\n", info->device_name); in release_resources()
2697 rx_free_buffers(info); in release_resources()
2705 static int mgslpc_add_device(MGSLPC_INFO *info) in mgslpc_add_device() argument
2711 info->next_device = NULL; in mgslpc_add_device()
2712 info->line = mgslpc_device_count; in mgslpc_add_device()
2713 sprintf(info->device_name,"ttySLP%d",info->line); in mgslpc_add_device()
2715 if (info->line < MAX_DEVICE_COUNT) { in mgslpc_add_device()
2716 if (maxframe[info->line]) in mgslpc_add_device()
2717 info->max_frame_size = maxframe[info->line]; in mgslpc_add_device()
2723 mgslpc_device_list = info; in mgslpc_add_device()
2728 current_dev->next_device = info; in mgslpc_add_device()
2731 if (info->max_frame_size < 4096) in mgslpc_add_device()
2732 info->max_frame_size = 4096; in mgslpc_add_device()
2733 else if (info->max_frame_size > 65535) in mgslpc_add_device()
2734 info->max_frame_size = 65535; in mgslpc_add_device()
2737 info->device_name, info->io_base, info->irq_level); in mgslpc_add_device()
2740 ret = hdlcdev_init(info); in mgslpc_add_device()
2745 tty_dev = tty_port_register_device(&info->port, serial_driver, info->line, in mgslpc_add_device()
2746 &info->p_dev->dev); in mgslpc_add_device()
2750 hdlcdev_exit(info); in mgslpc_add_device()
2768 MGSLPC_INFO *info = mgslpc_device_list; in mgslpc_remove_device() local
2771 while(info) { in mgslpc_remove_device()
2772 if (info == remove_info) { in mgslpc_remove_device()
2774 last->next_device = info->next_device; in mgslpc_remove_device()
2776 mgslpc_device_list = info->next_device; in mgslpc_remove_device()
2777 tty_unregister_device(serial_driver, info->line); in mgslpc_remove_device()
2779 hdlcdev_exit(info); in mgslpc_remove_device()
2781 release_resources(info); in mgslpc_remove_device()
2782 tty_port_destroy(&info->port); in mgslpc_remove_device()
2783 kfree(info); in mgslpc_remove_device()
2787 last = info; in mgslpc_remove_device()
2788 info = info->next_device; in mgslpc_remove_device()
2895 static void mgslpc_set_rate(MGSLPC_INFO *info, unsigned char channel, unsigned int rate) in mgslpc_set_rate() argument
2921 write_reg(info, (unsigned char) (channel + BGR), in mgslpc_set_rate()
2923 val = read_reg(info, (unsigned char) (channel + CCR2)) & 0x3f; in mgslpc_set_rate()
2925 write_reg(info, (unsigned char) (channel + CCR2), val); in mgslpc_set_rate()
2931 static void enable_auxclk(MGSLPC_INFO *info) in enable_auxclk() argument
2950 if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed) in enable_auxclk()
2952 write_reg(info, CHB + MODE, val); in enable_auxclk()
2964 write_reg(info, CHB + CCR0, 0xc0); in enable_auxclk()
2977 write_reg(info, CHB + CCR1, 0x17); in enable_auxclk()
2991 if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed) in enable_auxclk()
2992 write_reg(info, CHB + CCR2, 0x38); in enable_auxclk()
2994 write_reg(info, CHB + CCR2, 0x30); in enable_auxclk()
3007 write_reg(info, CHB + CCR4, 0x50); in enable_auxclk()
3012 if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed) in enable_auxclk()
3013 mgslpc_set_rate(info, CHB, info->params.clock_speed); in enable_auxclk()
3015 mgslpc_set_rate(info, CHB, 921600); in enable_auxclk()
3018 static void loopback_enable(MGSLPC_INFO *info) in loopback_enable() argument
3023 val = read_reg(info, CHA + CCR1) | (BIT2 | BIT1 | BIT0); in loopback_enable()
3024 write_reg(info, CHA + CCR1, val); in loopback_enable()
3027 val = read_reg(info, CHA + CCR2) | (BIT4 | BIT5); in loopback_enable()
3028 write_reg(info, CHA + CCR2, val); in loopback_enable()
3031 if (info->params.clock_speed) in loopback_enable()
3032 mgslpc_set_rate(info, CHA, info->params.clock_speed); in loopback_enable()
3034 mgslpc_set_rate(info, CHA, 1843200); in loopback_enable()
3037 val = read_reg(info, CHA + MODE) | BIT0; in loopback_enable()
3038 write_reg(info, CHA + MODE, val); in loopback_enable()
3041 static void hdlc_mode(MGSLPC_INFO *info) in hdlc_mode() argument
3047 irq_disable(info, CHA, 0xffff); in hdlc_mode()
3048 irq_disable(info, CHB, 0xffff); in hdlc_mode()
3049 port_irq_disable(info, 0xff); in hdlc_mode()
3053 if (info->params.flags & HDLC_FLAG_RXC_DPLL in hdlc_mode()
3054 && info->params.flags & HDLC_FLAG_TXC_DPLL) { in hdlc_mode()
3057 } else if (info->params.flags & HDLC_FLAG_RXC_BRG in hdlc_mode()
3058 && info->params.flags & HDLC_FLAG_TXC_BRG) { in hdlc_mode()
3062 } else if (info->params.flags & HDLC_FLAG_RXC_DPLL) { in hdlc_mode()
3063 if (info->params.flags & HDLC_FLAG_TXC_BRG) { in hdlc_mode()
3071 } else if (info->params.flags & HDLC_FLAG_TXC_BRG) { in hdlc_mode()
3089 if (info->params.loopback) in hdlc_mode()
3093 if (info->serial_signals & SerialSignal_RTS) in hdlc_mode()
3095 write_reg(info, CHA + MODE, val); in hdlc_mode()
3108 switch (info->params.encoding) in hdlc_mode()
3123 write_reg(info, CHA + CCR0, val); in hdlc_mode()
3137 write_reg(info, CHA + CCR1, val); in hdlc_mode()
3157 if (info->params.crc_type == HDLC_CRC_32_CCITT) in hdlc_mode()
3159 if (info->params.encoding == HDLC_ENCODING_NRZB) in hdlc_mode()
3161 write_reg(info, CHA + CCR2, val); in hdlc_mode()
3176 if (info->params.crc_type == HDLC_CRC_NONE) in hdlc_mode()
3178 if (info->params.preamble != HDLC_PREAMBLE_PATTERN_NONE) in hdlc_mode()
3180 switch (info->params.preamble_length) in hdlc_mode()
3192 write_reg(info, CHA + CCR3, val); in hdlc_mode()
3196 switch (info->params.preamble) in hdlc_mode()
3203 write_reg(info, CHA + PRE, val); in hdlc_mode()
3217 write_reg(info, CHA + CCR4, val); in hdlc_mode()
3218 if (info->params.flags & HDLC_FLAG_RXC_DPLL) in hdlc_mode()
3219 mgslpc_set_rate(info, CHA, info->params.clock_speed * 16); in hdlc_mode()
3221 mgslpc_set_rate(info, CHA, info->params.clock_speed); in hdlc_mode()
3228 write_reg(info, CHA + RLCR, 0); in hdlc_mode()
3241 if (info->params.flags & HDLC_FLAG_AUTO_DCD) in hdlc_mode()
3243 write_reg(info, CHA + XBCH, val); in hdlc_mode()
3244 enable_auxclk(info); in hdlc_mode()
3245 if (info->params.loopback || info->testing_irq) in hdlc_mode()
3246 loopback_enable(info); in hdlc_mode()
3247 if (info->params.flags & HDLC_FLAG_AUTO_CTS) in hdlc_mode()
3249 irq_enable(info, CHB, IRQ_CTS); in hdlc_mode()
3251 set_reg_bits(info, CHA + PVR, BIT3); in hdlc_mode()
3253 clear_reg_bits(info, CHA + PVR, BIT3); in hdlc_mode()
3255 irq_enable(info, CHA, in hdlc_mode()
3258 issue_command(info, CHA, CMD_TXRESET + CMD_RXRESET); in hdlc_mode()
3259 wait_command_complete(info, CHA); in hdlc_mode()
3260 read_reg16(info, CHA + ISR); /* clear pending IRQs */ in hdlc_mode()
3272 if (!info->testing_irq) in hdlc_mode()
3273 clear_reg_bits(info, CHA + CCR0, BIT6); in hdlc_mode()
3275 tx_set_idle(info); in hdlc_mode()
3277 tx_stop(info); in hdlc_mode()
3278 rx_stop(info); in hdlc_mode()
3281 static void rx_stop(MGSLPC_INFO *info) in rx_stop() argument
3285 __FILE__, __LINE__, info->device_name); in rx_stop()
3288 clear_reg_bits(info, CHA + MODE, BIT3); in rx_stop()
3290 info->rx_enabled = false; in rx_stop()
3291 info->rx_overflow = false; in rx_stop()
3294 static void rx_start(MGSLPC_INFO *info) in rx_start() argument
3298 __FILE__, __LINE__, info->device_name); in rx_start()
3300 rx_reset_buffers(info); in rx_start()
3301 info->rx_enabled = false; in rx_start()
3302 info->rx_overflow = false; in rx_start()
3305 set_reg_bits(info, CHA + MODE, BIT3); in rx_start()
3307 info->rx_enabled = true; in rx_start()
3310 static void tx_start(MGSLPC_INFO *info, struct tty_struct *tty) in tx_start() argument
3314 __FILE__, __LINE__, info->device_name); in tx_start()
3316 if (info->tx_count) { in tx_start()
3320 info->drop_rts_on_tx_done = false; in tx_start()
3322 if (info->params.flags & HDLC_FLAG_AUTO_RTS) { in tx_start()
3323 get_signals(info); in tx_start()
3324 if (!(info->serial_signals & SerialSignal_RTS)) { in tx_start()
3325 info->serial_signals |= SerialSignal_RTS; in tx_start()
3326 set_signals(info); in tx_start()
3327 info->drop_rts_on_tx_done = true; in tx_start()
3331 if (info->params.mode == MGSL_MODE_ASYNC) { in tx_start()
3332 if (!info->tx_active) { in tx_start()
3333 info->tx_active = true; in tx_start()
3334 tx_ready(info, tty); in tx_start()
3337 info->tx_active = true; in tx_start()
3338 tx_ready(info, tty); in tx_start()
3339 mod_timer(&info->tx_timer, jiffies + in tx_start()
3344 if (!info->tx_enabled) in tx_start()
3345 info->tx_enabled = true; in tx_start()
3348 static void tx_stop(MGSLPC_INFO *info) in tx_stop() argument
3352 __FILE__, __LINE__, info->device_name); in tx_stop()
3354 del_timer(&info->tx_timer); in tx_stop()
3356 info->tx_enabled = false; in tx_stop()
3357 info->tx_active = false; in tx_stop()
3362 static void reset_device(MGSLPC_INFO *info) in reset_device() argument
3365 write_reg(info, CHA + CCR0, 0x80); in reset_device()
3366 write_reg(info, CHB + CCR0, 0x80); in reset_device()
3367 write_reg(info, CHA + MODE, 0); in reset_device()
3368 write_reg(info, CHB + MODE, 0); in reset_device()
3371 irq_disable(info, CHA, 0xffff); in reset_device()
3372 irq_disable(info, CHB, 0xffff); in reset_device()
3373 port_irq_disable(info, 0xff); in reset_device()
3385 write_reg(info, PCR, 0x06); in reset_device()
3409 write_reg(info, IPC, 0x05); in reset_device()
3412 static void async_mode(MGSLPC_INFO *info) in async_mode() argument
3417 irq_disable(info, CHA, 0xffff); in async_mode()
3418 irq_disable(info, CHB, 0xffff); in async_mode()
3419 port_irq_disable(info, 0xff); in async_mode()
3435 if (info->params.loopback) in async_mode()
3439 if (!(info->serial_signals & SerialSignal_RTS)) in async_mode()
3441 write_reg(info, CHA + MODE, val); in async_mode()
3453 write_reg(info, CHA + CCR0, 0x83); in async_mode()
3464 write_reg(info, CHA + CCR1, 0x1f); in async_mode()
3478 write_reg(info, CHA + CCR2, 0x10); in async_mode()
3487 write_reg(info, CHA + CCR3, 0); in async_mode()
3499 write_reg(info, CHA + CCR4, 0x50); in async_mode()
3500 mgslpc_set_rate(info, CHA, info->params.data_rate * 16); in async_mode()
3513 if (info->params.data_bits != 8) in async_mode()
3515 if (info->params.stop_bits != 1) in async_mode()
3517 if (info->params.parity != ASYNC_PARITY_NONE) in async_mode()
3520 if (info->params.parity == ASYNC_PARITY_ODD) in async_mode()
3525 write_reg(info, CHA + DAFO, val); in async_mode()
3539 write_reg(info, CHA + RFC, 0x5c); in async_mode()
3545 write_reg(info, CHA + RLCR, 0); in async_mode()
3558 if (info->params.flags & HDLC_FLAG_AUTO_DCD) in async_mode()
3560 write_reg(info, CHA + XBCH, val); in async_mode()
3561 if (info->params.flags & HDLC_FLAG_AUTO_CTS) in async_mode()
3562 irq_enable(info, CHA, IRQ_CTS); in async_mode()
3565 set_reg_bits(info, CHA + MODE, BIT3); in async_mode()
3566 enable_auxclk(info); in async_mode()
3567 if (info->params.flags & HDLC_FLAG_AUTO_CTS) { in async_mode()
3568 irq_enable(info, CHB, IRQ_CTS); in async_mode()
3570 set_reg_bits(info, CHA + PVR, BIT3); in async_mode()
3572 clear_reg_bits(info, CHA + PVR, BIT3); in async_mode()
3573 irq_enable(info, CHA, in async_mode()
3576 issue_command(info, CHA, CMD_TXRESET + CMD_RXRESET); in async_mode()
3577 wait_command_complete(info, CHA); in async_mode()
3578 read_reg16(info, CHA + ISR); /* clear pending IRQs */ in async_mode()
3583 static void tx_set_idle(MGSLPC_INFO *info) in tx_set_idle() argument
3586 if (info->idle_mode == HDLC_TXIDLE_FLAGS) in tx_set_idle()
3587 set_reg_bits(info, CHA + CCR1, BIT3); in tx_set_idle()
3589 clear_reg_bits(info, CHA + CCR1, BIT3); in tx_set_idle()
3594 static void get_signals(MGSLPC_INFO *info) in get_signals() argument
3599 info->serial_signals &= SerialSignal_RTS | SerialSignal_DTR; in get_signals()
3601 if (read_reg(info, CHB + VSTR) & BIT7) in get_signals()
3602 info->serial_signals |= SerialSignal_DCD; in get_signals()
3603 if (read_reg(info, CHB + STAR) & BIT1) in get_signals()
3604 info->serial_signals |= SerialSignal_CTS; in get_signals()
3606 status = read_reg(info, CHA + PVR); in get_signals()
3608 info->serial_signals |= SerialSignal_RI; in get_signals()
3610 info->serial_signals |= SerialSignal_DSR; in get_signals()
3616 static void set_signals(MGSLPC_INFO *info) in set_signals() argument
3620 val = read_reg(info, CHA + MODE); in set_signals()
3621 if (info->params.mode == MGSL_MODE_ASYNC) { in set_signals()
3622 if (info->serial_signals & SerialSignal_RTS) in set_signals()
3627 if (info->serial_signals & SerialSignal_RTS) in set_signals()
3632 write_reg(info, CHA + MODE, val); in set_signals()
3634 if (info->serial_signals & SerialSignal_DTR) in set_signals()
3635 clear_reg_bits(info, CHA + PVR, PVR_DTR); in set_signals()
3637 set_reg_bits(info, CHA + PVR, PVR_DTR); in set_signals()
3640 static void rx_reset_buffers(MGSLPC_INFO *info) in rx_reset_buffers() argument
3645 info->rx_put = 0; in rx_reset_buffers()
3646 info->rx_get = 0; in rx_reset_buffers()
3647 info->rx_frame_count = 0; in rx_reset_buffers()
3648 for (i=0 ; i < info->rx_buf_count ; i++) { in rx_reset_buffers()
3649 buf = (RXBUF*)(info->rx_buf + (i * info->rx_buf_size)); in rx_reset_buffers()
3659 static bool rx_get_frame(MGSLPC_INFO *info, struct tty_struct *tty) in rx_get_frame() argument
3667 if (info->rx_frame_count == 0) in rx_get_frame()
3670 buf = (RXBUF*)(info->rx_buf + (info->rx_get * info->rx_buf_size)); in rx_get_frame()
3681 info->icount.rxabort++; in rx_get_frame()
3683 info->icount.rxover++; in rx_get_frame()
3685 info->icount.rxcrc++; in rx_get_frame()
3686 if (info->params.crc_type & HDLC_CRC_RETURN_EX) in rx_get_frame()
3692 info->netdev->stats.rx_errors++; in rx_get_frame()
3693 info->netdev->stats.rx_frame_errors++; in rx_get_frame()
3704 __FILE__, __LINE__, info->device_name, status, framesize); in rx_get_frame()
3707 trace_block(info, buf->data, framesize, 0); in rx_get_frame()
3710 if ((info->params.crc_type & HDLC_CRC_RETURN_EX && in rx_get_frame()
3711 framesize+1 > info->max_frame_size) || in rx_get_frame()
3712 framesize > info->max_frame_size) in rx_get_frame()
3713 info->icount.rxlong++; in rx_get_frame()
3716 info->icount.rxok++; in rx_get_frame()
3718 if (info->params.crc_type & HDLC_CRC_RETURN_EX) { in rx_get_frame()
3724 if (info->netcount) in rx_get_frame()
3725 hdlcdev_rx(info, buf->data, framesize); in rx_get_frame()
3728 ldisc_receive_buf(tty, buf->data, info->flag_buf, framesize); in rx_get_frame()
3732 spin_lock_irqsave(&info->lock, flags); in rx_get_frame()
3734 info->rx_frame_count--; in rx_get_frame()
3735 info->rx_get++; in rx_get_frame()
3736 if (info->rx_get >= info->rx_buf_count) in rx_get_frame()
3737 info->rx_get = 0; in rx_get_frame()
3738 spin_unlock_irqrestore(&info->lock, flags); in rx_get_frame()
3743 static bool register_test(MGSLPC_INFO *info) in register_test() argument
3752 spin_lock_irqsave(&info->lock, flags); in register_test()
3753 reset_device(info); in register_test()
3756 write_reg(info, XAD1, patterns[i]); in register_test()
3757 write_reg(info, XAD2, patterns[(i + 1) % count]); in register_test()
3758 if ((read_reg(info, XAD1) != patterns[i]) || in register_test()
3759 (read_reg(info, XAD2) != patterns[(i + 1) % count])) { in register_test()
3765 spin_unlock_irqrestore(&info->lock, flags); in register_test()
3769 static bool irq_test(MGSLPC_INFO *info) in irq_test() argument
3774 spin_lock_irqsave(&info->lock, flags); in irq_test()
3775 reset_device(info); in irq_test()
3777 info->testing_irq = true; in irq_test()
3778 hdlc_mode(info); in irq_test()
3780 info->irq_occurred = false; in irq_test()
3784 irq_enable(info, CHA, IRQ_TIMER); in irq_test()
3785 write_reg(info, CHA + TIMR, 0); /* 512 cycles */ in irq_test()
3786 issue_command(info, CHA, CMD_START_TIMER); in irq_test()
3788 spin_unlock_irqrestore(&info->lock, flags); in irq_test()
3791 while(end_time-- && !info->irq_occurred) { in irq_test()
3795 info->testing_irq = false; in irq_test()
3797 spin_lock_irqsave(&info->lock, flags); in irq_test()
3798 reset_device(info); in irq_test()
3799 spin_unlock_irqrestore(&info->lock, flags); in irq_test()
3801 return info->irq_occurred; in irq_test()
3804 static int adapter_test(MGSLPC_INFO *info) in adapter_test() argument
3806 if (!register_test(info)) { in adapter_test()
3807 info->init_error = DiagStatus_AddressFailure; in adapter_test()
3809 __FILE__, __LINE__, info->device_name, (unsigned short)(info->io_base)); in adapter_test()
3813 if (!irq_test(info)) { in adapter_test()
3814 info->init_error = DiagStatus_IrqFailure; in adapter_test()
3816 __FILE__, __LINE__, info->device_name, (unsigned short)(info->irq_level)); in adapter_test()
3822 __FILE__, __LINE__, info->device_name); in adapter_test()
3826 static void trace_block(MGSLPC_INFO *info,const char* data, int count, int xmit) in trace_block() argument
3831 printk("%s tx data:\n", info->device_name); in trace_block()
3833 printk("%s rx data:\n", info->device_name); in trace_block()
3863 MGSLPC_INFO *info = (MGSLPC_INFO*)context; in tx_timeout() local
3868 __FILE__, __LINE__, info->device_name); in tx_timeout()
3869 if (info->tx_active && in tx_timeout()
3870 info->params.mode == MGSL_MODE_HDLC) { in tx_timeout()
3871 info->icount.txtimeout++; in tx_timeout()
3873 spin_lock_irqsave(&info->lock, flags); in tx_timeout()
3874 info->tx_active = false; in tx_timeout()
3875 info->tx_count = info->tx_put = info->tx_get = 0; in tx_timeout()
3877 spin_unlock_irqrestore(&info->lock, flags); in tx_timeout()
3880 if (info->netcount) in tx_timeout()
3881 hdlcdev_tx_done(info); in tx_timeout()
3885 struct tty_struct *tty = tty_port_tty_get(&info->port); in tx_timeout()
3886 bh_transmit(info, tty); in tx_timeout()
3906 MGSLPC_INFO *info = dev_to_port(dev); in hdlcdev_attach() local
3912 if (info->port.count) in hdlcdev_attach()
3933 info->params.encoding = new_encoding; in hdlcdev_attach()
3934 info->params.crc_type = new_crctype; in hdlcdev_attach()
3937 if (info->netcount) { in hdlcdev_attach()
3938 tty = tty_port_tty_get(&info->port); in hdlcdev_attach()
3939 mgslpc_program_hw(info, tty); in hdlcdev_attach()
3955 MGSLPC_INFO *info = dev_to_port(dev); in hdlcdev_xmit() local
3965 skb_copy_from_linear_data(skb, info->tx_buf, skb->len); in hdlcdev_xmit()
3966 info->tx_get = 0; in hdlcdev_xmit()
3967 info->tx_put = info->tx_count = skb->len; in hdlcdev_xmit()
3980 spin_lock_irqsave(&info->lock, flags); in hdlcdev_xmit()
3981 if (!info->tx_active) { in hdlcdev_xmit()
3982 struct tty_struct *tty = tty_port_tty_get(&info->port); in hdlcdev_xmit()
3983 tx_start(info, tty); in hdlcdev_xmit()
3986 spin_unlock_irqrestore(&info->lock, flags); in hdlcdev_xmit()
4001 MGSLPC_INFO *info = dev_to_port(dev); in hdlcdev_open() local
4015 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_open()
4016 if (info->port.count != 0 || info->netcount != 0) { in hdlcdev_open()
4018 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
4021 info->netcount=1; in hdlcdev_open()
4022 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
4024 tty = tty_port_tty_get(&info->port); in hdlcdev_open()
4026 rc = startup(info, tty); in hdlcdev_open()
4029 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_open()
4030 info->netcount=0; in hdlcdev_open()
4031 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
4035 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in hdlcdev_open()
4036 mgslpc_program_hw(info, tty); in hdlcdev_open()
4044 spin_lock_irqsave(&info->lock, flags); in hdlcdev_open()
4045 get_signals(info); in hdlcdev_open()
4046 spin_unlock_irqrestore(&info->lock, flags); in hdlcdev_open()
4047 if (info->serial_signals & SerialSignal_DCD) in hdlcdev_open()
4064 MGSLPC_INFO *info = dev_to_port(dev); in hdlcdev_close() local
4065 struct tty_struct *tty = tty_port_tty_get(&info->port); in hdlcdev_close()
4074 shutdown(info, tty); in hdlcdev_close()
4078 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_close()
4079 info->netcount=0; in hdlcdev_close()
4080 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_close()
4099 MGSLPC_INFO *info = dev_to_port(dev); in hdlcdev_ioctl() local
4106 if (info->port.count) in hdlcdev_ioctl()
4123 flags = info->params.flags & (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL | in hdlcdev_ioctl()
4136 new_line.clock_rate = info->params.clock_speed; in hdlcdev_ioctl()
4137 new_line.loopback = info->params.loopback ? 1:0; in hdlcdev_ioctl()
4156 case CLOCK_DEFAULT: flags = info->params.flags & in hdlcdev_ioctl()
4167 info->params.flags &= ~(HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL | in hdlcdev_ioctl()
4171 info->params.flags |= flags; in hdlcdev_ioctl()
4173 info->params.loopback = new_line.loopback; in hdlcdev_ioctl()
4176 info->params.clock_speed = new_line.clock_rate; in hdlcdev_ioctl()
4178 info->params.clock_speed = 0; in hdlcdev_ioctl()
4181 if (info->netcount) { in hdlcdev_ioctl()
4182 struct tty_struct *tty = tty_port_tty_get(&info->port); in hdlcdev_ioctl()
4183 mgslpc_program_hw(info, tty); in hdlcdev_ioctl()
4200 MGSLPC_INFO *info = dev_to_port(dev); in hdlcdev_tx_timeout() local
4209 spin_lock_irqsave(&info->lock, flags); in hdlcdev_tx_timeout()
4210 tx_stop(info); in hdlcdev_tx_timeout()
4211 spin_unlock_irqrestore(&info->lock, flags); in hdlcdev_tx_timeout()
4222 static void hdlcdev_tx_done(MGSLPC_INFO *info) in hdlcdev_tx_done() argument
4224 if (netif_queue_stopped(info->netdev)) in hdlcdev_tx_done()
4225 netif_wake_queue(info->netdev); in hdlcdev_tx_done()
4236 static void hdlcdev_rx(MGSLPC_INFO *info, char *buf, int size) in hdlcdev_rx() argument
4239 struct net_device *dev = info->netdev; in hdlcdev_rx()
4277 static int hdlcdev_init(MGSLPC_INFO *info) in hdlcdev_init() argument
4285 dev = alloc_hdlcdev(info); in hdlcdev_init()
4292 dev->base_addr = info->io_base; in hdlcdev_init()
4293 dev->irq = info->irq_level; in hdlcdev_init()
4313 info->netdev = dev; in hdlcdev_init()
4323 static void hdlcdev_exit(MGSLPC_INFO *info) in hdlcdev_exit() argument
4325 unregister_hdlc_device(info->netdev); in hdlcdev_exit()
4326 free_netdev(info->netdev); in hdlcdev_exit()
4327 info->netdev = NULL; in hdlcdev_exit()