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