/* Broadcom NetXtreme-C/E network driver. * * Copyright (c) 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. */ #include #include #include "bnxt_hsi.h" #include "bnxt.h" #include "bnxt_vfr.h" #include "bnxt_devlink.h" static const struct devlink_ops bnxt_dl_ops = { #ifdef CONFIG_BNXT_SRIOV .eswitch_mode_set = bnxt_dl_eswitch_mode_set, .eswitch_mode_get = bnxt_dl_eswitch_mode_get, #endif /* CONFIG_BNXT_SRIOV */ }; int bnxt_dl_register(struct bnxt *bp) { struct devlink *dl; int rc; if (!pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV)) return 0; if (bp->hwrm_spec_code < 0x10803) { netdev_warn(bp->dev, "Firmware does not support SR-IOV E-Switch SWITCHDEV mode.\n"); return -ENOTSUPP; } dl = devlink_alloc(&bnxt_dl_ops, sizeof(struct bnxt_dl)); if (!dl) { netdev_warn(bp->dev, "devlink_alloc failed"); return -ENOMEM; } bnxt_link_bp_to_dl(bp, dl); bp->eswitch_mode = DEVLINK_ESWITCH_MODE_LEGACY; rc = devlink_register(dl, &bp->pdev->dev); if (rc) { bnxt_link_bp_to_dl(bp, NULL); devlink_free(dl); netdev_warn(bp->dev, "devlink_register failed. rc=%d", rc); return rc; } return 0; } void bnxt_dl_unregister(struct bnxt *bp) { struct devlink *dl = bp->dl; if (!dl) return; devlink_unregister(dl); devlink_free(dl); }