mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 00:34:52 +00:00

Remove an inability of bnxt_en driver to set eswitch to switchdev mode without existing VFs by: 1. Allow to set switchdev mode in bnxt_dl_eswitch_mode_set() so representors are created only when num_vfs > 0 otherwise just set bp->eswitch_mode 2. Do not automatically change bp->eswitch_mode during bnxt_vf_reps_create() and bnxt_vf_reps_destroy() calls so the eswitch mode is managed only by an user by devlink. Just set temporarily bp->eswitch_mode to legacy to avoid re-opening of representors during destroy. 3. Create representors in bnxt_sriov_enable() if current eswitch mode is switchdev one Tested by this sequence: 1. Set PF interface up 2. Set PF's eswitch mode to switchdev 3. Created N VFs 4. Checked that N representors were created 5. Set eswitch mode to legacy 6. Checked that representors were deleted 7. Set eswitch mode back to switchdev 8. Checked that representors exist again for VFs 9. Deleted all VFs 10. Checked that all representors were deleted as well 11. Checked that current eswitch mode is still switchdev Signed-off-by: Ivan Vecera <ivecera@redhat.com> Acked-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com> Link: https://lore.kernel.org/r/20230411120443.126055-1-ivecera@redhat.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
83 lines
1.8 KiB
C
83 lines
1.8 KiB
C
/* Broadcom NetXtreme-C/E network driver.
|
|
*
|
|
* Copyright (c) 2016-2017 Broadcom Limited
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef BNXT_VFR_H
|
|
#define BNXT_VFR_H
|
|
|
|
#ifdef CONFIG_BNXT_SRIOV
|
|
|
|
#define MAX_CFA_CODE 65536
|
|
|
|
int bnxt_vf_reps_create(struct bnxt *bp);
|
|
void bnxt_vf_reps_destroy(struct bnxt *bp);
|
|
void bnxt_vf_reps_close(struct bnxt *bp);
|
|
void bnxt_vf_reps_open(struct bnxt *bp);
|
|
void bnxt_vf_rep_rx(struct bnxt *bp, struct sk_buff *skb);
|
|
struct net_device *bnxt_get_vf_rep(struct bnxt *bp, u16 cfa_code);
|
|
int bnxt_vf_reps_alloc(struct bnxt *bp);
|
|
void bnxt_vf_reps_free(struct bnxt *bp);
|
|
|
|
static inline u16 bnxt_vf_rep_get_fid(struct net_device *dev)
|
|
{
|
|
struct bnxt_vf_rep *vf_rep = netdev_priv(dev);
|
|
struct bnxt *bp = vf_rep->bp;
|
|
|
|
return bp->pf.vf[vf_rep->vf_idx].fw_fid;
|
|
}
|
|
|
|
bool bnxt_dev_is_vf_rep(struct net_device *dev);
|
|
int bnxt_dl_eswitch_mode_get(struct devlink *devlink, u16 *mode);
|
|
int bnxt_dl_eswitch_mode_set(struct devlink *devlink, u16 mode,
|
|
struct netlink_ext_ack *extack);
|
|
|
|
#else
|
|
|
|
static inline int bnxt_vf_reps_create(struct bnxt *bp)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void bnxt_vf_reps_close(struct bnxt *bp)
|
|
{
|
|
}
|
|
|
|
static inline void bnxt_vf_reps_open(struct bnxt *bp)
|
|
{
|
|
}
|
|
|
|
static inline void bnxt_vf_rep_rx(struct bnxt *bp, struct sk_buff *skb)
|
|
{
|
|
}
|
|
|
|
static inline struct net_device *bnxt_get_vf_rep(struct bnxt *bp, u16 cfa_code)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline u16 bnxt_vf_rep_get_fid(struct net_device *dev)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline bool bnxt_dev_is_vf_rep(struct net_device *dev)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int bnxt_vf_reps_alloc(struct bnxt *bp)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void bnxt_vf_reps_free(struct bnxt *bp)
|
|
{
|
|
}
|
|
|
|
#endif /* CONFIG_BNXT_SRIOV */
|
|
#endif /* BNXT_VFR_H */
|