Lines Matching defs: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);
897 icom_port->xmit_buf[data_count++] =
905 icom_port->statStg->xmit[0].flags =
907 icom_port->statStg->xmit[0].leLength =
910 (unsigned long) &icom_port->statStg->xmit[0] -
911 (unsigned long) icom_port->statStg;
912 *icom_port->xmitRestart =
913 cpu_to_le32(icom_port->statStg_pci + offset);
914 cmdReg = readb(&icom_port->dram->CmdReg);
916 &icom_port->dram->CmdReg);
917 writeb(START_XMIT, &icom_port->dram->StartXmitCmd);
918 trace(icom_port, "WRITE_START", data_count);
920 readb(&icom_port->dram->StartXmitCmd);
926 static inline void check_modem_status(struct icom_port *icom_port)
932 spin_lock(&icom_port->uart_port.lock);
935 status = readb(&icom_port->dram->isr);
936 trace(icom_port, "CHECK_MODEM", status);
940 icom_port->uart_port.icount.rng++;
942 icom_port->uart_port.icount.dsr++;
944 uart_handle_dcd_change(&icom_port->uart_port,
947 uart_handle_cts_change(&icom_port->uart_port,
950 wake_up_interruptible(&icom_port->uart_port.state->
954 spin_unlock(&icom_port->uart_port.lock);
957 static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
962 trace(icom_port, "XMIT_COMPLETE", 0);
965 icom_port->statStg->xmit[0].flags &=
968 count = le16_to_cpu(icom_port->statStg->xmit[0].leLength);
969 icom_port->uart_port.icount.tx += count;
972 !uart_circ_empty(&icom_port->uart_port.state->xmit); i++) {
974 icom_port->uart_port.state->xmit.tail++;
975 icom_port->uart_port.state->xmit.tail &=
979 if (!icom_write(&icom_port->uart_port))
981 uart_write_wakeup(&icom_port->uart_port);
983 trace(icom_port, "XMIT_DISABLED", 0);
986 static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
989 struct tty_port *port = &icom_port->uart_port.state->port;
995 trace(icom_port, "RCV_COMPLETE", 0);
996 rcv_buff = icom_port->next_rcv;
998 status = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].flags);
1002 trace(icom_port, "FID_STATUS", status);
1003 count = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].leLength);
1005 trace(icom_port, "RCV_COUNT", count);
1007 trace(icom_port, "REAL_COUNT", count);
1009 offset = le32_to_cpu(icom_port->statStg->rcv[rcv_buff].leBuffer) -
1010 icom_port->recv_buf_pci;
1014 first = icom_port->recv_buf[offset];
1015 tty_insert_flip_string(port, icom_port->recv_buf + offset, count - 1);
1018 icount = &icom_port->uart_port.icount;
1026 trace(icom_port, "BREAK_DET", 0);
1049 if (status & icom_port->ignore_status_mask) {
1050 trace(icom_port, "IGNORE_CHAR", 0);
1054 status &= icom_port->read_status_mask;
1059 trace(icom_port, "PARITY_ERROR", 0);
1066 tty_insert_flip_char(port, *(icom_port->recv_buf + offset + count - 1), flag);
1076 icom_port->statStg->rcv[rcv_buff].flags = 0;
1077 icom_port->statStg->rcv[rcv_buff].leLength = 0;
1078 icom_port->statStg->rcv[rcv_buff].WorkingLength =
1085 status = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].flags);
1087 icom_port->next_rcv = rcv_buff;
1093 struct icom_port *icom_port)
1096 spin_lock(&icom_port->uart_port.lock);
1097 trace(icom_port, "INTERRUPT", port_int_reg);
1100 xmit_interrupt(port_int_reg, icom_port);
1103 recv_interrupt(port_int_reg, icom_port);
1105 spin_unlock(&icom_port->uart_port.lock);
1114 struct icom_port *icom_port;
1116 /* find icom_port for this interrupt */
1126 icom_port = &icom_adapter->port_info[2];
1128 process_interrupt(port_int_reg, icom_port);
1129 check_modem_status(icom_port);
1133 icom_port = &icom_adapter->port_info[3];
1134 if (icom_port->status == ICOM_PORT_ACTIVE) {
1137 process_interrupt(port_int_reg, icom_port);
1138 check_modem_status(icom_port);
1154 icom_port = &icom_adapter->port_info[0];
1156 process_interrupt(port_int_reg, icom_port);
1157 check_modem_status(icom_port);
1161 icom_port = &icom_adapter->port_info[1];
1162 if (icom_port->status == ICOM_PORT_ACTIVE) {
1164 process_interrupt(port_int_reg, icom_port);
1165 check_modem_status(icom_port);
1185 struct icom_port *icom_port = to_icom_port(port);
1190 if (le16_to_cpu(icom_port->statStg->xmit[0].flags) &
1202 struct icom_port *icom_port = to_icom_port(port);
1205 trace(icom_port, "SET_MODEM", 0);
1206 local_osr = readb(&icom_port->dram->osr);
1209 trace(icom_port, "RAISE_RTS", 0);
1212 trace(icom_port, "LOWER_RTS", 0);
1217 trace(icom_port, "RAISE_DTR", 0);
1220 trace(icom_port, "LOWER_DTR", 0);
1224 writeb(local_osr, &icom_port->dram->osr);
1229 struct icom_port *icom_port = to_icom_port(port);
1233 trace(icom_port, "GET_MODEM", 0);
1235 status = readb(&icom_port->dram->isr);
1246 struct icom_port *icom_port = to_icom_port(port);
1249 trace(icom_port, "STOP", 0);
1250 cmdReg = readb(&icom_port->dram->CmdReg);
1251 writeb(cmdReg | CMD_HOLD_XMIT, &icom_port->dram->CmdReg);
1256 struct icom_port *icom_port = to_icom_port(port);
1259 trace(icom_port, "START", 0);
1260 cmdReg = readb(&icom_port->dram->CmdReg);
1263 &icom_port->dram->CmdReg);
1270 struct icom_port *icom_port = to_icom_port(port);
1275 trace(icom_port, "SEND_XCHAR", ch);
1280 xdata = readb(&icom_port->dram->xchar);
1282 trace(icom_port, "QUICK_WRITE", 0);
1283 writeb(ch, &icom_port->dram->xchar);
1286 xdata = readb(&icom_port->dram->xchar);
1297 struct icom_port *icom_port = to_icom_port(port);
1300 cmdReg = readb(&icom_port->dram->CmdReg);
1301 writeb(cmdReg & ~CMD_RCV_ENABLE, &icom_port->dram->CmdReg);
1306 struct icom_port *icom_port = to_icom_port(port);
1311 trace(icom_port, "BREAK", 0);
1312 cmdReg = readb(&icom_port->dram->CmdReg);
1314 writeb(cmdReg | CMD_SND_BREAK, &icom_port->dram->CmdReg);
1316 writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
1323 struct icom_port *icom_port = to_icom_port(port);
1326 kref_get(&icom_port->adapter->kref);
1327 retval = startup(icom_port);
1330 kref_put(&icom_port->adapter->kref, icom_kref_release);
1331 trace(icom_port, "STARTUP_ERROR", 0);
1340 struct icom_port *icom_port = to_icom_port(port);
1343 trace(icom_port, "CLOSE", 0);
1346 cmdReg = readb(&icom_port->dram->CmdReg);
1347 writeb(cmdReg & ~CMD_RCV_ENABLE, &icom_port->dram->CmdReg);
1349 shutdown(icom_port);
1351 kref_put(&icom_port->adapter->kref, icom_kref_release);
1357 struct icom_port *icom_port = to_icom_port(port);
1369 trace(icom_port, "CHANGE_SPEED", 0);
1400 trace(icom_port, "PARENB", 0);
1405 trace(icom_port, "PARODD", 0);
1425 tmp_byte = readb(&(icom_port->dram->HDLCConfigReg));
1430 writeb(tmp_byte, &(icom_port->dram->HDLCConfigReg));
1435 icom_port->read_status_mask = SA_FLAGS_OVERRUN | SA_FL_RCV_DONE;
1437 icom_port->read_status_mask |=
1441 icom_port->read_status_mask |= SA_FLAGS_BREAK_DET;
1446 icom_port->ignore_status_mask = 0;
1448 icom_port->ignore_status_mask |=
1451 icom_port->ignore_status_mask |= SA_FLAGS_BREAK_DET;
1457 icom_port->ignore_status_mask |= SA_FLAGS_OVERRUN;
1464 icom_port->ignore_status_mask |= SA_FL_RCV_DONE;
1467 writeb(CMD_RCV_DISABLE, &icom_port->dram->CmdReg);
1470 if (readb(&icom_port->dram->PrevCmdReg) == 0x00) {
1477 icom_port->statStg->rcv[rcv_buff].flags = 0;
1478 icom_port->statStg->rcv[rcv_buff].leLength = 0;
1479 icom_port->statStg->rcv[rcv_buff].WorkingLength =
1484 icom_port->statStg->xmit[xmit_buff].flags = 0;
1489 writeb(new_config3, &(icom_port->dram->async_config3));
1490 writeb(new_config2, &(icom_port->dram->async_config2));
1491 tmp_byte = readb(&(icom_port->dram->HDLCConfigReg));
1493 writeb(tmp_byte, &(icom_port->dram->HDLCConfigReg));
1494 writeb(0x04, &(icom_port->dram->FlagFillIdleTimer)); /* 0.5 seconds */
1495 writeb(0xFF, &(icom_port->dram->ier)); /* enable modem signal interrupts */
1498 writeb(CMD_RESTART, &icom_port->dram->CmdReg);
1501 if (readb(&icom_port->dram->CmdReg) == 0x00) {
1508 (unsigned long) &icom_port->statStg->rcv[0] -
1509 (unsigned long) icom_port->statStg;
1510 writel(icom_port->statStg_pci + offset,
1511 &icom_port->dram->RcvStatusAddr);
1512 icom_port->next_rcv = 0;
1513 *icom_port->xmitRestart = 0;
1514 writel(icom_port->xmitRestart_pci,
1515 &icom_port->dram->XmitStatusAddr);
1516 trace(icom_port, "XR_ENAB", 0);
1517 writeb(CMD_XMIT_RCV_ENABLE, &icom_port->dram->CmdReg);
1564 struct icom_port *icom_port;
1570 icom_port = &icom_adapter->port_info[i];
1571 icom_port->port = i;
1572 icom_port->status = ICOM_PORT_ACTIVE;
1579 icom_port = &icom_adapter->port_info[i];
1581 icom_port->port = i;
1582 icom_port->status = ICOM_PORT_ACTIVE;
1599 static void icom_port_active(struct icom_port *icom_port, struct icom_adapter *icom_adapter, int port_num)
1602 icom_port->global_reg = icom_adapter->base_addr + 0x4000;
1603 icom_port->int_reg = icom_adapter->base_addr +
1606 icom_port->global_reg = icom_adapter->base_addr + 0x8000;
1607 if (icom_port->port < 2)
1608 icom_port->int_reg = icom_adapter->base_addr +
1609 0x8004 + 2 - 2 * icom_port->port;
1611 icom_port->int_reg = icom_adapter->base_addr +
1612 0x8024 + 2 - 2 * (icom_port->port - 2);
1617 struct icom_port *icom_port;
1622 icom_port = &icom_adapter->port_info[port_num];
1624 if (icom_port->status == ICOM_PORT_ACTIVE) {
1625 icom_port_active(icom_port, icom_adapter, port_num);
1626 icom_port->dram = icom_adapter->base_addr +
1627 0x2000 * icom_port->port;
1629 icom_port->adapter = icom_adapter;
1632 if (get_port_memory(icom_port) != 0) {
1633 dev_err(&icom_port->adapter->pci_dev->dev,
1680 struct icom_port *icom_port;
1684 icom_port = &icom_adapter->port_info[index];
1686 if (icom_port->status == ICOM_PORT_ACTIVE) {
1691 &icom_port->uart_port);
1694 writeb(0x00, &icom_port->dram->osr);
1700 stop_processor(icom_port);
1702 free_port_memory(icom_port);
1719 struct icom_port *icom_port;
1789 icom_port = &icom_adapter->port_info[index];
1791 if (icom_port->status == ICOM_PORT_ACTIVE) {
1792 icom_port->uart_port.irq = icom_port->adapter->pci_dev->irq;
1793 icom_port->uart_port.type = PORT_ICOM;
1794 icom_port->uart_port.iotype = UPIO_MEM;
1795 icom_port->uart_port.membase =
1797 icom_port->uart_port.fifosize = 16;
1798 icom_port->uart_port.ops = &icom_ops;
1799 icom_port->uart_port.line =
1800 icom_port->port + icom_adapter->index * 4;
1801 if (uart_add_one_port (&icom_uart_driver, &icom_port->uart_port)) {
1802 icom_port->status = ICOM_PORT_OFF;