root/drivers/tty/serial/jsm/jsm_driver.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. jsm_probe_one
  2. jsm_remove_one
  3. jsm_io_error_detected
  4. jsm_io_slot_reset
  5. jsm_io_resume
  6. jsm_init_module
  7. jsm_exit_module

   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 
  19 MODULE_AUTHOR("Digi International, http://www.digi.com");
  20 MODULE_DESCRIPTION("Driver for the Digi International Neo and Classic PCI based product line");
  21 MODULE_LICENSE("GPL");
  22 MODULE_SUPPORTED_DEVICE("jsm");
  23 
  24 #define JSM_DRIVER_NAME "jsm"
  25 #define NR_PORTS        32
  26 #define JSM_MINOR_START 0
  27 
  28 struct 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 
  37 static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
  38                                         pci_channel_state_t state);
  39 static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev);
  40 static void jsm_io_resume(struct pci_dev *pdev);
  41 
  42 static 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 
  48 int jsm_debug;
  49 module_param(jsm_debug, int, 0);
  50 MODULE_PARM_DESC(jsm_debug, "Driver debugging level");
  51 
  52 static 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                 return -ENXIO;
 216         }
 217 
 218         rc = request_irq(brd->irq, brd->bd_ops->intr, IRQF_SHARED, "JSM", brd);
 219         if (rc) {
 220                 dev_warn(&pdev->dev, "Failed to hook IRQ %d\n", brd->irq);
 221                 goto out_iounmap;
 222         }
 223 
 224         rc = jsm_tty_init(brd);
 225         if (rc < 0) {
 226                 dev_err(&pdev->dev, "Can't init tty devices (%d)\n", rc);
 227                 rc = -ENXIO;
 228                 goto out_free_irq;
 229         }
 230 
 231         rc = jsm_uart_port_init(brd);
 232         if (rc < 0) {
 233                 /* XXX: leaking all resources from jsm_tty_init here! */
 234                 dev_err(&pdev->dev, "Can't init uart port (%d)\n", rc);
 235                 rc = -ENXIO;
 236                 goto out_free_irq;
 237         }
 238 
 239         /* Log the information about the board */
 240         dev_info(&pdev->dev, "board %d: Digi Classic/Neo (rev %d), irq %d\n",
 241                         adapter_count, brd->rev, brd->irq);
 242 
 243         pci_set_drvdata(pdev, brd);
 244         pci_save_state(pdev);
 245 
 246         return 0;
 247  out_free_irq:
 248         jsm_remove_uart_port(brd);
 249         free_irq(brd->irq, brd);
 250  out_iounmap:
 251         iounmap(brd->re_map_membase);
 252  out_kfree_brd:
 253         kfree(brd);
 254  out_release_regions:
 255         pci_release_regions(pdev);
 256  out_disable_device:
 257         pci_disable_device(pdev);
 258  out:
 259         return rc;
 260 }
 261 
 262 static void jsm_remove_one(struct pci_dev *pdev)
 263 {
 264         struct jsm_board *brd = pci_get_drvdata(pdev);
 265         int i = 0;
 266 
 267         switch (pdev->device) {
 268         case PCI_DEVICE_ID_CLASSIC_4:
 269         case PCI_DEVICE_ID_CLASSIC_4_422:
 270         case PCI_DEVICE_ID_CLASSIC_8:
 271         case PCI_DEVICE_ID_CLASSIC_8_422:
 272                 /* Tell card not to interrupt anymore. */
 273                 outb(0x0, brd->iobase + 0x4c);
 274                 break;
 275         default:
 276                 break;
 277         }
 278 
 279         jsm_remove_uart_port(brd);
 280 
 281         free_irq(brd->irq, brd);
 282         iounmap(brd->re_map_membase);
 283 
 284         /* Free all allocated channels structs */
 285         for (i = 0; i < brd->maxports; i++) {
 286                 if (brd->channels[i]) {
 287                         kfree(brd->channels[i]->ch_rqueue);
 288                         kfree(brd->channels[i]->ch_equeue);
 289                         kfree(brd->channels[i]);
 290                 }
 291         }
 292 
 293         pci_release_regions(pdev);
 294         pci_disable_device(pdev);
 295         kfree(brd);
 296 }
 297 
 298 static const struct pci_device_id jsm_pci_tbl[] = {
 299         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2DB9), 0, 0, 0 },
 300         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2DB9PRI), 0, 0, 1 },
 301         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 },
 302         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 },
 303         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 },
 304         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 },
 305         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_4), 0, 0, 6 },
 306         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_1_422), 0, 0, 7 },
 307         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_1_422_485), 0, 0, 8 },
 308         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2_422_485), 0, 0, 9 },
 309         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_8), 0, 0, 10 },
 310         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4), 0, 0, 11 },
 311         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4RJ45), 0, 0, 12 },
 312         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_8RJ45), 0, 0, 13 },
 313         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_4), 0, 0, 14 },
 314         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_4_422), 0, 0, 15 },
 315         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_8), 0, 0, 16 },
 316         { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_CLASSIC_8_422), 0, 0, 17 },
 317         { 0, }
 318 };
 319 MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
 320 
 321 static struct pci_driver jsm_driver = {
 322         .name           = JSM_DRIVER_NAME,
 323         .id_table       = jsm_pci_tbl,
 324         .probe          = jsm_probe_one,
 325         .remove         = jsm_remove_one,
 326         .err_handler    = &jsm_err_handler,
 327 };
 328 
 329 static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
 330                                         pci_channel_state_t state)
 331 {
 332         struct jsm_board *brd = pci_get_drvdata(pdev);
 333 
 334         jsm_remove_uart_port(brd);
 335 
 336         return PCI_ERS_RESULT_NEED_RESET;
 337 }
 338 
 339 static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev)
 340 {
 341         int rc;
 342 
 343         rc = pci_enable_device(pdev);
 344 
 345         if (rc)
 346                 return PCI_ERS_RESULT_DISCONNECT;
 347 
 348         pci_set_master(pdev);
 349 
 350         return PCI_ERS_RESULT_RECOVERED;
 351 }
 352 
 353 static void jsm_io_resume(struct pci_dev *pdev)
 354 {
 355         struct jsm_board *brd = pci_get_drvdata(pdev);
 356 
 357         pci_restore_state(pdev);
 358         pci_save_state(pdev);
 359 
 360         jsm_uart_port_init(brd);
 361 }
 362 
 363 static int __init jsm_init_module(void)
 364 {
 365         int rc;
 366 
 367         rc = uart_register_driver(&jsm_uart_driver);
 368         if (!rc) {
 369                 rc = pci_register_driver(&jsm_driver);
 370                 if (rc)
 371                         uart_unregister_driver(&jsm_uart_driver);
 372         }
 373         return rc;
 374 }
 375 
 376 static void __exit jsm_exit_module(void)
 377 {
 378         pci_unregister_driver(&jsm_driver);
 379         uart_unregister_driver(&jsm_uart_driver);
 380 }
 381 
 382 module_init(jsm_init_module);
 383 module_exit(jsm_exit_module);

/* [<][>][^][v][top][bottom][index][help] */