1 /****************************************************************************
2 * Driver for Solarflare network controllers and boards
3 * Copyright 2015 Solarflare Communications Inc.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published
7 * by the Free Software Foundation, incorporated herein by reference.
10 #include <linux/module.h>
11 #include "net_driver.h"
12 #include "ef10_sriov.h"
15 #include "mcdi_pcol.h"
17 static int efx_ef10_evb_port_assign(struct efx_nic
*efx
, unsigned int port_id
,
20 MCDI_DECLARE_BUF(inbuf
, MC_CMD_EVB_PORT_ASSIGN_IN_LEN
);
21 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
23 MCDI_SET_DWORD(inbuf
, EVB_PORT_ASSIGN_IN_PORT_ID
, port_id
);
24 MCDI_POPULATE_DWORD_2(inbuf
, EVB_PORT_ASSIGN_IN_FUNCTION
,
25 EVB_PORT_ASSIGN_IN_PF
, nic_data
->pf_index
,
26 EVB_PORT_ASSIGN_IN_VF
, vf_fn
);
28 return efx_mcdi_rpc(efx
, MC_CMD_EVB_PORT_ASSIGN
, inbuf
, sizeof(inbuf
),
32 static int efx_ef10_vswitch_alloc(struct efx_nic
*efx
, unsigned int port_id
,
33 unsigned int vswitch_type
)
35 MCDI_DECLARE_BUF(inbuf
, MC_CMD_VSWITCH_ALLOC_IN_LEN
);
38 MCDI_SET_DWORD(inbuf
, VSWITCH_ALLOC_IN_UPSTREAM_PORT_ID
, port_id
);
39 MCDI_SET_DWORD(inbuf
, VSWITCH_ALLOC_IN_TYPE
, vswitch_type
);
40 MCDI_SET_DWORD(inbuf
, VSWITCH_ALLOC_IN_NUM_VLAN_TAGS
, 2);
41 MCDI_POPULATE_DWORD_1(inbuf
, VSWITCH_ALLOC_IN_FLAGS
,
42 VSWITCH_ALLOC_IN_FLAG_AUTO_PORT
, 0);
44 /* Quietly try to allocate 2 VLAN tags */
45 rc
= efx_mcdi_rpc_quiet(efx
, MC_CMD_VSWITCH_ALLOC
, inbuf
, sizeof(inbuf
),
48 /* If 2 VLAN tags is too many, revert to trying with 1 VLAN tags */
50 MCDI_SET_DWORD(inbuf
, VSWITCH_ALLOC_IN_NUM_VLAN_TAGS
, 1);
51 rc
= efx_mcdi_rpc(efx
, MC_CMD_VSWITCH_ALLOC
, inbuf
,
52 sizeof(inbuf
), NULL
, 0, NULL
);
54 efx_mcdi_display_error(efx
, MC_CMD_VSWITCH_ALLOC
,
55 MC_CMD_VSWITCH_ALLOC_IN_LEN
,
61 static int efx_ef10_vswitch_free(struct efx_nic
*efx
, unsigned int port_id
)
63 MCDI_DECLARE_BUF(inbuf
, MC_CMD_VSWITCH_FREE_IN_LEN
);
65 MCDI_SET_DWORD(inbuf
, VSWITCH_FREE_IN_UPSTREAM_PORT_ID
, port_id
);
67 return efx_mcdi_rpc(efx
, MC_CMD_VSWITCH_FREE
, inbuf
, sizeof(inbuf
),
71 static int efx_ef10_vport_alloc(struct efx_nic
*efx
,
72 unsigned int port_id_in
,
73 unsigned int vport_type
,
75 unsigned int *port_id_out
)
77 MCDI_DECLARE_BUF(inbuf
, MC_CMD_VPORT_ALLOC_IN_LEN
);
78 MCDI_DECLARE_BUF(outbuf
, MC_CMD_VPORT_ALLOC_OUT_LEN
);
82 EFX_WARN_ON_PARANOID(!port_id_out
);
84 MCDI_SET_DWORD(inbuf
, VPORT_ALLOC_IN_UPSTREAM_PORT_ID
, port_id_in
);
85 MCDI_SET_DWORD(inbuf
, VPORT_ALLOC_IN_TYPE
, vport_type
);
86 MCDI_SET_DWORD(inbuf
, VPORT_ALLOC_IN_NUM_VLAN_TAGS
,
87 (vlan
!= EFX_EF10_NO_VLAN
));
88 MCDI_POPULATE_DWORD_1(inbuf
, VPORT_ALLOC_IN_FLAGS
,
89 VPORT_ALLOC_IN_FLAG_AUTO_PORT
, 0);
90 if (vlan
!= EFX_EF10_NO_VLAN
)
91 MCDI_POPULATE_DWORD_1(inbuf
, VPORT_ALLOC_IN_VLAN_TAGS
,
92 VPORT_ALLOC_IN_VLAN_TAG_0
, vlan
);
94 rc
= efx_mcdi_rpc(efx
, MC_CMD_VPORT_ALLOC
, inbuf
, sizeof(inbuf
),
95 outbuf
, sizeof(outbuf
), &outlen
);
98 if (outlen
< MC_CMD_VPORT_ALLOC_OUT_LEN
)
101 *port_id_out
= MCDI_DWORD(outbuf
, VPORT_ALLOC_OUT_VPORT_ID
);
105 static int efx_ef10_vport_free(struct efx_nic
*efx
, unsigned int port_id
)
107 MCDI_DECLARE_BUF(inbuf
, MC_CMD_VPORT_FREE_IN_LEN
);
109 MCDI_SET_DWORD(inbuf
, VPORT_FREE_IN_VPORT_ID
, port_id
);
111 return efx_mcdi_rpc(efx
, MC_CMD_VPORT_FREE
, inbuf
, sizeof(inbuf
),
115 static void efx_ef10_sriov_free_vf_vports(struct efx_nic
*efx
)
117 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
123 for (i
= 0; i
< efx
->vf_count
; i
++) {
124 struct ef10_vf
*vf
= nic_data
->vf
+ i
;
126 /* If VF is assigned, do not free the vport */
128 vf
->pci_dev
->dev_flags
& PCI_DEV_FLAGS_ASSIGNED
)
131 if (vf
->vport_assigned
) {
132 efx_ef10_evb_port_assign(efx
, EVB_PORT_ID_NULL
, i
);
133 vf
->vport_assigned
= 0;
136 if (!is_zero_ether_addr(vf
->mac
)) {
137 efx_ef10_vport_del_mac(efx
, vf
->vport_id
, vf
->mac
);
138 eth_zero_addr(vf
->mac
);
142 efx_ef10_vport_free(efx
, vf
->vport_id
);
150 static void efx_ef10_sriov_free_vf_vswitching(struct efx_nic
*efx
)
152 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
154 efx_ef10_sriov_free_vf_vports(efx
);
159 static int efx_ef10_sriov_assign_vf_vport(struct efx_nic
*efx
,
162 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
163 struct ef10_vf
*vf
= nic_data
->vf
+ vf_i
;
166 if (WARN_ON_ONCE(!nic_data
->vf
))
169 rc
= efx_ef10_vport_alloc(efx
, EVB_PORT_ID_ASSIGNED
,
170 MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL
,
171 vf
->vlan
, &vf
->vport_id
);
175 rc
= efx_ef10_vport_add_mac(efx
, vf
->vport_id
, vf
->mac
);
177 eth_zero_addr(vf
->mac
);
181 rc
= efx_ef10_evb_port_assign(efx
, vf
->vport_id
, vf_i
);
185 vf
->vport_assigned
= 1;
189 static int efx_ef10_sriov_alloc_vf_vswitching(struct efx_nic
*efx
)
191 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
195 nic_data
->vf
= kcalloc(efx
->vf_count
, sizeof(struct ef10_vf
),
200 for (i
= 0; i
< efx
->vf_count
; i
++) {
201 random_ether_addr(nic_data
->vf
[i
].mac
);
202 nic_data
->vf
[i
].efx
= NULL
;
203 nic_data
->vf
[i
].vlan
= EFX_EF10_NO_VLAN
;
205 rc
= efx_ef10_sriov_assign_vf_vport(efx
, i
);
212 efx_ef10_sriov_free_vf_vports(efx
);
218 static int efx_ef10_sriov_restore_vf_vswitching(struct efx_nic
*efx
)
223 for (i
= 0; i
< efx
->vf_count
; i
++) {
224 rc
= efx_ef10_sriov_assign_vf_vport(efx
, i
);
231 efx_ef10_sriov_free_vf_vswitching(efx
);
235 /* On top of the default firmware vswitch setup, create a VEB vswitch and
236 * expansion vport for use by this function.
238 int efx_ef10_vswitching_probe_pf(struct efx_nic
*efx
)
240 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
241 struct net_device
*net_dev
= efx
->net_dev
;
244 if (pci_sriov_get_totalvfs(efx
->pci_dev
) <= 0) {
245 /* vswitch not needed as we have no VFs */
246 efx_ef10_vadaptor_alloc(efx
, nic_data
->vport_id
);
250 rc
= efx_ef10_vswitch_alloc(efx
, EVB_PORT_ID_ASSIGNED
,
251 MC_CMD_VSWITCH_ALLOC_IN_VSWITCH_TYPE_VEB
);
255 rc
= efx_ef10_vport_alloc(efx
, EVB_PORT_ID_ASSIGNED
,
256 MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL
,
257 EFX_EF10_NO_VLAN
, &nic_data
->vport_id
);
261 rc
= efx_ef10_vport_add_mac(efx
, nic_data
->vport_id
, net_dev
->dev_addr
);
264 ether_addr_copy(nic_data
->vport_mac
, net_dev
->dev_addr
);
266 rc
= efx_ef10_vadaptor_alloc(efx
, nic_data
->vport_id
);
272 efx_ef10_vport_del_mac(efx
, nic_data
->vport_id
, nic_data
->vport_mac
);
273 eth_zero_addr(nic_data
->vport_mac
);
275 efx_ef10_vport_free(efx
, nic_data
->vport_id
);
276 nic_data
->vport_id
= EVB_PORT_ID_ASSIGNED
;
278 efx_ef10_vswitch_free(efx
, EVB_PORT_ID_ASSIGNED
);
283 int efx_ef10_vswitching_probe_vf(struct efx_nic
*efx
)
285 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
287 return efx_ef10_vadaptor_alloc(efx
, nic_data
->vport_id
);
290 int efx_ef10_vswitching_restore_pf(struct efx_nic
*efx
)
292 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
295 if (!nic_data
->must_probe_vswitching
)
298 rc
= efx_ef10_vswitching_probe_pf(efx
);
302 rc
= efx_ef10_sriov_restore_vf_vswitching(efx
);
306 nic_data
->must_probe_vswitching
= false;
311 int efx_ef10_vswitching_restore_vf(struct efx_nic
*efx
)
313 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
316 if (!nic_data
->must_probe_vswitching
)
319 rc
= efx_ef10_vadaptor_free(efx
, EVB_PORT_ID_ASSIGNED
);
323 nic_data
->must_probe_vswitching
= false;
327 void efx_ef10_vswitching_remove_pf(struct efx_nic
*efx
)
329 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
331 efx_ef10_sriov_free_vf_vswitching(efx
);
333 efx_ef10_vadaptor_free(efx
, nic_data
->vport_id
);
335 if (nic_data
->vport_id
== EVB_PORT_ID_ASSIGNED
)
336 return; /* No vswitch was ever created */
338 if (!is_zero_ether_addr(nic_data
->vport_mac
)) {
339 efx_ef10_vport_del_mac(efx
, nic_data
->vport_id
,
340 efx
->net_dev
->dev_addr
);
341 eth_zero_addr(nic_data
->vport_mac
);
343 efx_ef10_vport_free(efx
, nic_data
->vport_id
);
344 nic_data
->vport_id
= EVB_PORT_ID_ASSIGNED
;
346 /* Only free the vswitch if no VFs are assigned */
347 if (!pci_vfs_assigned(efx
->pci_dev
))
348 efx_ef10_vswitch_free(efx
, nic_data
->vport_id
);
351 void efx_ef10_vswitching_remove_vf(struct efx_nic
*efx
)
353 efx_ef10_vadaptor_free(efx
, EVB_PORT_ID_ASSIGNED
);
356 static int efx_ef10_pci_sriov_enable(struct efx_nic
*efx
, int num_vfs
)
359 struct pci_dev
*dev
= efx
->pci_dev
;
361 efx
->vf_count
= num_vfs
;
363 rc
= efx_ef10_sriov_alloc_vf_vswitching(efx
);
367 rc
= pci_enable_sriov(dev
, num_vfs
);
373 efx_ef10_sriov_free_vf_vswitching(efx
);
376 netif_err(efx
, probe
, efx
->net_dev
,
377 "Failed to enable SRIOV VFs\n");
381 static int efx_ef10_pci_sriov_disable(struct efx_nic
*efx
, bool force
)
383 struct pci_dev
*dev
= efx
->pci_dev
;
384 unsigned int vfs_assigned
= 0;
386 vfs_assigned
= pci_vfs_assigned(dev
);
388 if (vfs_assigned
&& !force
) {
389 netif_info(efx
, drv
, efx
->net_dev
, "VFs are assigned to guests; "
390 "please detach them before disabling SR-IOV\n");
395 pci_disable_sriov(dev
);
397 efx_ef10_sriov_free_vf_vswitching(efx
);
402 int efx_ef10_sriov_configure(struct efx_nic
*efx
, int num_vfs
)
405 return efx_ef10_pci_sriov_disable(efx
, false);
407 return efx_ef10_pci_sriov_enable(efx
, num_vfs
);
410 int efx_ef10_sriov_init(struct efx_nic
*efx
)
415 void efx_ef10_sriov_fini(struct efx_nic
*efx
)
417 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
422 /* Remove any un-assigned orphaned VFs */
423 if (pci_num_vf(efx
->pci_dev
) && !pci_vfs_assigned(efx
->pci_dev
))
424 pci_disable_sriov(efx
->pci_dev
);
428 /* Remove any VFs in the host */
429 for (i
= 0; i
< efx
->vf_count
; ++i
) {
430 struct efx_nic
*vf_efx
= nic_data
->vf
[i
].efx
;
433 vf_efx
->pci_dev
->driver
->remove(vf_efx
->pci_dev
);
436 rc
= efx_ef10_pci_sriov_disable(efx
, true);
438 netif_dbg(efx
, drv
, efx
->net_dev
,
439 "Disabling SRIOV was not successful rc=%d\n", rc
);
441 netif_dbg(efx
, drv
, efx
->net_dev
, "SRIOV disabled\n");
444 static int efx_ef10_vport_del_vf_mac(struct efx_nic
*efx
, unsigned int port_id
,
447 MCDI_DECLARE_BUF(inbuf
, MC_CMD_VPORT_DEL_MAC_ADDRESS_IN_LEN
);
448 MCDI_DECLARE_BUF_ERR(outbuf
);
452 MCDI_SET_DWORD(inbuf
, VPORT_DEL_MAC_ADDRESS_IN_VPORT_ID
, port_id
);
453 ether_addr_copy(MCDI_PTR(inbuf
, VPORT_DEL_MAC_ADDRESS_IN_MACADDR
), mac
);
455 rc
= efx_mcdi_rpc(efx
, MC_CMD_VPORT_DEL_MAC_ADDRESS
, inbuf
,
456 sizeof(inbuf
), outbuf
, sizeof(outbuf
), &outlen
);
461 int efx_ef10_sriov_set_vf_mac(struct efx_nic
*efx
, int vf_i
, u8
*mac
)
463 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
470 if (vf_i
>= efx
->vf_count
)
472 vf
= nic_data
->vf
+ vf_i
;
475 efx_device_detach_sync(vf
->efx
);
476 efx_net_stop(vf
->efx
->net_dev
);
478 down_write(&vf
->efx
->filter_sem
);
479 vf
->efx
->type
->filter_table_remove(vf
->efx
);
481 rc
= efx_ef10_vadaptor_free(vf
->efx
, EVB_PORT_ID_ASSIGNED
);
483 up_write(&vf
->efx
->filter_sem
);
488 rc
= efx_ef10_evb_port_assign(efx
, EVB_PORT_ID_NULL
, vf_i
);
492 if (!is_zero_ether_addr(vf
->mac
)) {
493 rc
= efx_ef10_vport_del_vf_mac(efx
, vf
->vport_id
, vf
->mac
);
498 if (!is_zero_ether_addr(mac
)) {
499 rc
= efx_ef10_vport_add_mac(efx
, vf
->vport_id
, mac
);
501 eth_zero_addr(vf
->mac
);
505 ether_addr_copy(vf
->efx
->net_dev
->dev_addr
, mac
);
508 ether_addr_copy(vf
->mac
, mac
);
510 rc
= efx_ef10_evb_port_assign(efx
, vf
->vport_id
, vf_i
);
515 /* VF cannot use the vport_id that the PF created */
516 rc
= efx_ef10_vadaptor_alloc(vf
->efx
, EVB_PORT_ID_ASSIGNED
);
518 up_write(&vf
->efx
->filter_sem
);
521 vf
->efx
->type
->filter_table_probe(vf
->efx
);
522 up_write(&vf
->efx
->filter_sem
);
523 efx_net_open(vf
->efx
->net_dev
);
524 netif_device_attach(vf
->efx
->net_dev
);
530 memset(vf
->mac
, 0, ETH_ALEN
);
534 int efx_ef10_sriov_set_vf_vlan(struct efx_nic
*efx
, int vf_i
, u16 vlan
,
537 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
539 u16 old_vlan
, new_vlan
;
542 if (vf_i
>= efx
->vf_count
)
547 vf
= nic_data
->vf
+ vf_i
;
549 new_vlan
= (vlan
== 0) ? EFX_EF10_NO_VLAN
: vlan
;
550 if (new_vlan
== vf
->vlan
)
554 efx_device_detach_sync(vf
->efx
);
555 efx_net_stop(vf
->efx
->net_dev
);
557 down_write(&vf
->efx
->filter_sem
);
558 vf
->efx
->type
->filter_table_remove(vf
->efx
);
560 rc
= efx_ef10_vadaptor_free(vf
->efx
, EVB_PORT_ID_ASSIGNED
);
562 goto restore_filters
;
565 if (vf
->vport_assigned
) {
566 rc
= efx_ef10_evb_port_assign(efx
, EVB_PORT_ID_NULL
, vf_i
);
568 netif_warn(efx
, drv
, efx
->net_dev
,
569 "Failed to change vlan on VF %d.\n", vf_i
);
570 netif_warn(efx
, drv
, efx
->net_dev
,
571 "This is likely because the VF is bound to a driver in a VM.\n");
572 netif_warn(efx
, drv
, efx
->net_dev
,
573 "Please unload the driver in the VM.\n");
574 goto restore_vadaptor
;
576 vf
->vport_assigned
= 0;
579 if (!is_zero_ether_addr(vf
->mac
)) {
580 rc
= efx_ef10_vport_del_mac(efx
, vf
->vport_id
, vf
->mac
);
582 goto restore_evb_port
;
586 rc
= efx_ef10_vport_free(efx
, vf
->vport_id
);
592 /* Do the actual vlan change */
596 /* Restore everything in reverse order */
597 rc
= efx_ef10_vport_alloc(efx
, EVB_PORT_ID_ASSIGNED
,
598 MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL
,
599 vf
->vlan
, &vf
->vport_id
);
601 goto reset_nic_up_write
;
604 if (!is_zero_ether_addr(vf
->mac
)) {
605 rc2
= efx_ef10_vport_add_mac(efx
, vf
->vport_id
, vf
->mac
);
607 eth_zero_addr(vf
->mac
);
608 goto reset_nic_up_write
;
613 rc2
= efx_ef10_evb_port_assign(efx
, vf
->vport_id
, vf_i
);
615 goto reset_nic_up_write
;
617 vf
->vport_assigned
= 1;
621 rc2
= efx_ef10_vadaptor_alloc(vf
->efx
, EVB_PORT_ID_ASSIGNED
);
623 goto reset_nic_up_write
;
628 rc2
= vf
->efx
->type
->filter_table_probe(vf
->efx
);
630 goto reset_nic_up_write
;
632 up_write(&vf
->efx
->filter_sem
);
634 up_write(&vf
->efx
->filter_sem
);
636 rc2
= efx_net_open(vf
->efx
->net_dev
);
640 netif_device_attach(vf
->efx
->net_dev
);
646 up_write(&vf
->efx
->filter_sem
);
650 netif_err(efx
, drv
, efx
->net_dev
,
651 "Failed to restore VF - scheduling reset.\n");
652 efx_schedule_reset(vf
->efx
, RESET_TYPE_DATAPATH
);
654 netif_err(efx
, drv
, efx
->net_dev
,
655 "Failed to restore the VF and cannot reset the VF "
656 "- VF is not functional.\n");
657 netif_err(efx
, drv
, efx
->net_dev
,
658 "Please reload the driver attached to the VF.\n");
661 return rc
? rc
: rc2
;
664 int efx_ef10_sriov_set_vf_spoofchk(struct efx_nic
*efx
, int vf_i
,
667 return spoofchk
? -EOPNOTSUPP
: 0;
670 int efx_ef10_sriov_set_vf_link_state(struct efx_nic
*efx
, int vf_i
,
673 MCDI_DECLARE_BUF(inbuf
, MC_CMD_LINK_STATE_MODE_IN_LEN
);
674 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
676 BUILD_BUG_ON(IFLA_VF_LINK_STATE_AUTO
!=
677 MC_CMD_LINK_STATE_MODE_IN_LINK_STATE_AUTO
);
678 BUILD_BUG_ON(IFLA_VF_LINK_STATE_ENABLE
!=
679 MC_CMD_LINK_STATE_MODE_IN_LINK_STATE_UP
);
680 BUILD_BUG_ON(IFLA_VF_LINK_STATE_DISABLE
!=
681 MC_CMD_LINK_STATE_MODE_IN_LINK_STATE_DOWN
);
682 MCDI_POPULATE_DWORD_2(inbuf
, LINK_STATE_MODE_IN_FUNCTION
,
683 LINK_STATE_MODE_IN_FUNCTION_PF
,
685 LINK_STATE_MODE_IN_FUNCTION_VF
, vf_i
);
686 MCDI_SET_DWORD(inbuf
, LINK_STATE_MODE_IN_NEW_MODE
, link_state
);
687 return efx_mcdi_rpc(efx
, MC_CMD_LINK_STATE_MODE
, inbuf
, sizeof(inbuf
),
688 NULL
, 0, NULL
); /* don't care what old mode was */
691 int efx_ef10_sriov_get_vf_config(struct efx_nic
*efx
, int vf_i
,
692 struct ifla_vf_info
*ivf
)
694 MCDI_DECLARE_BUF(inbuf
, MC_CMD_LINK_STATE_MODE_IN_LEN
);
695 MCDI_DECLARE_BUF(outbuf
, MC_CMD_LINK_STATE_MODE_OUT_LEN
);
697 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
702 if (vf_i
>= efx
->vf_count
)
708 vf
= nic_data
->vf
+ vf_i
;
711 ivf
->min_tx_rate
= 0;
712 ivf
->max_tx_rate
= 0;
713 ether_addr_copy(ivf
->mac
, vf
->mac
);
714 ivf
->vlan
= (vf
->vlan
== EFX_EF10_NO_VLAN
) ? 0 : vf
->vlan
;
717 MCDI_POPULATE_DWORD_2(inbuf
, LINK_STATE_MODE_IN_FUNCTION
,
718 LINK_STATE_MODE_IN_FUNCTION_PF
,
720 LINK_STATE_MODE_IN_FUNCTION_VF
, vf_i
);
721 MCDI_SET_DWORD(inbuf
, LINK_STATE_MODE_IN_NEW_MODE
,
722 MC_CMD_LINK_STATE_MODE_IN_DO_NOT_CHANGE
);
723 rc
= efx_mcdi_rpc(efx
, MC_CMD_LINK_STATE_MODE
, inbuf
, sizeof(inbuf
),
724 outbuf
, sizeof(outbuf
), &outlen
);
727 if (outlen
< MC_CMD_LINK_STATE_MODE_OUT_LEN
)
729 ivf
->linkstate
= MCDI_DWORD(outbuf
, LINK_STATE_MODE_OUT_OLD_MODE
);
734 int efx_ef10_sriov_get_phys_port_id(struct efx_nic
*efx
,
735 struct netdev_phys_item_id
*ppid
)
737 struct efx_ef10_nic_data
*nic_data
= efx
->nic_data
;
739 if (!is_valid_ether_addr(nic_data
->port_id
))
742 ppid
->id_len
= ETH_ALEN
;
743 memcpy(ppid
->id
, nic_data
->port_id
, ppid
->id_len
);