Browse Source

Merge branch 'net-sfp-small-improvements'

Antoine Tenart says:

====================
net: sfp: small improvements

A small series of patches improving the SFP support by adding a warning
when no Tx disable pin is available, and making the i2c-bus property
mandatory.

Thanks!
Antoine

Since v1:
  - Removed the patch fixing the sfp driver when no i2c bus was described.
  - Made two new patches to make the i2c-bus property mandatory for sfp modules.

Since the phylink series:
  - s/-EOPNOTSUPP/-ENODEV/ in patch 1/2.
  - I added the acked-by tag in patch 2/2.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 7 years ago
parent
commit
e89e59c08d
2 changed files with 26 additions and 15 deletions
  1. 2 2
      Documentation/devicetree/bindings/net/sff,sfp.txt
  2. 24 13
      drivers/net/phy/sfp.c

+ 2 - 2
Documentation/devicetree/bindings/net/sff,sfp.txt

@@ -7,11 +7,11 @@ Required properties:
   "sff,sfp" for SFP modules
   "sff,sfp" for SFP modules
   "sff,sff" for soldered down SFF modules
   "sff,sff" for soldered down SFF modules
 
 
-Optional Properties:
-
 - i2c-bus : phandle of an I2C bus controller for the SFP two wire serial
 - i2c-bus : phandle of an I2C bus controller for the SFP two wire serial
   interface
   interface
 
 
+Optional Properties:
+
 - mod-def0-gpios : GPIO phandle and a specifier of the MOD-DEF0 (AKA Mod_ABS)
 - mod-def0-gpios : GPIO phandle and a specifier of the MOD-DEF0 (AKA Mod_ABS)
   module presence input gpio signal, active (module absent) high. Must
   module presence input gpio signal, active (module absent) high. Must
   not be present for SFF modules
   not be present for SFF modules

+ 24 - 13
drivers/net/phy/sfp.c

@@ -976,6 +976,7 @@ static int sfp_probe(struct platform_device *pdev)
 	if (pdev->dev.of_node) {
 	if (pdev->dev.of_node) {
 		struct device_node *node = pdev->dev.of_node;
 		struct device_node *node = pdev->dev.of_node;
 		const struct of_device_id *id;
 		const struct of_device_id *id;
+		struct i2c_adapter *i2c;
 		struct device_node *np;
 		struct device_node *np;
 
 
 		id = of_match_node(sfp_of_match, node);
 		id = of_match_node(sfp_of_match, node);
@@ -985,19 +986,20 @@ static int sfp_probe(struct platform_device *pdev)
 		sff = sfp->type = id->data;
 		sff = sfp->type = id->data;
 
 
 		np = of_parse_phandle(node, "i2c-bus", 0);
 		np = of_parse_phandle(node, "i2c-bus", 0);
-		if (np) {
-			struct i2c_adapter *i2c;
-
-			i2c = of_find_i2c_adapter_by_node(np);
-			of_node_put(np);
-			if (!i2c)
-				return -EPROBE_DEFER;
-
-			err = sfp_i2c_configure(sfp, i2c);
-			if (err < 0) {
-				i2c_put_adapter(i2c);
-				return err;
-			}
+		if (!np) {
+			dev_err(sfp->dev, "missing 'i2c-bus' property\n");
+			return -ENODEV;
+		}
+
+		i2c = of_find_i2c_adapter_by_node(np);
+		of_node_put(np);
+		if (!i2c)
+			return -EPROBE_DEFER;
+
+		err = sfp_i2c_configure(sfp, i2c);
+		if (err < 0) {
+			i2c_put_adapter(i2c);
+			return err;
 		}
 		}
 	}
 	}
 
 
@@ -1065,6 +1067,15 @@ static int sfp_probe(struct platform_device *pdev)
 	if (poll)
 	if (poll)
 		mod_delayed_work(system_wq, &sfp->poll, poll_jiffies);
 		mod_delayed_work(system_wq, &sfp->poll, poll_jiffies);
 
 
+	/* We could have an issue in cases no Tx disable pin is available or
+	 * wired as modules using a laser as their light source will continue to
+	 * be active when the fiber is removed. This could be a safety issue and
+	 * we should at least warn the user about that.
+	 */
+	if (!sfp->gpio[GPIO_TX_DISABLE])
+		dev_warn(sfp->dev,
+			 "No tx_disable pin: SFP modules will always be emitting.\n");
+
 	return 0;
 	return 0;
 }
 }