[mlx4] Support different parameters for different mlx4 cards.
authortzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 31 Mar 2009 08:45:29 +0000 (08:45 +0000)
committertzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 31 Mar 2009 08:45:29 +0000 (08:45 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2069 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

hw/mlx4/kernel/bus/drv/drv.c
hw/mlx4/kernel/bus/drv/mlx4_bus.inx
hw/mlx4/kernel/bus/inc/device.h
hw/mlx4/kernel/bus/net/main.c
hw/mlx4/kernel/bus/net/mlx4.h

index c4ab8a2..f10980a 100644 (file)
@@ -257,9 +257,74 @@ end:
        return status;\r
 }\r
 \r
\r
+NTSTATUS\r
+__read_dev_params(IN WDFDEVICE  Device, struct mlx4_dev_params *dev_params)\r
+{\r
+       NTSTATUS status = STATUS_SUCCESS;\r
+       WDFKEY hKey = NULL;\r
+       WDFKEY hParamsKey = NULL;\r
+       DECLARE_CONST_UNICODE_STRING(Parameters, L"Parameters");\r
+       DECLARE_CONST_UNICODE_STRING(PortType, L"PortType");\r
+#define  MAX_UVALUE 100\r
+       WCHAR uvalue_data[MAX_UVALUE];\r
+       UNICODE_STRING uvalue;\r
+       status = WdfDeviceOpenRegistryKey(Device, PLUGPLAY_REGKEY_DRIVER, \r
+               STANDARD_RIGHTS_ALL, WDF_NO_OBJECT_ATTRIBUTES, &hKey);\r
+       if( !NT_SUCCESS( status ) ) {\r
+               MLX4_PRINT( TRACE_LEVEL_ERROR  ,MLX4_DBG_DEV  ,("WdfDeviceOpenRegistryKey Failed status = 0x%x\n", status));\r
+               goto err;\r
+       }\r
+\r
+       status = WdfRegistryOpenKey(hKey, &Parameters, STANDARD_RIGHTS_ALL, WDF_NO_OBJECT_ATTRIBUTES, &hParamsKey);\r
+       if( !NT_SUCCESS( status ) ) {\r
+               MLX4_PRINT( TRACE_LEVEL_ERROR  ,MLX4_DBG_DEV  ,("WdfRegistryOpenKey Failed status = 0x%x\n", status));\r
+               goto err;\r
+       }\r
+\r
+       uvalue.Buffer = uvalue_data;\r
+       uvalue.MaximumLength = MAX_UVALUE;\r
+       uvalue.Length = 0;\r
+\r
+       status = WdfRegistryQueryUnicodeString(hParamsKey, &PortType, NULL, &uvalue);\r
+       if (NT_SUCCESS (status)) {\r
+               if (!wcscmp(uvalue_data, L"ib,ib")) {\r
+                       dev_params->mod_port_type[0] = MLX4_PORT_TYPE_IB;\r
+                       dev_params->mod_port_type[1] = MLX4_PORT_TYPE_IB;\r
+               } else\r
+               if (!wcscmp(uvalue_data, L"ib,eth")) {\r
+                       dev_params->mod_port_type[0] = MLX4_PORT_TYPE_IB;\r
+                       dev_params->mod_port_type[1] = MLX4_PORT_TYPE_ETH;\r
+               } else\r
+               if (!wcscmp(uvalue_data, L"eth,ib")) {\r
+                       dev_params->mod_port_type[0] = MLX4_PORT_TYPE_ETH;\r
+                       dev_params->mod_port_type[1] = MLX4_PORT_TYPE_IB;\r
+               } else\r
+               if (!wcscmp(uvalue_data, L"eth,eth")) {\r
+                       dev_params->mod_port_type[0] = MLX4_PORT_TYPE_ETH;\r
+                       dev_params->mod_port_type[1] = MLX4_PORT_TYPE_ETH;\r
+               }\r
+       }\r
+       else {\r
+               dev_params->mod_port_type[0] = MLX4_PORT_TYPE_IB;\r
+               dev_params->mod_port_type[1] = MLX4_PORT_TYPE_IB;\r
+       }\r
+\r
+err:\r
+       if (hKey != NULL) \r
+               WdfRegistryClose(hKey);\r
+\r
+       if (hParamsKey != NULL) \r
+               WdfRegistryClose(hParamsKey);\r
+\r
+       return status;\r
+}\r
+\r
+\r
 static \r
 NTSTATUS\r
-__start_card( \r
+__start_card(\r
+       IN WDFDEVICE  Device,\r
        IN PFDO_DEVICE_DATA p_fdo \r
        )\r
 {\r
@@ -269,12 +334,17 @@ __start_card(
        int err;\r
        NTSTATUS status = STATUS_SUCCESS;\r
        struct pci_dev *pdev = &p_fdo->pci_dev;\r
+       struct mlx4_dev_params dev_params;\r
 \r
        MLX4_ENTER(MLX4_DBG_DRV);\r
 \r
        if ( p_fdo->card_started )\r
                goto err; \r
-               \r
+\r
+       status = __read_dev_params(Device, &dev_params);\r
+       if( !NT_SUCCESS( status ) ) \r
+               goto err;\r
+\r
        // enable the card\r
        status = pci_hca_enable( &pdev->bus_pci_ifc, &pdev->pci_cfg_space );\r
        if( !NT_SUCCESS( status ) ) \r
@@ -291,7 +361,7 @@ __start_card(
 #endif \r
 \r
        // NET library\r
-       err = mlx4_init_one( &p_fdo->pci_dev );\r
+       err = mlx4_init_one( &p_fdo->pci_dev, &dev_params );\r
        if (err) {\r
                status = errno_to_ntstatus(err);\r
                goto err;\r
@@ -323,12 +393,12 @@ __start_card(
 \r
        p_fdo->bus_ib_ifc.pdev = &p_fdo->pci_dev;\r
        p_fdo->bus_ib_ifc.p_ibdev = p_fdo->pci_dev.ib_dev;\r
-    p_fdo->bus_ib_ifc.is_livefish = mlx4_is_livefish(p_fdo->pci_dev.dev);    \r
-    if ( p_fdo->bus_ib_ifc.is_livefish == 0 ) {\r
-        p_fdo->bus_ib_ifc.pmlx4_dev = to_mdev(p_fdo->pci_dev.ib_dev)->dev;    \r
-           if ( p_fdo->bus_ib_ifc.pmlx4_dev->flags & MLX4_FLAG_MSI_X )\r
-                   p_fdo->bus_ib_ifc.n_msi_vectors = p_fdo->pci_dev.n_msi_vectors - 2;\r
-    }\r
+       p_fdo->bus_ib_ifc.is_livefish = mlx4_is_livefish(p_fdo->pci_dev.dev);    \r
+       if ( p_fdo->bus_ib_ifc.is_livefish == 0 ) {\r
+               p_fdo->bus_ib_ifc.pmlx4_dev = to_mdev(p_fdo->pci_dev.ib_dev)->dev;    \r
+               if ( p_fdo->bus_ib_ifc.pmlx4_dev->flags & MLX4_FLAG_MSI_X )\r
+                       p_fdo->bus_ib_ifc.n_msi_vectors = p_fdo->pci_dev.n_msi_vectors - 2;\r
+       }\r
 \r
        p_fdo->card_started = TRUE;\r
 \r
@@ -367,7 +437,7 @@ EvtDeviceD0Entry(
 \r
        // start card (needed after Hibernetion)\r
        if (PreviousState > WdfPowerDeviceD0)\r
-               __start_card( p_fdo );\r
+               __start_card( Device, p_fdo );\r
        mdev = pdev->dev;\r
 \r
        // create child device\r
@@ -685,7 +755,7 @@ EvtPrepareHardware(
        }\r
 \r
        // start the card\r
-       status = __start_card( p_fdo );\r
+       status = __start_card(Device, p_fdo );\r
        \r
 err:\r
        MLX4_EXIT( MLX4_DBG_DRV );\r
@@ -991,19 +1061,12 @@ __read_registry(WDFDRIVER *hDriver)
        // "Measure the interrupt from the first packet (default 1)"\r
        DECLARE_CONST_UNICODE_STRING(InterruptFromFirstPacket, L"InterruptFromFirstPacket");    \r
 \r
-       // "Ports L2 type (ib/eth/auto, entry per port, comma seperated, default ib for all)"\r
-       DECLARE_CONST_UNICODE_STRING(PortType, L"PortType");\r
-\r
        // "ProcessorAffinity"\r
        DECLARE_CONST_UNICODE_STRING(ProcessorAffinity, L"ProcessorAffinity");\r
 \r
        ULONG value;\r
        WDFKEY hKey = NULL;\r
        NTSTATUS status = STATUS_SUCCESS;\r
-\r
-       UNICODE_STRING uvalue;\r
-#define  MAX_UVALUE 100\r
-       WCHAR uvalue_data[MAX_UVALUE];\r
        \r
        status = WdfDriverOpenParametersRegistryKey( *hDriver,\r
                STANDARD_RIGHTS_ALL, WDF_NO_OBJECT_ATTRIBUTES, &hKey );\r
@@ -1093,34 +1156,6 @@ __read_registry(WDFDRIVER *hDriver)
                else\r
                        g.mod_affinity = 0;\r
                \r
-               uvalue.Buffer = uvalue_data;\r
-               uvalue.MaximumLength = MAX_UVALUE;\r
-               uvalue.Length = 0;\r
-\r
-               status = WdfRegistryQueryUnicodeString(hKey, &PortType, NULL, &uvalue);\r
-               if (NT_SUCCESS (status)) {\r
-                       if (!wcscmp(uvalue_data, L"ib,ib")) {\r
-                               g.mod_port_type [0] = MLX4_PORT_TYPE_IB;\r
-                               g.mod_port_type [1] = MLX4_PORT_TYPE_IB;\r
-                       } else\r
-                       if (!wcscmp(uvalue_data, L"ib,eth")) {\r
-                               g.mod_port_type [0] = MLX4_PORT_TYPE_IB;\r
-                               g.mod_port_type [1] = MLX4_PORT_TYPE_ETH;\r
-                       } else\r
-                       if (!wcscmp(uvalue_data, L"eth,ib")) {\r
-                               g.mod_port_type [0] = MLX4_PORT_TYPE_ETH;\r
-                               g.mod_port_type [1] = MLX4_PORT_TYPE_IB;\r
-                       } else\r
-                       if (!wcscmp(uvalue_data, L"eth,eth")) {\r
-                               g.mod_port_type [0] = MLX4_PORT_TYPE_ETH;\r
-                               g.mod_port_type [1] = MLX4_PORT_TYPE_ETH;\r
-                       }\r
-               }\r
-               else {\r
-                       g.mod_port_type [0] = MLX4_PORT_TYPE_IB;\r
-                       g.mod_port_type [1] = MLX4_PORT_TYPE_IB;\r
-               }\r
-\r
 \r
                WdfRegistryClose(hKey);\r
                status = STATUS_SUCCESS;\r
index b6ce7e0..042991a 100644 (file)
@@ -138,12 +138,15 @@ HKR,"Interrupt Management\Affinity Policy",DevicePriority,0x00010001,0x3
 \r
 [MLX4BUS.DDInstall.ntx86]\r
 CopyFiles = MLX4BUS.CopyFiles\r
+AddReg    = MLX4BUS.SoftwareReg\r
 \r
 [MLX4BUS.DDInstall.ntamd64]\r
 CopyFiles = MLX4BUS.CopyFiles\r
+AddReg    = MLX4BUS.SoftwareReg\r
 \r
 [MLX4BUS.DDInstall.ntia64]\r
 CopyFiles = MLX4BUS.CopyFiles\r
+AddReg    = MLX4BUS.SoftwareReg\r
 \r
 [MLX4BUS.DDInstall.ntx86.Services]\r
 AddService = mlx4_bus,%SPSVCINST_ASSOCSERVICE%,MLX4BUS.ServiceInstall,MLX4BUS.EventLog\r
@@ -178,6 +181,9 @@ AddReg = MLX4BUS.AddEventLogReg
 HKR, , EventMessageFile, 0x00020000, "%%SystemRoot%%\System32\IoLogMsg.dll;%%SystemRoot%%\System32\drivers\mlx4_bus.sys"\r
 HKR, , TypesSupported,   0x00010001, 7\r
 \r
+[MLX4BUS.SoftwareReg]\r
+HKR,"Parameters","PortType",%REG_SZ%,"ib,ib"\r
+\r
 [MLX4BUS.ParamsReg]\r
 HKR,,DeviceCharacteristics,0x10001,0x0100         ; Use same security checks on relative opens\r
 HKR,,Security,,"D:P(A;;GA;;;BA)(A;;GA;;;SY)"      ; Allow generic-all access to Built-in administrators and Local system \r
@@ -197,7 +203,7 @@ HKR,"Parameters","InterruptFromFirstPacket",%REG_DWORD%,0x00000001
 HKR,"Parameters","NumMac",%REG_DWORD%,0x00000001\r
 HKR,"Parameters","NumVlan",%REG_DWORD%,0x00000000\r
 HKR,"Parameters","UsePrio",%REG_DWORD%,0x00000000\r
-HKR,"Parameters","PortType",%REG_SZ%,"ib,ib"\r
+\r
 \r
 \r
 HKLM,"System\CurrentControlSet\Control\WMI\GlobalLogger\E51BB6E2-914A-4e21-93C0-192F4801BBFF","Flags",%REG_DWORD%,0xffff\r
index 894b193..74ea047 100644 (file)
@@ -337,6 +337,17 @@ struct mlx4_av {
 
 #define MLX4_DEV_SIGNATURE     0xf1b34a6e
 
+struct mlx4_dev_params {
+       enum mlx4_port_type mod_port_type[MLX4_MAX_PORTS];
+} ;
+
+static inline void mlx4_copy_dev_params(
+       struct mlx4_dev_params *dst,
+       struct mlx4_dev_params *src)
+{
+       *dst = *src;
+}
+
 struct mlx4_dev {
        u32                     signature;
        struct pci_dev         *pdev;
@@ -346,6 +357,7 @@ struct mlx4_dev {
        struct radix_tree_root  qp_table_tree;
        u32                     rev_id;
        char                    board_id[MLX4_BOARD_ID_LEN];
+       struct mlx4_dev_params  dev_params;
 };
 
 struct mlx4_init_port_param {
index 2f63bcd..67b76d3 100644 (file)
@@ -159,7 +159,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
        struct mlx4_dev *mdev = dev;
 
        for (i = 0; i < MLX4_MAX_PORTS; i++) 
-               port_type[i] = g.mod_port_type[i];
+               port_type[i] = dev->dev_params.mod_port_type[i];
 
        err = mlx4_QUERY_DEV_CAP(dev, dev_cap);
        if (err) {
@@ -886,13 +886,15 @@ static struct pci_device_id * mlx4_find_pci_dev(USHORT ven_id, USHORT dev_id)
        return NULL;
 }
 
-int mlx4_init_one(struct pci_dev *pdev)
+
+int mlx4_init_one(struct pci_dev *pdev, struct mlx4_dev_params *dev_params)
 {
        struct pci_device_id *id;
        struct mlx4_priv *priv;
        struct mlx4_dev *dev;
        int err;
        NTSTATUS status;
+       int i;
 
 #ifdef FORCE_LIVEFISH
                if (pdev)
@@ -964,6 +966,9 @@ run_as_livefish:
                goto end;
        }
 
+       for (i = 0; i < MLX4_MAX_PORTS; i++) 
+               dev->dev_params.mod_port_type[i] = dev_params->mod_port_type[i];
+
        /*
         * Now reset the HCA before we touch the PCI capabilities or
         * attempt a firmware command, since a boot ROM may have left
@@ -1077,8 +1082,11 @@ done:
 
 int mlx4_restart_one(struct pci_dev *pdev)
 {
+       struct mlx4_dev_params dev_params;
+       mlx4_copy_dev_params(&dev_params, &pdev->dev->dev_params);
+
        mlx4_remove_one(pdev, FALSE);
-       return mlx4_init_one(pdev);
+       return mlx4_init_one(pdev, &dev_params);
 }
 
 void mlx4_net_init()
index a0cfbf4..0409ba0 100644 (file)
@@ -83,7 +83,6 @@ typedef struct _GLOBALS {
 
        int mod_enable_qos;
        int mod_mlx4_blck_lb;
-       enum mlx4_port_type mod_port_type[MLX4_MAX_PORTS];
        int mod_interrupt_from_first;
 
        int mod_affinity;
@@ -421,7 +420,7 @@ void mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type);
 
 void mlx4_handle_catas_err(struct mlx4_dev *dev);
 
-int mlx4_init_one(struct pci_dev *pdev);
+int mlx4_init_one(struct pci_dev *pdev, struct mlx4_dev_params *dev_params);
 
 void mlx4_remove_one(struct pci_dev *pdev, int reset);