|
@@ -3384,17 +3384,8 @@ static const struct pci_device_id blacklist[] = {
|
|
|
{ PCI_VDEVICE(COMMTECH, PCI_ANY_ID), },
|
|
|
};
|
|
|
|
|
|
-/*
|
|
|
- * Given a complete unknown PCI device, try to use some heuristics to
|
|
|
- * guess what the configuration might be, based on the pitiful PCI
|
|
|
- * serial specs. Returns 0 on success, 1 on failure.
|
|
|
- */
|
|
|
-static int
|
|
|
-serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
|
|
+static int serial_pci_is_class_communication(struct pci_dev *dev)
|
|
|
{
|
|
|
- const struct pci_device_id *bldev;
|
|
|
- int num_iomem, num_port, first_port = -1, i;
|
|
|
-
|
|
|
/*
|
|
|
* If it is not a communications device or the programming
|
|
|
* interface is greater than 6, give up.
|
|
@@ -3407,6 +3398,13 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
|
|
(dev->class & 0xff) > 6)
|
|
|
return -ENODEV;
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int serial_pci_is_blacklisted(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ const struct pci_device_id *bldev;
|
|
|
+
|
|
|
/*
|
|
|
* Do not access blacklisted devices that are known not to
|
|
|
* feature serial ports or are handled by other modules.
|
|
@@ -3419,6 +3417,19 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Given a complete unknown PCI device, try to use some heuristics to
|
|
|
+ * guess what the configuration might be, based on the pitiful PCI
|
|
|
+ * serial specs. Returns 0 on success, -ENODEV on failure.
|
|
|
+ */
|
|
|
+static int
|
|
|
+serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
|
|
|
+{
|
|
|
+ int num_iomem, num_port, first_port = -1, i;
|
|
|
+
|
|
|
num_iomem = num_port = 0;
|
|
|
for (i = 0; i < PCI_NUM_BAR_RESOURCES; i++) {
|
|
|
if (pci_resource_flags(dev, i) & IORESOURCE_IO) {
|
|
@@ -3639,6 +3650,14 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
|
|
|
|
|
|
board = &pci_boards[ent->driver_data];
|
|
|
|
|
|
+ rc = serial_pci_is_class_communication(dev);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ rc = serial_pci_is_blacklisted(dev);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+
|
|
|
rc = pcim_enable_device(dev);
|
|
|
pci_save_state(dev);
|
|
|
if (rc)
|