linux/drivers/net/ethernet/intel/fm10k
Jacob Keller 325782a173 fm10k: don't re-map queues when a mailbox message suffices
When the PF assigns a new MAC address to a VF it uses the base address
registers to store the MAC address. This allows a VF which loads after
this setup the ability to get the initial address without having to wait
for a mailbox message. Unfortunately to do this, the PF must take queue
ownership away from the VF, which can cause fault errors when there is
already an active VF driver.

This queue ownership assignment causes race condition between the PF and
the VF such that potentially a VF can cause FUM fault errors due to
normal PF/VF driver behavior.

It is not safe to simply allow the PF to write the base address
registers without taking queue ownership back as the PF must also
disable the queues, and this would impact active VF use. The current
code is safe because the queue ownership will prevent the VF from
actually writing but does trigger the FUM fault.

We can do better by simply avoiding the register write process when
a mailbox message suffices. If the message can be sent over the mailbox,
then we will not perform the queue ownership assignment and we won't
update the base address to be the same as the MAC address.

We do still have to write the TXQCTL registers in order to update the
VID of the queue. This is necessary because the TXQCTL register is
read-only from the VF, and thus the VF cannot do this for itself. This
register does not need to wait for the Tx queue to be disabled and is
safe for the PF to write during normal VF operation, so we move this
write to the top of the function above the mailbox message. Without
this, the TXQCTL register would be misconfigured and cause the VF to Tx
hang.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
2016-08-29 01:31:03 -07:00
..
Makefile fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00
fm10k.h fm10k: add support for Rx offloads on one Geneve tunnel 2016-08-29 01:31:03 -07:00
fm10k_common.c fm10k: don't try to stop queues if we've lost hw_addr 2016-08-29 01:31:03 -07:00
fm10k_common.h fm10k: prefer READ_ONCE instead of ACCESS_ONCE 2016-08-29 01:31:03 -07:00
fm10k_dcbnl.c fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00
fm10k_debugfs.c fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00
fm10k_ethtool.c fm10k: remove fm10k_get_reta_size from namespace 2016-08-29 01:31:03 -07:00
fm10k_iov.c fm10k: prefer READ_ONCE instead of ACCESS_ONCE 2016-08-29 01:31:03 -07:00
fm10k_main.c fm10k: rework vxlan_port offload before adding geneve support 2016-08-29 01:31:03 -07:00
fm10k_mbx.c fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00
fm10k_mbx.h fm10k: Reset mailbox global interrupts 2016-07-20 15:22:10 -07:00
fm10k_netdev.c fm10k: add support for Rx offloads on one Geneve tunnel 2016-08-29 01:31:03 -07:00
fm10k_pci.c fm10k: don't clear the RXQCTL register when enabling or disabling queues 2016-08-29 01:31:03 -07:00
fm10k_pf.c fm10k: don't re-map queues when a mailbox message suffices 2016-08-29 01:31:03 -07:00
fm10k_pf.h fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00
fm10k_tlv.c fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00
fm10k_tlv.h fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00
fm10k_type.h fm10k: add support for Rx offloads on one Geneve tunnel 2016-08-29 01:31:03 -07:00
fm10k_vf.c fm10k: don't stop reset due to FM10K_ERR_REQUESTS_PENDING 2016-07-20 15:22:11 -07:00
fm10k_vf.h fm10k: consistently use Intel(R) for driver names 2016-04-20 23:07:34 -07:00