170
170
(n << (28 + (2 * skl) - PAGE_SHIFT))
171
171
172
172
static int nr_channels ;
173
+ static struct pci_dev * mci_pdev ;
174
+ static int ie31200_registered = 1 ;
173
175
174
176
struct ie31200_priv {
175
177
void __iomem * window ;
@@ -538,12 +540,16 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
538
540
static int ie31200_init_one (struct pci_dev * pdev ,
539
541
const struct pci_device_id * ent )
540
542
{
541
- edac_dbg ( 0 , "MC:\n" ) ;
543
+ int rc ;
542
544
545
+ edac_dbg (0 , "MC:\n" );
543
546
if (pci_enable_device (pdev ) < 0 )
544
547
return - EIO ;
548
+ rc = ie31200_probe1 (pdev , ent -> driver_data );
549
+ if (rc == 0 && !mci_pdev )
550
+ mci_pdev = pci_dev_get (pdev );
545
551
546
- return ie31200_probe1 ( pdev , ent -> driver_data ) ;
552
+ return rc ;
547
553
}
548
554
549
555
static void ie31200_remove_one (struct pci_dev * pdev )
@@ -552,6 +558,8 @@ static void ie31200_remove_one(struct pci_dev *pdev)
552
558
struct ie31200_priv * priv ;
553
559
554
560
edac_dbg (0 , "\n" );
561
+ pci_dev_put (mci_pdev );
562
+ mci_pdev = NULL ;
555
563
mci = edac_mc_del_mc (& pdev -> dev );
556
564
if (!mci )
557
565
return ;
@@ -593,17 +601,53 @@ static struct pci_driver ie31200_driver = {
593
601
594
602
static int __init ie31200_init (void )
595
603
{
604
+ int pci_rc , i ;
605
+
596
606
edac_dbg (3 , "MC:\n" );
597
607
/* Ensure that the OPSTATE is set correctly for POLL or NMI */
598
608
opstate_init ();
599
609
600
- return pci_register_driver (& ie31200_driver );
610
+ pci_rc = pci_register_driver (& ie31200_driver );
611
+ if (pci_rc < 0 )
612
+ goto fail0 ;
613
+
614
+ if (!mci_pdev ) {
615
+ ie31200_registered = 0 ;
616
+ for (i = 0 ; ie31200_pci_tbl [i ].vendor != 0 ; i ++ ) {
617
+ mci_pdev = pci_get_device (ie31200_pci_tbl [i ].vendor ,
618
+ ie31200_pci_tbl [i ].device ,
619
+ NULL );
620
+ if (mci_pdev )
621
+ break ;
622
+ }
623
+ if (!mci_pdev ) {
624
+ edac_dbg (0 , "ie31200 pci_get_device fail\n" );
625
+ pci_rc = - ENODEV ;
626
+ goto fail1 ;
627
+ }
628
+ pci_rc = ie31200_init_one (mci_pdev , & ie31200_pci_tbl [i ]);
629
+ if (pci_rc < 0 ) {
630
+ edac_dbg (0 , "ie31200 init fail\n" );
631
+ pci_rc = - ENODEV ;
632
+ goto fail1 ;
633
+ }
634
+ }
635
+ return 0 ;
636
+
637
+ fail1 :
638
+ pci_unregister_driver (& ie31200_driver );
639
+ fail0 :
640
+ pci_dev_put (mci_pdev );
641
+
642
+ return pci_rc ;
601
643
}
602
644
603
645
static void __exit ie31200_exit (void )
604
646
{
605
647
edac_dbg (3 , "MC:\n" );
606
648
pci_unregister_driver (& ie31200_driver );
649
+ if (!ie31200_registered )
650
+ ie31200_remove_one (mci_pdev );
607
651
}
608
652
609
653
module_init (ie31200_init );
0 commit comments