Code Review
/
kvmfornfv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git]
/
kernel
/
drivers
/
net
/
ethernet
/
sfc
/
siena_sriov.c
diff --git
a/kernel/drivers/net/ethernet/sfc/siena_sriov.c
b/kernel/drivers/net/ethernet/sfc/siena_sriov.c
index
fe83430
..
da7b94f
100644
(file)
--- a/
kernel/drivers/net/ethernet/sfc/siena_sriov.c
+++ b/
kernel/drivers/net/ethernet/sfc/siena_sriov.c
@@
-16,6
+16,7
@@
#include "filter.h"
#include "mcdi_pcol.h"
#include "farch_regs.h"
#include "filter.h"
#include "mcdi_pcol.h"
#include "farch_regs.h"
+#include "siena_sriov.h"
#include "vfdi.h"
/* Number of longs required to track all the VIs in a VF */
#include "vfdi.h"
/* Number of longs required to track all the VIs in a VF */
@@
-38,7
+39,7
@@
enum efx_vf_tx_filter_mode {
};
/**
};
/**
- * struct
efx
_vf - Back-end resource and protocol state for a PCI VF
+ * struct
siena
_vf - Back-end resource and protocol state for a PCI VF
* @efx: The Efx NIC owning this VF
* @pci_rid: The PCI requester ID for this VF
* @pci_name: The PCI name (formatted address) of this VF
* @efx: The Efx NIC owning this VF
* @pci_rid: The PCI requester ID for this VF
* @pci_name: The PCI name (formatted address) of this VF
@@
-83,7
+84,7
@@
enum efx_vf_tx_filter_mode {
* @rxq_retry_count: Number of receive queues in @rxq_retry_mask.
* @reset_work: Work item to schedule a VF reset.
*/
* @rxq_retry_count: Number of receive queues in @rxq_retry_mask.
* @reset_work: Work item to schedule a VF reset.
*/
-struct
efx
_vf {
+struct
siena
_vf {
struct efx_nic *efx;
unsigned int pci_rid;
char pci_name[13]; /* dddd:bb:dd.f */
struct efx_nic *efx;
unsigned int pci_rid;
char pci_name[13]; /* dddd:bb:dd.f */
@@
-189,7
+190,7
@@
MODULE_PARM_DESC(max_vfs,
*/
static struct workqueue_struct *vfdi_workqueue;
*/
static struct workqueue_struct *vfdi_workqueue;
-static unsigned abs_index(struct
efx
_vf *vf, unsigned index)
+static unsigned abs_index(struct
siena
_vf *vf, unsigned index)
{
return EFX_VI_BASE + vf->index * efx_vf_size(vf->efx) + index;
}
{
return EFX_VI_BASE + vf->index * efx_vf_size(vf->efx) + index;
}
@@
-207,8
+208,8
@@
static int efx_siena_sriov_cmd(struct efx_nic *efx, bool enable,
MCDI_SET_DWORD(inbuf, SRIOV_IN_VI_BASE, EFX_VI_BASE);
MCDI_SET_DWORD(inbuf, SRIOV_IN_VF_COUNT, efx->vf_count);
MCDI_SET_DWORD(inbuf, SRIOV_IN_VI_BASE, EFX_VI_BASE);
MCDI_SET_DWORD(inbuf, SRIOV_IN_VF_COUNT, efx->vf_count);
- rc = efx_mcdi_rpc(efx, MC_CMD_SRIOV, inbuf, MC_CMD_SRIOV_IN_LEN,
- outbuf, MC_CMD_SRIOV_OUT_LEN, &outlen);
+ rc = efx_mcdi_rpc
_quiet
(efx, MC_CMD_SRIOV, inbuf, MC_CMD_SRIOV_IN_LEN,
+
outbuf, MC_CMD_SRIOV_OUT_LEN, &outlen);
if (rc)
return rc;
if (outlen < MC_CMD_SRIOV_OUT_LEN)
if (rc)
return rc;
if (outlen < MC_CMD_SRIOV_OUT_LEN)
@@
-299,7
+300,7
@@
out:
/* The TX filter is entirely controlled by this driver, and is modified
* underneath the feet of the VF
*/
/* The TX filter is entirely controlled by this driver, and is modified
* underneath the feet of the VF
*/
-static void efx_siena_sriov_reset_tx_filter(struct
efx
_vf *vf)
+static void efx_siena_sriov_reset_tx_filter(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct efx_filter_spec filter;
{
struct efx_nic *efx = vf->efx;
struct efx_filter_spec filter;
@@
-343,7
+344,7
@@
static void efx_siena_sriov_reset_tx_filter(struct efx_vf *vf)
}
/* The RX filter is managed here on behalf of the VF driver */
}
/* The RX filter is managed here on behalf of the VF driver */
-static void efx_siena_sriov_reset_rx_filter(struct
efx
_vf *vf)
+static void efx_siena_sriov_reset_rx_filter(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct efx_filter_spec filter;
{
struct efx_nic *efx = vf->efx;
struct efx_filter_spec filter;
@@
-382,7
+383,7
@@
static void efx_siena_sriov_reset_rx_filter(struct efx_vf *vf)
}
}
}
}
-static void __efx_siena_sriov_update_vf_addr(struct
efx
_vf *vf)
+static void __efx_siena_sriov_update_vf_addr(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
@@
-397,7
+398,7
@@
static void __efx_siena_sriov_update_vf_addr(struct efx_vf *vf)
* local_page_list, either by acquiring local_lock or by running from
* efx_siena_sriov_peer_work()
*/
* local_page_list, either by acquiring local_lock or by running from
* efx_siena_sriov_peer_work()
*/
-static void __efx_siena_sriov_push_vf_status(struct
efx
_vf *vf)
+static void __efx_siena_sriov_push_vf_status(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
@@
-509,8
+510,9
@@
static bool bad_buf_count(unsigned buf_count, unsigned max_entry_count)
* Optionally set VF index and VI index within the VF.
*/
static bool map_vi_index(struct efx_nic *efx, unsigned abs_index,
* Optionally set VF index and VI index within the VF.
*/
static bool map_vi_index(struct efx_nic *efx, unsigned abs_index,
- struct
efx
_vf **vf_out, unsigned *rel_index_out)
+ struct
siena
_vf **vf_out, unsigned *rel_index_out)
{
{
+ struct siena_nic_data *nic_data = efx->nic_data;
unsigned vf_i;
if (abs_index < EFX_VI_BASE)
unsigned vf_i;
if (abs_index < EFX_VI_BASE)
@@
-520,13
+522,13
@@
static bool map_vi_index(struct efx_nic *efx, unsigned abs_index,
return true;
if (vf_out)
return true;
if (vf_out)
- *vf_out =
efx
->vf + vf_i;
+ *vf_out =
nic_data
->vf + vf_i;
if (rel_index_out)
*rel_index_out = abs_index % efx_vf_size(efx);
return false;
}
if (rel_index_out)
*rel_index_out = abs_index % efx_vf_size(efx);
return false;
}
-static int efx_vfdi_init_evq(struct
efx
_vf *vf)
+static int efx_vfdi_init_evq(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
{
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
@@
-567,7
+569,7
@@
static int efx_vfdi_init_evq(struct efx_vf *vf)
return VFDI_RC_SUCCESS;
}
return VFDI_RC_SUCCESS;
}
-static int efx_vfdi_init_rxq(struct
efx
_vf *vf)
+static int efx_vfdi_init_rxq(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
{
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
@@
-608,7
+610,7
@@
static int efx_vfdi_init_rxq(struct efx_vf *vf)
return VFDI_RC_SUCCESS;
}
return VFDI_RC_SUCCESS;
}
-static int efx_vfdi_init_txq(struct
efx
_vf *vf)
+static int efx_vfdi_init_txq(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
{
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
@@
-655,7
+657,7
@@
static int efx_vfdi_init_txq(struct efx_vf *vf)
}
/* Returns true when efx_vfdi_fini_all_queues should wake */
}
/* Returns true when efx_vfdi_fini_all_queues should wake */
-static bool efx_vfdi_flush_wake(struct
efx
_vf *vf)
+static bool efx_vfdi_flush_wake(struct
siena
_vf *vf)
{
/* Ensure that all updates are visible to efx_vfdi_fini_all_queues() */
smp_mb();
{
/* Ensure that all updates are visible to efx_vfdi_fini_all_queues() */
smp_mb();
@@
-664,7
+666,7
@@
static bool efx_vfdi_flush_wake(struct efx_vf *vf)
atomic_read(&vf->rxq_retry_count);
}
atomic_read(&vf->rxq_retry_count);
}
-static void efx_vfdi_flush_clear(struct
efx
_vf *vf)
+static void efx_vfdi_flush_clear(struct
siena
_vf *vf)
{
memset(vf->txq_mask, 0, sizeof(vf->txq_mask));
vf->txq_count = 0;
{
memset(vf->txq_mask, 0, sizeof(vf->txq_mask));
vf->txq_count = 0;
@@
-674,7
+676,7
@@
static void efx_vfdi_flush_clear(struct efx_vf *vf)
atomic_set(&vf->rxq_retry_count, 0);
}
atomic_set(&vf->rxq_retry_count, 0);
}
-static int efx_vfdi_fini_all_queues(struct
efx
_vf *vf)
+static int efx_vfdi_fini_all_queues(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
efx_oword_t reg;
{
struct efx_nic *efx = vf->efx;
efx_oword_t reg;
@@
-757,7
+759,7
@@
static int efx_vfdi_fini_all_queues(struct efx_vf *vf)
return timeout ? 0 : VFDI_RC_ETIMEDOUT;
}
return timeout ? 0 : VFDI_RC_ETIMEDOUT;
}
-static int efx_vfdi_insert_filter(struct
efx
_vf *vf)
+static int efx_vfdi_insert_filter(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
@@
-789,7
+791,7
@@
static int efx_vfdi_insert_filter(struct efx_vf *vf)
return VFDI_RC_SUCCESS;
}
return VFDI_RC_SUCCESS;
}
-static int efx_vfdi_remove_all_filters(struct
efx
_vf *vf)
+static int efx_vfdi_remove_all_filters(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
@@
-801,7
+803,7
@@
static int efx_vfdi_remove_all_filters(struct efx_vf *vf)
return VFDI_RC_SUCCESS;
}
return VFDI_RC_SUCCESS;
}
-static int efx_vfdi_set_status_page(struct
efx
_vf *vf)
+static int efx_vfdi_set_status_page(struct
siena
_vf *vf)
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
{
struct efx_nic *efx = vf->efx;
struct siena_nic_data *nic_data = efx->nic_data;
@@
-846,7
+848,7
@@
static int efx_vfdi_set_status_page(struct efx_vf *vf)
return VFDI_RC_SUCCESS;
}
return VFDI_RC_SUCCESS;
}
-static int efx_vfdi_clear_status_page(struct
efx
_vf *vf)
+static int efx_vfdi_clear_status_page(struct
siena
_vf *vf)
{
mutex_lock(&vf->status_lock);
vf->status_addr = 0;
{
mutex_lock(&vf->status_lock);
vf->status_addr = 0;
@@
-855,7
+857,7
@@
static int efx_vfdi_clear_status_page(struct efx_vf *vf)
return VFDI_RC_SUCCESS;
}
return VFDI_RC_SUCCESS;
}
-typedef int (*efx_vfdi_op_t)(struct
efx
_vf *vf);
+typedef int (*efx_vfdi_op_t)(struct
siena
_vf *vf);
static const efx_vfdi_op_t vfdi_ops[VFDI_OP_LIMIT] = {
[VFDI_OP_INIT_EVQ] = efx_vfdi_init_evq,
static const efx_vfdi_op_t vfdi_ops[VFDI_OP_LIMIT] = {
[VFDI_OP_INIT_EVQ] = efx_vfdi_init_evq,
@@
-870,7
+872,7
@@
static const efx_vfdi_op_t vfdi_ops[VFDI_OP_LIMIT] = {
static void efx_siena_sriov_vfdi(struct work_struct *work)
{
static void efx_siena_sriov_vfdi(struct work_struct *work)
{
- struct
efx_vf *vf = container_of(work, struct efx
_vf, req);
+ struct
siena_vf *vf = container_of(work, struct siena
_vf, req);
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
struct efx_memcpy_req copy[2];
struct efx_nic *efx = vf->efx;
struct vfdi_req *req = vf->buf.addr;
struct efx_memcpy_req copy[2];
@@
-936,7
+938,8
@@
static void efx_siena_sriov_vfdi(struct work_struct *work)
* event ring in guest memory with VFDI reset events, then (re-initialise) the
* event queue to raise an interrupt. The guest driver will then recover.
*/
* event ring in guest memory with VFDI reset events, then (re-initialise) the
* event queue to raise an interrupt. The guest driver will then recover.
*/
-static void efx_siena_sriov_reset_vf(struct efx_vf *vf,
+
+static void efx_siena_sriov_reset_vf(struct siena_vf *vf,
struct efx_buffer *buffer)
{
struct efx_nic *efx = vf->efx;
struct efx_buffer *buffer)
{
struct efx_nic *efx = vf->efx;
@@
-1006,7
+1009,7
@@
static void efx_siena_sriov_reset_vf(struct efx_vf *vf,
static void efx_siena_sriov_reset_vf_work(struct work_struct *work)
{
static void efx_siena_sriov_reset_vf_work(struct work_struct *work)
{
- struct
efx_vf *vf = container_of(work, struct efx
_vf, req);
+ struct
siena_vf *vf = container_of(work, struct siena
_vf, req);
struct efx_nic *efx = vf->efx;
struct efx_buffer buf;
struct efx_nic *efx = vf->efx;
struct efx_buffer buf;
@@
-1055,8
+1058,10
@@
void efx_siena_sriov_probe(struct efx_nic *efx)
if (!max_vfs)
return;
if (!max_vfs)
return;
- if (efx_siena_sriov_cmd(efx, false, &efx->vi_scale, &count))
+ if (efx_siena_sriov_cmd(efx, false, &efx->vi_scale, &count)) {
+ netif_info(efx, probe, efx->net_dev, "no SR-IOV VFs probed\n");
return;
return;
+ }
if (count > 0 && count > max_vfs)
count = max_vfs;
if (count > 0 && count > max_vfs)
count = max_vfs;
@@
-1077,7
+1082,7
@@
static void efx_siena_sriov_peer_work(struct work_struct *data)
peer_work);
struct efx_nic *efx = nic_data->efx;
struct vfdi_status *vfdi_status = nic_data->vfdi_status.addr;
peer_work);
struct efx_nic *efx = nic_data->efx;
struct vfdi_status *vfdi_status = nic_data->vfdi_status.addr;
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
struct efx_local_addr *local_addr;
struct vfdi_endpoint *peer;
struct efx_endpoint_page *epp;
struct efx_local_addr *local_addr;
struct vfdi_endpoint *peer;
struct efx_endpoint_page *epp;
@@
-1099,7
+1104,7
@@
static void efx_siena_sriov_peer_work(struct work_struct *data)
peer_space = ARRAY_SIZE(vfdi_status->peers) - 1;
peer_count = 1;
for (pos = 0; pos < efx->vf_count; ++pos) {
peer_space = ARRAY_SIZE(vfdi_status->peers) - 1;
peer_count = 1;
for (pos = 0; pos < efx->vf_count; ++pos) {
- vf =
efx
->vf + pos;
+ vf =
nic_data
->vf + pos;
mutex_lock(&vf->status_lock);
if (vf->rx_filtering && !is_zero_ether_addr(vf->addr.mac_addr)) {
mutex_lock(&vf->status_lock);
if (vf->rx_filtering && !is_zero_ether_addr(vf->addr.mac_addr)) {
@@
-1155,7
+1160,7
@@
static void efx_siena_sriov_peer_work(struct work_struct *data)
/* Finally, push the pages */
for (pos = 0; pos < efx->vf_count; ++pos) {
/* Finally, push the pages */
for (pos = 0; pos < efx->vf_count; ++pos) {
- vf =
efx
->vf + pos;
+ vf =
nic_data
->vf + pos;
mutex_lock(&vf->status_lock);
if (vf->status_addr)
mutex_lock(&vf->status_lock);
if (vf->status_addr)
@@
-1190,14
+1195,16
@@
static void efx_siena_sriov_free_local(struct efx_nic *efx)
static int efx_siena_sriov_vf_alloc(struct efx_nic *efx)
{
unsigned index;
static int efx_siena_sriov_vf_alloc(struct efx_nic *efx)
{
unsigned index;
- struct efx_vf *vf;
+ struct siena_vf *vf;
+ struct siena_nic_data *nic_data = efx->nic_data;
- efx->vf = kzalloc(sizeof(struct efx_vf) * efx->vf_count, GFP_KERNEL);
- if (!efx->vf)
+ nic_data->vf = kcalloc(efx->vf_count, sizeof(*nic_data->vf),
+ GFP_KERNEL);
+ if (!nic_data->vf)
return -ENOMEM;
for (index = 0; index < efx->vf_count; ++index) {
return -ENOMEM;
for (index = 0; index < efx->vf_count; ++index) {
- vf =
efx
->vf + index;
+ vf =
nic_data
->vf + index;
vf->efx = efx;
vf->index = index;
vf->efx = efx;
vf->index = index;
@@
-1216,11
+1223,12
@@
static int efx_siena_sriov_vf_alloc(struct efx_nic *efx)
static void efx_siena_sriov_vfs_fini(struct efx_nic *efx)
{
static void efx_siena_sriov_vfs_fini(struct efx_nic *efx)
{
- struct efx_vf *vf;
+ struct siena_nic_data *nic_data = efx->nic_data;
+ struct siena_vf *vf;
unsigned int pos;
for (pos = 0; pos < efx->vf_count; ++pos) {
unsigned int pos;
for (pos = 0; pos < efx->vf_count; ++pos) {
- vf =
efx
->vf + pos;
+ vf =
nic_data
->vf + pos;
efx_nic_free_buffer(efx, &vf->buf);
kfree(vf->peer_page_addrs);
efx_nic_free_buffer(efx, &vf->buf);
kfree(vf->peer_page_addrs);
@@
-1237,7
+1245,7
@@
static int efx_siena_sriov_vfs_init(struct efx_nic *efx)
struct siena_nic_data *nic_data = efx->nic_data;
unsigned index, devfn, sriov, buftbl_base;
u16 offset, stride;
struct siena_nic_data *nic_data = efx->nic_data;
unsigned index, devfn, sriov, buftbl_base;
u16 offset, stride;
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
int rc;
sriov = pci_find_ext_capability(pci_dev, PCI_EXT_CAP_ID_SRIOV);
int rc;
sriov = pci_find_ext_capability(pci_dev, PCI_EXT_CAP_ID_SRIOV);
@@
-1250,7
+1258,7
@@
static int efx_siena_sriov_vfs_init(struct efx_nic *efx)
buftbl_base = nic_data->vf_buftbl_base;
devfn = pci_dev->devfn + offset;
for (index = 0; index < efx->vf_count; ++index) {
buftbl_base = nic_data->vf_buftbl_base;
devfn = pci_dev->devfn + offset;
for (index = 0; index < efx->vf_count; ++index) {
- vf =
efx
->vf + index;
+ vf =
nic_data
->vf + index;
/* Reserve buffer entries */
vf->buftbl_base = buftbl_base;
/* Reserve buffer entries */
vf->buftbl_base = buftbl_base;
@@
-1350,7
+1358,7
@@
fail_pci:
fail_vfs:
cancel_work_sync(&nic_data->peer_work);
efx_siena_sriov_free_local(efx);
fail_vfs:
cancel_work_sync(&nic_data->peer_work);
efx_siena_sriov_free_local(efx);
- kfree(
efx
->vf);
+ kfree(
nic_data
->vf);
fail_alloc:
efx_nic_free_buffer(efx, &nic_data->vfdi_status);
fail_status:
fail_alloc:
efx_nic_free_buffer(efx, &nic_data->vfdi_status);
fail_status:
@@
-1361,7
+1369,7
@@
fail_cmd:
void efx_siena_sriov_fini(struct efx_nic *efx)
{
void efx_siena_sriov_fini(struct efx_nic *efx)
{
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
unsigned int pos;
struct siena_nic_data *nic_data = efx->nic_data;
unsigned int pos;
struct siena_nic_data *nic_data = efx->nic_data;
@@
-1377,7
+1385,7
@@
void efx_siena_sriov_fini(struct efx_nic *efx)
/* Flush all reconfiguration work */
for (pos = 0; pos < efx->vf_count; ++pos) {
/* Flush all reconfiguration work */
for (pos = 0; pos < efx->vf_count; ++pos) {
- vf =
efx
->vf + pos;
+ vf =
nic_data
->vf + pos;
cancel_work_sync(&vf->req);
cancel_work_sync(&vf->reset_work);
}
cancel_work_sync(&vf->req);
cancel_work_sync(&vf->reset_work);
}
@@
-1388,7
+1396,7
@@
void efx_siena_sriov_fini(struct efx_nic *efx)
/* Tear down back-end state */
efx_siena_sriov_vfs_fini(efx);
efx_siena_sriov_free_local(efx);
/* Tear down back-end state */
efx_siena_sriov_vfs_fini(efx);
efx_siena_sriov_free_local(efx);
- kfree(
efx
->vf);
+ kfree(
nic_data
->vf);
efx_nic_free_buffer(efx, &nic_data->vfdi_status);
efx_siena_sriov_cmd(efx, false, NULL, NULL);
}
efx_nic_free_buffer(efx, &nic_data->vfdi_status);
efx_siena_sriov_cmd(efx, false, NULL, NULL);
}
@@
-1396,7
+1404,7
@@
void efx_siena_sriov_fini(struct efx_nic *efx)
void efx_siena_sriov_event(struct efx_channel *channel, efx_qword_t *event)
{
struct efx_nic *efx = channel->efx;
void efx_siena_sriov_event(struct efx_channel *channel, efx_qword_t *event)
{
struct efx_nic *efx = channel->efx;
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
unsigned qid, seq, type, data;
qid = EFX_QWORD_FIELD(*event, FSF_CZ_USER_QID);
unsigned qid, seq, type, data;
qid = EFX_QWORD_FIELD(*event, FSF_CZ_USER_QID);
@@
-1452,11
+1460,12
@@
error:
void efx_siena_sriov_flr(struct efx_nic *efx, unsigned vf_i)
{
void efx_siena_sriov_flr(struct efx_nic *efx, unsigned vf_i)
{
- struct efx_vf *vf;
+ struct siena_nic_data *nic_data = efx->nic_data;
+ struct siena_vf *vf;
if (vf_i > efx->vf_init_count)
return;
if (vf_i > efx->vf_init_count)
return;
- vf =
efx
->vf + vf_i;
+ vf =
nic_data
->vf + vf_i;
netif_info(efx, hw, efx->net_dev,
"FLR on VF %s\n", vf->pci_name);
netif_info(efx, hw, efx->net_dev,
"FLR on VF %s\n", vf->pci_name);
@@
-1467,21
+1476,23
@@
void efx_siena_sriov_flr(struct efx_nic *efx, unsigned vf_i)
vf->evq0_count = 0;
}
vf->evq0_count = 0;
}
-
void
efx_siena_sriov_mac_address_changed(struct efx_nic *efx)
+
int
efx_siena_sriov_mac_address_changed(struct efx_nic *efx)
{
struct siena_nic_data *nic_data = efx->nic_data;
struct vfdi_status *vfdi_status = nic_data->vfdi_status.addr;
if (!efx->vf_init_count)
{
struct siena_nic_data *nic_data = efx->nic_data;
struct vfdi_status *vfdi_status = nic_data->vfdi_status.addr;
if (!efx->vf_init_count)
- return;
+ return
0
;
ether_addr_copy(vfdi_status->peers[0].mac_addr,
efx->net_dev->dev_addr);
queue_work(vfdi_workqueue, &nic_data->peer_work);
ether_addr_copy(vfdi_status->peers[0].mac_addr,
efx->net_dev->dev_addr);
queue_work(vfdi_workqueue, &nic_data->peer_work);
+
+ return 0;
}
void efx_siena_sriov_tx_flush_done(struct efx_nic *efx, efx_qword_t *event)
{
}
void efx_siena_sriov_tx_flush_done(struct efx_nic *efx, efx_qword_t *event)
{
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
unsigned queue, qid;
queue = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_SUBDATA);
unsigned queue, qid;
queue = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_SUBDATA);
@@
-1500,7
+1511,7
@@
void efx_siena_sriov_tx_flush_done(struct efx_nic *efx, efx_qword_t *event)
void efx_siena_sriov_rx_flush_done(struct efx_nic *efx, efx_qword_t *event)
{
void efx_siena_sriov_rx_flush_done(struct efx_nic *efx, efx_qword_t *event)
{
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
unsigned ev_failed, queue, qid;
queue = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_RX_DESCQ_ID);
unsigned ev_failed, queue, qid;
queue = EFX_QWORD_FIELD(*event, FSF_AZ_DRIVER_EV_RX_DESCQ_ID);
@@
-1525,7
+1536,7
@@
void efx_siena_sriov_rx_flush_done(struct efx_nic *efx, efx_qword_t *event)
/* Called from napi. Schedule the reset work item */
void efx_siena_sriov_desc_fetch_err(struct efx_nic *efx, unsigned dmaq)
{
/* Called from napi. Schedule the reset work item */
void efx_siena_sriov_desc_fetch_err(struct efx_nic *efx, unsigned dmaq)
{
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
unsigned int rel;
if (map_vi_index(efx, dmaq, &vf, &rel))
unsigned int rel;
if (map_vi_index(efx, dmaq, &vf, &rel))
@@
-1541,9
+1552,10
@@
void efx_siena_sriov_desc_fetch_err(struct efx_nic *efx, unsigned dmaq)
/* Reset all VFs */
void efx_siena_sriov_reset(struct efx_nic *efx)
{
/* Reset all VFs */
void efx_siena_sriov_reset(struct efx_nic *efx)
{
+ struct siena_nic_data *nic_data = efx->nic_data;
unsigned int vf_i;
struct efx_buffer buf;
unsigned int vf_i;
struct efx_buffer buf;
- struct
efx
_vf *vf;
+ struct
siena
_vf *vf;
ASSERT_RTNL();
ASSERT_RTNL();
@@
-1557,7
+1569,7
@@
void efx_siena_sriov_reset(struct efx_nic *efx)
return;
for (vf_i = 0; vf_i < efx->vf_init_count; ++vf_i) {
return;
for (vf_i = 0; vf_i < efx->vf_init_count; ++vf_i) {
- vf =
efx
->vf + vf_i;
+ vf =
nic_data
->vf + vf_i;
efx_siena_sriov_reset_vf(vf, &buf);
}
efx_siena_sriov_reset_vf(vf, &buf);
}
@@
-1573,7
+1585,6
@@
int efx_init_sriov(void)
vfdi_workqueue = create_singlethread_workqueue("sfc_vfdi");
if (!vfdi_workqueue)
return -ENOMEM;
vfdi_workqueue = create_singlethread_workqueue("sfc_vfdi");
if (!vfdi_workqueue)
return -ENOMEM;
-
return 0;
}
return 0;
}
@@
-1582,14
+1593,14
@@
void efx_fini_sriov(void)
destroy_workqueue(vfdi_workqueue);
}
destroy_workqueue(vfdi_workqueue);
}
-int efx_siena_sriov_set_vf_mac(struct
net_device *net_dev
, int vf_i, u8 *mac)
+int efx_siena_sriov_set_vf_mac(struct
efx_nic *efx
, int vf_i, u8 *mac)
{
{
- struct
efx_nic *efx = netdev_priv(net_dev)
;
- struct
efx
_vf *vf;
+ struct
siena_nic_data *nic_data = efx->nic_data
;
+ struct
siena
_vf *vf;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
- vf =
efx
->vf + vf_i;
+ vf =
nic_data
->vf + vf_i;
mutex_lock(&vf->status_lock);
ether_addr_copy(vf->addr.mac_addr, mac);
mutex_lock(&vf->status_lock);
ether_addr_copy(vf->addr.mac_addr, mac);
@@
-1599,16
+1610,16
@@
int efx_siena_sriov_set_vf_mac(struct net_device *net_dev, int vf_i, u8 *mac)
return 0;
}
return 0;
}
-int efx_siena_sriov_set_vf_vlan(struct
net_device *net_dev
, int vf_i,
+int efx_siena_sriov_set_vf_vlan(struct
efx_nic *efx
, int vf_i,
u16 vlan, u8 qos)
{
u16 vlan, u8 qos)
{
- struct
efx_nic *efx = netdev_priv(net_dev)
;
- struct
efx
_vf *vf;
+ struct
siena_nic_data *nic_data = efx->nic_data
;
+ struct
siena
_vf *vf;
u16 tci;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
u16 tci;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
- vf =
efx
->vf + vf_i;
+ vf =
nic_data
->vf + vf_i;
mutex_lock(&vf->status_lock);
tci = (vlan & VLAN_VID_MASK) | ((qos & 0x7) << VLAN_PRIO_SHIFT);
mutex_lock(&vf->status_lock);
tci = (vlan & VLAN_VID_MASK) | ((qos & 0x7) << VLAN_PRIO_SHIFT);
@@
-1619,16
+1630,16
@@
int efx_siena_sriov_set_vf_vlan(struct net_device *net_dev, int vf_i,
return 0;
}
return 0;
}
-int efx_siena_sriov_set_vf_spoofchk(struct
net_device *net_dev
, int vf_i,
+int efx_siena_sriov_set_vf_spoofchk(struct
efx_nic *efx
, int vf_i,
bool spoofchk)
{
bool spoofchk)
{
- struct
efx_nic *efx = netdev_priv(net_dev)
;
- struct
efx
_vf *vf;
+ struct
siena_nic_data *nic_data = efx->nic_data
;
+ struct
siena
_vf *vf;
int rc;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
int rc;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
- vf =
efx
->vf + vf_i;
+ vf =
nic_data
->vf + vf_i;
mutex_lock(&vf->txq_lock);
if (vf->txq_count == 0) {
mutex_lock(&vf->txq_lock);
if (vf->txq_count == 0) {
@@
-1643,16
+1654,16
@@
int efx_siena_sriov_set_vf_spoofchk(struct net_device *net_dev, int vf_i,
return rc;
}
return rc;
}
-int efx_siena_sriov_get_vf_config(struct
net_device *net_dev
, int vf_i,
+int efx_siena_sriov_get_vf_config(struct
efx_nic *efx
, int vf_i,
struct ifla_vf_info *ivi)
{
struct ifla_vf_info *ivi)
{
- struct
efx_nic *efx = netdev_priv(net_dev)
;
- struct
efx
_vf *vf;
+ struct
siena_nic_data *nic_data = efx->nic_data
;
+ struct
siena
_vf *vf;
u16 tci;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
u16 tci;
if (vf_i >= efx->vf_init_count)
return -EINVAL;
- vf =
efx
->vf + vf_i;
+ vf =
nic_data
->vf + vf_i;
ivi->vf = vf_i;
ether_addr_copy(ivi->mac, vf->addr.mac_addr);
ivi->vf = vf_i;
ether_addr_copy(ivi->mac, vf->addr.mac_addr);
@@
-1666,3
+1677,12
@@
int efx_siena_sriov_get_vf_config(struct net_device *net_dev, int vf_i,
return 0;
}
return 0;
}
+bool efx_siena_sriov_wanted(struct efx_nic *efx)
+{
+ return efx->vf_count != 0;
+}
+
+int efx_siena_sriov_configure(struct efx_nic *efx, int num_vfs)
+{
+ return 0;
+}