[mlx4] Create a device for the Ethernet driver if needed. (winib 2456)
authortzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 20 May 2008 07:16:08 +0000 (07:16 +0000)
committertzachid <tzachid@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 20 May 2008 07:16:08 +0000 (07:16 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@1185 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

hw/mlx4/kernel/bus/drv/drv.c
hw/mlx4/kernel/bus/drv/drv.h
hw/mlx4/kernel/bus/drv/pdo.c
hw/mlx4/kernel/bus/drv/precomp.h
hw/mlx4/kernel/bus/inc/bus_intf.h

index e27b822..1f3a5ef 100644 (file)
@@ -105,6 +105,7 @@ NTSTATUS
 __create_child(\r
        __in WDFDEVICE  Device,\r
        __in PWCHAR     HardwareIds,\r
+       __in PWCHAR     DeviceDescription,\r
        __in ULONG      SerialNo\r
        )\r
 \r
@@ -189,7 +190,7 @@ Routine Description:
                // the list locked for enumeration.  The enumeration lock applies only\r
                // to enumeration, not addition or removal.\r
                //\r
-               status = create_pdo(Device, HardwareIds, SerialNo);\r
+               status = create_pdo(Device, HardwareIds, DeviceDescription, SerialNo);\r
        }\r
 \r
        WdfFdoUnlockStaticChildListFromIteration(Device);\r
@@ -199,6 +200,17 @@ Routine Description:
        return status;\r
 }\r
 \r
+// TODO: Replace this functions with real ones\r
+int mlx4_count_ib_ports() {\r
+       return 1;\r
+}\r
+\r
+BOOLEAN mlx4_is_eth_port(int port_id)\r
+{\r
+       if ( port_id == 0 )return FALSE;\r
+       return FALSE;\r
+}\r
+\r
 \r
 NTSTATUS\r
 __do_static_enumeration(\r
@@ -220,15 +232,36 @@ Routine Description:
 --*/\r
 \r
 {\r
-       NTSTATUS status;\r
+       NTSTATUS status = STATUS_SUCCESS;\r
+       int i;\r
+       int number_of_ib_ports;\r
+\r
+       // TODO:Need to add an event log in the case of errors\r
 \r
        MLX4_ENTER(MLX4_DBG_DRV);\r
 \r
-       // eventually we'll have all information about children in Registry\r
+       // eventually we'll have all information about children in Registry\r
        // DriverEntry will read it into a Global storage and\r
        // this routine will create all the children on base on this info\r
+       number_of_ib_ports = mlx4_count_ib_ports();\r
+       ASSERT(number_of_ib_ports >=0 && number_of_ib_ports <=2);\r
+       \r
+       if(number_of_ib_ports > 0) {\r
+               status = __create_child(Device, BUS_HARDWARE_IDS, BUS_HARDWARE_DESCRIPTION, 0 );\r
+               if (!NT_SUCCESS(status)) {\r
+                        MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__create_child (ib)failed with 0x%x\n", status));\r
+               }\r
+       }\r
 \r
-       status = __create_child(Device, BUS_HARDWARE_IDS, 0 );\r
+       // Create ethernet ports if needed\r
+       for (i = 0; i < MLX4_MAX_PORTS; i++) {\r
+               if(mlx4_is_eth_port(i)) {\r
+                       status = __create_child(Device, ETH_HARDWARE_IDS, ETH_HARDWARE_DESCRIPTION, i+1 );\r
+                       if (!NT_SUCCESS(status)) {\r
+                                MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__create_child (eth) failed with 0x%x\n", status));\r
+                       }\r
+               }\r
+       }\r
 \r
        MLX4_EXIT( MLX4_DBG_DRV );\r
        return status;\r
@@ -251,7 +284,7 @@ EvtDeviceD0Entry(
 \r
        status = __do_static_enumeration(Device);\r
        if (!NT_SUCCESS(status)) {\r
-                MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("DoStaticEnumeration failed with 0x%x\n", status));\r
+                MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__do_static_enumeration failed with 0x%x\n", status));\r
        }\r
 \r
        {\r
@@ -516,7 +549,7 @@ EvtPrepareHardware(
        // get resources\r
        status = __get_resources( p_fdo, ResourcesRaw, ResourcesTranslated );\r
        if( !NT_SUCCESS( status ) ) {\r
-               MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__get_bus_ifc failed: status=0x%x\n", status));\r
+               MLX4_PRINT(TRACE_LEVEL_ERROR, MLX4_DBG_DRV, ("__get_resources failed: status=0x%x\n", status));\r
                goto err;\r
        }\r
 \r
@@ -567,11 +600,11 @@ EvtPrepareHardware(
        //\r
 \r
        // fill the header\r
-       p_fdo->bus_ib_ifc.Size = sizeof(MLX4_BUS_IB_INTERFACE);\r
-       p_fdo->bus_ib_ifc.Version = MLX4_BUS_IB_INTERFACE_VERSION;\r
+       p_fdo->bus_ib_ifc.i.Size = sizeof(MLX4_BUS_IB_INTERFACE);\r
+       p_fdo->bus_ib_ifc.i.Version = MLX4_BUS_IB_INTERFACE_VERSION;\r
        // Let the framework handle reference counting.\r
-       p_fdo->bus_ib_ifc.InterfaceReference = WdfDeviceInterfaceReferenceNoOp;\r
-       p_fdo->bus_ib_ifc.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp;\r
+       p_fdo->bus_ib_ifc.i.InterfaceReference = WdfDeviceInterfaceReferenceNoOp;\r
+       p_fdo->bus_ib_ifc.i.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp;\r
 \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
@@ -1001,3 +1034,4 @@ end:
 }\r
 \r
 \r
+\r
index 64d7dbd..1dc7f2b 100644 (file)
@@ -67,6 +67,8 @@ typedef struct _FDO_DEVICE_DATA
        int                                                     dma_adapter_taken;\r
        res_interrupt_t                         interrupt[MLX4_MAX_INTERRUPTS];\r
        MLX4_BUS_IB_INTERFACE           bus_ib_ifc;\r
+       // Data for the Ethernet device\r
+       struct VipBusIfc                        mtnic_Ifc;\r
 \r
 } FDO_DEVICE_DATA, *PFDO_DEVICE_DATA;\r
 \r
@@ -216,6 +218,8 @@ NTSTATUS
 create_pdo(\r
        __in WDFDEVICE  Device,\r
        __in PWCHAR     HardwareIds,\r
+       __in PWCHAR     DeviceDescription,\r
        __in ULONG      SerialNo\r
 );\r
 \r
+\r
index 4fb02c5..c125ef2 100644 (file)
@@ -16,6 +16,7 @@ NTSTATUS
 create_pdo(\r
        __in WDFDEVICE  Device,\r
        __in PWCHAR     HardwareIds,\r
+       __in PWCHAR     DeviceDescription,\r
        __in ULONG      SerialNo\r
 )\r
 /*++\r
@@ -40,13 +41,14 @@ Return Value:
        WDF_OBJECT_ATTRIBUTES       pdoAttributes;\r
        WDF_DEVICE_PNP_CAPABILITIES pnpCaps;\r
        WDF_DEVICE_POWER_CAPABILITIES powerCaps;\r
-       DECLARE_CONST_UNICODE_STRING(compatId, BUSENUM_COMPATIBLE_IDS);\r
+       UNICODE_STRING compatId;\r
        DECLARE_CONST_UNICODE_STRING(deviceLocation, L"MLX4 Bus 0");\r
        UNICODE_STRING deviceId;\r
        DECLARE_UNICODE_STRING_SIZE(buffer, MAX_ID_LEN);\r
 \r
        MLX4_PRINT(TRACE_LEVEL_INFORMATION, MLX4_DBG_DRV, ("Entered CreatePdo\n"));\r
 \r
+       RtlInitUnicodeString(&compatId, HardwareIds);\r
        PAGED_CODE();\r
 \r
        //\r
@@ -107,7 +109,8 @@ Return Value:
        // coinstallers to display in the device manager. FriendlyName takes\r
        // precedence over the DeviceDesc from the INF file.\r
        //\r
-       status = RtlUnicodeStringPrintf(&buffer,L"Mellanox ConnectX Virtual Infiniband Adapter (#%02d)", SerialNo );\r
+       status = RtlUnicodeStringPrintf(&buffer,DeviceDescription  , SerialNo );\r
+       \r
        if (!NT_SUCCESS(status)) {\r
                goto Cleanup;\r
        }\r
@@ -181,11 +184,14 @@ Return Value:
 \r
        WdfDeviceSetPowerCapabilities(hChild, &powerCaps);\r
 \r
+       p_fdo->bus_ib_ifc.port_id = SerialNo;\r
+       p_fdo->bus_ib_ifc.pVipBusIfc = &p_fdo->mtnic_Ifc;\r
+       p_fdo->bus_ib_ifc.pVipBusIfc->ulAllocatePortObjSize = MAX_PORT_SIZE;\r
        //\r
        // Create a custom interface so that other drivers can\r
        // query (IRP_MN_QUERY_INTERFACE) and use our callbacks directly.\r
        //\r
-       p_fdo->bus_ib_ifc.Context = p_pdo;\r
+       p_fdo->bus_ib_ifc.i.Context = p_pdo;\r
 \r
        WDF_QUERY_INTERFACE_CONFIG_INIT( &p_pdo->qiMlx4Bus,\r
                (PINTERFACE) &p_fdo->bus_ib_ifc,\r
@@ -238,3 +244,4 @@ Cleanup:
        return status;\r
 }\r
 \r
+\r
index bcfbcdb..e4576ce 100644 (file)
@@ -6,6 +6,7 @@
 #include "public.h"\r
 #include "l2w.h"\r
 #include "ib\mlx4_ib.h"\r
+#include "vip_dev.h"\r
 #include "drv.h"\r
 #if 0\r
 #include "mxe_hca.h"\r
@@ -16,3 +17,4 @@
 #include "mxe_drv.h"\r
 #endif\r
 \r
+\r
index 52db31e..798a8ef 100644 (file)
@@ -1,17 +1,21 @@
 #pragma once
 
-#define MLX4_BUS_IB_INTERFACE_VERSION          1
+#define MLX4_BUS_IB_INTERFACE_VERSION          2
 
 //
 // Interface for work with MLX4 IB driver
 //
+
 #pragma warning(disable:4201) // nameless struct/union
 typedef struct _MLX4_BUS_IB_INTERFACE{
-       INTERFACE;
+       INTERFACE i;
        struct ib_device                *       p_ibdev;
        struct pci_dev                  *       pdev;
        int                                                     is_livefish;
+       ULONG                                           port_id;
+       struct VipBusIfc                        *pVipBusIfc;
        
 } MLX4_BUS_IB_INTERFACE, *PMLX4_BUS_IB_INTERFACE;
 #pragma warning(default:4201) // nameless struct/union
 
+