<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.6000.16587" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=475374508-31032009><FONT face=Arial color=#0000ff 
size=2>Applied on 2069.</FONT></SPAN></DIV>
<DIV> </DIV>
<DIV><SPAN class=475374508-31032009></SPAN><FONT face=Arial><FONT 
color=#0000ff><FONT size=2>T<SPAN 
class=475374508-31032009>hanks</SPAN></FONT></FONT></FONT></DIV>
<DIV><FONT><FONT color=#0000ff><FONT size=2><SPAN 
class=475374508-31032009></SPAN></FONT></FONT></FONT><SPAN 
class=475374508-31032009></SPAN><FONT face=Arial><FONT color=#0000ff><FONT 
size=2>T<SPAN class=475374508-31032009>zachi</SPAN></FONT></FONT></FONT><BR>
<HR tabIndex=-1>
<FONT face=Tahoma size=2><B>From:</B> ofw-bounces@lists.openfabrics.org 
[mailto:ofw-bounces@lists.openfabrics.org] <B>On Behalf Of </B>Tzachi 
Dar<BR><B>Sent:</B> Sunday, March 29, 2009 6:56 PM<BR><B>To:</B> 
ofw@lists.openfabrics.org<BR><B>Subject:</B> [ofw] [patch] Support different 
parameters for different mlx4 cards.<BR></FONT><BR></DIV>
<BLOCKQUOTE dir=ltr 
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid; MARGIN-RIGHT: 0px">
  <DIV></DIV><FONT face=Arial size=2>Index: 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/net/main.c<BR>===================================================================<BR>--- 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/net/main.c (revision 4206)<BR>+++ 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/net/main.c (revision 4207)<BR>@@ 
  -159,7 +159,7 @@<BR>  struct mlx4_dev *mdev = 
  dev;<BR> <BR>  for (i = 0; i < MLX4_MAX_PORTS; i++) 
  <BR>-  port_type[i] = 
  g.mod_port_type[i];<BR>+  port_type[i] = 
  dev->dev_params.mod_port_type[i];<BR> <BR>  err = 
  mlx4_QUERY_DEV_CAP(dev, dev_cap);<BR>  if (err) {<BR>@@ -886,13 
  +886,15 @@<BR>  return NULL;<BR> }<BR> <BR>-int 
  mlx4_init_one(struct pci_dev *pdev)<BR>+<BR>+int mlx4_init_one(struct pci_dev 
  *pdev, struct mlx4_dev_params *dev_params)<BR> {<BR>  struct 
  pci_device_id *id;<BR>  struct mlx4_priv 
  *priv;<BR>  struct mlx4_dev *dev;<BR>  int 
  err;<BR>  NTSTATUS status;<BR>+ int 
  i;<BR> <BR> #ifdef FORCE_LIVEFISH<BR>   if 
  (pdev)<BR>@@ -964,6 +966,9 @@<BR>   goto 
  end;<BR>  }<BR> <BR>+ for (i = 0; i < MLX4_MAX_PORTS; 
  i++) <BR>+  dev->dev_params.mod_port_type[i] = 
  dev_params->mod_port_type[i];<BR>+<BR>  /*<BR>   * Now 
  reset the HCA before we touch the PCI capabilities or<BR>   * 
  attempt a firmware command, since a boot ROM may have left<BR>@@ -1077,8 
  +1082,11 @@<BR> <BR> int mlx4_restart_one(struct pci_dev 
  *pdev)<BR> {<BR>+ struct mlx4_dev_params 
  dev_params;<BR>+ mlx4_copy_dev_params(&dev_params, 
  &pdev->dev->dev_params);<BR>+<BR>  mlx4_remove_one(pdev, 
  FALSE);<BR>- return mlx4_init_one(pdev);<BR>+ return 
  mlx4_init_one(pdev, &dev_params);<BR> }<BR> <BR> void 
  mlx4_net_init()<BR>Index: 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/net/mlx4.h<BR>===================================================================<BR>--- 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision 4206)<BR>+++ 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/net/mlx4.h (revision 4207)<BR>@@ 
  -83,7 +83,6 @@<BR> <BR>  int mod_enable_qos;<BR>  int 
  mod_mlx4_blck_lb;<BR>- enum mlx4_port_type 
  mod_port_type[MLX4_MAX_PORTS];<BR>  int 
  mod_interrupt_from_first;<BR> <BR>  int mod_affinity;<BR>@@ 
  -421,7 +420,7 @@<BR> <BR> void mlx4_handle_catas_err(struct mlx4_dev 
  *dev);<BR> <BR>-int mlx4_init_one(struct pci_dev *pdev);<BR>+int 
  mlx4_init_one(struct pci_dev *pdev, struct mlx4_dev_params 
  *dev_params);<BR> <BR> void mlx4_remove_one(struct pci_dev *pdev, 
  int reset);<BR> <BR>Index: 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/inc/device.h<BR>===================================================================<BR>--- 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/inc/device.h (revision 4206)<BR>+++ 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/inc/device.h (revision 4207)<BR>@@ 
  -337,6 +337,17 @@<BR> <BR> #define 
  MLX4_DEV_SIGNATURE 0xf1b34a6e<BR> <BR>+struct mlx4_dev_params 
  {<BR>+ enum mlx4_port_type mod_port_type[MLX4_MAX_PORTS];<BR>+} 
  ;<BR>+<BR>+static inline void mlx4_copy_dev_params(<BR>+ struct 
  mlx4_dev_params *dst,<BR>+ struct mlx4_dev_params 
  *src)<BR>+{<BR>+ *dst = *src;<BR>+}<BR>+<BR> struct mlx4_dev 
  {<BR>  u32   signature;<BR>  struct 
  pci_dev        *pdev;<BR>@@ -346,6 +357,7 
  @@<BR>  struct 
  radix_tree_root qp_table_tree;<BR>  u32   rev_id;<BR>  char   board_id[MLX4_BOARD_ID_LEN];<BR>+ struct 
  mlx4_dev_params dev_params;<BR> };<BR> <BR> struct 
  mlx4_init_port_param {<BR>Index: 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/drv/mlx4_bus.inx<BR>===================================================================<BR>--- 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/drv/mlx4_bus.inx (revision 
  4206)<BR>+++ 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/drv/mlx4_bus.inx (revision 
  4207)<BR>@@ -138,12 +138,15 
  @@<BR> <BR> [MLX4BUS.DDInstall.ntx86]<BR> CopyFiles = 
  MLX4BUS.CopyFiles<BR>+AddReg    = 
  MLX4BUS.SoftwareReg<BR> <BR> [MLX4BUS.DDInstall.ntamd64]<BR> CopyFiles 
  = MLX4BUS.CopyFiles<BR>+AddReg    = 
  MLX4BUS.SoftwareReg<BR> <BR> [MLX4BUS.DDInstall.ntia64]<BR> CopyFiles 
  = MLX4BUS.CopyFiles<BR>+AddReg    = 
  MLX4BUS.SoftwareReg<BR> <BR> [MLX4BUS.DDInstall.ntx86.Services]<BR> AddService 
  = 
  mlx4_bus,%SPSVCINST_ASSOCSERVICE%,MLX4BUS.ServiceInstall,MLX4BUS.EventLog<BR>@@ 
  -178,6 +181,9 @@<BR> HKR, , EventMessageFile, 0x00020000, 
  "%%SystemRoot%%\System32\IoLogMsg.dll;%%SystemRoot%%\System32\drivers\mlx4_bus.sys"<BR> HKR, 
  , TypesSupported,   0x00010001, 
  7<BR> <BR>+[MLX4BUS.SoftwareReg]<BR>+HKR,"Parameters","PortType",%REG_SZ%,"ib,ib"<BR>+<BR> [MLX4BUS.ParamsReg]<BR> HKR,,DeviceCharacteristics,0x10001,0x0100         
  ; Use same security checks on relative 
  opens<BR> HKR,,Security,,"D:P(A;;GA;;;BA)(A;;GA;;;SY)"      
  ; Allow generic-all access to Built-in administrators and Local system <BR>@@ 
  -197,9 +203,9 
  @@<BR> HKR,"Parameters","NumMac",%REG_DWORD%,0x00000001<BR> HKR,"Parameters","NumVlan",%REG_DWORD%,0x00000000<BR> HKR,"Parameters","UsePrio",%REG_DWORD%,0x00000000<BR>-HKR,"Parameters","PortType",%REG_SZ%,"ib,ib"<BR> <BR> <BR>+<BR> HKLM,"System\CurrentControlSet\Control\WMI\GlobalLogger\E51BB6E2-914A-4e21-93C0-192F4801BBFF","Flags",%REG_DWORD%,0xffff<BR> HKLM,"System\CurrentControlSet\Control\WMI\GlobalLogger\E51BB6E2-914A-4e21-93C0-192F4801BBFF","Level",%REG_DWORD%,0x3<BR> <BR>Index: 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/drv/drv.c<BR>===================================================================<BR>--- 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision 4206)<BR>+++ 
  Q:/projinf4/trunk/hw/mlx4/kernel/bus/drv/drv.c (revision 4207)<BR>@@ 
  -257,9 +257,74 @@<BR>  return status;<BR> }<BR> <BR>+ 
  <BR>+NTSTATUS<BR>+__read_dev_params(IN WDFDEVICE  Device, struct 
  mlx4_dev_params *dev_params)<BR>+{<BR>+ NTSTATUS status = 
  STATUS_SUCCESS;<BR>+ WDFKEY hKey = NULL;<BR>+ WDFKEY hParamsKey = 
  NULL;<BR>+ DECLARE_CONST_UNICODE_STRING(Parameters, 
  L"Parameters");<BR>+ DECLARE_CONST_UNICODE_STRING(PortType, 
  L"PortType");<BR>+#define  MAX_UVALUE 100<BR>+ WCHAR 
  uvalue_data[MAX_UVALUE];<BR>+ UNICODE_STRING uvalue;<BR>+ status = 
  WdfDeviceOpenRegistryKey(Device, PLUGPLAY_REGKEY_DRIVER, 
  <BR>+  STANDARD_RIGHTS_ALL, WDF_NO_OBJECT_ATTRIBUTES, 
  &hKey);<BR>+ if( !NT_SUCCESS( status ) ) 
  {<BR>+  MLX4_PRINT( TRACE_LEVEL_ERROR  ,MLX4_DBG_DEV  
  ,("WdfDeviceOpenRegistryKey Failed status = 0x%x\n", 
  status));<BR>+  goto err;<BR>+ }<BR>+<BR>+ status = 
  WdfRegistryOpenKey(hKey, &Parameters, STANDARD_RIGHTS_ALL, 
  WDF_NO_OBJECT_ATTRIBUTES, &hParamsKey);<BR>+ if( !NT_SUCCESS( status 
  ) ) {<BR>+  MLX4_PRINT( TRACE_LEVEL_ERROR  ,MLX4_DBG_DEV  
  ,("WdfRegistryOpenKey Failed status = 0x%x\n", status));<BR>+  goto 
  err;<BR>+ }<BR>+<BR>+ uvalue.Buffer = 
  uvalue_data;<BR>+ uvalue.MaximumLength = 
  MAX_UVALUE;<BR>+ uvalue.Length = 0;<BR>+<BR>+ status = 
  WdfRegistryQueryUnicodeString(hParamsKey, &PortType, NULL, 
  &uvalue);<BR>+ if (NT_SUCCESS (status)) {<BR>+  if 
  (!wcscmp(uvalue_data, L"ib,ib")) 
  {<BR>+   dev_params->mod_port_type[0] = 
  MLX4_PORT_TYPE_IB;<BR>+   dev_params->mod_port_type[1] = 
  MLX4_PORT_TYPE_IB;<BR>+  } else<BR>+  if 
  (!wcscmp(uvalue_data, L"ib,eth")) 
  {<BR>+   dev_params->mod_port_type[0] = 
  MLX4_PORT_TYPE_IB;<BR>+   dev_params->mod_port_type[1] = 
  MLX4_PORT_TYPE_ETH;<BR>+  } else<BR>+  if 
  (!wcscmp(uvalue_data, L"eth,ib")) 
  {<BR>+   dev_params->mod_port_type[0] = 
  MLX4_PORT_TYPE_ETH;<BR>+   dev_params->mod_port_type[1] = 
  MLX4_PORT_TYPE_IB;<BR>+  } else<BR>+  if 
  (!wcscmp(uvalue_data, L"eth,eth")) 
  {<BR>+   dev_params->mod_port_type[0] = 
  MLX4_PORT_TYPE_ETH;<BR>+   dev_params->mod_port_type[1] = 
  MLX4_PORT_TYPE_ETH;<BR>+  }<BR>+ }<BR>+ else 
  {<BR>+  dev_params->mod_port_type[0] = 
  MLX4_PORT_TYPE_IB;<BR>+  dev_params->mod_port_type[1] = 
  MLX4_PORT_TYPE_IB;<BR>+ }<BR>+<BR>+err:<BR>+ if (hKey != NULL) 
  <BR>+  WdfRegistryClose(hKey);<BR>+<BR>+ if (hParamsKey != 
  NULL) <BR>+  WdfRegistryClose(hParamsKey);<BR>+<BR>+ return 
  status;<BR>+}<BR>+<BR>+<BR> static <BR> NTSTATUS<BR>-__start_card( 
  <BR>+__start_card(<BR>+ IN WDFDEVICE  Device,<BR>  IN 
  PFDO_DEVICE_DATA p_fdo <BR>  )<BR> {<BR>@@ -269,12 +334,17 
  @@<BR>  int err;<BR>  NTSTATUS status = 
  STATUS_SUCCESS;<BR>  struct pci_dev *pdev = 
  &p_fdo->pci_dev;<BR>+ struct mlx4_dev_params 
  dev_params;<BR> <BR>  MLX4_ENTER(MLX4_DBG_DRV);<BR> <BR>  if 
  ( p_fdo->card_started )<BR>   goto err; 
  <BR>-  <BR>+<BR>+ status = __read_dev_params(Device, 
  &dev_params);<BR>+ if( !NT_SUCCESS( status ) ) <BR>+  goto 
  err;<BR>+<BR>  // enable the card<BR>  status = 
  pci_hca_enable( &pdev->bus_pci_ifc, &pdev->pci_cfg_space 
  );<BR>  if( !NT_SUCCESS( status ) ) <BR>@@ -291,7 +361,7 
  @@<BR> #endif <BR> <BR>  // NET library<BR>- err 
  = mlx4_init_one( &p_fdo->pci_dev );<BR>+ err = mlx4_init_one( 
  &p_fdo->pci_dev, &dev_params );<BR>  if (err) 
  {<BR>   status = 
  errno_to_ntstatus(err);<BR>   goto err;<BR>@@ -323,12 +393,12 
  @@<BR> <BR>  p_fdo->bus_ib_ifc.pdev = 
  &p_fdo->pci_dev;<BR>  p_fdo->bus_ib_ifc.p_ibdev = 
  p_fdo->pci_dev.ib_dev;<BR>-    
  p_fdo->bus_ib_ifc.is_livefish = 
  mlx4_is_livefish(p_fdo->pci_dev.dev);    
  <BR>-    if ( p_fdo->bus_ib_ifc.is_livefish == 0 ) 
  {<BR>-        
  p_fdo->bus_ib_ifc.pmlx4_dev = 
  to_mdev(p_fdo->pci_dev.ib_dev)->dev;    
  <BR>-     if ( p_fdo->bus_ib_ifc.pmlx4_dev->flags 
  & MLX4_FLAG_MSI_X )<BR>-      
  p_fdo->bus_ib_ifc.n_msi_vectors = p_fdo->pci_dev.n_msi_vectors - 
  2;<BR>-    }<BR>+ p_fdo->bus_ib_ifc.is_livefish = 
  mlx4_is_livefish(p_fdo->pci_dev.dev);    <BR>+ if ( 
  p_fdo->bus_ib_ifc.is_livefish == 0 ) 
  {<BR>+  p_fdo->bus_ib_ifc.pmlx4_dev = 
  to_mdev(p_fdo->pci_dev.ib_dev)->dev;    
  <BR>+  if ( p_fdo->bus_ib_ifc.pmlx4_dev->flags & 
  MLX4_FLAG_MSI_X )<BR>+   p_fdo->bus_ib_ifc.n_msi_vectors = 
  p_fdo->pci_dev.n_msi_vectors - 
  2;<BR>+ }<BR> <BR>  p_fdo->card_started = 
  TRUE;<BR> <BR>@@ -367,7 +437,7 @@<BR> <BR>  // start card 
  (needed after Hibernetion)<BR>  if (PreviousState > 
  WdfPowerDeviceD0)<BR>-  __start_card( p_fdo 
  );<BR>+  __start_card( Device, p_fdo );<BR>  mdev = 
  pdev->dev;<BR> <BR>  // create child device<BR>@@ -685,7 
  +755,7 @@<BR>  }<BR> <BR>  // start the 
  card<BR>- status = __start_card( p_fdo );<BR>+ status = 
  __start_card(Device, p_fdo 
  );<BR>  <BR> err:<BR>  MLX4_EXIT( MLX4_DBG_DRV 
  );<BR>@@ -991,19 +1061,12 @@<BR>  // "Measure the interrupt from the 
  first packet (default 
  1)"<BR>  DECLARE_CONST_UNICODE_STRING(InterruptFromFirstPacket, 
  L"InterruptFromFirstPacket"); <BR> <BR>- // "Ports L2 type 
  (ib/eth/auto, entry per port, comma seperated, default ib for 
  all)"<BR>- DECLARE_CONST_UNICODE_STRING(PortType, 
  L"PortType");<BR>-<BR>  // 
  "ProcessorAffinity"<BR>  DECLARE_CONST_UNICODE_STRING(ProcessorAffinity, 
  L"ProcessorAffinity");<BR> <BR>  ULONG 
  value;<BR>  WDFKEY hKey = NULL;<BR>  NTSTATUS status = 
  STATUS_SUCCESS;<BR>-<BR>- UNICODE_STRING uvalue;<BR>-#define  
  MAX_UVALUE 100<BR>- WCHAR 
  uvalue_data[MAX_UVALUE];<BR>  <BR>  status = 
  WdfDriverOpenParametersRegistryKey( 
  *hDriver,<BR>   STANDARD_RIGHTS_ALL, WDF_NO_OBJECT_ATTRIBUTES, 
  &hKey );<BR>@@ -1093,35 +1156,7 
  @@<BR>   else<BR>    g.mod_affinity = 
  0;<BR>   <BR>-  uvalue.Buffer = 
  uvalue_data;<BR>-  uvalue.MaximumLength = 
  MAX_UVALUE;<BR>-  uvalue.Length = 
  0;<BR> <BR>-  status = WdfRegistryQueryUnicodeString(hKey, 
  &PortType, NULL, &uvalue);<BR>-  if (NT_SUCCESS (status)) 
  {<BR>-   if (!wcscmp(uvalue_data, L"ib,ib")) 
  {<BR>-    g.mod_port_type [0] = 
  MLX4_PORT_TYPE_IB;<BR>-    g.mod_port_type [1] = 
  MLX4_PORT_TYPE_IB;<BR>-   } else<BR>-   if 
  (!wcscmp(uvalue_data, L"ib,eth")) 
  {<BR>-    g.mod_port_type [0] = 
  MLX4_PORT_TYPE_IB;<BR>-    g.mod_port_type [1] = 
  MLX4_PORT_TYPE_ETH;<BR>-   } else<BR>-   if 
  (!wcscmp(uvalue_data, L"eth,ib")) 
  {<BR>-    g.mod_port_type [0] = 
  MLX4_PORT_TYPE_ETH;<BR>-    g.mod_port_type [1] = 
  MLX4_PORT_TYPE_IB;<BR>-   } else<BR>-   if 
  (!wcscmp(uvalue_data, L"eth,eth")) 
  {<BR>-    g.mod_port_type [0] = 
  MLX4_PORT_TYPE_ETH;<BR>-    g.mod_port_type [1] = 
  MLX4_PORT_TYPE_ETH;<BR>-   }<BR>-  }<BR>-  else 
  {<BR>-   g.mod_port_type [0] = 
  MLX4_PORT_TYPE_IB;<BR>-   g.mod_port_type [1] = 
  MLX4_PORT_TYPE_IB;<BR>-  }<BR>-<BR>-<BR>   WdfRegistryClose(hKey);<BR>   status 
  = STATUS_SUCCESS;<BR>  }<BR></FONT>
  <DIV><FONT face=Arial size=2></FONT> </DIV></BLOCKQUOTE></BODY></HTML>