|
@@ -277,18 +277,24 @@ static int pci_frontend_enable_msix(struct pci_dev *dev,
|
|
|
if (likely(!err)) {
|
|
|
if (likely(!op.value)) {
|
|
|
/* we get the result */
|
|
|
- for (i = 0; i < nvec; i++)
|
|
|
+ for (i = 0; i < nvec; i++) {
|
|
|
+ if (op.msix_entries[i].vector <= 0) {
|
|
|
+ dev_warn(&dev->dev, "MSI-X entry %d is invalid: %d!\n",
|
|
|
+ i, op.msix_entries[i].vector);
|
|
|
+ err = -EINVAL;
|
|
|
+ *(*vector+i) = -1;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
*(*vector+i) = op.msix_entries[i].vector;
|
|
|
- return 0;
|
|
|
+ }
|
|
|
} else {
|
|
|
printk(KERN_DEBUG "enable msix get value %x\n",
|
|
|
op.value);
|
|
|
- return op.value;
|
|
|
}
|
|
|
} else {
|
|
|
dev_err(&dev->dev, "enable msix get err %x\n", err);
|
|
|
- return err;
|
|
|
}
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static void pci_frontend_disable_msix(struct pci_dev *dev)
|
|
@@ -325,6 +331,12 @@ static int pci_frontend_enable_msi(struct pci_dev *dev, int **vector)
|
|
|
err = do_pci_op(pdev, &op);
|
|
|
if (likely(!err)) {
|
|
|
*(*vector) = op.value;
|
|
|
+ if (op.value <= 0) {
|
|
|
+ dev_warn(&dev->dev, "MSI entry is invalid: %d!\n",
|
|
|
+ op.value);
|
|
|
+ err = -EINVAL;
|
|
|
+ *(*vector) = -1;
|
|
|
+ }
|
|
|
} else {
|
|
|
dev_err(&dev->dev, "pci frontend enable msi failed for dev "
|
|
|
"%x:%x\n", op.bus, op.devfn);
|