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