linux/drivers/tty/serial/jsm/jsm_driver.c
<<
>>
Prefs
   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, http://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                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
 262static 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
 298static 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};
 319MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
 320
 321static 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
 329static 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
 339static 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
 353static 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
 363static 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
 376static void __exit jsm_exit_module(void)
 377{
 378        pci_unregister_driver(&jsm_driver);
 379        uart_unregister_driver(&jsm_uart_driver);
 380}
 381
 382module_init(jsm_init_module);
 383module_exit(jsm_exit_module);
 384