1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2003 Digi International (www.digi.com)
4  *	Scott H Kilau <Scott_Kilau at digi dot com>
5  */
6 
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/pci.h>
10 #include <linux/slab.h>
11 #include <linux/sched.h>
12 #include "dgnc_driver.h"
13 #include "dgnc_tty.h"
14 #include "dgnc_cls.h"
15 
16 MODULE_LICENSE("GPL");
17 MODULE_AUTHOR("Digi International, http://www.digi.com");
18 MODULE_DESCRIPTION("Driver for the Digi International Neo and Classic PCI based product line");
19 MODULE_SUPPORTED_DEVICE("dgnc");
20 
21 static unsigned int dgnc_num_boards;
22 struct dgnc_board		*dgnc_board[MAXBOARDS];
23 static DEFINE_SPINLOCK(dgnc_poll_lock); /* Poll scheduling lock */
24 
25 static int		dgnc_poll_tick = 20;	/* Poll interval - 20 ms */
26 static ulong		dgnc_poll_time; /* Time of next poll */
27 static uint		dgnc_poll_stop; /* Used to tell poller to stop */
28 static struct timer_list dgnc_poll_timer;
29 
30 #define DIGI_VID				0x114F
31 #define PCI_DEVICE_CLASSIC_4_DID		0x0028
32 #define PCI_DEVICE_CLASSIC_8_DID		0x0029
33 #define PCI_DEVICE_CLASSIC_4_422_DID		0x00D0
34 #define PCI_DEVICE_CLASSIC_8_422_DID		0x00D1
35 
36 #define PCI_DEVICE_CLASSIC_4_PCI_NAME		"ClassicBoard 4 PCI"
37 #define PCI_DEVICE_CLASSIC_8_PCI_NAME		"ClassicBoard 8 PCI"
38 #define PCI_DEVICE_CLASSIC_4_422_PCI_NAME	"ClassicBoard 4 422 PCI"
39 #define PCI_DEVICE_CLASSIC_8_422_PCI_NAME	"ClassicBoard 8 422 PCI"
40 
41 static const struct pci_device_id dgnc_pci_tbl[] = {
42 	{PCI_DEVICE(DIGI_VID, PCI_DEVICE_CLASSIC_4_DID),     .driver_data = 0},
43 	{PCI_DEVICE(DIGI_VID, PCI_DEVICE_CLASSIC_4_422_DID), .driver_data = 1},
44 	{PCI_DEVICE(DIGI_VID, PCI_DEVICE_CLASSIC_8_DID),     .driver_data = 2},
45 	{PCI_DEVICE(DIGI_VID, PCI_DEVICE_CLASSIC_8_422_DID), .driver_data = 3},
46 	{0,}
47 };
48 MODULE_DEVICE_TABLE(pci, dgnc_pci_tbl);
49 
50 struct board_id {
51 	unsigned char *name;
52 	uint maxports;
53 	unsigned int is_pci_express;
54 };
55 
56 static const struct board_id dgnc_ids[] = {
57 	{	PCI_DEVICE_CLASSIC_4_PCI_NAME,		4,	0	},
58 	{	PCI_DEVICE_CLASSIC_4_422_PCI_NAME,	4,	0	},
59 	{	PCI_DEVICE_CLASSIC_8_PCI_NAME,		8,	0	},
60 	{	PCI_DEVICE_CLASSIC_8_422_PCI_NAME,	8,	0	},
61 	{	NULL,					0,	0	}
62 };
63 
64 /* Remap PCI memory. */
dgnc_do_remap(struct dgnc_board * brd)65 static int dgnc_do_remap(struct dgnc_board *brd)
66 {
67 	brd->re_map_membase = ioremap(brd->membase, 0x1000);
68 	if (!brd->re_map_membase)
69 		return -ENOMEM;
70 
71 	return 0;
72 }
73 
74 /* A board has been found, initialize  it. */
dgnc_found_board(struct pci_dev * pdev,int id)75 static struct dgnc_board *dgnc_found_board(struct pci_dev *pdev, int id)
76 {
77 	struct dgnc_board *brd;
78 	unsigned int pci_irq;
79 	int rc = 0;
80 
81 	brd = kzalloc(sizeof(*brd), GFP_KERNEL);
82 	if (!brd)
83 		return ERR_PTR(-ENOMEM);
84 
85 	/* store the info for the board we've found */
86 	brd->boardnum = dgnc_num_boards;
87 	brd->device = dgnc_pci_tbl[id].device;
88 	brd->pdev = pdev;
89 	brd->name = dgnc_ids[id].name;
90 	brd->maxports = dgnc_ids[id].maxports;
91 	init_waitqueue_head(&brd->state_wait);
92 
93 	spin_lock_init(&brd->bd_lock);
94 	spin_lock_init(&brd->bd_intr_lock);
95 
96 	brd->state		= BOARD_FOUND;
97 
98 	pci_irq = pdev->irq;
99 	brd->irq = pci_irq;
100 
101 	switch (brd->device) {
102 	case PCI_DEVICE_CLASSIC_4_DID:
103 	case PCI_DEVICE_CLASSIC_8_DID:
104 	case PCI_DEVICE_CLASSIC_4_422_DID:
105 	case PCI_DEVICE_CLASSIC_8_422_DID:
106 		/*
107 		 * For PCI ClassicBoards
108 		 * PCI Local Address (i.e. "resource" number) space
109 		 * 0	PLX Memory Mapped Config
110 		 * 1	PLX I/O Mapped Config
111 		 * 2	I/O Mapped UARTs and Status
112 		 * 3	Memory Mapped VPD
113 		 * 4	Memory Mapped UARTs and Status
114 		 */
115 
116 		brd->membase = pci_resource_start(pdev, 4);
117 
118 		if (!brd->membase) {
119 			dev_err(&brd->pdev->dev,
120 				"Card has no PCI IO resources, failing.\n");
121 			rc = -ENODEV;
122 			goto failed;
123 		}
124 
125 		brd->membase_end = pci_resource_end(pdev, 4);
126 
127 		if (brd->membase & 1)
128 			brd->membase &= ~3;
129 		else
130 			brd->membase &= ~15;
131 
132 		brd->iobase	= pci_resource_start(pdev, 1);
133 		brd->iobase_end = pci_resource_end(pdev, 1);
134 		brd->iobase	= ((unsigned int)(brd->iobase)) & 0xFFFE;
135 
136 		brd->bd_ops = &dgnc_cls_ops;
137 
138 		brd->bd_uart_offset = 0x8;
139 		brd->bd_dividend = 921600;
140 
141 		rc = dgnc_do_remap(brd);
142 		if (rc < 0)
143 			goto failed;
144 
145 		/*
146 		 * Enable Local Interrupt 1		  (0x1),
147 		 * Local Interrupt 1 Polarity Active high (0x2),
148 		 * Enable PCI interrupt			  (0x40)
149 		 */
150 		outb(0x43, brd->iobase + 0x4c);
151 
152 		break;
153 
154 	default:
155 		dev_err(&brd->pdev->dev,
156 			"Didn't find any compatible Neo/Classic PCI boards.\n");
157 		rc = -ENXIO;
158 		goto failed;
159 	}
160 
161 	tasklet_init(&brd->helper_tasklet,
162 		     brd->bd_ops->tasklet,
163 		     (unsigned long)brd);
164 
165 	wake_up_interruptible(&brd->state_wait);
166 
167 	return brd;
168 
169 failed:
170 	kfree(brd);
171 
172 	return ERR_PTR(rc);
173 }
174 
dgnc_request_irq(struct dgnc_board * brd)175 static int dgnc_request_irq(struct dgnc_board *brd)
176 {
177 	if (brd->irq) {
178 		int rc = request_irq(brd->irq, brd->bd_ops->intr,
179 				 IRQF_SHARED, "DGNC", brd);
180 		if (rc) {
181 			dev_err(&brd->pdev->dev,
182 				"Failed to hook IRQ %d\n", brd->irq);
183 			brd->state = BOARD_FAILED;
184 			return -ENODEV;
185 		}
186 	}
187 	return 0;
188 }
189 
dgnc_free_irq(struct dgnc_board * brd)190 static void dgnc_free_irq(struct dgnc_board *brd)
191 {
192 	if (brd->irq)
193 		free_irq(brd->irq, brd);
194 }
195 
196  /*
197   * As each timer expires, it determines (a) whether the "transmit"
198   * waiter needs to be woken up, and (b) whether the poller needs to
199   * be rescheduled.
200   */
dgnc_poll_handler(struct timer_list * unused)201 static void dgnc_poll_handler(struct timer_list *unused)
202 {
203 	struct dgnc_board *brd;
204 	unsigned long flags;
205 	int i;
206 	unsigned long new_time;
207 
208 	for (i = 0; i < dgnc_num_boards; i++) {
209 		brd = dgnc_board[i];
210 
211 		spin_lock_irqsave(&brd->bd_lock, flags);
212 
213 		if (brd->state == BOARD_FAILED) {
214 			spin_unlock_irqrestore(&brd->bd_lock, flags);
215 			continue;
216 		}
217 
218 		tasklet_schedule(&brd->helper_tasklet);
219 
220 		spin_unlock_irqrestore(&brd->bd_lock, flags);
221 	}
222 
223 	/* Schedule ourself back at the nominal wakeup interval. */
224 
225 	spin_lock_irqsave(&dgnc_poll_lock, flags);
226 	dgnc_poll_time += dgnc_jiffies_from_ms(dgnc_poll_tick);
227 
228 	new_time = dgnc_poll_time - jiffies;
229 
230 	if ((ulong)new_time >= 2 * dgnc_poll_tick)
231 		dgnc_poll_time = jiffies + dgnc_jiffies_from_ms(dgnc_poll_tick);
232 
233 	timer_setup(&dgnc_poll_timer, dgnc_poll_handler, 0);
234 	dgnc_poll_timer.expires = dgnc_poll_time;
235 	spin_unlock_irqrestore(&dgnc_poll_lock, flags);
236 
237 	if (!dgnc_poll_stop)
238 		add_timer(&dgnc_poll_timer);
239 }
240 
241 /* returns count (>= 0), or negative on error */
dgnc_init_one(struct pci_dev * pdev,const struct pci_device_id * ent)242 static int dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
243 {
244 	int rc;
245 	struct dgnc_board *brd;
246 
247 	rc = pci_enable_device(pdev);
248 	if (rc)
249 		return -EIO;
250 
251 	brd = dgnc_found_board(pdev, ent->driver_data);
252 	if (IS_ERR(brd))
253 		return PTR_ERR(brd);
254 
255 	rc = dgnc_tty_register(brd);
256 	if (rc < 0) {
257 		pr_err(DRVSTR ": Can't register tty devices (%d)\n", rc);
258 		goto failed;
259 	}
260 
261 	rc = dgnc_request_irq(brd);
262 	if (rc < 0) {
263 		pr_err(DRVSTR ": Can't finalize board init (%d)\n", rc);
264 		goto unregister_tty;
265 	}
266 
267 	rc = dgnc_tty_init(brd);
268 	if (rc < 0) {
269 		pr_err(DRVSTR ": Can't init tty devices (%d)\n", rc);
270 		goto free_irq;
271 	}
272 
273 	brd->state = BOARD_READY;
274 
275 	dgnc_board[dgnc_num_boards++] = brd;
276 
277 	return 0;
278 
279 free_irq:
280 	dgnc_free_irq(brd);
281 unregister_tty:
282 	dgnc_tty_unregister(brd);
283 failed:
284 	kfree(brd);
285 
286 	return rc;
287 }
288 
289 static struct pci_driver dgnc_driver = {
290 	.name		= "dgnc",
291 	.probe		= dgnc_init_one,
292 	.id_table       = dgnc_pci_tbl,
293 };
294 
dgnc_start(void)295 static int dgnc_start(void)
296 {
297 	unsigned long flags;
298 
299 	/* Start the poller */
300 	spin_lock_irqsave(&dgnc_poll_lock, flags);
301 	timer_setup(&dgnc_poll_timer, dgnc_poll_handler, 0);
302 	dgnc_poll_time = jiffies + dgnc_jiffies_from_ms(dgnc_poll_tick);
303 	dgnc_poll_timer.expires = dgnc_poll_time;
304 	spin_unlock_irqrestore(&dgnc_poll_lock, flags);
305 
306 	add_timer(&dgnc_poll_timer);
307 
308 	return 0;
309 }
310 
311 /* Free all the memory associated with a board */
dgnc_cleanup_board(struct dgnc_board * brd)312 static void dgnc_cleanup_board(struct dgnc_board *brd)
313 {
314 	int i = 0;
315 
316 	if (!brd)
317 		return;
318 
319 	switch (brd->device) {
320 	case PCI_DEVICE_CLASSIC_4_DID:
321 	case PCI_DEVICE_CLASSIC_8_DID:
322 	case PCI_DEVICE_CLASSIC_4_422_DID:
323 	case PCI_DEVICE_CLASSIC_8_422_DID:
324 
325 		/* Tell card not to interrupt anymore. */
326 		outb(0, brd->iobase + 0x4c);
327 		break;
328 
329 	default:
330 		break;
331 	}
332 
333 	if (brd->irq)
334 		free_irq(brd->irq, brd);
335 
336 	tasklet_kill(&brd->helper_tasklet);
337 
338 	if (brd->re_map_membase) {
339 		iounmap(brd->re_map_membase);
340 		brd->re_map_membase = NULL;
341 	}
342 
343 	for (i = 0; i < MAXPORTS ; i++) {
344 		if (brd->channels[i]) {
345 			kfree(brd->channels[i]->ch_rqueue);
346 			kfree(brd->channels[i]->ch_equeue);
347 			kfree(brd->channels[i]->ch_wqueue);
348 			kfree(brd->channels[i]);
349 			brd->channels[i] = NULL;
350 		}
351 	}
352 
353 	dgnc_board[brd->boardnum] = NULL;
354 
355 	kfree(brd);
356 }
357 
358 /* Driver load/unload functions */
359 
cleanup(void)360 static void cleanup(void)
361 {
362 	int i;
363 	unsigned long flags;
364 
365 	spin_lock_irqsave(&dgnc_poll_lock, flags);
366 	dgnc_poll_stop = 1;
367 	spin_unlock_irqrestore(&dgnc_poll_lock, flags);
368 
369 	/* Turn off poller right away. */
370 	del_timer_sync(&dgnc_poll_timer);
371 
372 	for (i = 0; i < dgnc_num_boards; ++i) {
373 		dgnc_cleanup_tty(dgnc_board[i]);
374 		dgnc_cleanup_board(dgnc_board[i]);
375 	}
376 }
377 
dgnc_cleanup_module(void)378 static void __exit dgnc_cleanup_module(void)
379 {
380 	cleanup();
381 	pci_unregister_driver(&dgnc_driver);
382 }
383 
dgnc_init_module(void)384 static int __init dgnc_init_module(void)
385 {
386 	int rc;
387 
388 	/* Initialize global stuff */
389 	rc = dgnc_start();
390 	if (rc < 0)
391 		return rc;
392 
393 	/* Find and configure all the cards */
394 	rc = pci_register_driver(&dgnc_driver);
395 	if (rc) {
396 		pr_warn("WARNING: dgnc driver load failed.  No Digi Neo or Classic boards found.\n");
397 		cleanup();
398 		return rc;
399 	}
400 	return 0;
401 }
402 
403 module_init(dgnc_init_module);
404 module_exit(dgnc_cleanup_module);
405