aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/mxser_new.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/mxser_new.c')
-rw-r--r--drivers/char/mxser_new.c276
1 files changed, 109 insertions, 167 deletions
diff --git a/drivers/char/mxser_new.c b/drivers/char/mxser_new.c
index e665dfccd956..82cb420b4d68 100644
--- a/drivers/char/mxser_new.c
+++ b/drivers/char/mxser_new.c
@@ -84,97 +84,11 @@
84#define CI134_ASIC_ID 3 84#define CI134_ASIC_ID 3
85#define CI104J_ASIC_ID 5 85#define CI104J_ASIC_ID 5
86 86
87enum { 87#define MXSER_HIGHBAUD 1
88 MXSER_BOARD_C168_ISA = 1, 88#define MXSER_HAS2 2
89 MXSER_BOARD_C104_ISA,
90 MXSER_BOARD_CI104J,
91 MXSER_BOARD_C168_PCI,
92 MXSER_BOARD_C104_PCI,
93 MXSER_BOARD_C102_ISA,
94 MXSER_BOARD_CI132,
95 MXSER_BOARD_CI134,
96 MXSER_BOARD_CP132,
97 MXSER_BOARD_CP114,
98 MXSER_BOARD_CT114,
99 MXSER_BOARD_CP102,
100 MXSER_BOARD_CP104U,
101 MXSER_BOARD_CP168U,
102 MXSER_BOARD_CP132U,
103 MXSER_BOARD_CP134U,
104 MXSER_BOARD_CP104JU,
105 MXSER_BOARD_RC7000,
106 MXSER_BOARD_CP118U,
107 MXSER_BOARD_CP102UL,
108 MXSER_BOARD_CP102U,
109 MXSER_BOARD_CP118EL,
110 MXSER_BOARD_CP168EL,
111 MXSER_BOARD_CP104EL
112};
113
114static char *mxser_brdname[] = {
115 "C168 series",
116 "C104 series",
117 "CI-104J series",
118 "C168H/PCI series",
119 "C104H/PCI series",
120 "C102 series",
121 "CI-132 series",
122 "CI-134 series",
123 "CP-132 series",
124 "CP-114 series",
125 "CT-114 series",
126 "CP-102 series",
127 "CP-104U series",
128 "CP-168U series",
129 "CP-132U series",
130 "CP-134U series",
131 "CP-104JU series",
132 "Moxa UC7000 Serial",
133 "CP-118U series",
134 "CP-102UL series",
135 "CP-102U series",
136 "CP-118EL series",
137 "CP-168EL series",
138 "CP-104EL series"
139};
140
141static int mxser_numports[] = {
142 8, /* C168-ISA */
143 4, /* C104-ISA */
144 4, /* CI104J */
145 8, /* C168-PCI */
146 4, /* C104-PCI */
147 2, /* C102-ISA */
148 2, /* CI132 */
149 4, /* CI134 */
150 2, /* CP132 */
151 4, /* CP114 */
152 4, /* CT114 */
153 2, /* CP102 */
154 4, /* CP104U */
155 8, /* CP168U */
156 2, /* CP132U */
157 4, /* CP134U */
158 4, /* CP104JU */
159 8, /* RC7000 */
160 8, /* CP118U */
161 2, /* CP102UL */
162 2, /* CP102U */
163 8, /* CP118EL */
164 8, /* CP168EL */
165 4 /* CP104EL */
166};
167
168#define UART_TYPE_NUM 2
169
170static const unsigned int Gmoxa_uart_id[UART_TYPE_NUM] = {
171 MOXA_MUST_MU150_HWID,
172 MOXA_MUST_MU860_HWID
173};
174 89
175/* This is only for PCI */ 90/* This is only for PCI */
176#define UART_INFO_NUM 3 91static const struct {
177struct mxpciuart_info {
178 int type; 92 int type;
179 int tx_fifo; 93 int tx_fifo;
180 int rx_fifo; 94 int rx_fifo;
@@ -183,51 +97,85 @@ struct mxpciuart_info {
183 int rx_trigger; 97 int rx_trigger;
184 int rx_low_water; 98 int rx_low_water;
185 long max_baud; 99 long max_baud;
186}; 100} Gpci_uart_info[] = {
187
188static const struct mxpciuart_info Gpci_uart_info[UART_INFO_NUM] = {
189 {MOXA_OTHER_UART, 16, 16, 16, 14, 14, 1, 921600L}, 101 {MOXA_OTHER_UART, 16, 16, 16, 14, 14, 1, 921600L},
190 {MOXA_MUST_MU150_HWID, 64, 64, 64, 48, 48, 16, 230400L}, 102 {MOXA_MUST_MU150_HWID, 64, 64, 64, 48, 48, 16, 230400L},
191 {MOXA_MUST_MU860_HWID, 128, 128, 128, 96, 96, 32, 921600L} 103 {MOXA_MUST_MU860_HWID, 128, 128, 128, 96, 96, 32, 921600L}
192}; 104};
105#define UART_INFO_NUM ARRAY_SIZE(Gpci_uart_info)
106
107struct mxser_cardinfo {
108 unsigned int nports;
109 char *name;
110 unsigned int flags;
111};
112
113static const struct mxser_cardinfo mxser_cards[] = {
114 { 8, "C168 series", }, /* C168-ISA */
115 { 4, "C104 series", }, /* C104-ISA */
116 { 4, "CI-104J series", }, /* CI104J */
117 { 8, "C168H/PCI series", }, /* C168-PCI */
118 { 4, "C104H/PCI series", }, /* C104-PCI */
119 { 4, "C102 series", MXSER_HAS2 }, /* C102-ISA */
120 { 4, "CI-132 series", MXSER_HAS2 }, /* CI132 */
121 { 4, "CI-134 series", }, /* CI134 */
122 { 2, "CP-132 series", }, /* CP132 */
123 { 4, "CP-114 series", }, /* CP114 */
124 { 4, "CT-114 series", }, /* CT114 */
125 { 2, "CP-102 series", MXSER_HIGHBAUD }, /* CP102 */
126 { 4, "CP-104U series", }, /* CP104U */
127 { 8, "CP-168U series", }, /* CP168U */
128 { 2, "CP-132U series", }, /* CP132U */
129 { 4, "CP-134U series", }, /* CP134U */
130 { 4, "CP-104JU series", }, /* CP104JU */
131 { 8, "Moxa UC7000 Serial", }, /* RC7000 */
132 { 8, "CP-118U series", }, /* CP118U */
133 { 2, "CP-102UL series", }, /* CP102UL */
134 { 2, "CP-102U series", }, /* CP102U */
135 { 8, "CP-118EL series", }, /* CP118EL */
136 { 8, "CP-168EL series", }, /* CP168EL */
137 { 4, "CP-104EL series", } /* CP104EL */
138};
193 139
140/* driver_data correspond to the lines in the structure above
141 see also ISA probe function before you change something */
194static struct pci_device_id mxser_pcibrds[] = { 142static struct pci_device_id mxser_pcibrds[] = {
195 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C168), 143 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C168),
196 .driver_data = MXSER_BOARD_C168_PCI }, 144 .driver_data = 3 },
197 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C104), 145 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C104),
198 .driver_data = MXSER_BOARD_C104_PCI }, 146 .driver_data = 4 },
199 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP132), 147 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP132),
200 .driver_data = MXSER_BOARD_CP132 }, 148 .driver_data = 8 },
201 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP114), 149 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP114),
202 .driver_data = MXSER_BOARD_CP114 }, 150 .driver_data = 9 },
203 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CT114), 151 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CT114),
204 .driver_data = MXSER_BOARD_CT114 }, 152 .driver_data = 10 },
205 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102), 153 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102),
206 .driver_data = MXSER_BOARD_CP102 }, 154 .driver_data = 11 },
207 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104U), 155 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104U),
208 .driver_data = MXSER_BOARD_CP104U }, 156 .driver_data = 12 },
209 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP168U), 157 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP168U),
210 .driver_data = MXSER_BOARD_CP168U }, 158 .driver_data = 13 },
211 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP132U), 159 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP132U),
212 .driver_data = MXSER_BOARD_CP132U }, 160 .driver_data = 14 },
213 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP134U), 161 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP134U),
214 .driver_data = MXSER_BOARD_CP134U }, 162 .driver_data = 15 },
215 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104JU), 163 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104JU),
216 .driver_data = MXSER_BOARD_CP104JU }, 164 .driver_data = 16 },
217 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_RC7000), 165 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_RC7000),
218 .driver_data = MXSER_BOARD_RC7000 }, 166 .driver_data = 17 },
219 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118U), 167 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118U),
220 .driver_data = MXSER_BOARD_CP118U }, 168 .driver_data = 18 },
221 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102UL), 169 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102UL),
222 .driver_data = MXSER_BOARD_CP102UL }, 170 .driver_data = 19 },
223 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102U), 171 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP102U),
224 .driver_data = MXSER_BOARD_CP102U }, 172 .driver_data = 20 },
225 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118EL), 173 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP118EL),
226 .driver_data = MXSER_BOARD_CP118EL }, 174 .driver_data = 21 },
227 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP168EL), 175 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP168EL),
228 .driver_data = MXSER_BOARD_CP168EL }, 176 .driver_data = 22 },
229 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104EL), 177 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP104EL),
230 .driver_data = MXSER_BOARD_CP104EL }, 178 .driver_data = 23 },
231 { } 179 { }
232}; 180};
233MODULE_DEVICE_TABLE(pci, mxser_pcibrds); 181MODULE_DEVICE_TABLE(pci, mxser_pcibrds);
@@ -338,8 +286,7 @@ struct mxser_board {
338 struct pci_dev *pdev; /* temporary (until pci probing) */ 286 struct pci_dev *pdev; /* temporary (until pci probing) */
339 287
340 int irq; 288 int irq;
341 int board_type; 289 const struct mxser_cardinfo *info;
342 unsigned int nports;
343 unsigned long vector; 290 unsigned long vector;
344 unsigned long vector_mask; 291 unsigned long vector_mask;
345 292
@@ -392,8 +339,8 @@ static int CheckIsMoxaMust(int io)
392 } 339 }
393 340
394 GET_MOXA_MUST_HARDWARE_ID(io, &hwid); 341 GET_MOXA_MUST_HARDWARE_ID(io, &hwid);
395 for (i = 0; i < UART_TYPE_NUM; i++) { 342 for (i = 1; i < UART_INFO_NUM; i++) { /* 0 = OTHER_UART */
396 if (hwid == Gmoxa_uart_id[i]) 343 if (hwid == Gpci_uart_info[i].type)
397 return (int)hwid; 344 return (int)hwid;
398 } 345 }
399 return MOXA_OTHER_UART; 346 return MOXA_OTHER_UART;
@@ -2447,7 +2394,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
2447 goto irq_stop; 2394 goto irq_stop;
2448 if (brd == NULL) 2395 if (brd == NULL)
2449 goto irq_stop; 2396 goto irq_stop;
2450 max = mxser_numports[brd->board_type - 1]; 2397 max = brd->info->nports;
2451 while (1) { 2398 while (1) {
2452 irqbits = inb(brd->vector) & brd->vector_mask; 2399 irqbits = inb(brd->vector) & brd->vector_mask;
2453 if (irqbits == brd->vector_mask) 2400 if (irqbits == brd->vector_mask)
@@ -2574,7 +2521,7 @@ static void mxser_release_res(struct mxser_board *brd, unsigned int irq)
2574 pci_release_region(pdev, 3); 2521 pci_release_region(pdev, 3);
2575 pci_dev_put(pdev); 2522 pci_dev_put(pdev);
2576 } else { 2523 } else {
2577 release_region(brd->ports[0].ioaddr, 8 * brd->nports); 2524 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
2578 release_region(brd->vector, 1); 2525 release_region(brd->vector, 1);
2579 } 2526 }
2580} 2527}
@@ -2587,7 +2534,7 @@ static int __devinit mxser_initbrd(struct mxser_board *brd)
2587 2534
2588 printk(KERN_INFO "max. baud rate = %d bps.\n", brd->ports[0].max_baud); 2535 printk(KERN_INFO "max. baud rate = %d bps.\n", brd->ports[0].max_baud);
2589 2536
2590 for (i = 0; i < brd->nports; i++) { 2537 for (i = 0; i < brd->info->nports; i++) {
2591 info = &brd->ports[i]; 2538 info = &brd->ports[i];
2592 info->board = brd; 2539 info->board = brd;
2593 info->stop_rx = 0; 2540 info->stop_rx = 0;
@@ -2628,7 +2575,7 @@ static int __devinit mxser_initbrd(struct mxser_board *brd)
2628 if (retval) { 2575 if (retval) {
2629 printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may " 2576 printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may "
2630 "conflict with another device.\n", 2577 "conflict with another device.\n",
2631 mxser_brdname[brd->board_type - 1], brd->irq); 2578 brd->info->name, brd->irq);
2632 /* We hold resources, we need to release them. */ 2579 /* We hold resources, we need to release them. */
2633 mxser_release_res(brd, 0); 2580 mxser_release_res(brd, 0);
2634 return retval; 2581 return retval;
@@ -2645,40 +2592,44 @@ static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd)
2645 brd->chip_flag = MOXA_OTHER_UART; 2592 brd->chip_flag = MOXA_OTHER_UART;
2646 2593
2647 id = mxser_read_register(cap, regs); 2594 id = mxser_read_register(cap, regs);
2648 if (id == C168_ASIC_ID) { 2595 switch (id) {
2649 brd->board_type = MXSER_BOARD_C168_ISA; 2596 case C168_ASIC_ID:
2650 brd->nports = 8; 2597 brd->info = &mxser_cards[0];
2651 } else if (id == C104_ASIC_ID) { 2598 break;
2652 brd->board_type = MXSER_BOARD_C104_ISA; 2599 case C104_ASIC_ID:
2653 brd->nports = 4; 2600 brd->info = &mxser_cards[1];
2654 } else if (id == C102_ASIC_ID) { 2601 break;
2655 brd->board_type = MXSER_BOARD_C102_ISA; 2602 case CI104J_ASIC_ID:
2656 brd->nports = 2; 2603 brd->info = &mxser_cards[2];
2657 } else if (id == CI132_ASIC_ID) { 2604 break;
2658 brd->board_type = MXSER_BOARD_CI132; 2605 case C102_ASIC_ID:
2659 brd->nports = 2; 2606 brd->info = &mxser_cards[5];
2660 } else if (id == CI134_ASIC_ID) { 2607 break;
2661 brd->board_type = MXSER_BOARD_CI134; 2608 case CI132_ASIC_ID:
2662 brd->nports = 4; 2609 brd->info = &mxser_cards[6];
2663 } else if (id == CI104J_ASIC_ID) { 2610 break;
2664 brd->board_type = MXSER_BOARD_CI104J; 2611 case CI134_ASIC_ID:
2665 brd->nports = 4; 2612 brd->info = &mxser_cards[7];
2666 } else 2613 break;
2614 default:
2667 return 0; 2615 return 0;
2616 }
2668 2617
2669 irq = 0; 2618 irq = 0;
2670 if (brd->nports == 2) { 2619 /* some ISA cards have 2 ports, but we want to see them as 4-port (why?)
2620 Flag-hack checks if configuration should be read as 2-port here. */
2621 if (brd->info->nports == 2 || (brd->info->flags & MXSER_HAS2)) {
2671 irq = regs[9] & 0xF000; 2622 irq = regs[9] & 0xF000;
2672 irq = irq | (irq >> 4); 2623 irq = irq | (irq >> 4);
2673 if (irq != (regs[9] & 0xFF00)) 2624 if (irq != (regs[9] & 0xFF00))
2674 return MXSER_ERR_IRQ_CONFLIT; 2625 return MXSER_ERR_IRQ_CONFLIT;
2675 } else if (brd->nports == 4) { 2626 } else if (brd->info->nports == 4) {
2676 irq = regs[9] & 0xF000; 2627 irq = regs[9] & 0xF000;
2677 irq = irq | (irq >> 4); 2628 irq = irq | (irq >> 4);
2678 irq = irq | (irq >> 8); 2629 irq = irq | (irq >> 8);
2679 if (irq != regs[9]) 2630 if (irq != regs[9])
2680 return MXSER_ERR_IRQ_CONFLIT; 2631 return MXSER_ERR_IRQ_CONFLIT;
2681 } else if (brd->nports == 8) { 2632 } else if (brd->info->nports == 8) {
2682 irq = regs[9] & 0xF000; 2633 irq = regs[9] & 0xF000;
2683 irq = irq | (irq >> 4); 2634 irq = irq | (irq >> 4);
2684 irq = irq | (irq >> 8); 2635 irq = irq | (irq >> 8);
@@ -2718,35 +2669,31 @@ static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd)
2718 brd->uart_type = PORT_16550A; 2669 brd->uart_type = PORT_16550A;
2719 else 2670 else
2720 brd->uart_type = PORT_16450; 2671 brd->uart_type = PORT_16450;
2721 if (id == 1) 2672 if (!request_region(brd->ports[0].ioaddr, 8 * brd->info->nports,
2722 brd->nports = 8; 2673 "mxser(IO)"))
2723 else
2724 brd->nports = 4;
2725 if (!request_region(brd->ports[0].ioaddr, 8 * brd->nports, "mxser(IO)"))
2726 return MXSER_ERR_IOADDR; 2674 return MXSER_ERR_IOADDR;
2727 if (!request_region(brd->vector, 1, "mxser(vector)")) { 2675 if (!request_region(brd->vector, 1, "mxser(vector)")) {
2728 release_region(brd->ports[0].ioaddr, 8 * brd->nports); 2676 release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
2729 return MXSER_ERR_VECTOR; 2677 return MXSER_ERR_VECTOR;
2730 } 2678 }
2731 return brd->nports; 2679 return brd->info->nports;
2732} 2680}
2733 2681
2734static int __init mxser_get_PCI_conf(int board_type, struct mxser_board *brd, 2682static int __init mxser_get_PCI_conf(const struct pci_device_id *ent,
2735 struct pci_dev *pdev) 2683 struct mxser_board *brd, struct pci_dev *pdev)
2736{ 2684{
2737 unsigned int i, j; 2685 unsigned int i, j;
2738 unsigned long ioaddress; 2686 unsigned long ioaddress;
2739 int retval; 2687 int retval;
2740 2688
2741 /* io address */ 2689 /* io address */
2742 brd->board_type = board_type; 2690 brd->info = &mxser_cards[ent->driver_data];
2743 brd->nports = mxser_numports[board_type - 1];
2744 ioaddress = pci_resource_start(pdev, 2); 2691 ioaddress = pci_resource_start(pdev, 2);
2745 retval = pci_request_region(pdev, 2, "mxser(IO)"); 2692 retval = pci_request_region(pdev, 2, "mxser(IO)");
2746 if (retval) 2693 if (retval)
2747 goto err; 2694 goto err;
2748 2695
2749 for (i = 0; i < brd->nports; i++) 2696 for (i = 0; i < brd->info->nports; i++)
2750 brd->ports[i].ioaddr = ioaddress + 8 * i; 2697 brd->ports[i].ioaddr = ioaddress + 8 * i;
2751 2698
2752 /* vector */ 2699 /* vector */
@@ -2763,14 +2710,14 @@ static int __init mxser_get_PCI_conf(int board_type, struct mxser_board *brd,
2763 brd->uart_type = PORT_16550A; 2710 brd->uart_type = PORT_16550A;
2764 brd->vector_mask = 0; 2711 brd->vector_mask = 0;
2765 2712
2766 for (i = 0; i < brd->nports; i++) { 2713 for (i = 0; i < brd->info->nports; i++) {
2767 for (j = 0; j < UART_INFO_NUM; j++) { 2714 for (j = 0; j < UART_INFO_NUM; j++) {
2768 if (Gpci_uart_info[j].type == brd->chip_flag) { 2715 if (Gpci_uart_info[j].type == brd->chip_flag) {
2769 brd->ports[i].max_baud = 2716 brd->ports[i].max_baud =
2770 Gpci_uart_info[j].max_baud; 2717 Gpci_uart_info[j].max_baud;
2771 2718
2772 /* exception....CP-102 */ 2719 /* exception....CP-102 */
2773 if (board_type == MXSER_BOARD_CP102) 2720 if (brd->info->flags & MXSER_HIGHBAUD)
2774 brd->ports[i].max_baud = 921600; 2721 brd->ports[i].max_baud = 921600;
2775 break; 2722 break;
2776 } 2723 }
@@ -2778,7 +2725,7 @@ static int __init mxser_get_PCI_conf(int board_type, struct mxser_board *brd,
2778 } 2725 }
2779 2726
2780 if (brd->chip_flag == MOXA_MUST_MU860_HWID) { 2727 if (brd->chip_flag == MOXA_MUST_MU860_HWID) {
2781 for (i = 0; i < brd->nports; i++) { 2728 for (i = 0; i < brd->info->nports; i++) {
2782 if (i < 4) 2729 if (i < 4)
2783 brd->ports[i].opmode_ioaddr = ioaddress + 4; 2730 brd->ports[i].opmode_ioaddr = ioaddress + 4;
2784 else 2731 else
@@ -2788,7 +2735,7 @@ static int __init mxser_get_PCI_conf(int board_type, struct mxser_board *brd,
2788 outb(0, ioaddress + 0x0c); /* default set to RS232 mode */ 2735 outb(0, ioaddress + 0x0c); /* default set to RS232 mode */
2789 } 2736 }
2790 2737
2791 for (i = 0; i < brd->nports; i++) { 2738 for (i = 0; i < brd->info->nports; i++) {
2792 brd->vector_mask |= (1 << i); 2739 brd->vector_mask |= (1 << i);
2793 brd->ports[i].baud_base = 921600; 2740 brd->ports[i].baud_base = 921600;
2794 } 2741 }
@@ -2814,9 +2761,6 @@ static int __init mxser_module_init(void)
2814 return -ENOMEM; 2761 return -ENOMEM;
2815 spin_lock_init(&gm_lock); 2762 spin_lock_init(&gm_lock);
2816 2763
2817 for (i = 0; i < MXSER_BOARDS; i++)
2818 mxser_boards[i].board_type = -1;
2819
2820 printk(KERN_INFO "MOXA Smartio/Industio family driver version %s\n", 2764 printk(KERN_INFO "MOXA Smartio/Industio family driver version %s\n",
2821 MXSER_VERSION); 2765 MXSER_VERSION);
2822 2766
@@ -2863,8 +2807,7 @@ static int __init mxser_module_init(void)
2863 if (retval != 0) 2807 if (retval != 0)
2864 printk(KERN_INFO "Found MOXA %s board " 2808 printk(KERN_INFO "Found MOXA %s board "
2865 "(CAP=0x%x)\n", 2809 "(CAP=0x%x)\n",
2866 mxser_brdname[brd->board_type - 1], 2810 brd->info->name, ioaddr[b]);
2867 ioaddr[b]);
2868 2811
2869 if (retval <= 0) { 2812 if (retval <= 0) {
2870 if (retval == MXSER_ERR_IRQ) 2813 if (retval == MXSER_ERR_IRQ)
@@ -2892,7 +2835,7 @@ static int __init mxser_module_init(void)
2892 if (mxser_initbrd(brd) < 0) 2835 if (mxser_initbrd(brd) < 0)
2893 continue; 2836 continue;
2894 2837
2895 for (i = 0; i < brd->nports; i++) 2838 for (i = 0; i < brd->info->nports; i++)
2896 tty_register_device(mxvar_sdriver, 2839 tty_register_device(mxvar_sdriver,
2897 m * MXSER_PORTS_PER_BOARD + i, NULL); 2840 m * MXSER_PORTS_PER_BOARD + i, NULL);
2898 2841
@@ -2910,7 +2853,7 @@ static int __init mxser_module_init(void)
2910 continue; 2853 continue;
2911 } 2854 }
2912 printk(KERN_INFO "Found MOXA %s board(BusNo=%d,DevNo=%d)\n", 2855 printk(KERN_INFO "Found MOXA %s board(BusNo=%d,DevNo=%d)\n",
2913 mxser_brdname[(int) (mxser_pcibrds[b].driver_data) - 1], 2856 mxser_cards[mxser_pcibrds[b].driver_data].name,
2914 pdev->bus->number, PCI_SLOT(pdev->devfn)); 2857 pdev->bus->number, PCI_SLOT(pdev->devfn));
2915 if (m >= MXSER_BOARDS) 2858 if (m >= MXSER_BOARDS)
2916 printk(KERN_ERR 2859 printk(KERN_ERR
@@ -2925,8 +2868,7 @@ static int __init mxser_module_init(void)
2925 } 2868 }
2926 brd = &mxser_boards[m]; 2869 brd = &mxser_boards[m];
2927 brd->pdev = pdev; 2870 brd->pdev = pdev;
2928 retval = mxser_get_PCI_conf( 2871 retval = mxser_get_PCI_conf(&mxser_pcibrds[b],
2929 (int)mxser_pcibrds[b].driver_data,
2930 brd, pdev); 2872 brd, pdev);
2931 if (retval < 0) { 2873 if (retval < 0) {
2932 if (retval == MXSER_ERR_IRQ) 2874 if (retval == MXSER_ERR_IRQ)
@@ -2950,7 +2892,7 @@ static int __init mxser_module_init(void)
2950 /* mxser_initbrd will hook ISR. */ 2892 /* mxser_initbrd will hook ISR. */
2951 if (mxser_initbrd(brd) < 0) 2893 if (mxser_initbrd(brd) < 0)
2952 continue; 2894 continue;
2953 for (i = 0; i < brd->nports; i++) 2895 for (i = 0; i < brd->info->nports; i++)
2954 tty_register_device(mxvar_sdriver, 2896 tty_register_device(mxvar_sdriver,
2955 m * MXSER_PORTS_PER_BOARD + i, 2897 m * MXSER_PORTS_PER_BOARD + i,
2956 &pdev->dev); 2898 &pdev->dev);
@@ -2989,7 +2931,7 @@ static void __exit mxser_module_exit(void)
2989 put_tty_driver(mxvar_sdriver); 2931 put_tty_driver(mxvar_sdriver);
2990 2932
2991 for (i = 0; i < MXSER_BOARDS; i++) 2933 for (i = 0; i < MXSER_BOARDS; i++)
2992 if (mxser_boards[i].board_type != -1) 2934 if (mxser_boards[i].info != NULL)
2993 mxser_release_res(&mxser_boards[i], 1); 2935 mxser_release_res(&mxser_boards[i], 1);
2994 2936
2995 pr_debug("Done.\n"); 2937 pr_debug("Done.\n");