|
@@ -770,6 +770,7 @@ static void delete_glists(struct lio *lio)
|
|
|
}
|
|
|
|
|
|
kfree((void *)lio->glist);
|
|
|
+ kfree((void *)lio->glist_lock);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1329,6 +1330,7 @@ liquidio_probe(struct pci_dev *pdev,
|
|
|
complete(&first_stage);
|
|
|
|
|
|
if (octeon_device_init(oct_dev)) {
|
|
|
+ complete(&hs->init);
|
|
|
liquidio_remove(pdev);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
@@ -1353,7 +1355,15 @@ liquidio_probe(struct pci_dev *pdev,
|
|
|
oct_dev->watchdog_task = kthread_create(
|
|
|
liquidio_watchdog, oct_dev,
|
|
|
"liowd/%02hhx:%02hhx.%hhx", bus, device, function);
|
|
|
- wake_up_process(oct_dev->watchdog_task);
|
|
|
+ if (!IS_ERR(oct_dev->watchdog_task)) {
|
|
|
+ wake_up_process(oct_dev->watchdog_task);
|
|
|
+ } else {
|
|
|
+ oct_dev->watchdog_task = NULL;
|
|
|
+ dev_err(&oct_dev->pci_dev->dev,
|
|
|
+ "failed to create kernel_thread\n");
|
|
|
+ liquidio_remove(pdev);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1417,6 +1427,8 @@ static void octeon_destroy_resources(struct octeon_device *oct)
|
|
|
if (lio_wait_for_oq_pkts(oct))
|
|
|
dev_err(&oct->pci_dev->dev, "OQ had pending packets\n");
|
|
|
|
|
|
+ /* fallthrough */
|
|
|
+ case OCT_DEV_INTR_SET_DONE:
|
|
|
/* Disable interrupts */
|
|
|
oct->fn_list.disable_interrupt(oct, OCTEON_ALL_INTR);
|
|
|
|
|
@@ -1443,6 +1455,8 @@ static void octeon_destroy_resources(struct octeon_device *oct)
|
|
|
pci_disable_msi(oct->pci_dev);
|
|
|
}
|
|
|
|
|
|
+ /* fallthrough */
|
|
|
+ case OCT_DEV_MSIX_ALLOC_VECTOR_DONE:
|
|
|
if (OCTEON_CN23XX_PF(oct))
|
|
|
octeon_free_ioq_vector(oct);
|
|
|
|
|
@@ -1508,10 +1522,13 @@ static void octeon_destroy_resources(struct octeon_device *oct)
|
|
|
octeon_unmap_pci_barx(oct, 1);
|
|
|
|
|
|
/* fallthrough */
|
|
|
- case OCT_DEV_BEGIN_STATE:
|
|
|
+ case OCT_DEV_PCI_ENABLE_DONE:
|
|
|
+ pci_clear_master(oct->pci_dev);
|
|
|
/* Disable the device, releasing the PCI INT */
|
|
|
pci_disable_device(oct->pci_dev);
|
|
|
|
|
|
+ /* fallthrough */
|
|
|
+ case OCT_DEV_BEGIN_STATE:
|
|
|
/* Nothing to be done here either */
|
|
|
break;
|
|
|
} /* end switch (oct->status) */
|
|
@@ -1781,6 +1798,7 @@ static int octeon_pci_os_setup(struct octeon_device *oct)
|
|
|
|
|
|
if (dma_set_mask_and_coherent(&oct->pci_dev->dev, DMA_BIT_MASK(64))) {
|
|
|
dev_err(&oct->pci_dev->dev, "Unexpected DMA device capability\n");
|
|
|
+ pci_disable_device(oct->pci_dev);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -4434,6 +4452,8 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
|
|
|
if (octeon_pci_os_setup(octeon_dev))
|
|
|
return 1;
|
|
|
|
|
|
+ atomic_set(&octeon_dev->status, OCT_DEV_PCI_ENABLE_DONE);
|
|
|
+
|
|
|
/* Identify the Octeon type and map the BAR address space. */
|
|
|
if (octeon_chip_specific_setup(octeon_dev)) {
|
|
|
dev_err(&octeon_dev->pci_dev->dev, "Chip specific setup failed\n");
|
|
@@ -4505,9 +4525,6 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
|
|
|
if (octeon_setup_instr_queues(octeon_dev)) {
|
|
|
dev_err(&octeon_dev->pci_dev->dev,
|
|
|
"instruction queue initialization failed\n");
|
|
|
- /* On error, release any previously allocated queues */
|
|
|
- for (j = 0; j < octeon_dev->num_iqs; j++)
|
|
|
- octeon_delete_instr_queue(octeon_dev, j);
|
|
|
return 1;
|
|
|
}
|
|
|
atomic_set(&octeon_dev->status, OCT_DEV_INSTR_QUEUE_INIT_DONE);
|
|
@@ -4523,9 +4540,6 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
|
|
|
|
|
|
if (octeon_setup_output_queues(octeon_dev)) {
|
|
|
dev_err(&octeon_dev->pci_dev->dev, "Output queue initialization failed\n");
|
|
|
- /* Release any previously allocated queues */
|
|
|
- for (j = 0; j < octeon_dev->num_oqs; j++)
|
|
|
- octeon_delete_droq(octeon_dev, j);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -4542,6 +4556,7 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
|
|
|
dev_err(&octeon_dev->pci_dev->dev, "OCTEON: ioq vector allocation failed\n");
|
|
|
return 1;
|
|
|
}
|
|
|
+ atomic_set(&octeon_dev->status, OCT_DEV_MSIX_ALLOC_VECTOR_DONE);
|
|
|
|
|
|
} else {
|
|
|
/* The input and output queue registers were setup earlier (the
|
|
@@ -4569,6 +4584,8 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
|
|
|
/* Enable Octeon device interrupts */
|
|
|
octeon_dev->fn_list.enable_interrupt(octeon_dev, OCTEON_ALL_INTR);
|
|
|
|
|
|
+ atomic_set(&octeon_dev->status, OCT_DEV_INTR_SET_DONE);
|
|
|
+
|
|
|
/* Enable the input and output queues for this Octeon device */
|
|
|
ret = octeon_dev->fn_list.enable_io_queues(octeon_dev);
|
|
|
if (ret) {
|