@@ -704,6 +704,21 @@ static irqreturn_t exar_misc_handler(int irq, void *data)
704
704
return IRQ_HANDLED ;
705
705
}
706
706
707
+ static unsigned int exar_get_nr_ports (struct exar8250_board * board ,
708
+ struct pci_dev * pcidev )
709
+ {
710
+ unsigned int nr_ports = 0 ;
711
+
712
+ if (pcidev -> vendor == PCI_VENDOR_ID_ACCESSIO )
713
+ nr_ports = BIT (((pcidev -> device & 0x38 ) >> 3 ) - 1 );
714
+ else if (board -> num_ports )
715
+ nr_ports = board -> num_ports ;
716
+ else
717
+ nr_ports = pcidev -> device & 0x0f ;
718
+
719
+ return nr_ports ;
720
+ }
721
+
707
722
static int
708
723
exar_pci_probe (struct pci_dev * pcidev , const struct pci_device_id * ent )
709
724
{
@@ -723,12 +738,12 @@ exar_pci_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
723
738
724
739
maxnr = pci_resource_len (pcidev , bar ) >> (board -> reg_shift + 3 );
725
740
726
- if ( pcidev -> vendor == PCI_VENDOR_ID_ACCESSIO )
727
- nr_ports = BIT ((( pcidev -> device & 0x38 ) >> 3 ) - 1 );
728
- else if ( board -> num_ports )
729
- nr_ports = board -> num_ports ;
730
- else
731
- nr_ports = pcidev -> device & 0x0f ;
741
+ nr_ports = exar_get_nr_ports ( board , pcidev );
742
+ if ( nr_ports == 0 ) {
743
+ dev_err_probe ( & pcidev -> dev , - ENODEV ,
744
+ "failed to get number of ports\n" ) ;
745
+ return - ENODEV ;
746
+ }
732
747
733
748
priv = devm_kzalloc (& pcidev -> dev , struct_size (priv , line , nr_ports ), GFP_KERNEL );
734
749
if (!priv )
0 commit comments