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