pull request: sfc-next-2.6 2011-04-03
Subsystems (3)
The following changes since commit 9b12c75bf4d58dd85c987ee7b6a4356fdc7c1222:
David S. Miller (1):
net: Order ports in same order as addresses in flow objects.
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-next-2.6.git master
1. Implement of generic features interface in sfc.
2. Update ethtool_ops documentation.
3. Reimplement ETHTOOL_PHYS_ID as dicussed, dropping the RTNL lock.
Please allow some time for others to review before pulling.
Ben.
Ben Hutchings (6):
sfc: Move test of rx_checksum_enabled from nic.c to rx.c
sfc: Implement generic features interface
ethtool: Convert struct ethtool_ops comment to kernel-doc format
ethtool: Fill out and update comment for struct ethtool_ops
ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
sfc: Implement ethtool_ops::set_phys_id instead of ethtool_ops::phys_id
drivers/net/sfc/efx.c | 17 ++++- drivers/net/sfc/ethtool.c | 106 ++++--------------------- drivers/net/sfc/net_driver.h | 2 - drivers/net/sfc/nic.c | 6 +- drivers/net/sfc/rx.c | 3 + include/linux/ethtool.h | 177 ++++++++++++++++++++++++++++++------------ net/core/ethtool.c | 46 +++++++++++- 7 files changed, 209 insertions(+), 148 deletions(-)
Signature · 3 lines
Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
PATCH 1/6 sfc: Move test of rx_checksum_enabled from nic.c to rx.c
This is preparation for using the generic netdev features interface, and should have no effect in itself.
--- drivers/net/sfc/nic.c | 6 ++---- drivers/net/sfc/rx.c | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/net/sfc/nic.c +2 -4
@@ -850,7 +850,6 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)unsigned expected_ptr;bool rx_ev_pkt_ok, discard = false, checksummed;struct efx_rx_queue *rx_queue; -struct efx_nic *efx = channel->efx;/* Basic packet information */ rx_ev_byte_cnt =EFX_QWORD_FIELD (*event,FSF_AZ_RX_EV_BYTE_CNT );
@@ -873,9 +872,8 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)* UDP/IP, then we can rely on the hardware checksum. */ checksummed = -likely (efx->rx_checksum_enabled) && - (rx_ev_hdr_type ==FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP || - rx_ev_hdr_type ==FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP ); + rx_ev_hdr_type ==FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP || + rx_ev_hdr_type ==FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP ; }else {efx_handle_rx_not_ok (rx_queue, event, &rx_ev_pkt_ok, &discard); checksummed = false;
drivers/net/sfc/rx.c +3 -0
@@ -605,6 +605,9 @@ void __efx_rx_packet(struct efx_channel *channel,skb_record_rx_queue (skb, channel->channel); } +if (unlikely (!efx->rx_checksum_enabled)) + checksummed = false; +if (likely (checksummed || rx_buf->is_page)) {efx_rx_packet_gro (channel, rx_buf, eh, checksummed);return ;
Signature · 8 lines
1.5.4 -- Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
PATCH 2/6 sfc: Implement generic features interface
In reply to Ben Hutchings--- drivers/net/sfc/efx.c | 17 ++++++++- drivers/net/sfc/ethtool.c | 78 ------------------------------------------ drivers/net/sfc/net_driver.h | 2 - drivers/net/sfc/rx.c | 2 +- 4 files changed, 16 insertions(+), 83 deletions(-)
drivers/net/sfc/efx.c +15 -2
@@ -1874,6 +1874,17 @@ static void efx_set_multicast_list(struct net_device *net_dev)/* Otherwise efx_start_port() will do this */ } +static int efx_set_features (struct net_device *net_dev,u32 data) +{ +struct efx_nic *efx =netdev_priv (net_dev); + +/* If disabling RX n-tuple filtering, clear existing filters */ +if (net_dev->features & ~data &NETIF_F_NTUPLE ) +efx_filter_clear_rx (efx,EFX_FILTER_PRI_MANUAL ); + +return 0 ; +} +static const struct net_device_ops efx_netdev_ops = { .ndo_open = efx_net_open, .ndo_stop = efx_net_stop,
@@ -1885,6 +1896,7 @@ static const struct net_device_ops efx_netdev_ops = { .ndo_change_mtu = efx_change_mtu, .ndo_set_mac_address = efx_set_mac_address, .ndo_set_multicast_list = efx_set_multicast_list, + .ndo_set_features = efx_set_features,#ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = efx_netpoll,#endif
@@ -2269,7 +2281,6 @@ static int efx_init_struct(struct efx_nic *efx, struct efx_nic_type *type,strlcpy (efx->name,pci_name (pci_dev),sizeof (efx->name)); efx->net_dev = net_dev; - efx->rx_checksum_enabled = true;spin_lock_init (&efx->stats_lock);mutex_init (&efx->mac_lock); efx->mac_op = type->default_mac_ops;
@@ -2452,12 +2463,14 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,return -ENOMEM ; net_dev->features |= (type->offload_features |NETIF_F_SG |NETIF_F_HIGHDMA |NETIF_F_TSO | -NETIF_F_GRO ); +NETIF_F_GRO |NETIF_F_RXCSUM );if (type->offload_features &NETIF_F_V6_CSUM ) net_dev->features |=NETIF_F_TSO6 ;/* Mask for features that also apply to VLAN devices */ net_dev->vlan_features |= (NETIF_F_ALL_CSUM |NETIF_F_SG |NETIF_F_HIGHDMA |NETIF_F_TSO ); +/* All offloads can be toggled */ + net_dev->hw_features = net_dev->features & ~NETIF_F_HIGHDMA ; efx =netdev_priv (net_dev);pci_set_drvdata (pci_dev, efx);SET_NETDEV_DEV (net_dev, &pci_dev->dev);
drivers/net/sfc/ethtool.c +0 -78
90 lines not on this page · raw message
drivers/net/sfc/net_driver.h +0 -2
@@ -681,7 +681,6 @@ struct efx_filter_state;* @port_inhibited: If set, the netif_carrier is always off. Hold the mac_lock * @port_initialized: Port initialized? * @net_dev: Operating system network device. Consider holding the rtnl lock -* @rx_checksum_enabled: RX checksumming enabled * @stats_buffer: DMA buffer for statistics * @mac_op: MAC interface * @phy_type: PHY type
@@ -771,7 +770,6 @@ struct efx_nic {bool port_initialized;struct net_device *net_dev; -bool rx_checksum_enabled;struct efx_buffer stats_buffer;
drivers/net/sfc/rx.c +1 -1
@@ -605,7 +605,7 @@ void __efx_rx_packet(struct efx_channel *channel,skb_record_rx_queue (skb, channel->channel); } -if (unlikely (!efx->rx_checksum_enabled)) +if (unlikely (!(efx->net_dev->features &NETIF_F_RXCSUM ))) checksummed = false;if (likely (checksummed || rx_buf->is_page)) {
Signature · 8 lines
1.5.4 -- Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
Re: [PATCH net-next-2.6 2/6] sfc: Implement generic features interface
Quoted 8 lines · Ben Hutchings
Signed-off-by Ben Hutchings <[email protected]>--- drivers/net/sfc/efx.c | 17 ++++++++- drivers/net/sfc/ethtool.c | 78 ------------------------------------------ drivers/net/sfc/net_driver.h | 2 - drivers/net/sfc/rx.c | 2 +- 4 files changed, 16 insertions(+), 83 deletions(-)
[cut patch]
Looks ok to me.
BTW, I noticed that TSO6 is not enabled in vlan_features. Is this intentional?
Best Regards,
Michał Mirosław
Re: [PATCH net-next-2.6 2/6] sfc: Implement generic features interface
Quoted 9 lines · Michał Mirosław
Quoted 8 lines · Ben Hutchings
Signed-off-by Ben Hutchings <[email protected]>--- drivers/net/sfc/efx.c | 17 ++++++++- drivers/net/sfc/ethtool.c | 78 ------------------------------------------ drivers/net/sfc/net_driver.h | 2 - drivers/net/sfc/rx.c | 2 +- 4 files changed, 16 insertions(+), 83 deletions(-)
Quoted 5 lines
[cut patch]
Looks ok to me.
BTW, I noticed that TSO6 is not enabled in
vlan_features. Is this intentional?
Well spotted. It's not intentional.
Ben.
Signature · 3 lines
Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
Re: [PATCH net-next-2.6 2/6] sfc: Implement generic features interface
In reply to Ben HutchingsQuoted 7 lines · Ben Hutchings
Signed-off-by Ben Hutchings <[email protected]>--- drivers/net/sfc/efx.c | 17 ++++++++- drivers/net/sfc/ethtool.c | 78 ------------------------------------------ drivers/net/sfc/net_driver.h | 2 - drivers/net/sfc/rx.c | 2 +- 4 files changed, 16 insertions(+), 83 deletions(-)
Noticed one more thing:
Quoted 4 lines
drivers/net/sfc/efx.c +0
-0
[...]
drivers/net/sfc/efx.c static int __devinit efx_pci_probe(struct pci_dev *pci_dev, · line 2466
Quoted 6 lines
drivers/net/sfc/efx.c +1
-1@@ -2452,12 +2463,14 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,return -ENOMEM ; net_dev->features |= (type->offload_features |NETIF_F_SG |NETIF_F_HIGHDMA |NETIF_F_TSO | -NETIF_F_GRO ); +NETIF_F_GRO |NETIF_F_RXCSUM );
NETIF_F_GRO is enabled in register_netdev() now , so it's not needed here.
Best Regards,
Michał Mirosław
PATCH 3/6 ethtool: Convert struct ethtool_ops comment to kernel-doc format
In reply to Ben Hutchings--- include/linux/ethtool.h | 80 ++++++++++++++++++++-------------------------- 1 files changed, 35 insertions(+), 45 deletions(-)
include/linux/ethtool.h +35 -45
@@ -683,63 +683,53 @@ void ethtool_ntuple_flush(struct net_device *dev);bool ethtool_invalid_flags (struct net_device *dev,u32 data,u32 supported);/** -* ðtool_ops - Alter and report network device settings -* get_settings: Get device-specific settings -* set_settings: Set device-specific settings -* get_drvinfo: Report driver information -* get_regs: Get device registers -* get_wol: Report whether Wake-on-Lan is enabled -* set_wol: Turn Wake-on-Lan on or off -* get_msglevel: Report driver message level -* set_msglevel: Set driver message level -* nway_reset: Restart autonegotiation -* get_link: Get link status -* get_eeprom: Read data from the device EEPROM -* set_eeprom: Write data to the device EEPROM -* get_coalesce: Get interrupt coalescing parameters -* set_coalesce: Set interrupt coalescing parameters -* get_ringparam: Report ring sizes -* set_ringparam: Set ring sizes -* get_pauseparam: Report pause parameters -* set_pauseparam: Set pause parameters -* get_rx_csum: Report whether receive checksums are turned on or off -* set_rx_csum: Turn receive checksum on or off -* get_tx_csum: Report whether transmit checksums are turned on or off -* set_tx_csum: Turn transmit checksums on or off -* get_sg: Report whether scatter-gather is enabled -* set_sg: Turn scatter-gather on or off -* get_tso: Report whether TCP segmentation offload is enabled -* set_tso: Turn TCP segmentation offload on or off -* get_ufo: Report whether UDP fragmentation offload is enabled -* set_ufo: Turn UDP fragmentation offload on or off -* self_test: Run specified self-tests -* get_strings: Return a set of strings that describe the requested objects -* phys_id: Identify the device -* get_stats: Return statistics about the device -* get_flags: get 32-bit flags bitmap -* set_flags: set 32-bit flags bitmap -* -* Description: -* -* get_settings: +* struct ethtool_ops - Alter and report network device settings +* @get_settings: Get device-specific settings. * @get_settings is passed an ðtool_cmd to fill in. It returns * an negative errno or zero. -* -* set_settings: +* @set_settings: Set device-specific settings. * @set_settings is passed an ðtool_cmd and should attempt to set * all the settings this device supports. It may return an error value * if something goes wrong (otherwise 0). -* -* get_eeprom: +* @get_drvinfo: Report driver information +* @get_regs: Get device registers +* @get_wol: Report whether Wake-on-Lan is enabled +* @set_wol: Turn Wake-on-Lan on or off +* @get_msglevel: Report driver message level +* @set_msglevel: Set driver message level +* @nway_reset: Restart autonegotiation +* @get_link: Get link status +* @get_eeprom: Read data from the device EEPROM. * Should fill in the magic field. Don't need to check len for zero * or wraparound. Fill in the data argument with the eeprom values * from offset to offset + len. Update len to the amount read. * Returns an error or zero. -* -* set_eeprom: +* @set_eeprom: Write data to the device EEPROM. * Should validate the magic field. Don't need to check len for zero * or wraparound. Update len to the amount written. Returns an error * or zero. +* @get_coalesce: Get interrupt coalescing parameters +* @set_coalesce: Set interrupt coalescing parameters +* @get_ringparam: Report ring sizes +* @set_ringparam: Set ring sizes +* @get_pauseparam: Report pause parameters +* @set_pauseparam: Set pause parameters +* @get_rx_csum: Report whether receive checksums are turned on or off +* @set_rx_csum: Turn receive checksum on or off +* @get_tx_csum: Report whether transmit checksums are turned on or off +* @set_tx_csum: Turn transmit checksums on or off +* @get_sg: Report whether scatter-gather is enabled +* @set_sg: Turn scatter-gather on or off +* @get_tso: Report whether TCP segmentation offload is enabled +* @set_tso: Turn TCP segmentation offload on or off +* @get_ufo: Report whether UDP fragmentation offload is enabled +* @set_ufo: Turn UDP fragmentation offload on or off +* @self_test: Run specified self-tests +* @get_strings: Return a set of strings that describe the requested objects +* @phys_id: Identify the device +* @get_stats: Return statistics about the device +* @get_flags: get 32-bit flags bitmap +* @set_flags: set 32-bit flags bitmap */ struct ethtool_ops {int (*get_settings)(struct net_device *,struct ethtool_cmd *);
Signature · 8 lines
1.5.4 -- Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
PATCH 4/6 ethtool: Fill out and update comment for struct ethtool_ops
In reply to Ben HutchingsBriefly document all operations (except get_rx_ntuple), including whether they may return an error code and whether they are deprecated. Also mention some things that should be handled by the ethtool core rather than by drivers.
Briefly document general requirements for callers.
--- include/linux/ethtool.h | 121 +++++++++++++++++++++++++++++++++++------------ 1 files changed, 90 insertions(+), 31 deletions(-)
include/linux/ethtool.h +90 -31
@@ -683,22 +683,28 @@ void ethtool_ntuple_flush(struct net_device *dev);bool ethtool_invalid_flags (struct net_device *dev,u32 data,u32 supported);/** -* struct ethtool_ops - Alter and report network device settings -* @get_settings: Get device-specific settings. -* @get_settings is passed an ðtool_cmd to fill in. It returns -* an negative errno or zero. -* @set_settings: Set device-specific settings. -* @set_settings is passed an ðtool_cmd and should attempt to set -* all the settings this device supports. It may return an error value -* if something goes wrong (otherwise 0). -* @get_drvinfo: Report driver information +* struct ethtool_ops - optional netdev operations +* @get_settings: Get various device settings including Ethernet link +* settings. Returns a negative error code or zero. +* @set_settings: Set various device settings including Ethernet link +* settings. Returns a negative error code or zero. +* @get_drvinfo: Report driver/device information. Should only set the +* @driver, @version, @fw_version and @bus_info fields. If not +* implemented, the @driver and @bus_info fields will be filled in +* according to the netdev's parent device. +* @get_regs_len: Get buffer length required for @get_regs * @get_regs: Get device registers * @get_wol: Report whether Wake-on-Lan is enabled -* @set_wol: Turn Wake-on-Lan on or off -* @get_msglevel: Report driver message level +* @set_wol: Turn Wake-on-Lan on or off. Returns a negative error code +* or zero. +* @get_msglevel: Report driver message level. This should be the value +* of the @msg_enable field used by netif logging functions. * @set_msglevel: Set driver message level -* @nway_reset: Restart autonegotiation -* @get_link: Get link status +* @nway_reset: Restart autonegotiation. Returns a negative error code +* or zero. +* @get_link: Report whether physical link is up. Will only be called if +* the netdev is up. Should usually be set to ethtool_op_get_link(), +* which uses netif_carrier_ok(). * @get_eeprom: Read data from the device EEPROM. * Should fill in the magic field. Don't need to check len for zero * or wraparound. Fill in the data argument with the eeprom values
@@ -708,28 +714,81 @@ bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported);* Should validate the magic field. Don't need to check len for zero * or wraparound. Update len to the amount written. Returns an error * or zero. -* @get_coalesce: Get interrupt coalescing parameters -* @set_coalesce: Set interrupt coalescing parameters +* @get_coalesce: Get interrupt coalescing parameters. Returns a negative +* error code or zero. +* @set_coalesce: Set interrupt coalescing parameters. Returns a negative +* error code or zero. * @get_ringparam: Report ring sizes -* @set_ringparam: Set ring sizes +* @set_ringparam: Set ring sizes. Returns a negative error code or zero. * @get_pauseparam: Report pause parameters -* @set_pauseparam: Set pause parameters -* @get_rx_csum: Report whether receive checksums are turned on or off -* @set_rx_csum: Turn receive checksum on or off -* @get_tx_csum: Report whether transmit checksums are turned on or off -* @set_tx_csum: Turn transmit checksums on or off -* @get_sg: Report whether scatter-gather is enabled -* @set_sg: Turn scatter-gather on or off -* @get_tso: Report whether TCP segmentation offload is enabled -* @set_tso: Turn TCP segmentation offload on or off -* @get_ufo: Report whether UDP fragmentation offload is enabled -* @set_ufo: Turn UDP fragmentation offload on or off +* @set_pauseparam: Set pause parameters. Returns a negative error code +* or zero. +* @get_rx_csum: Deprecated in favour of the netdev feature %NETIF_F_RXCSUM. +* Report whether receive checksums are turned on or off. +* @set_rx_csum: Deprecated in favour of the netdev op ndo_set_flags. Turn +* receive checksum on or off. Returns a negative error code or zero. +* @get_tx_csum: Deprecated as redundant. Report whether transmit checksums +* are turned on or off. +* @set_tx_csum: Deprecated in favour of the netdev op ndo_set_flags. Turn +* transmit checksums on or off. Returns a egative error code or zero. +* @get_sg: Deprecated as redundant. Report whether scatter-gather is +* enabled. +* @set_sg: Deprecated in favour of the netdev op ndo_set_flags. Turn +* scatter-gather on or off. Returns a negative error code or zero. +* @get_tso: Deprecated as redundant. Report whether TCP segmentation +* offload is enabled. +* @set_tso: Deprecated in favour of the netdev op ndo_set_flags. Turn TCP +* segmentation offload on or off. Returns a negative error code or zero. * @self_test: Run specified self-tests * @get_strings: Return a set of strings that describe the requested objects -* @phys_id: Identify the device -* @get_stats: Return statistics about the device -* @get_flags: get 32-bit flags bitmap -* @set_flags: set 32-bit flags bitmap +* @phys_id: Identify the physical device, e.g. by flashing an LED +* attached to it until interrupted by a signal or the given time +* (in seconds) elapses. If the given time is zero, use a default +* time limit. Returns a negative error code or zero. Being +* interrupted by a signal is not an error. +* @get_ethtool_stats: Return extended statistics about the device. +* This is only useful if the device maintains statistics not +* included in &struct rtnl_link_stats64. +* @begin: Function to be called before any other operation. Returns a +* negative error code or zero. +* @complete: Function to be called after any other operation except +* @begin. Will be called even if the other operation failed. +* @get_ufo: Deprecated as redundant. Report whether UDP fragmentation +* offload is enabled. +* @set_ufo: Deprecated in favour of the netdev op ndo_set_flags. Turn UDP +* fragmentation offload on or off. Returns a negative error code or zero. +* @get_flags: Deprecated as redundant. Report features included in +* &enum ethtool_flags that are enabled. +* @set_flags: Deprecated in favour of the netdev op ndo_set_flags. Turn +* features included in &enum ethtool_flags on or off. Returns a +* negative error code or zero. +* @get_priv_flags: Report driver-specific feature flags. +* @set_priv_flags: Set driver-specific feature flags. Returns a negative +* error code or zero. +* @get_sset_count: Get number of strings that @get_strings will write. +* @get_rxnfc: Get RX flow classification rules. Returns a negative +* error code or zero. +* @set_rxnfc: Set RX flow classification rules. Returns a negative +* error code or zero. +* @flash_device: Write a firmware image to device's flash memory. +* Returns a negative error code or zero. +* @reset: Reset (part of) the device, as specified by a bitmask of +* flags from &enum ethtool_reset_flags. Returns a negative +* error code or zero. +* @set_rx_ntuple: Set an RX n-tuple rule. Returns a negative error code +* or zero. +* @get_rx_ntuple: Deprecated. +* @get_rxfh_indir: Get the contents of the RX flow hash indirection table. +* Returns a negative error code or zero. +* @set_rxfh_indir: Set the contents of the RX flow hash indirection table. +* Returns a negative error code or zero. +* +* All operations are optional (i.e. the function pointer may be set +* to %NULL) and callers must take this into account. Callers must +* hold the RTNL, except that for @get_drvinfo the caller may or may +* not hold the RTNL. +* +* See the structures used by these operations for further documentation. */ struct ethtool_ops {int (*get_settings)(struct net_device *,struct ethtool_cmd *);
Signature · 8 lines
1.5.4 -- Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
Re: [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops
2011/4/3 Ben Hutchings <[email protected]>:
Quoted 4 lines
Briefly document all operations (except
get_rx_ntuple), including whether they may return an error code and whether they are deprecated. Also mention some things that should be handled by the ethtool core rather than by drivers.
[...]
Quoted 6 lines
+ * @set_pauseparam: Set pause parameters. Returns a negative error code
+ * or zero.
+ * @get_rx_csum: Deprecated in favour of the netdev feature %NETIF_F_RXCSUM.
+ * Report whether receive checksums are turned on or off.
+ * @set_rx_csum: Deprecated in favour of the netdev opndo_set_flags. Turn
+ * receive checksum on or off. Returns a negative error code or zero.
Correct op is ndo_set_features and not ndo_set_flags. This should also refer to hw_features field as that's more likely to be the thing needed as the replacement.
Best Regards,
Michał Mirosław
Re: [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops
Quoted 6 lines · Michał Mirosław
2011/4/3 Ben Hutchings <[email protected]>:
Quoted 4 lines
Briefly document all operations (except
get_rx_ntuple), including whether they may return an error code and whether they are deprecated. Also mention some things that should be handled by the ethtool core rather than by drivers.[...]
Quoted 8 lines
Quoted 6 lines
+ * @set_pauseparam: Set pause parameters. Returns a negative error code
+ * or zero.
+ * @get_rx_csum: Deprecated in favour of the netdev feature %NETIF_F_RXCSUM.
+ * Report whether receive checksums are turned on or off.
+ * @set_rx_csum: Deprecated in favour of the netdev opndo_set_flags. Turn
+ * receive checksum on or off. Returns a negative error code or zero.Correct op is
ndo_set_featuresand notndo_set_flags.
That's what I meant.
Quoted 3 lines
This should also
refer tohw_featuresfield as that's more likely to be the thing needed as the replacement.
Agreed.
Ben.
Signature · 3 lines
Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
PATCH 5/6 ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
In reply to Ben HutchingsThe 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.
--- include/linux/ethtool.h | 30 +++++++++++++++++++++++++++++- net/core/ethtool.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 3 deletions(-)
include/linux/ethtool.h +29 -1
@@ -663,6 +663,22 @@ struct ethtool_rx_ntuple_list {unsigned int count; }; +/** +* enum ethtool_phys_id_state - indicator state for physical identification +* @ETHTOOL_ID_INACTIVE: Physical ID indicator should be deactivated +* @ETHTOOL_ID_ACTIVE: Physical ID indicator should be activated +* @ETHTOOL_ID_ON: LED should be turned on (used iff %ETHTOOL_ID_ACTIVE +* is not supported) +* @ETHTOOL_ID_OFF: LED should be turned off (used iff %ETHTOOL_ID_ACTIVE +* is not supported) +*/ +enum ethtool_phys_id_state { +ETHTOOL_ID_INACTIVE , +ETHTOOL_ID_ACTIVE , +ETHTOOL_ID_ON , +ETHTOOL_ID_OFF +}; +struct net_device ;/* 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);* segmentation offload on or off. Returns a negative error code or zero. * @self_test: Run specified self-tests * @get_strings: Return a set of strings that describe the requested objects -* @phys_id: Identify the physical device, e.g. by flashing an LED +* @set_phys_id: Identify the physical devices, e.g. by flashing an LED +* attached to it. The implementation may update the indicator +* asynchronously or synchronously, but in either case it must return +* quickly. It is initially called with the argument %ETHTOOL_ID_ACTIVE, +* and must either activate asynchronous updates or return -%EINVAL. +* If it returns -%EINVAL then it will be called again at intervals with +* argument %ETHTOOL_ID_ON or %ETHTOOL_ID_OFF and must set the state of +* the indicator accordingly. Finally, it is called with the argument +* %ETHTOOL_ID_INACTIVE and must deactivate the indicator. Returns a +* negative error code or zero. +* @phys_id: Deprecated in favour of @set_phys_id. +* Identify the physical device, e.g. by flashing an LED * attached to it until interrupted by a signal or the given time * (in seconds) elapses. If the given time is zero, use a default * time limit. Returns a negative error code or zero. Being
@@ -827,6 +854,7 @@ struct ethtool_ops {int (*set_tso)(struct net_device *,u32 );void (*self_test)(struct net_device *,struct ethtool_test *,u64 *);void (*get_strings)(struct net_device *,u32 stringset,u8 *); +int (*set_phys_id)(struct net_device *,enum ethtool_phys_id_state );int (*phys_id)(struct net_device *,u32 );void (*get_ethtool_stats)(struct net_device *,struct ethtool_stats *,u64 *);
net/core/ethtool.c +44 -2
64 lines not on this page · raw message
Signature · 8 lines
1.5.4 -- Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
Re: [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
This reimplementation lets us blink LEDs on multiple device at the same time, but that's pretty pointless. The nasty thing is we could try to blink LEDs twice over on the same device, violating the rules that the drivers depend on. So I think I need to add:
On Sun, 2011-04-03 at 20:53 +0100, Ben Hutchings wrote:
[...]
net/core/ethtool.c out: · line 1621
Quoted 3 lines
net/core/ethtool.c +0
-0@@ -1618,14 +1620,54 @@ out:static int ethtool_phys_id (struct net_device *dev,void __user *useraddr) {
static struct net_device *active_dev;
net/core/ethtool.c out: · line 1626
Quoted 6 lines
net/core/ethtool.c +2
-1struct ethtool_value id; +int rc; -if (!dev->ethtool_ops->phys_id) +if (!dev->ethtool_ops->set_phys_id && !dev->ethtool_ops->phys_id)return -EOPNOTSUPP ;
if (active_dev) return -EBUSY;
net/core/ethtool.c out: · line 1638
Quoted 12 lines
net/core/ethtool.c +8
-1if (copy_from_user (&id, useraddr,sizeof (id)))return -EFAULT ; -return dev->ethtool_ops->phys_id (dev, id.data); +if (!dev->ethtool_ops->set_phys_id) +/* Do it the old way */ +return dev->ethtool_ops->phys_id (dev, id.data); + + rc = dev->ethtool_ops->set_phys_id (dev,ETHTOOL_ID_ACTIVE ); +if (rc && rc != -EINVAL ) +return rc; +
active_dev = dev;
Quoted 19 lines
net/core/ethtool.c +19
-0+dev_hold (dev); +rtnl_unlock (); + +if (rc ==0 ) { +/* Driver will handle this itself */ +schedule_timeout_interruptible ( + id.data ? id.data :MAX_SCHEDULE_TIMEOUT ); + }else { +/* Driver expects to be called periodically */ + do { + rtnl_lock(); + rc = dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_ON); + rtnl_unlock(); + if (rc) + break; + schedule_timeout_interruptible(HZ / 2); + + rtnl_lock(); + rc = dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_OFF);
net/core/ethtool.c out: · line 1667
Quoted 10 lines
net/core/ethtool.c +10
-0+rtnl_unlock (); +if (rc) +break ; +schedule_timeout_interruptible (HZ /2 ); + }while (!signal_pending (current) && + (id.data ==0 || --id.data !=0 )); + } + +rtnl_lock (); +dev_put (dev);
active_dev = NULL;
Quoted 5 lines
net/core/ethtool.c +2
-0+ (void )dev->ethtool_ops->set_phys_id (dev,ETHTOOL_ID_INACTIVE ); +return rc; }static int ethtool_get_stats (struct net_device *dev,void __user *useraddr)
Signature · 3 lines
Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
Re: [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
Quoted 5 lines · On Tue, 05 Apr 2011 00:26:31 +0100 Ben Hutchings <[email protected]>…
This reimplementation lets us blink LEDs on multiple device at the same time, but that's pretty pointless. The nasty thing is we could try to blink LEDs twice over on the same device, violating the rules that the drivers depend on. So I think I need to add:
This looks sane, is there a good way to fix the qlge and cxgb4 drivers and get rid of the old interface?
Re: [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
Quoted 11 lines · Stephen Hemminger
Quoted 5 lines · On Tue, 05 Apr 2011 00:26:31 +0100 Ben Hutchings <[email protected]>…
This reimplementation lets us blink LEDs on multiple device at the same time, but that's pretty pointless. The nasty thing is we could try to blink LEDs twice over on the same device, violating the rules that the drivers depend on. So I think I need to add:
This looks sane, is there a good way to fix the qlge and cxgb4 drivers and get rid of the old interface?
Prod the respective maintainers?
(Wow, using device firmware to implement a delay, that's special.)
Ben.
Signature · 3 lines
Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
PATCH 6/6 sfc: Implement ethtool_ops::set_phys_id instead of ethtool_ops::phys_id
In reply to Ben Hutchings--- drivers/net/sfc/ethtool.c | 28 ++++++++++++++++++---------- 1 files changed, 18 insertions(+), 10 deletions(-)
drivers/net/sfc/ethtool.c +18 -10
@@ -178,19 +178,27 @@ static struct efx_ethtool_stat efx_ethtool_stats[] = {*/ /* Identify device by flashing LEDs */ -static int efx_ethtool_phys_id (struct net_device *net_dev,u32 count) +static int efx_ethtool_phys_id (struct net_device *net_dev, +enum ethtool_phys_id_state state) {struct efx_nic *efx =netdev_priv (net_dev); +enum efx_led_mode mode; -do { - efx->type->set_id_led (efx,EFX_LED_ON ); -schedule_timeout_interruptible (HZ /2 ); - - efx->type->set_id_led (efx,EFX_LED_OFF ); -schedule_timeout_interruptible (HZ /2 ); - }while (!signal_pending (current) && --count !=0 ); +switch (state) { +case ETHTOOL_ID_ON : + mode =EFX_LED_ON ; +break ; +case ETHTOOL_ID_OFF : + mode =EFX_LED_OFF ; +break ; +case ETHTOOL_ID_INACTIVE : + mode =EFX_LED_DEFAULT ; +break ; +default : +return -EINVAL ; + } - efx->type->set_id_led (efx,EFX_LED_DEFAULT ); + efx->type->set_id_led (efx, mode);return 0 ; }
@@ -1007,7 +1015,7 @@ const struct ethtool_ops efx_ethtool_ops = { .get_sset_count = efx_ethtool_get_sset_count, .self_test = efx_ethtool_self_test, .get_strings = efx_ethtool_get_strings, - .phys_id = efx_ethtool_phys_id, + .set_phys_id = efx_ethtool_phys_id, .get_ethtool_stats = efx_ethtool_get_stats, .get_wol = efx_ethtool_get_wol, .set_wol = efx_ethtool_set_wol,
Signature · 7 lines
1.5.4 -- Ben Hutchings, Senior Software Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
David Miller
maintainerFrom: Ben Hutchings <[email protected]>
Date: Sun, 03 Apr 2011 20:44:49 +0100
Quoted 6 lines
The following changes since commit
9b12c75bf4d58dd85c987ee7b6a4356fdc7c1222:
David S. Miller (1):
net: Order ports in same order as addresses in flow objects.are available in the git repository at:
Quoted 7 lines
git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-next-2.6.gitmaster1. Implement of generic features interface in sfc.
2. Updateethtool_opsdocumentation.
3. ReimplementETHTOOL_PHYS_IDas dicussed, dropping the RTNL lock.Please allow some time for others to review before pulling.
Ok, it seems there has been some feedback and you'll need to respin these changes.