2 * net/core/ethtool.c - Ethtool ioctl handler
3 * Copyright (c) 2003 Matthew Wilcox <matthew@wil.cx>
5 * This file is where we call all the ethtool_ops commands to get
6 * the information ethtool needs.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
14 #include <linux/module.h>
15 #include <linux/types.h>
16 #include <linux/capability.h>
17 #include <linux/errno.h>
18 #include <linux/ethtool.h>
19 #include <linux/netdevice.h>
20 #include <asm/uaccess.h>
23 * Some useful ethtool_ops methods that're device independent.
24 * If we find that all drivers want to do the same thing here,
25 * we can turn these into dev_() function calls.
28 u32
ethtool_op_get_link(struct net_device
*dev
)
30 return netif_carrier_ok(dev
) ? 1 : 0;
33 u32
ethtool_op_get_tx_csum(struct net_device
*dev
)
35 return (dev
->features
& NETIF_F_ALL_CSUM
) != 0;
38 int ethtool_op_set_tx_csum(struct net_device
*dev
, u32 data
)
41 dev
->features
|= NETIF_F_IP_CSUM
;
43 dev
->features
&= ~NETIF_F_IP_CSUM
;
48 int ethtool_op_set_tx_hw_csum(struct net_device
*dev
, u32 data
)
51 dev
->features
|= NETIF_F_HW_CSUM
;
53 dev
->features
&= ~NETIF_F_HW_CSUM
;
58 int ethtool_op_set_tx_ipv6_csum(struct net_device
*dev
, u32 data
)
61 dev
->features
|= NETIF_F_IP_CSUM
| NETIF_F_IPV6_CSUM
;
63 dev
->features
&= ~(NETIF_F_IP_CSUM
| NETIF_F_IPV6_CSUM
);
68 u32
ethtool_op_get_sg(struct net_device
*dev
)
70 return (dev
->features
& NETIF_F_SG
) != 0;
73 int ethtool_op_set_sg(struct net_device
*dev
, u32 data
)
76 dev
->features
|= NETIF_F_SG
;
78 dev
->features
&= ~NETIF_F_SG
;
83 u32
ethtool_op_get_tso(struct net_device
*dev
)
85 return (dev
->features
& NETIF_F_TSO
) != 0;
88 int ethtool_op_set_tso(struct net_device
*dev
, u32 data
)
91 dev
->features
|= NETIF_F_TSO
;
93 dev
->features
&= ~NETIF_F_TSO
;
98 u32
ethtool_op_get_ufo(struct net_device
*dev
)
100 return (dev
->features
& NETIF_F_UFO
) != 0;
103 int ethtool_op_set_ufo(struct net_device
*dev
, u32 data
)
106 dev
->features
|= NETIF_F_UFO
;
108 dev
->features
&= ~NETIF_F_UFO
;
112 /* the following list of flags are the same as their associated
113 * NETIF_F_xxx values in include/linux/netdevice.h
115 static const u32 flags_dup_features
=
118 u32
ethtool_op_get_flags(struct net_device
*dev
)
120 /* in the future, this function will probably contain additional
121 * handling for flags which are not so easily handled
122 * by a simple masking operation
125 return dev
->features
& flags_dup_features
;
128 int ethtool_op_set_flags(struct net_device
*dev
, u32 data
)
130 if (data
& ETH_FLAG_LRO
)
131 dev
->features
|= NETIF_F_LRO
;
133 dev
->features
&= ~NETIF_F_LRO
;
138 /* Handlers for each ethtool command */
140 static int ethtool_get_settings(struct net_device
*dev
, void __user
*useraddr
)
142 struct ethtool_cmd cmd
= { ETHTOOL_GSET
};
145 if (!dev
->ethtool_ops
->get_settings
)
148 err
= dev
->ethtool_ops
->get_settings(dev
, &cmd
);
152 if (copy_to_user(useraddr
, &cmd
, sizeof(cmd
)))
157 static int ethtool_set_settings(struct net_device
*dev
, void __user
*useraddr
)
159 struct ethtool_cmd cmd
;
161 if (!dev
->ethtool_ops
->set_settings
)
164 if (copy_from_user(&cmd
, useraddr
, sizeof(cmd
)))
167 return dev
->ethtool_ops
->set_settings(dev
, &cmd
);
170 static int ethtool_get_drvinfo(struct net_device
*dev
, void __user
*useraddr
)
172 struct ethtool_drvinfo info
;
173 const struct ethtool_ops
*ops
= dev
->ethtool_ops
;
175 if (!ops
->get_drvinfo
)
178 memset(&info
, 0, sizeof(info
));
179 info
.cmd
= ETHTOOL_GDRVINFO
;
180 ops
->get_drvinfo(dev
, &info
);
182 if (ops
->get_sset_count
) {
185 rc
= ops
->get_sset_count(dev
, ETH_SS_TEST
);
187 info
.testinfo_len
= rc
;
188 rc
= ops
->get_sset_count(dev
, ETH_SS_STATS
);
191 rc
= ops
->get_sset_count(dev
, ETH_SS_PRIV_FLAGS
);
193 info
.n_priv_flags
= rc
;
195 /* code path for obsolete hooks */
197 if (ops
->self_test_count
)
198 info
.testinfo_len
= ops
->self_test_count(dev
);
199 if (ops
->get_stats_count
)
200 info
.n_stats
= ops
->get_stats_count(dev
);
202 if (ops
->get_regs_len
)
203 info
.regdump_len
= ops
->get_regs_len(dev
);
204 if (ops
->get_eeprom_len
)
205 info
.eedump_len
= ops
->get_eeprom_len(dev
);
207 if (copy_to_user(useraddr
, &info
, sizeof(info
)))
212 static int ethtool_get_regs(struct net_device
*dev
, char __user
*useraddr
)
214 struct ethtool_regs regs
;
215 const struct ethtool_ops
*ops
= dev
->ethtool_ops
;
219 if (!ops
->get_regs
|| !ops
->get_regs_len
)
222 if (copy_from_user(®s
, useraddr
, sizeof(regs
)))
225 reglen
= ops
->get_regs_len(dev
);
226 if (regs
.len
> reglen
)
229 regbuf
= kmalloc(reglen
, GFP_USER
);
233 ops
->get_regs(dev
, ®s
, regbuf
);
236 if (copy_to_user(useraddr
, ®s
, sizeof(regs
)))
238 useraddr
+= offsetof(struct ethtool_regs
, data
);
239 if (copy_to_user(useraddr
, regbuf
, regs
.len
))
248 static int ethtool_get_wol(struct net_device
*dev
, char __user
*useraddr
)
250 struct ethtool_wolinfo wol
= { ETHTOOL_GWOL
};
252 if (!dev
->ethtool_ops
->get_wol
)
255 dev
->ethtool_ops
->get_wol(dev
, &wol
);
257 if (copy_to_user(useraddr
, &wol
, sizeof(wol
)))
262 static int ethtool_set_wol(struct net_device
*dev
, char __user
*useraddr
)
264 struct ethtool_wolinfo wol
;
266 if (!dev
->ethtool_ops
->set_wol
)
269 if (copy_from_user(&wol
, useraddr
, sizeof(wol
)))
272 return dev
->ethtool_ops
->set_wol(dev
, &wol
);
275 static int ethtool_nway_reset(struct net_device
*dev
)
277 if (!dev
->ethtool_ops
->nway_reset
)
280 return dev
->ethtool_ops
->nway_reset(dev
);
283 static int ethtool_get_eeprom(struct net_device
*dev
, void __user
*useraddr
)
285 struct ethtool_eeprom eeprom
;
286 const struct ethtool_ops
*ops
= dev
->ethtool_ops
;
287 void __user
*userbuf
= useraddr
+ sizeof(eeprom
);
292 if (!ops
->get_eeprom
|| !ops
->get_eeprom_len
)
295 if (copy_from_user(&eeprom
, useraddr
, sizeof(eeprom
)))
298 /* Check for wrap and zero */
299 if (eeprom
.offset
+ eeprom
.len
<= eeprom
.offset
)
302 /* Check for exceeding total eeprom len */
303 if (eeprom
.offset
+ eeprom
.len
> ops
->get_eeprom_len(dev
))
306 data
= kmalloc(PAGE_SIZE
, GFP_USER
);
310 bytes_remaining
= eeprom
.len
;
311 while (bytes_remaining
> 0) {
312 eeprom
.len
= min(bytes_remaining
, (u32
)PAGE_SIZE
);
314 ret
= ops
->get_eeprom(dev
, &eeprom
, data
);
317 if (copy_to_user(userbuf
, data
, eeprom
.len
)) {
321 userbuf
+= eeprom
.len
;
322 eeprom
.offset
+= eeprom
.len
;
323 bytes_remaining
-= eeprom
.len
;
330 static int ethtool_set_eeprom(struct net_device
*dev
, void __user
*useraddr
)
332 struct ethtool_eeprom eeprom
;
333 const struct ethtool_ops
*ops
= dev
->ethtool_ops
;
334 void __user
*userbuf
= useraddr
+ sizeof(eeprom
);
339 if (!ops
->set_eeprom
|| !ops
->get_eeprom_len
)
342 if (copy_from_user(&eeprom
, useraddr
, sizeof(eeprom
)))
345 /* Check for wrap and zero */
346 if (eeprom
.offset
+ eeprom
.len
<= eeprom
.offset
)
349 /* Check for exceeding total eeprom len */
350 if (eeprom
.offset
+ eeprom
.len
> ops
->get_eeprom_len(dev
))
353 data
= kmalloc(PAGE_SIZE
, GFP_USER
);
357 bytes_remaining
= eeprom
.len
;
358 while (bytes_remaining
> 0) {
359 eeprom
.len
= min(bytes_remaining
, (u32
)PAGE_SIZE
);
361 if (copy_from_user(data
, userbuf
, eeprom
.len
)) {
365 ret
= ops
->set_eeprom(dev
, &eeprom
, data
);
368 userbuf
+= eeprom
.len
;
369 eeprom
.offset
+= eeprom
.len
;
370 bytes_remaining
-= eeprom
.len
;
377 static int ethtool_get_coalesce(struct net_device
*dev
, void __user
*useraddr
)
379 struct ethtool_coalesce coalesce
= { ETHTOOL_GCOALESCE
};
381 if (!dev
->ethtool_ops
->get_coalesce
)
384 dev
->ethtool_ops
->get_coalesce(dev
, &coalesce
);
386 if (copy_to_user(useraddr
, &coalesce
, sizeof(coalesce
)))
391 static int ethtool_set_coalesce(struct net_device
*dev
, void __user
*useraddr
)
393 struct ethtool_coalesce coalesce
;
395 if (!dev
->ethtool_ops
->set_coalesce
)
398 if (copy_from_user(&coalesce
, useraddr
, sizeof(coalesce
)))
401 return dev
->ethtool_ops
->set_coalesce(dev
, &coalesce
);
404 static int ethtool_get_ringparam(struct net_device
*dev
, void __user
*useraddr
)
406 struct ethtool_ringparam ringparam
= { ETHTOOL_GRINGPARAM
};
408 if (!dev
->ethtool_ops
->get_ringparam
)
411 dev
->ethtool_ops
->get_ringparam(dev
, &ringparam
);
413 if (copy_to_user(useraddr
, &ringparam
, sizeof(ringparam
)))
418 static int ethtool_set_ringparam(struct net_device
*dev
, void __user
*useraddr
)
420 struct ethtool_ringparam ringparam
;
422 if (!dev
->ethtool_ops
->set_ringparam
)
425 if (copy_from_user(&ringparam
, useraddr
, sizeof(ringparam
)))
428 return dev
->ethtool_ops
->set_ringparam(dev
, &ringparam
);
431 static int ethtool_get_pauseparam(struct net_device
*dev
, void __user
*useraddr
)
433 struct ethtool_pauseparam pauseparam
= { ETHTOOL_GPAUSEPARAM
};
435 if (!dev
->ethtool_ops
->get_pauseparam
)
438 dev
->ethtool_ops
->get_pauseparam(dev
, &pauseparam
);
440 if (copy_to_user(useraddr
, &pauseparam
, sizeof(pauseparam
)))
445 static int ethtool_set_pauseparam(struct net_device
*dev
, void __user
*useraddr
)
447 struct ethtool_pauseparam pauseparam
;
449 if (!dev
->ethtool_ops
->set_pauseparam
)
452 if (copy_from_user(&pauseparam
, useraddr
, sizeof(pauseparam
)))
455 return dev
->ethtool_ops
->set_pauseparam(dev
, &pauseparam
);
458 static int __ethtool_set_sg(struct net_device
*dev
, u32 data
)
462 if (!data
&& dev
->ethtool_ops
->set_tso
) {
463 err
= dev
->ethtool_ops
->set_tso(dev
, 0);
468 if (!data
&& dev
->ethtool_ops
->set_ufo
) {
469 err
= dev
->ethtool_ops
->set_ufo(dev
, 0);
473 return dev
->ethtool_ops
->set_sg(dev
, data
);
476 static int ethtool_set_tx_csum(struct net_device
*dev
, char __user
*useraddr
)
478 struct ethtool_value edata
;
481 if (!dev
->ethtool_ops
->set_tx_csum
)
484 if (copy_from_user(&edata
, useraddr
, sizeof(edata
)))
487 if (!edata
.data
&& dev
->ethtool_ops
->set_sg
) {
488 err
= __ethtool_set_sg(dev
, 0);
493 return dev
->ethtool_ops
->set_tx_csum(dev
, edata
.data
);
496 static int ethtool_set_sg(struct net_device
*dev
, char __user
*useraddr
)
498 struct ethtool_value edata
;
500 if (!dev
->ethtool_ops
->set_sg
)
503 if (copy_from_user(&edata
, useraddr
, sizeof(edata
)))
507 !(dev
->features
& NETIF_F_ALL_CSUM
))
510 return __ethtool_set_sg(dev
, edata
.data
);
513 static int ethtool_set_tso(struct net_device
*dev
, char __user
*useraddr
)
515 struct ethtool_value edata
;
517 if (!dev
->ethtool_ops
->set_tso
)
520 if (copy_from_user(&edata
, useraddr
, sizeof(edata
)))
523 if (edata
.data
&& !(dev
->features
& NETIF_F_SG
))
526 return dev
->ethtool_ops
->set_tso(dev
, edata
.data
);
529 static int ethtool_set_ufo(struct net_device
*dev
, char __user
*useraddr
)
531 struct ethtool_value edata
;
533 if (!dev
->ethtool_ops
->set_ufo
)
535 if (copy_from_user(&edata
, useraddr
, sizeof(edata
)))
537 if (edata
.data
&& !(dev
->features
& NETIF_F_SG
))
539 if (edata
.data
&& !(dev
->features
& NETIF_F_HW_CSUM
))
541 return dev
->ethtool_ops
->set_ufo(dev
, edata
.data
);
544 static int ethtool_get_gso(struct net_device
*dev
, char __user
*useraddr
)
546 struct ethtool_value edata
= { ETHTOOL_GGSO
};
548 edata
.data
= dev
->features
& NETIF_F_GSO
;
549 if (copy_to_user(useraddr
, &edata
, sizeof(edata
)))
554 static int ethtool_set_gso(struct net_device
*dev
, char __user
*useraddr
)
556 struct ethtool_value edata
;
558 if (copy_from_user(&edata
, useraddr
, sizeof(edata
)))
561 dev
->features
|= NETIF_F_GSO
;
563 dev
->features
&= ~NETIF_F_GSO
;
567 static int ethtool_self_test(struct net_device
*dev
, char __user
*useraddr
)
569 struct ethtool_test test
;
570 const struct ethtool_ops
*ops
= dev
->ethtool_ops
;
576 if (!ops
->get_sset_count
&& !ops
->self_test_count
)
579 if (ops
->get_sset_count
)
580 test_len
= ops
->get_sset_count(dev
, ETH_SS_TEST
);
582 /* code path for obsolete hook */
583 test_len
= ops
->self_test_count(dev
);
586 WARN_ON(test_len
== 0);
588 if (copy_from_user(&test
, useraddr
, sizeof(test
)))
592 data
= kmalloc(test_len
* sizeof(u64
), GFP_USER
);
596 ops
->self_test(dev
, &test
, data
);
599 if (copy_to_user(useraddr
, &test
, sizeof(test
)))
601 useraddr
+= sizeof(test
);
602 if (copy_to_user(useraddr
, data
, test
.len
* sizeof(u64
)))
611 static int ethtool_get_strings(struct net_device
*dev
, void __user
*useraddr
)
613 struct ethtool_gstrings gstrings
;
614 const struct ethtool_ops
*ops
= dev
->ethtool_ops
;
618 if (!ops
->get_strings
)
621 if (copy_from_user(&gstrings
, useraddr
, sizeof(gstrings
)))
624 if (ops
->get_sset_count
) {
625 ret
= ops
->get_sset_count(dev
, gstrings
.string_set
);
631 /* code path for obsolete hooks */
633 switch (gstrings
.string_set
) {
635 if (!ops
->self_test_count
)
637 gstrings
.len
= ops
->self_test_count(dev
);
640 if (!ops
->get_stats_count
)
642 gstrings
.len
= ops
->get_stats_count(dev
);
649 data
= kmalloc(gstrings
.len
* ETH_GSTRING_LEN
, GFP_USER
);
653 ops
->get_strings(dev
, gstrings
.string_set
, data
);
656 if (copy_to_user(useraddr
, &gstrings
, sizeof(gstrings
)))
658 useraddr
+= sizeof(gstrings
);
659 if (copy_to_user(useraddr
, data
, gstrings
.len
* ETH_GSTRING_LEN
))
668 static int ethtool_phys_id(struct net_device
*dev
, void __user
*useraddr
)
670 struct ethtool_value id
;
672 if (!dev
->ethtool_ops
->phys_id
)
675 if (copy_from_user(&id
, useraddr
, sizeof(id
)))
678 return dev
->ethtool_ops
->phys_id(dev
, id
.data
);
681 static int ethtool_get_stats(struct net_device
*dev
, void __user
*useraddr
)
683 struct ethtool_stats stats
;
684 const struct ethtool_ops
*ops
= dev
->ethtool_ops
;
688 if (!ops
->get_ethtool_stats
)
690 if (!ops
->get_sset_count
&& !ops
->get_stats_count
)
693 if (ops
->get_sset_count
)
694 n_stats
= ops
->get_sset_count(dev
, ETH_SS_STATS
);
696 /* code path for obsolete hook */
697 n_stats
= ops
->get_stats_count(dev
);
700 WARN_ON(n_stats
== 0);
702 if (copy_from_user(&stats
, useraddr
, sizeof(stats
)))
705 stats
.n_stats
= n_stats
;
706 data
= kmalloc(n_stats
* sizeof(u64
), GFP_USER
);
710 ops
->get_ethtool_stats(dev
, &stats
, data
);
713 if (copy_to_user(useraddr
, &stats
, sizeof(stats
)))
715 useraddr
+= sizeof(stats
);
716 if (copy_to_user(useraddr
, data
, stats
.n_stats
* sizeof(u64
)))
725 static int ethtool_get_perm_addr(struct net_device
*dev
, void __user
*useraddr
)
727 struct ethtool_perm_addr epaddr
;
729 if (copy_from_user(&epaddr
, useraddr
, sizeof(epaddr
)))
732 if (epaddr
.size
< dev
->addr_len
)
734 epaddr
.size
= dev
->addr_len
;
736 if (copy_to_user(useraddr
, &epaddr
, sizeof(epaddr
)))
738 useraddr
+= sizeof(epaddr
);
739 if (copy_to_user(useraddr
, dev
->perm_addr
, epaddr
.size
))
744 static int ethtool_get_value(struct net_device
*dev
, char __user
*useraddr
,
745 u32 cmd
, u32 (*actor
)(struct net_device
*))
747 struct ethtool_value edata
= { cmd
};
752 edata
.data
= actor(dev
);
754 if (copy_to_user(useraddr
, &edata
, sizeof(edata
)))
759 static int ethtool_set_value_void(struct net_device
*dev
, char __user
*useraddr
,
760 void (*actor
)(struct net_device
*, u32
))
762 struct ethtool_value edata
;
767 if (copy_from_user(&edata
, useraddr
, sizeof(edata
)))
770 actor(dev
, edata
.data
);
774 static int ethtool_set_value(struct net_device
*dev
, char __user
*useraddr
,
775 int (*actor
)(struct net_device
*, u32
))
777 struct ethtool_value edata
;
782 if (copy_from_user(&edata
, useraddr
, sizeof(edata
)))
785 return actor(dev
, edata
.data
);
788 /* The main entry point in this file. Called from net/core/dev.c */
790 int dev_ethtool(struct net
*net
, struct ifreq
*ifr
)
792 struct net_device
*dev
= __dev_get_by_name(net
, ifr
->ifr_name
);
793 void __user
*useraddr
= ifr
->ifr_data
;
796 unsigned long old_features
;
798 if (!dev
|| !netif_device_present(dev
))
801 if (!dev
->ethtool_ops
)
804 if (copy_from_user(ðcmd
, useraddr
, sizeof (ethcmd
)))
807 /* Allow some commands to be done by anyone */
809 case ETHTOOL_GDRVINFO
:
810 case ETHTOOL_GMSGLVL
:
811 case ETHTOOL_GCOALESCE
:
812 case ETHTOOL_GRINGPARAM
:
813 case ETHTOOL_GPAUSEPARAM
:
814 case ETHTOOL_GRXCSUM
:
815 case ETHTOOL_GTXCSUM
:
817 case ETHTOOL_GSTRINGS
:
819 case ETHTOOL_GPERMADDR
:
823 case ETHTOOL_GPFLAGS
:
826 if (!capable(CAP_NET_ADMIN
))
830 if (dev
->ethtool_ops
->begin
)
831 if ((rc
= dev
->ethtool_ops
->begin(dev
)) < 0)
834 old_features
= dev
->features
;
838 rc
= ethtool_get_settings(dev
, useraddr
);
841 rc
= ethtool_set_settings(dev
, useraddr
);
843 case ETHTOOL_GDRVINFO
:
844 rc
= ethtool_get_drvinfo(dev
, useraddr
);
847 rc
= ethtool_get_regs(dev
, useraddr
);
850 rc
= ethtool_get_wol(dev
, useraddr
);
853 rc
= ethtool_set_wol(dev
, useraddr
);
855 case ETHTOOL_GMSGLVL
:
856 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
857 dev
->ethtool_ops
->get_msglevel
);
859 case ETHTOOL_SMSGLVL
:
860 rc
= ethtool_set_value_void(dev
, useraddr
,
861 dev
->ethtool_ops
->set_msglevel
);
863 case ETHTOOL_NWAY_RST
:
864 rc
= ethtool_nway_reset(dev
);
867 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
868 dev
->ethtool_ops
->get_link
);
870 case ETHTOOL_GEEPROM
:
871 rc
= ethtool_get_eeprom(dev
, useraddr
);
873 case ETHTOOL_SEEPROM
:
874 rc
= ethtool_set_eeprom(dev
, useraddr
);
876 case ETHTOOL_GCOALESCE
:
877 rc
= ethtool_get_coalesce(dev
, useraddr
);
879 case ETHTOOL_SCOALESCE
:
880 rc
= ethtool_set_coalesce(dev
, useraddr
);
882 case ETHTOOL_GRINGPARAM
:
883 rc
= ethtool_get_ringparam(dev
, useraddr
);
885 case ETHTOOL_SRINGPARAM
:
886 rc
= ethtool_set_ringparam(dev
, useraddr
);
888 case ETHTOOL_GPAUSEPARAM
:
889 rc
= ethtool_get_pauseparam(dev
, useraddr
);
891 case ETHTOOL_SPAUSEPARAM
:
892 rc
= ethtool_set_pauseparam(dev
, useraddr
);
894 case ETHTOOL_GRXCSUM
:
895 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
896 dev
->ethtool_ops
->get_rx_csum
);
898 case ETHTOOL_SRXCSUM
:
899 rc
= ethtool_set_value(dev
, useraddr
,
900 dev
->ethtool_ops
->set_rx_csum
);
902 case ETHTOOL_GTXCSUM
:
903 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
904 (dev
->ethtool_ops
->get_tx_csum
?
905 dev
->ethtool_ops
->get_tx_csum
:
906 ethtool_op_get_tx_csum
));
908 case ETHTOOL_STXCSUM
:
909 rc
= ethtool_set_tx_csum(dev
, useraddr
);
912 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
913 (dev
->ethtool_ops
->get_sg
?
914 dev
->ethtool_ops
->get_sg
:
918 rc
= ethtool_set_sg(dev
, useraddr
);
921 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
922 (dev
->ethtool_ops
->get_tso
?
923 dev
->ethtool_ops
->get_tso
:
924 ethtool_op_get_tso
));
927 rc
= ethtool_set_tso(dev
, useraddr
);
930 rc
= ethtool_self_test(dev
, useraddr
);
932 case ETHTOOL_GSTRINGS
:
933 rc
= ethtool_get_strings(dev
, useraddr
);
935 case ETHTOOL_PHYS_ID
:
936 rc
= ethtool_phys_id(dev
, useraddr
);
939 rc
= ethtool_get_stats(dev
, useraddr
);
941 case ETHTOOL_GPERMADDR
:
942 rc
= ethtool_get_perm_addr(dev
, useraddr
);
945 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
946 (dev
->ethtool_ops
->get_ufo
?
947 dev
->ethtool_ops
->get_ufo
:
948 ethtool_op_get_ufo
));
951 rc
= ethtool_set_ufo(dev
, useraddr
);
954 rc
= ethtool_get_gso(dev
, useraddr
);
957 rc
= ethtool_set_gso(dev
, useraddr
);
960 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
961 dev
->ethtool_ops
->get_flags
);
964 rc
= ethtool_set_value(dev
, useraddr
,
965 dev
->ethtool_ops
->set_flags
);
967 case ETHTOOL_GPFLAGS
:
968 rc
= ethtool_get_value(dev
, useraddr
, ethcmd
,
969 dev
->ethtool_ops
->get_priv_flags
);
971 case ETHTOOL_SPFLAGS
:
972 rc
= ethtool_set_value(dev
, useraddr
,
973 dev
->ethtool_ops
->set_priv_flags
);
979 if (dev
->ethtool_ops
->complete
)
980 dev
->ethtool_ops
->complete(dev
);
982 if (old_features
!= dev
->features
)
983 netdev_features_change(dev
);
988 EXPORT_SYMBOL(ethtool_op_get_link
);
989 EXPORT_SYMBOL(ethtool_op_get_sg
);
990 EXPORT_SYMBOL(ethtool_op_get_tso
);
991 EXPORT_SYMBOL(ethtool_op_get_tx_csum
);
992 EXPORT_SYMBOL(ethtool_op_set_sg
);
993 EXPORT_SYMBOL(ethtool_op_set_tso
);
994 EXPORT_SYMBOL(ethtool_op_set_tx_csum
);
995 EXPORT_SYMBOL(ethtool_op_set_tx_hw_csum
);
996 EXPORT_SYMBOL(ethtool_op_set_tx_ipv6_csum
);
997 EXPORT_SYMBOL(ethtool_op_set_ufo
);
998 EXPORT_SYMBOL(ethtool_op_get_ufo
);
999 EXPORT_SYMBOL(ethtool_op_set_flags
);
1000 EXPORT_SYMBOL(ethtool_op_get_flags
);