Lines Matching refs:info

601 void usc_DisableMasterIrqBit( struct mgsl_struct *info );
602 void usc_EnableMasterIrqBit( struct mgsl_struct *info );
603 void usc_EnableInterrupts( struct mgsl_struct *info, u16 IrqMask );
604 void usc_DisableInterrupts( struct mgsl_struct *info, u16 IrqMask );
605 void usc_ClearIrqPendingBits( struct mgsl_struct *info, u16 IrqMask );
665 static u16 usc_InDmaReg( struct mgsl_struct *info, u16 Port );
666 static void usc_OutDmaReg( struct mgsl_struct *info, u16 Port, u16 Value );
667 static void usc_DmaCmd( struct mgsl_struct *info, u16 Cmd );
669 static u16 usc_InReg( struct mgsl_struct *info, u16 Port );
670 static void usc_OutReg( struct mgsl_struct *info, u16 Port, u16 Value );
671 static void usc_RTCmd( struct mgsl_struct *info, u16 Cmd );
672 void usc_RCmd( struct mgsl_struct *info, u16 Cmd );
673 void usc_TCmd( struct mgsl_struct *info, u16 Cmd );
680 static void usc_process_rxoverrun_sync( struct mgsl_struct *info );
681 static void usc_start_receiver( struct mgsl_struct *info );
682 static void usc_stop_receiver( struct mgsl_struct *info );
684 static void usc_start_transmitter( struct mgsl_struct *info );
685 static void usc_stop_transmitter( struct mgsl_struct *info );
686 static void usc_set_txidle( struct mgsl_struct *info );
687 static void usc_load_txfifo( struct mgsl_struct *info );
689 static void usc_enable_aux_clock( struct mgsl_struct *info, u32 DataRate );
690 static void usc_enable_loopback( struct mgsl_struct *info, int enable );
692 static void usc_get_serial_signals( struct mgsl_struct *info );
693 static void usc_set_serial_signals( struct mgsl_struct *info );
695 static void usc_reset( struct mgsl_struct *info );
697 static void usc_set_sync_mode( struct mgsl_struct *info );
698 static void usc_set_sdlc_mode( struct mgsl_struct *info );
699 static void usc_set_async_mode( struct mgsl_struct *info );
700 static void usc_enable_async_clock( struct mgsl_struct *info, u32 DataRate );
702 static void usc_loopback_frame( struct mgsl_struct *info );
707 static void usc_loopmode_cancel_transmit( struct mgsl_struct * info );
708 static void usc_loopmode_insert_request( struct mgsl_struct * info );
709 static int usc_loopmode_active( struct mgsl_struct * info);
710 static void usc_loopmode_send_done( struct mgsl_struct * info );
712 static int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigned long arg);
716 static void hdlcdev_tx_done(struct mgsl_struct *info);
717 static void hdlcdev_rx(struct mgsl_struct *info, char *buf, int size);
718 static int hdlcdev_init(struct mgsl_struct *info);
719 static void hdlcdev_exit(struct mgsl_struct *info);
738 static void mgsl_trace_block(struct mgsl_struct *info,const char* data, int count, int xmit);
743 static bool mgsl_register_test( struct mgsl_struct *info );
744 static bool mgsl_irq_test( struct mgsl_struct *info );
745 static bool mgsl_dma_test( struct mgsl_struct *info );
746 static bool mgsl_memory_test( struct mgsl_struct *info );
747 static int mgsl_adapter_test( struct mgsl_struct *info );
752 static int mgsl_claim_resources(struct mgsl_struct *info);
753 static void mgsl_release_resources(struct mgsl_struct *info);
754 static void mgsl_add_device(struct mgsl_struct *info);
760 static void mgsl_free_rx_frame_buffers( struct mgsl_struct *info, unsigned int StartIndex, unsigned…
761 static bool mgsl_get_rx_frame( struct mgsl_struct *info );
762 static bool mgsl_get_raw_rx_frame( struct mgsl_struct *info );
763 static void mgsl_reset_rx_dma_buffers( struct mgsl_struct *info );
764 static void mgsl_reset_tx_dma_buffers( struct mgsl_struct *info );
765 static int num_free_tx_dma_buffers(struct mgsl_struct *info);
766 static void mgsl_load_tx_dma_buffer( struct mgsl_struct *info, const char *Buffer, unsigned int Buf…
772 static int mgsl_allocate_dma_buffers(struct mgsl_struct *info);
773 static void mgsl_free_dma_buffers(struct mgsl_struct *info);
774 static int mgsl_alloc_frame_memory(struct mgsl_struct *info, DMABUFFERENTRY *BufferList,int Buffer…
775 static void mgsl_free_frame_memory(struct mgsl_struct *info, DMABUFFERENTRY *BufferList,int Bufferc…
776 static int mgsl_alloc_buffer_list_memory(struct mgsl_struct *info);
777 static void mgsl_free_buffer_list_memory(struct mgsl_struct *info);
778 static int mgsl_alloc_intermediate_rxbuffer_memory(struct mgsl_struct *info);
779 static void mgsl_free_intermediate_rxbuffer_memory(struct mgsl_struct *info);
780 static int mgsl_alloc_intermediate_txbuffer_memory(struct mgsl_struct *info);
781 static void mgsl_free_intermediate_txbuffer_memory(struct mgsl_struct *info);
782 static bool load_next_tx_holding_buffer(struct mgsl_struct *info);
783 static int save_tx_buffer_request(struct mgsl_struct *info,const char *Buffer, unsigned int BufferS…
789 static void mgsl_bh_receive(struct mgsl_struct *info);
790 static void mgsl_bh_transmit(struct mgsl_struct *info);
791 static void mgsl_bh_status(struct mgsl_struct *info);
796 static void mgsl_isr_null( struct mgsl_struct *info );
797 static void mgsl_isr_transmit_data( struct mgsl_struct *info );
798 static void mgsl_isr_receive_data( struct mgsl_struct *info );
799 static void mgsl_isr_receive_status( struct mgsl_struct *info );
800 static void mgsl_isr_transmit_status( struct mgsl_struct *info );
801 static void mgsl_isr_io_pin( struct mgsl_struct *info );
802 static void mgsl_isr_misc( struct mgsl_struct *info );
803 static void mgsl_isr_receive_dma( struct mgsl_struct *info );
804 static void mgsl_isr_transmit_dma( struct mgsl_struct *info );
825 static int mgsl_get_stats(struct mgsl_struct * info, struct mgsl_icount
827 static int mgsl_get_params(struct mgsl_struct * info, MGSL_PARAMS __user *user_params);
828 static int mgsl_set_params(struct mgsl_struct * info, MGSL_PARAMS __user *new_params);
829 static int mgsl_get_txidle(struct mgsl_struct * info, int __user *idle_mode);
830 static int mgsl_set_txidle(struct mgsl_struct * info, int idle_mode);
831 static int mgsl_txenable(struct mgsl_struct * info, int enable);
832 static int mgsl_txabort(struct mgsl_struct * info);
833 static int mgsl_rxenable(struct mgsl_struct * info, int enable);
834 static int mgsl_wait_event(struct mgsl_struct * info, int __user *mask);
835 static int mgsl_loopmode_send_done( struct mgsl_struct * info );
909 static void mgsl_change_params(struct mgsl_struct *info);
923 static inline int mgsl_paranoia_check(struct mgsl_struct *info, in mgsl_paranoia_check() argument
932 if (!info) { in mgsl_paranoia_check()
936 if (info->magic != MGSL_MAGIC) { in mgsl_paranoia_check()
941 if (!info) in mgsl_paranoia_check()
977 struct mgsl_struct *info = tty->driver_data; in mgsl_stop() local
980 if (mgsl_paranoia_check(info, tty->name, "mgsl_stop")) in mgsl_stop()
984 printk("mgsl_stop(%s)\n",info->device_name); in mgsl_stop()
986 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_stop()
987 if (info->tx_enabled) in mgsl_stop()
988 usc_stop_transmitter(info); in mgsl_stop()
989 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_stop()
1000 struct mgsl_struct *info = tty->driver_data; in mgsl_start() local
1003 if (mgsl_paranoia_check(info, tty->name, "mgsl_start")) in mgsl_start()
1007 printk("mgsl_start(%s)\n",info->device_name); in mgsl_start()
1009 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_start()
1010 if (!info->tx_enabled) in mgsl_start()
1011 usc_start_transmitter(info); in mgsl_start()
1012 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_start()
1023 static int mgsl_bh_action(struct mgsl_struct *info) in mgsl_bh_action() argument
1028 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_bh_action()
1030 if (info->pending_bh & BH_RECEIVE) { in mgsl_bh_action()
1031 info->pending_bh &= ~BH_RECEIVE; in mgsl_bh_action()
1033 } else if (info->pending_bh & BH_TRANSMIT) { in mgsl_bh_action()
1034 info->pending_bh &= ~BH_TRANSMIT; in mgsl_bh_action()
1036 } else if (info->pending_bh & BH_STATUS) { in mgsl_bh_action()
1037 info->pending_bh &= ~BH_STATUS; in mgsl_bh_action()
1043 info->bh_running = false; in mgsl_bh_action()
1044 info->bh_requested = false; in mgsl_bh_action()
1047 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_bh_action()
1057 struct mgsl_struct *info = in mgsl_bh_handler() local
1063 __FILE__,__LINE__,info->device_name); in mgsl_bh_handler()
1065 info->bh_running = true; in mgsl_bh_handler()
1067 while((action = mgsl_bh_action(info)) != 0) { in mgsl_bh_handler()
1077 mgsl_bh_receive(info); in mgsl_bh_handler()
1080 mgsl_bh_transmit(info); in mgsl_bh_handler()
1083 mgsl_bh_status(info); in mgsl_bh_handler()
1094 __FILE__,__LINE__,info->device_name); in mgsl_bh_handler()
1097 static void mgsl_bh_receive(struct mgsl_struct *info) in mgsl_bh_receive() argument
1099 bool (*get_rx_frame)(struct mgsl_struct *info) = in mgsl_bh_receive()
1100 (info->params.mode == MGSL_MODE_HDLC ? mgsl_get_rx_frame : mgsl_get_raw_rx_frame); in mgsl_bh_receive()
1104 __FILE__,__LINE__,info->device_name); in mgsl_bh_receive()
1108 if (info->rx_rcc_underrun) { in mgsl_bh_receive()
1110 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_bh_receive()
1111 usc_start_receiver(info); in mgsl_bh_receive()
1112 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_bh_receive()
1115 } while(get_rx_frame(info)); in mgsl_bh_receive()
1118 static void mgsl_bh_transmit(struct mgsl_struct *info) in mgsl_bh_transmit() argument
1120 struct tty_struct *tty = info->port.tty; in mgsl_bh_transmit()
1125 __FILE__,__LINE__,info->device_name); in mgsl_bh_transmit()
1133 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_bh_transmit()
1134 if ( !info->tx_active && info->loopmode_send_done_requested ) in mgsl_bh_transmit()
1135 usc_loopmode_send_done( info ); in mgsl_bh_transmit()
1136 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_bh_transmit()
1139 static void mgsl_bh_status(struct mgsl_struct *info) in mgsl_bh_status() argument
1143 __FILE__,__LINE__,info->device_name); in mgsl_bh_status()
1145 info->ri_chkcount = 0; in mgsl_bh_status()
1146 info->dsr_chkcount = 0; in mgsl_bh_status()
1147 info->dcd_chkcount = 0; in mgsl_bh_status()
1148 info->cts_chkcount = 0; in mgsl_bh_status()
1160 static void mgsl_isr_receive_status( struct mgsl_struct *info ) in mgsl_isr_receive_status() argument
1162 u16 status = usc_InReg( info, RCSR ); in mgsl_isr_receive_status()
1169 info->loopmode_insert_requested && in mgsl_isr_receive_status()
1170 usc_loopmode_active(info) ) in mgsl_isr_receive_status()
1172 ++info->icount.rxabort; in mgsl_isr_receive_status()
1173 info->loopmode_insert_requested = false; in mgsl_isr_receive_status()
1176 info->cmr_value &= ~BIT13; in mgsl_isr_receive_status()
1177 usc_OutReg(info, CMR, info->cmr_value); in mgsl_isr_receive_status()
1180 usc_OutReg(info, RICR, in mgsl_isr_receive_status()
1181 (usc_InReg(info, RICR) & ~RXSTATUS_ABORT_RECEIVED)); in mgsl_isr_receive_status()
1186 info->icount.exithunt++; in mgsl_isr_receive_status()
1188 info->icount.rxidle++; in mgsl_isr_receive_status()
1189 wake_up_interruptible(&info->event_wait_q); in mgsl_isr_receive_status()
1193 info->icount.rxover++; in mgsl_isr_receive_status()
1194 usc_process_rxoverrun_sync( info ); in mgsl_isr_receive_status()
1197 usc_ClearIrqPendingBits( info, RECEIVE_STATUS ); in mgsl_isr_receive_status()
1198 usc_UnlatchRxstatusBits( info, status ); in mgsl_isr_receive_status()
1212 static void mgsl_isr_transmit_status( struct mgsl_struct *info ) in mgsl_isr_transmit_status() argument
1214 u16 status = usc_InReg( info, TCSR ); in mgsl_isr_transmit_status()
1220 usc_ClearIrqPendingBits( info, TRANSMIT_STATUS ); in mgsl_isr_transmit_status()
1221 usc_UnlatchTxstatusBits( info, status ); in mgsl_isr_transmit_status()
1230 usc_DmaCmd( info, DmaCmd_ResetTxChannel ); in mgsl_isr_transmit_status()
1231 usc_RTCmd( info, RTCmd_PurgeTxFifo ); in mgsl_isr_transmit_status()
1235 info->icount.txok++; in mgsl_isr_transmit_status()
1237 info->icount.txunder++; in mgsl_isr_transmit_status()
1239 info->icount.txabort++; in mgsl_isr_transmit_status()
1241 info->icount.txunder++; in mgsl_isr_transmit_status()
1243 info->tx_active = false; in mgsl_isr_transmit_status()
1244 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mgsl_isr_transmit_status()
1245 del_timer(&info->tx_timer); in mgsl_isr_transmit_status()
1247 if ( info->drop_rts_on_tx_done ) { in mgsl_isr_transmit_status()
1248 usc_get_serial_signals( info ); in mgsl_isr_transmit_status()
1249 if ( info->serial_signals & SerialSignal_RTS ) { in mgsl_isr_transmit_status()
1250 info->serial_signals &= ~SerialSignal_RTS; in mgsl_isr_transmit_status()
1251 usc_set_serial_signals( info ); in mgsl_isr_transmit_status()
1253 info->drop_rts_on_tx_done = false; in mgsl_isr_transmit_status()
1257 if (info->netcount) in mgsl_isr_transmit_status()
1258 hdlcdev_tx_done(info); in mgsl_isr_transmit_status()
1262 if (info->port.tty->stopped || info->port.tty->hw_stopped) { in mgsl_isr_transmit_status()
1263 usc_stop_transmitter(info); in mgsl_isr_transmit_status()
1266 info->pending_bh |= BH_TRANSMIT; in mgsl_isr_transmit_status()
1279 static void mgsl_isr_io_pin( struct mgsl_struct *info ) in mgsl_isr_io_pin() argument
1282 u16 status = usc_InReg( info, MISR ); in mgsl_isr_io_pin()
1288 usc_ClearIrqPendingBits( info, IO_PIN ); in mgsl_isr_io_pin()
1289 usc_UnlatchIostatusBits( info, status ); in mgsl_isr_io_pin()
1293 icount = &info->icount; in mgsl_isr_io_pin()
1296 if ((info->ri_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in mgsl_isr_io_pin()
1297 usc_DisablestatusIrqs(info,SICR_RI); in mgsl_isr_io_pin()
1300 info->input_signal_events.ri_up++; in mgsl_isr_io_pin()
1302 info->input_signal_events.ri_down++; in mgsl_isr_io_pin()
1305 if ((info->dsr_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in mgsl_isr_io_pin()
1306 usc_DisablestatusIrqs(info,SICR_DSR); in mgsl_isr_io_pin()
1309 info->input_signal_events.dsr_up++; in mgsl_isr_io_pin()
1311 info->input_signal_events.dsr_down++; in mgsl_isr_io_pin()
1314 if ((info->dcd_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in mgsl_isr_io_pin()
1315 usc_DisablestatusIrqs(info,SICR_DCD); in mgsl_isr_io_pin()
1318 info->input_signal_events.dcd_up++; in mgsl_isr_io_pin()
1320 info->input_signal_events.dcd_down++; in mgsl_isr_io_pin()
1322 if (info->netcount) { in mgsl_isr_io_pin()
1324 netif_carrier_on(info->netdev); in mgsl_isr_io_pin()
1326 netif_carrier_off(info->netdev); in mgsl_isr_io_pin()
1332 if ((info->cts_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT) in mgsl_isr_io_pin()
1333 usc_DisablestatusIrqs(info,SICR_CTS); in mgsl_isr_io_pin()
1336 info->input_signal_events.cts_up++; in mgsl_isr_io_pin()
1338 info->input_signal_events.cts_down++; in mgsl_isr_io_pin()
1340 wake_up_interruptible(&info->status_event_wait_q); in mgsl_isr_io_pin()
1341 wake_up_interruptible(&info->event_wait_q); in mgsl_isr_io_pin()
1343 if ( (info->port.flags & ASYNC_CHECK_CD) && in mgsl_isr_io_pin()
1346 printk("%s CD now %s...", info->device_name, in mgsl_isr_io_pin()
1349 wake_up_interruptible(&info->port.open_wait); in mgsl_isr_io_pin()
1353 if (info->port.tty) in mgsl_isr_io_pin()
1354 tty_hangup(info->port.tty); in mgsl_isr_io_pin()
1358 if (tty_port_cts_enabled(&info->port) && in mgsl_isr_io_pin()
1360 if (info->port.tty->hw_stopped) { in mgsl_isr_io_pin()
1364 if (info->port.tty) in mgsl_isr_io_pin()
1365 info->port.tty->hw_stopped = 0; in mgsl_isr_io_pin()
1366 usc_start_transmitter(info); in mgsl_isr_io_pin()
1367 info->pending_bh |= BH_TRANSMIT; in mgsl_isr_io_pin()
1374 if (info->port.tty) in mgsl_isr_io_pin()
1375 info->port.tty->hw_stopped = 1; in mgsl_isr_io_pin()
1376 usc_stop_transmitter(info); in mgsl_isr_io_pin()
1382 info->pending_bh |= BH_STATUS; in mgsl_isr_io_pin()
1386 usc_OutReg( info, SICR, in mgsl_isr_io_pin()
1387 (unsigned short)(usc_InReg(info,SICR) & ~(SICR_TXC_ACTIVE+SICR_TXC_INACTIVE)) ); in mgsl_isr_io_pin()
1388 usc_UnlatchIostatusBits( info, MISCSTATUS_TXC_LATCHED ); in mgsl_isr_io_pin()
1389 info->irq_occurred = true; in mgsl_isr_io_pin()
1401 static void mgsl_isr_transmit_data( struct mgsl_struct *info ) in mgsl_isr_transmit_data() argument
1405 __FILE__,__LINE__,info->xmit_cnt); in mgsl_isr_transmit_data()
1407 usc_ClearIrqPendingBits( info, TRANSMIT_DATA ); in mgsl_isr_transmit_data()
1409 if (info->port.tty->stopped || info->port.tty->hw_stopped) { in mgsl_isr_transmit_data()
1410 usc_stop_transmitter(info); in mgsl_isr_transmit_data()
1414 if ( info->xmit_cnt ) in mgsl_isr_transmit_data()
1415 usc_load_txfifo( info ); in mgsl_isr_transmit_data()
1417 info->tx_active = false; in mgsl_isr_transmit_data()
1419 if (info->xmit_cnt < WAKEUP_CHARS) in mgsl_isr_transmit_data()
1420 info->pending_bh |= BH_TRANSMIT; in mgsl_isr_transmit_data()
1433 static void mgsl_isr_receive_data( struct mgsl_struct *info ) in mgsl_isr_receive_data() argument
1439 struct mgsl_icount *icount = &info->icount; in mgsl_isr_receive_data()
1445 usc_ClearIrqPendingBits( info, RECEIVE_DATA ); in mgsl_isr_receive_data()
1448 usc_RCmd( info, RCmd_SelectRicrRxFifostatus ); in mgsl_isr_receive_data()
1452 usc_OutReg( info, RICR+LSBONLY, (u16)(usc_InReg(info, RICR+LSBONLY) & ~BIT3 )); in mgsl_isr_receive_data()
1456 while( (Fifocount = (usc_InReg(info,RICR) >> 8)) ) { in mgsl_isr_receive_data()
1460 outw( (inw(info->io_base + CCAR) & 0x0780) | (RDR+LSBONLY), in mgsl_isr_receive_data()
1461 info->io_base + CCAR ); in mgsl_isr_receive_data()
1462 DataByte = inb( info->io_base + CCAR ); in mgsl_isr_receive_data()
1465 status = usc_InReg(info, RCSR); in mgsl_isr_receive_data()
1468 usc_UnlatchRxstatusBits(info,RXSTATUS_ALL); in mgsl_isr_receive_data()
1487 usc_RTCmd(info,RTCmd_PurgeRxFifo); in mgsl_isr_receive_data()
1492 if (status & info->ignore_status_mask) in mgsl_isr_receive_data()
1495 status &= info->read_status_mask; in mgsl_isr_receive_data()
1499 if (info->port.flags & ASYNC_SAK) in mgsl_isr_receive_data()
1500 do_SAK(info->port.tty); in mgsl_isr_receive_data()
1506 tty_insert_flip_char(&info->port, DataByte, flag); in mgsl_isr_receive_data()
1512 work += tty_insert_flip_char(&info->port, 0, TTY_OVERRUN); in mgsl_isr_receive_data()
1523 tty_flip_buffer_push(&info->port); in mgsl_isr_receive_data()
1533 static void mgsl_isr_misc( struct mgsl_struct *info ) in mgsl_isr_misc() argument
1535 u16 status = usc_InReg( info, MISR ); in mgsl_isr_misc()
1542 (info->params.mode == MGSL_MODE_HDLC)) { in mgsl_isr_misc()
1545 usc_EnableReceiver(info,DISABLE_UNCONDITIONAL); in mgsl_isr_misc()
1546 usc_DmaCmd(info, DmaCmd_ResetRxChannel); in mgsl_isr_misc()
1547 usc_UnlatchRxstatusBits(info, RXSTATUS_ALL); in mgsl_isr_misc()
1548 usc_ClearIrqPendingBits(info, RECEIVE_DATA | RECEIVE_STATUS); in mgsl_isr_misc()
1549 usc_DisableInterrupts(info, RECEIVE_DATA | RECEIVE_STATUS); in mgsl_isr_misc()
1552 info->pending_bh |= BH_RECEIVE; in mgsl_isr_misc()
1553 info->rx_rcc_underrun = true; in mgsl_isr_misc()
1556 usc_ClearIrqPendingBits( info, MISC ); in mgsl_isr_misc()
1557 usc_UnlatchMiscstatusBits( info, status ); in mgsl_isr_misc()
1569 static void mgsl_isr_null( struct mgsl_struct *info ) in mgsl_isr_null() argument
1593 static void mgsl_isr_receive_dma( struct mgsl_struct *info ) in mgsl_isr_receive_dma() argument
1598 usc_OutDmaReg( info, CDIR, BIT9 | BIT1 ); in mgsl_isr_receive_dma()
1602 status = usc_InDmaReg( info, RDMR ); in mgsl_isr_receive_dma()
1606 __FILE__,__LINE__,info->device_name,status); in mgsl_isr_receive_dma()
1608 info->pending_bh |= BH_RECEIVE; in mgsl_isr_receive_dma()
1611 info->rx_overflow = true; in mgsl_isr_receive_dma()
1612 info->icount.buf_overrun++; in mgsl_isr_receive_dma()
1637 static void mgsl_isr_transmit_dma( struct mgsl_struct *info ) in mgsl_isr_transmit_dma() argument
1642 usc_OutDmaReg(info, CDIR, BIT8 | BIT0 ); in mgsl_isr_transmit_dma()
1647 status = usc_InDmaReg( info, TDMR ); in mgsl_isr_transmit_dma()
1651 __FILE__,__LINE__,info->device_name,status); in mgsl_isr_transmit_dma()
1654 --info->tx_dma_buffers_used; in mgsl_isr_transmit_dma()
1659 if ( load_next_tx_holding_buffer(info) ) { in mgsl_isr_transmit_dma()
1663 info->pending_bh |= BH_TRANSMIT; in mgsl_isr_transmit_dma()
1682 struct mgsl_struct *info = dev_id; in mgsl_interrupt() local
1688 __FILE__, __LINE__, info->irq_level); in mgsl_interrupt()
1690 spin_lock(&info->irq_spinlock); in mgsl_interrupt()
1694 UscVector = usc_InReg(info, IVR) >> 9; in mgsl_interrupt()
1695 DmaVector = usc_InDmaReg(info, DIVR); in mgsl_interrupt()
1699 __FILE__,__LINE__,info->device_name,UscVector,DmaVector); in mgsl_interrupt()
1706 (*UscIsrTable[UscVector])(info); in mgsl_interrupt()
1708 mgsl_isr_transmit_dma(info); in mgsl_interrupt()
1710 mgsl_isr_receive_dma(info); in mgsl_interrupt()
1712 if ( info->isr_overflow ) { in mgsl_interrupt()
1714 __FILE__, __LINE__, info->device_name, info->irq_level); in mgsl_interrupt()
1715 usc_DisableMasterIrqBit(info); in mgsl_interrupt()
1716 usc_DisableDmaInterrupts(info,DICR_MASTER); in mgsl_interrupt()
1725 if ( info->pending_bh && !info->bh_running && !info->bh_requested ) { in mgsl_interrupt()
1728 __FILE__,__LINE__,info->device_name); in mgsl_interrupt()
1729 schedule_work(&info->task); in mgsl_interrupt()
1730 info->bh_requested = true; in mgsl_interrupt()
1733 spin_unlock(&info->irq_spinlock); in mgsl_interrupt()
1737 __FILE__, __LINE__, info->irq_level); in mgsl_interrupt()
1749 static int startup(struct mgsl_struct * info) in startup() argument
1754 printk("%s(%d):mgsl_startup(%s)\n",__FILE__,__LINE__,info->device_name); in startup()
1756 if (info->port.flags & ASYNC_INITIALIZED) in startup()
1759 if (!info->xmit_buf) { in startup()
1761 info->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL); in startup()
1762 if (!info->xmit_buf) { in startup()
1764 __FILE__,__LINE__,info->device_name); in startup()
1769 info->pending_bh = 0; in startup()
1771 memset(&info->icount, 0, sizeof(info->icount)); in startup()
1773 setup_timer(&info->tx_timer, mgsl_tx_timeout, (unsigned long)info); in startup()
1776 retval = mgsl_claim_resources(info); in startup()
1780 retval = mgsl_adapter_test(info); in startup()
1783 if (capable(CAP_SYS_ADMIN) && info->port.tty) in startup()
1784 set_bit(TTY_IO_ERROR, &info->port.tty->flags); in startup()
1785 mgsl_release_resources(info); in startup()
1790 mgsl_change_params(info); in startup()
1792 if (info->port.tty) in startup()
1793 clear_bit(TTY_IO_ERROR, &info->port.tty->flags); in startup()
1795 info->port.flags |= ASYNC_INITIALIZED; in startup()
1808 static void shutdown(struct mgsl_struct * info) in shutdown() argument
1812 if (!(info->port.flags & ASYNC_INITIALIZED)) in shutdown()
1817 __FILE__,__LINE__, info->device_name ); in shutdown()
1821 wake_up_interruptible(&info->status_event_wait_q); in shutdown()
1822 wake_up_interruptible(&info->event_wait_q); in shutdown()
1824 del_timer_sync(&info->tx_timer); in shutdown()
1826 if (info->xmit_buf) { in shutdown()
1827 free_page((unsigned long) info->xmit_buf); in shutdown()
1828 info->xmit_buf = NULL; in shutdown()
1831 spin_lock_irqsave(&info->irq_spinlock,flags); in shutdown()
1832 usc_DisableMasterIrqBit(info); in shutdown()
1833 usc_stop_receiver(info); in shutdown()
1834 usc_stop_transmitter(info); in shutdown()
1835 usc_DisableInterrupts(info,RECEIVE_DATA | RECEIVE_STATUS | in shutdown()
1837 usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE); in shutdown()
1842 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14)); in shutdown()
1847 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12)); in shutdown()
1849 if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) { in shutdown()
1850 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in shutdown()
1851 usc_set_serial_signals(info); in shutdown()
1854 spin_unlock_irqrestore(&info->irq_spinlock,flags); in shutdown()
1856 mgsl_release_resources(info); in shutdown()
1858 if (info->port.tty) in shutdown()
1859 set_bit(TTY_IO_ERROR, &info->port.tty->flags); in shutdown()
1861 info->port.flags &= ~ASYNC_INITIALIZED; in shutdown()
1865 static void mgsl_program_hw(struct mgsl_struct *info) in mgsl_program_hw() argument
1869 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_program_hw()
1871 usc_stop_receiver(info); in mgsl_program_hw()
1872 usc_stop_transmitter(info); in mgsl_program_hw()
1873 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mgsl_program_hw()
1875 if (info->params.mode == MGSL_MODE_HDLC || in mgsl_program_hw()
1876 info->params.mode == MGSL_MODE_RAW || in mgsl_program_hw()
1877 info->netcount) in mgsl_program_hw()
1878 usc_set_sync_mode(info); in mgsl_program_hw()
1880 usc_set_async_mode(info); in mgsl_program_hw()
1882 usc_set_serial_signals(info); in mgsl_program_hw()
1884 info->dcd_chkcount = 0; in mgsl_program_hw()
1885 info->cts_chkcount = 0; in mgsl_program_hw()
1886 info->ri_chkcount = 0; in mgsl_program_hw()
1887 info->dsr_chkcount = 0; in mgsl_program_hw()
1889 usc_EnableStatusIrqs(info,SICR_CTS+SICR_DSR+SICR_DCD+SICR_RI); in mgsl_program_hw()
1890 usc_EnableInterrupts(info, IO_PIN); in mgsl_program_hw()
1891 usc_get_serial_signals(info); in mgsl_program_hw()
1893 if (info->netcount || info->port.tty->termios.c_cflag & CREAD) in mgsl_program_hw()
1894 usc_start_receiver(info); in mgsl_program_hw()
1896 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_program_hw()
1901 static void mgsl_change_params(struct mgsl_struct *info) in mgsl_change_params() argument
1906 if (!info->port.tty) in mgsl_change_params()
1911 __FILE__,__LINE__, info->device_name ); in mgsl_change_params()
1913 cflag = info->port.tty->termios.c_cflag; in mgsl_change_params()
1918 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in mgsl_change_params()
1920 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in mgsl_change_params()
1925 case CS5: info->params.data_bits = 5; break; in mgsl_change_params()
1926 case CS6: info->params.data_bits = 6; break; in mgsl_change_params()
1927 case CS7: info->params.data_bits = 7; break; in mgsl_change_params()
1928 case CS8: info->params.data_bits = 8; break; in mgsl_change_params()
1930 default: info->params.data_bits = 7; break; in mgsl_change_params()
1934 info->params.stop_bits = 2; in mgsl_change_params()
1936 info->params.stop_bits = 1; in mgsl_change_params()
1938 info->params.parity = ASYNC_PARITY_NONE; in mgsl_change_params()
1941 info->params.parity = ASYNC_PARITY_ODD; in mgsl_change_params()
1943 info->params.parity = ASYNC_PARITY_EVEN; in mgsl_change_params()
1946 info->params.parity = ASYNC_PARITY_SPACE; in mgsl_change_params()
1953 bits_per_char = info->params.data_bits + in mgsl_change_params()
1954 info->params.stop_bits + 1; in mgsl_change_params()
1960 if (info->params.data_rate <= 460800) in mgsl_change_params()
1961 info->params.data_rate = tty_get_baud_rate(info->port.tty); in mgsl_change_params()
1963 if ( info->params.data_rate ) { in mgsl_change_params()
1964 info->timeout = (32*HZ*bits_per_char) / in mgsl_change_params()
1965 info->params.data_rate; in mgsl_change_params()
1967 info->timeout += HZ/50; /* Add .02 seconds of slop */ in mgsl_change_params()
1970 info->port.flags |= ASYNC_CTS_FLOW; in mgsl_change_params()
1972 info->port.flags &= ~ASYNC_CTS_FLOW; in mgsl_change_params()
1975 info->port.flags &= ~ASYNC_CHECK_CD; in mgsl_change_params()
1977 info->port.flags |= ASYNC_CHECK_CD; in mgsl_change_params()
1981 info->read_status_mask = RXSTATUS_OVERRUN; in mgsl_change_params()
1982 if (I_INPCK(info->port.tty)) in mgsl_change_params()
1983 info->read_status_mask |= RXSTATUS_PARITY_ERROR | RXSTATUS_FRAMING_ERROR; in mgsl_change_params()
1984 if (I_BRKINT(info->port.tty) || I_PARMRK(info->port.tty)) in mgsl_change_params()
1985 info->read_status_mask |= RXSTATUS_BREAK_RECEIVED; in mgsl_change_params()
1987 if (I_IGNPAR(info->port.tty)) in mgsl_change_params()
1988 info->ignore_status_mask |= RXSTATUS_PARITY_ERROR | RXSTATUS_FRAMING_ERROR; in mgsl_change_params()
1989 if (I_IGNBRK(info->port.tty)) { in mgsl_change_params()
1990 info->ignore_status_mask |= RXSTATUS_BREAK_RECEIVED; in mgsl_change_params()
1994 if (I_IGNPAR(info->port.tty)) in mgsl_change_params()
1995 info->ignore_status_mask |= RXSTATUS_OVERRUN; in mgsl_change_params()
1998 mgsl_program_hw(info); in mgsl_change_params()
2013 struct mgsl_struct *info = tty->driver_data; in mgsl_put_char() local
2019 __FILE__, __LINE__, ch, info->device_name); in mgsl_put_char()
2022 if (mgsl_paranoia_check(info, tty->name, "mgsl_put_char")) in mgsl_put_char()
2025 if (!info->xmit_buf) in mgsl_put_char()
2028 spin_lock_irqsave(&info->irq_spinlock, flags); in mgsl_put_char()
2030 if ((info->params.mode == MGSL_MODE_ASYNC ) || !info->tx_active) { in mgsl_put_char()
2031 if (info->xmit_cnt < SERIAL_XMIT_SIZE - 1) { in mgsl_put_char()
2032 info->xmit_buf[info->xmit_head++] = ch; in mgsl_put_char()
2033 info->xmit_head &= SERIAL_XMIT_SIZE-1; in mgsl_put_char()
2034 info->xmit_cnt++; in mgsl_put_char()
2038 spin_unlock_irqrestore(&info->irq_spinlock, flags); in mgsl_put_char()
2053 struct mgsl_struct *info = tty->driver_data; in mgsl_flush_chars() local
2058 __FILE__,__LINE__,info->device_name,info->xmit_cnt); in mgsl_flush_chars()
2060 if (mgsl_paranoia_check(info, tty->name, "mgsl_flush_chars")) in mgsl_flush_chars()
2063 if (info->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped || in mgsl_flush_chars()
2064 !info->xmit_buf) in mgsl_flush_chars()
2069 __FILE__,__LINE__,info->device_name ); in mgsl_flush_chars()
2071 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_flush_chars()
2073 if (!info->tx_active) { in mgsl_flush_chars()
2074 if ( (info->params.mode == MGSL_MODE_HDLC || in mgsl_flush_chars()
2075 info->params.mode == MGSL_MODE_RAW) && info->xmit_cnt ) { in mgsl_flush_chars()
2079 mgsl_load_tx_dma_buffer(info, in mgsl_flush_chars()
2080 info->xmit_buf,info->xmit_cnt); in mgsl_flush_chars()
2082 usc_start_transmitter(info); in mgsl_flush_chars()
2085 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_flush_chars()
2105 struct mgsl_struct *info = tty->driver_data; in mgsl_write() local
2110 __FILE__,__LINE__,info->device_name,count); in mgsl_write()
2112 if (mgsl_paranoia_check(info, tty->name, "mgsl_write")) in mgsl_write()
2115 if (!info->xmit_buf) in mgsl_write()
2118 if ( info->params.mode == MGSL_MODE_HDLC || in mgsl_write()
2119 info->params.mode == MGSL_MODE_RAW ) { in mgsl_write()
2121 if (info->tx_active) { in mgsl_write()
2123 if ( info->params.mode == MGSL_MODE_HDLC ) { in mgsl_write()
2132 if (info->tx_holding_count >= info->num_tx_holding_buffers ) { in mgsl_write()
2140 save_tx_buffer_request(info,buf,count); in mgsl_write()
2145 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_write()
2146 load_next_tx_holding_buffer(info); in mgsl_write()
2147 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_write()
2155 if ( (info->params.flags & HDLC_FLAG_HDLC_LOOPMODE) && in mgsl_write()
2156 !usc_loopmode_active(info) ) in mgsl_write()
2162 if ( info->xmit_cnt ) { in mgsl_write()
2169 mgsl_load_tx_dma_buffer(info, in mgsl_write()
2170 info->xmit_buf,info->xmit_cnt); in mgsl_write()
2173 __FILE__,__LINE__,info->device_name); in mgsl_write()
2177 __FILE__,__LINE__,info->device_name); in mgsl_write()
2179 info->xmit_cnt = count; in mgsl_write()
2180 mgsl_load_tx_dma_buffer(info,buf,count); in mgsl_write()
2184 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_write()
2186 min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, in mgsl_write()
2187 SERIAL_XMIT_SIZE - info->xmit_head)); in mgsl_write()
2189 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_write()
2192 memcpy(info->xmit_buf + info->xmit_head, buf, c); in mgsl_write()
2193 info->xmit_head = ((info->xmit_head + c) & in mgsl_write()
2195 info->xmit_cnt += c; in mgsl_write()
2196 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_write()
2203 if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) { in mgsl_write()
2204 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_write()
2205 if (!info->tx_active) in mgsl_write()
2206 usc_start_transmitter(info); in mgsl_write()
2207 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_write()
2212 __FILE__,__LINE__,info->device_name,ret); in mgsl_write()
2227 struct mgsl_struct *info = tty->driver_data; in mgsl_write_room() local
2230 if (mgsl_paranoia_check(info, tty->name, "mgsl_write_room")) in mgsl_write_room()
2232 ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; in mgsl_write_room()
2238 __FILE__,__LINE__, info->device_name,ret ); in mgsl_write_room()
2240 if ( info->params.mode == MGSL_MODE_HDLC || in mgsl_write_room()
2241 info->params.mode == MGSL_MODE_RAW ) { in mgsl_write_room()
2243 if ( info->tx_active ) in mgsl_write_room()
2262 struct mgsl_struct *info = tty->driver_data; in mgsl_chars_in_buffer() local
2266 __FILE__,__LINE__, info->device_name ); in mgsl_chars_in_buffer()
2268 if (mgsl_paranoia_check(info, tty->name, "mgsl_chars_in_buffer")) in mgsl_chars_in_buffer()
2273 __FILE__,__LINE__, info->device_name,info->xmit_cnt ); in mgsl_chars_in_buffer()
2275 if ( info->params.mode == MGSL_MODE_HDLC || in mgsl_chars_in_buffer()
2276 info->params.mode == MGSL_MODE_RAW ) { in mgsl_chars_in_buffer()
2278 if ( info->tx_active ) in mgsl_chars_in_buffer()
2279 return info->max_frame_size; in mgsl_chars_in_buffer()
2284 return info->xmit_cnt; in mgsl_chars_in_buffer()
2296 struct mgsl_struct *info = tty->driver_data; in mgsl_flush_buffer() local
2301 __FILE__,__LINE__, info->device_name ); in mgsl_flush_buffer()
2303 if (mgsl_paranoia_check(info, tty->name, "mgsl_flush_buffer")) in mgsl_flush_buffer()
2306 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_flush_buffer()
2307 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mgsl_flush_buffer()
2308 del_timer(&info->tx_timer); in mgsl_flush_buffer()
2309 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_flush_buffer()
2324 struct mgsl_struct *info = tty->driver_data; in mgsl_send_xchar() local
2329 __FILE__,__LINE__, info->device_name, ch ); in mgsl_send_xchar()
2331 if (mgsl_paranoia_check(info, tty->name, "mgsl_send_xchar")) in mgsl_send_xchar()
2334 info->x_char = ch; in mgsl_send_xchar()
2337 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_send_xchar()
2338 if (!info->tx_enabled) in mgsl_send_xchar()
2339 usc_start_transmitter(info); in mgsl_send_xchar()
2340 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_send_xchar()
2353 struct mgsl_struct *info = tty->driver_data; in mgsl_throttle() local
2358 __FILE__,__LINE__, info->device_name ); in mgsl_throttle()
2360 if (mgsl_paranoia_check(info, tty->name, "mgsl_throttle")) in mgsl_throttle()
2367 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_throttle()
2368 info->serial_signals &= ~SerialSignal_RTS; in mgsl_throttle()
2369 usc_set_serial_signals(info); in mgsl_throttle()
2370 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_throttle()
2383 struct mgsl_struct *info = tty->driver_data; in mgsl_unthrottle() local
2388 __FILE__,__LINE__, info->device_name ); in mgsl_unthrottle()
2390 if (mgsl_paranoia_check(info, tty->name, "mgsl_unthrottle")) in mgsl_unthrottle()
2394 if (info->x_char) in mgsl_unthrottle()
2395 info->x_char = 0; in mgsl_unthrottle()
2401 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_unthrottle()
2402 info->serial_signals |= SerialSignal_RTS; in mgsl_unthrottle()
2403 usc_set_serial_signals(info); in mgsl_unthrottle()
2404 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_unthrottle()
2418 static int mgsl_get_stats(struct mgsl_struct * info, struct mgsl_icount __user *user_icount) in mgsl_get_stats() argument
2424 __FILE__,__LINE__, info->device_name); in mgsl_get_stats()
2427 memset(&info->icount, 0, sizeof(info->icount)); in mgsl_get_stats()
2429 mutex_lock(&info->port.mutex); in mgsl_get_stats()
2430 COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount)); in mgsl_get_stats()
2431 mutex_unlock(&info->port.mutex); in mgsl_get_stats()
2449 static int mgsl_get_params(struct mgsl_struct * info, MGSL_PARAMS __user *user_params) in mgsl_get_params() argument
2454 __FILE__,__LINE__, info->device_name); in mgsl_get_params()
2456 mutex_lock(&info->port.mutex); in mgsl_get_params()
2457 COPY_TO_USER(err,user_params, &info->params, sizeof(MGSL_PARAMS)); in mgsl_get_params()
2458 mutex_unlock(&info->port.mutex); in mgsl_get_params()
2462 __FILE__,__LINE__,info->device_name); in mgsl_get_params()
2481 static int mgsl_set_params(struct mgsl_struct * info, MGSL_PARAMS __user *new_params) in mgsl_set_params() argument
2489 info->device_name ); in mgsl_set_params()
2494 __FILE__,__LINE__,info->device_name); in mgsl_set_params()
2498 mutex_lock(&info->port.mutex); in mgsl_set_params()
2499 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_set_params()
2500 memcpy(&info->params,&tmp_params,sizeof(MGSL_PARAMS)); in mgsl_set_params()
2501 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_set_params()
2503 mgsl_change_params(info); in mgsl_set_params()
2504 mutex_unlock(&info->port.mutex); in mgsl_set_params()
2519 static int mgsl_get_txidle(struct mgsl_struct * info, int __user *idle_mode) in mgsl_get_txidle() argument
2525 __FILE__,__LINE__, info->device_name, info->idle_mode); in mgsl_get_txidle()
2527 COPY_TO_USER(err,idle_mode, &info->idle_mode, sizeof(int)); in mgsl_get_txidle()
2531 __FILE__,__LINE__,info->device_name); in mgsl_get_txidle()
2546 static int mgsl_set_txidle(struct mgsl_struct * info, int idle_mode) in mgsl_set_txidle() argument
2552 info->device_name, idle_mode ); in mgsl_set_txidle()
2554 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_set_txidle()
2555 info->idle_mode = idle_mode; in mgsl_set_txidle()
2556 usc_set_txidle( info ); in mgsl_set_txidle()
2557 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_set_txidle()
2573 static int mgsl_txenable(struct mgsl_struct * info, int enable) in mgsl_txenable() argument
2579 info->device_name, enable); in mgsl_txenable()
2581 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_txenable()
2583 if ( !info->tx_enabled ) { in mgsl_txenable()
2585 usc_start_transmitter(info); in mgsl_txenable()
2593 if ( info->params.flags & HDLC_FLAG_HDLC_LOOPMODE ) in mgsl_txenable()
2594 usc_loopmode_insert_request( info ); in mgsl_txenable()
2597 if ( info->tx_enabled ) in mgsl_txenable()
2598 usc_stop_transmitter(info); in mgsl_txenable()
2600 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_txenable()
2610 static int mgsl_txabort(struct mgsl_struct * info) in mgsl_txabort() argument
2616 info->device_name); in mgsl_txabort()
2618 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_txabort()
2619 if ( info->tx_active && info->params.mode == MGSL_MODE_HDLC ) in mgsl_txabort()
2621 if ( info->params.flags & HDLC_FLAG_HDLC_LOOPMODE ) in mgsl_txabort()
2622 usc_loopmode_cancel_transmit( info ); in mgsl_txabort()
2624 usc_TCmd(info,TCmd_SendAbort); in mgsl_txabort()
2626 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_txabort()
2637 static int mgsl_rxenable(struct mgsl_struct * info, int enable) in mgsl_rxenable() argument
2643 info->device_name, enable); in mgsl_rxenable()
2645 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_rxenable()
2647 if ( !info->rx_enabled ) in mgsl_rxenable()
2648 usc_start_receiver(info); in mgsl_rxenable()
2650 if ( info->rx_enabled ) in mgsl_rxenable()
2651 usc_stop_receiver(info); in mgsl_rxenable()
2653 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_rxenable()
2666 static int mgsl_wait_event(struct mgsl_struct * info, int __user * mask_ptr) in mgsl_wait_event() argument
2684 info->device_name, mask); in mgsl_wait_event()
2686 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_wait_event()
2689 usc_get_serial_signals(info); in mgsl_wait_event()
2690 s = info->serial_signals; in mgsl_wait_event()
2697 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_wait_event()
2702 cprev = info->icount; in mgsl_wait_event()
2703 oldsigs = info->input_signal_events; in mgsl_wait_event()
2707 u16 oldreg = usc_InReg(info,RICR); in mgsl_wait_event()
2712 usc_OutReg(info, RICR, newreg); in mgsl_wait_event()
2716 add_wait_queue(&info->event_wait_q, &wait); in mgsl_wait_event()
2718 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_wait_event()
2729 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_wait_event()
2730 cnow = info->icount; in mgsl_wait_event()
2731 newsigs = info->input_signal_events; in mgsl_wait_event()
2733 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_wait_event()
2768 remove_wait_queue(&info->event_wait_q, &wait); in mgsl_wait_event()
2772 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_wait_event()
2773 if (!waitqueue_active(&info->event_wait_q)) { in mgsl_wait_event()
2775 usc_OutReg(info, RICR, usc_InReg(info,RICR) & in mgsl_wait_event()
2778 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_wait_event()
2788 static int modem_input_wait(struct mgsl_struct *info,int arg) in modem_input_wait() argument
2796 spin_lock_irqsave(&info->irq_spinlock,flags); in modem_input_wait()
2797 cprev = info->icount; in modem_input_wait()
2798 add_wait_queue(&info->status_event_wait_q, &wait); in modem_input_wait()
2800 spin_unlock_irqrestore(&info->irq_spinlock,flags); in modem_input_wait()
2810 spin_lock_irqsave(&info->irq_spinlock,flags); in modem_input_wait()
2811 cnow = info->icount; in modem_input_wait()
2813 spin_unlock_irqrestore(&info->irq_spinlock,flags); in modem_input_wait()
2833 remove_wait_queue(&info->status_event_wait_q, &wait); in modem_input_wait()
2842 struct mgsl_struct *info = tty->driver_data; in tiocmget() local
2846 spin_lock_irqsave(&info->irq_spinlock,flags); in tiocmget()
2847 usc_get_serial_signals(info); in tiocmget()
2848 spin_unlock_irqrestore(&info->irq_spinlock,flags); in tiocmget()
2850 result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS:0) + in tiocmget()
2851 ((info->serial_signals & SerialSignal_DTR) ? TIOCM_DTR:0) + in tiocmget()
2852 ((info->serial_signals & SerialSignal_DCD) ? TIOCM_CAR:0) + in tiocmget()
2853 ((info->serial_signals & SerialSignal_RI) ? TIOCM_RNG:0) + in tiocmget()
2854 ((info->serial_signals & SerialSignal_DSR) ? TIOCM_DSR:0) + in tiocmget()
2855 ((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0); in tiocmget()
2859 __FILE__,__LINE__, info->device_name, result ); in tiocmget()
2868 struct mgsl_struct *info = tty->driver_data; in tiocmset() local
2873 __FILE__,__LINE__,info->device_name, set, clear); in tiocmset()
2876 info->serial_signals |= SerialSignal_RTS; in tiocmset()
2878 info->serial_signals |= SerialSignal_DTR; in tiocmset()
2880 info->serial_signals &= ~SerialSignal_RTS; in tiocmset()
2882 info->serial_signals &= ~SerialSignal_DTR; in tiocmset()
2884 spin_lock_irqsave(&info->irq_spinlock,flags); in tiocmset()
2885 usc_set_serial_signals(info); in tiocmset()
2886 spin_unlock_irqrestore(&info->irq_spinlock,flags); in tiocmset()
2899 struct mgsl_struct * info = tty->driver_data; in mgsl_break() local
2904 __FILE__,__LINE__, info->device_name, break_state); in mgsl_break()
2906 if (mgsl_paranoia_check(info, tty->name, "mgsl_break")) in mgsl_break()
2909 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_break()
2911 usc_OutReg(info,IOCR,(u16)(usc_InReg(info,IOCR) | BIT7)); in mgsl_break()
2913 usc_OutReg(info,IOCR,(u16)(usc_InReg(info,IOCR) & ~BIT7)); in mgsl_break()
2914 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_break()
2929 struct mgsl_struct * info = tty->driver_data; in msgl_get_icount() local
2933 spin_lock_irqsave(&info->irq_spinlock,flags); in msgl_get_icount()
2934 cnow = info->icount; in msgl_get_icount()
2935 spin_unlock_irqrestore(&info->irq_spinlock,flags); in msgl_get_icount()
2964 struct mgsl_struct * info = tty->driver_data; in mgsl_ioctl() local
2968 info->device_name, cmd ); in mgsl_ioctl()
2970 if (mgsl_paranoia_check(info, tty->name, "mgsl_ioctl")) in mgsl_ioctl()
2979 return mgsl_ioctl_common(info, cmd, arg); in mgsl_ioctl()
2982 static int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigned long arg) in mgsl_ioctl_common() argument
2988 return mgsl_get_params(info, argp); in mgsl_ioctl_common()
2990 return mgsl_set_params(info, argp); in mgsl_ioctl_common()
2992 return mgsl_get_txidle(info, argp); in mgsl_ioctl_common()
2994 return mgsl_set_txidle(info,(int)arg); in mgsl_ioctl_common()
2996 return mgsl_txenable(info,(int)arg); in mgsl_ioctl_common()
2998 return mgsl_rxenable(info,(int)arg); in mgsl_ioctl_common()
3000 return mgsl_txabort(info); in mgsl_ioctl_common()
3002 return mgsl_get_stats(info, argp); in mgsl_ioctl_common()
3004 return mgsl_wait_event(info, argp); in mgsl_ioctl_common()
3006 return mgsl_loopmode_send_done(info); in mgsl_ioctl_common()
3011 return modem_input_wait(info,(int)arg); in mgsl_ioctl_common()
3032 struct mgsl_struct *info = tty->driver_data; in mgsl_set_termios() local
3039 mgsl_change_params(info); in mgsl_set_termios()
3044 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in mgsl_set_termios()
3045 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_set_termios()
3046 usc_set_serial_signals(info); in mgsl_set_termios()
3047 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_set_termios()
3053 info->serial_signals |= SerialSignal_DTR; in mgsl_set_termios()
3056 info->serial_signals |= SerialSignal_RTS; in mgsl_set_termios()
3058 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_set_termios()
3059 usc_set_serial_signals(info); in mgsl_set_termios()
3060 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_set_termios()
3086 struct mgsl_struct * info = tty->driver_data; in mgsl_close() local
3088 if (mgsl_paranoia_check(info, tty->name, "mgsl_close")) in mgsl_close()
3093 __FILE__,__LINE__, info->device_name, info->port.count); in mgsl_close()
3095 if (tty_port_close_start(&info->port, tty, filp) == 0) in mgsl_close()
3098 mutex_lock(&info->port.mutex); in mgsl_close()
3099 if (info->port.flags & ASYNC_INITIALIZED) in mgsl_close()
3100 mgsl_wait_until_sent(tty, info->timeout); in mgsl_close()
3103 shutdown(info); in mgsl_close()
3104 mutex_unlock(&info->port.mutex); in mgsl_close()
3106 tty_port_close_end(&info->port, tty); in mgsl_close()
3107 info->port.tty = NULL; in mgsl_close()
3111 tty->driver->name, info->port.count); in mgsl_close()
3128 struct mgsl_struct * info = tty->driver_data; in mgsl_wait_until_sent() local
3131 if (!info ) in mgsl_wait_until_sent()
3136 __FILE__,__LINE__, info->device_name ); in mgsl_wait_until_sent()
3138 if (mgsl_paranoia_check(info, tty->name, "mgsl_wait_until_sent")) in mgsl_wait_until_sent()
3141 if (!(info->port.flags & ASYNC_INITIALIZED)) in mgsl_wait_until_sent()
3152 if ( info->params.data_rate ) { in mgsl_wait_until_sent()
3153 char_time = info->timeout/(32 * 5); in mgsl_wait_until_sent()
3162 if ( info->params.mode == MGSL_MODE_HDLC || in mgsl_wait_until_sent()
3163 info->params.mode == MGSL_MODE_RAW ) { in mgsl_wait_until_sent()
3164 while (info->tx_active) { in mgsl_wait_until_sent()
3172 while (!(usc_InReg(info,TCSR) & TXSTATUS_ALL_SENT) && in mgsl_wait_until_sent()
3173 info->tx_enabled) { in mgsl_wait_until_sent()
3185 __FILE__,__LINE__, info->device_name ); in mgsl_wait_until_sent()
3199 struct mgsl_struct * info = tty->driver_data; in mgsl_hangup() local
3203 __FILE__,__LINE__, info->device_name ); in mgsl_hangup()
3205 if (mgsl_paranoia_check(info, tty->name, "mgsl_hangup")) in mgsl_hangup()
3209 shutdown(info); in mgsl_hangup()
3211 info->port.count = 0; in mgsl_hangup()
3212 info->port.flags &= ~ASYNC_NORMAL_ACTIVE; in mgsl_hangup()
3213 info->port.tty = NULL; in mgsl_hangup()
3215 wake_up_interruptible(&info->port.open_wait); in mgsl_hangup()
3228 struct mgsl_struct *info = container_of(port, struct mgsl_struct, port); in carrier_raised() local
3230 spin_lock_irqsave(&info->irq_spinlock, flags); in carrier_raised()
3231 usc_get_serial_signals(info); in carrier_raised()
3232 spin_unlock_irqrestore(&info->irq_spinlock, flags); in carrier_raised()
3233 return (info->serial_signals & SerialSignal_DCD) ? 1 : 0; in carrier_raised()
3238 struct mgsl_struct *info = container_of(port, struct mgsl_struct, port); in dtr_rts() local
3241 spin_lock_irqsave(&info->irq_spinlock,flags); in dtr_rts()
3243 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in dtr_rts()
3245 info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); in dtr_rts()
3246 usc_set_serial_signals(info); in dtr_rts()
3247 spin_unlock_irqrestore(&info->irq_spinlock,flags); in dtr_rts()
3265 struct mgsl_struct *info) in block_til_ready() argument
3272 struct tty_port *port = &info->port; in block_til_ready()
3301 spin_lock_irqsave(&info->irq_spinlock, flags); in block_til_ready()
3303 spin_unlock_irqrestore(&info->irq_spinlock, flags); in block_til_ready()
3318 dcd = tty_port_carrier_raised(&info->port); in block_til_ready()
3357 struct mgsl_struct *info; in mgsl_install() local
3368 info = mgsl_device_list; in mgsl_install()
3369 while (info && info->line != line) in mgsl_install()
3370 info = info->next_device; in mgsl_install()
3371 if (mgsl_paranoia_check(info, tty->name, "mgsl_open")) in mgsl_install()
3373 tty->driver_data = info; in mgsl_install()
3375 return tty_port_install(&info->port, driver, tty); in mgsl_install()
3390 struct mgsl_struct *info = tty->driver_data; in mgsl_open() local
3394 info->port.tty = tty; in mgsl_open()
3398 __FILE__,__LINE__,tty->driver->name, info->port.count); in mgsl_open()
3400 info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0; in mgsl_open()
3402 spin_lock_irqsave(&info->netlock, flags); in mgsl_open()
3403 if (info->netcount) { in mgsl_open()
3405 spin_unlock_irqrestore(&info->netlock, flags); in mgsl_open()
3408 info->port.count++; in mgsl_open()
3409 spin_unlock_irqrestore(&info->netlock, flags); in mgsl_open()
3411 if (info->port.count == 1) { in mgsl_open()
3413 retval = startup(info); in mgsl_open()
3418 retval = block_til_ready(tty, filp, info); in mgsl_open()
3422 __FILE__,__LINE__, info->device_name, retval); in mgsl_open()
3428 __FILE__,__LINE__, info->device_name); in mgsl_open()
3434 info->port.tty = NULL; /* tty layer will release tty struct */ in mgsl_open()
3435 if(info->port.count) in mgsl_open()
3436 info->port.count--; in mgsl_open()
3447 static inline void line_info(struct seq_file *m, struct mgsl_struct *info) in line_info() argument
3452 if (info->bus_type == MGSL_BUS_TYPE_PCI) { in line_info()
3454 info->device_name, info->io_base, info->irq_level, in line_info()
3455 info->phys_memory_base, info->phys_lcr_base); in line_info()
3458 info->device_name, info->io_base, in line_info()
3459 info->irq_level, info->dma_level); in line_info()
3463 spin_lock_irqsave(&info->irq_spinlock,flags); in line_info()
3464 usc_get_serial_signals(info); in line_info()
3465 spin_unlock_irqrestore(&info->irq_spinlock,flags); in line_info()
3469 if (info->serial_signals & SerialSignal_RTS) in line_info()
3471 if (info->serial_signals & SerialSignal_CTS) in line_info()
3473 if (info->serial_signals & SerialSignal_DTR) in line_info()
3475 if (info->serial_signals & SerialSignal_DSR) in line_info()
3477 if (info->serial_signals & SerialSignal_DCD) in line_info()
3479 if (info->serial_signals & SerialSignal_RI) in line_info()
3482 if (info->params.mode == MGSL_MODE_HDLC || in line_info()
3483 info->params.mode == MGSL_MODE_RAW ) { in line_info()
3485 info->icount.txok, info->icount.rxok); in line_info()
3486 if (info->icount.txunder) in line_info()
3487 seq_printf(m, " txunder:%d", info->icount.txunder); in line_info()
3488 if (info->icount.txabort) in line_info()
3489 seq_printf(m, " txabort:%d", info->icount.txabort); in line_info()
3490 if (info->icount.rxshort) in line_info()
3491 seq_printf(m, " rxshort:%d", info->icount.rxshort); in line_info()
3492 if (info->icount.rxlong) in line_info()
3493 seq_printf(m, " rxlong:%d", info->icount.rxlong); in line_info()
3494 if (info->icount.rxover) in line_info()
3495 seq_printf(m, " rxover:%d", info->icount.rxover); in line_info()
3496 if (info->icount.rxcrc) in line_info()
3497 seq_printf(m, " rxcrc:%d", info->icount.rxcrc); in line_info()
3500 info->icount.tx, info->icount.rx); in line_info()
3501 if (info->icount.frame) in line_info()
3502 seq_printf(m, " fe:%d", info->icount.frame); in line_info()
3503 if (info->icount.parity) in line_info()
3504 seq_printf(m, " pe:%d", info->icount.parity); in line_info()
3505 if (info->icount.brk) in line_info()
3506 seq_printf(m, " brk:%d", info->icount.brk); in line_info()
3507 if (info->icount.overrun) in line_info()
3508 seq_printf(m, " oe:%d", info->icount.overrun); in line_info()
3515 info->tx_active,info->bh_requested,info->bh_running, in line_info()
3516 info->pending_bh); in line_info()
3518 spin_lock_irqsave(&info->irq_spinlock,flags); in line_info()
3520 u16 Tcsr = usc_InReg( info, TCSR ); in line_info()
3521 u16 Tdmr = usc_InDmaReg( info, TDMR ); in line_info()
3522 u16 Ticr = usc_InReg( info, TICR ); in line_info()
3523 u16 Rscr = usc_InReg( info, RCSR ); in line_info()
3524 u16 Rdmr = usc_InDmaReg( info, RDMR ); in line_info()
3525 u16 Ricr = usc_InReg( info, RICR ); in line_info()
3526 u16 Icr = usc_InReg( info, ICR ); in line_info()
3527 u16 Dccr = usc_InReg( info, DCCR ); in line_info()
3528 u16 Tmr = usc_InReg( info, TMR ); in line_info()
3529 u16 Tccr = usc_InReg( info, TCCR ); in line_info()
3530 u16 Ccar = inw( info->io_base + CCAR ); in line_info()
3535 spin_unlock_irqrestore(&info->irq_spinlock,flags); in line_info()
3541 struct mgsl_struct *info; in mgsl_proc_show() local
3545 info = mgsl_device_list; in mgsl_proc_show()
3546 while( info ) { in mgsl_proc_show()
3547 line_info(m, info); in mgsl_proc_show()
3548 info = info->next_device; in mgsl_proc_show()
3574 static int mgsl_allocate_dma_buffers(struct mgsl_struct *info) in mgsl_allocate_dma_buffers() argument
3578 info->last_mem_alloc = 0; in mgsl_allocate_dma_buffers()
3585 BuffersPerFrame = (unsigned short)(info->max_frame_size/DMABUFFERSIZE); in mgsl_allocate_dma_buffers()
3586 if ( info->max_frame_size % DMABUFFERSIZE ) in mgsl_allocate_dma_buffers()
3589 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in mgsl_allocate_dma_buffers()
3612 info->tx_buffer_count = info->num_tx_dma_buffers * BuffersPerFrame; in mgsl_allocate_dma_buffers()
3613 info->rx_buffer_count = 62 - info->tx_buffer_count; in mgsl_allocate_dma_buffers()
3625 info->tx_buffer_count = info->num_tx_dma_buffers * BuffersPerFrame; in mgsl_allocate_dma_buffers()
3626 info->rx_buffer_count = (BuffersPerFrame * MAXRXFRAMES) + 6; in mgsl_allocate_dma_buffers()
3633 if ( (info->tx_buffer_count + info->rx_buffer_count) > 62 ) in mgsl_allocate_dma_buffers()
3634 info->rx_buffer_count = 62 - info->tx_buffer_count; in mgsl_allocate_dma_buffers()
3640 __FILE__,__LINE__, info->tx_buffer_count,info->rx_buffer_count); in mgsl_allocate_dma_buffers()
3642 if ( mgsl_alloc_buffer_list_memory( info ) < 0 || in mgsl_allocate_dma_buffers()
3643 mgsl_alloc_frame_memory(info, info->rx_buffer_list, info->rx_buffer_count) < 0 || in mgsl_allocate_dma_buffers()
3644 mgsl_alloc_frame_memory(info, info->tx_buffer_list, info->tx_buffer_count) < 0 || in mgsl_allocate_dma_buffers()
3645 mgsl_alloc_intermediate_rxbuffer_memory(info) < 0 || in mgsl_allocate_dma_buffers()
3646 mgsl_alloc_intermediate_txbuffer_memory(info) < 0 ) { in mgsl_allocate_dma_buffers()
3651 mgsl_reset_rx_dma_buffers( info ); in mgsl_allocate_dma_buffers()
3652 mgsl_reset_tx_dma_buffers( info ); in mgsl_allocate_dma_buffers()
3681 static int mgsl_alloc_buffer_list_memory( struct mgsl_struct *info ) in mgsl_alloc_buffer_list_memory() argument
3685 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in mgsl_alloc_buffer_list_memory()
3687 info->buffer_list = info->memory_base + info->last_mem_alloc; in mgsl_alloc_buffer_list_memory()
3688 info->buffer_list_phys = info->last_mem_alloc; in mgsl_alloc_buffer_list_memory()
3689 info->last_mem_alloc += BUFFERLISTSIZE; in mgsl_alloc_buffer_list_memory()
3697info->buffer_list = dma_alloc_coherent(NULL, BUFFERLISTSIZE, &info->buffer_list_dma_addr, GFP_KERN… in mgsl_alloc_buffer_list_memory()
3698 if (info->buffer_list == NULL) in mgsl_alloc_buffer_list_memory()
3700 info->buffer_list_phys = (u32)(info->buffer_list_dma_addr); in mgsl_alloc_buffer_list_memory()
3705 memset( info->buffer_list, 0, BUFFERLISTSIZE ); in mgsl_alloc_buffer_list_memory()
3710 info->rx_buffer_list = (DMABUFFERENTRY *)info->buffer_list; in mgsl_alloc_buffer_list_memory()
3711 info->tx_buffer_list = (DMABUFFERENTRY *)info->buffer_list; in mgsl_alloc_buffer_list_memory()
3712 info->tx_buffer_list += info->rx_buffer_count; in mgsl_alloc_buffer_list_memory()
3723 for ( i = 0; i < info->rx_buffer_count; i++ ) { in mgsl_alloc_buffer_list_memory()
3725 info->rx_buffer_list[i].phys_entry = in mgsl_alloc_buffer_list_memory()
3726 info->buffer_list_phys + (i * sizeof(DMABUFFERENTRY)); in mgsl_alloc_buffer_list_memory()
3731 info->rx_buffer_list[i].link = info->buffer_list_phys; in mgsl_alloc_buffer_list_memory()
3733 if ( i < info->rx_buffer_count - 1 ) in mgsl_alloc_buffer_list_memory()
3734 info->rx_buffer_list[i].link += (i + 1) * sizeof(DMABUFFERENTRY); in mgsl_alloc_buffer_list_memory()
3737 for ( i = 0; i < info->tx_buffer_count; i++ ) { in mgsl_alloc_buffer_list_memory()
3739 info->tx_buffer_list[i].phys_entry = info->buffer_list_phys + in mgsl_alloc_buffer_list_memory()
3740 ((info->rx_buffer_count + i) * sizeof(DMABUFFERENTRY)); in mgsl_alloc_buffer_list_memory()
3745 info->tx_buffer_list[i].link = info->buffer_list_phys + in mgsl_alloc_buffer_list_memory()
3746 info->rx_buffer_count * sizeof(DMABUFFERENTRY); in mgsl_alloc_buffer_list_memory()
3748 if ( i < info->tx_buffer_count - 1 ) in mgsl_alloc_buffer_list_memory()
3749 info->tx_buffer_list[i].link += (i + 1) * sizeof(DMABUFFERENTRY); in mgsl_alloc_buffer_list_memory()
3765 static void mgsl_free_buffer_list_memory( struct mgsl_struct *info ) in mgsl_free_buffer_list_memory() argument
3767 if (info->buffer_list && info->bus_type != MGSL_BUS_TYPE_PCI) in mgsl_free_buffer_list_memory()
3768 dma_free_coherent(NULL, BUFFERLISTSIZE, info->buffer_list, info->buffer_list_dma_addr); in mgsl_free_buffer_list_memory()
3770 info->buffer_list = NULL; in mgsl_free_buffer_list_memory()
3771 info->rx_buffer_list = NULL; in mgsl_free_buffer_list_memory()
3772 info->tx_buffer_list = NULL; in mgsl_free_buffer_list_memory()
3792 static int mgsl_alloc_frame_memory(struct mgsl_struct *info,DMABUFFERENTRY *BufferList,int Bufferco… in mgsl_alloc_frame_memory() argument
3800 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in mgsl_alloc_frame_memory()
3802 BufferList[i].virt_addr = info->memory_base + info->last_mem_alloc; in mgsl_alloc_frame_memory()
3803 phys_addr = info->last_mem_alloc; in mgsl_alloc_frame_memory()
3804 info->last_mem_alloc += DMABUFFERSIZE; in mgsl_alloc_frame_memory()
3833 static void mgsl_free_frame_memory(struct mgsl_struct *info, DMABUFFERENTRY *BufferList, int Buffer… in mgsl_free_frame_memory() argument
3840 if ( info->bus_type != MGSL_BUS_TYPE_PCI ) in mgsl_free_frame_memory()
3856 static void mgsl_free_dma_buffers( struct mgsl_struct *info ) in mgsl_free_dma_buffers() argument
3858 mgsl_free_frame_memory( info, info->rx_buffer_list, info->rx_buffer_count ); in mgsl_free_dma_buffers()
3859 mgsl_free_frame_memory( info, info->tx_buffer_list, info->tx_buffer_count ); in mgsl_free_dma_buffers()
3860 mgsl_free_buffer_list_memory( info ); in mgsl_free_dma_buffers()
3877 static int mgsl_alloc_intermediate_rxbuffer_memory(struct mgsl_struct *info) in mgsl_alloc_intermediate_rxbuffer_memory() argument
3879 info->intermediate_rxbuffer = kmalloc(info->max_frame_size, GFP_KERNEL | GFP_DMA); in mgsl_alloc_intermediate_rxbuffer_memory()
3880 if ( info->intermediate_rxbuffer == NULL ) in mgsl_alloc_intermediate_rxbuffer_memory()
3883 info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL); in mgsl_alloc_intermediate_rxbuffer_memory()
3884 if (!info->flag_buf) { in mgsl_alloc_intermediate_rxbuffer_memory()
3885 kfree(info->intermediate_rxbuffer); in mgsl_alloc_intermediate_rxbuffer_memory()
3886 info->intermediate_rxbuffer = NULL; in mgsl_alloc_intermediate_rxbuffer_memory()
3903 static void mgsl_free_intermediate_rxbuffer_memory(struct mgsl_struct *info) in mgsl_free_intermediate_rxbuffer_memory() argument
3905 kfree(info->intermediate_rxbuffer); in mgsl_free_intermediate_rxbuffer_memory()
3906 info->intermediate_rxbuffer = NULL; in mgsl_free_intermediate_rxbuffer_memory()
3907 kfree(info->flag_buf); in mgsl_free_intermediate_rxbuffer_memory()
3908 info->flag_buf = NULL; in mgsl_free_intermediate_rxbuffer_memory()
3925 static int mgsl_alloc_intermediate_txbuffer_memory(struct mgsl_struct *info) in mgsl_alloc_intermediate_txbuffer_memory() argument
3931 info->device_name, __FILE__,__LINE__,info->num_tx_holding_buffers); in mgsl_alloc_intermediate_txbuffer_memory()
3933 memset(info->tx_holding_buffers,0,sizeof(info->tx_holding_buffers)); in mgsl_alloc_intermediate_txbuffer_memory()
3935 for ( i=0; i<info->num_tx_holding_buffers; ++i) { in mgsl_alloc_intermediate_txbuffer_memory()
3936 info->tx_holding_buffers[i].buffer = in mgsl_alloc_intermediate_txbuffer_memory()
3937 kmalloc(info->max_frame_size, GFP_KERNEL); in mgsl_alloc_intermediate_txbuffer_memory()
3938 if (info->tx_holding_buffers[i].buffer == NULL) { in mgsl_alloc_intermediate_txbuffer_memory()
3940 kfree(info->tx_holding_buffers[i].buffer); in mgsl_alloc_intermediate_txbuffer_memory()
3941 info->tx_holding_buffers[i].buffer = NULL; in mgsl_alloc_intermediate_txbuffer_memory()
3961 static void mgsl_free_intermediate_txbuffer_memory(struct mgsl_struct *info) in mgsl_free_intermediate_txbuffer_memory() argument
3965 for ( i=0; i<info->num_tx_holding_buffers; ++i ) { in mgsl_free_intermediate_txbuffer_memory()
3966 kfree(info->tx_holding_buffers[i].buffer); in mgsl_free_intermediate_txbuffer_memory()
3967 info->tx_holding_buffers[i].buffer = NULL; in mgsl_free_intermediate_txbuffer_memory()
3970 info->get_tx_holding_index = 0; in mgsl_free_intermediate_txbuffer_memory()
3971 info->put_tx_holding_index = 0; in mgsl_free_intermediate_txbuffer_memory()
3972 info->tx_holding_count = 0; in mgsl_free_intermediate_txbuffer_memory()
3991 static bool load_next_tx_holding_buffer(struct mgsl_struct *info) in load_next_tx_holding_buffer() argument
3995 if ( info->tx_holding_count ) { in load_next_tx_holding_buffer()
4000 &info->tx_holding_buffers[info->get_tx_holding_index]; in load_next_tx_holding_buffer()
4001 int num_free = num_free_tx_dma_buffers(info); in load_next_tx_holding_buffer()
4007 info->xmit_cnt = ptx->buffer_size; in load_next_tx_holding_buffer()
4008 mgsl_load_tx_dma_buffer(info,ptx->buffer,ptx->buffer_size); in load_next_tx_holding_buffer()
4010 --info->tx_holding_count; in load_next_tx_holding_buffer()
4011 if ( ++info->get_tx_holding_index >= info->num_tx_holding_buffers) in load_next_tx_holding_buffer()
4012 info->get_tx_holding_index=0; in load_next_tx_holding_buffer()
4015 mod_timer(&info->tx_timer, jiffies + msecs_to_jiffies(5000)); in load_next_tx_holding_buffer()
4037 static int save_tx_buffer_request(struct mgsl_struct *info,const char *Buffer, unsigned int BufferS… in save_tx_buffer_request() argument
4041 if ( info->tx_holding_count >= info->num_tx_holding_buffers ) { in save_tx_buffer_request()
4045 ptx = &info->tx_holding_buffers[info->put_tx_holding_index]; in save_tx_buffer_request()
4049 ++info->tx_holding_count; in save_tx_buffer_request()
4050 if ( ++info->put_tx_holding_index >= info->num_tx_holding_buffers) in save_tx_buffer_request()
4051 info->put_tx_holding_index=0; in save_tx_buffer_request()
4056 static int mgsl_claim_resources(struct mgsl_struct *info) in mgsl_claim_resources() argument
4058 if (request_region(info->io_base,info->io_addr_size,"synclink") == NULL) { in mgsl_claim_resources()
4060 __FILE__,__LINE__,info->device_name, info->io_base); in mgsl_claim_resources()
4063 info->io_addr_requested = true; in mgsl_claim_resources()
4065 if ( request_irq(info->irq_level,mgsl_interrupt,info->irq_flags, in mgsl_claim_resources()
4066 info->device_name, info ) < 0 ) { in mgsl_claim_resources()
4068 __FILE__,__LINE__,info->device_name, info->irq_level ); in mgsl_claim_resources()
4071 info->irq_requested = true; in mgsl_claim_resources()
4073 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in mgsl_claim_resources()
4074 if (request_mem_region(info->phys_memory_base,0x40000,"synclink") == NULL) { in mgsl_claim_resources()
4076 __FILE__,__LINE__,info->device_name, info->phys_memory_base); in mgsl_claim_resources()
4079 info->shared_mem_requested = true; in mgsl_claim_resources()
4080 if (request_mem_region(info->phys_lcr_base + info->lcr_offset,128,"synclink") == NULL) { in mgsl_claim_resources()
4082 __FILE__,__LINE__,info->device_name, info->phys_lcr_base + info->lcr_offset); in mgsl_claim_resources()
4085 info->lcr_mem_requested = true; in mgsl_claim_resources()
4087 info->memory_base = ioremap_nocache(info->phys_memory_base, in mgsl_claim_resources()
4089 if (!info->memory_base) { in mgsl_claim_resources()
4091 __FILE__,__LINE__,info->device_name, info->phys_memory_base ); in mgsl_claim_resources()
4095 if ( !mgsl_memory_test(info) ) { in mgsl_claim_resources()
4097 __FILE__,__LINE__,info->device_name, info->phys_memory_base ); in mgsl_claim_resources()
4101 info->lcr_base = ioremap_nocache(info->phys_lcr_base, in mgsl_claim_resources()
4103 if (!info->lcr_base) { in mgsl_claim_resources()
4105 __FILE__,__LINE__,info->device_name, info->phys_lcr_base ); in mgsl_claim_resources()
4108 info->lcr_base += info->lcr_offset; in mgsl_claim_resources()
4113 if (request_dma(info->dma_level,info->device_name) < 0){ in mgsl_claim_resources()
4115 __FILE__,__LINE__,info->device_name, info->dma_level ); in mgsl_claim_resources()
4116 mgsl_release_resources( info ); in mgsl_claim_resources()
4119 info->dma_requested = true; in mgsl_claim_resources()
4122 set_dma_mode(info->dma_level,DMA_MODE_CASCADE); in mgsl_claim_resources()
4123 enable_dma(info->dma_level); in mgsl_claim_resources()
4126 if ( mgsl_allocate_dma_buffers(info) < 0 ) { in mgsl_claim_resources()
4128 __FILE__,__LINE__,info->device_name, info->dma_level ); in mgsl_claim_resources()
4134 mgsl_release_resources(info); in mgsl_claim_resources()
4139 static void mgsl_release_resources(struct mgsl_struct *info) in mgsl_release_resources() argument
4143 __FILE__,__LINE__,info->device_name ); in mgsl_release_resources()
4145 if ( info->irq_requested ) { in mgsl_release_resources()
4146 free_irq(info->irq_level, info); in mgsl_release_resources()
4147 info->irq_requested = false; in mgsl_release_resources()
4149 if ( info->dma_requested ) { in mgsl_release_resources()
4150 disable_dma(info->dma_level); in mgsl_release_resources()
4151 free_dma(info->dma_level); in mgsl_release_resources()
4152 info->dma_requested = false; in mgsl_release_resources()
4154 mgsl_free_dma_buffers(info); in mgsl_release_resources()
4155 mgsl_free_intermediate_rxbuffer_memory(info); in mgsl_release_resources()
4156 mgsl_free_intermediate_txbuffer_memory(info); in mgsl_release_resources()
4158 if ( info->io_addr_requested ) { in mgsl_release_resources()
4159 release_region(info->io_base,info->io_addr_size); in mgsl_release_resources()
4160 info->io_addr_requested = false; in mgsl_release_resources()
4162 if ( info->shared_mem_requested ) { in mgsl_release_resources()
4163 release_mem_region(info->phys_memory_base,0x40000); in mgsl_release_resources()
4164 info->shared_mem_requested = false; in mgsl_release_resources()
4166 if ( info->lcr_mem_requested ) { in mgsl_release_resources()
4167 release_mem_region(info->phys_lcr_base + info->lcr_offset,128); in mgsl_release_resources()
4168 info->lcr_mem_requested = false; in mgsl_release_resources()
4170 if (info->memory_base){ in mgsl_release_resources()
4171 iounmap(info->memory_base); in mgsl_release_resources()
4172 info->memory_base = NULL; in mgsl_release_resources()
4174 if (info->lcr_base){ in mgsl_release_resources()
4175 iounmap(info->lcr_base - info->lcr_offset); in mgsl_release_resources()
4176 info->lcr_base = NULL; in mgsl_release_resources()
4181 __FILE__,__LINE__,info->device_name ); in mgsl_release_resources()
4193 static void mgsl_add_device( struct mgsl_struct *info ) in mgsl_add_device() argument
4195 info->next_device = NULL; in mgsl_add_device()
4196 info->line = mgsl_device_count; in mgsl_add_device()
4197 sprintf(info->device_name,"ttySL%d",info->line); in mgsl_add_device()
4199 if (info->line < MAX_TOTAL_DEVICES) { in mgsl_add_device()
4200 if (maxframe[info->line]) in mgsl_add_device()
4201 info->max_frame_size = maxframe[info->line]; in mgsl_add_device()
4203 if (txdmabufs[info->line]) { in mgsl_add_device()
4204 info->num_tx_dma_buffers = txdmabufs[info->line]; in mgsl_add_device()
4205 if (info->num_tx_dma_buffers < 1) in mgsl_add_device()
4206 info->num_tx_dma_buffers = 1; in mgsl_add_device()
4209 if (txholdbufs[info->line]) { in mgsl_add_device()
4210 info->num_tx_holding_buffers = txholdbufs[info->line]; in mgsl_add_device()
4211 if (info->num_tx_holding_buffers < 1) in mgsl_add_device()
4212 info->num_tx_holding_buffers = 1; in mgsl_add_device()
4213 else if (info->num_tx_holding_buffers > MAX_TX_HOLDING_BUFFERS) in mgsl_add_device()
4214 info->num_tx_holding_buffers = MAX_TX_HOLDING_BUFFERS; in mgsl_add_device()
4221 mgsl_device_list = info; in mgsl_add_device()
4226 current_dev->next_device = info; in mgsl_add_device()
4229 if ( info->max_frame_size < 4096 ) in mgsl_add_device()
4230 info->max_frame_size = 4096; in mgsl_add_device()
4231 else if ( info->max_frame_size > 65535 ) in mgsl_add_device()
4232 info->max_frame_size = 65535; in mgsl_add_device()
4234 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in mgsl_add_device()
4236 info->hw_version + 1, info->device_name, info->io_base, info->irq_level, in mgsl_add_device()
4237 info->phys_memory_base, info->phys_lcr_base, in mgsl_add_device()
4238 info->max_frame_size ); in mgsl_add_device()
4241 info->device_name, info->io_base, info->irq_level, info->dma_level, in mgsl_add_device()
4242 info->max_frame_size ); in mgsl_add_device()
4246 hdlcdev_init(info); in mgsl_add_device()
4266 struct mgsl_struct *info; in mgsl_allocate_device() local
4268 info = kzalloc(sizeof(struct mgsl_struct), in mgsl_allocate_device()
4271 if (!info) { in mgsl_allocate_device()
4274 tty_port_init(&info->port); in mgsl_allocate_device()
4275 info->port.ops = &mgsl_port_ops; in mgsl_allocate_device()
4276 info->magic = MGSL_MAGIC; in mgsl_allocate_device()
4277 INIT_WORK(&info->task, mgsl_bh_handler); in mgsl_allocate_device()
4278 info->max_frame_size = 4096; in mgsl_allocate_device()
4279 info->port.close_delay = 5*HZ/10; in mgsl_allocate_device()
4280 info->port.closing_wait = 30*HZ; in mgsl_allocate_device()
4281 init_waitqueue_head(&info->status_event_wait_q); in mgsl_allocate_device()
4282 init_waitqueue_head(&info->event_wait_q); in mgsl_allocate_device()
4283 spin_lock_init(&info->irq_spinlock); in mgsl_allocate_device()
4284 spin_lock_init(&info->netlock); in mgsl_allocate_device()
4285 memcpy(&info->params,&default_params,sizeof(MGSL_PARAMS)); in mgsl_allocate_device()
4286 info->idle_mode = HDLC_TXIDLE_FLAGS; in mgsl_allocate_device()
4287 info->num_tx_dma_buffers = 1; in mgsl_allocate_device()
4288 info->num_tx_holding_buffers = 0; in mgsl_allocate_device()
4291 return info; in mgsl_allocate_device()
4363 struct mgsl_struct *info; in mgsl_enum_isa_devices() local
4373 info = mgsl_allocate_device(); in mgsl_enum_isa_devices()
4374 if ( !info ) { in mgsl_enum_isa_devices()
4382 info->io_base = (unsigned int)io[i]; in mgsl_enum_isa_devices()
4383 info->irq_level = (unsigned int)irq[i]; in mgsl_enum_isa_devices()
4384 info->irq_level = irq_canonicalize(info->irq_level); in mgsl_enum_isa_devices()
4385 info->dma_level = (unsigned int)dma[i]; in mgsl_enum_isa_devices()
4386 info->bus_type = MGSL_BUS_TYPE_ISA; in mgsl_enum_isa_devices()
4387 info->io_addr_size = 16; in mgsl_enum_isa_devices()
4388 info->irq_flags = 0; in mgsl_enum_isa_devices()
4390 mgsl_add_device( info ); in mgsl_enum_isa_devices()
4397 struct mgsl_struct *info; in synclink_cleanup() local
4410 info = mgsl_device_list; in synclink_cleanup()
4411 while(info) { in synclink_cleanup()
4413 hdlcdev_exit(info); in synclink_cleanup()
4415 mgsl_release_resources(info); in synclink_cleanup()
4416 tmp = info; in synclink_cleanup()
4417 info = info->next_device; in synclink_cleanup()
4482 static void usc_RTCmd( struct mgsl_struct *info, u16 Cmd ) in usc_RTCmd() argument
4487 outw( Cmd + info->loopback_bits, info->io_base + CCAR ); in usc_RTCmd()
4490 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_RTCmd()
4491 inw( info->io_base + CCAR ); in usc_RTCmd()
4509 static void usc_DmaCmd( struct mgsl_struct *info, u16 Cmd ) in usc_DmaCmd() argument
4512 outw( Cmd + info->mbre_bit, info->io_base ); in usc_DmaCmd()
4515 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_DmaCmd()
4516 inw( info->io_base ); in usc_DmaCmd()
4536 static void usc_OutDmaReg( struct mgsl_struct *info, u16 RegAddr, u16 RegValue ) in usc_OutDmaReg() argument
4541 outw( RegAddr + info->mbre_bit, info->io_base ); in usc_OutDmaReg()
4542 outw( RegValue, info->io_base ); in usc_OutDmaReg()
4545 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_OutDmaReg()
4546 inw( info->io_base ); in usc_OutDmaReg()
4565 static u16 usc_InDmaReg( struct mgsl_struct *info, u16 RegAddr ) in usc_InDmaReg() argument
4570 outw( RegAddr + info->mbre_bit, info->io_base ); in usc_InDmaReg()
4571 return inw( info->io_base ); in usc_InDmaReg()
4592 static void usc_OutReg( struct mgsl_struct *info, u16 RegAddr, u16 RegValue ) in usc_OutReg() argument
4594 outw( RegAddr + info->loopback_bits, info->io_base + CCAR ); in usc_OutReg()
4595 outw( RegValue, info->io_base + CCAR ); in usc_OutReg()
4598 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_OutReg()
4599 inw( info->io_base + CCAR ); in usc_OutReg()
4617 static u16 usc_InReg( struct mgsl_struct *info, u16 RegAddr ) in usc_InReg() argument
4619 outw( RegAddr + info->loopback_bits, info->io_base + CCAR ); in usc_InReg()
4620 return inw( info->io_base + CCAR ); in usc_InReg()
4631 static void usc_set_sdlc_mode( struct mgsl_struct *info ) in usc_set_sdlc_mode() argument
4645 usc_OutReg(info,TMCR,0x1f); in usc_set_sdlc_mode()
4646 RegValue=usc_InReg(info,TMDR); in usc_set_sdlc_mode()
4649 if ( info->params.flags & HDLC_FLAG_HDLC_LOOPMODE ) in usc_set_sdlc_mode()
4683 if (info->params.mode == MGSL_MODE_RAW) { in usc_set_sdlc_mode()
4686 usc_OutReg( info, IOCR, /* Set IOCR DCD is RxSync Detect Input */ in usc_set_sdlc_mode()
4687 (unsigned short)((usc_InReg(info, IOCR) & ~(BIT13|BIT12)) | BIT12)); in usc_set_sdlc_mode()
4707 if ( info->params.flags & HDLC_FLAG_UNDERRUN_ABORT15 ) in usc_set_sdlc_mode()
4709 else if ( info->params.flags & HDLC_FLAG_UNDERRUN_FLAG ) in usc_set_sdlc_mode()
4711 else if ( info->params.flags & HDLC_FLAG_UNDERRUN_CRC ) in usc_set_sdlc_mode()
4715 if ( info->params.preamble != HDLC_PREAMBLE_PATTERN_NONE ) in usc_set_sdlc_mode()
4719 if ( info->params.mode == MGSL_MODE_HDLC && in usc_set_sdlc_mode()
4720 (info->params.flags & HDLC_FLAG_SHARE_ZERO) ) in usc_set_sdlc_mode()
4723 if ( info->params.addr_filter != 0xff ) in usc_set_sdlc_mode()
4726 usc_OutReg( info, RSR, info->params.addr_filter ); in usc_set_sdlc_mode()
4730 usc_OutReg( info, CMR, RegValue ); in usc_set_sdlc_mode()
4731 info->cmr_value = RegValue; in usc_set_sdlc_mode()
4750 switch ( info->params.encoding ) { in usc_set_sdlc_mode()
4760 if ( (info->params.crc_type & HDLC_CRC_MASK) == HDLC_CRC_16_CCITT ) in usc_set_sdlc_mode()
4762 else if ( (info->params.crc_type & HDLC_CRC_MASK) == HDLC_CRC_32_CCITT ) in usc_set_sdlc_mode()
4765 usc_OutReg( info, RMR, RegValue ); in usc_set_sdlc_mode()
4774 usc_OutReg( info, RCLR, RCLRVALUE ); in usc_set_sdlc_mode()
4776 usc_RCmd( info, RCmd_SelectRicrdma_level ); in usc_set_sdlc_mode()
4796 RegValue = usc_InReg( info, RICR ) & 0xc0; in usc_set_sdlc_mode()
4798 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_set_sdlc_mode()
4799 usc_OutReg( info, RICR, (u16)(0x030a | RegValue) ); in usc_set_sdlc_mode()
4801 usc_OutReg( info, RICR, (u16)(0x140a | RegValue) ); in usc_set_sdlc_mode()
4805 usc_UnlatchRxstatusBits( info, RXSTATUS_ALL ); in usc_set_sdlc_mode()
4806 usc_ClearIrqPendingBits( info, RECEIVE_STATUS ); in usc_set_sdlc_mode()
4825 switch ( info->params.encoding ) { in usc_set_sdlc_mode()
4835 if ( (info->params.crc_type & HDLC_CRC_MASK) == HDLC_CRC_16_CCITT ) in usc_set_sdlc_mode()
4837 else if ( (info->params.crc_type & HDLC_CRC_MASK) == HDLC_CRC_32_CCITT ) in usc_set_sdlc_mode()
4840 usc_OutReg( info, TMR, RegValue ); in usc_set_sdlc_mode()
4842 usc_set_txidle( info ); in usc_set_sdlc_mode()
4845 usc_TCmd( info, TCmd_SelectTicrdma_level ); in usc_set_sdlc_mode()
4862 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_set_sdlc_mode()
4863 usc_OutReg( info, TICR, 0x0736 ); in usc_set_sdlc_mode()
4865 usc_OutReg( info, TICR, 0x1436 ); in usc_set_sdlc_mode()
4867 usc_UnlatchTxstatusBits( info, TXSTATUS_ALL ); in usc_set_sdlc_mode()
4868 usc_ClearIrqPendingBits( info, TRANSMIT_STATUS ); in usc_set_sdlc_mode()
4887 info->tcsr_value = 0; in usc_set_sdlc_mode()
4890 info->tcsr_value |= TCSR_UNDERWAIT; in usc_set_sdlc_mode()
4892 usc_OutReg( info, TCSR, info->tcsr_value ); in usc_set_sdlc_mode()
4909 if ( info->params.flags & HDLC_FLAG_RXC_DPLL ) in usc_set_sdlc_mode()
4911 else if ( info->params.flags & HDLC_FLAG_RXC_BRG ) in usc_set_sdlc_mode()
4913 else if ( info->params.flags & HDLC_FLAG_RXC_TXCPIN) in usc_set_sdlc_mode()
4918 if ( info->params.flags & HDLC_FLAG_TXC_DPLL ) in usc_set_sdlc_mode()
4920 else if ( info->params.flags & HDLC_FLAG_TXC_BRG ) in usc_set_sdlc_mode()
4922 else if ( info->params.flags & HDLC_FLAG_TXC_RXCPIN) in usc_set_sdlc_mode()
4927 usc_OutReg( info, CMCR, RegValue ); in usc_set_sdlc_mode()
4947 if ( info->params.flags & (HDLC_FLAG_RXC_DPLL | HDLC_FLAG_TXC_DPLL) ) { in usc_set_sdlc_mode()
4955 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_set_sdlc_mode()
4960 if ( info->params.flags & HDLC_FLAG_DPLL_DIV16 ) { in usc_set_sdlc_mode()
4964 else if ( info->params.flags & HDLC_FLAG_DPLL_DIV8 ) { in usc_set_sdlc_mode()
4985 if ( info->params.clock_speed ) in usc_set_sdlc_mode()
4987 Tc = (u16)((XtalSpeed/DpllDivisor)/info->params.clock_speed); in usc_set_sdlc_mode()
4988 if ( !((((XtalSpeed/DpllDivisor) % info->params.clock_speed) * 2) in usc_set_sdlc_mode()
4989 / info->params.clock_speed) ) in usc_set_sdlc_mode()
4997 usc_OutReg( info, TC1R, Tc ); in usc_set_sdlc_mode()
5001 switch ( info->params.encoding ) { in usc_set_sdlc_mode()
5013 usc_OutReg( info, HCR, RegValue ); in usc_set_sdlc_mode()
5034 usc_OutReg( info, CCSR, 0x1020 ); in usc_set_sdlc_mode()
5037 if ( info->params.flags & HDLC_FLAG_AUTO_CTS ) { in usc_set_sdlc_mode()
5038 usc_OutReg( info, SICR, in usc_set_sdlc_mode()
5039 (u16)(usc_InReg(info,SICR) | SICR_CTS_INACTIVE) ); in usc_set_sdlc_mode()
5044 usc_EnableMasterIrqBit( info ); in usc_set_sdlc_mode()
5046 usc_ClearIrqPendingBits( info, RECEIVE_STATUS | RECEIVE_DATA | in usc_set_sdlc_mode()
5050 usc_OutReg(info, SICR, (u16)(usc_InReg(info,SICR) | BIT3)); in usc_set_sdlc_mode()
5051 usc_EnableInterrupts(info, MISC); in usc_set_sdlc_mode()
5053 info->mbre_bit = 0; in usc_set_sdlc_mode()
5054 outw( 0, info->io_base ); /* clear Master Bus Enable (DCAR) */ in usc_set_sdlc_mode()
5055 usc_DmaCmd( info, DmaCmd_ResetAllChannels ); /* disable both DMA channels */ in usc_set_sdlc_mode()
5056 info->mbre_bit = BIT8; in usc_set_sdlc_mode()
5057 outw( BIT8, info->io_base ); /* set Master Bus Enable (DCAR) */ in usc_set_sdlc_mode()
5059 if (info->bus_type == MGSL_BUS_TYPE_ISA) { in usc_set_sdlc_mode()
5062 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) & ~BIT14)); in usc_set_sdlc_mode()
5087 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in usc_set_sdlc_mode()
5089 usc_OutDmaReg( info, DCR, 0xa00b ); in usc_set_sdlc_mode()
5092 usc_OutDmaReg( info, DCR, 0x800b ); in usc_set_sdlc_mode()
5108 usc_OutDmaReg( info, RDMR, 0xf200 ); in usc_set_sdlc_mode()
5124 usc_OutDmaReg( info, TDMR, 0xf200 ); in usc_set_sdlc_mode()
5140 usc_OutDmaReg( info, DICR, 0x9000 ); in usc_set_sdlc_mode()
5142 usc_InDmaReg( info, RDMR ); /* clear pending receive DMA IRQ bits */ in usc_set_sdlc_mode()
5143 usc_InDmaReg( info, TDMR ); /* clear pending transmit DMA IRQ bits */ in usc_set_sdlc_mode()
5144 usc_OutDmaReg( info, CDIR, 0x0303 ); /* clear IUS and Pending for Tx and Rx */ in usc_set_sdlc_mode()
5162 switch ( info->params.preamble_length ) { in usc_set_sdlc_mode()
5168 switch ( info->params.preamble ) { in usc_set_sdlc_mode()
5175 usc_OutReg( info, CCR, RegValue ); in usc_set_sdlc_mode()
5185 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in usc_set_sdlc_mode()
5187 usc_OutDmaReg( info, BDCR, 0x0000 ); in usc_set_sdlc_mode()
5190 usc_OutDmaReg( info, BDCR, 0x2000 ); in usc_set_sdlc_mode()
5192 usc_stop_transmitter(info); in usc_set_sdlc_mode()
5193 usc_stop_receiver(info); in usc_set_sdlc_mode()
5207 static void usc_enable_loopback(struct mgsl_struct *info, int enable) in usc_enable_loopback() argument
5211 usc_OutReg(info,IOCR,usc_InReg(info,IOCR) | (BIT7 | BIT6)); in usc_enable_loopback()
5226 usc_OutReg( info, CMCR, 0x0f64 ); in usc_enable_loopback()
5230 if (info->params.clock_speed) { in usc_enable_loopback()
5231 if (info->bus_type == MGSL_BUS_TYPE_PCI) in usc_enable_loopback()
5232 usc_OutReg(info, TC0R, (u16)((11059200/info->params.clock_speed)-1)); in usc_enable_loopback()
5234 usc_OutReg(info, TC0R, (u16)((14745600/info->params.clock_speed)-1)); in usc_enable_loopback()
5236 usc_OutReg(info, TC0R, (u16)8); in usc_enable_loopback()
5240 usc_OutReg( info, HCR, (u16)((usc_InReg( info, HCR ) & ~BIT1) | BIT0) ); in usc_enable_loopback()
5243 usc_OutReg(info, IOCR, (u16)((usc_InReg(info, IOCR) & 0xfff8) | 0x0004)); in usc_enable_loopback()
5246 info->loopback_bits = 0x300; in usc_enable_loopback()
5247 outw( 0x0300, info->io_base + CCAR ); in usc_enable_loopback()
5250 usc_OutReg(info,IOCR,usc_InReg(info,IOCR) & ~(BIT7 | BIT6)); in usc_enable_loopback()
5253 info->loopback_bits = 0; in usc_enable_loopback()
5254 outw( 0,info->io_base + CCAR ); in usc_enable_loopback()
5271 static void usc_enable_aux_clock( struct mgsl_struct *info, u32 data_rate ) in usc_enable_aux_clock() argument
5277 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_enable_aux_clock()
5295 usc_OutReg( info, TC0R, Tc ); in usc_enable_aux_clock()
5303 usc_OutReg( info, HCR, (u16)((usc_InReg( info, HCR ) & ~BIT1) | BIT0) ); in usc_enable_aux_clock()
5306 usc_OutReg( info, IOCR, (u16)((usc_InReg(info, IOCR) & 0xfff8) | 0x0004) ); in usc_enable_aux_clock()
5309 usc_OutReg( info, HCR, (u16)(usc_InReg( info, HCR ) & ~BIT0) ); in usc_enable_aux_clock()
5328 static void usc_process_rxoverrun_sync( struct mgsl_struct *info ) in usc_process_rxoverrun_sync() argument
5337 DMABUFFERENTRY *buffer_list = info->rx_buffer_list; in usc_process_rxoverrun_sync()
5340 usc_DmaCmd( info, DmaCmd_PauseRxChannel ); in usc_process_rxoverrun_sync()
5341 usc_RCmd( info, RCmd_EnterHuntmode ); in usc_process_rxoverrun_sync()
5342 usc_RTCmd( info, RTCmd_PurgeRxFifo ); in usc_process_rxoverrun_sync()
5347 frame_start_index = start_index = end_index = info->current_rx_buffer; in usc_process_rxoverrun_sync()
5380 if ( end_index == info->rx_buffer_count ) in usc_process_rxoverrun_sync()
5388 mgsl_reset_rx_dma_buffers( info ); in usc_process_rxoverrun_sync()
5409 *((unsigned long *)&(info->rx_buffer_list[start_index++].count)) = DMABUFFERSIZE; in usc_process_rxoverrun_sync()
5412 if ( start_index == info->rx_buffer_count ) in usc_process_rxoverrun_sync()
5422 usc_UnlatchRxstatusBits(info,RXSTATUS_ALL); in usc_process_rxoverrun_sync()
5423 usc_ClearIrqPendingBits(info, RECEIVE_DATA|RECEIVE_STATUS); in usc_process_rxoverrun_sync()
5424 usc_UnlatchRxstatusBits(info, RECEIVE_DATA|RECEIVE_STATUS); in usc_process_rxoverrun_sync()
5426 usc_EnableReceiver(info,DISABLE_UNCONDITIONAL); in usc_process_rxoverrun_sync()
5429 usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) ); in usc_process_rxoverrun_sync()
5432 phys_addr = info->rx_buffer_list[frame_start_index].phys_entry; in usc_process_rxoverrun_sync()
5433 usc_OutDmaReg( info, NRARL, (u16)phys_addr ); in usc_process_rxoverrun_sync()
5434 usc_OutDmaReg( info, NRARU, (u16)(phys_addr >> 16) ); in usc_process_rxoverrun_sync()
5436 usc_UnlatchRxstatusBits( info, RXSTATUS_ALL ); in usc_process_rxoverrun_sync()
5437 usc_ClearIrqPendingBits( info, RECEIVE_DATA | RECEIVE_STATUS ); in usc_process_rxoverrun_sync()
5438 usc_EnableInterrupts( info, RECEIVE_STATUS ); in usc_process_rxoverrun_sync()
5443 usc_OutDmaReg( info, RDIAR, BIT3 | BIT2 ); in usc_process_rxoverrun_sync()
5444 usc_OutDmaReg( info, DICR, (u16)(usc_InDmaReg(info,DICR) | BIT1) ); in usc_process_rxoverrun_sync()
5445 usc_DmaCmd( info, DmaCmd_InitRxChannel ); in usc_process_rxoverrun_sync()
5446 if ( info->params.flags & HDLC_FLAG_AUTO_DCD ) in usc_process_rxoverrun_sync()
5447 usc_EnableReceiver(info,ENABLE_AUTO_DCD); in usc_process_rxoverrun_sync()
5449 usc_EnableReceiver(info,ENABLE_UNCONDITIONAL); in usc_process_rxoverrun_sync()
5454 usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) ); in usc_process_rxoverrun_sync()
5455 usc_RTCmd( info, RTCmd_PurgeRxFifo ); in usc_process_rxoverrun_sync()
5467 static void usc_stop_receiver( struct mgsl_struct *info ) in usc_stop_receiver() argument
5471 __FILE__,__LINE__, info->device_name ); in usc_stop_receiver()
5475 usc_DmaCmd( info, DmaCmd_ResetRxChannel ); in usc_stop_receiver()
5477 usc_UnlatchRxstatusBits( info, RXSTATUS_ALL ); in usc_stop_receiver()
5478 usc_ClearIrqPendingBits( info, RECEIVE_DATA | RECEIVE_STATUS ); in usc_stop_receiver()
5479 usc_DisableInterrupts( info, RECEIVE_DATA | RECEIVE_STATUS ); in usc_stop_receiver()
5481 usc_EnableReceiver(info,DISABLE_UNCONDITIONAL); in usc_stop_receiver()
5484 usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) ); in usc_stop_receiver()
5485 usc_RTCmd( info, RTCmd_PurgeRxFifo ); in usc_stop_receiver()
5487 info->rx_enabled = false; in usc_stop_receiver()
5488 info->rx_overflow = false; in usc_stop_receiver()
5489 info->rx_rcc_underrun = false; in usc_stop_receiver()
5500 static void usc_start_receiver( struct mgsl_struct *info ) in usc_start_receiver() argument
5506 __FILE__,__LINE__, info->device_name ); in usc_start_receiver()
5508 mgsl_reset_rx_dma_buffers( info ); in usc_start_receiver()
5509 usc_stop_receiver( info ); in usc_start_receiver()
5511 usc_OutReg( info, CCSR, (u16)(usc_InReg(info,CCSR) | BIT13) ); in usc_start_receiver()
5512 usc_RTCmd( info, RTCmd_PurgeRxFifo ); in usc_start_receiver()
5514 if ( info->params.mode == MGSL_MODE_HDLC || in usc_start_receiver()
5515 info->params.mode == MGSL_MODE_RAW ) { in usc_start_receiver()
5521 phys_addr = info->rx_buffer_list[0].phys_entry; in usc_start_receiver()
5522 usc_OutDmaReg( info, NRARL, (u16)phys_addr ); in usc_start_receiver()
5523 usc_OutDmaReg( info, NRARU, (u16)(phys_addr >> 16) ); in usc_start_receiver()
5525 usc_UnlatchRxstatusBits( info, RXSTATUS_ALL ); in usc_start_receiver()
5526 usc_ClearIrqPendingBits( info, RECEIVE_DATA | RECEIVE_STATUS ); in usc_start_receiver()
5527 usc_EnableInterrupts( info, RECEIVE_STATUS ); in usc_start_receiver()
5532 usc_OutDmaReg( info, RDIAR, BIT3 | BIT2 ); in usc_start_receiver()
5533 usc_OutDmaReg( info, DICR, (u16)(usc_InDmaReg(info,DICR) | BIT1) ); in usc_start_receiver()
5534 usc_DmaCmd( info, DmaCmd_InitRxChannel ); in usc_start_receiver()
5535 if ( info->params.flags & HDLC_FLAG_AUTO_DCD ) in usc_start_receiver()
5536 usc_EnableReceiver(info,ENABLE_AUTO_DCD); in usc_start_receiver()
5538 usc_EnableReceiver(info,ENABLE_UNCONDITIONAL); in usc_start_receiver()
5540 usc_UnlatchRxstatusBits(info, RXSTATUS_ALL); in usc_start_receiver()
5541 usc_ClearIrqPendingBits(info, RECEIVE_DATA | RECEIVE_STATUS); in usc_start_receiver()
5542 usc_EnableInterrupts(info, RECEIVE_DATA); in usc_start_receiver()
5544 usc_RTCmd( info, RTCmd_PurgeRxFifo ); in usc_start_receiver()
5545 usc_RCmd( info, RCmd_EnterHuntmode ); in usc_start_receiver()
5547 usc_EnableReceiver(info,ENABLE_UNCONDITIONAL); in usc_start_receiver()
5550 usc_OutReg( info, CCSR, 0x1020 ); in usc_start_receiver()
5552 info->rx_enabled = true; in usc_start_receiver()
5564 static void usc_start_transmitter( struct mgsl_struct *info ) in usc_start_transmitter() argument
5571 __FILE__,__LINE__, info->device_name ); in usc_start_transmitter()
5573 if ( info->xmit_cnt ) { in usc_start_transmitter()
5579 info->drop_rts_on_tx_done = false; in usc_start_transmitter()
5581 if ( info->params.flags & HDLC_FLAG_AUTO_RTS ) { in usc_start_transmitter()
5582 usc_get_serial_signals( info ); in usc_start_transmitter()
5583 if ( !(info->serial_signals & SerialSignal_RTS) ) { in usc_start_transmitter()
5584 info->serial_signals |= SerialSignal_RTS; in usc_start_transmitter()
5585 usc_set_serial_signals( info ); in usc_start_transmitter()
5586 info->drop_rts_on_tx_done = true; in usc_start_transmitter()
5591 if ( info->params.mode == MGSL_MODE_ASYNC ) { in usc_start_transmitter()
5592 if ( !info->tx_active ) { in usc_start_transmitter()
5593 usc_UnlatchTxstatusBits(info, TXSTATUS_ALL); in usc_start_transmitter()
5594 usc_ClearIrqPendingBits(info, TRANSMIT_STATUS + TRANSMIT_DATA); in usc_start_transmitter()
5595 usc_EnableInterrupts(info, TRANSMIT_DATA); in usc_start_transmitter()
5596 usc_load_txfifo(info); in usc_start_transmitter()
5600 usc_DmaCmd( info, DmaCmd_ResetTxChannel ); in usc_start_transmitter()
5605 FrameSize = info->tx_buffer_list[info->start_tx_dma_buffer].rcc; in usc_start_transmitter()
5611 if ( info->params.mode == MGSL_MODE_RAW ) in usc_start_transmitter()
5612 info->tx_buffer_list[info->start_tx_dma_buffer].rcc = 0; in usc_start_transmitter()
5616 usc_OutReg( info, TCLR, (u16)FrameSize ); in usc_start_transmitter()
5618 usc_RTCmd( info, RTCmd_PurgeTxFifo ); in usc_start_transmitter()
5621 phys_addr = info->tx_buffer_list[info->start_tx_dma_buffer].phys_entry; in usc_start_transmitter()
5622 usc_OutDmaReg( info, NTARL, (u16)phys_addr ); in usc_start_transmitter()
5623 usc_OutDmaReg( info, NTARU, (u16)(phys_addr >> 16) ); in usc_start_transmitter()
5625 usc_UnlatchTxstatusBits( info, TXSTATUS_ALL ); in usc_start_transmitter()
5626 usc_ClearIrqPendingBits( info, TRANSMIT_STATUS ); in usc_start_transmitter()
5627 usc_EnableInterrupts( info, TRANSMIT_STATUS ); in usc_start_transmitter()
5629 if ( info->params.mode == MGSL_MODE_RAW && in usc_start_transmitter()
5630 info->num_tx_dma_buffers > 1 ) { in usc_start_transmitter()
5638 usc_OutDmaReg( info, TDIAR, BIT2|BIT3 ); in usc_start_transmitter()
5639 usc_OutDmaReg( info, DICR, (u16)(usc_InDmaReg(info,DICR) | BIT0) ); in usc_start_transmitter()
5643 usc_DmaCmd( info, DmaCmd_InitTxChannel ); in usc_start_transmitter()
5645 usc_TCmd( info, TCmd_SendFrame ); in usc_start_transmitter()
5647 mod_timer(&info->tx_timer, jiffies + in usc_start_transmitter()
5650 info->tx_active = true; in usc_start_transmitter()
5653 if ( !info->tx_enabled ) { in usc_start_transmitter()
5654 info->tx_enabled = true; in usc_start_transmitter()
5655 if ( info->params.flags & HDLC_FLAG_AUTO_CTS ) in usc_start_transmitter()
5656 usc_EnableTransmitter(info,ENABLE_AUTO_CTS); in usc_start_transmitter()
5658 usc_EnableTransmitter(info,ENABLE_UNCONDITIONAL); in usc_start_transmitter()
5670 static void usc_stop_transmitter( struct mgsl_struct *info ) in usc_stop_transmitter() argument
5674 __FILE__,__LINE__, info->device_name ); in usc_stop_transmitter()
5676 del_timer(&info->tx_timer); in usc_stop_transmitter()
5678 usc_UnlatchTxstatusBits( info, TXSTATUS_ALL ); in usc_stop_transmitter()
5679 usc_ClearIrqPendingBits( info, TRANSMIT_STATUS + TRANSMIT_DATA ); in usc_stop_transmitter()
5680 usc_DisableInterrupts( info, TRANSMIT_STATUS + TRANSMIT_DATA ); in usc_stop_transmitter()
5682 usc_EnableTransmitter(info,DISABLE_UNCONDITIONAL); in usc_stop_transmitter()
5683 usc_DmaCmd( info, DmaCmd_ResetTxChannel ); in usc_stop_transmitter()
5684 usc_RTCmd( info, RTCmd_PurgeTxFifo ); in usc_stop_transmitter()
5686 info->tx_enabled = false; in usc_stop_transmitter()
5687 info->tx_active = false; in usc_stop_transmitter()
5699 static void usc_load_txfifo( struct mgsl_struct *info ) in usc_load_txfifo() argument
5704 if ( !info->xmit_cnt && !info->x_char ) in usc_load_txfifo()
5708 usc_TCmd( info, TCmd_SelectTicrTxFifostatus ); in usc_load_txfifo()
5712 while( (Fifocount = usc_InReg(info, TICR) >> 8) && info->xmit_cnt ) { in usc_load_txfifo()
5716 if ( (info->xmit_cnt > 1) && (Fifocount > 1) && !info->x_char ) { in usc_load_txfifo()
5719 TwoBytes[0] = info->xmit_buf[info->xmit_tail++]; in usc_load_txfifo()
5720 info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); in usc_load_txfifo()
5721 TwoBytes[1] = info->xmit_buf[info->xmit_tail++]; in usc_load_txfifo()
5722 info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); in usc_load_txfifo()
5724 outw( *((u16 *)TwoBytes), info->io_base + DATAREG); in usc_load_txfifo()
5726 info->xmit_cnt -= 2; in usc_load_txfifo()
5727 info->icount.tx += 2; in usc_load_txfifo()
5731 outw( (inw( info->io_base + CCAR) & 0x0780) | (TDR+LSBONLY), in usc_load_txfifo()
5732 info->io_base + CCAR ); in usc_load_txfifo()
5734 if (info->x_char) { in usc_load_txfifo()
5736 outw( info->x_char,info->io_base + CCAR ); in usc_load_txfifo()
5737 info->x_char = 0; in usc_load_txfifo()
5739 outw( info->xmit_buf[info->xmit_tail++],info->io_base + CCAR ); in usc_load_txfifo()
5740 info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); in usc_load_txfifo()
5741 info->xmit_cnt--; in usc_load_txfifo()
5743 info->icount.tx++; in usc_load_txfifo()
5756 static void usc_reset( struct mgsl_struct *info ) in usc_reset() argument
5758 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { in usc_reset()
5765 volatile u32 *MiscCtrl = (u32 *)(info->lcr_base + 0x50); in usc_reset()
5766 u32 *LCR0BRDR = (u32 *)(info->lcr_base + 0x28); in usc_reset()
5768 info->misc_ctrl_value |= BIT30; in usc_reset()
5769 *MiscCtrl = info->misc_ctrl_value; in usc_reset()
5779 info->misc_ctrl_value &= ~BIT30; in usc_reset()
5780 *MiscCtrl = info->misc_ctrl_value; in usc_reset()
5794 outb( 0,info->io_base + 8 ); in usc_reset()
5797 info->mbre_bit = 0; in usc_reset()
5798 info->loopback_bits = 0; in usc_reset()
5799 info->usc_idle_mode = 0; in usc_reset()
5818 outw( 0x000c,info->io_base + SDPIN ); in usc_reset()
5821 outw( 0,info->io_base ); in usc_reset()
5822 outw( 0,info->io_base + CCAR ); in usc_reset()
5825 usc_RTCmd( info, RTCmd_SelectLittleEndian ); in usc_reset()
5842 usc_OutReg( info, PCR, 0xf0f5 ); in usc_reset()
5859 usc_OutReg( info, IOCR, 0x0004 ); in usc_reset()
5870 static void usc_set_async_mode( struct mgsl_struct *info ) in usc_set_async_mode() argument
5875 usc_DisableMasterIrqBit( info ); in usc_set_async_mode()
5877 outw( 0, info->io_base ); /* clear Master Bus Enable (DCAR) */ in usc_set_async_mode()
5878 usc_DmaCmd( info, DmaCmd_ResetAllChannels ); /* disable both DMA channels */ in usc_set_async_mode()
5880 usc_loopback_frame( info ); in usc_set_async_mode()
5895 if ( info->params.stop_bits != 1 ) in usc_set_async_mode()
5897 usc_OutReg( info, CMR, RegValue ); in usc_set_async_mode()
5914 if ( info->params.data_bits != 8 ) in usc_set_async_mode()
5917 if ( info->params.parity != ASYNC_PARITY_NONE ) { in usc_set_async_mode()
5919 if ( info->params.parity != ASYNC_PARITY_ODD ) in usc_set_async_mode()
5923 usc_OutReg( info, RMR, RegValue ); in usc_set_async_mode()
5928 usc_RCmd( info, RCmd_SelectRicrIntLevel ); in usc_set_async_mode()
5951 usc_OutReg( info, RICR, 0x0000 ); in usc_set_async_mode()
5953 usc_UnlatchRxstatusBits( info, RXSTATUS_ALL ); in usc_set_async_mode()
5954 usc_ClearIrqPendingBits( info, RECEIVE_STATUS ); in usc_set_async_mode()
5971 if ( info->params.data_bits != 8 ) in usc_set_async_mode()
5974 if ( info->params.parity != ASYNC_PARITY_NONE ) { in usc_set_async_mode()
5976 if ( info->params.parity != ASYNC_PARITY_ODD ) in usc_set_async_mode()
5980 usc_OutReg( info, TMR, RegValue ); in usc_set_async_mode()
5982 usc_set_txidle( info ); in usc_set_async_mode()
5987 usc_TCmd( info, TCmd_SelectTicrIntLevel ); in usc_set_async_mode()
6005 usc_OutReg( info, TICR, 0x1f40 ); in usc_set_async_mode()
6007 usc_UnlatchTxstatusBits( info, TXSTATUS_ALL ); in usc_set_async_mode()
6008 usc_ClearIrqPendingBits( info, TRANSMIT_STATUS ); in usc_set_async_mode()
6010 usc_enable_async_clock( info, info->params.data_rate ); in usc_set_async_mode()
6031 usc_OutReg( info, CCSR, 0x0020 ); in usc_set_async_mode()
6033 usc_DisableInterrupts( info, TRANSMIT_STATUS + TRANSMIT_DATA + in usc_set_async_mode()
6036 usc_ClearIrqPendingBits( info, TRANSMIT_STATUS + TRANSMIT_DATA + in usc_set_async_mode()
6039 usc_EnableMasterIrqBit( info ); in usc_set_async_mode()
6041 if (info->bus_type == MGSL_BUS_TYPE_ISA) { in usc_set_async_mode()
6044 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12)); in usc_set_async_mode()
6047 if (info->params.loopback) { in usc_set_async_mode()
6048 info->loopback_bits = 0x300; in usc_set_async_mode()
6049 outw(0x0300, info->io_base + CCAR); in usc_set_async_mode()
6068 static void usc_loopback_frame( struct mgsl_struct *info ) in usc_loopback_frame() argument
6071 unsigned long oldmode = info->params.mode; in usc_loopback_frame()
6073 info->params.mode = MGSL_MODE_HDLC; in usc_loopback_frame()
6075 usc_DisableMasterIrqBit( info ); in usc_loopback_frame()
6077 usc_set_sdlc_mode( info ); in usc_loopback_frame()
6078 usc_enable_loopback( info, 1 ); in usc_loopback_frame()
6081 usc_OutReg( info, TC0R, 0 ); in usc_loopback_frame()
6097 usc_OutReg( info, CCR, 0x0100 ); in usc_loopback_frame()
6100 usc_RTCmd( info, RTCmd_PurgeRxFifo ); in usc_loopback_frame()
6101 usc_EnableReceiver(info,ENABLE_UNCONDITIONAL); in usc_loopback_frame()
6106 usc_OutReg( info, TCLR, 2 ); in usc_loopback_frame()
6107 usc_RTCmd( info, RTCmd_PurgeTxFifo ); in usc_loopback_frame()
6110 usc_UnlatchTxstatusBits(info,TXSTATUS_ALL); in usc_loopback_frame()
6111 outw(0,info->io_base + DATAREG); in usc_loopback_frame()
6114 usc_TCmd( info, TCmd_SendFrame ); in usc_loopback_frame()
6115 usc_EnableTransmitter(info,ENABLE_UNCONDITIONAL); in usc_loopback_frame()
6119 if (usc_InReg( info, RCSR ) & (BIT8 | BIT4 | BIT3 | BIT1)) in usc_loopback_frame()
6123 usc_enable_loopback(info, 0); in usc_loopback_frame()
6125 usc_EnableMasterIrqBit(info); in usc_loopback_frame()
6127 info->params.mode = oldmode; in usc_loopback_frame()
6136 static void usc_set_sync_mode( struct mgsl_struct *info ) in usc_set_sync_mode() argument
6138 usc_loopback_frame( info ); in usc_set_sync_mode()
6139 usc_set_sdlc_mode( info ); in usc_set_sync_mode()
6141 if (info->bus_type == MGSL_BUS_TYPE_ISA) { in usc_set_sync_mode()
6144 usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12)); in usc_set_sync_mode()
6147 usc_enable_aux_clock(info, info->params.clock_speed); in usc_set_sync_mode()
6149 if (info->params.loopback) in usc_set_sync_mode()
6150 usc_enable_loopback(info,1); in usc_set_sync_mode()
6159 static void usc_set_txidle( struct mgsl_struct *info ) in usc_set_txidle() argument
6165 switch( info->idle_mode ){ in usc_set_txidle()
6175 info->usc_idle_mode = usc_idle_mode; in usc_set_txidle()
6177 info->tcsr_value &= ~IDLEMODE_MASK; /* clear idle mode bits */ in usc_set_txidle()
6178 info->tcsr_value += usc_idle_mode; in usc_set_txidle()
6179 usc_OutReg(info, TCSR, info->tcsr_value); in usc_set_txidle()
6188 if ( info->params.mode == MGSL_MODE_RAW ) { in usc_set_txidle()
6190 switch( info->idle_mode ) { in usc_set_txidle()
6210 usc_SetTransmitSyncChars(info,syncpat,syncpat); in usc_set_txidle()
6222 static void usc_get_serial_signals( struct mgsl_struct *info ) in usc_get_serial_signals() argument
6227 info->serial_signals &= SerialSignal_RTS | SerialSignal_DTR; in usc_get_serial_signals()
6232 status = usc_InReg( info, MISR ); in usc_get_serial_signals()
6237 info->serial_signals |= SerialSignal_CTS; in usc_get_serial_signals()
6240 info->serial_signals |= SerialSignal_DCD; in usc_get_serial_signals()
6243 info->serial_signals |= SerialSignal_RI; in usc_get_serial_signals()
6246 info->serial_signals |= SerialSignal_DSR; in usc_get_serial_signals()
6258 static void usc_set_serial_signals( struct mgsl_struct *info ) in usc_set_serial_signals() argument
6261 unsigned char V24Out = info->serial_signals; in usc_set_serial_signals()
6265 Control = usc_InReg( info, PCR ); in usc_set_serial_signals()
6277 usc_OutReg( info, PCR, Control ); in usc_set_serial_signals()
6290 static void usc_enable_async_clock( struct mgsl_struct *info, u32 data_rate ) in usc_enable_async_clock() argument
6307 usc_OutReg( info, CMCR, 0x0f64 ); in usc_enable_async_clock()
6316 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in usc_enable_async_clock()
6317 usc_OutReg( info, TC0R, (u16)((691200/data_rate) - 1) ); in usc_enable_async_clock()
6319 usc_OutReg( info, TC0R, (u16)((921600/data_rate) - 1) ); in usc_enable_async_clock()
6328 usc_OutReg( info, HCR, in usc_enable_async_clock()
6329 (u16)((usc_InReg( info, HCR ) & ~BIT1) | BIT0) ); in usc_enable_async_clock()
6334 usc_OutReg( info, IOCR, in usc_enable_async_clock()
6335 (u16)((usc_InReg(info, IOCR) & 0xfff8) | 0x0004) ); in usc_enable_async_clock()
6338 usc_OutReg( info, HCR, (u16)(usc_InReg( info, HCR ) & ~BIT0) ); in usc_enable_async_clock()
6400 static void mgsl_reset_tx_dma_buffers( struct mgsl_struct *info ) in mgsl_reset_tx_dma_buffers() argument
6404 for ( i = 0; i < info->tx_buffer_count; i++ ) { in mgsl_reset_tx_dma_buffers()
6405 *((unsigned long *)&(info->tx_buffer_list[i].count)) = 0; in mgsl_reset_tx_dma_buffers()
6408 info->current_tx_buffer = 0; in mgsl_reset_tx_dma_buffers()
6409 info->start_tx_dma_buffer = 0; in mgsl_reset_tx_dma_buffers()
6410 info->tx_dma_buffers_used = 0; in mgsl_reset_tx_dma_buffers()
6412 info->get_tx_holding_index = 0; in mgsl_reset_tx_dma_buffers()
6413 info->put_tx_holding_index = 0; in mgsl_reset_tx_dma_buffers()
6414 info->tx_holding_count = 0; in mgsl_reset_tx_dma_buffers()
6426 static int num_free_tx_dma_buffers(struct mgsl_struct *info) in num_free_tx_dma_buffers() argument
6428 return info->tx_buffer_count - info->tx_dma_buffers_used; in num_free_tx_dma_buffers()
6441 static void mgsl_reset_rx_dma_buffers( struct mgsl_struct *info ) in mgsl_reset_rx_dma_buffers() argument
6445 for ( i = 0; i < info->rx_buffer_count; i++ ) { in mgsl_reset_rx_dma_buffers()
6446 *((unsigned long *)&(info->rx_buffer_list[i].count)) = DMABUFFERSIZE; in mgsl_reset_rx_dma_buffers()
6451 info->current_rx_buffer = 0; in mgsl_reset_rx_dma_buffers()
6469 static void mgsl_free_rx_frame_buffers( struct mgsl_struct *info, unsigned int StartIndex, unsigned… in mgsl_free_rx_frame_buffers() argument
6481 pBufEntry = &(info->rx_buffer_list[Index]); in mgsl_free_rx_frame_buffers()
6495 if ( Index == info->rx_buffer_count ) in mgsl_free_rx_frame_buffers()
6500 info->current_rx_buffer = Index; in mgsl_free_rx_frame_buffers()
6512 static bool mgsl_get_rx_frame(struct mgsl_struct *info) in mgsl_get_rx_frame() argument
6520 struct tty_struct *tty = info->port.tty; in mgsl_get_rx_frame()
6530 StartIndex = EndIndex = info->current_rx_buffer; in mgsl_get_rx_frame()
6532 while( !info->rx_buffer_list[EndIndex].status ) { in mgsl_get_rx_frame()
6540 if ( info->rx_buffer_list[EndIndex].count ) in mgsl_get_rx_frame()
6545 if ( EndIndex == info->rx_buffer_count ) in mgsl_get_rx_frame()
6555 if ( info->rx_enabled ){ in mgsl_get_rx_frame()
6556 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_get_rx_frame()
6557 usc_start_receiver(info); in mgsl_get_rx_frame()
6558 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_get_rx_frame()
6567 status = info->rx_buffer_list[EndIndex].status; in mgsl_get_rx_frame()
6572 info->icount.rxshort++; in mgsl_get_rx_frame()
6574 info->icount.rxabort++; in mgsl_get_rx_frame()
6576 info->icount.rxover++; in mgsl_get_rx_frame()
6578 info->icount.rxcrc++; in mgsl_get_rx_frame()
6579 if ( info->params.crc_type & HDLC_CRC_RETURN_EX ) in mgsl_get_rx_frame()
6585 info->netdev->stats.rx_errors++; in mgsl_get_rx_frame()
6586 info->netdev->stats.rx_frame_errors++; in mgsl_get_rx_frame()
6599 framesize = RCLRVALUE - info->rx_buffer_list[EndIndex].rcc; in mgsl_get_rx_frame()
6602 if ( info->params.crc_type == HDLC_CRC_16_CCITT ) in mgsl_get_rx_frame()
6604 else if ( info->params.crc_type == HDLC_CRC_32_CCITT ) in mgsl_get_rx_frame()
6610 __FILE__,__LINE__,info->device_name,status,framesize); in mgsl_get_rx_frame()
6613 mgsl_trace_block(info,info->rx_buffer_list[StartIndex].virt_addr, in mgsl_get_rx_frame()
6617 if ( ( (info->params.crc_type & HDLC_CRC_RETURN_EX) && in mgsl_get_rx_frame()
6618 ((framesize+1) > info->max_frame_size) ) || in mgsl_get_rx_frame()
6619 (framesize > info->max_frame_size) ) in mgsl_get_rx_frame()
6620 info->icount.rxlong++; in mgsl_get_rx_frame()
6625 unsigned char *ptmp = info->intermediate_rxbuffer; in mgsl_get_rx_frame()
6628 info->icount.rxok++; in mgsl_get_rx_frame()
6637 pBufEntry = &(info->rx_buffer_list[index]); in mgsl_get_rx_frame()
6642 if ( ++index == info->rx_buffer_count ) in mgsl_get_rx_frame()
6646 if ( info->params.crc_type & HDLC_CRC_RETURN_EX ) { in mgsl_get_rx_frame()
6654 __FILE__,__LINE__,info->device_name, in mgsl_get_rx_frame()
6659 if (info->netcount) in mgsl_get_rx_frame()
6660 hdlcdev_rx(info,info->intermediate_rxbuffer,framesize); in mgsl_get_rx_frame()
6663 ldisc_receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize); in mgsl_get_rx_frame()
6667 mgsl_free_rx_frame_buffers( info, StartIndex, EndIndex ); in mgsl_get_rx_frame()
6673 if ( info->rx_enabled && info->rx_overflow ) { in mgsl_get_rx_frame()
6679 if ( !info->rx_buffer_list[EndIndex].status && in mgsl_get_rx_frame()
6680 info->rx_buffer_list[EndIndex].count ) { in mgsl_get_rx_frame()
6681 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_get_rx_frame()
6682 usc_start_receiver(info); in mgsl_get_rx_frame()
6683 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_get_rx_frame()
6710 static bool mgsl_get_raw_rx_frame(struct mgsl_struct *info) in mgsl_get_raw_rx_frame() argument
6718 struct tty_struct *tty = info->port.tty; in mgsl_get_raw_rx_frame()
6735 CurrentIndex = NextIndex = info->current_rx_buffer; in mgsl_get_raw_rx_frame()
6737 if ( NextIndex == info->rx_buffer_count ) in mgsl_get_raw_rx_frame()
6740 if ( info->rx_buffer_list[CurrentIndex].status != 0 || in mgsl_get_raw_rx_frame()
6741 (info->rx_buffer_list[CurrentIndex].count == 0 && in mgsl_get_raw_rx_frame()
6742 info->rx_buffer_list[NextIndex].count == 0)) { in mgsl_get_raw_rx_frame()
6750 status = info->rx_buffer_list[CurrentIndex].status; in mgsl_get_raw_rx_frame()
6755 info->icount.rxshort++; in mgsl_get_raw_rx_frame()
6757 info->icount.rxabort++; in mgsl_get_raw_rx_frame()
6759 info->icount.rxover++; in mgsl_get_raw_rx_frame()
6761 info->icount.rxcrc++; in mgsl_get_raw_rx_frame()
6799 if ( info->rx_buffer_list[CurrentIndex].rcc ) in mgsl_get_raw_rx_frame()
6800 framesize = RCLRVALUE - info->rx_buffer_list[CurrentIndex].rcc; in mgsl_get_raw_rx_frame()
6821 __FILE__,__LINE__,info->device_name,status,framesize); in mgsl_get_raw_rx_frame()
6824 mgsl_trace_block(info,info->rx_buffer_list[CurrentIndex].virt_addr, in mgsl_get_raw_rx_frame()
6831 pBufEntry = &(info->rx_buffer_list[CurrentIndex]); in mgsl_get_raw_rx_frame()
6832 memcpy( info->intermediate_rxbuffer, pBufEntry->virt_addr, framesize); in mgsl_get_raw_rx_frame()
6833 info->icount.rxok++; in mgsl_get_raw_rx_frame()
6835 ldisc_receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize); in mgsl_get_raw_rx_frame()
6839 mgsl_free_rx_frame_buffers( info, CurrentIndex, CurrentIndex ); in mgsl_get_raw_rx_frame()
6845 if ( info->rx_enabled && info->rx_overflow ) { in mgsl_get_raw_rx_frame()
6851 if ( !info->rx_buffer_list[CurrentIndex].status && in mgsl_get_raw_rx_frame()
6852 info->rx_buffer_list[CurrentIndex].count ) { in mgsl_get_raw_rx_frame()
6853 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_get_raw_rx_frame()
6854 usc_start_receiver(info); in mgsl_get_raw_rx_frame()
6855 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_get_raw_rx_frame()
6875 static void mgsl_load_tx_dma_buffer(struct mgsl_struct *info, in mgsl_load_tx_dma_buffer() argument
6883 mgsl_trace_block(info,Buffer, min_t(int, BufferSize, DMABUFFERSIZE), 1); in mgsl_load_tx_dma_buffer()
6885 if (info->params.flags & HDLC_FLAG_HDLC_LOOPMODE) { in mgsl_load_tx_dma_buffer()
6889 info->cmr_value |= BIT13; in mgsl_load_tx_dma_buffer()
6896 i = info->current_tx_buffer; in mgsl_load_tx_dma_buffer()
6897 info->start_tx_dma_buffer = i; in mgsl_load_tx_dma_buffer()
6902 info->tx_buffer_list[i].status = info->cmr_value & 0xf000; in mgsl_load_tx_dma_buffer()
6903 info->tx_buffer_list[i].rcc = BufferSize; in mgsl_load_tx_dma_buffer()
6904 info->tx_buffer_list[i].count = BufferSize; in mgsl_load_tx_dma_buffer()
6911 pBufEntry = &info->tx_buffer_list[i++]; in mgsl_load_tx_dma_buffer()
6913 if ( i == info->tx_buffer_count ) in mgsl_load_tx_dma_buffer()
6925 if ( info->bus_type == MGSL_BUS_TYPE_PCI ) in mgsl_load_tx_dma_buffer()
6936 ++info->tx_dma_buffers_used; in mgsl_load_tx_dma_buffer()
6940 info->current_tx_buffer = i; in mgsl_load_tx_dma_buffer()
6952 static bool mgsl_register_test( struct mgsl_struct *info ) in mgsl_register_test() argument
6961 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_register_test()
6962 usc_reset(info); in mgsl_register_test()
6966 if ( (usc_InReg( info, SICR ) != 0) || in mgsl_register_test()
6967 (usc_InReg( info, IVR ) != 0) || in mgsl_register_test()
6968 (usc_InDmaReg( info, DIVR ) != 0) ){ in mgsl_register_test()
6977 usc_OutReg( info, TC0R, BitPatterns[i] ); in mgsl_register_test()
6978 usc_OutReg( info, TC1R, BitPatterns[(i+1)%Patterncount] ); in mgsl_register_test()
6979 usc_OutReg( info, TCLR, BitPatterns[(i+2)%Patterncount] ); in mgsl_register_test()
6980 usc_OutReg( info, RCLR, BitPatterns[(i+3)%Patterncount] ); in mgsl_register_test()
6981 usc_OutReg( info, RSR, BitPatterns[(i+4)%Patterncount] ); in mgsl_register_test()
6982 usc_OutDmaReg( info, TBCR, BitPatterns[(i+5)%Patterncount] ); in mgsl_register_test()
6984 if ( (usc_InReg( info, TC0R ) != BitPatterns[i]) || in mgsl_register_test()
6985 (usc_InReg( info, TC1R ) != BitPatterns[(i+1)%Patterncount]) || in mgsl_register_test()
6986 (usc_InReg( info, TCLR ) != BitPatterns[(i+2)%Patterncount]) || in mgsl_register_test()
6987 (usc_InReg( info, RCLR ) != BitPatterns[(i+3)%Patterncount]) || in mgsl_register_test()
6988 (usc_InReg( info, RSR ) != BitPatterns[(i+4)%Patterncount]) || in mgsl_register_test()
6989 (usc_InDmaReg( info, TBCR ) != BitPatterns[(i+5)%Patterncount]) ){ in mgsl_register_test()
6996 usc_reset(info); in mgsl_register_test()
6997 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_register_test()
7008 static bool mgsl_irq_test( struct mgsl_struct *info ) in mgsl_irq_test() argument
7013 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_irq_test()
7014 usc_reset(info); in mgsl_irq_test()
7021 info->irq_occurred = false; in mgsl_irq_test()
7027 usc_OutReg( info, PCR, (unsigned short)((usc_InReg(info, PCR) | BIT13) & ~BIT12) ); in mgsl_irq_test()
7029 usc_EnableMasterIrqBit(info); in mgsl_irq_test()
7030 usc_EnableInterrupts(info, IO_PIN); in mgsl_irq_test()
7031 usc_ClearIrqPendingBits(info, IO_PIN); in mgsl_irq_test()
7033 usc_UnlatchIostatusBits(info, MISCSTATUS_TXC_LATCHED); in mgsl_irq_test()
7034 usc_EnableStatusIrqs(info, SICR_TXC_ACTIVE + SICR_TXC_INACTIVE); in mgsl_irq_test()
7036 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_irq_test()
7039 while( EndTime-- && !info->irq_occurred ) { in mgsl_irq_test()
7043 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_irq_test()
7044 usc_reset(info); in mgsl_irq_test()
7045 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_irq_test()
7047 return info->irq_occurred; in mgsl_irq_test()
7060 static bool mgsl_dma_test( struct mgsl_struct *info ) in mgsl_dma_test() argument
7074 memcpy(&tmp_params,&info->params,sizeof(MGSL_PARAMS)); in mgsl_dma_test()
7076 memcpy(&info->params,&default_params,sizeof(MGSL_PARAMS)); in mgsl_dma_test()
7080 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7084 usc_reset(info); in mgsl_dma_test()
7085 usc_set_sdlc_mode(info); in mgsl_dma_test()
7086 usc_enable_loopback(info,1); in mgsl_dma_test()
7108 usc_OutDmaReg( info, RDMR, 0xe200 ); in mgsl_dma_test()
7110 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7120 info->tx_buffer_list[0].count = FrameSize; in mgsl_dma_test()
7121 info->tx_buffer_list[0].rcc = FrameSize; in mgsl_dma_test()
7122 info->tx_buffer_list[0].status = 0x4000; in mgsl_dma_test()
7126 TmpPtr = info->tx_buffer_list[0].virt_addr; in mgsl_dma_test()
7133 info->rx_buffer_list[0].status = 0; in mgsl_dma_test()
7134 info->rx_buffer_list[0].count = FrameSize + 4; in mgsl_dma_test()
7138 memset( info->rx_buffer_list[0].virt_addr, 0, FrameSize + 4 ); in mgsl_dma_test()
7143 info->tx_buffer_list[1].count = 0; in mgsl_dma_test()
7144 info->rx_buffer_list[1].count = 0; in mgsl_dma_test()
7151 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7154 usc_RTCmd( info, RTCmd_PurgeRxFifo ); in mgsl_dma_test()
7157 phys_addr = info->rx_buffer_list[0].phys_entry; in mgsl_dma_test()
7158 usc_OutDmaReg( info, NRARL, (unsigned short)phys_addr ); in mgsl_dma_test()
7159 usc_OutDmaReg( info, NRARU, (unsigned short)(phys_addr >> 16) ); in mgsl_dma_test()
7162 usc_InDmaReg( info, RDMR ); in mgsl_dma_test()
7163 usc_DmaCmd( info, DmaCmd_InitRxChannel ); in mgsl_dma_test()
7166 usc_OutReg( info, RMR, (unsigned short)((usc_InReg(info, RMR) & 0xfffc) | 0x0002) ); in mgsl_dma_test()
7168 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7184 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7185 status = usc_InDmaReg( info, RDMR ); in mgsl_dma_test()
7186 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7201 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7206 usc_OutReg( info, TCLR, (unsigned short)info->tx_buffer_list[0].count ); in mgsl_dma_test()
7207 usc_RTCmd( info, RTCmd_PurgeTxFifo ); in mgsl_dma_test()
7211 phys_addr = info->tx_buffer_list[0].phys_entry; in mgsl_dma_test()
7212 usc_OutDmaReg( info, NTARL, (unsigned short)phys_addr ); in mgsl_dma_test()
7213 usc_OutDmaReg( info, NTARU, (unsigned short)(phys_addr >> 16) ); in mgsl_dma_test()
7217 usc_OutReg( info, TCSR, (unsigned short)(( usc_InReg(info, TCSR) & 0x0f00) | 0xfa) ); in mgsl_dma_test()
7218 usc_DmaCmd( info, DmaCmd_InitTxChannel ); in mgsl_dma_test()
7222 usc_TCmd( info, TCmd_SelectTicrTxFifostatus ); in mgsl_dma_test()
7224 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7240 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7241 FifoLevel = usc_InReg(info, TICR) >> 8; in mgsl_dma_test()
7242 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7260 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7263 usc_TCmd( info, TCmd_SendFrame ); in mgsl_dma_test()
7264 usc_OutReg( info, TMR, (unsigned short)((usc_InReg(info, TMR) & 0xfffc) | 0x0002) ); in mgsl_dma_test()
7266 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7278 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7279 status = usc_InReg( info, TCSR ); in mgsl_dma_test()
7280 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7288 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7289 status = usc_InReg( info, TCSR ); in mgsl_dma_test()
7290 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7308 status=info->rx_buffer_list[0].status; in mgsl_dma_test()
7314 status=info->rx_buffer_list[0].status; in mgsl_dma_test()
7321 status = info->rx_buffer_list[0].status; in mgsl_dma_test()
7327 if ( memcmp( info->tx_buffer_list[0].virt_addr , in mgsl_dma_test()
7328 info->rx_buffer_list[0].virt_addr, FrameSize ) ){ in mgsl_dma_test()
7334 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_dma_test()
7335 usc_reset( info ); in mgsl_dma_test()
7336 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_dma_test()
7339 memcpy(&info->params,&tmp_params,sizeof(MGSL_PARAMS)); in mgsl_dma_test()
7352 static int mgsl_adapter_test( struct mgsl_struct *info ) in mgsl_adapter_test() argument
7356 __FILE__,__LINE__,info->device_name ); in mgsl_adapter_test()
7358 if ( !mgsl_register_test( info ) ) { in mgsl_adapter_test()
7359 info->init_error = DiagStatus_AddressFailure; in mgsl_adapter_test()
7361 __FILE__,__LINE__,info->device_name, (unsigned short)(info->io_base) ); in mgsl_adapter_test()
7365 if ( !mgsl_irq_test( info ) ) { in mgsl_adapter_test()
7366 info->init_error = DiagStatus_IrqFailure; in mgsl_adapter_test()
7368 __FILE__,__LINE__,info->device_name, (unsigned short)(info->irq_level) ); in mgsl_adapter_test()
7372 if ( !mgsl_dma_test( info ) ) { in mgsl_adapter_test()
7373 info->init_error = DiagStatus_DmaFailure; in mgsl_adapter_test()
7375 __FILE__,__LINE__,info->device_name, (unsigned short)(info->dma_level) ); in mgsl_adapter_test()
7381 __FILE__,__LINE__,info->device_name ); in mgsl_adapter_test()
7394 static bool mgsl_memory_test( struct mgsl_struct *info ) in mgsl_memory_test() argument
7403 if ( info->bus_type != MGSL_BUS_TYPE_PCI ) in mgsl_memory_test()
7406 TestAddr = (unsigned long *)info->memory_base; in mgsl_memory_test()
7424 TestAddr = (unsigned long *)info->memory_base; in mgsl_memory_test()
7432 memset( info->memory_base, 0, SHARED_MEM_ADDRESS_SIZE ); in mgsl_memory_test()
7497 static void mgsl_trace_block(struct mgsl_struct *info,const char* data, int count, int xmit) in mgsl_trace_block() argument
7502 printk("%s tx data:\n",info->device_name); in mgsl_trace_block()
7504 printk("%s rx data:\n",info->device_name); in mgsl_trace_block()
7539 struct mgsl_struct *info = (struct mgsl_struct*)context; in mgsl_tx_timeout() local
7544 __FILE__,__LINE__,info->device_name); in mgsl_tx_timeout()
7545 if(info->tx_active && in mgsl_tx_timeout()
7546 (info->params.mode == MGSL_MODE_HDLC || in mgsl_tx_timeout()
7547 info->params.mode == MGSL_MODE_RAW) ) { in mgsl_tx_timeout()
7548 info->icount.txtimeout++; in mgsl_tx_timeout()
7550 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_tx_timeout()
7551 info->tx_active = false; in mgsl_tx_timeout()
7552 info->xmit_cnt = info->xmit_head = info->xmit_tail = 0; in mgsl_tx_timeout()
7554 if ( info->params.flags & HDLC_FLAG_HDLC_LOOPMODE ) in mgsl_tx_timeout()
7555 usc_loopmode_cancel_transmit( info ); in mgsl_tx_timeout()
7557 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_tx_timeout()
7560 if (info->netcount) in mgsl_tx_timeout()
7561 hdlcdev_tx_done(info); in mgsl_tx_timeout()
7564 mgsl_bh_transmit(info); in mgsl_tx_timeout()
7572 static int mgsl_loopmode_send_done( struct mgsl_struct * info ) in mgsl_loopmode_send_done() argument
7576 spin_lock_irqsave(&info->irq_spinlock,flags); in mgsl_loopmode_send_done()
7577 if (info->params.flags & HDLC_FLAG_HDLC_LOOPMODE) { in mgsl_loopmode_send_done()
7578 if (info->tx_active) in mgsl_loopmode_send_done()
7579 info->loopmode_send_done_requested = true; in mgsl_loopmode_send_done()
7581 usc_loopmode_send_done(info); in mgsl_loopmode_send_done()
7583 spin_unlock_irqrestore(&info->irq_spinlock,flags); in mgsl_loopmode_send_done()
7591 static void usc_loopmode_send_done( struct mgsl_struct * info ) in usc_loopmode_send_done() argument
7593 info->loopmode_send_done_requested = false; in usc_loopmode_send_done()
7595 info->cmr_value &= ~BIT13; in usc_loopmode_send_done()
7596 usc_OutReg(info, CMR, info->cmr_value); in usc_loopmode_send_done()
7601 static void usc_loopmode_cancel_transmit( struct mgsl_struct * info ) in usc_loopmode_cancel_transmit() argument
7604 usc_RTCmd( info, RTCmd_PurgeTxFifo ); in usc_loopmode_cancel_transmit()
7605 usc_DmaCmd( info, DmaCmd_ResetTxChannel ); in usc_loopmode_cancel_transmit()
7606 usc_loopmode_send_done( info ); in usc_loopmode_cancel_transmit()
7613 static void usc_loopmode_insert_request( struct mgsl_struct * info ) in usc_loopmode_insert_request() argument
7615 info->loopmode_insert_requested = true; in usc_loopmode_insert_request()
7620 usc_OutReg( info, RICR, in usc_loopmode_insert_request()
7621 (usc_InReg( info, RICR ) | RXSTATUS_ABORT_RECEIVED ) ); in usc_loopmode_insert_request()
7624 info->cmr_value |= BIT13; in usc_loopmode_insert_request()
7625 usc_OutReg(info, CMR, info->cmr_value); in usc_loopmode_insert_request()
7630 static int usc_loopmode_active( struct mgsl_struct * info) in usc_loopmode_active() argument
7632 return usc_InReg( info, CCSR ) & BIT7 ? 1 : 0 ; in usc_loopmode_active()
7650 struct mgsl_struct *info = dev_to_port(dev); in hdlcdev_attach() local
7655 if (info->port.count) in hdlcdev_attach()
7676 info->params.encoding = new_encoding; in hdlcdev_attach()
7677 info->params.crc_type = new_crctype; in hdlcdev_attach()
7680 if (info->netcount) in hdlcdev_attach()
7681 mgsl_program_hw(info); in hdlcdev_attach()
7695 struct mgsl_struct *info = dev_to_port(dev); in hdlcdev_xmit() local
7705 info->xmit_cnt = skb->len; in hdlcdev_xmit()
7706 mgsl_load_tx_dma_buffer(info, skb->data, skb->len); in hdlcdev_xmit()
7719 spin_lock_irqsave(&info->irq_spinlock,flags); in hdlcdev_xmit()
7720 if (!info->tx_active) in hdlcdev_xmit()
7721 usc_start_transmitter(info); in hdlcdev_xmit()
7722 spin_unlock_irqrestore(&info->irq_spinlock,flags); in hdlcdev_xmit()
7737 struct mgsl_struct *info = dev_to_port(dev); in hdlcdev_open() local
7750 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_open()
7751 if (info->port.count != 0 || info->netcount != 0) { in hdlcdev_open()
7753 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
7756 info->netcount=1; in hdlcdev_open()
7757 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
7760 if ((rc = startup(info)) != 0) { in hdlcdev_open()
7761 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_open()
7762 info->netcount=0; in hdlcdev_open()
7763 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_open()
7768 info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; in hdlcdev_open()
7769 mgsl_program_hw(info); in hdlcdev_open()
7776 spin_lock_irqsave(&info->irq_spinlock, flags); in hdlcdev_open()
7777 usc_get_serial_signals(info); in hdlcdev_open()
7778 spin_unlock_irqrestore(&info->irq_spinlock, flags); in hdlcdev_open()
7779 if (info->serial_signals & SerialSignal_DCD) in hdlcdev_open()
7796 struct mgsl_struct *info = dev_to_port(dev); in hdlcdev_close() local
7805 shutdown(info); in hdlcdev_close()
7809 spin_lock_irqsave(&info->netlock, flags); in hdlcdev_close()
7810 info->netcount=0; in hdlcdev_close()
7811 spin_unlock_irqrestore(&info->netlock, flags); in hdlcdev_close()
7830 struct mgsl_struct *info = dev_to_port(dev); in hdlcdev_ioctl() local
7837 if (info->port.count) in hdlcdev_ioctl()
7852 flags = info->params.flags & (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL | in hdlcdev_ioctl()
7866 new_line.clock_rate = info->params.clock_speed; in hdlcdev_ioctl()
7867 new_line.loopback = info->params.loopback ? 1:0; in hdlcdev_ioctl()
7886 case CLOCK_DEFAULT: flags = info->params.flags & in hdlcdev_ioctl()
7897 info->params.flags &= ~(HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL | in hdlcdev_ioctl()
7901 info->params.flags |= flags; in hdlcdev_ioctl()
7903 info->params.loopback = new_line.loopback; in hdlcdev_ioctl()
7906 info->params.clock_speed = new_line.clock_rate; in hdlcdev_ioctl()
7908 info->params.clock_speed = 0; in hdlcdev_ioctl()
7911 if (info->netcount) in hdlcdev_ioctl()
7912 mgsl_program_hw(info); in hdlcdev_ioctl()
7927 struct mgsl_struct *info = dev_to_port(dev); in hdlcdev_tx_timeout() local
7936 spin_lock_irqsave(&info->irq_spinlock,flags); in hdlcdev_tx_timeout()
7937 usc_stop_transmitter(info); in hdlcdev_tx_timeout()
7938 spin_unlock_irqrestore(&info->irq_spinlock,flags); in hdlcdev_tx_timeout()
7949 static void hdlcdev_tx_done(struct mgsl_struct *info) in hdlcdev_tx_done() argument
7951 if (netif_queue_stopped(info->netdev)) in hdlcdev_tx_done()
7952 netif_wake_queue(info->netdev); in hdlcdev_tx_done()
7963 static void hdlcdev_rx(struct mgsl_struct *info, char *buf, int size) in hdlcdev_rx() argument
7966 struct net_device *dev = info->netdev; in hdlcdev_rx()
8005 static int hdlcdev_init(struct mgsl_struct *info) in hdlcdev_init() argument
8013 dev = alloc_hdlcdev(info); in hdlcdev_init()
8020 dev->base_addr = info->io_base; in hdlcdev_init()
8021 dev->irq = info->irq_level; in hdlcdev_init()
8022 dev->dma = info->dma_level; in hdlcdev_init()
8042 info->netdev = dev; in hdlcdev_init()
8052 static void hdlcdev_exit(struct mgsl_struct *info) in hdlcdev_exit() argument
8054 unregister_hdlc_device(info->netdev); in hdlcdev_exit()
8055 free_netdev(info->netdev); in hdlcdev_exit()
8056 info->netdev = NULL; in hdlcdev_exit()
8065 struct mgsl_struct *info; in synclink_init_one() local
8072 info = mgsl_allocate_device(); in synclink_init_one()
8073 if (!info) { in synclink_init_one()
8080 info->io_base = pci_resource_start(dev, 2); in synclink_init_one()
8081 info->irq_level = dev->irq; in synclink_init_one()
8082 info->phys_memory_base = pci_resource_start(dev, 3); in synclink_init_one()
8088 info->phys_lcr_base = pci_resource_start(dev, 0); in synclink_init_one()
8089 info->lcr_offset = info->phys_lcr_base & (PAGE_SIZE-1); in synclink_init_one()
8090 info->phys_lcr_base &= ~(PAGE_SIZE-1); in synclink_init_one()
8092 info->bus_type = MGSL_BUS_TYPE_PCI; in synclink_init_one()
8093 info->io_addr_size = 8; in synclink_init_one()
8094 info->irq_flags = IRQF_SHARED; in synclink_init_one()
8098 info->misc_ctrl_value = 0x007c4080; in synclink_init_one()
8099 info->hw_version = 1; in synclink_init_one()
8106 info->misc_ctrl_value = 0x087e4546; in synclink_init_one()
8107 info->hw_version = 0; in synclink_init_one()
8110 mgsl_add_device(info); in synclink_init_one()