1*17fcb3dcSFan Gong // SPDX-License-Identifier: GPL-2.0 2*17fcb3dcSFan Gong // Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. 3*17fcb3dcSFan Gong 4*17fcb3dcSFan Gong #include <linux/etherdevice.h> 5*17fcb3dcSFan Gong #include <linux/netdevice.h> 6*17fcb3dcSFan Gong 7*17fcb3dcSFan Gong #include "hinic3_hwif.h" 8*17fcb3dcSFan Gong #include "hinic3_nic_cfg.h" 9*17fcb3dcSFan Gong #include "hinic3_nic_dev.h" 10*17fcb3dcSFan Gong #include "hinic3_nic_io.h" 11*17fcb3dcSFan Gong #include "hinic3_rx.h" 12*17fcb3dcSFan Gong #include "hinic3_tx.h" 13*17fcb3dcSFan Gong 14*17fcb3dcSFan Gong static int hinic3_open(struct net_device *netdev) 15*17fcb3dcSFan Gong { 16*17fcb3dcSFan Gong /* Completed by later submission due to LoC limit. */ 17*17fcb3dcSFan Gong return -EFAULT; 18*17fcb3dcSFan Gong } 19*17fcb3dcSFan Gong 20*17fcb3dcSFan Gong static int hinic3_close(struct net_device *netdev) 21*17fcb3dcSFan Gong { 22*17fcb3dcSFan Gong /* Completed by later submission due to LoC limit. */ 23*17fcb3dcSFan Gong return -EFAULT; 24*17fcb3dcSFan Gong } 25*17fcb3dcSFan Gong 26*17fcb3dcSFan Gong static int hinic3_change_mtu(struct net_device *netdev, int new_mtu) 27*17fcb3dcSFan Gong { 28*17fcb3dcSFan Gong int err; 29*17fcb3dcSFan Gong 30*17fcb3dcSFan Gong err = hinic3_set_port_mtu(netdev, new_mtu); 31*17fcb3dcSFan Gong if (err) { 32*17fcb3dcSFan Gong netdev_err(netdev, "Failed to change port mtu to %d\n", 33*17fcb3dcSFan Gong new_mtu); 34*17fcb3dcSFan Gong return err; 35*17fcb3dcSFan Gong } 36*17fcb3dcSFan Gong 37*17fcb3dcSFan Gong netdev_dbg(netdev, "Change mtu from %u to %d\n", netdev->mtu, new_mtu); 38*17fcb3dcSFan Gong WRITE_ONCE(netdev->mtu, new_mtu); 39*17fcb3dcSFan Gong 40*17fcb3dcSFan Gong return 0; 41*17fcb3dcSFan Gong } 42*17fcb3dcSFan Gong 43*17fcb3dcSFan Gong static int hinic3_set_mac_addr(struct net_device *netdev, void *addr) 44*17fcb3dcSFan Gong { 45*17fcb3dcSFan Gong struct hinic3_nic_dev *nic_dev = netdev_priv(netdev); 46*17fcb3dcSFan Gong struct sockaddr *saddr = addr; 47*17fcb3dcSFan Gong int err; 48*17fcb3dcSFan Gong 49*17fcb3dcSFan Gong if (!is_valid_ether_addr(saddr->sa_data)) 50*17fcb3dcSFan Gong return -EADDRNOTAVAIL; 51*17fcb3dcSFan Gong 52*17fcb3dcSFan Gong if (ether_addr_equal(netdev->dev_addr, saddr->sa_data)) 53*17fcb3dcSFan Gong return 0; 54*17fcb3dcSFan Gong 55*17fcb3dcSFan Gong err = hinic3_update_mac(nic_dev->hwdev, netdev->dev_addr, 56*17fcb3dcSFan Gong saddr->sa_data, 0, 57*17fcb3dcSFan Gong hinic3_global_func_id(nic_dev->hwdev)); 58*17fcb3dcSFan Gong 59*17fcb3dcSFan Gong if (err) 60*17fcb3dcSFan Gong return err; 61*17fcb3dcSFan Gong 62*17fcb3dcSFan Gong eth_hw_addr_set(netdev, saddr->sa_data); 63*17fcb3dcSFan Gong 64*17fcb3dcSFan Gong return 0; 65*17fcb3dcSFan Gong } 66*17fcb3dcSFan Gong 67*17fcb3dcSFan Gong static const struct net_device_ops hinic3_netdev_ops = { 68*17fcb3dcSFan Gong .ndo_open = hinic3_open, 69*17fcb3dcSFan Gong .ndo_stop = hinic3_close, 70*17fcb3dcSFan Gong .ndo_change_mtu = hinic3_change_mtu, 71*17fcb3dcSFan Gong .ndo_set_mac_address = hinic3_set_mac_addr, 72*17fcb3dcSFan Gong .ndo_start_xmit = hinic3_xmit_frame, 73*17fcb3dcSFan Gong }; 74*17fcb3dcSFan Gong 75*17fcb3dcSFan Gong void hinic3_set_netdev_ops(struct net_device *netdev) 76*17fcb3dcSFan Gong { 77*17fcb3dcSFan Gong netdev->netdev_ops = &hinic3_netdev_ops; 78*17fcb3dcSFan Gong } 79