netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* pull request: sfc-next-2.6 2011-04-03
@ 2011-04-03 19:44 Ben Hutchings
  2011-04-03 19:50 ` [PATCH net-next-2.6 1/6] sfc: Move test of rx_checksum_enabled from nic.c to rx.c Ben Hutchings
                   ` (6 more replies)
  0 siblings, 7 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 19:44 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, linux-net-drivers

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(-)

-- 
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.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH net-next-2.6 1/6] sfc: Move test of rx_checksum_enabled from nic.c to rx.c
  2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
@ 2011-04-03 19:50 ` Ben Hutchings
  2011-04-03 19:51 ` [PATCH net-next-2.6 2/6] sfc: Implement generic features interface Ben Hutchings
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 19:50 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, linux-net-drivers

This is preparation for using the generic netdev features interface,
and should have no effect in itself.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
 drivers/net/sfc/nic.c |    6 ++----
 drivers/net/sfc/rx.c  |    3 +++
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/sfc/nic.c b/drivers/net/sfc/nic.c
index e839661..2594f39 100644
--- a/drivers/net/sfc/nic.c
+++ b/drivers/net/sfc/nic.c
@@ -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;
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c
index c0fdb59..fb402c5 100644
--- a/drivers/net/sfc/rx.c
+++ b/drivers/net/sfc/rx.c
@@ -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;
-- 
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.


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next-2.6 2/6] sfc: Implement generic features interface
  2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
  2011-04-03 19:50 ` [PATCH net-next-2.6 1/6] sfc: Move test of rx_checksum_enabled from nic.c to rx.c Ben Hutchings
@ 2011-04-03 19:51 ` Ben Hutchings
  2011-04-03 20:13   ` Michał Mirosław
  2011-04-03 20:50   ` Michał Mirosław
  2011-04-03 19:51 ` [PATCH net-next-2.6 3/6] ethtool: Convert struct ethtool_ops comment to kernel-doc format Ben Hutchings
                   ` (4 subsequent siblings)
  6 siblings, 2 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 19:51 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, linux-net-drivers, Michał Mirosław

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
 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(-)

diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c
index d890679..98da250 100644
--- a/drivers/net/sfc/efx.c
+++ b/drivers/net/sfc/efx.c
@@ -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);
diff --git a/drivers/net/sfc/ethtool.c b/drivers/net/sfc/ethtool.c
index 807178e..0d55439 100644
--- a/drivers/net/sfc/ethtool.c
+++ b/drivers/net/sfc/ethtool.c
@@ -518,72 +518,6 @@ static void efx_ethtool_get_stats(struct net_device *net_dev,
 	}
 }
 
-static int efx_ethtool_set_tso(struct net_device *net_dev, u32 enable)
-{
-	struct efx_nic *efx __attribute__ ((unused)) = netdev_priv(net_dev);
-	u32 features;
-
-	features = NETIF_F_TSO;
-	if (efx->type->offload_features & NETIF_F_V6_CSUM)
-		features |= NETIF_F_TSO6;
-
-	if (enable)
-		net_dev->features |= features;
-	else
-		net_dev->features &= ~features;
-
-	return 0;
-}
-
-static int efx_ethtool_set_tx_csum(struct net_device *net_dev, u32 enable)
-{
-	struct efx_nic *efx = netdev_priv(net_dev);
-	u32 features = efx->type->offload_features & NETIF_F_ALL_CSUM;
-
-	if (enable)
-		net_dev->features |= features;
-	else
-		net_dev->features &= ~features;
-
-	return 0;
-}
-
-static int efx_ethtool_set_rx_csum(struct net_device *net_dev, u32 enable)
-{
-	struct efx_nic *efx = netdev_priv(net_dev);
-
-	/* No way to stop the hardware doing the checks; we just
-	 * ignore the result.
-	 */
-	efx->rx_checksum_enabled = !!enable;
-
-	return 0;
-}
-
-static u32 efx_ethtool_get_rx_csum(struct net_device *net_dev)
-{
-	struct efx_nic *efx = netdev_priv(net_dev);
-
-	return efx->rx_checksum_enabled;
-}
-
-static int efx_ethtool_set_flags(struct net_device *net_dev, u32 data)
-{
-	struct efx_nic *efx = netdev_priv(net_dev);
-	u32 supported = (efx->type->offload_features &
-			 (ETH_FLAG_RXHASH | ETH_FLAG_NTUPLE));
-	int rc;
-
-	rc = ethtool_op_set_flags(net_dev, data, supported);
-	if (rc)
-		return rc;
-
-	if (!(data & ETH_FLAG_NTUPLE))
-		efx_filter_clear_rx(efx, EFX_FILTER_PRI_MANUAL);
-
-	return 0;
-}
-
 static void efx_ethtool_self_test(struct net_device *net_dev,
 				  struct ethtool_test *test, u64 *data)
 {
@@ -1070,18 +1004,6 @@ const struct ethtool_ops efx_ethtool_ops = {
 	.set_ringparam		= efx_ethtool_set_ringparam,
 	.get_pauseparam         = efx_ethtool_get_pauseparam,
 	.set_pauseparam         = efx_ethtool_set_pauseparam,
-	.get_rx_csum		= efx_ethtool_get_rx_csum,
-	.set_rx_csum		= efx_ethtool_set_rx_csum,
-	.get_tx_csum		= ethtool_op_get_tx_csum,
-	/* Need to enable/disable IPv6 too */
-	.set_tx_csum		= efx_ethtool_set_tx_csum,
-	.get_sg			= ethtool_op_get_sg,
-	.set_sg			= ethtool_op_set_sg,
-	.get_tso		= ethtool_op_get_tso,
-	/* Need to enable/disable TSO-IPv6 too */
-	.set_tso		= efx_ethtool_set_tso,
-	.get_flags		= ethtool_op_get_flags,
-	.set_flags		= efx_ethtool_set_flags,
 	.get_sset_count		= efx_ethtool_get_sset_count,
 	.self_test		= efx_ethtool_self_test,
 	.get_strings		= efx_ethtool_get_strings,
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h
index 215d5c5..f0f8ca5 100644
--- a/drivers/net/sfc/net_driver.h
+++ b/drivers/net/sfc/net_driver.h
@@ -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;
 
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c
index fb402c5..b7dc891 100644
--- a/drivers/net/sfc/rx.c
+++ b/drivers/net/sfc/rx.c
@@ -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)) {
-- 
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.


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next-2.6 3/6] ethtool: Convert struct ethtool_ops comment to kernel-doc format
  2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
  2011-04-03 19:50 ` [PATCH net-next-2.6 1/6] sfc: Move test of rx_checksum_enabled from nic.c to rx.c Ben Hutchings
  2011-04-03 19:51 ` [PATCH net-next-2.6 2/6] sfc: Implement generic features interface Ben Hutchings
@ 2011-04-03 19:51 ` Ben Hutchings
  2011-04-03 19:52 ` [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops Ben Hutchings
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 19:51 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, linux-net-drivers

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
 include/linux/ethtool.h |   80 ++++++++++++++++++++--------------------------
 1 files changed, 35 insertions(+), 45 deletions(-)

diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index c8fcbdd..ab12f84 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -683,63 +683,53 @@ void ethtool_ntuple_flush(struct net_device *dev);
 bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported);
 
 /**
- * &ethtool_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 &ethtool_cmd to fill in.  It returns
  *	an negative errno or zero.
- *
- * set_settings:
+ * @set_settings: Set device-specific settings.
  *	@set_settings is passed an &ethtool_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 *);
-- 
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.


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops
  2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
                   ` (2 preceding siblings ...)
  2011-04-03 19:51 ` [PATCH net-next-2.6 3/6] ethtool: Convert struct ethtool_ops comment to kernel-doc format Ben Hutchings
@ 2011-04-03 19:52 ` Ben Hutchings
  2011-04-03 21:25   ` Michał Mirosław
  2011-04-03 19:53 ` [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL Ben Hutchings
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 19:52 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, linux-net-drivers

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.

Briefly document general requirements for callers.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
 include/linux/ethtool.h |  121 +++++++++++++++++++++++++++++++++++------------
 1 files changed, 90 insertions(+), 31 deletions(-)

diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index ab12f84..6da626e 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -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 &ethtool_cmd to fill in.  It returns
- *	an negative errno or zero.
- * @set_settings: Set device-specific settings.
- *	@set_settings is passed an &ethtool_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 *);
-- 
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.


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
  2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
                   ` (3 preceding siblings ...)
  2011-04-03 19:52 ` [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops Ben Hutchings
@ 2011-04-03 19:53 ` Ben Hutchings
  2011-04-04 23:26   ` Ben Hutchings
  2011-04-03 19:55 ` [PATCH net-next-2.6 6/6] sfc: Implement ethtool_ops::set_phys_id instead of ethtool_ops::phys_id Ben Hutchings
  2011-04-04  0:50 ` pull request: sfc-next-2.6 2011-04-03 David Miller
  6 siblings, 1 reply; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 19:53 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, linux-net-drivers, Stephen Hemminger,
	Michał Mirosław

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>
---
 include/linux/ethtool.h |   30 +++++++++++++++++++++++++++++-
 net/core/ethtool.c      |   46 ++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h
index 6da626e..ed39d90 100644
--- a/include/linux/ethtool.h
+++ b/include/linux/ethtool.h
@@ -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 *);
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 74ead9e..d1c729d 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -21,6 +21,8 @@
 #include <linux/uaccess.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
+#include <linux/rtnetlink.h>
+#include <linux/sched.h>
 
 /*
  * Some useful ethtool_ops methods that're device independent.
@@ -1618,14 +1620,54 @@ out:
 static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
 {
 	struct 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 (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;
+
+	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);
+			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);
+
+	(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)
-- 
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.


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next-2.6 6/6] sfc: Implement ethtool_ops::set_phys_id instead of ethtool_ops::phys_id
  2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
                   ` (4 preceding siblings ...)
  2011-04-03 19:53 ` [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL Ben Hutchings
@ 2011-04-03 19:55 ` Ben Hutchings
  2011-04-04  0:50 ` pull request: sfc-next-2.6 2011-04-03 David Miller
  6 siblings, 0 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 19:55 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, linux-net-drivers, Stephen Hemminger,
	Michał Mirosław

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
 drivers/net/sfc/ethtool.c |   28 ++++++++++++++++++----------
 1 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/drivers/net/sfc/ethtool.c b/drivers/net/sfc/ethtool.c
index 0d55439..644f7c1 100644
--- a/drivers/net/sfc/ethtool.c
+++ b/drivers/net/sfc/ethtool.c
@@ -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,
-- 
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.


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 2/6] sfc: Implement generic features interface
  2011-04-03 19:51 ` [PATCH net-next-2.6 2/6] sfc: Implement generic features interface Ben Hutchings
@ 2011-04-03 20:13   ` Michał Mirosław
  2011-04-03 20:27     ` Ben Hutchings
  2011-04-03 20:50   ` Michał Mirosław
  1 sibling, 1 reply; 16+ messages in thread
From: Michał Mirosław @ 2011-04-03 20:13 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: David Miller, netdev, linux-net-drivers

On Sun, Apr 03, 2011 at 08:51:21PM +0100, Ben Hutchings wrote:
> Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
> ---
>  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

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 2/6] sfc: Implement generic features interface
  2011-04-03 20:13   ` Michał Mirosław
@ 2011-04-03 20:27     ` Ben Hutchings
  0 siblings, 0 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 20:27 UTC (permalink / raw)
  To: Michał Mirosław; +Cc: David Miller, netdev, linux-net-drivers

On Sun, 2011-04-03 at 22:13 +0200, Michał Mirosław wrote:
> On Sun, Apr 03, 2011 at 08:51:21PM +0100, Ben Hutchings wrote:
> > Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
> > ---
> >  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?

Well spotted.  It's not intentional.

Ben.

-- 
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.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 2/6] sfc: Implement generic features interface
  2011-04-03 19:51 ` [PATCH net-next-2.6 2/6] sfc: Implement generic features interface Ben Hutchings
  2011-04-03 20:13   ` Michał Mirosław
@ 2011-04-03 20:50   ` Michał Mirosław
  1 sibling, 0 replies; 16+ messages in thread
From: Michał Mirosław @ 2011-04-03 20:50 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: David Miller, netdev, linux-net-drivers

On Sun, Apr 03, 2011 at 08:51:21PM +0100, Ben Hutchings wrote:
> Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
> ---
>  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:

> diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c
> index d890679..98da250 100644
> --- a/drivers/net/sfc/efx.c
> +++ b/drivers/net/sfc/efx.c
[...]
> @@ -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

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops
  2011-04-03 19:52 ` [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops Ben Hutchings
@ 2011-04-03 21:25   ` Michał Mirosław
  2011-04-03 21:36     ` Ben Hutchings
  0 siblings, 1 reply; 16+ messages in thread
From: Michał Mirosław @ 2011-04-03 21:25 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: David Miller, netdev, linux-net-drivers

2011/4/3 Ben Hutchings <bhutchings@solarflare.com>:
> 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.
[...]
> + * @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.

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

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops
  2011-04-03 21:25   ` Michał Mirosław
@ 2011-04-03 21:36     ` Ben Hutchings
  0 siblings, 0 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-03 21:36 UTC (permalink / raw)
  To: Michał Mirosław; +Cc: David Miller, netdev, linux-net-drivers

On Sun, 2011-04-03 at 23:25 +0200, Michał Mirosław wrote:
> 2011/4/3 Ben Hutchings <bhutchings@solarflare.com>:
> > 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.
> [...]
> > + * @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.
> 
> Correct op is ndo_set_features and not ndo_set_flags.

That's what I meant.

> This should also
> refer to hw_features field as that's more likely to be the thing
> needed as the replacement.

Agreed.

Ben.

-- 
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.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: pull request: sfc-next-2.6 2011-04-03
  2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
                   ` (5 preceding siblings ...)
  2011-04-03 19:55 ` [PATCH net-next-2.6 6/6] sfc: Implement ethtool_ops::set_phys_id instead of ethtool_ops::phys_id Ben Hutchings
@ 2011-04-04  0:50 ` David Miller
  6 siblings, 0 replies; 16+ messages in thread
From: David Miller @ 2011-04-04  0:50 UTC (permalink / raw)
  To: bhutchings; +Cc: netdev, linux-net-drivers

From: Ben Hutchings <bhutchings@solarflare.com>
Date: Sun, 03 Apr 2011 20:44:49 +0100

> 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.

Ok, it seems there has been some feedback and you'll need to respin
these changes.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
  2011-04-03 19:53 ` [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL Ben Hutchings
@ 2011-04-04 23:26   ` Ben Hutchings
  2011-04-05  1:01     ` Stephen Hemminger
  0 siblings, 1 reply; 16+ messages in thread
From: Ben Hutchings @ 2011-04-04 23:26 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, linux-net-drivers, Stephen Hemminger,
	Michał Mirosław

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:
[...]
> @@ -1618,14 +1620,54 @@ out:
>  static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
>  {
	static struct net_device *active_dev;

>  	struct 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;

>  	if (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;

> +	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);
> +			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;

> +	(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)

-- 
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.


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
  2011-04-04 23:26   ` Ben Hutchings
@ 2011-04-05  1:01     ` Stephen Hemminger
  2011-04-05 20:21       ` Ben Hutchings
  0 siblings, 1 reply; 16+ messages in thread
From: Stephen Hemminger @ 2011-04-05  1:01 UTC (permalink / raw)
  To: Ben Hutchings
  Cc: David Miller, netdev, linux-net-drivers,
	Michał Mirosław

On Tue, 05 Apr 2011 00:26:31 +0100
Ben Hutchings <bhutchings@solarflare.com> wrote:

> 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?

-- 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL
  2011-04-05  1:01     ` Stephen Hemminger
@ 2011-04-05 20:21       ` Ben Hutchings
  0 siblings, 0 replies; 16+ messages in thread
From: Ben Hutchings @ 2011-04-05 20:21 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: David Miller, netdev, linux-net-drivers,
	Michał Mirosław

On Mon, 2011-04-04 at 18:01 -0700, Stephen Hemminger wrote:
> On Tue, 05 Apr 2011 00:26:31 +0100
> Ben Hutchings <bhutchings@solarflare.com> wrote:
> 
> > 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.

-- 
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.


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2011-04-05 20:21 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-03 19:44 pull request: sfc-next-2.6 2011-04-03 Ben Hutchings
2011-04-03 19:50 ` [PATCH net-next-2.6 1/6] sfc: Move test of rx_checksum_enabled from nic.c to rx.c Ben Hutchings
2011-04-03 19:51 ` [PATCH net-next-2.6 2/6] sfc: Implement generic features interface Ben Hutchings
2011-04-03 20:13   ` Michał Mirosław
2011-04-03 20:27     ` Ben Hutchings
2011-04-03 20:50   ` Michał Mirosław
2011-04-03 19:51 ` [PATCH net-next-2.6 3/6] ethtool: Convert struct ethtool_ops comment to kernel-doc format Ben Hutchings
2011-04-03 19:52 ` [PATCH net-next-2.6 4/6] ethtool: Fill out and update comment for struct ethtool_ops Ben Hutchings
2011-04-03 21:25   ` Michał Mirosław
2011-04-03 21:36     ` Ben Hutchings
2011-04-03 19:53 ` [PATCH net-next-2.6 5/6] ethtool: Change ETHTOOL_PHYS_ID implementation to allow dropping RTNL Ben Hutchings
2011-04-04 23:26   ` Ben Hutchings
2011-04-05  1:01     ` Stephen Hemminger
2011-04-05 20:21       ` Ben Hutchings
2011-04-03 19:55 ` [PATCH net-next-2.6 6/6] sfc: Implement ethtool_ops::set_phys_id instead of ethtool_ops::phys_id Ben Hutchings
2011-04-04  0:50 ` pull request: sfc-next-2.6 2011-04-03 David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).