0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/kernel.h>
0013 #include <linux/errno.h>
0014 #include <linux/signal.h>
0015 #include <linux/timer.h>
0016 #include <linux/interrupt.h>
0017 #include <linux/tty.h>
0018 #include <linux/termios.h>
0019 #include <linux/fs.h>
0020 #include <linux/tty_flip.h>
0021 #include <linux/serial.h>
0022 #include <linux/serial_core.h>
0023 #include <linux/serial_reg.h>
0024 #include <linux/major.h>
0025 #include <linux/string.h>
0026 #include <linux/fcntl.h>
0027 #include <linux/ptrace.h>
0028 #include <linux/ioport.h>
0029 #include <linux/mm.h>
0030 #include <linux/slab.h>
0031 #include <linux/init.h>
0032 #include <linux/delay.h>
0033 #include <linux/pci.h>
0034 #include <linux/vmalloc.h>
0035 #include <linux/smp.h>
0036 #include <linux/spinlock.h>
0037 #include <linux/kref.h>
0038 #include <linux/firmware.h>
0039 #include <linux/bitops.h>
0040
0041 #include <linux/io.h>
0042 #include <asm/irq.h>
0043 #include <linux/uaccess.h>
0044
0045
0046
0047 #define ICOM_DRIVER_NAME "icom"
0048 #define NR_PORTS 128
0049
0050 static const unsigned int icom_acfg_baud[] = {
0051 300,
0052 600,
0053 900,
0054 1200,
0055 1800,
0056 2400,
0057 3600,
0058 4800,
0059 7200,
0060 9600,
0061 14400,
0062 19200,
0063 28800,
0064 38400,
0065 57600,
0066 76800,
0067 115200,
0068 153600,
0069 230400,
0070 307200,
0071 460800,
0072 };
0073 #define BAUD_TABLE_LIMIT (ARRAY_SIZE(icom_acfg_baud) - 1)
0074
0075 struct icom_regs {
0076 u32 control;
0077 u32 interrupt;
0078 u32 int_mask;
0079 u32 int_pri;
0080 u32 int_reg_b;
0081 u32 resvd01;
0082 u32 resvd02;
0083 u32 resvd03;
0084 u32 control_2;
0085 u32 interrupt_2;
0086 u32 int_mask_2;
0087 u32 int_pri_2;
0088 u32 int_reg_2b;
0089 };
0090
0091 struct func_dram {
0092 u32 reserved[108];
0093 u32 RcvStatusAddr;
0094 u8 RcvStnAddr;
0095 u8 IdleState;
0096 u8 IdleMonitor;
0097 u8 FlagFillIdleTimer;
0098 u32 XmitStatusAddr;
0099 u8 StartXmitCmd;
0100 u8 HDLCConfigReg;
0101 u8 CauseCode;
0102 u8 xchar;
0103 u32 reserved3;
0104 u8 PrevCmdReg;
0105 u8 CmdReg;
0106 u8 async_config2;
0107 u8 async_config3;
0108 u8 dce_resvd[20];
0109 u8 dce_resvd21;
0110 u8 misc_flags;
0111 #define V2_HARDWARE 0x40
0112 #define ICOM_HDW_ACTIVE 0x01
0113 u8 call_length;
0114 u8 call_length2;
0115 u32 call_addr;
0116 u16 timer_value;
0117 u8 timer_command;
0118 u8 dce_command;
0119 u8 dce_cmd_status;
0120 u8 x21_r1_ioff;
0121 u8 x21_r0_ioff;
0122 u8 x21_ralt_ioff;
0123 u8 x21_r1_ion;
0124 u8 rsvd_ier;
0125 u8 ier;
0126 u8 isr;
0127 u8 osr;
0128 u8 reset;
0129 u8 disable;
0130 u8 sync;
0131 u8 error_stat;
0132 u8 cable_id;
0133 u8 cs_length;
0134 u8 mac_length;
0135 u32 cs_load_addr;
0136 u32 mac_load_addr;
0137 };
0138
0139
0140
0141
0142 #define ICOM_CONTROL_START_A 0x00000008
0143 #define ICOM_CONTROL_STOP_A 0x00000004
0144 #define ICOM_CONTROL_START_B 0x00000002
0145 #define ICOM_CONTROL_STOP_B 0x00000001
0146 #define ICOM_CONTROL_START_C 0x00000008
0147 #define ICOM_CONTROL_STOP_C 0x00000004
0148 #define ICOM_CONTROL_START_D 0x00000002
0149 #define ICOM_CONTROL_STOP_D 0x00000001
0150 #define ICOM_IRAM_OFFSET 0x1000
0151 #define ICOM_IRAM_SIZE 0x0C00
0152 #define ICOM_DCE_IRAM_OFFSET 0x0A00
0153 #define ICOM_CABLE_ID_VALID 0x01
0154 #define ICOM_CABLE_ID_MASK 0xF0
0155 #define ICOM_DISABLE 0x80
0156 #define CMD_XMIT_RCV_ENABLE 0xC0
0157 #define CMD_XMIT_ENABLE 0x40
0158 #define CMD_RCV_DISABLE 0x00
0159 #define CMD_RCV_ENABLE 0x80
0160 #define CMD_RESTART 0x01
0161 #define CMD_HOLD_XMIT 0x02
0162 #define CMD_SND_BREAK 0x04
0163 #define RS232_CABLE 0x06
0164 #define V24_CABLE 0x0E
0165 #define V35_CABLE 0x0C
0166 #define V36_CABLE 0x02
0167 #define NO_CABLE 0x00
0168 #define START_DOWNLOAD 0x80
0169 #define ICOM_INT_MASK_PRC_A 0x00003FFF
0170 #define ICOM_INT_MASK_PRC_B 0x3FFF0000
0171 #define ICOM_INT_MASK_PRC_C 0x00003FFF
0172 #define ICOM_INT_MASK_PRC_D 0x3FFF0000
0173 #define INT_RCV_COMPLETED 0x1000
0174 #define INT_XMIT_COMPLETED 0x2000
0175 #define INT_IDLE_DETECT 0x0800
0176 #define INT_RCV_DISABLED 0x0400
0177 #define INT_XMIT_DISABLED 0x0200
0178 #define INT_RCV_XMIT_SHUTDOWN 0x0100
0179 #define INT_FATAL_ERROR 0x0080
0180 #define INT_CABLE_PULL 0x0020
0181 #define INT_SIGNAL_CHANGE 0x0010
0182 #define HDLC_PPP_PURE_ASYNC 0x02
0183 #define HDLC_FF_FILL 0x00
0184 #define HDLC_HDW_FLOW 0x01
0185 #define START_XMIT 0x80
0186 #define ICOM_ACFG_DRIVE1 0x20
0187 #define ICOM_ACFG_NO_PARITY 0x00
0188 #define ICOM_ACFG_PARITY_ENAB 0x02
0189 #define ICOM_ACFG_PARITY_ODD 0x01
0190 #define ICOM_ACFG_8BPC 0x00
0191 #define ICOM_ACFG_7BPC 0x04
0192 #define ICOM_ACFG_6BPC 0x08
0193 #define ICOM_ACFG_5BPC 0x0C
0194 #define ICOM_ACFG_1STOP_BIT 0x00
0195 #define ICOM_ACFG_2STOP_BIT 0x10
0196 #define ICOM_DTR 0x80
0197 #define ICOM_RTS 0x40
0198 #define ICOM_RI 0x08
0199 #define ICOM_DSR 0x80
0200 #define ICOM_DCD 0x20
0201 #define ICOM_CTS 0x40
0202
0203 #define NUM_XBUFFS 1
0204 #define NUM_RBUFFS 2
0205 #define RCV_BUFF_SZ 0x0200
0206 #define XMIT_BUFF_SZ 0x1000
0207 struct statusArea {
0208
0209
0210
0211 struct xmit_status_area{
0212 __le32 leNext;
0213 __le32 leNextASD;
0214 __le32 leBuffer;
0215 __le16 leLengthASD;
0216 __le16 leOffsetASD;
0217 __le16 leLength;
0218 __le16 flags;
0219 #define SA_FLAGS_DONE 0x0080
0220 #define SA_FLAGS_CONTINUED 0x8000
0221 #define SA_FLAGS_IDLE 0x4000
0222 #define SA_FLAGS_READY_TO_XMIT 0x0800
0223 #define SA_FLAGS_STAT_MASK 0x007F
0224 } xmit[NUM_XBUFFS];
0225
0226
0227
0228
0229 struct {
0230 __le32 leNext;
0231 __le32 leNextASD;
0232 __le32 leBuffer;
0233 __le16 WorkingLength;
0234 __le16 reserv01;
0235 __le16 leLength;
0236 __le16 flags;
0237 #define SA_FL_RCV_DONE 0x0010
0238 #define SA_FLAGS_OVERRUN 0x0040
0239 #define SA_FLAGS_PARITY_ERROR 0x0080
0240 #define SA_FLAGS_FRAME_ERROR 0x0001
0241 #define SA_FLAGS_FRAME_TRUNC 0x0002
0242 #define SA_FLAGS_BREAK_DET 0x0004
0243 #define SA_FLAGS_RCV_MASK 0xFFE6
0244 } rcv[NUM_RBUFFS];
0245 };
0246
0247 struct icom_adapter;
0248
0249
0250 #define ICOM_MAJOR 243
0251 #define ICOM_MINOR_START 0
0252
0253 struct icom_port {
0254 struct uart_port uart_port;
0255 unsigned char cable_id;
0256 unsigned char read_status_mask;
0257 unsigned char ignore_status_mask;
0258 void __iomem * int_reg;
0259 struct icom_regs __iomem *global_reg;
0260 struct func_dram __iomem *dram;
0261 int port;
0262 struct statusArea *statStg;
0263 dma_addr_t statStg_pci;
0264 __le32 *xmitRestart;
0265 dma_addr_t xmitRestart_pci;
0266 unsigned char *xmit_buf;
0267 dma_addr_t xmit_buf_pci;
0268 unsigned char *recv_buf;
0269 dma_addr_t recv_buf_pci;
0270 int next_rcv;
0271 int status;
0272 #define ICOM_PORT_ACTIVE 1
0273 #define ICOM_PORT_OFF 0
0274 struct icom_adapter *adapter;
0275 };
0276
0277 struct icom_adapter {
0278 void __iomem * base_addr;
0279 unsigned long base_addr_pci;
0280 struct pci_dev *pci_dev;
0281 struct icom_port port_info[4];
0282 int index;
0283 int version;
0284 #define ADAPTER_V1 0x0001
0285 #define ADAPTER_V2 0x0002
0286 u32 subsystem_id;
0287 #define FOUR_PORT_MODEL 0x0252
0288 #define V2_TWO_PORTS_RVX 0x021A
0289 #define V2_ONE_PORT_RVX_ONE_PORT_IMBED_MDM 0x0251
0290 int numb_ports;
0291 struct list_head icom_adapter_entry;
0292 struct kref kref;
0293 };
0294
0295
0296 extern void iCom_sercons_init(void);
0297
0298 struct lookup_proc_table {
0299 u32 __iomem *global_control_reg;
0300 unsigned long processor_id;
0301 };
0302
0303 struct lookup_int_table {
0304 u32 __iomem *global_int_mask;
0305 unsigned long processor_id;
0306 };
0307
0308 static inline struct icom_port *to_icom_port(struct uart_port *port)
0309 {
0310 return container_of(port, struct icom_port, uart_port);
0311 }
0312
0313 static const struct pci_device_id icom_pci_table[] = {
0314 {
0315 .vendor = PCI_VENDOR_ID_IBM,
0316 .device = PCI_DEVICE_ID_IBM_ICOM_DEV_ID_1,
0317 .subvendor = PCI_ANY_ID,
0318 .subdevice = PCI_ANY_ID,
0319 .driver_data = ADAPTER_V1,
0320 },
0321 {
0322 .vendor = PCI_VENDOR_ID_IBM,
0323 .device = PCI_DEVICE_ID_IBM_ICOM_DEV_ID_2,
0324 .subvendor = PCI_VENDOR_ID_IBM,
0325 .subdevice = PCI_DEVICE_ID_IBM_ICOM_V2_TWO_PORTS_RVX,
0326 .driver_data = ADAPTER_V2,
0327 },
0328 {
0329 .vendor = PCI_VENDOR_ID_IBM,
0330 .device = PCI_DEVICE_ID_IBM_ICOM_DEV_ID_2,
0331 .subvendor = PCI_VENDOR_ID_IBM,
0332 .subdevice = PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM,
0333 .driver_data = ADAPTER_V2,
0334 },
0335 {
0336 .vendor = PCI_VENDOR_ID_IBM,
0337 .device = PCI_DEVICE_ID_IBM_ICOM_DEV_ID_2,
0338 .subvendor = PCI_VENDOR_ID_IBM,
0339 .subdevice = PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL,
0340 .driver_data = ADAPTER_V2,
0341 },
0342 {
0343 .vendor = PCI_VENDOR_ID_IBM,
0344 .device = PCI_DEVICE_ID_IBM_ICOM_DEV_ID_2,
0345 .subvendor = PCI_VENDOR_ID_IBM,
0346 .subdevice = PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE,
0347 .driver_data = ADAPTER_V2,
0348 },
0349 {}
0350 };
0351
0352 static struct lookup_proc_table start_proc[4] = {
0353 {NULL, ICOM_CONTROL_START_A},
0354 {NULL, ICOM_CONTROL_START_B},
0355 {NULL, ICOM_CONTROL_START_C},
0356 {NULL, ICOM_CONTROL_START_D}
0357 };
0358
0359
0360 static struct lookup_proc_table stop_proc[4] = {
0361 {NULL, ICOM_CONTROL_STOP_A},
0362 {NULL, ICOM_CONTROL_STOP_B},
0363 {NULL, ICOM_CONTROL_STOP_C},
0364 {NULL, ICOM_CONTROL_STOP_D}
0365 };
0366
0367 static struct lookup_int_table int_mask_tbl[4] = {
0368 {NULL, ICOM_INT_MASK_PRC_A},
0369 {NULL, ICOM_INT_MASK_PRC_B},
0370 {NULL, ICOM_INT_MASK_PRC_C},
0371 {NULL, ICOM_INT_MASK_PRC_D},
0372 };
0373
0374
0375 MODULE_DEVICE_TABLE(pci, icom_pci_table);
0376
0377 static LIST_HEAD(icom_adapter_head);
0378
0379
0380 static DEFINE_SPINLOCK(icom_lock);
0381
0382 #ifdef ICOM_TRACE
0383 static inline void trace(struct icom_port *icom_port, char *trace_pt,
0384 unsigned long trace_data)
0385 {
0386 dev_info(&icom_port->adapter->pci_dev->dev, ":%d:%s - %lx\n",
0387 icom_port->port, trace_pt, trace_data);
0388 }
0389 #else
0390 static inline void trace(struct icom_port *icom_port, char *trace_pt, unsigned long trace_data) {};
0391 #endif
0392 static void icom_kref_release(struct kref *kref);
0393
0394 static void free_port_memory(struct icom_port *icom_port)
0395 {
0396 struct pci_dev *dev = icom_port->adapter->pci_dev;
0397
0398 trace(icom_port, "RET_PORT_MEM", 0);
0399 if (icom_port->recv_buf) {
0400 dma_free_coherent(&dev->dev, 4096, icom_port->recv_buf,
0401 icom_port->recv_buf_pci);
0402 icom_port->recv_buf = NULL;
0403 }
0404 if (icom_port->xmit_buf) {
0405 dma_free_coherent(&dev->dev, 4096, icom_port->xmit_buf,
0406 icom_port->xmit_buf_pci);
0407 icom_port->xmit_buf = NULL;
0408 }
0409 if (icom_port->statStg) {
0410 dma_free_coherent(&dev->dev, 4096, icom_port->statStg,
0411 icom_port->statStg_pci);
0412 icom_port->statStg = NULL;
0413 }
0414
0415 if (icom_port->xmitRestart) {
0416 dma_free_coherent(&dev->dev, 4096, icom_port->xmitRestart,
0417 icom_port->xmitRestart_pci);
0418 icom_port->xmitRestart = NULL;
0419 }
0420 }
0421
0422 static int get_port_memory(struct icom_port *icom_port)
0423 {
0424 int index;
0425 unsigned long stgAddr;
0426 unsigned long startStgAddr;
0427 unsigned long offset;
0428 struct pci_dev *dev = icom_port->adapter->pci_dev;
0429
0430 icom_port->xmit_buf =
0431 dma_alloc_coherent(&dev->dev, 4096, &icom_port->xmit_buf_pci,
0432 GFP_KERNEL);
0433 if (!icom_port->xmit_buf) {
0434 dev_err(&dev->dev, "Can not allocate Transmit buffer\n");
0435 return -ENOMEM;
0436 }
0437
0438 trace(icom_port, "GET_PORT_MEM",
0439 (unsigned long) icom_port->xmit_buf);
0440
0441 icom_port->recv_buf =
0442 dma_alloc_coherent(&dev->dev, 4096, &icom_port->recv_buf_pci,
0443 GFP_KERNEL);
0444 if (!icom_port->recv_buf) {
0445 dev_err(&dev->dev, "Can not allocate Receive buffer\n");
0446 free_port_memory(icom_port);
0447 return -ENOMEM;
0448 }
0449 trace(icom_port, "GET_PORT_MEM",
0450 (unsigned long) icom_port->recv_buf);
0451
0452 icom_port->statStg =
0453 dma_alloc_coherent(&dev->dev, 4096, &icom_port->statStg_pci,
0454 GFP_KERNEL);
0455 if (!icom_port->statStg) {
0456 dev_err(&dev->dev, "Can not allocate Status buffer\n");
0457 free_port_memory(icom_port);
0458 return -ENOMEM;
0459 }
0460 trace(icom_port, "GET_PORT_MEM",
0461 (unsigned long) icom_port->statStg);
0462
0463 icom_port->xmitRestart =
0464 dma_alloc_coherent(&dev->dev, 4096, &icom_port->xmitRestart_pci,
0465 GFP_KERNEL);
0466 if (!icom_port->xmitRestart) {
0467 dev_err(&dev->dev,
0468 "Can not allocate xmit Restart buffer\n");
0469 free_port_memory(icom_port);
0470 return -ENOMEM;
0471 }
0472
0473
0474
0475
0476
0477 stgAddr = (unsigned long) icom_port->statStg;
0478 for (index = 0; index < NUM_XBUFFS; index++) {
0479 trace(icom_port, "FOD_ADDR", stgAddr);
0480 stgAddr = stgAddr + sizeof(icom_port->statStg->xmit[0]);
0481 if (index < (NUM_XBUFFS - 1)) {
0482 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
0483 icom_port->statStg->xmit[index].leLengthASD =
0484 cpu_to_le16(XMIT_BUFF_SZ);
0485 trace(icom_port, "FOD_ADDR", stgAddr);
0486 trace(icom_port, "FOD_XBUFF",
0487 (unsigned long) icom_port->xmit_buf);
0488 icom_port->statStg->xmit[index].leBuffer =
0489 cpu_to_le32(icom_port->xmit_buf_pci);
0490 } else if (index == (NUM_XBUFFS - 1)) {
0491 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
0492 icom_port->statStg->xmit[index].leLengthASD =
0493 cpu_to_le16(XMIT_BUFF_SZ);
0494 trace(icom_port, "FOD_XBUFF",
0495 (unsigned long) icom_port->xmit_buf);
0496 icom_port->statStg->xmit[index].leBuffer =
0497 cpu_to_le32(icom_port->xmit_buf_pci);
0498 } else {
0499 memset(&icom_port->statStg->xmit[index], 0, sizeof(struct xmit_status_area));
0500 }
0501 }
0502
0503 startStgAddr = stgAddr;
0504
0505
0506 for (index = 0; index < NUM_RBUFFS; index++) {
0507 trace(icom_port, "FID_ADDR", stgAddr);
0508 stgAddr = stgAddr + sizeof(icom_port->statStg->rcv[0]);
0509 icom_port->statStg->rcv[index].leLength = 0;
0510 icom_port->statStg->rcv[index].WorkingLength =
0511 cpu_to_le16(RCV_BUFF_SZ);
0512 if (index < (NUM_RBUFFS - 1) ) {
0513 offset = stgAddr - (unsigned long) icom_port->statStg;
0514 icom_port->statStg->rcv[index].leNext =
0515 cpu_to_le32(icom_port-> statStg_pci + offset);
0516 trace(icom_port, "FID_RBUFF",
0517 (unsigned long) icom_port->recv_buf);
0518 icom_port->statStg->rcv[index].leBuffer =
0519 cpu_to_le32(icom_port->recv_buf_pci);
0520 } else if (index == (NUM_RBUFFS -1) ) {
0521 offset = startStgAddr - (unsigned long) icom_port->statStg;
0522 icom_port->statStg->rcv[index].leNext =
0523 cpu_to_le32(icom_port-> statStg_pci + offset);
0524 trace(icom_port, "FID_RBUFF",
0525 (unsigned long) icom_port->recv_buf + 2048);
0526 icom_port->statStg->rcv[index].leBuffer =
0527 cpu_to_le32(icom_port->recv_buf_pci + 2048);
0528 } else {
0529 icom_port->statStg->rcv[index].leNext = 0;
0530 icom_port->statStg->rcv[index].leBuffer = 0;
0531 }
0532 }
0533
0534 return 0;
0535 }
0536
0537 static void stop_processor(struct icom_port *icom_port)
0538 {
0539 unsigned long temp;
0540 unsigned long flags;
0541 int port;
0542
0543 spin_lock_irqsave(&icom_lock, flags);
0544
0545 port = icom_port->port;
0546 if (port >= ARRAY_SIZE(stop_proc)) {
0547 dev_err(&icom_port->adapter->pci_dev->dev,
0548 "Invalid port assignment\n");
0549 goto unlock;
0550 }
0551
0552 if (port == 0 || port == 1)
0553 stop_proc[port].global_control_reg = &icom_port->global_reg->control;
0554 else
0555 stop_proc[port].global_control_reg = &icom_port->global_reg->control_2;
0556
0557 temp = readl(stop_proc[port].global_control_reg);
0558 temp = (temp & ~start_proc[port].processor_id) | stop_proc[port].processor_id;
0559 writel(temp, stop_proc[port].global_control_reg);
0560
0561
0562 readl(stop_proc[port].global_control_reg);
0563
0564 unlock:
0565 spin_unlock_irqrestore(&icom_lock, flags);
0566 }
0567
0568 static void start_processor(struct icom_port *icom_port)
0569 {
0570 unsigned long temp;
0571 unsigned long flags;
0572 int port;
0573
0574 spin_lock_irqsave(&icom_lock, flags);
0575
0576 port = icom_port->port;
0577 if (port >= ARRAY_SIZE(start_proc)) {
0578 dev_err(&icom_port->adapter->pci_dev->dev,
0579 "Invalid port assignment\n");
0580 goto unlock;
0581 }
0582
0583 if (port == 0 || port == 1)
0584 start_proc[port].global_control_reg = &icom_port->global_reg->control;
0585 else
0586 start_proc[port].global_control_reg = &icom_port->global_reg->control_2;
0587
0588 temp = readl(start_proc[port].global_control_reg);
0589 temp = (temp & ~stop_proc[port].processor_id) | start_proc[port].processor_id;
0590 writel(temp, start_proc[port].global_control_reg);
0591
0592
0593 readl(start_proc[port].global_control_reg);
0594
0595 unlock:
0596 spin_unlock_irqrestore(&icom_lock, flags);
0597 }
0598
0599 static void load_code(struct icom_port *icom_port)
0600 {
0601 const struct firmware *fw;
0602 char __iomem *iram_ptr;
0603 int index;
0604 int status = 0;
0605 void __iomem *dram_ptr = icom_port->dram;
0606 dma_addr_t temp_pci;
0607 unsigned char *new_page = NULL;
0608 unsigned char cable_id = NO_CABLE;
0609 struct pci_dev *dev = icom_port->adapter->pci_dev;
0610
0611
0612 writew(0x3FFF, icom_port->int_reg);
0613
0614 trace(icom_port, "CLEAR_INTERRUPTS", 0);
0615
0616
0617 stop_processor(icom_port);
0618
0619
0620 memset_io(dram_ptr, 0, 512);
0621
0622
0623 if (request_firmware(&fw, "icom_call_setup.bin", &dev->dev) < 0) {
0624 dev_err(&dev->dev,"Unable to load icom_call_setup.bin firmware image\n");
0625 status = -1;
0626 goto load_code_exit;
0627 }
0628
0629 if (fw->size > ICOM_DCE_IRAM_OFFSET) {
0630 dev_err(&dev->dev, "Invalid firmware image for icom_call_setup.bin found.\n");
0631 release_firmware(fw);
0632 status = -1;
0633 goto load_code_exit;
0634 }
0635
0636 iram_ptr = (char __iomem *)icom_port->dram + ICOM_IRAM_OFFSET;
0637 for (index = 0; index < fw->size; index++)
0638 writeb(fw->data[index], &iram_ptr[index]);
0639
0640 release_firmware(fw);
0641
0642
0643 if (request_firmware(&fw, "icom_res_dce.bin", &dev->dev) < 0) {
0644 dev_err(&dev->dev,"Unable to load icom_res_dce.bin firmware image\n");
0645 status = -1;
0646 goto load_code_exit;
0647 }
0648
0649 if (fw->size > ICOM_IRAM_SIZE) {
0650 dev_err(&dev->dev, "Invalid firmware image for icom_res_dce.bin found.\n");
0651 release_firmware(fw);
0652 status = -1;
0653 goto load_code_exit;
0654 }
0655
0656 iram_ptr = (char __iomem *) icom_port->dram + ICOM_IRAM_OFFSET;
0657 for (index = ICOM_DCE_IRAM_OFFSET; index < fw->size; index++)
0658 writeb(fw->data[index], &iram_ptr[index]);
0659
0660 release_firmware(fw);
0661
0662
0663 if (icom_port->adapter->version == ADAPTER_V2)
0664 writeb(V2_HARDWARE, &(icom_port->dram->misc_flags));
0665
0666
0667 start_processor(icom_port);
0668
0669 writeb((HDLC_PPP_PURE_ASYNC | HDLC_FF_FILL),
0670 &(icom_port->dram->HDLCConfigReg));
0671 writeb(0x04, &(icom_port->dram->FlagFillIdleTimer));
0672 writeb(0x00, &(icom_port->dram->CmdReg));
0673 writeb(0x10, &(icom_port->dram->async_config3));
0674 writeb((ICOM_ACFG_DRIVE1 | ICOM_ACFG_NO_PARITY | ICOM_ACFG_8BPC |
0675 ICOM_ACFG_1STOP_BIT), &(icom_port->dram->async_config2));
0676
0677
0678
0679
0680 new_page = dma_alloc_coherent(&dev->dev, 4096, &temp_pci, GFP_KERNEL);
0681
0682 if (!new_page) {
0683 dev_err(&dev->dev, "Can not allocate DMA buffer\n");
0684 status = -1;
0685 goto load_code_exit;
0686 }
0687
0688 if (request_firmware(&fw, "icom_asc.bin", &dev->dev) < 0) {
0689 dev_err(&dev->dev,"Unable to load icom_asc.bin firmware image\n");
0690 status = -1;
0691 goto load_code_exit;
0692 }
0693
0694 if (fw->size > ICOM_DCE_IRAM_OFFSET) {
0695 dev_err(&dev->dev, "Invalid firmware image for icom_asc.bin found.\n");
0696 release_firmware(fw);
0697 status = -1;
0698 goto load_code_exit;
0699 }
0700
0701 for (index = 0; index < fw->size; index++)
0702 new_page[index] = fw->data[index];
0703
0704 writeb((char) ((fw->size + 16)/16), &icom_port->dram->mac_length);
0705 writel(temp_pci, &icom_port->dram->mac_load_addr);
0706
0707 release_firmware(fw);
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718 writeb(START_DOWNLOAD, &icom_port->dram->sync);
0719
0720
0721 for (index = 0; index < 10; index++) {
0722 msleep(100);
0723 if (readb(&icom_port->dram->misc_flags) & ICOM_HDW_ACTIVE)
0724 break;
0725 }
0726
0727 if (index == 10)
0728 status = -1;
0729
0730
0731
0732
0733 cable_id = readb(&icom_port->dram->cable_id);
0734
0735 if (cable_id & ICOM_CABLE_ID_VALID) {
0736
0737 cable_id = (cable_id & ICOM_CABLE_ID_MASK) >> 4;
0738 icom_port->cable_id = cable_id;
0739 } else {
0740 dev_err(&dev->dev,"Invalid or no cable attached\n");
0741 icom_port->cable_id = NO_CABLE;
0742 }
0743
0744 load_code_exit:
0745
0746 if (status != 0) {
0747
0748 writew(0x3FFF, icom_port->int_reg);
0749
0750
0751 writeb(ICOM_DISABLE, &(icom_port->dram->disable));
0752
0753
0754 stop_processor(icom_port);
0755
0756 dev_err(&icom_port->adapter->pci_dev->dev,"Port not operational\n");
0757 }
0758
0759 if (new_page != NULL)
0760 dma_free_coherent(&dev->dev, 4096, new_page, temp_pci);
0761 }
0762
0763 static int startup(struct icom_port *icom_port)
0764 {
0765 unsigned long temp;
0766 unsigned char cable_id, raw_cable_id;
0767 unsigned long flags;
0768 int port;
0769
0770 trace(icom_port, "STARTUP", 0);
0771
0772 if (!icom_port->dram) {
0773
0774 dev_err(&icom_port->adapter->pci_dev->dev,
0775 "Unusable Port, port configuration missing\n");
0776 return -ENODEV;
0777 }
0778
0779
0780
0781
0782 raw_cable_id = readb(&icom_port->dram->cable_id);
0783 trace(icom_port, "CABLE_ID", raw_cable_id);
0784
0785
0786 cable_id = (raw_cable_id & ICOM_CABLE_ID_MASK) >> 4;
0787
0788
0789 if (!(raw_cable_id & ICOM_CABLE_ID_VALID) ||
0790 (cable_id != icom_port->cable_id)) {
0791
0792
0793 load_code(icom_port);
0794
0795
0796 raw_cable_id = readb(&icom_port->dram->cable_id);
0797 cable_id = (raw_cable_id & ICOM_CABLE_ID_MASK) >> 4;
0798 if (!(raw_cable_id & ICOM_CABLE_ID_VALID) ||
0799 (icom_port->cable_id == NO_CABLE))
0800 return -EIO;
0801 }
0802
0803
0804
0805
0806 spin_lock_irqsave(&icom_lock, flags);
0807 port = icom_port->port;
0808 if (port >= ARRAY_SIZE(int_mask_tbl)) {
0809 dev_err(&icom_port->adapter->pci_dev->dev,
0810 "Invalid port assignment\n");
0811 goto unlock;
0812 }
0813
0814 if (port == 0 || port == 1)
0815 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask;
0816 else
0817 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask_2;
0818
0819 if (port == 0 || port == 2)
0820 writew(0x00FF, icom_port->int_reg);
0821 else
0822 writew(0x3F00, icom_port->int_reg);
0823
0824 temp = readl(int_mask_tbl[port].global_int_mask);
0825 writel(temp & ~int_mask_tbl[port].processor_id, int_mask_tbl[port].global_int_mask);
0826
0827
0828 readl(int_mask_tbl[port].global_int_mask);
0829
0830 unlock:
0831 spin_unlock_irqrestore(&icom_lock, flags);
0832 return 0;
0833 }
0834
0835 static void shutdown(struct icom_port *icom_port)
0836 {
0837 unsigned long temp;
0838 unsigned char cmdReg;
0839 unsigned long flags;
0840 int port;
0841
0842 spin_lock_irqsave(&icom_lock, flags);
0843 trace(icom_port, "SHUTDOWN", 0);
0844
0845
0846
0847
0848 port = icom_port->port;
0849 if (port >= ARRAY_SIZE(int_mask_tbl)) {
0850 dev_err(&icom_port->adapter->pci_dev->dev,
0851 "Invalid port assignment\n");
0852 goto unlock;
0853 }
0854 if (port == 0 || port == 1)
0855 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask;
0856 else
0857 int_mask_tbl[port].global_int_mask = &icom_port->global_reg->int_mask_2;
0858
0859 temp = readl(int_mask_tbl[port].global_int_mask);
0860 writel(temp | int_mask_tbl[port].processor_id, int_mask_tbl[port].global_int_mask);
0861
0862
0863 readl(int_mask_tbl[port].global_int_mask);
0864
0865 unlock:
0866 spin_unlock_irqrestore(&icom_lock, flags);
0867
0868
0869
0870
0871 cmdReg = readb(&icom_port->dram->CmdReg);
0872 if (cmdReg & CMD_SND_BREAK) {
0873 writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
0874 }
0875 }
0876
0877 static int icom_write(struct uart_port *port)
0878 {
0879 struct icom_port *icom_port = to_icom_port(port);
0880 unsigned long data_count;
0881 unsigned char cmdReg;
0882 unsigned long offset;
0883 int temp_tail = port->state->xmit.tail;
0884
0885 trace(icom_port, "WRITE", 0);
0886
0887 if (le16_to_cpu(icom_port->statStg->xmit[0].flags) &
0888 SA_FLAGS_READY_TO_XMIT) {
0889 trace(icom_port, "WRITE_FULL", 0);
0890 return 0;
0891 }
0892
0893 data_count = 0;
0894 while ((port->state->xmit.head != temp_tail) &&
0895 (data_count <= XMIT_BUFF_SZ)) {
0896
0897 icom_port->xmit_buf[data_count++] =
0898 port->state->xmit.buf[temp_tail];
0899
0900 temp_tail++;
0901 temp_tail &= (UART_XMIT_SIZE - 1);
0902 }
0903
0904 if (data_count) {
0905 icom_port->statStg->xmit[0].flags =
0906 cpu_to_le16(SA_FLAGS_READY_TO_XMIT);
0907 icom_port->statStg->xmit[0].leLength =
0908 cpu_to_le16(data_count);
0909 offset =
0910 (unsigned long) &icom_port->statStg->xmit[0] -
0911 (unsigned long) icom_port->statStg;
0912 *icom_port->xmitRestart =
0913 cpu_to_le32(icom_port->statStg_pci + offset);
0914 cmdReg = readb(&icom_port->dram->CmdReg);
0915 writeb(cmdReg | CMD_XMIT_RCV_ENABLE,
0916 &icom_port->dram->CmdReg);
0917 writeb(START_XMIT, &icom_port->dram->StartXmitCmd);
0918 trace(icom_port, "WRITE_START", data_count);
0919
0920 readb(&icom_port->dram->StartXmitCmd);
0921 }
0922
0923 return data_count;
0924 }
0925
0926 static inline void check_modem_status(struct icom_port *icom_port)
0927 {
0928 static char old_status = 0;
0929 char delta_status;
0930 unsigned char status;
0931
0932 spin_lock(&icom_port->uart_port.lock);
0933
0934
0935 status = readb(&icom_port->dram->isr);
0936 trace(icom_port, "CHECK_MODEM", status);
0937 delta_status = status ^ old_status;
0938 if (delta_status) {
0939 if (delta_status & ICOM_RI)
0940 icom_port->uart_port.icount.rng++;
0941 if (delta_status & ICOM_DSR)
0942 icom_port->uart_port.icount.dsr++;
0943 if (delta_status & ICOM_DCD)
0944 uart_handle_dcd_change(&icom_port->uart_port,
0945 delta_status & ICOM_DCD);
0946 if (delta_status & ICOM_CTS)
0947 uart_handle_cts_change(&icom_port->uart_port,
0948 delta_status & ICOM_CTS);
0949
0950 wake_up_interruptible(&icom_port->uart_port.state->
0951 port.delta_msr_wait);
0952 old_status = status;
0953 }
0954 spin_unlock(&icom_port->uart_port.lock);
0955 }
0956
0957 static void xmit_interrupt(u16 port_int_reg, struct icom_port *icom_port)
0958 {
0959 u16 count, i;
0960
0961 if (port_int_reg & (INT_XMIT_COMPLETED)) {
0962 trace(icom_port, "XMIT_COMPLETE", 0);
0963
0964
0965 icom_port->statStg->xmit[0].flags &=
0966 cpu_to_le16(~SA_FLAGS_READY_TO_XMIT);
0967
0968 count = le16_to_cpu(icom_port->statStg->xmit[0].leLength);
0969 icom_port->uart_port.icount.tx += count;
0970
0971 for (i=0; i<count &&
0972 !uart_circ_empty(&icom_port->uart_port.state->xmit); i++) {
0973
0974 icom_port->uart_port.state->xmit.tail++;
0975 icom_port->uart_port.state->xmit.tail &=
0976 (UART_XMIT_SIZE - 1);
0977 }
0978
0979 if (!icom_write(&icom_port->uart_port))
0980
0981 uart_write_wakeup(&icom_port->uart_port);
0982 } else
0983 trace(icom_port, "XMIT_DISABLED", 0);
0984 }
0985
0986 static void recv_interrupt(u16 port_int_reg, struct icom_port *icom_port)
0987 {
0988 short int count, rcv_buff;
0989 struct tty_port *port = &icom_port->uart_port.state->port;
0990 u16 status;
0991 struct uart_icount *icount;
0992 unsigned long offset;
0993 unsigned char flag;
0994
0995 trace(icom_port, "RCV_COMPLETE", 0);
0996 rcv_buff = icom_port->next_rcv;
0997
0998 status = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].flags);
0999 while (status & SA_FL_RCV_DONE) {
1000 int first = -1;
1001
1002 trace(icom_port, "FID_STATUS", status);
1003 count = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].leLength);
1004
1005 trace(icom_port, "RCV_COUNT", count);
1006
1007 trace(icom_port, "REAL_COUNT", count);
1008
1009 offset = le32_to_cpu(icom_port->statStg->rcv[rcv_buff].leBuffer) -
1010 icom_port->recv_buf_pci;
1011
1012
1013 if (count > 0) {
1014 first = icom_port->recv_buf[offset];
1015 tty_insert_flip_string(port, icom_port->recv_buf + offset, count - 1);
1016 }
1017
1018 icount = &icom_port->uart_port.icount;
1019 icount->rx += count;
1020
1021
1022 if ((status & SA_FLAGS_FRAME_ERROR)
1023 && first == 0) {
1024 status &= ~SA_FLAGS_FRAME_ERROR;
1025 status |= SA_FLAGS_BREAK_DET;
1026 trace(icom_port, "BREAK_DET", 0);
1027 }
1028
1029 flag = TTY_NORMAL;
1030
1031 if (status &
1032 (SA_FLAGS_BREAK_DET | SA_FLAGS_PARITY_ERROR |
1033 SA_FLAGS_FRAME_ERROR | SA_FLAGS_OVERRUN)) {
1034
1035 if (status & SA_FLAGS_BREAK_DET)
1036 icount->brk++;
1037 if (status & SA_FLAGS_PARITY_ERROR)
1038 icount->parity++;
1039 if (status & SA_FLAGS_FRAME_ERROR)
1040 icount->frame++;
1041 if (status & SA_FLAGS_OVERRUN)
1042 icount->overrun++;
1043
1044
1045
1046
1047
1048
1049 if (status & icom_port->ignore_status_mask) {
1050 trace(icom_port, "IGNORE_CHAR", 0);
1051 goto ignore_char;
1052 }
1053
1054 status &= icom_port->read_status_mask;
1055
1056 if (status & SA_FLAGS_BREAK_DET) {
1057 flag = TTY_BREAK;
1058 } else if (status & SA_FLAGS_PARITY_ERROR) {
1059 trace(icom_port, "PARITY_ERROR", 0);
1060 flag = TTY_PARITY;
1061 } else if (status & SA_FLAGS_FRAME_ERROR)
1062 flag = TTY_FRAME;
1063
1064 }
1065
1066 tty_insert_flip_char(port, *(icom_port->recv_buf + offset + count - 1), flag);
1067
1068 if (status & SA_FLAGS_OVERRUN)
1069
1070
1071
1072
1073
1074 tty_insert_flip_char(port, 0, TTY_OVERRUN);
1075 ignore_char:
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 =
1079 cpu_to_le16(RCV_BUFF_SZ);
1080
1081 rcv_buff++;
1082 if (rcv_buff == NUM_RBUFFS)
1083 rcv_buff = 0;
1084
1085 status = le16_to_cpu(icom_port->statStg->rcv[rcv_buff].flags);
1086 }
1087 icom_port->next_rcv = rcv_buff;
1088
1089 tty_flip_buffer_push(port);
1090 }
1091
1092 static void process_interrupt(u16 port_int_reg,
1093 struct icom_port *icom_port)
1094 {
1095
1096 spin_lock(&icom_port->uart_port.lock);
1097 trace(icom_port, "INTERRUPT", port_int_reg);
1098
1099 if (port_int_reg & (INT_XMIT_COMPLETED | INT_XMIT_DISABLED))
1100 xmit_interrupt(port_int_reg, icom_port);
1101
1102 if (port_int_reg & INT_RCV_COMPLETED)
1103 recv_interrupt(port_int_reg, icom_port);
1104
1105 spin_unlock(&icom_port->uart_port.lock);
1106 }
1107
1108 static irqreturn_t icom_interrupt(int irq, void *dev_id)
1109 {
1110 void __iomem * int_reg;
1111 u32 adapter_interrupts;
1112 u16 port_int_reg;
1113 struct icom_adapter *icom_adapter;
1114 struct icom_port *icom_port;
1115
1116
1117 icom_adapter = (struct icom_adapter *) dev_id;
1118
1119 if (icom_adapter->version == ADAPTER_V2) {
1120 int_reg = icom_adapter->base_addr + 0x8024;
1121
1122 adapter_interrupts = readl(int_reg);
1123
1124 if (adapter_interrupts & 0x00003FFF) {
1125
1126 icom_port = &icom_adapter->port_info[2];
1127 port_int_reg = (u16) adapter_interrupts;
1128 process_interrupt(port_int_reg, icom_port);
1129 check_modem_status(icom_port);
1130 }
1131 if (adapter_interrupts & 0x3FFF0000) {
1132
1133 icom_port = &icom_adapter->port_info[3];
1134 if (icom_port->status == ICOM_PORT_ACTIVE) {
1135 port_int_reg =
1136 (u16) (adapter_interrupts >> 16);
1137 process_interrupt(port_int_reg, icom_port);
1138 check_modem_status(icom_port);
1139 }
1140 }
1141
1142
1143 writel(adapter_interrupts, int_reg);
1144
1145 int_reg = icom_adapter->base_addr + 0x8004;
1146 } else {
1147 int_reg = icom_adapter->base_addr + 0x4004;
1148 }
1149
1150 adapter_interrupts = readl(int_reg);
1151
1152 if (adapter_interrupts & 0x00003FFF) {
1153
1154 icom_port = &icom_adapter->port_info[0];
1155 port_int_reg = (u16) adapter_interrupts;
1156 process_interrupt(port_int_reg, icom_port);
1157 check_modem_status(icom_port);
1158 }
1159 if (adapter_interrupts & 0x3FFF0000) {
1160
1161 icom_port = &icom_adapter->port_info[1];
1162 if (icom_port->status == ICOM_PORT_ACTIVE) {
1163 port_int_reg = (u16) (adapter_interrupts >> 16);
1164 process_interrupt(port_int_reg, icom_port);
1165 check_modem_status(icom_port);
1166 }
1167 }
1168
1169
1170 writel(adapter_interrupts, int_reg);
1171
1172
1173 adapter_interrupts = readl(int_reg);
1174
1175 return IRQ_HANDLED;
1176 }
1177
1178
1179
1180
1181
1182
1183 static unsigned int icom_tx_empty(struct uart_port *port)
1184 {
1185 struct icom_port *icom_port = to_icom_port(port);
1186 int ret;
1187 unsigned long flags;
1188
1189 spin_lock_irqsave(&port->lock, flags);
1190 if (le16_to_cpu(icom_port->statStg->xmit[0].flags) &
1191 SA_FLAGS_READY_TO_XMIT)
1192 ret = TIOCSER_TEMT;
1193 else
1194 ret = 0;
1195
1196 spin_unlock_irqrestore(&port->lock, flags);
1197 return ret;
1198 }
1199
1200 static void icom_set_mctrl(struct uart_port *port, unsigned int mctrl)
1201 {
1202 struct icom_port *icom_port = to_icom_port(port);
1203 unsigned char local_osr;
1204
1205 trace(icom_port, "SET_MODEM", 0);
1206 local_osr = readb(&icom_port->dram->osr);
1207
1208 if (mctrl & TIOCM_RTS) {
1209 trace(icom_port, "RAISE_RTS", 0);
1210 local_osr |= ICOM_RTS;
1211 } else {
1212 trace(icom_port, "LOWER_RTS", 0);
1213 local_osr &= ~ICOM_RTS;
1214 }
1215
1216 if (mctrl & TIOCM_DTR) {
1217 trace(icom_port, "RAISE_DTR", 0);
1218 local_osr |= ICOM_DTR;
1219 } else {
1220 trace(icom_port, "LOWER_DTR", 0);
1221 local_osr &= ~ICOM_DTR;
1222 }
1223
1224 writeb(local_osr, &icom_port->dram->osr);
1225 }
1226
1227 static unsigned int icom_get_mctrl(struct uart_port *port)
1228 {
1229 struct icom_port *icom_port = to_icom_port(port);
1230 unsigned char status;
1231 unsigned int result;
1232
1233 trace(icom_port, "GET_MODEM", 0);
1234
1235 status = readb(&icom_port->dram->isr);
1236
1237 result = ((status & ICOM_DCD) ? TIOCM_CAR : 0)
1238 | ((status & ICOM_RI) ? TIOCM_RNG : 0)
1239 | ((status & ICOM_DSR) ? TIOCM_DSR : 0)
1240 | ((status & ICOM_CTS) ? TIOCM_CTS : 0);
1241 return result;
1242 }
1243
1244 static void icom_stop_tx(struct uart_port *port)
1245 {
1246 struct icom_port *icom_port = to_icom_port(port);
1247 unsigned char cmdReg;
1248
1249 trace(icom_port, "STOP", 0);
1250 cmdReg = readb(&icom_port->dram->CmdReg);
1251 writeb(cmdReg | CMD_HOLD_XMIT, &icom_port->dram->CmdReg);
1252 }
1253
1254 static void icom_start_tx(struct uart_port *port)
1255 {
1256 struct icom_port *icom_port = to_icom_port(port);
1257 unsigned char cmdReg;
1258
1259 trace(icom_port, "START", 0);
1260 cmdReg = readb(&icom_port->dram->CmdReg);
1261 if ((cmdReg & CMD_HOLD_XMIT) == CMD_HOLD_XMIT)
1262 writeb(cmdReg & ~CMD_HOLD_XMIT,
1263 &icom_port->dram->CmdReg);
1264
1265 icom_write(port);
1266 }
1267
1268 static void icom_send_xchar(struct uart_port *port, char ch)
1269 {
1270 struct icom_port *icom_port = to_icom_port(port);
1271 unsigned char xdata;
1272 int index;
1273 unsigned long flags;
1274
1275 trace(icom_port, "SEND_XCHAR", ch);
1276
1277
1278 for (index = 0; index < 10; index++) {
1279 spin_lock_irqsave(&port->lock, flags);
1280 xdata = readb(&icom_port->dram->xchar);
1281 if (xdata == 0x00) {
1282 trace(icom_port, "QUICK_WRITE", 0);
1283 writeb(ch, &icom_port->dram->xchar);
1284
1285
1286 xdata = readb(&icom_port->dram->xchar);
1287 spin_unlock_irqrestore(&port->lock, flags);
1288 break;
1289 }
1290 spin_unlock_irqrestore(&port->lock, flags);
1291 msleep(10);
1292 }
1293 }
1294
1295 static void icom_stop_rx(struct uart_port *port)
1296 {
1297 struct icom_port *icom_port = to_icom_port(port);
1298 unsigned char cmdReg;
1299
1300 cmdReg = readb(&icom_port->dram->CmdReg);
1301 writeb(cmdReg & ~CMD_RCV_ENABLE, &icom_port->dram->CmdReg);
1302 }
1303
1304 static void icom_break(struct uart_port *port, int break_state)
1305 {
1306 struct icom_port *icom_port = to_icom_port(port);
1307 unsigned char cmdReg;
1308 unsigned long flags;
1309
1310 spin_lock_irqsave(&port->lock, flags);
1311 trace(icom_port, "BREAK", 0);
1312 cmdReg = readb(&icom_port->dram->CmdReg);
1313 if (break_state == -1) {
1314 writeb(cmdReg | CMD_SND_BREAK, &icom_port->dram->CmdReg);
1315 } else {
1316 writeb(cmdReg & ~CMD_SND_BREAK, &icom_port->dram->CmdReg);
1317 }
1318 spin_unlock_irqrestore(&port->lock, flags);
1319 }
1320
1321 static int icom_open(struct uart_port *port)
1322 {
1323 struct icom_port *icom_port = to_icom_port(port);
1324 int retval;
1325
1326 kref_get(&icom_port->adapter->kref);
1327 retval = startup(icom_port);
1328
1329 if (retval) {
1330 kref_put(&icom_port->adapter->kref, icom_kref_release);
1331 trace(icom_port, "STARTUP_ERROR", 0);
1332 return retval;
1333 }
1334
1335 return 0;
1336 }
1337
1338 static void icom_close(struct uart_port *port)
1339 {
1340 struct icom_port *icom_port = to_icom_port(port);
1341 unsigned char cmdReg;
1342
1343 trace(icom_port, "CLOSE", 0);
1344
1345
1346 cmdReg = readb(&icom_port->dram->CmdReg);
1347 writeb(cmdReg & ~CMD_RCV_ENABLE, &icom_port->dram->CmdReg);
1348
1349 shutdown(icom_port);
1350
1351 kref_put(&icom_port->adapter->kref, icom_kref_release);
1352 }
1353
1354 static void icom_set_termios(struct uart_port *port,
1355 struct ktermios *termios,
1356 struct ktermios *old_termios)
1357 {
1358 struct icom_port *icom_port = to_icom_port(port);
1359 int baud;
1360 unsigned cflag, iflag;
1361 char new_config2;
1362 char new_config3 = 0;
1363 char tmp_byte;
1364 int index;
1365 int rcv_buff, xmit_buff;
1366 unsigned long offset;
1367 unsigned long flags;
1368
1369 spin_lock_irqsave(&port->lock, flags);
1370 trace(icom_port, "CHANGE_SPEED", 0);
1371
1372 cflag = termios->c_cflag;
1373 iflag = termios->c_iflag;
1374
1375 new_config2 = ICOM_ACFG_DRIVE1;
1376
1377
1378 switch (cflag & CSIZE) {
1379 case CS5:
1380 new_config2 |= ICOM_ACFG_5BPC;
1381 break;
1382 case CS6:
1383 new_config2 |= ICOM_ACFG_6BPC;
1384 break;
1385 case CS7:
1386 new_config2 |= ICOM_ACFG_7BPC;
1387 break;
1388 case CS8:
1389 new_config2 |= ICOM_ACFG_8BPC;
1390 break;
1391 default:
1392 break;
1393 }
1394 if (cflag & CSTOPB) {
1395
1396 new_config2 |= ICOM_ACFG_2STOP_BIT;
1397 }
1398 if (cflag & PARENB) {
1399
1400 new_config2 |= ICOM_ACFG_PARITY_ENAB;
1401 trace(icom_port, "PARENB", 0);
1402 }
1403 if (cflag & PARODD) {
1404
1405 new_config2 |= ICOM_ACFG_PARITY_ODD;
1406 trace(icom_port, "PARODD", 0);
1407 }
1408
1409
1410 baud = uart_get_baud_rate(port, termios, old_termios,
1411 icom_acfg_baud[0],
1412 icom_acfg_baud[BAUD_TABLE_LIMIT]);
1413 if (!baud)
1414 baud = 9600;
1415
1416 for (index = 0; index < BAUD_TABLE_LIMIT; index++) {
1417 if (icom_acfg_baud[index] == baud) {
1418 new_config3 = index;
1419 break;
1420 }
1421 }
1422
1423 uart_update_timeout(port, cflag, baud);
1424
1425
1426 tmp_byte = readb(&(icom_port->dram->HDLCConfigReg));
1427 if (cflag & CRTSCTS)
1428 tmp_byte |= HDLC_HDW_FLOW;
1429 else
1430 tmp_byte &= ~HDLC_HDW_FLOW;
1431 writeb(tmp_byte, &(icom_port->dram->HDLCConfigReg));
1432
1433
1434
1435
1436 icom_port->read_status_mask = SA_FLAGS_OVERRUN | SA_FL_RCV_DONE;
1437 if (iflag & INPCK)
1438 icom_port->read_status_mask |=
1439 SA_FLAGS_FRAME_ERROR | SA_FLAGS_PARITY_ERROR;
1440
1441 if ((iflag & BRKINT) || (iflag & PARMRK))
1442 icom_port->read_status_mask |= SA_FLAGS_BREAK_DET;
1443
1444
1445
1446
1447 icom_port->ignore_status_mask = 0;
1448 if (iflag & IGNPAR)
1449 icom_port->ignore_status_mask |=
1450 SA_FLAGS_PARITY_ERROR | SA_FLAGS_FRAME_ERROR;
1451 if (iflag & IGNBRK) {
1452 icom_port->ignore_status_mask |= SA_FLAGS_BREAK_DET;
1453
1454
1455
1456
1457 if (iflag & IGNPAR)
1458 icom_port->ignore_status_mask |= SA_FLAGS_OVERRUN;
1459 }
1460
1461
1462
1463
1464 if ((cflag & CREAD) == 0)
1465 icom_port->ignore_status_mask |= SA_FL_RCV_DONE;
1466
1467
1468 writeb(CMD_RCV_DISABLE, &icom_port->dram->CmdReg);
1469
1470 for (index = 0; index < 10; index++) {
1471 if (readb(&icom_port->dram->PrevCmdReg) == 0x00) {
1472 break;
1473 }
1474 }
1475
1476
1477 for (rcv_buff = 0; rcv_buff < NUM_RBUFFS; rcv_buff++) {
1478 icom_port->statStg->rcv[rcv_buff].flags = 0;
1479 icom_port->statStg->rcv[rcv_buff].leLength = 0;
1480 icom_port->statStg->rcv[rcv_buff].WorkingLength =
1481 cpu_to_le16(RCV_BUFF_SZ);
1482 }
1483
1484 for (xmit_buff = 0; xmit_buff < NUM_XBUFFS; xmit_buff++) {
1485 icom_port->statStg->xmit[xmit_buff].flags = 0;
1486 }
1487
1488
1489
1490 writeb(new_config3, &(icom_port->dram->async_config3));
1491 writeb(new_config2, &(icom_port->dram->async_config2));
1492 tmp_byte = readb(&(icom_port->dram->HDLCConfigReg));
1493 tmp_byte |= HDLC_PPP_PURE_ASYNC | HDLC_FF_FILL;
1494 writeb(tmp_byte, &(icom_port->dram->HDLCConfigReg));
1495 writeb(0x04, &(icom_port->dram->FlagFillIdleTimer));
1496 writeb(0xFF, &(icom_port->dram->ier));
1497
1498
1499 writeb(CMD_RESTART, &icom_port->dram->CmdReg);
1500
1501 for (index = 0; index < 10; index++) {
1502 if (readb(&icom_port->dram->CmdReg) == 0x00) {
1503 break;
1504 }
1505 }
1506
1507
1508 offset =
1509 (unsigned long) &icom_port->statStg->rcv[0] -
1510 (unsigned long) icom_port->statStg;
1511 writel(icom_port->statStg_pci + offset,
1512 &icom_port->dram->RcvStatusAddr);
1513 icom_port->next_rcv = 0;
1514 *icom_port->xmitRestart = 0;
1515 writel(icom_port->xmitRestart_pci,
1516 &icom_port->dram->XmitStatusAddr);
1517 trace(icom_port, "XR_ENAB", 0);
1518 writeb(CMD_XMIT_RCV_ENABLE, &icom_port->dram->CmdReg);
1519
1520 spin_unlock_irqrestore(&port->lock, flags);
1521 }
1522
1523 static const char *icom_type(struct uart_port *port)
1524 {
1525 return "icom";
1526 }
1527
1528 static void icom_config_port(struct uart_port *port, int flags)
1529 {
1530 port->type = PORT_ICOM;
1531 }
1532
1533 static const struct uart_ops icom_ops = {
1534 .tx_empty = icom_tx_empty,
1535 .set_mctrl = icom_set_mctrl,
1536 .get_mctrl = icom_get_mctrl,
1537 .stop_tx = icom_stop_tx,
1538 .start_tx = icom_start_tx,
1539 .send_xchar = icom_send_xchar,
1540 .stop_rx = icom_stop_rx,
1541 .break_ctl = icom_break,
1542 .startup = icom_open,
1543 .shutdown = icom_close,
1544 .set_termios = icom_set_termios,
1545 .type = icom_type,
1546 .config_port = icom_config_port,
1547 };
1548
1549 #define ICOM_CONSOLE NULL
1550
1551 static struct uart_driver icom_uart_driver = {
1552 .owner = THIS_MODULE,
1553 .driver_name = ICOM_DRIVER_NAME,
1554 .dev_name = "ttyA",
1555 .major = ICOM_MAJOR,
1556 .minor = ICOM_MINOR_START,
1557 .nr = NR_PORTS,
1558 .cons = ICOM_CONSOLE,
1559 };
1560
1561 static int icom_init_ports(struct icom_adapter *icom_adapter)
1562 {
1563 u32 subsystem_id = icom_adapter->subsystem_id;
1564 int i;
1565 struct icom_port *icom_port;
1566
1567 if (icom_adapter->version == ADAPTER_V1) {
1568 icom_adapter->numb_ports = 2;
1569
1570 for (i = 0; i < 2; i++) {
1571 icom_port = &icom_adapter->port_info[i];
1572 icom_port->port = i;
1573 icom_port->status = ICOM_PORT_ACTIVE;
1574 }
1575 } else {
1576 if (subsystem_id == PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL) {
1577 icom_adapter->numb_ports = 4;
1578
1579 for (i = 0; i < 4; i++) {
1580 icom_port = &icom_adapter->port_info[i];
1581
1582 icom_port->port = i;
1583 icom_port->status = ICOM_PORT_ACTIVE;
1584 }
1585 } else {
1586 icom_adapter->numb_ports = 4;
1587
1588 icom_adapter->port_info[0].port = 0;
1589 icom_adapter->port_info[0].status = ICOM_PORT_ACTIVE;
1590 icom_adapter->port_info[1].status = ICOM_PORT_OFF;
1591 icom_adapter->port_info[2].port = 2;
1592 icom_adapter->port_info[2].status = ICOM_PORT_ACTIVE;
1593 icom_adapter->port_info[3].status = ICOM_PORT_OFF;
1594 }
1595 }
1596
1597 return 0;
1598 }
1599
1600 static void icom_port_active(struct icom_port *icom_port, struct icom_adapter *icom_adapter, int port_num)
1601 {
1602 if (icom_adapter->version == ADAPTER_V1) {
1603 icom_port->global_reg = icom_adapter->base_addr + 0x4000;
1604 icom_port->int_reg = icom_adapter->base_addr +
1605 0x4004 + 2 - 2 * port_num;
1606 } else {
1607 icom_port->global_reg = icom_adapter->base_addr + 0x8000;
1608 if (icom_port->port < 2)
1609 icom_port->int_reg = icom_adapter->base_addr +
1610 0x8004 + 2 - 2 * icom_port->port;
1611 else
1612 icom_port->int_reg = icom_adapter->base_addr +
1613 0x8024 + 2 - 2 * (icom_port->port - 2);
1614 }
1615 }
1616 static int icom_load_ports(struct icom_adapter *icom_adapter)
1617 {
1618 struct icom_port *icom_port;
1619 int port_num;
1620
1621 for (port_num = 0; port_num < icom_adapter->numb_ports; port_num++) {
1622
1623 icom_port = &icom_adapter->port_info[port_num];
1624
1625 if (icom_port->status == ICOM_PORT_ACTIVE) {
1626 icom_port_active(icom_port, icom_adapter, port_num);
1627 icom_port->dram = icom_adapter->base_addr +
1628 0x2000 * icom_port->port;
1629
1630 icom_port->adapter = icom_adapter;
1631
1632
1633 if (get_port_memory(icom_port) != 0) {
1634 dev_err(&icom_port->adapter->pci_dev->dev,
1635 "Memory allocation for port FAILED\n");
1636 }
1637 }
1638 }
1639 return 0;
1640 }
1641
1642 static int icom_alloc_adapter(struct icom_adapter
1643 **icom_adapter_ref)
1644 {
1645 int adapter_count = 0;
1646 struct icom_adapter *icom_adapter;
1647 struct icom_adapter *cur_adapter_entry;
1648
1649 icom_adapter = kzalloc(sizeof(struct icom_adapter), GFP_KERNEL);
1650
1651 if (!icom_adapter) {
1652 return -ENOMEM;
1653 }
1654
1655 list_for_each_entry(cur_adapter_entry, &icom_adapter_head,
1656 icom_adapter_entry) {
1657 if (cur_adapter_entry->index != adapter_count) {
1658 break;
1659 }
1660 adapter_count++;
1661 }
1662
1663 icom_adapter->index = adapter_count;
1664 list_add_tail(&icom_adapter->icom_adapter_entry,
1665 &cur_adapter_entry->icom_adapter_entry);
1666
1667 *icom_adapter_ref = icom_adapter;
1668 return 0;
1669 }
1670
1671 static void icom_free_adapter(struct icom_adapter *icom_adapter)
1672 {
1673 list_del(&icom_adapter->icom_adapter_entry);
1674 kfree(icom_adapter);
1675 }
1676
1677 static void icom_kref_release(struct kref *kref)
1678 {
1679 struct icom_adapter *icom_adapter = container_of(kref,
1680 struct icom_adapter, kref);
1681 struct icom_port *icom_port;
1682 int index;
1683
1684 for (index = 0; index < icom_adapter->numb_ports; index++) {
1685 icom_port = &icom_adapter->port_info[index];
1686
1687 if (icom_port->status == ICOM_PORT_ACTIVE) {
1688 dev_info(&icom_adapter->pci_dev->dev,
1689 "Device removed\n");
1690
1691 uart_remove_one_port(&icom_uart_driver,
1692 &icom_port->uart_port);
1693
1694
1695 writeb(0x00, &icom_port->dram->osr);
1696
1697
1698 msleep(100);
1699
1700
1701 stop_processor(icom_port);
1702
1703 free_port_memory(icom_port);
1704 }
1705 }
1706
1707 free_irq(icom_adapter->pci_dev->irq, (void *) icom_adapter);
1708 iounmap(icom_adapter->base_addr);
1709 pci_release_regions(icom_adapter->pci_dev);
1710 icom_free_adapter(icom_adapter);
1711 }
1712
1713 static int icom_probe(struct pci_dev *dev,
1714 const struct pci_device_id *ent)
1715 {
1716 int index;
1717 unsigned int command_reg;
1718 int retval;
1719 struct icom_adapter *icom_adapter;
1720 struct icom_port *icom_port;
1721
1722 retval = pci_enable_device(dev);
1723 if (retval) {
1724 dev_err(&dev->dev, "Device enable FAILED\n");
1725 return retval;
1726 }
1727
1728 retval = pci_request_regions(dev, "icom");
1729 if (retval) {
1730 dev_err(&dev->dev, "pci_request_regions FAILED\n");
1731 pci_disable_device(dev);
1732 return retval;
1733 }
1734
1735 pci_set_master(dev);
1736
1737 retval = pci_read_config_dword(dev, PCI_COMMAND, &command_reg);
1738 if (retval) {
1739 dev_err(&dev->dev, "PCI Config read FAILED\n");
1740 goto probe_exit0;
1741 }
1742
1743 pci_write_config_dword(dev, PCI_COMMAND,
1744 command_reg | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER
1745 | PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
1746
1747 if (ent->driver_data == ADAPTER_V1) {
1748 pci_write_config_dword(dev, 0x44, 0x8300830A);
1749 } else {
1750 pci_write_config_dword(dev, 0x44, 0x42004200);
1751 pci_write_config_dword(dev, 0x48, 0x42004200);
1752 }
1753
1754
1755 retval = icom_alloc_adapter(&icom_adapter);
1756 if (retval) {
1757 dev_err(&dev->dev, "icom_alloc_adapter FAILED\n");
1758 retval = -EIO;
1759 goto probe_exit0;
1760 }
1761
1762 icom_adapter->base_addr_pci = pci_resource_start(dev, 0);
1763 icom_adapter->pci_dev = dev;
1764 icom_adapter->version = ent->driver_data;
1765 icom_adapter->subsystem_id = ent->subdevice;
1766
1767
1768 retval = icom_init_ports(icom_adapter);
1769 if (retval) {
1770 dev_err(&dev->dev, "Port configuration failed\n");
1771 goto probe_exit1;
1772 }
1773
1774 icom_adapter->base_addr = pci_ioremap_bar(dev, 0);
1775
1776 if (!icom_adapter->base_addr) {
1777 retval = -ENOMEM;
1778 goto probe_exit1;
1779 }
1780
1781
1782 retval = request_irq(dev->irq, icom_interrupt, IRQF_SHARED, ICOM_DRIVER_NAME, (void *)icom_adapter);
1783 if (retval) {
1784 goto probe_exit2;
1785 }
1786
1787 retval = icom_load_ports(icom_adapter);
1788
1789 for (index = 0; index < icom_adapter->numb_ports; index++) {
1790 icom_port = &icom_adapter->port_info[index];
1791
1792 if (icom_port->status == ICOM_PORT_ACTIVE) {
1793 icom_port->uart_port.irq = icom_port->adapter->pci_dev->irq;
1794 icom_port->uart_port.type = PORT_ICOM;
1795 icom_port->uart_port.iotype = UPIO_MEM;
1796 icom_port->uart_port.membase =
1797 (unsigned char __iomem *)icom_adapter->base_addr_pci;
1798 icom_port->uart_port.fifosize = 16;
1799 icom_port->uart_port.ops = &icom_ops;
1800 icom_port->uart_port.line =
1801 icom_port->port + icom_adapter->index * 4;
1802 if (uart_add_one_port (&icom_uart_driver, &icom_port->uart_port)) {
1803 icom_port->status = ICOM_PORT_OFF;
1804 dev_err(&dev->dev, "Device add failed\n");
1805 } else
1806 dev_info(&dev->dev, "Device added\n");
1807 }
1808 }
1809
1810 kref_init(&icom_adapter->kref);
1811 return 0;
1812
1813 probe_exit2:
1814 iounmap(icom_adapter->base_addr);
1815 probe_exit1:
1816 icom_free_adapter(icom_adapter);
1817
1818 probe_exit0:
1819 pci_release_regions(dev);
1820 pci_disable_device(dev);
1821
1822 return retval;
1823 }
1824
1825 static void icom_remove(struct pci_dev *dev)
1826 {
1827 struct icom_adapter *icom_adapter;
1828
1829 list_for_each_entry(icom_adapter, &icom_adapter_head,
1830 icom_adapter_entry) {
1831 if (icom_adapter->pci_dev == dev) {
1832 kref_put(&icom_adapter->kref, icom_kref_release);
1833 return;
1834 }
1835 }
1836
1837 dev_err(&dev->dev, "Unable to find device to remove\n");
1838 }
1839
1840 static struct pci_driver icom_pci_driver = {
1841 .name = ICOM_DRIVER_NAME,
1842 .id_table = icom_pci_table,
1843 .probe = icom_probe,
1844 .remove = icom_remove,
1845 };
1846
1847 static int __init icom_init(void)
1848 {
1849 int ret;
1850
1851 ret = uart_register_driver(&icom_uart_driver);
1852 if (ret)
1853 return ret;
1854
1855 ret = pci_register_driver(&icom_pci_driver);
1856
1857 if (ret < 0)
1858 uart_unregister_driver(&icom_uart_driver);
1859
1860 return ret;
1861 }
1862
1863 static void __exit icom_exit(void)
1864 {
1865 pci_unregister_driver(&icom_pci_driver);
1866 uart_unregister_driver(&icom_uart_driver);
1867 }
1868
1869 module_init(icom_init);
1870 module_exit(icom_exit);
1871
1872 MODULE_AUTHOR("Michael Anderson <mjanders@us.ibm.com>");
1873 MODULE_DESCRIPTION("IBM iSeries Serial IOA driver");
1874 MODULE_LICENSE("GPL");
1875 MODULE_FIRMWARE("icom_call_setup.bin");
1876 MODULE_FIRMWARE("icom_res_dce.bin");
1877 MODULE_FIRMWARE("icom_asc.bin");