Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / tty / serial / jsm / jsm_driver.c
1 /************************************************************************
2  * Copyright 2003 Digi International (www.digi.com)
3  *
4  * Copyright (C) 2004 IBM Corporation. All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14  * PURPOSE.  See the GNU General Public License for more details.
15  *
16  * Contact Information:
17  * Scott H Kilau <Scott_Kilau@digi.com>
18  * Wendy Xiong   <wendyx@us.ibm.com>
19  *
20  *
21  ***********************************************************************/
22 #include <linux/module.h>
23 #include <linux/pci.h>
24 #include <linux/slab.h>
25
26 #include "jsm.h"
27
28 MODULE_AUTHOR("Digi International, http://www.digi.com");
29 MODULE_DESCRIPTION("Driver for the Digi International Neo and Classic PCI based product line");
30 MODULE_LICENSE("GPL");
31 MODULE_SUPPORTED_DEVICE("jsm");
32
33 #define JSM_DRIVER_NAME "jsm"
34 #define NR_PORTS        32
35 #define JSM_MINOR_START 0
36
37 struct uart_driver jsm_uart_driver = {
38         .owner          = THIS_MODULE,
39         .driver_name    = JSM_DRIVER_NAME,
40         .dev_name       = "ttyn",
41         .major          = 0,
42         .minor          = JSM_MINOR_START,
43         .nr             = NR_PORTS,
44 };
45
46 static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
47                                         pci_channel_state_t state);
48 static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev);
49 static void jsm_io_resume(struct pci_dev *pdev);
50
51 static const struct pci_error_handlers jsm_err_handler = {
52         .error_detected = jsm_io_error_detected,
53         .slot_reset = jsm_io_slot_reset,
54         .resume = jsm_io_resume,
55 };
56
57 int jsm_debug;
58 module_param(jsm_debug, int, 0);
59 MODULE_PARM_DESC(jsm_debug, "Driver debugging level");
60
61 static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
62 {
63         int rc = 0;
64         struct jsm_board *brd;
65         static int adapter_count;
66
67         rc = pci_enable_device(pdev);
68         if (rc) {
69                 dev_err(&pdev->dev, "Device enable FAILED\n");
70                 goto out;
71         }
72
73         rc = pci_request_regions(pdev, "jsm");
74         if (rc) {
75                 dev_err(&pdev->dev, "pci_request_region FAILED\n");
76                 goto out_disable_device;
77         }
78
79         brd = kzalloc(sizeof(*brd), GFP_KERNEL);
80         if (!brd) {
81                 rc = -ENOMEM;
82                 goto out_release_regions;
83         }
84
85         /* store the info for the board we've found */
86         brd->boardnum = adapter_count++;
87         brd->pci_dev = pdev;
88
89         switch (pdev->device) {
90         case PCI_DEVICE_ID_NEO_2DB9:
91         case PCI_DEVICE_ID_NEO_2DB9PRI:
92         case PCI_DEVICE_ID_NEO_2RJ45:
93         case PCI_DEVICE_ID_NEO_2RJ45PRI:
94         case PCI_DEVICE_ID_NEO_2_422_485:
95                 brd->maxports = 2;
96                 break;
97
98         case PCI_DEVICE_ID_CLASSIC_4:
99         case PCI_DEVICE_ID_CLASSIC_4_422:
100         case PCI_DEVICE_ID_NEO_4:
101         case PCIE_DEVICE_ID_NEO_4:
102         case PCIE_DEVICE_ID_NEO_4RJ45:
103         case PCIE_DEVICE_ID_NEO_4_IBM:
104                 brd->maxports = 4;
105                 break;
106
107         case PCI_DEVICE_ID_CLASSIC_8:
108         case PCI_DEVICE_ID_CLASSIC_8_422:
109         case PCI_DEVICE_ID_DIGI_NEO_8:
110         case PCIE_DEVICE_ID_NEO_8:
111         case PCIE_DEVICE_ID_NEO_8RJ45:
112                 brd->maxports = 8;
113                 break;
114
115         default:
116                 brd->maxports = 1;
117                 break;
118         }
119
120         spin_lock_init(&brd->bd_intr_lock);
121
122         /* store which revision we have */
123         brd->rev = pdev->revision;
124
125         brd->irq = pdev->irq;
126
127         switch (pdev->device) {
128         case PCI_DEVICE_ID_CLASSIC_4:
129         case PCI_DEVICE_ID_CLASSIC_4_422:
130         case PCI_DEVICE_ID_CLASSIC_8:
131         case PCI_DEVICE_ID_CLASSIC_8_422:
132
133                 jsm_dbg(INIT, &brd->pci_dev,
134                         "jsm_found_board - Classic adapter\n");
135
136                 /*
137                  * For PCI ClassicBoards
138                  * PCI Local Address (.i.e. "resource" number) space
139                  * 0    PLX Memory Mapped Config
140                  * 1    PLX I/O Mapped Config
141                  * 2    I/O Mapped UARTs and Status
142                  * 3    Memory Mapped VPD
143                  * 4    Memory Mapped UARTs and Status
144                  */
145
146                 /* Get the PCI Base Address Registers */
147                 brd->membase = pci_resource_start(pdev, 4);
148                 brd->membase_end = pci_resource_end(pdev, 4);
149
150                 if (brd->membase & 0x1)
151                         brd->membase &= ~0x3;
152                 else
153                         brd->membase &= ~0xF;
154
155                 brd->iobase = pci_resource_start(pdev, 1);
156                 brd->iobase_end = pci_resource_end(pdev, 1);
157                 brd->iobase = ((unsigned int)(brd->iobase)) & 0xFFFE;
158
159                 /* Assign the board_ops struct */
160                 brd->bd_ops = &jsm_cls_ops;
161
162                 brd->bd_uart_offset = 0x8;
163                 brd->bd_dividend = 921600;
164
165                 brd->re_map_membase = ioremap(brd->membase,
166                                                 pci_resource_len(pdev, 4));
167                 if (!brd->re_map_membase) {
168                         dev_err(&pdev->dev,
169                                 "Card has no PCI Memory resources, failing board.\n");
170                         rc = -ENOMEM;
171                         goto out_kfree_brd;
172                 }
173
174                 /*
175                  * Enable Local Interrupt 1                     (0x1),
176                  * Local Interrupt 1 Polarity Active high       (0x2),
177                  * Enable PCI interrupt                         (0x43)
178                  */
179                 outb(0x43, brd->iobase + 0x4c);
180
181                 break;
182
183         case PCI_DEVICE_ID_NEO_2DB9:
184         case PCI_DEVICE_ID_NEO_2DB9PRI:
185         case PCI_DEVICE_ID_NEO_2RJ45:
186         case PCI_DEVICE_ID_NEO_2RJ45PRI:
187         case PCI_DEVICE_ID_NEO_2_422_485:
188         case PCI_DEVICE_ID_NEO_4:
189         case PCIE_DEVICE_ID_NEO_4:
190         case PCIE_DEVICE_ID_NEO_4RJ45:
191         case PCIE_DEVICE_ID_NEO_4_IBM:
192         case PCI_DEVICE_ID_DIGI_NEO_8:
193         case PCIE_DEVICE_ID_NEO_8:
194         case PCIE_DEVICE_ID_NEO_8RJ45:
195
196                 jsm_dbg(INIT, &brd->pci_dev, "jsm_found_board - NEO adapter\n");
197
198                 /* get the PCI Base Address Registers */
199                 brd->membase    = pci_resource_start(pdev, 0);
200                 brd->membase_end = pci_resource_end(pdev, 0);
201
202                 if (brd->membase & 1)
203                         brd->membase &= ~0x3;
204                 else
205                         brd->membase &= ~0xF;
206
207                 /* Assign the board_ops struct */
208                 brd->bd_ops = &jsm_neo_ops;
209
210                 brd->bd_uart_offset = 0x200;
211                 brd->bd_dividend = 921600;
212
213                 brd->re_map_membase = ioremap(brd->membase,
214                                                 pci_resource_len(pdev, 0));
215                 if (!brd->re_map_membase) {
216                         dev_err(&pdev->dev,
217                                 "Card has no PCI Memory resources, failing board.\n");
218                         rc = -ENOMEM;
219                         goto out_kfree_brd;
220                 }
221
222                 break;
223         default:
224                 return -ENXIO;
225         }
226
227         rc = request_irq(brd->irq, brd->bd_ops->intr, IRQF_SHARED, "JSM", brd);
228         if (rc) {
229                 dev_warn(&pdev->dev, "Failed to hook IRQ %d\n", brd->irq);
230                 goto out_iounmap;
231         }
232
233         rc = jsm_tty_init(brd);
234         if (rc < 0) {
235                 dev_err(&pdev->dev, "Can't init tty devices (%d)\n", rc);
236                 rc = -ENXIO;
237                 goto out_free_irq;
238         }
239
240         rc = jsm_uart_port_init(brd);
241         if (rc < 0) {
242                 /* XXX: leaking all resources from jsm_tty_init here! */
243                 dev_err(&pdev->dev, "Can't init uart port (%d)\n", rc);
244                 rc = -ENXIO;
245                 goto out_free_irq;
246         }
247
248         /* Log the information about the board */
249         dev_info(&pdev->dev, "board %d: Digi Classic/Neo (rev %d), irq %d\n",
250                         adapter_count, brd->rev, brd->irq);
251
252         pci_set_drvdata(pdev, brd);
253         pci_save_state(pdev);
254
255         return 0;
256  out_free_irq:
257         jsm_remove_uart_port(brd);
258         free_irq(brd->irq, brd);
259  out_iounmap:
260         iounmap(brd->re_map_membase);
261  out_kfree_brd:
262         kfree(brd);
263  out_release_regions:
264         pci_release_regions(pdev);
265  out_disable_device:
266         pci_disable_device(pdev);
267  out:
268         return rc;
269 }
270
271 static void jsm_remove_one(struct pci_dev *pdev)
272 {
273         struct jsm_board *brd = pci_get_drvdata(pdev);
274         int i = 0;
275
276         switch (pdev->device) {
277         case PCI_DEVICE_ID_CLASSIC_4:
278         case PCI_DEVICE_ID_CLASSIC_4_422:
279         case PCI_DEVICE_ID_CLASSIC_8:
280         case PCI_DEVICE_ID_CLASSIC_8_422:
281                 /* Tell card not to interrupt anymore. */
282                 outb(0x0, brd->iobase + 0x4c);
283                 break;
284         default:
285                 break;
286         }
287
288         jsm_remove_uart_port(brd);
289
290         free_irq(brd->irq, brd);
291         iounmap(brd->re_map_membase);
292
293         /* Free all allocated channels structs */
294         for (i = 0; i < brd->maxports; i++) {
295                 if (brd->channels[i]) {
296                         kfree(brd->channels[i]->ch_rqueue);
297                         kfree(brd->channels[i]->ch_equeue);
298                         kfree(brd->channels[i]);
299                 }
300         }
301
302         pci_release_regions(pdev);
303         pci_disable_device(pdev);
304         kfree(brd);
305 }
306
307 static struct pci_device_id jsm_pci_tbl[] = {
308         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2DB9), 0, 0, 0 },
309         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2DB9PRI), 0, 0, 1 },
310         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 },
311         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 },
312         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 },
313         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 },
314         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_4), 0, 0, 6 },
315         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_1_422), 0, 0, 7 },
316         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_1_422_485), 0, 0, 8 },
317         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2_422_485), 0, 0, 9 },
318         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_8), 0, 0, 10 },
319         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4), 0, 0, 11 },
320         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4RJ45), 0, 0, 12 },
321         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_8RJ45), 0, 0, 13 },
322         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_4), 0, 0, 14 },
323         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_4_422), 0, 0, 15 },
324         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_8), 0, 0, 16 },
325         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_8_422), 0, 0, 17 },
326         { 0, }
327 };
328 MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
329
330 static struct pci_driver jsm_driver = {
331         .name           = "jsm",
332         .id_table       = jsm_pci_tbl,
333         .probe          = jsm_probe_one,
334         .remove         = jsm_remove_one,
335         .err_handler    = &jsm_err_handler,
336 };
337
338 static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
339                                         pci_channel_state_t state)
340 {
341         struct jsm_board *brd = pci_get_drvdata(pdev);
342
343         jsm_remove_uart_port(brd);
344
345         return PCI_ERS_RESULT_NEED_RESET;
346 }
347
348 static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev)
349 {
350         int rc;
351
352         rc = pci_enable_device(pdev);
353
354         if (rc)
355                 return PCI_ERS_RESULT_DISCONNECT;
356
357         pci_set_master(pdev);
358
359         return PCI_ERS_RESULT_RECOVERED;
360 }
361
362 static void jsm_io_resume(struct pci_dev *pdev)
363 {
364         struct jsm_board *brd = pci_get_drvdata(pdev);
365
366         pci_restore_state(pdev);
367         pci_save_state(pdev);
368
369         jsm_uart_port_init(brd);
370 }
371
372 static int __init jsm_init_module(void)
373 {
374         int rc;
375
376         rc = uart_register_driver(&jsm_uart_driver);
377         if (!rc) {
378                 rc = pci_register_driver(&jsm_driver);
379                 if (rc)
380                         uart_unregister_driver(&jsm_uart_driver);
381         }
382         return rc;
383 }
384
385 static void __exit jsm_exit_module(void)
386 {
387         pci_unregister_driver(&jsm_driver);
388         uart_unregister_driver(&jsm_uart_driver);
389 }
390
391 module_init(jsm_init_module);
392 module_exit(jsm_exit_module);