<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.18702"></HEAD>
<BODY>
<DIV><FONT size=2 face=Arial><SPAN class=857260218-15112009>signed off by: 
urih</SPAN></FONT></DIV>
<DIV><FONT size=2 face=Arial></FONT> </DIV>
<DIV><FONT size=2 face=Arial>Index: 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.c<BR>===================================================================<BR>--- 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.c (revision 4795)<BR>+++ 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.c (revision 4796)<BR>@@ -626,6 
+626,54 @@<BR>  return err;<BR> }<BR> <BR>+<BR>+static 
int<BR>+query_port_state(struct mlx4_dev *dev, u8 port)<BR>+{<BR>+ int err 
= 0;<BR>+    u32 input_modifier = 0;    
<BR>+ u64 out_param;<BR>+<BR>+#define MOD_STAT_OPMOD_QUERY_INLINE 
0x3<BR>+#define MOD_STAT_OFFSET_PORT_EN 0x8<BR>+<BR>+    
input_modifier = (1 << 28) | (port << 8) | 
MOD_STAT_OFFSET_PORT_EN;<BR>+<BR>+    err = mlx4_cmd_imm(dev, 0, 
&out_param, input_modifier, 
<BR>+                
MOD_STAT_OPMOD_QUERY_INLINE, 
<BR>+                
MLX4_CMD_QUERY_STAT_CFG,<BR>+       
MLX4_CMD_TIME_CLASS_A);<BR>+ if (err) {<BR>+  return 
err;<BR>+ }<BR>+    <BR>+    
dev->caps.port_state[port] = (((out_param >> 20) & 1) ? 
MLX4_PORT_ENABLED : MLX4_PORT_DISABLED);<BR>+    return 
0;<BR>+}<BR>+<BR>+int mlx4_port_state(struct mlx4_dev 
*dev)<BR>+{<BR>+    u8 i = 0;<BR>+ int err = 
0;<BR>+<BR>+    <BR>+    for (i = 1; i <= 
MLX4_MAX_PORTS; ++i)<BR>+    
{<BR>+        dev->caps.port_state[i] = 
MLX4_PORT_ENABLED;<BR>+    }<BR>+    
<BR>+    for (i = 1; i <= MLX4_MAX_PORTS; 
++i)<BR>+    {<BR>+        err 
= query_port_state(dev, i);<BR>+        if 
(err)<BR>+        
{<BR>+            return 
err;<BR>+        }<BR>+    
}<BR>+    <BR>+    return 
0;<BR>+}<BR>+<BR> static void get_board_id(u8 *vsd, char 
*board_id)<BR> {<BR>  int i;<BR>Index: 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.h<BR>===================================================================<BR>--- 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.h (revision 4795)<BR>+++ 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/fw.h (revision 4796)<BR>@@ -160,6 
+160,7 @@<BR> int mlx4_UNMAP_FA(struct mlx4_dev *dev);<BR> int 
mlx4_RUN_FW(struct mlx4_dev *dev);<BR> int mlx4_QUERY_FW(struct mlx4_dev 
*dev);<BR>+int mlx4_port_state(struct mlx4_dev *dev);<BR> int 
mlx4_QUERY_ADAPTER(struct mlx4_dev *dev, struct mlx4_adapter 
*adapter);<BR> int mlx4_INIT_HCA(struct mlx4_dev *dev, struct 
mlx4_init_hca_param *param);<BR> int mlx4_CLOSE_HCA(struct mlx4_dev *dev, 
int panic);<BR>Index: 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/main.c<BR>===================================================================<BR>--- 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/main.c (revision 4795)<BR>+++ 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/main.c (revision 4796)<BR>@@ 
-146,12 +146,28 @@<BR> <BR> BOOLEAN mlx4_is_eth_port(struct mlx4_dev 
*dev, int port_number)<BR> {<BR>- if 
(dev->caps.port_type[port_number+1] == MLX4_PORT_TYPE_ETH) {<BR>+ if 
(dev->caps.port_type[port_number] == MLX4_PORT_TYPE_ETH) 
{<BR>   return TRUE;<BR>  }<BR>  return 
FALSE;<BR> }<BR> <BR>+BOOLEAN mlx4_is_ib_port(struct mlx4_dev *dev, 
int port_number)<BR>+{<BR>+ if (dev->caps.port_type[port_number] == 
MLX4_PORT_TYPE_IB){<BR>+        return 
TRUE;<BR>+    }<BR>+    return 
FALSE;        <BR>+}<BR>+<BR>+BOOLEAN 
mlx4_is_enabled_port(struct mlx4_dev *dev, int port_number)<BR>+{<BR>+ if 
(dev->caps.port_state[port_number] == MLX4_PORT_ENABLED) 
{<BR>+  return TRUE;<BR>+ }<BR>+ return 
FALSE;<BR>+}<BR>+<BR> static int mlx4_dev_cap(struct mlx4_dev *dev, struct 
mlx4_dev_cap *dev_cap)<BR> {<BR>  int err;<BR>@@ -671,6 +687,12 
@@<BR>   goto 
err_stop_fw;<BR>  }<BR> <BR>+    
//<BR>+    // Initilize the port state. It's a new command that 
is supported only in FW 2.6.1280. <BR>+    //If running on 
earlier FW version the command can fail. Ignore the error code 
returned<BR>+    //<BR>+    
mlx4_port_state(dev);<BR>+<BR>  process_mod_param_profile();<BR>  profile 
= default_profile;<BR> <BR>Index: 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/mlx4.h<BR>===================================================================<BR>--- 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision 4795)<BR>+++ 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision 4796)<BR>@@ -65,6 
+65,11 @@<BR>  MLX4_PORT_TYPE_ETH = 1 << 
1,<BR> };<BR> <BR>+enum mlx4_port_state 
{<BR>+ MLX4_PORT_ENABLED = 1 << 
0,<BR>+ MLX4_PORT_DISABLED = 1 << 
1,<BR>+};<BR>+<BR> #define 
MAX_HCA_CARDS  8<BR> <BR> #pragma warning(disable:4201) // 
nameless struct/union<BR>@@ -387,6 +392,8 @@<BR> void 
mlx4_net_init();<BR> <BR> BOOLEAN mlx4_is_eth_port(struct mlx4_dev 
*dev, int port_number);<BR>+BOOLEAN mlx4_is_ib_port(struct mlx4_dev *dev, int 
port_number);<BR>+BOOLEAN mlx4_is_enabled_port(struct mlx4_dev *dev, int 
port_number);<BR> int mlx4_count_ib_ports(struct mlx4_dev 
*dev);<BR> <BR> struct mlx4_dev_cap;<BR>Index: 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/device.h<BR>===================================================================<BR>--- 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/device.h (revision 4795)<BR>+++ 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/device.h (revision 4796)<BR>@@ 
-208,7 +208,8 
@@<BR>  int   log_num_prios;<BR>  int   num_fc_exch;<BR>  enum 
mlx4_port_type port_type[MLX4_MAX_PORTS + 
1];<BR>- int   reserved_fexch_mpts_base;   
<BR>+    enum mlx4_port_state port_state[MLX4_MAX_PORTS + 
1];<BR>+    
int   reserved_fexch_mpts_base;   
<BR>  int   total_reserved_qps;<BR> };<BR> <BR>Index: 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/cmd.h<BR>===================================================================<BR>--- 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/cmd.h (revision 4795)<BR>+++ 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/inc/cmd.h (revision 4796)<BR>@@ -114,6 
+114,7 @@<BR>  /* miscellaneous commands 
*/<BR>  MLX4_CMD_DIAG_RPRT  = 
0x30,<BR>  MLX4_CMD_NOP   = 0x31,<BR>+    
MLX4_CMD_QUERY_STAT_CFG  = 0x34,<BR> <BR>  /* debug commands 
*/<BR>  MLX4_CMD_QUERY_DEBUG_MSG = 0x2a,<BR>Index: 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/drv/drv.c<BR>===================================================================<BR>--- 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision 4795)<BR>+++ 
Q:/projinf3/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision 4796)<BR>@@ -221,7 
+221,9 @@<BR>  int number_of_ib_ports;<BR>  PFDO_DEVICE_DATA 
p_fdo  = FdoGetData(Device);<BR>  struct mlx4_dev *mdev = 
p_fdo->pci_dev.dev;<BR>-<BR>+    BOOLEAN ib_created = 
FALSE;<BR>+    BOOLEAN eth_created = 
FALSE;<BR>+    
<BR>  MLX4_ENTER(MLX4_DBG_DRV);<BR> <BR>  if ( 
p_fdo->children_created )<BR>@@ -232,22 +234,38 @@<BR>  // this 
routine will create all the children on base on this 
info<BR>  number_of_ib_ports = 
mlx4_count_ib_ports(mdev);<BR>  ASSERT(number_of_ib_ports >=0 
&& number_of_ib_ports 
<=2);<BR>- <BR>- if(number_of_ib_ports > 0) 
{<BR>-  status = __create_child(Device, BUS_HARDWARE_IDS, 
BUS_HARDWARE_DESCRIPTION, 0 );<BR>-  if (!NT_SUCCESS(status)) 
{<BR>-    MLX4_PRINT_EV(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, 
("__create_child (ib)failed with 0x%x\n", 
status));<BR>-  }<BR>- }<BR> <BR>- // Create ethernet 
ports if needed<BR>- for (i = 0; i < MLX4_MAX_PORTS; i++) 
{<BR>-  if(mlx4_is_eth_port(mdev, i)) {<BR>-   status = 
__create_child(Device, ETH_HARDWARE_IDS, ETH_HARDWARE_DESCRIPTION, i+1 
);<BR>-   if (!NT_SUCCESS(status)) {<BR>-     
MLX4_PRINT_EV(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__create_child (eth) failed 
with 0x%x\n", status));<BR>-   }<BR>-  }<BR>+ for 
(i = 1; i <= MLX4_MAX_PORTS; i++) 
{<BR>+        if (mlx4_is_enabled_port(mdev, 
i)) {<BR>+            
if(mlx4_is_eth_port(mdev, i)) 
{<BR>+                
status = __create_child(Device, ETH_HARDWARE_IDS, ETH_HARDWARE_DESCRIPTION, 
i);<BR>+                
if (!NT_SUCCESS(status)) 
{<BR>+                     
MLX4_PRINT_EV(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__create_child (eth) failed 
with 0x%x\n", 
status));<BR>+                     
break;<BR>+                
}<BR>+                
eth_created = 
TRUE;<BR>+            } 
else 
{<BR>+                
if 
(eth_created){<BR>+                    
//<BR>+                    
// Illegal configuration the IB should be the first 
port<BR>+                    
//<BR>+                    
status = 
STATUS_INVALID_PARAMETER;<BR>+                    
MLX4_PRINT_EV(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__create_child (IB) failed. 
Invalid configuration, IB should be the first 
port."));<BR>+                    
break;                    
<BR>+                
}<BR>+                
<BR>+                
if 
(ib_created){<BR>+                    
continue;<BR>+                
}<BR>+<BR>+                
status = __create_child(Device, BUS_HARDWARE_IDS, BUS_HARDWARE_DESCRIPTION, 0 
);<BR>+                
if (!NT_SUCCESS(status)) 
{<BR>+                     
MLX4_PRINT_EV(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__create_child (ib)failed with 
0x%x\n", 
status));<BR>+                     
break;<BR>+                
}<BR>+                
ib_created = 
TRUE;<BR>+            
}<BR>+        
}<BR>  }<BR> <BR>  p_fdo->children_created = 
TRUE;<BR></DIV></FONT></BODY></HTML>