New upstream version 18.11-rc1
[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 /* ETHTOOL_GLINKSETTINGS replaces ETHTOOL_GSET */
31 #ifndef ETHTOOL_GLINKSETTINGS
32 static int
33 kni_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
34 {
35         struct kni_dev *priv = netdev_priv(dev);
36
37         return priv->lad_dev->ethtool_ops->get_settings(priv->lad_dev, ecmd);
38 }
39 #endif
40
41 /* ETHTOOL_SLINKSETTINGS replaces ETHTOOL_SSET */
42 #ifndef ETHTOOL_SLINKSETTINGS
43 static int
44 kni_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
45 {
46         struct kni_dev *priv = netdev_priv(dev);
47
48         return priv->lad_dev->ethtool_ops->set_settings(priv->lad_dev, ecmd);
49 }
50 #endif
51
52 static void
53 kni_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
54 {
55         struct kni_dev *priv = netdev_priv(dev);
56
57         priv->lad_dev->ethtool_ops->get_wol(priv->lad_dev, wol);
58 }
59
60 static int
61 kni_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
62 {
63         struct kni_dev *priv = netdev_priv(dev);
64
65         return priv->lad_dev->ethtool_ops->set_wol(priv->lad_dev, wol);
66 }
67
68 static int
69 kni_nway_reset(struct net_device *dev)
70 {
71         struct kni_dev *priv = netdev_priv(dev);
72
73         return priv->lad_dev->ethtool_ops->nway_reset(priv->lad_dev);
74 }
75
76 static int
77 kni_get_eeprom_len(struct net_device *dev)
78 {
79         struct kni_dev *priv = netdev_priv(dev);
80
81         return priv->lad_dev->ethtool_ops->get_eeprom_len(priv->lad_dev);
82 }
83
84 static int
85 kni_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
86                                                         u8 *bytes)
87 {
88         struct kni_dev *priv = netdev_priv(dev);
89
90         return priv->lad_dev->ethtool_ops->get_eeprom(priv->lad_dev, eeprom,
91                                                                 bytes);
92 }
93
94 static int
95 kni_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
96                                                         u8 *bytes)
97 {
98         struct kni_dev *priv = netdev_priv(dev);
99
100         return priv->lad_dev->ethtool_ops->set_eeprom(priv->lad_dev, eeprom,
101                                                                 bytes);
102 }
103
104 static void
105 kni_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring)
106 {
107         struct kni_dev *priv = netdev_priv(dev);
108
109         priv->lad_dev->ethtool_ops->get_ringparam(priv->lad_dev, ring);
110 }
111
112 static int
113 kni_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ring)
114 {
115         struct kni_dev *priv = netdev_priv(dev);
116
117         return priv->lad_dev->ethtool_ops->set_ringparam(priv->lad_dev, ring);
118 }
119
120 static void
121 kni_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *pause)
122 {
123         struct kni_dev *priv = netdev_priv(dev);
124
125         priv->lad_dev->ethtool_ops->get_pauseparam(priv->lad_dev, pause);
126 }
127
128 static int
129 kni_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *pause)
130 {
131         struct kni_dev *priv = netdev_priv(dev);
132
133         return priv->lad_dev->ethtool_ops->set_pauseparam(priv->lad_dev,
134                                                                 pause);
135 }
136
137 static u32
138 kni_get_msglevel(struct net_device *dev)
139 {
140         struct kni_dev *priv = netdev_priv(dev);
141
142         return priv->lad_dev->ethtool_ops->get_msglevel(priv->lad_dev);
143 }
144
145 static void
146 kni_set_msglevel(struct net_device *dev, u32 data)
147 {
148         struct kni_dev *priv = netdev_priv(dev);
149
150         priv->lad_dev->ethtool_ops->set_msglevel(priv->lad_dev, data);
151 }
152
153 static int
154 kni_get_regs_len(struct net_device *dev)
155 {
156         struct kni_dev *priv = netdev_priv(dev);
157
158         return priv->lad_dev->ethtool_ops->get_regs_len(priv->lad_dev);
159 }
160
161 static void
162 kni_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
163 {
164         struct kni_dev *priv = netdev_priv(dev);
165
166         priv->lad_dev->ethtool_ops->get_regs(priv->lad_dev, regs, p);
167 }
168
169 static void
170 kni_get_strings(struct net_device *dev, u32 stringset, u8 *data)
171 {
172         struct kni_dev *priv = netdev_priv(dev);
173
174         priv->lad_dev->ethtool_ops->get_strings(priv->lad_dev, stringset,
175                                                                 data);
176 }
177
178 static int
179 kni_get_sset_count(struct net_device *dev, int sset)
180 {
181         struct kni_dev *priv = netdev_priv(dev);
182
183         return priv->lad_dev->ethtool_ops->get_sset_count(priv->lad_dev, sset);
184 }
185
186 static void
187 kni_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats,
188                                                                 u64 *data)
189 {
190         struct kni_dev *priv = netdev_priv(dev);
191
192         priv->lad_dev->ethtool_ops->get_ethtool_stats(priv->lad_dev, stats,
193                                                                 data);
194 }
195
196 struct ethtool_ops kni_ethtool_ops = {
197         .begin                  = kni_check_if_running,
198         .get_drvinfo            = kni_get_drvinfo,
199 #ifndef ETHTOOL_GLINKSETTINGS
200         .get_settings           = kni_get_settings,
201 #endif
202 #ifndef ETHTOOL_SLINKSETTINGS
203         .set_settings           = kni_set_settings,
204 #endif
205         .get_regs_len           = kni_get_regs_len,
206         .get_regs               = kni_get_regs,
207         .get_wol                = kni_get_wol,
208         .set_wol                = kni_set_wol,
209         .nway_reset             = kni_nway_reset,
210         .get_link               = ethtool_op_get_link,
211         .get_eeprom_len         = kni_get_eeprom_len,
212         .get_eeprom             = kni_get_eeprom,
213         .set_eeprom             = kni_set_eeprom,
214         .get_ringparam          = kni_get_ringparam,
215         .set_ringparam          = kni_set_ringparam,
216         .get_pauseparam         = kni_get_pauseparam,
217         .set_pauseparam         = kni_set_pauseparam,
218         .get_msglevel           = kni_get_msglevel,
219         .set_msglevel           = kni_set_msglevel,
220         .get_strings            = kni_get_strings,
221         .get_sset_count         = kni_get_sset_count,
222         .get_ethtool_stats      = kni_get_ethtool_stats,
223 };
224
225 void
226 kni_set_ethtool_ops(struct net_device *netdev)
227 {
228         netdev->ethtool_ops = &kni_ethtool_ops;
229 }