@@ -195,7 +195,6 @@ struct rp2_card {
195
195
void __iomem * bar0 ;
196
196
void __iomem * bar1 ;
197
197
spinlock_t card_lock ;
198
- struct completion fw_loaded ;
199
198
};
200
199
201
200
#define RP_ID (prod ) PCI_VDEVICE(RP, (prod))
@@ -662,17 +661,10 @@ static void rp2_remove_ports(struct rp2_card *card)
662
661
card -> initialized_ports = 0 ;
663
662
}
664
663
665
- static void rp2_fw_cb ( const struct firmware * fw , void * context )
664
+ static int rp2_load_firmware ( struct rp2_card * card , const struct firmware * fw )
666
665
{
667
- struct rp2_card * card = context ;
668
666
resource_size_t phys_base ;
669
- int i , rc = - ENOENT ;
670
-
671
- if (!fw ) {
672
- dev_err (& card -> pdev -> dev , "cannot find '%s' firmware image\n" ,
673
- RP2_FW_NAME );
674
- goto no_fw ;
675
- }
667
+ int i , rc = 0 ;
676
668
677
669
phys_base = pci_resource_start (card -> pdev , 1 );
678
670
@@ -718,23 +710,13 @@ static void rp2_fw_cb(const struct firmware *fw, void *context)
718
710
card -> initialized_ports ++ ;
719
711
}
720
712
721
- release_firmware (fw );
722
- no_fw :
723
- /*
724
- * rp2_fw_cb() is called from a workqueue long after rp2_probe()
725
- * has already returned success. So if something failed here,
726
- * we'll just leave the now-dormant device in place until somebody
727
- * unbinds it.
728
- */
729
- if (rc )
730
- dev_warn (& card -> pdev -> dev , "driver initialization failed\n" );
731
-
732
- complete (& card -> fw_loaded );
713
+ return rc ;
733
714
}
734
715
735
716
static int rp2_probe (struct pci_dev * pdev ,
736
717
const struct pci_device_id * id )
737
718
{
719
+ const struct firmware * fw ;
738
720
struct rp2_card * card ;
739
721
struct rp2_uart_port * ports ;
740
722
void __iomem * const * bars ;
@@ -745,7 +727,6 @@ static int rp2_probe(struct pci_dev *pdev,
745
727
return - ENOMEM ;
746
728
pci_set_drvdata (pdev , card );
747
729
spin_lock_init (& card -> card_lock );
748
- init_completion (& card -> fw_loaded );
749
730
750
731
rc = pcim_enable_device (pdev );
751
732
if (rc )
@@ -778,21 +759,23 @@ static int rp2_probe(struct pci_dev *pdev,
778
759
return - ENOMEM ;
779
760
card -> ports = ports ;
780
761
781
- rc = devm_request_irq (& pdev -> dev , pdev -> irq , rp2_uart_interrupt ,
782
- IRQF_SHARED , DRV_NAME , card );
783
- if (rc )
762
+ rc = request_firmware (& fw , RP2_FW_NAME , & pdev -> dev );
763
+ if (rc < 0 ) {
764
+ dev_err (& pdev -> dev , "cannot find '%s' firmware image\n" ,
765
+ RP2_FW_NAME );
784
766
return rc ;
767
+ }
785
768
786
- /*
787
- * Only catastrophic errors (e.g. ENOMEM) are reported here.
788
- * If the FW image is missing, we'll find out in rp2_fw_cb()
789
- * and print an error message.
790
- */
791
- rc = request_firmware_nowait (THIS_MODULE , 1 , RP2_FW_NAME , & pdev -> dev ,
792
- GFP_KERNEL , card , rp2_fw_cb );
769
+ rc = rp2_load_firmware (card , fw );
770
+
771
+ release_firmware (fw );
772
+ if (rc < 0 )
773
+ return rc ;
774
+
775
+ rc = devm_request_irq (& pdev -> dev , pdev -> irq , rp2_uart_interrupt ,
776
+ IRQF_SHARED , DRV_NAME , card );
793
777
if (rc )
794
778
return rc ;
795
- dev_dbg (& pdev -> dev , "waiting for firmware blob...\n" );
796
779
797
780
return 0 ;
798
781
}
@@ -801,7 +784,6 @@ static void rp2_remove(struct pci_dev *pdev)
801
784
{
802
785
struct rp2_card * card = pci_get_drvdata (pdev );
803
786
804
- wait_for_completion (& card -> fw_loaded );
805
787
rp2_remove_ports (card );
806
788
}
807
789
0 commit comments