New upstream version 18.02
[deb_dpdk.git] / kernel / linux / kni / kni_ethtool.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright(c) 2010-2014 Intel Corporation.
4  */
5
6 #include <linux/device.h>
7 #include <linux/netdevice.h>
8 #include <linux/ethtool.h>
9 #include "kni_dev.h"
10
11 static int
12 kni_check_if_running(struct net_device *dev)
13 {
14         struct kni_dev *priv = netdev_priv(dev);
15
16         if (priv->lad_dev)
17                 return 0;
18         else
19                 return -EOPNOTSUPP;
20 }
21
22 static void
23 kni_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
24 {
25         struct kni_dev *priv = netdev_priv(dev);
26
27         priv->lad_dev->ethtool_ops->get_drvinfo(priv->lad_dev, info);
28 }
29
30 static int
31 kni_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
32 {
33         struct kni_dev *priv = netdev_priv(dev);
34
35         return priv->lad_dev->ethtool_ops->get_settings(priv->lad_dev, ecmd);
36 }
37
38 static int
39 kni_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
40 {
41         struct kni_dev *priv = netdev_priv(dev);
42
43         return priv->lad_dev->ethtool_ops->set_settings(priv->lad_dev, ecmd);
44 }
45
46 static void
47 kni_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
48 {
49         struct kni_dev *priv = netdev_priv(dev);
50
51         priv->lad_dev->ethtool_ops->get_wol(priv->lad_dev, wol);
52 }
53
54 static int
55 kni_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
56 {
57         struct kni_dev *priv = netdev_priv(dev);
58
59         return priv->lad_dev->ethtool_ops->set_wol(priv->lad_dev, wol);
60 }
61
62 static int
63 kni_nway_reset(struct net_device *dev)
64 {
65         struct kni_dev *priv = netdev_priv(dev);
66
67         return priv->lad_dev->ethtool_ops->nway_reset(priv->lad_dev);
68 }
69
70 static int
71 kni_get_eeprom_len(struct net_device *dev)
72 {
73         struct kni_dev *priv = netdev_priv(dev);
74
75         return priv->lad_dev->ethtool_ops->get_eeprom_len(priv->lad_dev);
76 }
77
78 static int
79 kni_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
80                                                         u8 *bytes)
81 {
82         struct kni_dev *priv = netdev_priv(dev);
83
84         return priv->lad_dev->ethtool_ops->get_eeprom(priv->lad_dev, eeprom,
85                                                                 bytes);
86 }
87
88 static int
89 kni_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
90                                                         u8 *bytes)
91 {
92         struct kni_dev *priv = netdev_priv(dev);
93
94         return priv->lad_dev->ethtool_ops->set_eeprom(priv->lad_dev, eeprom,
95                                                                 bytes);
96 }
97
98 static void
99 kni_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring)
100 {
101         struct kni_dev *priv = netdev_priv(dev);
102
103         priv->lad_dev->ethtool_ops->get_ringparam(priv->lad_dev, ring);
104 }
105
106 static int
107 kni_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ring)
108 {
109         struct kni_dev *priv = netdev_priv(dev);
110
111         return priv->lad_dev->ethtool_ops->set_ringparam(priv->lad_dev, ring);
112 }
113
114 static void
115 kni_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *pause)
116 {
117         struct kni_dev *priv = netdev_priv(dev);
118
119         priv->lad_dev->ethtool_ops->get_pauseparam(priv->lad_dev, pause);
120 }
121
122 static int
123 kni_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *pause)
124 {
125         struct kni_dev *priv = netdev_priv(dev);
126
127         return priv->lad_dev->ethtool_ops->set_pauseparam(priv->lad_dev,
128                                                                 pause);
129 }
130
131 static u32
132 kni_get_msglevel(struct net_device *dev)
133 {
134         struct kni_dev *priv = netdev_priv(dev);
135
136         return priv->lad_dev->ethtool_ops->get_msglevel(priv->lad_dev);
137 }
138
139 static void
140 kni_set_msglevel(struct net_device *dev, u32 data)
141 {
142         struct kni_dev *priv = netdev_priv(dev);
143
144         priv->lad_dev->ethtool_ops->set_msglevel(priv->lad_dev, data);
145 }
146
147 static int
148 kni_get_regs_len(struct net_device *dev)
149 {
150         struct kni_dev *priv = netdev_priv(dev);
151
152         return priv->lad_dev->ethtool_ops->get_regs_len(priv->lad_dev);
153 }
154
155 static void
156 kni_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
157 {
158         struct kni_dev *priv = netdev_priv(dev);
159
160         priv->lad_dev->ethtool_ops->get_regs(priv->lad_dev, regs, p);
161 }
162
163 static void
164 kni_get_strings(struct net_device *dev, u32 stringset, u8 *data)
165 {
166         struct kni_dev *priv = netdev_priv(dev);
167
168         priv->lad_dev->ethtool_ops->get_strings(priv->lad_dev, stringset,
169                                                                 data);
170 }
171
172 static int
173 kni_get_sset_count(struct net_device *dev, int sset)
174 {
175         struct kni_dev *priv = netdev_priv(dev);
176
177         return priv->lad_dev->ethtool_ops->get_sset_count(priv->lad_dev, sset);
178 }
179
180 static void
181 kni_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats,
182                                                                 u64 *data)
183 {
184         struct kni_dev *priv = netdev_priv(dev);
185
186         priv->lad_dev->ethtool_ops->get_ethtool_stats(priv->lad_dev, stats,
187                                                                 data);
188 }
189
190 struct ethtool_ops kni_ethtool_ops = {
191         .begin                  = kni_check_if_running,
192         .get_drvinfo            = kni_get_drvinfo,
193         .get_settings           = kni_get_settings,
194         .set_settings           = kni_set_settings,
195         .get_regs_len           = kni_get_regs_len,
196         .get_regs               = kni_get_regs,
197         .get_wol                = kni_get_wol,
198         .set_wol                = kni_set_wol,
199         .nway_reset             = kni_nway_reset,
200         .get_link               = ethtool_op_get_link,
201         .get_eeprom_len         = kni_get_eeprom_len,
202         .get_eeprom             = kni_get_eeprom,
203         .set_eeprom             = kni_set_eeprom,
204         .get_ringparam          = kni_get_ringparam,
205         .set_ringparam          = kni_set_ringparam,
206         .get_pauseparam         = kni_get_pauseparam,
207         .set_pauseparam         = kni_set_pauseparam,
208         .get_msglevel           = kni_get_msglevel,
209         .set_msglevel           = kni_set_msglevel,
210         .get_strings            = kni_get_strings,
211         .get_sset_count         = kni_get_sset_count,
212         .get_ethtool_stats      = kni_get_ethtool_stats,
213 };
214
215 void
216 kni_set_ethtool_ops(struct net_device *netdev)
217 {
218         netdev->ethtool_ops = &kni_ethtool_ops;
219 }