| /* 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 <linux/pci.h> |
| #include <linux/netdevice.h> |
| #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); |
| } |