diff --git a/drivers/net/ethernet/nvidia/nvethernet/ioctl.c b/drivers/net/ethernet/nvidia/nvethernet/ioctl.c index 066de7da..9236dd24 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ioctl.c +++ b/drivers/net/ethernet/nvidia/nvethernet/ioctl.c @@ -577,6 +577,45 @@ static int ether_config_l2_da_filter(struct net_device *dev, return ret; } +/** + * @brief This function is invoked by ioctl when user issues an ioctl command + * to save/restore MAC registers. + * + * Algorithm: Call osi_save_registers and osi_restore_registers + * based on user flags. + * + * @param[in] ndev: network device structure + * @param[in] flags: flags to indicate whether to save and restore MAC registers + * + * @note Ethernet interface need to be up. + * + * @retval 0 on Success + * @retval "negative value" on Failure + */ +static int ether_reg_save_restore(struct net_device *ndev, + unsigned int flags) +{ + struct ether_priv_data *pdata = netdev_priv(ndev); + struct osi_core_priv_data *osi_core = pdata->osi_core; + + if (flags == OSI_ENABLE) { + if (osi_restore_registers(osi_core)) { + dev_err(pdata->dev, "Restore MAC registers fail\n"); + return -EBUSY; + } + } else if (flags == OSI_DISABLE) { + if (osi_save_registers(osi_core)) { + dev_err(pdata->dev, "Save MAC registers fail\n"); + return -EBUSY; + } + } else { + dev_err(pdata->dev, "Invalid flag values:%d\n", flags); + return -EINVAL; + } + + return 0; +} + /** * @brief This function is invoked by ioctl when user issues an ioctl command * to enable/disable MAC loopback mode. @@ -591,7 +630,7 @@ static int ether_config_l2_da_filter(struct net_device *dev, * * @note MAC and PHY need to be initialized. * - * @retval 0 on Sucess + * @retval 0 on Success * @retval "negative value" on Failure */ static int ether_config_loopback_mode(struct net_device *ndev, @@ -750,6 +789,9 @@ int ether_handle_priv_ioctl(struct net_device *ndev, case ETHER_CONFIG_LOOPBACK_MODE: ret = ether_config_loopback_mode(ndev, ifdata.if_flags); break; + case ETHER_SAVE_RESTORE: + ret = ether_reg_save_restore(ndev, ifdata.if_flags); + break; default: break; } diff --git a/drivers/net/ethernet/nvidia/nvethernet/ioctl.h b/drivers/net/ethernet/nvidia/nvethernet/ioctl.h index 9599883f..7a15ecb5 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ioctl.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ioctl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2018-2020, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -50,6 +50,7 @@ #define ETHER_CONFIG_ARP_OFFLOAD 36 #define ETHER_CONFIG_LOOPBACK_MODE 40 #define ETHER_GET_AVB_ALGORITHM 46 +#define ETHER_SAVE_RESTORE 47 /** @} */ /**