serial: exar: add CTI cards to exar_get_nr_ports
authorParker Newman <pnewman@connecttech.com>
Wed, 17 Apr 2024 20:31:27 +0000 (16:31 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Apr 2024 06:23:50 +0000 (08:23 +0200)
Add code for getting number of ports of CTI cards to
exar_get_nr_ports().

Signed-off-by: Parker Newman <pnewman@connecttech.com>
Link: https://lore.kernel.org/r/0c64bdf852f39aec966b38696695d951e485d7e6.1713382717.git.pnewman@connecttech.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_exar.c

index e68029a5912222c7ba6e6a35e9a57de29a4be1a9..197f45e306ff128221bcbe2309346fdee7c21d97 100644 (file)
@@ -711,12 +711,28 @@ static unsigned int exar_get_nr_ports(struct exar8250_board *board,
 {
        unsigned int nr_ports = 0;
 
-       if (pcidev->vendor == PCI_VENDOR_ID_ACCESSIO)
+       if (pcidev->vendor == PCI_VENDOR_ID_ACCESSIO) {
                nr_ports = BIT(((pcidev->device & 0x38) >> 3) - 1);
-       else if (board->num_ports)
+       } else if (board->num_ports > 0) {
+               // Check if board struct overrides number of ports
                nr_ports = board->num_ports;
-       else
+       } else if (pcidev->vendor == PCI_VENDOR_ID_EXAR) {
+               // Exar encodes # ports in last nibble of PCI Device ID ex. 0358
                nr_ports = pcidev->device & 0x0f;
+       } else  if (pcidev->vendor == PCI_VENDOR_ID_CONNECT_TECH) {
+               // Handle CTI FPGA cards
+               switch (pcidev->device) {
+               case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG00X:
+               case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_12_XIG01X:
+                       nr_ports = 12;
+                       break;
+               case PCI_DEVICE_ID_CONNECT_TECH_PCI_XR79X_16:
+                       nr_ports = 16;
+                       break;
+               default:
+                       break;
+               }
+       }
 
        return nr_ports;
 }