]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[MTHCA] 1. get GUID by card query
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 23 Apr 2006 17:47:57 +0000 (17:47 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sun, 23 Apr 2006 17:47:57 +0000 (17:47 +0000)
2. added 2 vendor calls: FW_MAP_CRSPACE and FW_UNMAP_CRSPACE

git-svn-id: svn://openib.tc.cornell.edu/gen1@321 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

trunk/hw/mt23108/kernel/hca_data.c
trunk/hw/mt23108/kernel/hca_data.h
trunk/hw/mt23108/kernel/hca_driver.c
trunk/hw/mt23108/kernel/hca_driver.h
trunk/hw/mt23108/vapi/mlxsys/mosal/os_dep/win/mosalu_socket.c
trunk/hw/mt23108/vapi/mlxsys/os_dep/win/tdriver/MdPnp.c

index 7cc876c445cd3666ee421a6cb6ecb717d5ce451b..662f6df739b6b09cf58156cd7208e8fd60d66e92 100644 (file)
@@ -142,6 +142,28 @@ mlnx_hca_from_guid(
        return p_hca;\r
 }\r
 \r
+mlnx_hca_t*\r
+mlnx_hca_from_hh_hndl(\r
+       IN                              HH_hca_hndl_t                                   hh_hndl )\r
+{\r
+       cl_list_item_t  *p_item;\r
+       mlnx_hca_t              *p_hca = NULL;\r
+\r
+       cl_spinlock_acquire( &hob_lock );\r
+       p_item = cl_qlist_head( &mlnx_hca_list );\r
+       while( p_item != cl_qlist_end( &mlnx_hca_list ) )\r
+       {\r
+               p_hca = PARENT_STRUCT( p_item, mlnx_hca_t, list_item );\r
+               if( p_hca->hh_hndl == hh_hndl )\r
+                       break;\r
+               p_item = cl_qlist_next( p_item );\r
+               p_hca = NULL;\r
+       }\r
+       cl_spinlock_release( &hob_lock );\r
+       return p_hca;\r
+}\r
+\r
+\r
 /*\r
 void\r
 mlnx_names_from_guid(\r
index 89b2093c28bf29d8377f92cdea497a80d90612b2..0f4e739ab8884bbcf0cf55197debe14ac5726cb6 100644 (file)
@@ -214,7 +214,6 @@ typedef struct _ib_um_ca
        /* The next two fields must be grouped together as the are mapped to UM. */\r
        HH_hca_dev_t            dev_info;\r
        uint8_t                         ul_hca_res[1];  // Beginning of UL resource buffer.\r
-\r
 }      mlnx_um_ca_t;\r
 \r
 typedef struct {\r
@@ -227,7 +226,12 @@ typedef struct {
 \r
 typedef struct {\r
        cl_list_item_t  list_item;\r
-       HH_hca_hndl_t   hh_hndl;\r
+       HH_hca_hndl_t hh_hndl;\r
+       struct _hca_if {\r
+               HH_hca_hndl_t hh_hndl;\r
+               void *          kernel_crspace_addr;\r
+               ULONG           kernel_crspace_size;\r
+       } s;\r
 //     char                    *hca_name_p;\r
        net64_t                 guid;\r
        const void* __ptr64     p_dev_obj;              // hca device object\r
@@ -375,6 +379,10 @@ mlnx_hca_t*
 mlnx_hca_from_guid(\r
        IN                              ib_net64_t                                      guid );\r
 \r
+mlnx_hca_t*\r
+mlnx_hca_from_hh_hndl(\r
+       IN                              HH_hca_hndl_t                   hh_hndl );\r
+\r
 /*\r
 void\r
 mlnx_names_from_guid(\r
index 1bb64efde3b2094799ae85059a9ad9e25f72d690..bc2de2f1be5dc98214a6da198dfcf404a0fce653 100644 (file)
@@ -540,8 +540,11 @@ __get_hca_handle(
        p_io_stack->Parameters.QueryInterface.Version = 1;\r
        p_io_stack->Parameters.QueryInterface.Size = 0;\r
        p_io_stack->Parameters.QueryInterface.Interface = NULL;\r
-       p_io_stack->Parameters.QueryInterface.InterfaceSpecificData = \r
-               &p_ext->hca.hh_hndl;\r
+       { \r
+               void *p = &p_ext->hca.s;\r
+               memset( p, 0, sizeof(p_ext->hca.s) );\r
+               p_io_stack->Parameters.QueryInterface.InterfaceSpecificData = p;\r
+       }\r
        p_io_stack->Parameters.QueryInterface.InterfaceType = \r
                &GUID_MD_INTERFACE;\r
        p_irp->IoStatus.Status = STATUS_NOT_SUPPORTED;\r
@@ -562,7 +565,8 @@ __get_hca_handle(
                        ("Query interface for HCA handle returned %08x.\n", status) );\r
                return status;\r
        }\r
-\r
+       p_ext->hca.hh_hndl = p_ext->hca.s.hh_hndl;\r
+       \r
        HCA_EXIT( HCA_DBG_PNP );\r
        return status;\r
 }\r
@@ -913,7 +917,6 @@ hca_start(
 {\r
        NTSTATUS                        status;\r
        hca_dev_ext_t           *p_ext;\r
-       net64_t                         ca_guid = 0;\r
 \r
        HCA_ENTER( HCA_DBG_PNP );\r
 \r
@@ -937,16 +940,27 @@ hca_start(
                return status;\r
        }\r
 \r
-       /* store HCA PDO */\r
-       p_ext->hca.p_dev_obj = p_ext->cl_ext.p_pdo;\r
-       status = fw_flash_get_ca_guid(p_ext->cl_ext.p_pdo, &ca_guid);\r
-       if ( !NT_SUCCESS( status ) )\r
        {\r
-               HCA_TRACE( HCA_DBG_ERROR, \r
-                       ("fw_flash_get_ca_guid failed status =%#x.\n", status) );\r
-               return status;\r
+               VAPI_hca_cap_t hca_cap;\r
+               int rc;\r
+\r
+               if (HH_OK != THH_hob_open_hca(p_ext->hca.hh_hndl, NULL, NULL)) {\r
+                       status = IB_ERROR;\r
+                       return status;\r
+               }\r
+               \r
+               rc = THH_hob_query(p_ext->hca.hh_hndl, &hca_cap);\r
+               if (rc != HH_OK) {\r
+                       HCA_TRACE( HCA_DBG_ERROR, ("Error on getting guid (%#x).\n", rc) );\r
+                       status = IB_ERROR;\r
+                       return status;\r
+               }\r
+               p_ext->hca.guid = *(uint64_t *)hca_cap.node_guid;\r
+               p_ext->hca.p_dev_obj = p_ext->cl_ext.p_pdo;\r
+\r
+               THH_hob_close_hca(p_ext->hca.hh_hndl);\r
        }\r
-       p_ext->hca.guid = ca_guid;\r
+\r
        mlnx_hca_insert( &p_ext->hca );\r
 \r
        /*\r
@@ -1291,6 +1305,107 @@ End:
        return status;\r
 }\r
 \r
+static NTSTATUS\r
+__map_crspace(\r
+       IN                              mlnx_hob_t                      *       p_hob,\r
+       IN                              PVOID                                           p_buf,\r
+       IN                              ULONG                                           buf_size\r
+       )\r
+{\r
+       NTSTATUS                                status;\r
+       PMDL mdl_p;\r
+       mlnx_hca_t *p_hca = mlnx_hca_from_hh_hndl(p_hob->hh_hndl);\r
+       PVOID ua, ka;    \r
+       ULONG sz;                \r
+       struct _map_crspace *res_p = (struct _map_crspace *)p_buf;\r
+\r
+       HCA_ENTER( HCA_DBG_PNP );\r
+\r
+       // sanity checks\r
+       if ( buf_size < sizeof *res_p ) {\r
+               status = STATUS_INVALID_PARAMETER;\r
+               goto out;\r
+       }\r
+       if (p_hca == NULL) {\r
+                       status = STATUS_UNSUCCESSFUL;\r
+                       goto out;\r
+       }\r
+       ka = p_hca->s.kernel_crspace_addr;\r
+       sz = p_hca->s.kernel_crspace_size;\r
+       if ( sz == 0 || ka == NULL) {\r
+               HCA_TRACE( HCA_DBG_ERROR, ("No kernel mapping of CR space.\n") );\r
+               status = STATUS_UNSUCCESSFUL;\r
+               goto out;\r
+       }\r
+\r
+       // prepare for mapping to user space \r
+       mdl_p = IoAllocateMdl( ka, sz, FALSE,FALSE,NULL);\r
+       if (mdl_p == NULL) {\r
+               HCA_TRACE( HCA_DBG_ERROR, ("IoAllocateMdl failed.\n") );\r
+               status = STATUS_INSUFFICIENT_RESOURCES;\r
+               goto out;\r
+       }\r
+\r
+       // fill MDL\r
+       MmBuildMdlForNonPagedPool(mdl_p);               \r
+       \r
+       // map the buffer into user space \r
+       ua = MmMapLockedPagesSpecifyCache( mdl_p, UserMode, MmNonCached, \r
+               NULL, FALSE, NormalPagePriority );\r
+       if (ua == NULL) {\r
+               HCA_TRACE( HCA_DBG_ERROR, ("MmMapLockedPagesSpecifyCache failed.\n") );\r
+               IoFreeMdl( mdl_p );\r
+               status =  STATUS_UNSUCCESSFUL;\r
+               goto out;\r
+       }\r
+       \r
+       // fill the structure\r
+       res_p->va = ua;\r
+       res_p->size = sz;\r
+       res_p->ctx = mdl_p;\r
+       status = STATUS_SUCCESS;\r
+\r
+out:   \r
+       HCA_EXIT( HCA_DBG_PNP );\r
+       return status;\r
+}\r
+\r
+static NTSTATUS\r
+__unmap_crspace(\r
+       IN                              PVOID                                           p_buf,\r
+       IN                              ULONG                                           buf_size\r
+       )\r
+{\r
+       NTSTATUS                                status;\r
+       PMDL mdl_p;\r
+       PVOID ua;\r
+       struct _unmap_crspace *parm = (struct _unmap_crspace *)p_buf;\r
+\r
+       HCA_ENTER( HCA_DBG_PNP );\r
+\r
+       // sanity checks\r
+       if ( buf_size < sizeof *parm ) {\r
+               status = STATUS_INVALID_PARAMETER;\r
+               goto out;\r
+       }\r
+       mdl_p = parm->ctx;\r
+       ua = parm->va;\r
+       if ( mdl_p == NULL || ua == NULL) {\r
+               status = STATUS_INVALID_PARAMETER;\r
+               goto out;\r
+       }\r
+\r
+       // do the work\r
+       MmUnmapLockedPages(ua, mdl_p);\r
+       IoFreeMdl( mdl_p );\r
+       status = STATUS_SUCCESS;\r
+\r
+out:   \r
+       HCA_EXIT( HCA_DBG_PNP );\r
+       return status;\r
+}\r
+\r
+\r
 ib_api_status_t\r
 fw_access_ctrl(\r
        IN              const   void* __ptr64                           p_context,\r
@@ -1333,6 +1448,14 @@ fw_access_ctrl(
 \r
        switch ( p_ci->command )\r
        {\r
+               case FW_MAP_CRSPACE:\r
+                       status = __map_crspace(p_hob, p_data, length);\r
+                       break;\r
+                       \r
+               case FW_UNMAP_CRSPACE:\r
+                       status = __unmap_crspace(p_data, length);\r
+                       break;\r
+                               \r
                case    FW_READ: // read data from flash\r
                                if ( if_ready )\r
                                {\r
index 7b08a5f62161cb24bb4373e1c67a25058da2b479..50a56f659a6c807aeccb7395c2d27310aab85f0d 100644 (file)
@@ -129,11 +129,25 @@ Firmware Update definitions
 #define CPUMODE_MSK                    (0xc0000000UL)\r
 #define CPUMODE_SHIFT          (30)\r
 \r
+/* buffer structure for FW_MAP_CRBASE */\r
+struct _map_crspace {\r
+       PVOID           va;             /* address of CRSPACE, mapped to user space */\r
+       PVOID           ctx;            /* opaque operation context; to be used in FW_UNMAP_CRBASE */\r
+       ULONG           size;   /* size of CRSPACE, mapped to user space */\r
+};\r
+\r
+struct _unmap_crspace {\r
+       PVOID           va;             /* address of CRSPACE, mapped to user space */\r
+       PVOID           ctx;            /* operation context, received in FW_MAP_CRBASE */\r
+};\r
+\r
 /* Definitions intended to become shared with UM. Later... */\r
 #define FW_READ                        0x00\r
 #define FW_WRITE               0x01\r
 #define FW_READ_CMD            0x08\r
 #define FW_WRITE_CMD   0x09\r
+#define FW_MAP_CRSPACE 0x0A\r
+#define FW_UNMAP_CRSPACE       0x0B\r
 #define FW_OPEN_IF             0xe7\r
 #define FW_CLOSE_IF            0x7e\r
 \r
index 87a289bb683f90c97d02cb5e718039532265e715..d81c1e3095d5c0e2cdadda173e79b9ef7ce03f36 100644 (file)
@@ -221,6 +221,9 @@ int MOSAL_socket_recv(int sock,void* buf,int len,int flags)
        int byte_cnt = recv( (SOCKET)sock, (char FAR *)buf, len, 0 );\r
        if (byte_cnt == SOCKET_ERROR)\r
                return -1;\r
+       \r
+       if (byte_cnt == 0)\r
+               return -1;      /* socket closed */\r
        else\r
                return byte_cnt;\r
 }\r
@@ -249,6 +252,9 @@ int MOSAL_socket_sendto (int sock,void *buf, int n,int flags, MOSAL_sockaddr_t*
                (const struct sockaddr FAR *)adrs, (int)adrs_len );\r
        if (byte_cnt == SOCKET_ERROR)\r
                return -1;\r
+\r
+       if (byte_cnt == 0)\r
+               return -1;      /* socket closed */\r
        else\r
                return byte_cnt;\r
 }\r
index 1c73e03696b3f4dccaf5e7a85763704dfc2c8a63..2dd3c8a99d74c890917e4f90f0dae46943cb155c 100644 (file)
@@ -490,11 +490,18 @@ Return Value:
                {\r
                        if( l_pIrpStack->Parameters.QueryInterface.InterfaceSpecificData )\r
                        {\r
-                               // Our interface.  Return the HH HCA handle in \r
-                               // the "InterfaceSpecificData" member.\r
-                               *(HH_hca_hndl_t*)l_pIrpStack->Parameters.QueryInterface.\r
-                                       InterfaceSpecificData = l_pMdDevContext->m_hHhHca;\r
-                   pi_pIrp->IoStatus.Status = STATUS_SUCCESS;\r
+                               struct _hca_if {\r
+                                       HH_hca_hndl_t hh_hndl;\r
+                                       void *          kernel_crspace_addr;\r
+                                       ULONG   kernel_crspace_size;\r
+                               } *if_p = l_pIrpStack->Parameters.QueryInterface.InterfaceSpecificData;\r
+                               \r
+                               // Our interface.  Return the HH HCA handle and other data \r
+                               if_p->hh_hndl = l_pMdDevContext->m_hHhHca;\r
+                               if_p->kernel_crspace_addr = l_pMdDevContext->m_Cr.m_pKernelAddr;\r
+                               if_p->kernel_crspace_size = l_pMdDevContext->m_Cr.m_ulKernelSize;\r
+                               \r
+                  pi_pIrp->IoStatus.Status = STATUS_SUCCESS;\r
                                l_Status = STATUS_SUCCESS;\r
                                break;\r
                        }\r