[ofw] RE: patch: [MLX4_BUS] support ModStatConfg command to query if port is enabled or disabled.
Tzachi Dar
tzachid at mellanox.co.il
Tue Nov 17 04:58:59 PST 2009
Applied on 2575.
Thanks
Tzachi
________________________________
From: Tzachi Dar
Sent: Sunday, November 15, 2009 8:03 PM
To: ofw at lists.openfabrics.org
Cc: Windows Design
Subject: patch: [MLX4_BUS] support ModStatConfg command to query
if port is enabled or disabled.
signed off by: urih
Index: Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.c
===================================================================
--- Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.c (revision
4795)
+++ Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.c (revision
4796)
@@ -626,6 +626,54 @@
return err;
}
+
+static int
+query_port_state(struct mlx4_dev *dev, u8 port)
+{
+ int err = 0;
+ u32 input_modifier = 0;
+ u64 out_param;
+
+#define MOD_STAT_OPMOD_QUERY_INLINE 0x3
+#define MOD_STAT_OFFSET_PORT_EN 0x8
+
+ input_modifier = (1 << 28) | (port << 8) |
MOD_STAT_OFFSET_PORT_EN;
+
+ err = mlx4_cmd_imm(dev, 0, &out_param, input_modifier,
+ MOD_STAT_OPMOD_QUERY_INLINE,
+ MLX4_CMD_QUERY_STAT_CFG,
+ MLX4_CMD_TIME_CLASS_A);
+ if (err) {
+ return err;
+ }
+
+ dev->caps.port_state[port] = (((out_param >> 20) & 1) ?
MLX4_PORT_ENABLED : MLX4_PORT_DISABLED);
+ return 0;
+}
+
+int mlx4_port_state(struct mlx4_dev *dev)
+{
+ u8 i = 0;
+ int err = 0;
+
+
+ for (i = 1; i <= MLX4_MAX_PORTS; ++i)
+ {
+ dev->caps.port_state[i] = MLX4_PORT_ENABLED;
+ }
+
+ for (i = 1; i <= MLX4_MAX_PORTS; ++i)
+ {
+ err = query_port_state(dev, i);
+ if (err)
+ {
+ return err;
+ }
+ }
+
+ return 0;
+}
+
static void get_board_id(u8 *vsd, char *board_id)
{
int i;
Index: Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.h
===================================================================
--- Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.h (revision
4795)
+++ Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.h (revision
4796)
@@ -160,6 +160,7 @@
int mlx4_UNMAP_FA(struct mlx4_dev *dev);
int mlx4_RUN_FW(struct mlx4_dev *dev);
int mlx4_QUERY_FW(struct mlx4_dev *dev);
+int mlx4_port_state(struct mlx4_dev *dev);
int mlx4_QUERY_ADAPTER(struct mlx4_dev *dev, struct
mlx4_adapter *adapter);
int mlx4_INIT_HCA(struct mlx4_dev *dev, struct
mlx4_init_hca_param *param);
int mlx4_CLOSE_HCA(struct mlx4_dev *dev, int panic);
Index: Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/main.c
===================================================================
--- Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/main.c (revision
4795)
+++ Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/main.c (revision
4796)
@@ -146,12 +146,28 @@
BOOLEAN mlx4_is_eth_port(struct mlx4_dev *dev, int port_number)
{
- if (dev->caps.port_type[port_number+1] == MLX4_PORT_TYPE_ETH)
{
+ if (dev->caps.port_type[port_number] == MLX4_PORT_TYPE_ETH) {
return TRUE;
}
return FALSE;
}
+BOOLEAN mlx4_is_ib_port(struct mlx4_dev *dev, int port_number)
+{
+ if (dev->caps.port_type[port_number] == MLX4_PORT_TYPE_IB){
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOLEAN mlx4_is_enabled_port(struct mlx4_dev *dev, int
port_number)
+{
+ if (dev->caps.port_state[port_number] == MLX4_PORT_ENABLED) {
+ return TRUE;
+ }
+ return FALSE;
+}
+
static int mlx4_dev_cap(struct mlx4_dev *dev, struct
mlx4_dev_cap *dev_cap)
{
int err;
@@ -671,6 +687,12 @@
goto err_stop_fw;
}
+ //
+ // Initilize the port state. It's a new command that is
supported only in FW 2.6.1280.
+ //If running on earlier FW version the command can fail.
Ignore the error code returned
+ //
+ mlx4_port_state(dev);
+
process_mod_param_profile();
profile = default_profile;
Index: Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/mlx4.h
===================================================================
--- Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision
4795)
+++ Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision
4796)
@@ -65,6 +65,11 @@
MLX4_PORT_TYPE_ETH = 1 << 1,
};
+enum mlx4_port_state {
+ MLX4_PORT_ENABLED = 1 << 0,
+ MLX4_PORT_DISABLED = 1 << 1,
+};
+
#define MAX_HCA_CARDS 8
#pragma warning(disable:4201) // nameless struct/union
@@ -387,6 +392,8 @@
void mlx4_net_init();
BOOLEAN mlx4_is_eth_port(struct mlx4_dev *dev, int
port_number);
+BOOLEAN mlx4_is_ib_port(struct mlx4_dev *dev, int port_number);
+BOOLEAN mlx4_is_enabled_port(struct mlx4_dev *dev, int
port_number);
int mlx4_count_ib_ports(struct mlx4_dev *dev);
struct mlx4_dev_cap;
Index: Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/device.h
===================================================================
--- Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/device.h (revision
4795)
+++ Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/device.h (revision
4796)
@@ -208,7 +208,8 @@
int log_num_prios;
int num_fc_exch;
enum mlx4_port_type port_type[MLX4_MAX_PORTS + 1];
- int reserved_fexch_mpts_base;
+ enum mlx4_port_state port_state[MLX4_MAX_PORTS + 1];
+ int reserved_fexch_mpts_base;
int total_reserved_qps;
};
Index: Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/cmd.h
===================================================================
--- Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/cmd.h (revision
4795)
+++ Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/cmd.h (revision
4796)
@@ -114,6 +114,7 @@
/* miscellaneous commands */
MLX4_CMD_DIAG_RPRT = 0x30,
MLX4_CMD_NOP = 0x31,
+ MLX4_CMD_QUERY_STAT_CFG = 0x34,
/* debug commands */
MLX4_CMD_QUERY_DEBUG_MSG = 0x2a,
Index: Q:/projinf3/trunk/hw/mlx4/kernel/bus/drv/drv.c
===================================================================
--- Q:/projinf3/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision
4795)
+++ Q:/projinf3/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision
4796)
@@ -221,7 +221,9 @@
int number_of_ib_ports;
PFDO_DEVICE_DATA p_fdo = FdoGetData(Device);
struct mlx4_dev *mdev = p_fdo->pci_dev.dev;
-
+ BOOLEAN ib_created = FALSE;
+ BOOLEAN eth_created = FALSE;
+
MLX4_ENTER(MLX4_DBG_DRV);
if ( p_fdo->children_created )
@@ -232,22 +234,38 @@
// this routine will create all the children on base on this
info
number_of_ib_ports = mlx4_count_ib_ports(mdev);
ASSERT(number_of_ib_ports >=0 && number_of_ib_ports <=2);
-
- if(number_of_ib_ports > 0) {
- status = __create_child(Device, BUS_HARDWARE_IDS,
BUS_HARDWARE_DESCRIPTION, 0 );
- if (!NT_SUCCESS(status)) {
- MLX4_PRINT_EV(TRACE_LEVEL_ERROR, MLX4_DBG_DRV,
("__create_child (ib)failed with 0x%x\n", status));
- }
- }
- // Create ethernet ports if needed
- for (i = 0; i < MLX4_MAX_PORTS; i++) {
- if(mlx4_is_eth_port(mdev, i)) {
- status = __create_child(Device, ETH_HARDWARE_IDS,
ETH_HARDWARE_DESCRIPTION, i+1 );
- if (!NT_SUCCESS(status)) {
- MLX4_PRINT_EV(TRACE_LEVEL_ERROR, MLX4_DBG_DRV,
("__create_child (eth) failed with 0x%x\n", status));
- }
- }
+ for (i = 1; i <= MLX4_MAX_PORTS; i++) {
+ if (mlx4_is_enabled_port(mdev, i)) {
+ if(mlx4_is_eth_port(mdev, i)) {
+ status = __create_child(Device,
ETH_HARDWARE_IDS, ETH_HARDWARE_DESCRIPTION, i);
+ if (!NT_SUCCESS(status)) {
+ MLX4_PRINT_EV(TRACE_LEVEL_ERROR,
MLX4_DBG_DRV, ("__create_child (eth) failed with 0x%x\n", status));
+ break;
+ }
+ eth_created = TRUE;
+ } else {
+ if (eth_created){
+ //
+ // Illegal configuration the IB should be
the first port
+ //
+ status = STATUS_INVALID_PARAMETER;
+ MLX4_PRINT_EV(TRACE_LEVEL_ERROR,
MLX4_DBG_DRV, ("__create_child (IB) failed. Invalid configuration, IB
should be the first port."));
+ break;
+ }
+
+ if (ib_created){
+ continue;
+ }
+
+ status = __create_child(Device,
BUS_HARDWARE_IDS, BUS_HARDWARE_DESCRIPTION, 0 );
+ if (!NT_SUCCESS(status)) {
+ MLX4_PRINT_EV(TRACE_LEVEL_ERROR,
MLX4_DBG_DRV, ("__create_child (ib)failed with 0x%x\n", status));
+ break;
+ }
+ ib_created = TRUE;
+ }
+ }
}
p_fdo->children_created = TRUE;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20091117/17515438/attachment.html>
More information about the ofw
mailing list