Commit 4c1588a2 authored by Rick Farrington's avatar Rick Farrington Committed by David S. Miller

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: default avatarRick Farrington <ricardo.farrington@cavium.com>
Signed-off-by: default avatarSatanand Burla <satananda.burla@cavium.com>
Signed-off-by: default avatarFelix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a97051f4
...@@ -431,11 +431,6 @@ int cn23xx_octeon_pfvf_handshake(struct octeon_device *oct) ...@@ -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) ...@@ -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) ...@@ -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;
atomic_set(&oct->status, OCT_DEV_INTR_SET_DONE);
/* ***************************************************************
* 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 */
oct->fn_list.enable_interrupt(oct, OCTEON_ALL_INTR);
if (cn23xx_octeon_pfvf_handshake(oct)) if (cn23xx_octeon_pfvf_handshake(oct))
return 1; 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 */ /* 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);
/* 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)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment