Lines Matching refs:icom_port

253 struct icom_port {
281 struct icom_port port_info[4];
308 static inline struct icom_port *to_icom_port(struct uart_port *port)
310 return container_of(port, struct icom_port, uart_port);
383 static inline void trace(struct icom_port *icom_port, char *trace_pt,
386 dev_info(&icom_port->adapter->pci_dev->dev, ":%d:%s - %lx\n",
387 icom_port->port, trace_pt, trace_data);
390 static inline void trace(struct icom_port *icom_port, char *trace_pt, unsigned long trace_data) {};
394 static void free_port_memory(struct icom_port *icom_port)
396 struct pci_dev *dev = icom_port->adapter->pci_dev;
398 trace(icom_port, "RET_PORT_MEM", 0);
399 if (icom_port->recv_buf) {
400 dma_free_coherent(&dev->dev, 4096, icom_port->recv_buf,
401 icom_port->recv_buf_pci);
402 icom_port->recv_buf = NULL;
404 if (icom_port->xmit_buf) {
405 dma_free_coherent(&dev->dev, 4096, icom_port->xmit_buf,
406 icom_port->xmit_buf_pci);
407 icom_port->xmit_buf = NULL;
409 if (icom_port->statStg) {
410 dma_free_coherent(&dev->dev, 4096, icom_port->statStg,
411 icom_port->statStg_pci);
412 icom_port->statStg = NULL;
415 if (icom_port->xmitRestart) {
416 dma_free_coherent(&dev->dev, 4096, icom_port->xmitRestart,
417 icom_port->xmitRestart_pci);
418 icom_port->xmitRestart = NULL;
422 static int get_port_memory(struct icom_port *icom_port)
428 struct pci_dev *dev = icom_port->adapter->pci_dev;
430 icom_port->xmit_buf =
431 dma_alloc_coherent(&dev->dev, 4096, &icom_port->xmit_buf_pci,
433 if (!icom_port->xmit_buf) {
438 trace(icom_port, "GET_PORT_MEM",
439 (unsigned long) icom_port->xmit_buf);
441 icom_port->recv_buf =
442 dma_alloc_coherent(&dev->dev, 4096, &icom_port->recv_buf_pci,
444 if (!icom_port->recv_buf) {
446 free_port_memory(icom_port);
449 trace(icom_port, "GET_PORT_MEM",
450 (unsigned long) icom_port->recv_buf);
452 icom_port->statStg =
453 dma_alloc_coherent(&dev->dev, 4096, &icom_port->statStg_pci,
455 if (!icom_port->statStg) {
457 free_port_memory(icom_port);
460 trace(icom_port, "GET_PORT_MEM",
461 (unsigned long) icom_port->statStg);
463 icom_port->xmitRestart =
464 dma_alloc_coherent(&dev->dev, 4096, &icom_port->xmitRestart_pci,
466 if (!icom_port->xmitRestart) {
469 free_port_memory(icom_port);
477 stgAddr = (unsigned long) icom_port->statStg;
479 trace(icom_port, "FOD_ADDR", stgAddr);
480 stgAddr = stgAddr + sizeof(icom_port->statStg->xmit[0]);
482 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
483 icom_port->statStg->xmit[index].leLengthASD =
485 trace(icom_port, "FOD_ADDR", stgAddr);
486 trace(icom_port, "FOD_XBUFF",
487 (unsigned long) icom_port->xmit_buf);
488 icom_port->statStg->xmit[index].leBuffer =
489 cpu_to_le32(icom_port->xmit_buf_pci);
491 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
492 icom_port->statStg->xmit[index].leLengthASD =
494 trace(icom_port, "FOD_XBUFF",
495 (unsigned long) icom_port->xmit_buf);
496 icom_port->statStg->xmit[index].leBuffer =
497 cpu_to_le32(icom_port->xmit_buf_pci);
499 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
507 trace(icom_port, "FID_ADDR", stgAddr);
508 stgAddr = stgAddr + sizeof(icom_port->statStg->rcv[0]);
509 icom_port->statStg->rcv[index].leLength = 0;
510 icom_port->statStg->rcv[index].WorkingLength =
513 offset = stgAddr - (unsigned long) icom_port->statStg;
514 icom_port->statStg->rcv[index].leNext =
515 cpu_to_le32(icom_port-> statStg_pci + offset);
516 trace(icom_port, "FID_RBUFF",
517 (unsigned long) icom_port->recv_buf);
518 icom_port->statStg->rcv[index].leBuffer =
519 cpu_to_le32(icom_port->recv_buf_pci);
521 offset = startStgAddr - (unsigned long) icom_port->statStg;
522 icom_port->statStg->rcv[index].leNext =
523 cpu_to_le32(icom_port-> statStg_pci + offset);
524 trace(icom_port, "FID_RBUFF",
525 (unsigned long) icom_port->recv_buf + 2048);
526 icom_port->statStg->rcv[index].leBuffer =
527 cpu_to_le32(icom_port->recv_buf_pci + 2048);
529 icom_port->statStg->rcv[index].leNext = 0;
530 icom_port->statStg->rcv[index].leBuffer = 0;
537 static void stop_processor(struct icom_port *icom_port)
545 port = icom_port->port;
547 dev_err(&icom_port->adapter->pci_dev->dev,
553 stop_proc[port].global_control_reg = &icom_port->global_reg->control;
555 stop_proc[port].global_control_reg = &icom_port->global_reg->control_2;
568 static void start_processor(struct icom_port *icom_port)
576 port = icom_port->port;
578 dev_err(&icom_port->adapter->pci_dev->dev,
584 start_proc[port].global_control_reg = &icom_port->global_reg->control;
586 start_proc[port].global_control_reg = &icom_port->global_reg->control_2;
599 static void load_code(struct icom_port *icom_port)
605 void __iomem *dram_ptr = icom_port->dram;
609 struct pci_dev *dev = icom_port->adapter->pci_dev;
612 writew(0x3FFF, icom_port->int_reg);
614 trace(icom_port, "CLEAR_INTERRUPTS", 0);
617 stop_processor(icom_port);
636 iram_ptr = (char __iomem *)icom_port->dram + ICOM_IRAM_OFFSET;
656 iram_ptr = (char __iomem *) icom_port->dram + ICOM_IRAM_OFFSET;
663 if (icom_port->adapter->version == ADAPTER_V2)
664 writeb(V2_HARDWARE, &(icom_port->dram->misc_flags));
667 start_processor(icom_port);
670 &(icom_port->dram->HDLCConfigReg));
671 writeb(0x04, &(icom_port->dram->FlagFillIdleTimer)); /* 0.5 seconds */
672 writeb(0x00, &(icom_port->dram->CmdReg));
673 writeb(0x10, &(icom_port->dram->async_config3));
675 ICOM_ACFG_1STOP_BIT), &(icom_port->dram->async_config2));
704 writeb((char) ((fw->size + 16)/16), &icom_port->dram->mac_length);
705 writel(temp_pci, &icom_port->dram->mac_load_addr);
718 writeb(START_DOWNLOAD, &icom_port->dram->sync);
723 if (readb(&icom_port->dram->misc_flags) & ICOM_HDW_ACTIVE)
733 cable_id = readb(&icom_port->dram->cable_id);
738 icom_port->cable_id = cable_id;
741 icom_port->cable_id = NO_CABLE;
748 writew(0x3FFF, icom_port->int_reg);
751 writeb(ICOM_DISABLE, &(icom_port->dram->disable));
754 stop_processor(icom_port);
756 dev_err(&icom_port->adapter->pci_dev->dev,"Port not operational\n");
763 static int startup(struct icom_port *icom_port)
770 trace(icom_port, "STARTUP", 0);
772 if (!icom_port->dram) {
774 dev_err(&icom_port->adapter->pci_dev->dev,
782 raw_cable_id = readb(&icom_port->dram->cable_id);
783 trace(icom_port, "CABLE_ID", raw_cable_id);
790 (cable_id != icom_port->cable_id)) {
793 load_code(icom_port);
796 raw_cable_id = readb(&icom_port->dram->cable_id);
799 (icom_port->cable_id == NO_CABLE))
807 port = icom_port->port;
809 dev_err(&icom_port->adapter->pci_dev->dev,
815 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask;
817 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask_2;
820 writew(0x00FF, icom_port->int_reg);
822 writew(0x3F00, icom_port->int_reg);
835 static void shutdown(struct icom_port *icom_port)
843 trace(icom_port, "SHUTDOWN", 0);
848 port = icom_port->port;
850 dev_err(&icom_port->adapter->pci_dev->dev,
855 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask;
857 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask_2;
871 cmdReg = readb(&icom_port->dram->CmdReg);
873 writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
879 struct icom_port *icom_port = to_icom_port(port);
885 trace(icom_port, "WRITE", 0);
887 if (le16_to_cpu(icom_port->statStg->xmit[0].flags) &
889 trace(icom_port, "WRITE_FULL", 0);
893 data_count = kfifo_out_peek(&tport->xmit_fifo, icom_port->xmit_buf,
897 icom_port->statStg->xmit[0].flags =
899 icom_port->statStg->xmit[0].leLength =
902 (unsigned long) &icom_port->statStg->xmit[0] -
903 (unsigned long) icom_port->statStg;
904 *icom_port->xmitRestart =
905 cpu_to_le32(icom_port->statStg_pci + offset);
906 cmdReg = readb(&icom_port->dram->CmdReg);
908 &icom_port->dram->CmdReg);
909 writeb(START_XMIT, &icom_port->dram->StartXmitCmd);
910 trace(icom_port, "WRITE_START", data_count);
912 readb(&icom_port->dram->StartXmitCmd);
918 static inline void check_modem_status(struct icom_port *icom_port)
924 uart_port_lock(&icom_port->uart_port);
927 status = readb(&icom_port->dram->isr);
928 trace(icom_port, "CHECK_MODEM", status);
932 icom_port->uart_port.icount.rng++;
934 icom_port->uart_port.icount.dsr++;
936 uart_handle_dcd_change(&icom_port->uart_port,
939 uart_handle_cts_change(&icom_port->uart_port,
942 wake_up_interruptible(&icom_port->uart_port.state->
946 uart_port_unlock(&icom_port->uart_port);
949 static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
951 struct tty_port *tport = &icom_port->uart_port.state->port;
955 trace(icom_port, "XMIT_COMPLETE", 0);
958 icom_port->statStg->xmit[0].flags &=
961 count = le16_to_cpu(icom_port->statStg->xmit[0].leLength);
962 icom_port->uart_port.icount.tx += count;
966 if (!icom_write(&icom_port->uart_port))
968 uart_write_wakeup(&icom_port->uart_port);
970 trace(icom_port, "XMIT_DISABLED", 0);
973 static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
976 struct tty_port *port = &icom_port->uart_port.state->port;
982 trace(icom_port, "RCV_COMPLETE", 0);
983 rcv_buff = icom_port->next_rcv;
985 status = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].flags);
989 trace(icom_port, "FID_STATUS", status);
990 count = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].leLength);
992 trace(icom_port, "RCV_COUNT", count);
994 trace(icom_port, "REAL_COUNT", count);
996 offset = le32_to_cpu(icom_port->statStg->rcv[rcv_buff].leBuffer) -
997 icom_port->recv_buf_pci;
1001 first = icom_port->recv_buf[offset];
1002 tty_insert_flip_string(port, icom_port->recv_buf + offset, count - 1);
1005 icount = &icom_port->uart_port.icount;
1013 trace(icom_port, "BREAK_DET", 0);
1036 if (status & icom_port->ignore_status_mask) {
1037 trace(icom_port, "IGNORE_CHAR", 0);
1041 status &= icom_port->read_status_mask;
1046 trace(icom_port, "PARITY_ERROR", 0);
1053 tty_insert_flip_char(port, *(icom_port->recv_buf + offset + count - 1), flag);
1063 icom_port->statStg->rcv[rcv_buff].flags = 0;
1064 icom_port->statStg->rcv[rcv_buff].leLength = 0;
1065 icom_port->statStg->rcv[rcv_buff].WorkingLength =
1072 status = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].flags);
1074 icom_port->next_rcv = rcv_buff;
1080 struct icom_port *icom_port)
1083 uart_port_lock(&icom_port->uart_port);
1084 trace(icom_port, "INTERRUPT", port_int_reg);
1087 xmit_interrupt(port_int_reg, icom_port);
1090 recv_interrupt(port_int_reg, icom_port);
1092 uart_port_unlock(&icom_port->uart_port);
1101 struct icom_port *icom_port;
1103 /* find icom_port for this interrupt */
1113 icom_port = &icom_adapter->port_info[2];
1115 process_interrupt(port_int_reg, icom_port);
1116 check_modem_status(icom_port);
1120 icom_port = &icom_adapter->port_info[3];
1121 if (icom_port->status == ICOM_PORT_ACTIVE) {
1124 process_interrupt(port_int_reg, icom_port);
1125 check_modem_status(icom_port);
1141 icom_port = &icom_adapter->port_info[0];
1143 process_interrupt(port_int_reg, icom_port);
1144 check_modem_status(icom_port);
1148 icom_port = &icom_adapter->port_info[1];
1149 if (icom_port->status == ICOM_PORT_ACTIVE) {
1151 process_interrupt(port_int_reg, icom_port);
1152 check_modem_status(icom_port);
1172 struct icom_port *icom_port = to_icom_port(port);
1177 if (le16_to_cpu(icom_port->statStg->xmit[0].flags) &
1189 struct icom_port *icom_port = to_icom_port(port);
1192 trace(icom_port, "SET_MODEM", 0);
1193 local_osr = readb(&icom_port->dram->osr);
1196 trace(icom_port, "RAISE_RTS", 0);
1199 trace(icom_port, "LOWER_RTS", 0);
1204 trace(icom_port, "RAISE_DTR", 0);
1207 trace(icom_port, "LOWER_DTR", 0);
1211 writeb(local_osr, &icom_port->dram->osr);
1216 struct icom_port *icom_port = to_icom_port(port);
1220 trace(icom_port, "GET_MODEM", 0);
1222 status = readb(&icom_port->dram->isr);
1233 struct icom_port *icom_port = to_icom_port(port);
1236 trace(icom_port, "STOP", 0);
1237 cmdReg = readb(&icom_port->dram->CmdReg);
1238 writeb(cmdReg | CMD_HOLD_XMIT, &icom_port->dram->CmdReg);
1243 struct icom_port *icom_port = to_icom_port(port);
1246 trace(icom_port, "START", 0);
1247 cmdReg = readb(&icom_port->dram->CmdReg);
1250 &icom_port->dram->CmdReg);
1257 struct icom_port *icom_port = to_icom_port(port);
1262 trace(icom_port, "SEND_XCHAR", ch);
1267 xdata = readb(&icom_port->dram->xchar);
1269 trace(icom_port, "QUICK_WRITE", 0);
1270 writeb(ch, &icom_port->dram->xchar);
1273 xdata = readb(&icom_port->dram->xchar);
1284 struct icom_port *icom_port = to_icom_port(port);
1287 cmdReg = readb(&icom_port->dram->CmdReg);
1288 writeb(cmdReg & ~CMD_RCV_ENABLE, &icom_port->dram->CmdReg);
1293 struct icom_port *icom_port = to_icom_port(port);
1298 trace(icom_port, "BREAK", 0);
1299 cmdReg = readb(&icom_port->dram->CmdReg);
1301 writeb(cmdReg | CMD_SND_BREAK, &icom_port->dram->CmdReg);
1303 writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
1310 struct icom_port *icom_port = to_icom_port(port);
1313 kref_get(&icom_port->adapter->kref);
1314 retval = startup(icom_port);
1317 kref_put(&icom_port->adapter->kref, icom_kref_release);
1318 trace(icom_port, "STARTUP_ERROR", 0);
1327 struct icom_port *icom_port = to_icom_port(port);
1330 trace(icom_port, "CLOSE", 0);
1333 cmdReg = readb(&icom_port->dram->CmdReg);
1334 writeb(cmdReg & ~CMD_RCV_ENABLE, &icom_port->dram->CmdReg);
1336 shutdown(icom_port);
1338 kref_put(&icom_port->adapter->kref, icom_kref_release);
1344 struct icom_port *icom_port = to_icom_port(port);
1356 trace(icom_port, "CHANGE_SPEED", 0);
1387 trace(icom_port, "PARENB", 0);
1392 trace(icom_port, "PARODD", 0);
1412 tmp_byte = readb(&(icom_port->dram->HDLCConfigReg));
1417 writeb(tmp_byte, &(icom_port->dram->HDLCConfigReg));
1422 icom_port->read_status_mask = SA_FLAGS_OVERRUN | SA_FL_RCV_DONE;
1424 icom_port->read_status_mask |=
1428 icom_port->read_status_mask |= SA_FLAGS_BREAK_DET;
1433 icom_port->ignore_status_mask = 0;
1435 icom_port->ignore_status_mask |=
1438 icom_port->ignore_status_mask |= SA_FLAGS_BREAK_DET;
1444 icom_port->ignore_status_mask |= SA_FLAGS_OVERRUN;
1451 icom_port->ignore_status_mask |= SA_FL_RCV_DONE;
1454 writeb(CMD_RCV_DISABLE, &icom_port->dram->CmdReg);
1457 if (readb(&icom_port->dram->PrevCmdReg) == 0x00) {
1464 icom_port->statStg->rcv[rcv_buff].flags = 0;
1465 icom_port->statStg->rcv[rcv_buff].leLength = 0;
1466 icom_port->statStg->rcv[rcv_buff].WorkingLength =
1471 icom_port->statStg->xmit[xmit_buff].flags = 0;
1476 writeb(new_config3, &(icom_port->dram->async_config3));
1477 writeb(new_config2, &(icom_port->dram->async_config2));
1478 tmp_byte = readb(&(icom_port->dram->HDLCConfigReg));
1480 writeb(tmp_byte, &(icom_port->dram->HDLCConfigReg));
1481 writeb(0x04, &(icom_port->dram->FlagFillIdleTimer)); /* 0.5 seconds */
1482 writeb(0xFF, &(icom_port->dram->ier)); /* enable modem signal interrupts */
1485 writeb(CMD_RESTART, &icom_port->dram->CmdReg);
1488 if (readb(&icom_port->dram->CmdReg) == 0x00) {
1495 (unsigned long) &icom_port->statStg->rcv[0] -
1496 (unsigned long) icom_port->statStg;
1497 writel(icom_port->statStg_pci + offset,
1498 &icom_port->dram->RcvStatusAddr);
1499 icom_port->next_rcv = 0;
1500 *icom_port->xmitRestart = 0;
1501 writel(icom_port->xmitRestart_pci,
1502 &icom_port->dram->XmitStatusAddr);
1503 trace(icom_port, "XR_ENAB", 0);
1504 writeb(CMD_XMIT_RCV_ENABLE, &icom_port->dram->CmdReg);
1551 struct icom_port *icom_port;
1557 icom_port = &icom_adapter->port_info[i];
1558 icom_port->port = i;
1559 icom_port->status = ICOM_PORT_ACTIVE;
1566 icom_port = &icom_adapter->port_info[i];
1568 icom_port->port = i;
1569 icom_port->status = ICOM_PORT_ACTIVE;
1586 static void icom_port_active(struct icom_port *icom_port, struct icom_adapter *icom_adapter, int port_num)
1589 icom_port->global_reg = icom_adapter->base_addr + 0x4000;
1590 icom_port->int_reg = icom_adapter->base_addr +
1593 icom_port->global_reg = icom_adapter->base_addr + 0x8000;
1594 if (icom_port->port < 2)
1595 icom_port->int_reg = icom_adapter->base_addr +
1596 0x8004 + 2 - 2 * icom_port->port;
1598 icom_port->int_reg = icom_adapter->base_addr +
1599 0x8024 + 2 - 2 * (icom_port->port - 2);
1604 struct icom_port *icom_port;
1609 icom_port = &icom_adapter->port_info[port_num];
1611 if (icom_port->status == ICOM_PORT_ACTIVE) {
1612 icom_port_active(icom_port, icom_adapter, port_num);
1613 icom_port->dram = icom_adapter->base_addr +
1614 0x2000 * icom_port->port;
1616 icom_port->adapter = icom_adapter;
1619 if (get_port_memory(icom_port) != 0) {
1620 dev_err(&icom_port->adapter->pci_dev->dev,
1667 struct icom_port *icom_port;
1671 icom_port = &icom_adapter->port_info[index];
1673 if (icom_port->status == ICOM_PORT_ACTIVE) {
1678 &icom_port->uart_port);
1681 writeb(0x00, &icom_port->dram->osr);
1687 stop_processor(icom_port);
1689 free_port_memory(icom_port);
1706 struct icom_port *icom_port;
1776 icom_port = &icom_adapter->port_info[index];
1778 if (icom_port->status == ICOM_PORT_ACTIVE) {
1779 icom_port->uart_port.irq = icom_port->adapter->pci_dev->irq;
1780 icom_port->uart_port.type = PORT_ICOM;
1781 icom_port->uart_port.iotype = UPIO_MEM;
1782 icom_port->uart_port.membase =
1784 icom_port->uart_port.fifosize = 16;
1785 icom_port->uart_port.ops = &icom_ops;
1786 icom_port->uart_port.line =
1787 icom_port->port + icom_adapter->index * 4;
1788 if (uart_add_one_port (&icom_uart_driver, &icom_port->uart_port)) {
1789 icom_port->status = ICOM_PORT_OFF;