aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/ethtool.h
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2011-04-01 19:35:15 -0400
committerBen Hutchings <bhutchings@solarflare.com>2011-04-05 10:12:01 -0400
commit68f512f21a64c9b264df6c61a9333e7890faf74b (patch)
tree4635193aaec903f09ae69df4dc880296d74c5135 /include/linux/ethtool.h
parent8717d07b1143e0f150921f5bd7cfe7af579a995a (diff)
ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
The ethtool ETHTOOL_PHYS_ID command runs for an arbitrarily long period of time, holding the RTNL lock. This blocks routing updates, device enumeration, and various important operations that one might want to keep running while hunting for the flashing LED. We need to drop the RTNL lock during this operation, but currently the core implementation is a thin wrapper around a driver operation and drivers may well depend upon holding the lock. Define a new driver operation 'set_phys_id' with an argument that sets the ID indicator on/off/inactive/active (the last optional, for any driver or firmware that prefers to handle blinking asynchronously). When this is defined, the ethtool core drops the lock while waiting and only acquires it around calls to this operation. Deprecate the 'phys_id' operation in favour of this. It can be removed once all in-tree drivers are converted. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'include/linux/ethtool.h')
-rw-r--r--include/linux/ethtool.h30
1 files changed, 29 insertions, 1 deletions
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index ead7dcb1bf1e..c04d1316d221 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -663,6 +663,22 @@ struct ethtool_rx_ntuple_list {
663 unsigned int count; 663 unsigned int count;
664}; 664};
665 665
666/**
667 * enum ethtool_phys_id_state - indicator state for physical identification
668 * @ETHTOOL_ID_INACTIVE: Physical ID indicator should be deactivated
669 * @ETHTOOL_ID_ACTIVE: Physical ID indicator should be activated
670 * @ETHTOOL_ID_ON: LED should be turned on (used iff %ETHTOOL_ID_ACTIVE
671 * is not supported)
672 * @ETHTOOL_ID_OFF: LED should be turned off (used iff %ETHTOOL_ID_ACTIVE
673 * is not supported)
674 */
675enum ethtool_phys_id_state {
676 ETHTOOL_ID_INACTIVE,
677 ETHTOOL_ID_ACTIVE,
678 ETHTOOL_ID_ON,
679 ETHTOOL_ID_OFF
680};
681
666struct net_device; 682struct net_device;
667 683
668/* Some generic methods drivers may use in their ethtool_ops */ 684/* Some generic methods drivers may use in their ethtool_ops */
@@ -741,7 +757,18 @@ bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported);
741 * segmentation offload on or off. Returns a negative error code or zero. 757 * segmentation offload on or off. Returns a negative error code or zero.
742 * @self_test: Run specified self-tests 758 * @self_test: Run specified self-tests
743 * @get_strings: Return a set of strings that describe the requested objects 759 * @get_strings: Return a set of strings that describe the requested objects
744 * @phys_id: Identify the physical device, e.g. by flashing an LED 760 * @set_phys_id: Identify the physical devices, e.g. by flashing an LED
761 * attached to it. The implementation may update the indicator
762 * asynchronously or synchronously, but in either case it must return
763 * quickly. It is initially called with the argument %ETHTOOL_ID_ACTIVE,
764 * and must either activate asynchronous updates or return -%EINVAL.
765 * If it returns -%EINVAL then it will be called again at intervals with
766 * argument %ETHTOOL_ID_ON or %ETHTOOL_ID_OFF and should set the state of
767 * the indicator accordingly. Finally, it is called with the argument
768 * %ETHTOOL_ID_INACTIVE and must deactivate the indicator. Returns a
769 * negative error code or zero.
770 * @phys_id: Deprecated in favour of @set_phys_id.
771 * Identify the physical device, e.g. by flashing an LED
745 * attached to it until interrupted by a signal or the given time 772 * attached to it until interrupted by a signal or the given time
746 * (in seconds) elapses. If the given time is zero, use a default 773 * (in seconds) elapses. If the given time is zero, use a default
747 * time limit. Returns a negative error code or zero. Being 774 * time limit. Returns a negative error code or zero. Being
@@ -830,6 +857,7 @@ struct ethtool_ops {
830 int (*set_tso)(struct net_device *, u32); 857 int (*set_tso)(struct net_device *, u32);
831 void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); 858 void (*self_test)(struct net_device *, struct ethtool_test *, u64 *);
832 void (*get_strings)(struct net_device *, u32 stringset, u8 *); 859 void (*get_strings)(struct net_device *, u32 stringset, u8 *);
860 int (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state);
833 int (*phys_id)(struct net_device *, u32); 861 int (*phys_id)(struct net_device *, u32);
834 void (*get_ethtool_stats)(struct net_device *, 862 void (*get_ethtool_stats)(struct net_device *,
835 struct ethtool_stats *, u64 *); 863 struct ethtool_stats *, u64 *);