Message ID | 0511A7C37BEE5C15+20240604155850.51983-7-mengyuanlou@net-swift.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | add sriov support for wangxun NICs | expand |
On 04.06.2024 17:57, Mengyuan Lou wrote: > Add sriov_configure for driver ops. > Add ndo_vf_ops for txgbe netdev ops. > Add mailbox handler wx_msg_task for txgbe. > > Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com> > --- Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > drivers/net/ethernet/wangxun/libwx/wx_sriov.c | 42 +++++++++++++++++++ > drivers/net/ethernet/wangxun/libwx/wx_sriov.h | 1 + > drivers/net/ethernet/wangxun/libwx/wx_type.h | 1 + > .../net/ethernet/wangxun/txgbe/txgbe_irq.c | 25 +++++++++-- > .../net/ethernet/wangxun/txgbe/txgbe_main.c | 23 ++++++++++ > .../net/ethernet/wangxun/txgbe/txgbe_phy.c | 8 ++++ > .../net/ethernet/wangxun/txgbe/txgbe_type.h | 4 +- > 7 files changed, 100 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ethernet/wangxun/libwx/wx_sriov.c b/drivers/net/ethernet/wangxun/libwx/wx_sriov.c > index 6d470cd0f317..375295578cff 100644 > --- a/drivers/net/ethernet/wangxun/libwx/wx_sriov.c > +++ b/drivers/net/ethernet/wangxun/libwx/wx_sriov.c > @@ -302,6 +302,15 @@ static void wx_clear_vmvir(struct wx *wx, u32 vf) > wr32(wx, WX_TDM_VLAN_INS(vf), 0); > } > > +static void wx_ping_vf(struct wx *wx, int vf) > +{ > + u32 ping = WX_PF_CONTROL_MSG; > + > + if (wx->vfinfo[vf].clear_to_send) > + ping |= WX_VT_MSGTYPE_CTS; > + wx_write_mbx_pf(wx, &ping, 1, vf); > +} > + > static void wx_set_vf_rx_tx(struct wx *wx, int vf) > { > u32 reg_cur_tx, reg_cur_rx, reg_req_tx, reg_req_rx; > @@ -975,3 +984,36 @@ void wx_ping_all_vfs_with_link_status(struct wx *wx, bool link_up) > } > } > EXPORT_SYMBOL(wx_ping_all_vfs_with_link_status); > + > +static void wx_set_vf_link_state(struct wx *wx, int vf, int state) > +{ > + wx->vfinfo[vf].link_state = state; > + switch (state) { > + case IFLA_VF_LINK_STATE_AUTO: > + if (netif_running(wx->netdev)) > + wx->vfinfo[vf].link_enable = true; > + else > + wx->vfinfo[vf].link_enable = false; > + break; > + case IFLA_VF_LINK_STATE_ENABLE: > + wx->vfinfo[vf].link_enable = true; > + break; > + case IFLA_VF_LINK_STATE_DISABLE: > + wx->vfinfo[vf].link_enable = false; > + break; > + } > + /* restart the VF */ > + wx->vfinfo[vf].clear_to_send = false; > + wx_ping_vf(wx, vf); > + > + wx_set_vf_rx_tx(wx, vf); > +} > + > +void wx_set_all_vfs(struct wx *wx) > +{ > + int i; > + > + for (i = 0 ; i < wx->num_vfs; i++) > + wx_set_vf_link_state(wx, i, wx->vfinfo[i].link_state); > +} > +EXPORT_SYMBOL(wx_set_all_vfs); > diff --git a/drivers/net/ethernet/wangxun/libwx/wx_sriov.h b/drivers/net/ethernet/wangxun/libwx/wx_sriov.h > index 7e45b3f71a7b..122d9c561ff5 100644 > --- a/drivers/net/ethernet/wangxun/libwx/wx_sriov.h > +++ b/drivers/net/ethernet/wangxun/libwx/wx_sriov.h > @@ -9,5 +9,6 @@ int wx_pci_sriov_configure(struct pci_dev *pdev, int num_vfs); > void wx_msg_task(struct wx *wx); > void wx_disable_vf_rx_tx(struct wx *wx); > void wx_ping_all_vfs_with_link_status(struct wx *wx, bool link_up); > +void wx_set_all_vfs(struct wx *wx); > > #endif /* _WX_SRIOV_H_ */ > diff --git a/drivers/net/ethernet/wangxun/libwx/wx_type.h b/drivers/net/ethernet/wangxun/libwx/wx_type.h > index b8f0bf93a0fb..1a4830eab763 100644 > --- a/drivers/net/ethernet/wangxun/libwx/wx_type.h > +++ b/drivers/net/ethernet/wangxun/libwx/wx_type.h > @@ -1053,6 +1053,7 @@ struct vf_data_storage { > u16 vf_mc_hashes[WX_MAX_VF_MC_ENTRIES]; > u16 num_vf_mc_hashes; > u16 vlan_count; > + int link_state; > }; > > struct vf_macvlans { > diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c > index b3e3605d1edb..e6be98865c2d 100644 > --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c > +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c > @@ -7,6 +7,7 @@ > #include "../libwx/wx_type.h" > #include "../libwx/wx_lib.h" > #include "../libwx/wx_hw.h" > +#include "../libwx/wx_sriov.h" > #include "txgbe_type.h" > #include "txgbe_phy.h" > #include "txgbe_irq.h" > @@ -176,6 +177,24 @@ static const struct irq_domain_ops txgbe_misc_irq_domain_ops = { > .map = txgbe_misc_irq_domain_map, > }; > > +static irqreturn_t txgbe_irq_handler(int irq, void *data) > +{ > + struct txgbe *txgbe = data; > + struct wx *wx = txgbe->wx; > + u32 eicr; > + > + eicr = wx_misc_isb(wx, WX_ISB_MISC) & TXGBE_PX_MISC_IEN_MASK; > + if (!eicr) > + return IRQ_NONE; > + txgbe->eicr = eicr; > + if (eicr & TXGBE_PX_MISC_IC_VF_MBOX) { > + wx_msg_task(txgbe->wx); > + wx_intr_enable(wx, TXGBE_INTR_MISC); > + } > + > + return IRQ_WAKE_THREAD; > +} > + > static irqreturn_t txgbe_misc_irq_handle(int irq, void *data) > { > struct txgbe *txgbe = data; > @@ -184,7 +203,7 @@ static irqreturn_t txgbe_misc_irq_handle(int irq, void *data) > unsigned int sub_irq; > u32 eicr; > > - eicr = wx_misc_isb(wx, WX_ISB_MISC); > + eicr = txgbe->eicr; > if (eicr & TXGBE_PX_MISC_GPIO) { > sub_irq = irq_find_mapping(txgbe->misc.domain, TXGBE_IRQ_GPIO); > handle_nested_irq(sub_irq); > @@ -226,7 +245,7 @@ int txgbe_setup_misc_irq(struct txgbe *txgbe) > struct wx *wx = txgbe->wx; > int hwirq, err; > > - txgbe->misc.nirqs = 2; > + txgbe->misc.nirqs = TXGBE_IRQ_MAX; > txgbe->misc.domain = irq_domain_add_simple(NULL, txgbe->misc.nirqs, 0, > &txgbe_misc_irq_domain_ops, txgbe); > if (!txgbe->misc.domain) > @@ -241,7 +260,7 @@ int txgbe_setup_misc_irq(struct txgbe *txgbe) > else > txgbe->misc.irq = wx->pdev->irq; > > - err = request_threaded_irq(txgbe->misc.irq, NULL, > + err = request_threaded_irq(txgbe->misc.irq, txgbe_irq_handler, > txgbe_misc_irq_handle, > IRQF_ONESHOT, > wx->netdev->name, txgbe); > diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c > index 8c7a74981b90..fbfd281f7e8b 100644 > --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c > +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c > @@ -14,6 +14,8 @@ > #include "../libwx/wx_type.h" > #include "../libwx/wx_lib.h" > #include "../libwx/wx_hw.h" > +#include "../libwx/wx_mbx.h" > +#include "../libwx/wx_sriov.h" > #include "txgbe_type.h" > #include "txgbe_hw.h" > #include "txgbe_phy.h" > @@ -99,6 +101,12 @@ static void txgbe_up_complete(struct wx *wx) > > /* enable transmits */ > netif_tx_start_all_queues(netdev); > + > + /* Set PF Reset Done bit so PF/VF Mail Ops can work */ > + wr32m(wx, WX_CFG_PORT_CTL, WX_CFG_PORT_CTL_PFRSTD, > + WX_CFG_PORT_CTL_PFRSTD); > + /* update setting rx tx for all active vfs */ > + wx_set_all_vfs(wx); > } > > static void txgbe_reset(struct wx *wx) > @@ -144,6 +152,16 @@ static void txgbe_disable_device(struct wx *wx) > wx_err(wx, "%s: invalid bus lan id %d\n", > __func__, wx->bus.func); > > + if (wx->num_vfs) { > + /* Clear EITR Select mapping */ > + wr32(wx, WX_PX_ITRSEL, 0); > + /* Mark all the VFs as inactive */ > + for (i = 0 ; i < wx->num_vfs; i++) > + wx->vfinfo[i].clear_to_send = 0; > + /* update setting rx tx for all active vfs */ > + wx_set_all_vfs(wx); > + } > + > if (!(((wx->subsystem_device_id & WX_NCSI_MASK) == WX_NCSI_SUP) || > ((wx->subsystem_device_id & WX_WOL_MASK) == WX_WOL_SUP))) { > /* disable mac transmiter */ > @@ -268,8 +286,11 @@ static int txgbe_sw_init(struct wx *wx) > /* set default work limits */ > wx->tx_work_limit = TXGBE_DEFAULT_TX_WORK; > wx->rx_work_limit = TXGBE_DEFAULT_RX_WORK; > + wx->mbx.size = WX_VXMAILBOX_SIZE; > > + wx->setup_tc = txgbe_setup_tc; > wx->do_reset = txgbe_do_reset; > + set_bit(0, &wx->fwd_bitmask); > > return 0; > } > @@ -725,6 +746,7 @@ static void txgbe_remove(struct pci_dev *pdev) > struct net_device *netdev; > > netdev = wx->netdev; > + wx_disable_sriov(wx); > unregister_netdev(netdev); > > txgbe_remove_phy(txgbe); > @@ -746,6 +768,7 @@ static struct pci_driver txgbe_driver = { > .probe = txgbe_probe, > .remove = txgbe_remove, > .shutdown = txgbe_shutdown, > + .sriov_configure = wx_pci_sriov_configure, > }; > > module_pci_driver(txgbe_driver); > diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c > index 5f502265f0a6..76635d4366e4 100644 > --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c > +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c > @@ -16,6 +16,7 @@ > #include "../libwx/wx_type.h" > #include "../libwx/wx_lib.h" > #include "../libwx/wx_hw.h" > +#include "../libwx/wx_sriov.h" > #include "txgbe_type.h" > #include "txgbe_phy.h" > #include "txgbe_hw.h" > @@ -179,6 +180,9 @@ static void txgbe_mac_link_down(struct phylink_config *config, > struct wx *wx = phylink_to_wx(config); > > wr32m(wx, WX_MAC_TX_CFG, WX_MAC_TX_CFG_TE, 0); > + wx->speed = 0; > + /* ping all the active vfs to let them know we are going down */ > + wx_ping_all_vfs_with_link_status(wx, false); > } > > static void txgbe_mac_link_up(struct phylink_config *config, > @@ -215,6 +219,10 @@ static void txgbe_mac_link_up(struct phylink_config *config, > wr32(wx, WX_MAC_PKT_FLT, WX_MAC_PKT_FLT_PR); > wdg = rd32(wx, WX_MAC_WDG_TIMEOUT); > wr32(wx, WX_MAC_WDG_TIMEOUT, wdg); > + > + wx->speed = speed; > + /* ping all the active vfs to let them know we are going up */ > + wx_ping_all_vfs_with_link_status(wx, true); > } > > static int txgbe_mac_prepare(struct phylink_config *config, unsigned int mode, > diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h > index f434a7865cb7..e84d10adf4c1 100644 > --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h > +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h > @@ -71,12 +71,13 @@ > #define TXGBE_PX_MISC_ETH_LK BIT(18) > #define TXGBE_PX_MISC_ETH_AN BIT(19) > #define TXGBE_PX_MISC_INT_ERR BIT(20) > +#define TXGBE_PX_MISC_IC_VF_MBOX BIT(23) > #define TXGBE_PX_MISC_GPIO BIT(26) > #define TXGBE_PX_MISC_IEN_MASK \ > (TXGBE_PX_MISC_ETH_LKDN | TXGBE_PX_MISC_DEV_RST | \ > TXGBE_PX_MISC_ETH_EVENT | TXGBE_PX_MISC_ETH_LK | \ > TXGBE_PX_MISC_ETH_AN | TXGBE_PX_MISC_INT_ERR | \ > - TXGBE_PX_MISC_GPIO) > + TXGBE_PX_MISC_IC_VF_MBOX | TXGBE_PX_MISC_GPIO) > > /* Port cfg registers */ > #define TXGBE_CFG_PORT_ST 0x14404 > @@ -196,6 +197,7 @@ struct txgbe { > struct gpio_chip *gpio; > unsigned int gpio_irq; > unsigned int link_irq; > + u32 eicr; > }; > > #endif /* _TXGBE_TYPE_H_ */
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_sriov.c b/drivers/net/ethernet/wangxun/libwx/wx_sriov.c index 6d470cd0f317..375295578cff 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_sriov.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_sriov.c @@ -302,6 +302,15 @@ static void wx_clear_vmvir(struct wx *wx, u32 vf) wr32(wx, WX_TDM_VLAN_INS(vf), 0); } +static void wx_ping_vf(struct wx *wx, int vf) +{ + u32 ping = WX_PF_CONTROL_MSG; + + if (wx->vfinfo[vf].clear_to_send) + ping |= WX_VT_MSGTYPE_CTS; + wx_write_mbx_pf(wx, &ping, 1, vf); +} + static void wx_set_vf_rx_tx(struct wx *wx, int vf) { u32 reg_cur_tx, reg_cur_rx, reg_req_tx, reg_req_rx; @@ -975,3 +984,36 @@ void wx_ping_all_vfs_with_link_status(struct wx *wx, bool link_up) } } EXPORT_SYMBOL(wx_ping_all_vfs_with_link_status); + +static void wx_set_vf_link_state(struct wx *wx, int vf, int state) +{ + wx->vfinfo[vf].link_state = state; + switch (state) { + case IFLA_VF_LINK_STATE_AUTO: + if (netif_running(wx->netdev)) + wx->vfinfo[vf].link_enable = true; + else + wx->vfinfo[vf].link_enable = false; + break; + case IFLA_VF_LINK_STATE_ENABLE: + wx->vfinfo[vf].link_enable = true; + break; + case IFLA_VF_LINK_STATE_DISABLE: + wx->vfinfo[vf].link_enable = false; + break; + } + /* restart the VF */ + wx->vfinfo[vf].clear_to_send = false; + wx_ping_vf(wx, vf); + + wx_set_vf_rx_tx(wx, vf); +} + +void wx_set_all_vfs(struct wx *wx) +{ + int i; + + for (i = 0 ; i < wx->num_vfs; i++) + wx_set_vf_link_state(wx, i, wx->vfinfo[i].link_state); +} +EXPORT_SYMBOL(wx_set_all_vfs); diff --git a/drivers/net/ethernet/wangxun/libwx/wx_sriov.h b/drivers/net/ethernet/wangxun/libwx/wx_sriov.h index 7e45b3f71a7b..122d9c561ff5 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_sriov.h +++ b/drivers/net/ethernet/wangxun/libwx/wx_sriov.h @@ -9,5 +9,6 @@ int wx_pci_sriov_configure(struct pci_dev *pdev, int num_vfs); void wx_msg_task(struct wx *wx); void wx_disable_vf_rx_tx(struct wx *wx); void wx_ping_all_vfs_with_link_status(struct wx *wx, bool link_up); +void wx_set_all_vfs(struct wx *wx); #endif /* _WX_SRIOV_H_ */ diff --git a/drivers/net/ethernet/wangxun/libwx/wx_type.h b/drivers/net/ethernet/wangxun/libwx/wx_type.h index b8f0bf93a0fb..1a4830eab763 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_type.h +++ b/drivers/net/ethernet/wangxun/libwx/wx_type.h @@ -1053,6 +1053,7 @@ struct vf_data_storage { u16 vf_mc_hashes[WX_MAX_VF_MC_ENTRIES]; u16 num_vf_mc_hashes; u16 vlan_count; + int link_state; }; struct vf_macvlans { diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c index b3e3605d1edb..e6be98865c2d 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c @@ -7,6 +7,7 @@ #include "../libwx/wx_type.h" #include "../libwx/wx_lib.h" #include "../libwx/wx_hw.h" +#include "../libwx/wx_sriov.h" #include "txgbe_type.h" #include "txgbe_phy.h" #include "txgbe_irq.h" @@ -176,6 +177,24 @@ static const struct irq_domain_ops txgbe_misc_irq_domain_ops = { .map = txgbe_misc_irq_domain_map, }; +static irqreturn_t txgbe_irq_handler(int irq, void *data) +{ + struct txgbe *txgbe = data; + struct wx *wx = txgbe->wx; + u32 eicr; + + eicr = wx_misc_isb(wx, WX_ISB_MISC) & TXGBE_PX_MISC_IEN_MASK; + if (!eicr) + return IRQ_NONE; + txgbe->eicr = eicr; + if (eicr & TXGBE_PX_MISC_IC_VF_MBOX) { + wx_msg_task(txgbe->wx); + wx_intr_enable(wx, TXGBE_INTR_MISC); + } + + return IRQ_WAKE_THREAD; +} + static irqreturn_t txgbe_misc_irq_handle(int irq, void *data) { struct txgbe *txgbe = data; @@ -184,7 +203,7 @@ static irqreturn_t txgbe_misc_irq_handle(int irq, void *data) unsigned int sub_irq; u32 eicr; - eicr = wx_misc_isb(wx, WX_ISB_MISC); + eicr = txgbe->eicr; if (eicr & TXGBE_PX_MISC_GPIO) { sub_irq = irq_find_mapping(txgbe->misc.domain, TXGBE_IRQ_GPIO); handle_nested_irq(sub_irq); @@ -226,7 +245,7 @@ int txgbe_setup_misc_irq(struct txgbe *txgbe) struct wx *wx = txgbe->wx; int hwirq, err; - txgbe->misc.nirqs = 2; + txgbe->misc.nirqs = TXGBE_IRQ_MAX; txgbe->misc.domain = irq_domain_add_simple(NULL, txgbe->misc.nirqs, 0, &txgbe_misc_irq_domain_ops, txgbe); if (!txgbe->misc.domain) @@ -241,7 +260,7 @@ int txgbe_setup_misc_irq(struct txgbe *txgbe) else txgbe->misc.irq = wx->pdev->irq; - err = request_threaded_irq(txgbe->misc.irq, NULL, + err = request_threaded_irq(txgbe->misc.irq, txgbe_irq_handler, txgbe_misc_irq_handle, IRQF_ONESHOT, wx->netdev->name, txgbe); diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c index 8c7a74981b90..fbfd281f7e8b 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c @@ -14,6 +14,8 @@ #include "../libwx/wx_type.h" #include "../libwx/wx_lib.h" #include "../libwx/wx_hw.h" +#include "../libwx/wx_mbx.h" +#include "../libwx/wx_sriov.h" #include "txgbe_type.h" #include "txgbe_hw.h" #include "txgbe_phy.h" @@ -99,6 +101,12 @@ static void txgbe_up_complete(struct wx *wx) /* enable transmits */ netif_tx_start_all_queues(netdev); + + /* Set PF Reset Done bit so PF/VF Mail Ops can work */ + wr32m(wx, WX_CFG_PORT_CTL, WX_CFG_PORT_CTL_PFRSTD, + WX_CFG_PORT_CTL_PFRSTD); + /* update setting rx tx for all active vfs */ + wx_set_all_vfs(wx); } static void txgbe_reset(struct wx *wx) @@ -144,6 +152,16 @@ static void txgbe_disable_device(struct wx *wx) wx_err(wx, "%s: invalid bus lan id %d\n", __func__, wx->bus.func); + if (wx->num_vfs) { + /* Clear EITR Select mapping */ + wr32(wx, WX_PX_ITRSEL, 0); + /* Mark all the VFs as inactive */ + for (i = 0 ; i < wx->num_vfs; i++) + wx->vfinfo[i].clear_to_send = 0; + /* update setting rx tx for all active vfs */ + wx_set_all_vfs(wx); + } + if (!(((wx->subsystem_device_id & WX_NCSI_MASK) == WX_NCSI_SUP) || ((wx->subsystem_device_id & WX_WOL_MASK) == WX_WOL_SUP))) { /* disable mac transmiter */ @@ -268,8 +286,11 @@ static int txgbe_sw_init(struct wx *wx) /* set default work limits */ wx->tx_work_limit = TXGBE_DEFAULT_TX_WORK; wx->rx_work_limit = TXGBE_DEFAULT_RX_WORK; + wx->mbx.size = WX_VXMAILBOX_SIZE; + wx->setup_tc = txgbe_setup_tc; wx->do_reset = txgbe_do_reset; + set_bit(0, &wx->fwd_bitmask); return 0; } @@ -725,6 +746,7 @@ static void txgbe_remove(struct pci_dev *pdev) struct net_device *netdev; netdev = wx->netdev; + wx_disable_sriov(wx); unregister_netdev(netdev); txgbe_remove_phy(txgbe); @@ -746,6 +768,7 @@ static struct pci_driver txgbe_driver = { .probe = txgbe_probe, .remove = txgbe_remove, .shutdown = txgbe_shutdown, + .sriov_configure = wx_pci_sriov_configure, }; module_pci_driver(txgbe_driver); diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c index 5f502265f0a6..76635d4366e4 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c @@ -16,6 +16,7 @@ #include "../libwx/wx_type.h" #include "../libwx/wx_lib.h" #include "../libwx/wx_hw.h" +#include "../libwx/wx_sriov.h" #include "txgbe_type.h" #include "txgbe_phy.h" #include "txgbe_hw.h" @@ -179,6 +180,9 @@ static void txgbe_mac_link_down(struct phylink_config *config, struct wx *wx = phylink_to_wx(config); wr32m(wx, WX_MAC_TX_CFG, WX_MAC_TX_CFG_TE, 0); + wx->speed = 0; + /* ping all the active vfs to let them know we are going down */ + wx_ping_all_vfs_with_link_status(wx, false); } static void txgbe_mac_link_up(struct phylink_config *config, @@ -215,6 +219,10 @@ static void txgbe_mac_link_up(struct phylink_config *config, wr32(wx, WX_MAC_PKT_FLT, WX_MAC_PKT_FLT_PR); wdg = rd32(wx, WX_MAC_WDG_TIMEOUT); wr32(wx, WX_MAC_WDG_TIMEOUT, wdg); + + wx->speed = speed; + /* ping all the active vfs to let them know we are going up */ + wx_ping_all_vfs_with_link_status(wx, true); } static int txgbe_mac_prepare(struct phylink_config *config, unsigned int mode, diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h index f434a7865cb7..e84d10adf4c1 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h @@ -71,12 +71,13 @@ #define TXGBE_PX_MISC_ETH_LK BIT(18) #define TXGBE_PX_MISC_ETH_AN BIT(19) #define TXGBE_PX_MISC_INT_ERR BIT(20) +#define TXGBE_PX_MISC_IC_VF_MBOX BIT(23) #define TXGBE_PX_MISC_GPIO BIT(26) #define TXGBE_PX_MISC_IEN_MASK \ (TXGBE_PX_MISC_ETH_LKDN | TXGBE_PX_MISC_DEV_RST | \ TXGBE_PX_MISC_ETH_EVENT | TXGBE_PX_MISC_ETH_LK | \ TXGBE_PX_MISC_ETH_AN | TXGBE_PX_MISC_INT_ERR | \ - TXGBE_PX_MISC_GPIO) + TXGBE_PX_MISC_IC_VF_MBOX | TXGBE_PX_MISC_GPIO) /* Port cfg registers */ #define TXGBE_CFG_PORT_ST 0x14404 @@ -196,6 +197,7 @@ struct txgbe { struct gpio_chip *gpio; unsigned int gpio_irq; unsigned int link_irq; + u32 eicr; }; #endif /* _TXGBE_TYPE_H_ */
Add sriov_configure for driver ops. Add ndo_vf_ops for txgbe netdev ops. Add mailbox handler wx_msg_task for txgbe. Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com> --- drivers/net/ethernet/wangxun/libwx/wx_sriov.c | 42 +++++++++++++++++++ drivers/net/ethernet/wangxun/libwx/wx_sriov.h | 1 + drivers/net/ethernet/wangxun/libwx/wx_type.h | 1 + .../net/ethernet/wangxun/txgbe/txgbe_irq.c | 25 +++++++++-- .../net/ethernet/wangxun/txgbe/txgbe_main.c | 23 ++++++++++ .../net/ethernet/wangxun/txgbe/txgbe_phy.c | 8 ++++ .../net/ethernet/wangxun/txgbe/txgbe_type.h | 4 +- 7 files changed, 100 insertions(+), 4 deletions(-)