liquidio: VF interrupt initialization cleanup
Set initialization state variable to (reflect interrupt initialization) at correct time (immediately after having configured interrupts). This fixes problem of inconsistent IRQ allocation in case of [obscure] failure when negotiating with PF driver during init. Clean-up of interrupt enablement during initialization & avoid potential race condition with chip-specific code (i.e. perform interrupt control in main driver module). Added explanatory comments regarding interrupt enablement. Signed-off-by: Rick Farrington <ricardo.farrington@cavium.com> Signed-off-by: Satanand Burla <satananda.burla@cavium.com> Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a97051f455
commit
4c1588a279
@ -431,11 +431,6 @@ int cn23xx_octeon_pfvf_handshake(struct octeon_device *oct)
|
|||||||
mbox_cmd.fn = (octeon_mbox_callback_t)octeon_pfvf_hs_callback;
|
mbox_cmd.fn = (octeon_mbox_callback_t)octeon_pfvf_hs_callback;
|
||||||
mbox_cmd.fn_arg = &status;
|
mbox_cmd.fn_arg = &status;
|
||||||
|
|
||||||
/* Interrupts are not enabled at this point.
|
|
||||||
* Enable them with default oq ticks
|
|
||||||
*/
|
|
||||||
oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR);
|
|
||||||
|
|
||||||
octeon_mbox_write(oct, &mbox_cmd);
|
octeon_mbox_write(oct, &mbox_cmd);
|
||||||
|
|
||||||
atomic_set(&status, 0);
|
atomic_set(&status, 0);
|
||||||
@ -444,11 +439,6 @@ int cn23xx_octeon_pfvf_handshake(struct octeon_device *oct)
|
|||||||
schedule_timeout_uninterruptible(1);
|
schedule_timeout_uninterruptible(1);
|
||||||
} while ((!atomic_read(&status)) && (count++ < 100000));
|
} while ((!atomic_read(&status)) && (count++ < 100000));
|
||||||
|
|
||||||
/* Disable the interrupt so that the interrupsts will be reenabled
|
|
||||||
* with the oq ticks received from the PF
|
|
||||||
*/
|
|
||||||
oct->fn_list.disable_interrupt(oct, OCTEON_ALL_INTR);
|
|
||||||
|
|
||||||
ret = atomic_read(&status);
|
ret = atomic_read(&status);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
dev_err(&oct->pci_dev->dev, "octeon_pfvf_handshake timeout\n");
|
dev_err(&oct->pci_dev->dev, "octeon_pfvf_handshake timeout\n");
|
||||||
|
@ -3188,13 +3188,28 @@ static int octeon_device_init(struct octeon_device *oct)
|
|||||||
if (octeon_setup_interrupt(oct))
|
if (octeon_setup_interrupt(oct))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (cn23xx_octeon_pfvf_handshake(oct))
|
atomic_set(&oct->status, OCT_DEV_INTR_SET_DONE);
|
||||||
return 1;
|
|
||||||
|
/* ***************************************************************
|
||||||
|
* The interrupts need to be enabled for the PF<-->VF handshake.
|
||||||
|
* They are [re]-enabled after the PF<-->VF handshake so that the
|
||||||
|
* correct OQ tick value is used (i.e. the value retrieved from
|
||||||
|
* the PF as part of the handshake).
|
||||||
|
*/
|
||||||
|
|
||||||
/* Enable Octeon device interrupts */
|
/* Enable Octeon device interrupts */
|
||||||
oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR);
|
oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR);
|
||||||
|
|
||||||
atomic_set(&oct->status, OCT_DEV_INTR_SET_DONE);
|
if (cn23xx_octeon_pfvf_handshake(oct))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Here we [re]-enable the interrupts so that the correct OQ tick value
|
||||||
|
* is used (i.e. the value that was retrieved during the handshake)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Enable Octeon device interrupts */
|
||||||
|
oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR);
|
||||||
|
/* *************************************************************** */
|
||||||
|
|
||||||
/* Enable the input and output queues for this Octeon device */
|
/* Enable the input and output queues for this Octeon device */
|
||||||
if (oct->fn_list.enable_io_queues(oct)) {
|
if (oct->fn_list.enable_io_queues(oct)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user