svn commit: r318014 - head/sys/dev/cxgbe

Navdeep Parhar np at FreeBSD.org
Tue May 9 08:08:30 UTC 2017


Author: np
Date: Tue May  9 08:08:28 2017
New Revision: 318014
URL: https://svnweb.freebsd.org/changeset/base/318014

Log:
  cxgbe(4): Fixes related to the knob that controls link autonegotiation.
  
  - Do not leak the adapter lock in sysctl_autoneg.
  - Accept only 0 or 1 as valid settings for autonegotiation.
  - A fixed speed must be requested by the driver when autonegotiation is
    disabled otherwise the firmware will reject the l1cfg command.  Use
    the top speed supported by the port for now.
  
  MFC after:	3 days
  Sponsored by:	Chelsio Communications

Modified:
  head/sys/dev/cxgbe/adapter.h
  head/sys/dev/cxgbe/t4_main.c

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h	Tue May  9 05:32:35 2017	(r318013)
+++ head/sys/dev/cxgbe/adapter.h	Tue May  9 08:08:28 2017	(r318014)
@@ -1086,6 +1086,24 @@ port_top_speed(const struct port_info *p
 }
 
 static inline int
+port_top_speed_raw(const struct port_info *pi)
+{
+
+	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_100G)
+		return (FW_PORT_CAP_SPEED_100G);
+	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_40G)
+		return (FW_PORT_CAP_SPEED_40G);
+	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_25G)
+		return (FW_PORT_CAP_SPEED_25G);
+	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_10G)
+		return (FW_PORT_CAP_SPEED_10G);
+	if (pi->link_cfg.supported & FW_PORT_CAP_SPEED_1G)
+		return (FW_PORT_CAP_SPEED_1G);
+
+	return (0);
+}
+
+static inline int
 tx_resume_threshold(struct sge_eq *eq)
 {
 

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c	Tue May  9 05:32:35 2017	(r318013)
+++ head/sys/dev/cxgbe/t4_main.c	Tue May  9 08:08:28 2017	(r318014)
@@ -995,6 +995,7 @@ t4_attach(device_t dev)
 			lc->autoneg = t4_autoneg ? AUTONEG_ENABLE :
 			    AUTONEG_DISABLE;
 		}
+		lc->requested_speed = port_top_speed_raw(pi);
 
 		rc = -t4_link_l1cfg(sc, sc->mbox, pi->tx_chan, lc);
 		if (rc != 0) {
@@ -5883,7 +5884,12 @@ sysctl_autoneg(SYSCTL_HANDLER_ARGS)
 	if ((lc->supported & FW_PORT_CAP_ANEG) == 0)
 		return (ENOTSUP);
 
-	val = val ? AUTONEG_ENABLE : AUTONEG_DISABLE;
+	if (val == 0)
+		val = AUTONEG_DISABLE;
+	else if (val == 1)
+		val = AUTONEG_ENABLE;
+	else
+		return (EINVAL);
 	if (lc->autoneg == val)
 		return (0);	/* no change */
 
@@ -5896,6 +5902,7 @@ sysctl_autoneg(SYSCTL_HANDLER_ARGS)
 	rc = -t4_link_l1cfg(sc, sc->mbox, pi->tx_chan, lc);
 	if (rc != 0)
 		lc->autoneg = old;
+	end_synchronized_op(sc, 0);
 	return (rc);
 }
 


More information about the svn-src-all mailing list