svn commit: r298771 - in head/sys/dev/mlx5: . mlx5_core mlx5_en

Hans Petter Selasky hselasky at FreeBSD.org
Fri Apr 29 11:00:13 UTC 2016


Author: hselasky
Date: Fri Apr 29 11:00:12 2016
New Revision: 298771
URL: https://svnweb.freebsd.org/changeset/base/298771

Log:
  Add function to detect the presence of a port module and use this
  function to error out early when no port module is present and doing
  eeprom access. This also prevents error codes from filling up in
  dmesg.
  
  Sponsored by:	Mellanox Technologies
  Tested by:	Netflix
  MFC after:	1 week

Modified:
  head/sys/dev/mlx5/driver.h
  head/sys/dev/mlx5/mlx5_core/mlx5_eq.c
  head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c

Modified: head/sys/dev/mlx5/driver.h
==============================================================================
--- head/sys/dev/mlx5/driver.h	Fri Apr 29 08:02:31 2016	(r298770)
+++ head/sys/dev/mlx5/driver.h	Fri Apr 29 11:00:12 2016	(r298771)
@@ -542,6 +542,7 @@ struct mlx5_core_dev {
 	atomic_t		num_qps;
 	u32			issi;
 	struct mlx5_special_contexts special_contexts;
+	unsigned int module_status[MLX5_MAX_PORTS];
 };
 
 enum {
@@ -835,6 +836,7 @@ int mlx5_set_port_mtu(struct mlx5_core_d
 int mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu);
 int mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu);
 
+unsigned int mlx5_query_module_status(struct mlx5_core_dev *dev, int module_num);
 int mlx5_query_module_num(struct mlx5_core_dev *dev, int *module_num);
 int mlx5_query_eeprom(struct mlx5_core_dev *dev, int i2c_addr, int page_num,
 		      int device_addr, int size, int module_num, u32 *data,

Modified: head/sys/dev/mlx5/mlx5_core/mlx5_eq.c
==============================================================================
--- head/sys/dev/mlx5/mlx5_core/mlx5_eq.c	Fri Apr 29 08:02:31 2016	(r298770)
+++ head/sys/dev/mlx5/mlx5_core/mlx5_eq.c	Fri Apr 29 11:00:12 2016	(r298771)
@@ -579,6 +579,13 @@ static const char *mlx5_port_module_even
 	}
 }
 
+unsigned int mlx5_query_module_status(struct mlx5_core_dev *dev, int module_num)
+{
+	if (module_num < 0 || module_num >= MLX5_MAX_PORTS)
+		return 0;		/* undefined */
+	return dev->module_status[module_num];
+}
+
 static void mlx5_port_module_event(struct mlx5_core_dev *dev,
 				   struct mlx5_eqe *eqe)
 {
@@ -612,5 +619,8 @@ static void mlx5_port_module_event(struc
 	default:
 		device_printf((&pdev->dev)->bsddev, "INFO: ""Module %u, unknown status", module_num);
 	}
+	/* store module status */
+	if (module_num < MLX5_MAX_PORTS)
+		dev->module_status[module_num] = module_status;
 }
 

Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
==============================================================================
--- head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c	Fri Apr 29 08:02:31 2016	(r298770)
+++ head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c	Fri Apr 29 11:00:12 2016	(r298771)
@@ -2561,7 +2561,12 @@ out:
 			    "reading is not supported\n");
 			goto err_i2c;
 		}
-
+		/* Check if module is present before doing an access */
+		if (mlx5_query_module_status(priv->mdev, module_num) !=
+		    MLX5_MODULE_STATUS_PLUGGED) {
+			error = EINVAL;
+			goto err_i2c;
+		}
 		/*
 		 * Currently 0XA0 and 0xA2 are the only addresses permitted.
 		 * The internal conversion is as follows:


More information about the svn-src-head mailing list