@@ -270,8 +270,6 @@ struct skd_device {
270270 resource_size_t mem_phys [SKD_MAX_BARS ];
271271 u32 mem_size [SKD_MAX_BARS ];
272272
273- skd_irq_type_t irq_type ;
274- u32 msix_count ;
275273 struct skd_msix_entry * msix_entries ;
276274
277275 struct pci_dev * pdev ;
@@ -3821,10 +3819,6 @@ static irqreturn_t skd_qfull_isr(int irq, void *skd_host_data)
38213819 */
38223820
38233821struct skd_msix_entry {
3824- int have_irq ;
3825- u32 vector ;
3826- u32 entry ;
3827- struct skd_device * rsp ;
38283822 char isr_name [30 ];
38293823};
38303824
@@ -3853,193 +3847,120 @@ static struct skd_init_msix_entry msix_entries[SKD_MAX_MSIX_COUNT] = {
38533847 { "(Queue Full 3)" , skd_qfull_isr },
38543848};
38553849
3856- static void skd_release_msix (struct skd_device * skdev )
3857- {
3858- struct skd_msix_entry * qentry ;
3859- int i ;
3860-
3861- if (skdev -> msix_entries ) {
3862- for (i = 0 ; i < skdev -> msix_count ; i ++ ) {
3863- qentry = & skdev -> msix_entries [i ];
3864- skdev = qentry -> rsp ;
3865-
3866- if (qentry -> have_irq )
3867- devm_free_irq (& skdev -> pdev -> dev ,
3868- qentry -> vector , qentry -> rsp );
3869- }
3870-
3871- kfree (skdev -> msix_entries );
3872- }
3873-
3874- if (skdev -> msix_count )
3875- pci_disable_msix (skdev -> pdev );
3876-
3877- skdev -> msix_count = 0 ;
3878- skdev -> msix_entries = NULL ;
3879- }
3880-
38813850static int skd_acquire_msix (struct skd_device * skdev )
38823851{
38833852 int i , rc ;
38843853 struct pci_dev * pdev = skdev -> pdev ;
3885- struct msix_entry * entries ;
3886- struct skd_msix_entry * qentry ;
3887-
3888- entries = kzalloc (sizeof (struct msix_entry ) * SKD_MAX_MSIX_COUNT ,
3889- GFP_KERNEL );
3890- if (!entries )
3891- return - ENOMEM ;
38923854
3893- for (i = 0 ; i < SKD_MAX_MSIX_COUNT ; i ++ )
3894- entries [i ].entry = i ;
3895-
3896- rc = pci_enable_msix_exact (pdev , entries , SKD_MAX_MSIX_COUNT );
3897- if (rc ) {
3855+ rc = pci_alloc_irq_vectors (pdev , SKD_MAX_MSIX_COUNT , SKD_MAX_MSIX_COUNT ,
3856+ PCI_IRQ_MSIX );
3857+ if (rc < 0 ) {
38983858 pr_err ("(%s): failed to enable MSI-X %d\n" ,
38993859 skd_name (skdev ), rc );
39003860 goto msix_out ;
39013861 }
39023862
3903- skdev -> msix_count = SKD_MAX_MSIX_COUNT ;
3904- skdev -> msix_entries = kzalloc (sizeof (struct skd_msix_entry ) *
3905- skdev -> msix_count , GFP_KERNEL );
3863+ skdev -> msix_entries = kcalloc (SKD_MAX_MSIX_COUNT ,
3864+ sizeof (struct skd_msix_entry ), GFP_KERNEL );
39063865 if (!skdev -> msix_entries ) {
39073866 rc = - ENOMEM ;
39083867 pr_err ("(%s): msix table allocation error\n" ,
39093868 skd_name (skdev ));
39103869 goto msix_out ;
39113870 }
39123871
3913- for (i = 0 ; i < skdev -> msix_count ; i ++ ) {
3914- qentry = & skdev -> msix_entries [i ];
3915- qentry -> vector = entries [i ].vector ;
3916- qentry -> entry = entries [i ].entry ;
3917- qentry -> rsp = NULL ;
3918- qentry -> have_irq = 0 ;
3919- pr_debug ("%s:%s:%d %s: <%s> msix (%d) vec %d, entry %x\n" ,
3920- skdev -> name , __func__ , __LINE__ ,
3921- pci_name (pdev ), skdev -> name ,
3922- i , qentry -> vector , qentry -> entry );
3923- }
3924-
39253872 /* Enable MSI-X vectors for the base queue */
3926- for (i = 0 ; i < skdev -> msix_count ; i ++ ) {
3927- qentry = & skdev -> msix_entries [i ];
3873+ for (i = 0 ; i < SKD_MAX_MSIX_COUNT ; i ++ ) {
3874+ struct skd_msix_entry * qentry = & skdev -> msix_entries [i ];
3875+
39283876 snprintf (qentry -> isr_name , sizeof (qentry -> isr_name ),
39293877 "%s%d-msix %s" , DRV_NAME , skdev -> devno ,
39303878 msix_entries [i ].name );
3931- rc = devm_request_irq (& skdev -> pdev -> dev , qentry -> vector ,
3932- msix_entries [i ].handler , 0 ,
3933- qentry -> isr_name , skdev );
3879+
3880+ rc = devm_request_irq (& skdev -> pdev -> dev ,
3881+ pci_irq_vector (skdev -> pdev , i ),
3882+ msix_entries [i ].handler , 0 ,
3883+ qentry -> isr_name , skdev );
39343884 if (rc ) {
39353885 pr_err ("(%s): Unable to register(%d) MSI-X "
39363886 "handler %d: %s\n" ,
39373887 skd_name (skdev ), rc , i , qentry -> isr_name );
39383888 goto msix_out ;
3939- } else {
3940- qentry -> have_irq = 1 ;
3941- qentry -> rsp = skdev ;
39423889 }
39433890 }
3891+
39443892 pr_debug ("%s:%s:%d %s: <%s> msix %d irq(s) enabled\n" ,
39453893 skdev -> name , __func__ , __LINE__ ,
3946- pci_name (pdev ), skdev -> name , skdev -> msix_count );
3894+ pci_name (pdev ), skdev -> name , SKD_MAX_MSIX_COUNT );
39473895 return 0 ;
39483896
39493897msix_out :
3950- if (entries )
3951- kfree (entries );
3952- skd_release_msix (skdev );
3898+ while (-- i >= 0 )
3899+ devm_free_irq (& pdev -> dev , pci_irq_vector (pdev , i ), skdev );
3900+ kfree (skdev -> msix_entries );
3901+ skdev -> msix_entries = NULL ;
39533902 return rc ;
39543903}
39553904
39563905static int skd_acquire_irq (struct skd_device * skdev )
39573906{
3907+ struct pci_dev * pdev = skdev -> pdev ;
3908+ unsigned int irq_flag = PCI_IRQ_LEGACY ;
39583909 int rc ;
3959- struct pci_dev * pdev ;
39603910
3961- pdev = skdev -> pdev ;
3962- skdev -> msix_count = 0 ;
3963-
3964- RETRY_IRQ_TYPE :
3965- switch (skdev -> irq_type ) {
3966- case SKD_IRQ_MSIX :
3911+ if (skd_isr_type == SKD_IRQ_MSIX ) {
39673912 rc = skd_acquire_msix (skdev );
39683913 if (!rc )
3969- pr_info ("(%s): MSI-X %d irqs enabled\n" ,
3970- skd_name (skdev ), skdev -> msix_count );
3971- else {
3972- pr_err (
3973- "(%s): failed to enable MSI-X, re-trying with MSI %d\n" ,
3974- skd_name (skdev ), rc );
3975- skdev -> irq_type = SKD_IRQ_MSI ;
3976- goto RETRY_IRQ_TYPE ;
3977- }
3978- break ;
3979- case SKD_IRQ_MSI :
3980- snprintf (skdev -> isr_name , sizeof (skdev -> isr_name ), "%s%d-msi" ,
3981- DRV_NAME , skdev -> devno );
3982- rc = pci_enable_msi_range (pdev , 1 , 1 );
3983- if (rc > 0 ) {
3984- rc = devm_request_irq (& pdev -> dev , pdev -> irq , skd_isr , 0 ,
3985- skdev -> isr_name , skdev );
3986- if (rc ) {
3987- pci_disable_msi (pdev );
3988- pr_err (
3989- "(%s): failed to allocate the MSI interrupt %d\n" ,
3990- skd_name (skdev ), rc );
3991- goto RETRY_IRQ_LEGACY ;
3992- }
3993- pr_info ("(%s): MSI irq %d enabled\n" ,
3994- skd_name (skdev ), pdev -> irq );
3995- } else {
3996- RETRY_IRQ_LEGACY :
3997- pr_err (
3998- "(%s): failed to enable MSI, re-trying with LEGACY %d\n" ,
3999- skd_name (skdev ), rc );
4000- skdev -> irq_type = SKD_IRQ_LEGACY ;
4001- goto RETRY_IRQ_TYPE ;
4002- }
4003- break ;
4004- case SKD_IRQ_LEGACY :
4005- snprintf (skdev -> isr_name , sizeof (skdev -> isr_name ),
4006- "%s%d-legacy" , DRV_NAME , skdev -> devno );
4007- rc = devm_request_irq (& pdev -> dev , pdev -> irq , skd_isr ,
4008- IRQF_SHARED , skdev -> isr_name , skdev );
4009- if (!rc )
4010- pr_info ("(%s): LEGACY irq %d enabled\n" ,
4011- skd_name (skdev ), pdev -> irq );
4012- else
4013- pr_err ("(%s): request LEGACY irq error %d\n" ,
4014- skd_name (skdev ), rc );
4015- break ;
4016- default :
4017- pr_info ("(%s): irq_type %d invalid, re-set to %d\n" ,
4018- skd_name (skdev ), skdev -> irq_type , SKD_IRQ_DEFAULT );
4019- skdev -> irq_type = SKD_IRQ_LEGACY ;
4020- goto RETRY_IRQ_TYPE ;
3914+ return 0 ;
3915+
3916+ pr_err ("(%s): failed to enable MSI-X, re-trying with MSI %d\n" ,
3917+ skd_name (skdev ), rc );
40213918 }
4022- return rc ;
3919+
3920+ snprintf (skdev -> isr_name , sizeof (skdev -> isr_name ), "%s%d" , DRV_NAME ,
3921+ skdev -> devno );
3922+
3923+ if (skd_isr_type != SKD_IRQ_LEGACY )
3924+ irq_flag |= PCI_IRQ_MSI ;
3925+ rc = pci_alloc_irq_vectors (pdev , 1 , 1 , irq_flag );
3926+ if (rc < 0 ) {
3927+ pr_err ("(%s): failed to allocate the MSI interrupt %d\n" ,
3928+ skd_name (skdev ), rc );
3929+ return rc ;
3930+ }
3931+
3932+ rc = devm_request_irq (& pdev -> dev , pdev -> irq , skd_isr ,
3933+ pdev -> msi_enabled ? 0 : IRQF_SHARED ,
3934+ skdev -> isr_name , skdev );
3935+ if (rc ) {
3936+ pci_free_irq_vectors (pdev );
3937+ pr_err ("(%s): failed to allocate interrupt %d\n" ,
3938+ skd_name (skdev ), rc );
3939+ return rc ;
3940+ }
3941+
3942+ return 0 ;
40233943}
40243944
40253945static void skd_release_irq (struct skd_device * skdev )
40263946{
4027- switch (skdev -> irq_type ) {
4028- case SKD_IRQ_MSIX :
4029- skd_release_msix (skdev );
4030- break ;
4031- case SKD_IRQ_MSI :
4032- devm_free_irq (& skdev -> pdev -> dev , skdev -> pdev -> irq , skdev );
4033- pci_disable_msi (skdev -> pdev );
4034- break ;
4035- case SKD_IRQ_LEGACY :
4036- devm_free_irq (& skdev -> pdev -> dev , skdev -> pdev -> irq , skdev );
4037- break ;
4038- default :
4039- pr_err ("(%s): wrong irq type %d!" ,
4040- skd_name (skdev ), skdev -> irq_type );
4041- break ;
3947+ struct pci_dev * pdev = skdev -> pdev ;
3948+
3949+ if (skdev -> msix_entries ) {
3950+ int i ;
3951+
3952+ for (i = 0 ; i < SKD_MAX_MSIX_COUNT ; i ++ ) {
3953+ devm_free_irq (& pdev -> dev , pci_irq_vector (pdev , i ),
3954+ skdev );
3955+ }
3956+
3957+ kfree (skdev -> msix_entries );
3958+ skdev -> msix_entries = NULL ;
3959+ } else {
3960+ devm_free_irq (& pdev -> dev , pdev -> irq , skdev );
40423961 }
3962+
3963+ pci_free_irq_vectors (pdev );
40433964}
40443965
40453966/*
@@ -4402,7 +4323,6 @@ static struct skd_device *skd_construct(struct pci_dev *pdev)
44024323 skdev -> pdev = pdev ;
44034324 skdev -> devno = skd_next_devno ++ ;
44044325 skdev -> major = blk_major ;
4405- skdev -> irq_type = skd_isr_type ;
44064326 sprintf (skdev -> name , DRV_NAME "%d" , skdev -> devno );
44074327 skdev -> dev_max_queue_depth = 0 ;
44084328
0 commit comments