linux/drivers/net/ethernet/pensando/ionic/ionic_devlink.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright(c) 2017 - 2019 Pensando Systems, Inc */
   3
   4#include <linux/module.h>
   5#include <linux/netdevice.h>
   6
   7#include "ionic.h"
   8#include "ionic_bus.h"
   9#include "ionic_lif.h"
  10#include "ionic_devlink.h"
  11
  12static int ionic_dl_flash_update(struct devlink *dl,
  13                                 struct devlink_flash_update_params *params,
  14                                 struct netlink_ext_ack *extack)
  15{
  16        struct ionic *ionic = devlink_priv(dl);
  17
  18        return ionic_firmware_update(ionic->lif, params->fw, extack);
  19}
  20
  21static int ionic_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
  22                             struct netlink_ext_ack *extack)
  23{
  24        struct ionic *ionic = devlink_priv(dl);
  25        struct ionic_dev *idev = &ionic->idev;
  26        char buf[16];
  27        int err = 0;
  28
  29        err = devlink_info_driver_name_put(req, IONIC_DRV_NAME);
  30        if (err)
  31                return err;
  32
  33        err = devlink_info_version_running_put(req,
  34                                               DEVLINK_INFO_VERSION_GENERIC_FW,
  35                                               idev->dev_info.fw_version);
  36        if (err)
  37                return err;
  38
  39        snprintf(buf, sizeof(buf), "0x%x", idev->dev_info.asic_type);
  40        err = devlink_info_version_fixed_put(req,
  41                                             DEVLINK_INFO_VERSION_GENERIC_ASIC_ID,
  42                                             buf);
  43        if (err)
  44                return err;
  45
  46        snprintf(buf, sizeof(buf), "0x%x", idev->dev_info.asic_rev);
  47        err = devlink_info_version_fixed_put(req,
  48                                             DEVLINK_INFO_VERSION_GENERIC_ASIC_REV,
  49                                             buf);
  50        if (err)
  51                return err;
  52
  53        err = devlink_info_serial_number_put(req, idev->dev_info.serial_num);
  54
  55        return err;
  56}
  57
  58static const struct devlink_ops ionic_dl_ops = {
  59        .info_get       = ionic_dl_info_get,
  60        .flash_update   = ionic_dl_flash_update,
  61};
  62
  63struct ionic *ionic_devlink_alloc(struct device *dev)
  64{
  65        struct devlink *dl;
  66
  67        dl = devlink_alloc(&ionic_dl_ops, sizeof(struct ionic), dev);
  68
  69        return devlink_priv(dl);
  70}
  71
  72void ionic_devlink_free(struct ionic *ionic)
  73{
  74        struct devlink *dl = priv_to_devlink(ionic);
  75
  76        devlink_free(dl);
  77}
  78
  79int ionic_devlink_register(struct ionic *ionic)
  80{
  81        struct devlink *dl = priv_to_devlink(ionic);
  82        struct devlink_port_attrs attrs = {};
  83        int err;
  84
  85        err = devlink_register(dl);
  86        if (err) {
  87                dev_warn(ionic->dev, "devlink_register failed: %d\n", err);
  88                return err;
  89        }
  90
  91        attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
  92        devlink_port_attrs_set(&ionic->dl_port, &attrs);
  93        err = devlink_port_register(dl, &ionic->dl_port, 0);
  94        if (err) {
  95                dev_err(ionic->dev, "devlink_port_register failed: %d\n", err);
  96                devlink_unregister(dl);
  97                return err;
  98        }
  99
 100        devlink_port_type_eth_set(&ionic->dl_port, ionic->lif->netdev);
 101        return 0;
 102}
 103
 104void ionic_devlink_unregister(struct ionic *ionic)
 105{
 106        struct devlink *dl = priv_to_devlink(ionic);
 107
 108        devlink_port_unregister(&ionic->dl_port);
 109        devlink_unregister(dl);
 110}
 111