@@ -335,38 +335,13 @@ static int msi_verify_entries(struct pci_dev *dev)
335
335
return !entry ? 0 : - EIO ;
336
336
}
337
337
338
- /**
339
- * msi_capability_init - configure device's MSI capability structure
340
- * @dev: pointer to the pci_dev data structure of MSI device function
341
- * @nvec: number of interrupts to allocate
342
- * @affd: description of automatic IRQ affinity assignments (may be %NULL)
343
- *
344
- * Setup the MSI capability structure of the device with the requested
345
- * number of interrupts. A return value of zero indicates the successful
346
- * setup of an entry with the new MSI IRQ. A negative return value indicates
347
- * an error, and a positive return value indicates the number of interrupts
348
- * which could have been allocated.
349
- */
350
- static int msi_capability_init (struct pci_dev * dev , int nvec ,
351
- struct irq_affinity * affd )
338
+ static int __msi_capability_init (struct pci_dev * dev , int nvec , struct irq_affinity_desc * masks )
352
339
{
340
+ int ret = msi_setup_msi_desc (dev , nvec , masks );
353
341
struct msi_desc * entry , desc ;
354
- int ret ;
355
342
356
- /* Reject multi-MSI early on irq domain enabled architectures */
357
- if (nvec > 1 && !pci_msi_domain_supports (dev , MSI_FLAG_MULTI_PCI_MSI , ALLOW_LEGACY ))
358
- return 1 ;
359
-
360
- /* Disable MSI during setup in the hardware to erase stale state */
361
- pci_msi_set_enable (dev , 0 );
362
-
363
- struct irq_affinity_desc * masks __free (kfree ) =
364
- affd ? irq_create_affinity_masks (nvec , affd ) : NULL ;
365
-
366
- msi_lock_descs (& dev -> dev );
367
- ret = msi_setup_msi_desc (dev , nvec , masks );
368
343
if (ret )
369
- goto unlock ;
344
+ return ret ;
370
345
371
346
/* All MSIs are unmasked by default; mask them all */
372
347
entry = msi_first_desc (& dev -> dev , MSI_DESC_ALL );
@@ -394,16 +369,45 @@ static int msi_capability_init(struct pci_dev *dev, int nvec,
394
369
395
370
pcibios_free_irq (dev );
396
371
dev -> irq = entry -> irq ;
397
- goto unlock ;
398
-
372
+ return 0 ;
399
373
err :
400
374
pci_msi_unmask (& desc , msi_multi_mask (& desc ));
401
375
pci_free_msi_irqs (dev );
402
- unlock :
403
- msi_unlock_descs (& dev -> dev );
404
376
return ret ;
405
377
}
406
378
379
+ /**
380
+ * msi_capability_init - configure device's MSI capability structure
381
+ * @dev: pointer to the pci_dev data structure of MSI device function
382
+ * @nvec: number of interrupts to allocate
383
+ * @affd: description of automatic IRQ affinity assignments (may be %NULL)
384
+ *
385
+ * Setup the MSI capability structure of the device with the requested
386
+ * number of interrupts. A return value of zero indicates the successful
387
+ * setup of an entry with the new MSI IRQ. A negative return value indicates
388
+ * an error, and a positive return value indicates the number of interrupts
389
+ * which could have been allocated.
390
+ */
391
+ static int msi_capability_init (struct pci_dev * dev , int nvec ,
392
+ struct irq_affinity * affd )
393
+ {
394
+ /* Reject multi-MSI early on irq domain enabled architectures */
395
+ if (nvec > 1 && !pci_msi_domain_supports (dev , MSI_FLAG_MULTI_PCI_MSI , ALLOW_LEGACY ))
396
+ return 1 ;
397
+
398
+ /*
399
+ * Disable MSI during setup in the hardware, but mark it enabled
400
+ * so that setup code can evaluate it.
401
+ */
402
+ pci_msi_set_enable (dev , 0 );
403
+
404
+ struct irq_affinity_desc * masks __free (kfree ) =
405
+ affd ? irq_create_affinity_masks (nvec , affd ) : NULL ;
406
+
407
+ guard (msi_descs_lock )(& dev -> dev );
408
+ return __msi_capability_init (dev , nvec , masks );
409
+ }
410
+
407
411
int __pci_enable_msi_range (struct pci_dev * dev , int minvec , int maxvec ,
408
412
struct irq_affinity * affd )
409
413
{
0 commit comments