Lines Matching defs:icom_port

51 #define ICOM_PORT ((struct icom_port *)port)
124 static inline void trace(struct icom_port *icom_port, char *trace_pt,
127 dev_info(&icom_port->adapter->pci_dev->dev, ":%d:%s - %lx\n",
128 icom_port->port, trace_pt, trace_data);
131 static inline void trace(struct icom_port *icom_port, char *trace_pt, unsigned long trace_data) {};
135 static void free_port_memory(struct icom_port *icom_port)
137 struct pci_dev *dev = icom_port->adapter->pci_dev;
139 trace(icom_port, "RET_PORT_MEM", 0);
140 if (icom_port->recv_buf) {
141 dma_free_coherent(&dev->dev, 4096, icom_port->recv_buf,
142 icom_port->recv_buf_pci);
143 icom_port->recv_buf = NULL;
145 if (icom_port->xmit_buf) {
146 dma_free_coherent(&dev->dev, 4096, icom_port->xmit_buf,
147 icom_port->xmit_buf_pci);
148 icom_port->xmit_buf = NULL;
150 if (icom_port->statStg) {
151 dma_free_coherent(&dev->dev, 4096, icom_port->statStg,
152 icom_port->statStg_pci);
153 icom_port->statStg = NULL;
156 if (icom_port->xmitRestart) {
157 dma_free_coherent(&dev->dev, 4096, icom_port->xmitRestart,
158 icom_port->xmitRestart_pci);
159 icom_port->xmitRestart = NULL;
163 static int get_port_memory(struct icom_port *icom_port)
169 struct pci_dev *dev = icom_port->adapter->pci_dev;
171 icom_port->xmit_buf =
172 dma_alloc_coherent(&dev->dev, 4096, &icom_port->xmit_buf_pci,
174 if (!icom_port->xmit_buf) {
179 trace(icom_port, "GET_PORT_MEM",
180 (unsigned long) icom_port->xmit_buf);
182 icom_port->recv_buf =
183 dma_alloc_coherent(&dev->dev, 4096, &icom_port->recv_buf_pci,
185 if (!icom_port->recv_buf) {
187 free_port_memory(icom_port);
190 trace(icom_port, "GET_PORT_MEM",
191 (unsigned long) icom_port->recv_buf);
193 icom_port->statStg =
194 dma_alloc_coherent(&dev->dev, 4096, &icom_port->statStg_pci,
196 if (!icom_port->statStg) {
198 free_port_memory(icom_port);
201 trace(icom_port, "GET_PORT_MEM",
202 (unsigned long) icom_port->statStg);
204 icom_port->xmitRestart =
205 dma_alloc_coherent(&dev->dev, 4096, &icom_port->xmitRestart_pci,
207 if (!icom_port->xmitRestart) {
210 free_port_memory(icom_port);
218 stgAddr = (unsigned long) icom_port->statStg;
220 trace(icom_port, "FOD_ADDR", stgAddr);
221 stgAddr = stgAddr + sizeof(icom_port->statStg->xmit[0]);
223 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
224 icom_port->statStg->xmit[index].leLengthASD =
226 trace(icom_port, "FOD_ADDR", stgAddr);
227 trace(icom_port, "FOD_XBUFF",
228 (unsigned long) icom_port->xmit_buf);
229 icom_port->statStg->xmit[index].leBuffer =
230 cpu_to_le32(icom_port->xmit_buf_pci);
232 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
233 icom_port->statStg->xmit[index].leLengthASD =
235 trace(icom_port, "FOD_XBUFF",
236 (unsigned long) icom_port->xmit_buf);
237 icom_port->statStg->xmit[index].leBuffer =
238 cpu_to_le32(icom_port->xmit_buf_pci);
240 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
248 trace(icom_port, "FID_ADDR", stgAddr);
249 stgAddr = stgAddr + sizeof(icom_port->statStg->rcv[0]);
250 icom_port->statStg->rcv[index].leLength = 0;
251 icom_port->statStg->rcv[index].WorkingLength =
254 offset = stgAddr - (unsigned long) icom_port->statStg;
255 icom_port->statStg->rcv[index].leNext =
256 cpu_to_le32(icom_port-> statStg_pci + offset);
257 trace(icom_port, "FID_RBUFF",
258 (unsigned long) icom_port->recv_buf);
259 icom_port->statStg->rcv[index].leBuffer =
260 cpu_to_le32(icom_port->recv_buf_pci);
262 offset = startStgAddr - (unsigned long) icom_port->statStg;
263 icom_port->statStg->rcv[index].leNext =
264 cpu_to_le32(icom_port-> statStg_pci + offset);
265 trace(icom_port, "FID_RBUFF",
266 (unsigned long) icom_port->recv_buf + 2048);
267 icom_port->statStg->rcv[index].leBuffer =
268 cpu_to_le32(icom_port->recv_buf_pci + 2048);
270 icom_port->statStg->rcv[index].leNext = 0;
271 icom_port->statStg->rcv[index].leBuffer = 0;
278 static void stop_processor(struct icom_port *icom_port)
286 port = icom_port->port;
288 dev_err(&icom_port->adapter->pci_dev->dev,
294 stop_proc[port].global_control_reg = &icom_port->global_reg->control;
296 stop_proc[port].global_control_reg = &icom_port->global_reg->control_2;
309 static void start_processor(struct icom_port *icom_port)
317 port = icom_port->port;
319 dev_err(&icom_port->adapter->pci_dev->dev,
325 start_proc[port].global_control_reg = &icom_port->global_reg->control;
327 start_proc[port].global_control_reg = &icom_port->global_reg->control_2;
340 static void load_code(struct icom_port *icom_port)
346 void __iomem *dram_ptr = icom_port->dram;
350 struct pci_dev *dev = icom_port->adapter->pci_dev;
353 writew(0x3FFF, icom_port->int_reg);
355 trace(icom_port, "CLEAR_INTERRUPTS", 0);
358 stop_processor(icom_port);
377 iram_ptr = (char __iomem *)icom_port->dram + ICOM_IRAM_OFFSET;
397 iram_ptr = (char __iomem *) icom_port->dram + ICOM_IRAM_OFFSET;
404 if (icom_port->adapter->version == ADAPTER_V2)
405 writeb(V2_HARDWARE, &(icom_port->dram->misc_flags));
408 start_processor(icom_port);
411 &(icom_port->dram->HDLCConfigReg));
412 writeb(0x04, &(icom_port->dram->FlagFillIdleTimer)); /* 0.5 seconds */
413 writeb(0x00, &(icom_port->dram->CmdReg));
414 writeb(0x10, &(icom_port->dram->async_config3));
416 ICOM_ACFG_1STOP_BIT), &(icom_port->dram->async_config2));
445 writeb((char) ((fw->size + 16)/16), &icom_port->dram->mac_length);
446 writel(temp_pci, &icom_port->dram->mac_load_addr);
459 writeb(START_DOWNLOAD, &icom_port->dram->sync);
464 if (readb(&icom_port->dram->misc_flags) & ICOM_HDW_ACTIVE)
474 cable_id = readb(&icom_port->dram->cable_id);
479 icom_port->cable_id = cable_id;
482 icom_port->cable_id = NO_CABLE;
489 writew(0x3FFF, icom_port->int_reg);
492 writeb(ICOM_DISABLE, &(icom_port->dram->disable));
495 stop_processor(icom_port);
497 dev_err(&icom_port->adapter->pci_dev->dev,"Port not operational\n");
504 static int startup(struct icom_port *icom_port)
511 trace(icom_port, "STARTUP", 0);
513 if (!icom_port->dram) {
515 dev_err(&icom_port->adapter->pci_dev->dev,
523 raw_cable_id = readb(&icom_port->dram->cable_id);
524 trace(icom_port, "CABLE_ID", raw_cable_id);
531 (cable_id != icom_port->cable_id)) {
534 load_code(icom_port);
537 raw_cable_id = readb(&icom_port->dram->cable_id);
540 (icom_port->cable_id == NO_CABLE))
548 port = icom_port->port;
550 dev_err(&icom_port->adapter->pci_dev->dev,
556 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask;
558 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask_2;
561 writew(0x00FF, icom_port->int_reg);
563 writew(0x3F00, icom_port->int_reg);
576 static void shutdown(struct icom_port *icom_port)
584 trace(icom_port, "SHUTDOWN", 0);
589 port = icom_port->port;
591 dev_err(&icom_port->adapter->pci_dev->dev,
596 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask;
598 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask_2;
612 cmdReg = readb(&icom_port->dram->CmdReg);
614 writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
666 static inline void check_modem_status(struct icom_port *icom_port)
672 spin_lock(&icom_port->uart_port.lock);
675 status = readb(&icom_port->dram->isr);
676 trace(icom_port, "CHECK_MODEM", status);
680 icom_port->uart_port.icount.rng++;
682 icom_port->uart_port.icount.dsr++;
684 uart_handle_dcd_change(&icom_port->uart_port,
687 uart_handle_cts_change(&icom_port->uart_port,
690 wake_up_interruptible(&icom_port->uart_port.state->
694 spin_unlock(&icom_port->uart_port.lock);
697 static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
703 trace(icom_port, "XMIT_COMPLETE", 0);
706 icom_port->statStg->xmit[0].flags &=
710 cpu_to_le16(icom_port->statStg->xmit[0].leLength);
711 icom_port->uart_port.icount.tx += count;
714 !uart_circ_empty(&icom_port->uart_port.state->xmit); i++) {
716 icom_port->uart_port.state->xmit.tail++;
717 icom_port->uart_port.state->xmit.tail &=
721 if (!icom_write(&icom_port->uart_port))
723 uart_write_wakeup(&icom_port->uart_port);
725 trace(icom_port, "XMIT_DISABLED", 0);
728 static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
731 struct tty_port *port = &icom_port->uart_port.state->port;
737 trace(icom_port, "RCV_COMPLETE", 0);
738 rcv_buff = icom_port->next_rcv;
740 status = cpu_to_le16(icom_port->statStg->rcv[rcv_buff].flags);
744 trace(icom_port, "FID_STATUS", status);
745 count = cpu_to_le16(icom_port->statStg->rcv[rcv_buff].leLength);
747 trace(icom_port, "RCV_COUNT", count);
749 trace(icom_port, "REAL_COUNT", count);
752 cpu_to_le32(icom_port->statStg->rcv[rcv_buff].leBuffer) -
753 icom_port->recv_buf_pci;
757 first = icom_port->recv_buf[offset];
758 tty_insert_flip_string(port, icom_port->recv_buf + offset, count - 1);
761 icount = &icom_port->uart_port.icount;
769 trace(icom_port, "BREAK_DET", 0);
792 if (status & icom_port->ignore_status_mask) {
793 trace(icom_port, "IGNORE_CHAR", 0);
797 status &= icom_port->read_status_mask;
802 trace(icom_port, "PARITY_ERROR", 0);
809 tty_insert_flip_char(port, *(icom_port->recv_buf + offset + count - 1), flag);
819 icom_port->statStg->rcv[rcv_buff].flags = 0;
820 icom_port->statStg->rcv[rcv_buff].leLength = 0;
821 icom_port->statStg->rcv[rcv_buff].WorkingLength =
828 status = cpu_to_le16(icom_port->statStg->rcv[rcv_buff].flags);
830 icom_port->next_rcv = rcv_buff;
832 spin_unlock(&icom_port->uart_port.lock);
834 spin_lock(&icom_port->uart_port.lock);
838 struct icom_port *icom_port)
841 spin_lock(&icom_port->uart_port.lock);
842 trace(icom_port, "INTERRUPT", port_int_reg);
845 xmit_interrupt(port_int_reg, icom_port);
848 recv_interrupt(port_int_reg, icom_port);
850 spin_unlock(&icom_port->uart_port.lock);
859 struct icom_port *icom_port;
861 /* find icom_port for this interrupt */
871 icom_port = &icom_adapter->port_info[2];
873 process_interrupt(port_int_reg, icom_port);
874 check_modem_status(icom_port);
878 icom_port = &icom_adapter->port_info[3];
879 if (icom_port->status == ICOM_PORT_ACTIVE) {
882 process_interrupt(port_int_reg, icom_port);
883 check_modem_status(icom_port);
899 icom_port = &icom_adapter->port_info[0];
901 process_interrupt(port_int_reg, icom_port);
902 check_modem_status(icom_port);
906 icom_port = &icom_adapter->port_info[1];
907 if (icom_port->status == ICOM_PORT_ACTIVE) {
909 process_interrupt(port_int_reg, icom_port);
910 check_modem_status(icom_port);
1311 struct icom_port *icom_port;
1317 icom_port = &icom_adapter->port_info[i];
1318 icom_port->port = i;
1319 icom_port->status = ICOM_PORT_ACTIVE;
1320 icom_port->imbed_modem = ICOM_UNKNOWN;
1327 icom_port = &icom_adapter->port_info[i];
1329 icom_port->port = i;
1330 icom_port->status = ICOM_PORT_ACTIVE;
1331 icom_port->imbed_modem = ICOM_IMBED_MODEM;
1358 static void icom_port_active(struct icom_port *icom_port, struct icom_adapter *icom_adapter, int port_num)
1361 icom_port->global_reg = icom_adapter->base_addr + 0x4000;
1362 icom_port->int_reg = icom_adapter->base_addr +
1365 icom_port->global_reg = icom_adapter->base_addr + 0x8000;
1366 if (icom_port->port < 2)
1367 icom_port->int_reg = icom_adapter->base_addr +
1368 0x8004 + 2 - 2 * icom_port->port;
1370 icom_port->int_reg = icom_adapter->base_addr +
1371 0x8024 + 2 - 2 * (icom_port->port - 2);
1376 struct icom_port *icom_port;
1381 icom_port = &icom_adapter->port_info[port_num];
1383 if (icom_port->status == ICOM_PORT_ACTIVE) {
1384 icom_port_active(icom_port, icom_adapter, port_num);
1385 icom_port->dram = icom_adapter->base_addr +
1386 0x2000 * icom_port->port;
1388 icom_port->adapter = icom_adapter;
1391 if (get_port_memory(icom_port) != 0) {
1392 dev_err(&icom_port->adapter->pci_dev->dev,
1439 struct icom_port *icom_port;
1443 icom_port = &icom_adapter->port_info[index];
1445 if (icom_port->status == ICOM_PORT_ACTIVE) {
1450 &icom_port->uart_port);
1453 writeb(0x00, &icom_port->dram->osr);
1459 stop_processor(icom_port);
1461 free_port_memory(icom_port);
1486 struct icom_port *icom_port;
1556 icom_port = &icom_adapter->port_info[index];
1558 if (icom_port->status == ICOM_PORT_ACTIVE) {
1559 icom_port->uart_port.irq = icom_port->adapter->pci_dev->irq;
1560 icom_port->uart_port.type = PORT_ICOM;
1561 icom_port->uart_port.iotype = UPIO_MEM;
1562 icom_port->uart_port.membase =
1564 icom_port->uart_port.fifosize = 16;
1565 icom_port->uart_port.ops = &icom_ops;
1566 icom_port->uart_port.line =
1567 icom_port->port + icom_adapter->index * 4;
1568 if (uart_add_one_port (&icom_uart_driver, &icom_port->uart_port)) {
1569 icom_port->status = ICOM_PORT_OFF;