[OFW][patch] partition tool

James Yang jyang at xsigo.com
Tue Apr 29 11:46:05 PDT 2008


Can you give an example on how to use your key to add a new PDO with followings:

1) Company-X device ID_AAAA

2) Company-X hardware ID_BBBB

3) Company-X compatible ID_CCCC

4) Company-X description "Company X device driver"

 

Also I'd like to know if the PDO created by this method can be a boot device. For example, this is a storage boot device and I need to install the driver before Windows installed.

 

Thanks,

James

 

________________________________

From: ofw-bounces at lists.openfabrics.org [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Slava Strebkov
Sent: Tuesday, April 29, 2008 6:31 AM
To: ofw at lists.openfabrics.org
Subject: [OFW][patch] partition tool

 

Attached patch implements partition feature. 

Application (part_man.exe) is used for adding and removing partition key values from ibbus service registry entry.

When adding a new pkey, an IOCTL contained new pkey value(s) is send to ibbus. New pdo(s) created for requested pkey value(s).

 

Upon reboot, ibbus reads registry and creates new pdo(s) for found pkey value(s).

 

Index: core/al/al_dev.h

===================================================================

--- core/al/al_dev.h        (revision 1081)

+++ core/al/al_dev.h      (working copy)

@@ -56,7 +56,14 @@

 

 #define AL_IOCTL_VERSION                            (4)

 

+/* max number of devices with non-default pkey */

+#define           MAX_NUM_PKEY          16

 

+typedef struct _pkey_array

+{

+          ib_net16_t            pkey_num;

+          ib_net16_t     pkey_array[MAX_NUM_PKEY];

+}pkey_array_t;

 #ifdef   CL_KERNEL

 

 /* Function prototypes for al device framework */

@@ -82,6 +89,9 @@

            IN                                             DEVICE_OBJECT                                             *p_dev_obj,

            IN                                             IRP                                                                               *p_irp );

 

+cl_status_t

+bus_add_pkey(

+          IN                                             cl_ioctl_handle_t                                    h_ioctl );

 

 /* Define data structures for user-mode proxy */

 #else               /* CL_KERNEL */

@@ -132,7 +142,7 @@

            ual_bind_cq,

            ual_bind_destroy,

            ual_bind_nd,

-

+          ual_req_create_pdo,

            al_proxy_maxops

 

 }          al_proxy_ops_t;

@@ -156,6 +166,7 @@

 #define UAL_BIND_CQ                         IOCTL_CODE(ALDEV_KEY, ual_bind_cq)

 #define UAL_BIND_DESTROY  IOCTL_CODE(ALDEV_KEY, ual_bind_destroy)

 #define UAL_BIND_ND                         IOCTL_CODE(ALDEV_KEY, ual_bind_nd)

+#define UAL_REQ_CREATE_PDO  IOCTL_CODE(ALDEV_KEY, ual_req_create_pdo)

 

 #define AL_PROXY_OPS_START          IOCTL_CODE(ALDEV_KEY, al_proxy_ops_start)

 #define AL_PROXY_MAXOPS               IOCTL_CODE(ALDEV_KEY, al_proxy_maxops)

Index: core/al/kernel/al_proxy.c

===================================================================

--- core/al/kernel/al_proxy.c        (revision 1081)

+++ core/al/kernel/al_proxy.c     (working copy)

@@ -705,6 +705,9 @@

            case UAL_BIND_ND:

                        cl_status = proxy_bind_file( h_ioctl, AL_OBJ_TYPE_NDI );

                        break;

+          case UAL_REQ_CREATE_PDO:

+                      cl_status = bus_add_pkey( h_ioctl);

+                      break;

            default:

                        cl_status = CL_INVALID_PARAMETER;

                        break;

Index: core/bus/kernel/bus_driver.c

===================================================================

--- core/bus/kernel/bus_driver.c  (revision 1081)

+++ core/bus/kernel/bus_driver.c           (working copy)

@@ -42,8 +42,8 @@

 #include "al_dev.h"

 #include "al_debug.h"

 #include <complib/cl_init.h>

+#include "iba/ipoib_ifc.h"

 

-

 #if defined(EVENT_TRACING)

 #ifdef offsetof

 #undef offsetof

@@ -56,8 +56,9 @@

 #else

 #define DEFAULT_NODE_DESC           "OpenIB Windows(r) Host"

 #endif

+/* pkey array to be read */

+pkey_array_t  g_pkeys;

 

-

 char    node_desc[IB_NODE_DESCRIPTION_SIZE];

 

 bus_globals_t   bus_globals = {

@@ -181,24 +182,160 @@

                        RtlStringCbCopyNA( node_desc, sizeof(node_desc),

                                    DEFAULT_NODE_DESC, sizeof(DEFAULT_NODE_DESC) );

            }

-

+}

+/************************************************************************************

+* name            :           __prepare_pKey_array

+*           parses registry string and exrtacts pkey value(s) from it.

+*                                 pkey pattern is 0xABCD

+* input :           UNICODE_STRING *str

+* output:          pkey_array

+* return:          uint16_t number of pkey(s) found

+*************************************************************************************/

+static uint16_t __prepare_pKey_array(IN const UNICODE_STRING *str, OUT uint16_t *pkey_array)

+{

+          uint16_t i, num_pKeys, cur_pkey_length;

+          NTSTATUS status;

+          ANSI_STRING ansi_str;

+          static const uint16_t PATTERN_LENGTH = 6;

            BUS_ENTER( BUS_DBG_DRV );

-}

 

+          CL_ASSERT(pkey_array);

+          CL_ASSERT(str);

 

+          num_pKeys = 0;

+    cur_pkey_length = 0;

+

+          status = RtlUnicodeStringToAnsiString(&ansi_str,str,TRUE);

+          if(! NT_SUCCESS(status))

+          {

+                      BUS_TRACE(BUS_DBG_ERROR ,

+                      ("RtlUnicodeStringToAnsiString returned 0x%.8x\n", status) );

+                      return 0;

+          }

+          

+          for (i = 0; (i < ansi_str.MaximumLength) && (num_pKeys < MAX_NUM_PKEY) ; i++)

+    {

+                      switch(ansi_str.Buffer[i])

+                      {

+                      case '0':

+                                  cur_pkey_length++;

+                                  if (((i+1) < ansi_str.Length) && ( ( ansi_str.Buffer[i+1] == 'x') || ( ansi_str.Buffer[i+1] == 'X')))

+                                              break;

+                                  else

+                                  {

+                                              pkey_array[num_pKeys] = \

+                                              (pkey_array[num_pKeys] << 4)| 0;

+                                              break;

+                                  }

+

+                      case 'x':

+                      case 'X':

+                                  cur_pkey_length++;

+                                  break;

+

+                      case ',':

+                                  if(cur_pkey_length == PATTERN_LENGTH)

+                                  {

+                                              cur_pkey_length = 0;

+                                              num_pKeys++;

+                                  }

+                                  break;

+

+                      case 'A':

+                      case 'a':

+                                  pkey_array[num_pKeys] = \

+                                  (pkey_array[num_pKeys] << 4)| 0xA;

+                                  cur_pkey_length++;

+                                  break;

+

+                      case 'B':

+                      case 'b':

+                                  pkey_array[num_pKeys] = \

+                                  (pkey_array[num_pKeys] << 4)| 0xB;

+                                  cur_pkey_length++;

+                                  break;

+

+                      case 'C':

+                      case 'c':

+                                  pkey_array[num_pKeys] = \

+                                  (pkey_array[num_pKeys] << 4)| 0xC;

+                                  cur_pkey_length++;

+                                  break;

+

+                      case 'D':

+                      case 'd':

+                                  pkey_array[num_pKeys] = \

+                                  (pkey_array[num_pKeys] << 4)| 0xD;

+                                  cur_pkey_length++;

+                                  break;

+

+                      case 'E':

+                      case 'e':

+                                  pkey_array[num_pKeys] = \

+                                  (pkey_array[num_pKeys] << 4)| 0xE;

+                                  cur_pkey_length++;

+                                  break;

+

+                      case 'F':

+                      case 'f':

+                                  pkey_array[num_pKeys] = \

+                                  (pkey_array[num_pKeys] << 4)| 0xF;

+                                  cur_pkey_length++;

+                                  break;

+

+                      case '1':

+                      case '2':

+                      case '3':

+                      case '4':

+                      case '5':

+                      case '6':

+                      case '7':

+                      case '8':

+                      case '9':

+                                  pkey_array[num_pKeys] = \

+                                  (pkey_array[num_pKeys] << 4)| (ansi_str.Buffer[i] - '0');

+                                  cur_pkey_length++;

+                                  break;

+                                  

+                      case '\0':

+                                  if(cur_pkey_length == PATTERN_LENGTH)

+                                  {

+                                              cur_pkey_length = 0;

+                                              num_pKeys++;

+                                  }

+                                  else

+                                  {

+                                              RtlFreeAnsiString(&ansi_str);

+                                              return num_pKeys;

+                                  }

+                                  break;

+

+                      default:

+                                  break;

+

+                      }

+          }

+

+    RtlFreeAnsiString(&ansi_str);

+          BUS_EXIT( BUS_DBG_DRV );

+          return num_pKeys;

+}

 static NTSTATUS

 __read_registry(

            IN                                             UNICODE_STRING* const                     p_registry_path )

 {

            NTSTATUS                                                        status;

            /* Remember the terminating entry in the table below. */

-           RTL_QUERY_REGISTRY_TABLE           table[9];

+          RTL_QUERY_REGISTRY_TABLE           table[10];

            UNICODE_STRING                                            param_path;

+          UNICODE_STRING                                            pkeyString;

+          UNICODE_STRING                                            empy_string;

 

            BUS_ENTER( BUS_DBG_DRV );

 

            __read_machine_name();

 

+          RtlInitUnicodeString( &empy_string,NULL);

            RtlInitUnicodeString( &param_path, NULL );

            param_path.MaximumLength = p_registry_path->Length + 

                        sizeof(L"\\Parameters");

@@ -212,7 +349,19 @@

 

            RtlAppendUnicodeStringToString( &param_path, p_registry_path );

            RtlAppendUnicodeToString( &param_path, L"\\Parameters" );

+          RtlInitUnicodeString( &pkeyString, NULL );

+    pkeyString.MaximumLength = 1024*sizeof(WCHAR);

+    pkeyString.Buffer = cl_zalloc( pkeyString.MaximumLength );

+    if( !pkeyString.Buffer )

+          {

+                      cl_free(param_path.Buffer);

+                      BUS_TRACE_EXIT( BUS_DBG_ERROR,

+                      ("Failed to allocate parameters path pkeyString.\n") );

+        return STATUS_INSUFFICIENT_RESOURCES;

+    }

 

+          cl_memclr(&g_pkeys,sizeof(pkey_array_t));

+

            /*

             * Clear the table.  This clears all the query callback pointers,

             * and sets up the terminating table entry.

@@ -277,10 +426,17 @@

            table[7].DefaultData = &g_ioc_poll_interval;

            table[7].DefaultLength = sizeof(ULONG);

 

+          table[8].Flags = RTL_QUERY_REGISTRY_DIRECT;

+          table[8].Name = L"PartitionKey";

+          table[8].EntryContext = &pkeyString;

+          table[8].DefaultType  = REG_SZ;

+          table[8].DefaultData  = &empy_string;

+          table[8].DefaultLength = 1024*sizeof(WCHAR);

            /* Have at it! */

            status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, 

                        param_path.Buffer, table, NULL, NULL );

-

+          if (NT_SUCCESS(status))

+                                  g_pkeys.pkey_num = __prepare_pKey_array(&pkeyString, (uint16_t*)g_pkeys.pkey_array);

 #if DBG

            if( g_al_dbg_flags & AL_DBG_ERR )

                        g_al_dbg_flags |= CL_DBG_ERROR;

@@ -291,6 +447,7 @@

                                    g_al_dbg_level,

                                    g_al_dbg_flags));

 

+          cl_free( pkeyString.Buffer );

            cl_free( param_path.Buffer );

            BUS_EXIT( BUS_DBG_DRV );

            return status;

@@ -419,7 +576,38 @@

            return status;

 }

 

+cl_status_t

+bus_add_pkey(cl_ioctl_handle_t                                    h_ioctl)

+{

+          cl_status_t                                             status;

+          pkey_array_t                                         *pkeys;

+          PIO_STACK_LOCATION                                    pIoStack;

 

+          BUS_ENTER( BUS_DBG_DRV );

+

+          pIoStack = IoGetCurrentIrpStackLocation(h_ioctl);

+          if ( (! h_ioctl->AssociatedIrp.SystemBuffer) || 

+                      pIoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof (pkey_array_t))

+    {

+                      BUS_TRACE_EXIT( BUS_DBG_ERROR, 

+                                  ("Invalid parameters.\n") );

+                      return CL_INVALID_PARAMETER;

+          }

+

+          pkeys =  (pkey_array_t*)h_ioctl->AssociatedIrp.SystemBuffer;

+

+          /* create additional pdo */

+          status = port_mgr_pkey_add(pkeys);

+          if (! NT_SUCCESS(status))

+          {

+                      BUS_TRACE_EXIT( BUS_DBG_ERROR, 

+                                  ("port_mgr_pkey_add returned %08x.\n", status) );

+          }

+

+          BUS_EXIT( BUS_DBG_DRV );

+          return status;

+}

+

 static NTSTATUS

 bus_drv_sysctl(

            IN                                             DEVICE_OBJECT                                             *p_dev_obj,

Index: core/bus/kernel/bus_pnp.h

===================================================================

--- core/bus/kernel/bus_pnp.h     (revision 1081)

+++ core/bus/kernel/bus_pnp.h  (working copy)

@@ -86,4 +86,5 @@

            IN                     const    net64_t                                                             ca_guid,

            IN                                             IRP* const                                                        p_irp );

 

+NTSTATUS port_mgr_pkey_add();

 #endif  // !defined _BUS_DRV_PNP_H_

Index: core/bus/kernel/bus_port_mgr.c

===================================================================

--- core/bus/kernel/bus_port_mgr.c         (revision 1081)

+++ core/bus/kernel/bus_port_mgr.c       (working copy)

@@ -42,8 +42,8 @@

 #include <initguid.h>

 #include <wdmguid.h>

 #include "iba/ipoib_ifc.h"

+#include "al_dev.h"

 

-

 #define IPOIB_DEVICE_ID                               L"IBA\\IPoIB"

 #define IPOIB_COMPAT_ID                              L"IBA\\SID_1000066a00020000\0\0"

 /* Hardware ID is a MULTI_SZ, so is terminated with a double NULL. */

@@ -62,7 +62,7 @@

 {

            bus_pdo_ext_t                           pdo;

 

-           net64_t                                                 port_guid;

+          port_guid_pkey                          port_guid;

            uint32_t                                     n_port;

 

            /* Number of references on the upper interface. */

@@ -73,7 +73,9 @@

 

 port_mgr_t*                                                                  gp_port_mgr = NULL;

 

+extern pkey_array_t  g_pkeys;

 

+static boolean_t pkeys_enumerated = FALSE;

 /*

  * Function prototypes.

  */

@@ -512,8 +514,7 @@

                        p_pdo_ext = PARENT_STRUCT( p_list_item, bus_pdo_ext_t, list_item );

                        p_port_ext = (bus_port_ext_t*)p_pdo_ext;

            

-                       if( p_pdo_ext->b_present && p_pdo_ext->b_hibernating &&

-                                   (p_port_ext->port_guid == p_pnp_rec->p_port_attr->port_guid) )

+                      if( p_pdo_ext->b_present && p_pdo_ext->b_hibernating && (p_port_ext->port_guid.guid == p_pnp_rec->p_port_attr->port_guid))

                        {

                                    n_devs++;

                                    break;

@@ -523,7 +524,7 @@

                                    ("Skipped PDO for %s: PDO %p, ext %p, present %d, missing %d, hibernating %d, port_guid %I64x.\n",

                                    p_pdo_ext->cl_ext.vfptr_pnp_po->identity, p_pdo_ext->cl_ext.p_self_do, 

                                    p_pdo_ext, p_pdo_ext->b_present, p_pdo_ext->b_reported_missing, 

-                                   p_pdo_ext->b_hibernating, p_port_ext->port_guid ) );

+                                  p_pdo_ext->b_hibernating, p_port_ext->port_guid.guid  ) );

            }

 

            if (n_devs)

@@ -546,7 +547,7 @@

                                                ("Found PDO for %s: PDO %p, ext %p, present %d, missing %d, hibernating %d, port_guid %I64x.\n",

                                                p_pdo_ext->cl_ext.vfptr_pnp_po->identity, p_pdo_ext->cl_ext.p_self_do, 

                                                p_pdo_ext, p_pdo_ext->b_present, p_pdo_ext->b_reported_missing, 

-                                               p_pdo_ext->b_hibernating, p_port_ext->port_guid ) );

+                                              p_pdo_ext->b_hibernating, p_port_ext->port_guid.guid ) );

                        }

            }

            else 

@@ -567,9 +568,10 @@

            IN                                             ib_pnp_port_rec_t*                                p_pnp_rec )

 {

            NTSTATUS                    status;

-           DEVICE_OBJECT         *p_pdo;

+    DEVICE_OBJECT   *p_pdo[MAX_NUM_PKEY + 1];

+    uint8_t         num_pdo;

            bus_port_ext_t   *p_port_ext;

-

+          ib_net16_t      pdo_cnt;

            BUS_ENTER( BUS_DBG_PNP );

 

            if( !bus_globals.b_report_port_nic )

@@ -588,11 +590,20 @@

                        return status;

            }

 

+    p_port_ext = NULL;

+

+          if( pkeys_enumerated)

+                      pdo_cnt = 1;

+          else

+                      pdo_cnt = g_pkeys.pkey_num + 1;

+

+    for (num_pdo = 0; num_pdo < pdo_cnt; num_pdo++)

+    {

            /* Create the PDO for the new port device. */

            status = IoCreateDevice( bus_globals.p_driver_obj, sizeof(bus_port_ext_t),

                        NULL, FILE_DEVICE_CONTROLLER,

                        FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,

-                       FALSE, &p_pdo );

+                                  FALSE, &p_pdo[num_pdo] );

            if( !NT_SUCCESS( status ) )

            {

                        BUS_TRACE_EXIT( BUS_DBG_ERROR,

@@ -601,13 +612,13 @@

            }

 

            /* Initialize the device extension. */

-           cl_init_pnp_po_ext( p_pdo, NULL, p_pdo, bus_globals.dbg_lvl,

+                      cl_init_pnp_po_ext( p_pdo[num_pdo], NULL, p_pdo[num_pdo], bus_globals.dbg_lvl,

                        &vfptr_port_pnp, &vfptr_port_query_txt );

 

            /* Set the DO_BUS_ENUMERATED_DEVICE flag to mark it as a PDO. */

-           p_pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;

+                      p_pdo[num_pdo]->Flags |= DO_BUS_ENUMERATED_DEVICE;

 

-           p_port_ext = p_pdo->DeviceExtension;

+                      p_port_ext = p_pdo[num_pdo]->DeviceExtension;

            p_port_ext->pdo.dev_po_state.DeviceState = PowerDeviceD0;

            p_port_ext->pdo.p_parent_ext = bus_globals.p_bus_ext;

            p_port_ext->pdo.b_present = TRUE;

@@ -615,24 +626,34 @@

            p_port_ext->pdo.b_hibernating = FALSE;

            p_port_ext->pdo.p_po_work_item = NULL;

            BUS_TRACE( BUS_DBG_PNP, ("Created device for %s: PDO %p,ext %p, present %d, missing %d .\n",

-                       p_port_ext->pdo.cl_ext.vfptr_pnp_po->identity, p_pdo, p_port_ext, p_port_ext->pdo.b_present, 

+                                  p_port_ext->pdo.cl_ext.vfptr_pnp_po->identity, p_pdo[num_pdo], p_port_ext, p_port_ext->pdo.b_present, 

                        p_port_ext->pdo.b_reported_missing ) );

 

            /* Cache the CA GUID. */

            p_port_ext->pdo.ca_guid = p_pnp_rec->p_ca_attr->ca_guid;

 

            /* Take a reference on the parent HCA. */

+                      if(num_pdo > 0)

+                      {

+                                  p_port_ext->pdo.h_ca = ((bus_port_ext_t*)p_pdo[0]->DeviceExtension)->pdo.h_ca;

+                      }

+                      else

            p_port_ext->pdo.h_ca = acquire_ca( p_pnp_rec->p_ca_attr->ca_guid );

            if( !p_port_ext->pdo.h_ca )

            {

-                       BUS_TRACE( BUS_DBG_PNP, ("Deleted device: PDO %p\n", p_pdo ));

-                       IoDeleteDevice( p_pdo );

+                                  BUS_TRACE( BUS_DBG_PNP, ("Deleted device: PDO %p\n", p_pdo[num_pdo]));

+                                  IoDeleteDevice( p_pdo[num_pdo]);

                        BUS_TRACE_EXIT( BUS_DBG_ERROR, ("acquire_ca failed to find CA.\n") );

                        return IB_INVALID_GUID;

            }

-           p_port_ext->port_guid = p_pnp_rec->p_port_attr->port_guid;

+                      p_port_ext->port_guid.guid = p_pnp_rec->p_port_attr->port_guid;

            p_port_ext->n_port = p_pnp_rec->p_port_attr->port_num;

+                      p_port_ext->port_guid.pkey = IB_DEFAULT_PKEY;

 

+                      if(num_pdo > 0)

+                      {

+                        p_port_ext->port_guid.pkey = g_pkeys.pkey_array[num_pdo -1];

+                      }

            /* Store the device extension in the port vector for future queries. */

            cl_mutex_acquire( &gp_port_mgr->pdo_mutex );

            cl_qlist_insert_tail( &gp_port_mgr->port_list,

@@ -643,7 +664,10 @@

             * Set the context of the PNP event.  The context is passed in for future

             * events on the same port.

             */

-           p_pnp_rec->pnp_rec.context = p_port_ext;

+                      if(num_pdo == 0)

+                                  p_pnp_rec->pnp_rec.context = p_port_ext;

+          }

+          pkeys_enumerated = TRUE;

 

            /* Tell the PnP Manager to rescan for the HCA's bus relations. */

            IoInvalidateDeviceRelations(

@@ -657,7 +681,107 @@

            return IB_SUCCESS;

 }

 

+/************************************************************************************

+* name            :           port_mgr_pkey_add

+*           creates pdo for each pkey value in pkey_array 

+* input :           g_pkeys

+* output:          none

+* return:          cl_status

+*************************************************************************************/

+cl_status_t port_mgr_pkey_add(pkey_array_t *pkeys)

+{

+          uint16_t                                     cnt;

+          NTSTATUS            status;

+          cl_list_item_t                  *p_list_item;

+          bus_port_ext_t               *p_port_ext, *pkey_port_ext;

+          DEVICE_OBJECT       *p_pdo[MAX_NUM_PKEY];

+          bus_pdo_ext_t               *p_pdo_ext = NULL;

+          cl_qlist_t*                                  p_pdo_list = &gp_port_mgr->port_list;

 

+          BUS_ENTER( BUS_DBG_PNP );

+

+          p_port_ext = NULL;

+          cl_mutex_acquire( &gp_port_mgr->pdo_mutex );

+          

+          /* Count the number of child devices. */

+          for( p_list_item = cl_qlist_head( p_pdo_list );

+                      p_list_item != cl_qlist_end( p_pdo_list );

+                      p_list_item = cl_qlist_next( p_list_item ) )

+          {

+                      p_pdo_ext = PARENT_STRUCT( p_list_item, bus_pdo_ext_t, list_item );

+                      p_port_ext = (bus_port_ext_t*)p_pdo_ext;

+

+                      if(p_port_ext->port_guid.pkey != IB_DEFAULT_PKEY)

+                                  break;

+          }

+          cl_mutex_release( &gp_port_mgr->pdo_mutex );

+

+          if (!p_port_ext)

+          {

+                      BUS_TRACE_EXIT( BUS_DBG_ERROR,

+                                  ("No existed pdo found.\n") );

+                      return CL_ERROR;

+          }

+

+    for (cnt = 0; cnt < pkeys->pkey_num; cnt++)

+    {

+

+                      /* Create the PDO for the new port device. */

+                      status = IoCreateDevice( bus_globals.p_driver_obj, sizeof(bus_port_ext_t),

+                                  NULL, FILE_DEVICE_CONTROLLER,

+                                  FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,

+                                  FALSE, &p_pdo[cnt] );

+                      if( !NT_SUCCESS( status ) )

+                      {

+                                  BUS_TRACE_EXIT( BUS_DBG_ERROR,

+                                              ("IoCreateDevice returned %08x.\n", status) );

+                                  return CL_ERROR;

+                      }

+          

+                      /* Initialize the device extension. */

+                      cl_init_pnp_po_ext( p_pdo[cnt], NULL, p_pdo[cnt], bus_globals.dbg_lvl,

+                                  &vfptr_port_pnp, &vfptr_port_query_txt );

+          

+                      /* Set the DO_BUS_ENUMERATED_DEVICE flag to mark it as a PDO. */

+                      p_pdo[cnt]->Flags |= DO_BUS_ENUMERATED_DEVICE;

+          

+                      pkey_port_ext = p_pdo[cnt]->DeviceExtension;

+                      pkey_port_ext->pdo.dev_po_state.DeviceState = PowerDeviceD0;

+                      pkey_port_ext->pdo.p_parent_ext = bus_globals.p_bus_ext;

+                      pkey_port_ext->pdo.b_present = TRUE;

+                      pkey_port_ext->pdo.b_reported_missing = FALSE;

+                      pkey_port_ext->pdo.b_hibernating = FALSE;

+                      pkey_port_ext->pdo.p_po_work_item = NULL;

+                      BUS_TRACE( BUS_DBG_PNP, ("Created device for %s: PDO %p,ext %p, present %d, missing %d .\n",

+                                  pkey_port_ext->pdo.cl_ext.vfptr_pnp_po->identity, p_pdo[cnt], pkey_port_ext, pkey_port_ext->pdo.b_present, 

+                                  pkey_port_ext->pdo.b_reported_missing ) );

+          

+                      /* Cache the CA GUID. */

+                      pkey_port_ext->pdo.ca_guid = p_port_ext->pdo.ca_guid;

+                      pkey_port_ext->pdo.h_ca = p_port_ext->pdo.h_ca;

+                      pkey_port_ext->port_guid.guid = p_port_ext->port_guid.guid;

+                      pkey_port_ext->n_port = p_port_ext->n_port;

+                      pkey_port_ext->port_guid.pkey = pkeys->pkey_array[cnt];

+

+                      /* Store the device extension in the port vector for future queries. */

+                      cl_mutex_acquire( &gp_port_mgr->pdo_mutex );

+                      cl_qlist_insert_tail( &gp_port_mgr->port_list,

+                                  &pkey_port_ext->pdo.list_item );

+                      cl_mutex_release( &gp_port_mgr->pdo_mutex );

+          }

+

+          /* Tell the PnP Manager to rescan for the HCA's bus relations. */

+          IoInvalidateDeviceRelations(

+                      p_port_ext->pdo.h_ca->obj.p_ci_ca->verbs.p_hca_dev, BusRelations );

+

+          /* Invalidate removal relations for the bus driver. */

+          IoInvalidateDeviceRelations(

+                      bus_globals.p_bus_ext->cl_ext.p_pdo, RemovalRelations );

+

+          BUS_EXIT( BUS_DBG_PNP );

+          return CL_SUCCESS;

+}

+

 void

 port_mgr_port_remove(

            IN                                             ib_pnp_port_rec_t*                                p_pnp_rec )

@@ -1063,16 +1187,16 @@

            }

 

            /* The instance ID is the port GUID. */

-           p_string = ExAllocatePoolWithTag( PagedPool, sizeof(WCHAR) * 17, 'iuqp' );

+          p_string = ExAllocatePoolWithTag( PagedPool, sizeof(WCHAR) * 21, 'iuqp' );

            if( !p_string )

            {

                        BUS_TRACE_EXIT( BUS_DBG_ERROR,

                                    ("Failed to allocate instance ID buffer (%d bytes).\n",

-                                   sizeof(WCHAR) * 17) );

+                                  sizeof(WCHAR) * 21) );

                        return STATUS_NO_MEMORY;

            }

 

-           status = RtlStringCchPrintfW( p_string, 17, L"%016I64x", p_ext->port_guid );

+          status = RtlStringCchPrintfW( p_string, 21, L"%016I64x%04x",p_ext->port_guid.guid,p_ext->port_guid.pkey );

            if( !NT_SUCCESS( status ) )

            {

                        CL_ASSERT( NT_SUCCESS( status ) );

Index: core/bus/kernel/ib_bus.inf

===================================================================

--- core/bus/kernel/ib_bus.inf      (revision 1081)

+++ core/bus/kernel/ib_bus.inf   (working copy)

@@ -183,6 +183,7 @@

 HKR,"Parameters","IocQueryTimeout",%REG_DWORD_NO_CLOBBER%,250

 HKR,"Parameters","IocQueryRetries",%REG_DWORD_NO_CLOBBER%,4

 HKR,"Parameters","IocPollInterval",%REG_DWORD_NO_CLOBBER%,30000

+HKR,"Parameters","PartitionKey",%REG_SZ%,""

 

 [Iou.ParamsReg]

 HKR,"Parameters","DebugLevel",%REG_DWORD%,2

Index: inc/kernel/iba/ipoib_ifc.h

===================================================================

--- inc/kernel/iba/ipoib_ifc.h        (revision 1081)

+++ inc/kernel/iba/ipoib_ifc.h     (working copy)

@@ -60,6 +60,16 @@

 *          ipoib_ifc_data_t

 *

 * DESCRIPTION

+

+*         The port guid combined from guid + PKEY 

+*/

+typedef struct _port_guid_pkey

+{

+          net64_t             guid;

+          ib_net16_t         pkey;

+} port_guid_pkey;

+

+/*

 *          IPoIB interface datat.

 *

 *          The ipoib_ifc_data_t structure 

@@ -69,7 +79,7 @@

 typedef struct _ipoib_ifc_data

 {

            net64_t                                                             ca_guid;

-           net64_t                                                             port_guid;

+          port_guid_pkey                                      port_guid;

            uint8_t                                                              port_num;

 

 }          ipoib_ifc_data_t;

Index: tools/part_man/dirs

===================================================================

--- tools/part_man/dirs    (revision 0)

+++ tools/part_man/dirs (revision 0)

@@ -0,0 +1,2 @@

+DIRS=\

+          user

Index: tools/part_man/dirs

===================================================================

--- tools/part_man/dirs    (revision 0)

+++ tools/part_man/dirs (revision 0)

@@ -0,0 +1,2 @@

+DIRS=\

+          user

Index: tools/part_man/user/part_man.c

===================================================================

--- tools/part_man/user/part_man.c         (revision 0)

+++ tools/part_man/user/part_man.c       (revision 0)

@@ -0,0 +1,385 @@

+

+

+

+#include "stdio.h"

+#include "string.h"

+#include "stdlib.h"

+#include <windows.h>

+

+#include <iba/ib_types.h>

+#include <iba/ib_al.h>

+#include "al_dev.h"

+

+typedef enum

+{

+          pkey_show = 0,

+          pkey_add,

+          pkey_rem

+}Pkey_action;

+

+/* common query parameters */

+typedef struct _REQUEST_IN

+{

+          union

+          {

+                      struct

+                      {

+                                  unsigned short     pkey_num;

+                                  unsigned __int16   pkeys[MAX_NUM_PKEY];

+                                  Pkey_action                     action;

+                      }guid_pkey;

+                      }u;

+}REQUEST_IN;

+

+#define           DEFAULT_BUFER_SIZE            1024

+static const char IBBUS_SERV_KEY[] = {"SYSTEM\\CurrentControlSet\\Services\\ibbus\\Parameters"};

+

+void show_help()

+{

+          printf("Usage : part_man.exe <show|add|rem> <pkey1 pkey2 ...>\n");

+}

+

+/********************************************************************

+* name            :           reg_ibbus_pkey_show

+*                                 read registry pkey and optionally prints it

+* input :           show - whether to print

+* output:          partKey - contains read pkeys, reg_handle

+* return:   number of characters read

+********************************************************************/

+static int reg_ibbus_pkey_show(IN BOOLEAN show,OUT char *partKey, OUT HKEY *reg_handle)

+{

+          LONG   ret;

+          int retval;

+          DWORD  read_length = DEFAULT_BUFER_SIZE;

+

+          ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,IBBUS_SERV_KEY,0,KEY_SET_VALUE | KEY_QUERY_VALUE ,reg_handle);

+          if (ERROR_SUCCESS != ret)

+          {

+                      printf("reg_ibbus_pkey_show error = %d\n",GetLastError());

+                      return 0;

+          }           

+

+          do

+          {

+                      ret = RegQueryValueEx(*reg_handle,"PartitionKey",NULL,NULL,(LPBYTE)partKey,&read_length);

+                      if (ERROR_MORE_DATA == ret)

+                      {

+                                  printf("reg_ibbus_pkey_show : more buffer space required\n");

+                                  retval = 0;

+                                  break;

+                      }

+

+                      if (ERROR_SUCCESS != ret)

+                      {

+                                  printf("RegQueryValueEx : Error %d\n",ret);

+                                  retval = 0;

+                                  break;

+                      }

+                      retval = (int)read_length;

+                      if(retval > 4)

+                      {

+                                  if(show)

+                                              printf("Existed Pkey(s): %s\n",partKey);

+                      }

+                      else

+                                  retval = 0;

+          }

+          while(FALSE);

+          return retval;

+}

+

+static boolean_t reg_ibbus_print_pkey()

+{

+          int result;

+          char pkeyBuf[DEFAULT_BUFER_SIZE];

+          HKEY hreg = NULL;

+

+          result = reg_ibbus_pkey_show(TRUE,(char*)pkeyBuf,&hreg);

+          if(hreg)

+                      RegCloseKey( hreg );

+

+          if (result < 4)

+          {

+                      printf("No configured pkey found\n");

+                      return FALSE;

+          }

+          return TRUE;

+}

+

+static int reg_ibbus_pkey_add(const uint16_t *pkeys, uint16_t pkey_num,OUT pkey_array_t *pkey)

+{

+          char partKey[DEFAULT_BUFER_SIZE];

+          char tmp[10];

+          HKEY reg_handle;

+          LONG   ret;

+          int cnt;

+          int retval = 0;

+          uint16_t i = 0;

+          DWORD  read_length;

+

+          read_length = reg_ibbus_pkey_show(FALSE,(char*)partKey,&reg_handle);

+

+          if (read_length < 4)

+          {

+                      /* empty string read, simply write to registry */

+                      cnt = sprintf(partKey,"0x%04X",pkeys[0]);

+                      pkey->pkey_array[pkey->pkey_num] = pkeys[0];

+                      pkey->pkey_num++;

+                      i = 1;

+          }

+          else

+          {

+                      /* update the existed registry list */

+                      cnt = (int)strlen(partKey);

+                      i = 0;

+          }           

+

+          for ( ;i < pkey_num; i++)

+          {

+                      sprintf(tmp,"0x%04X",pkeys[i]);

+                      if (strstr(partKey,tmp))

+                      {

+                                  continue;

+                      }

+                      pkey->pkey_array[pkey->pkey_num] = pkeys[i];

+                      pkey->pkey_num++;

+                      cnt += sprintf(partKey + cnt,",0x%04X",pkeys[i]);

+          }

+          cnt += sprintf(partKey + cnt,"\0");

+

+          if(pkey->pkey_num)

+          {

+                      ret = RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)partKey, (DWORD)cnt);

+                      if (ERROR_SUCCESS != ret)

+                      {

+                                  printf("reg_ibbus_pkey_add RegSetValueEx error = %d\n",GetLastError());

+                                  retval = 1;

+                      }

+          }

+          else

+                      printf("No pkey to add\n");

+          RegCloseKey( reg_handle );

+          return retval;

+}

+

+static int reg_ibbus_pkey_rem(const unsigned __int16 *pkeys, unsigned short pkey_num,OUT pkey_array_t *pkey)

+{

+          char partKey[DEFAULT_BUFER_SIZE];

+          char newKey[DEFAULT_BUFER_SIZE] = {'\0'};

+

+          HKEY reg_handle;

+          LONG   ret;

+          DWORD  read_length;

+          int converted,cnt;

+          unsigned __int16 cur_pkey;

+          int retval = 0;

+          unsigned short i = 0;

+          char seps[] = ",";

+          char *token;

+          boolean_t found2remove;

+

+          read_length = reg_ibbus_pkey_show(FALSE,(char*)partKey,&reg_handle);

+          do

+          {

+                      if (read_length < 4)

+                      {

+                                  /* empty string read, nothing to delete */

+                                  printf("No pkey configured - nothing to remove\n");

+                                  retval = 1;

+                                  break;

+                      }

+

+                      token = strtok(partKey,seps);

+                      cnt = 0;

+                      while(token)

+                      {

+                                  found2remove = FALSE;

+                                  converted = sscanf(token,"0x%X",&cur_pkey);

+                                  if(! converted || (converted == EOF))

+                                  {

+                                              printf("invalid registry format\n");

+                                              retval = 1;

+                                              break;

+                                  }

+                                  for (i = 0; i < pkey_num; i++)

+                                  {

+                                              found2remove = (boolean_t)(cur_pkey == pkeys[i]);

+                                              if(found2remove)

+                                                          break;

+                                  }

+                                  

+                                  if(found2remove)

+                                  {

+                                              pkey->pkey_num++;

+                                  }

+                                  else

+                                  {

+                                              if(!cnt)

+                                                          cnt += sprintf(newKey + cnt,"0x%04X",cur_pkey);

+                                              else

+                                                          cnt += sprintf(newKey + cnt,",0x%04X",cur_pkey);

+                                  }

+                                  token = strtok(NULL,seps);

+                      }

+

+                      if(! pkey->pkey_num)

+                      {

+                                  /* nothing to delete */

+                                  printf("No pkey found to remove\n");

+                                  retval = 1;

+                                  break;

+                      }

+

+                      ret = RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)newKey, (DWORD)strlen(newKey));

+                      if (ERROR_SUCCESS != ret)

+                      {

+                                  printf("reg_ibbus_pkey_add RegSetValueEx error = %d\n",GetLastError());

+                                  retval = 1;

+                                  break;

+                      }

+          }

+          while(FALSE);

+

+          RegCloseKey( reg_handle );

+          return retval;

+}

+

+int send_create_pdo_req(pkey_array_t *pkeys)

+{

+          HANDLE hKernelLib;

+          DWORD                       bytesReturned;

+

+          hKernelLib =

+                      CreateFile(

+                      "\\\\.\\ibal",

+                      GENERIC_READ | GENERIC_WRITE,

+                      FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode none

+                      NULL,                               // no security

+                      OPEN_EXISTING,

+                      FILE_ATTRIBUTE_NORMAL,

+                      NULL                                // no template

+                      );

+

+          if (hKernelLib == INVALID_HANDLE_VALUE)

+          {

+                      printf("failed to open the kernel device : error = %d\n",GetLastError());

+                      return 1;

+          }

+

+          if (! DeviceIoControl(hKernelLib,

+                                                                        UAL_REQ_CREATE_PDO,

+                                                                        pkeys,sizeof(pkey_array_t),

+                                                                        NULL,0,

+                                                                        &bytesReturned,

+                                                                        NULL))

+          {

+                      printf("send_create_pdo_req failed error %d\n",GetLastError());

+                      CloseHandle(hKernelLib);

+                      return 1;

+          }

+          CloseHandle(hKernelLib);

+          return 0;

+}

+

+boolean_t reg_pkey_operation(const REQUEST_IN *input)

+{

+          pkey_array_t pkeys;

+          int result;

+          int i;

+          if(!input)

+          {

+                      printf("create_ipoib_pdo : invalid input parameter\n");

+                      return FALSE;

+          }

+

+          RtlZeroMemory(&pkeys,sizeof(pkeys));

+          if(input->u.guid_pkey.action == pkey_add)

+                      result = reg_ibbus_pkey_add((unsigned __int16*)input->u.guid_pkey.pkeys, input->u.guid_pkey.pkey_num, &pkeys);

+          else if(input->u.guid_pkey.action == pkey_rem)

+          {

+                      result = reg_ibbus_pkey_rem((unsigned __int16*)input->u.guid_pkey.pkeys, input->u.guid_pkey.pkey_num, &pkeys);

+                      return (boolean_t)(result == 0);

+          }

+          else if(input->u.guid_pkey.action == pkey_show)

+                      return reg_ibbus_print_pkey();

+

+          if(0 == result)

+          {

+                      if(pkeys.pkey_num)

+                                  return (boolean_t)( 0 == send_create_pdo_req(&pkeys));

+          }

+          return FALSE;

+}

+

+int prepare_reg_pkey_input(OUT REQUEST_IN *input,char* cmd[],int num)

+{

+          int i;

+          input->u.guid_pkey.pkey_num = 0;

+

+          if(strstr(cmd[1],"add"))

+                      input->u.guid_pkey.action = pkey_add;

+          else if(strstr(cmd[1],"rem"))

+                      input->u.guid_pkey.action = pkey_rem;

+          else if(strstr(cmd[1],"show"))

+          {

+                      input->u.guid_pkey.action = pkey_show;

+                      return 1;

+          }

+          else

+          {

+                      printf("invalid command %s\n",cmd[1]);

+                      return 0;

+          }

+

+          if(num < 3)

+          {

+                      printf("invalid command %s\n",cmd[1]);

+                      return 0;

+          }

+          for( i = 2; i < num; i++)

+          {

+                      if (strstr(cmd[i],"0x"))

+                                  sscanf(cmd[i],"0x%x",&input->u.guid_pkey.pkeys[input->u.guid_pkey.pkey_num]);

+                      else

+                                  sscanf(cmd[i],"%x",&input->u.guid_pkey.pkeys[input->u.guid_pkey.pkey_num]);

+

+                      input->u.guid_pkey.pkey_num++;

+          }

+          return 1;

+}

+

+void partition_operation(char* cmd[],int num)

+{

+          REQUEST_IN input;

+

+          if (! prepare_reg_pkey_input(&input, cmd, num))

+                      return;

+

+          if(! reg_pkey_operation(&input))

+                      printf("Pkey operation failed\n"); 

+          else

+                      printf("Done...\n");

+}

+

+int32_t __cdecl

+main(

+          int32_t argc,

+          char* argv[])

+{

+          BOOLEAN showHelp = FALSE;

+          if (argc < 2)

+          {

+                      showHelp = TRUE;

+          }

+          else

+          {

+                      if(!_stricmp(argv[1], "-h") || !_stricmp(argv[1], "-help"))

+                      {

+                                  showHelp = TRUE;

+                      }

+                      else

+                                  partition_operation(argv,argc);

+          }

+          if (showHelp)

+                      show_help();

+}

\ No newline at end of file

Index: tools/part_man/user/SOURCES

===================================================================

--- tools/part_man/user/SOURCES          (revision 0)

+++ tools/part_man/user/SOURCES        (revision 0)

@@ -0,0 +1,23 @@

+TARGETNAME=part_man

+TARGETPATH=..\..\..\bin\user\obj$(BUILD_ALT_DIR)

+TARGETTYPE=PROGRAM

+UMTYPE=console

+USE_CRTDLL=1

+

+SOURCES=part_man.c \

+          part_man.rc

+          

+INCLUDES=..\..\..\inc;..\..\..\inc\user;..\..\..\core\al

+

+RCOPTIONS=/I..\..\win\include

+

+TARGETLIBS= \

+!if $(FREEBUILD)

+                                  $(TARGETPATH)\*\complib.lib \

+                                  $(TARGETPATH)\*\ibal.lib

+!else

+                                  $(TARGETPATH)\*\complibd.lib \

+                                  $(TARGETPATH)\*\ibald.lib

+!endif

+

+MSC_WARNING_LEVEL= /W3

Index: tools/part_man/user/part_man.rc

===================================================================

--- tools/part_man/user/part_man.rc        (revision 0)

+++ tools/part_man/user/part_man.rc      (revision 0)

@@ -0,0 +1,18 @@

+

+

+

+#include <oib_ver.h>

+

+#define VER_FILETYPE                                              VFT_APP

+#define VER_FILESUBTYPE                                        VFT2_UNKNOWN

+

+#ifdef _DEBUG_

+#define VER_FILEDESCRIPTION_STR             "Partition manager application(Debug)"

+#else

+#define VER_FILEDESCRIPTION_STR             "Partition manager application"

+#endif

+

+#define VER_INTERNALNAME_STR                 "part_man.exe"

+#define VER_ORIGINALFILENAME_STR          "part_man.exe"

+

+#include <common.ver>

Index: tools/part_man/user/makefile

===================================================================

--- tools/part_man/user/makefile  (revision 0)

+++ tools/part_man/user/makefile           (revision 0)

@@ -0,0 +1,7 @@

+#

+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source

+# file to this component.  This file merely indirects to the real make file

+# that is shared by all the driver components of the OpenIB Windows project.

+#

+

+!INCLUDE ..\..\..\inc\openib.def

Index: tools/part_man/user/makefile

===================================================================

--- tools/part_man/user/makefile  (revision 0)

+++ tools/part_man/user/makefile           (revision 0)

@@ -0,0 +1,7 @@

+#

+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source

+# file to this component.  This file merely indirects to the real make file

+# that is shared by all the driver components of the OpenIB Windows project.

+#

+

+!INCLUDE ..\..\..\inc\openib.def

Index: tools/part_man/user/part_man.c

===================================================================

--- tools/part_man/user/part_man.c         (revision 0)

+++ tools/part_man/user/part_man.c       (revision 0)

@@ -0,0 +1,385 @@

+

+

+

+#include "stdio.h"

+#include "string.h"

+#include "stdlib.h"

+#include <windows.h>

+

+#include <iba/ib_types.h>

+#include <iba/ib_al.h>

+#include "al_dev.h"

+

+typedef enum

+{

+          pkey_show = 0,

+          pkey_add,

+          pkey_rem

+}Pkey_action;

+

+/* common query parameters */

+typedef struct _REQUEST_IN

+{

+          union

+          {

+                      struct

+                      {

+                                  unsigned short     pkey_num;

+                                  unsigned __int16   pkeys[MAX_NUM_PKEY];

+                                  Pkey_action                     action;

+                      }guid_pkey;

+                      }u;

+}REQUEST_IN;

+

+#define           DEFAULT_BUFER_SIZE            1024

+static const char IBBUS_SERV_KEY[] = {"SYSTEM\\CurrentControlSet\\Services\\ibbus\\Parameters"};

+

+void show_help()

+{

+          printf("Usage : part_man.exe <show|add|rem> <pkey1 pkey2 ...>\n");

+}

+

+/********************************************************************

+* name            :           reg_ibbus_pkey_show

+*                                 read registry pkey and optionally prints it

+* input :           show - whether to print

+* output:          partKey - contains read pkeys, reg_handle

+* return:   number of characters read

+********************************************************************/

+static int reg_ibbus_pkey_show(IN BOOLEAN show,OUT char *partKey, OUT HKEY *reg_handle)

+{

+          LONG   ret;

+          int retval;

+          DWORD  read_length = DEFAULT_BUFER_SIZE;

+

+          ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,IBBUS_SERV_KEY,0,KEY_SET_VALUE | KEY_QUERY_VALUE ,reg_handle);

+          if (ERROR_SUCCESS != ret)

+          {

+                      printf("reg_ibbus_pkey_show error = %d\n",GetLastError());

+                      return 0;

+          }           

+

+          do

+          {

+                      ret = RegQueryValueEx(*reg_handle,"PartitionKey",NULL,NULL,(LPBYTE)partKey,&read_length);

+                      if (ERROR_MORE_DATA == ret)

+                      {

+                                  printf("reg_ibbus_pkey_show : more buffer space required\n");

+                                  retval = 0;

+                                  break;

+                      }

+

+                      if (ERROR_SUCCESS != ret)

+                      {

+                                  printf("RegQueryValueEx : Error %d\n",ret);

+                                  retval = 0;

+                                  break;

+                      }

+                      retval = (int)read_length;

+                      if(retval > 4)

+                      {

+                                  if(show)

+                                              printf("Existed Pkey(s): %s\n",partKey);

+                      }

+                      else

+                                  retval = 0;

+          }

+          while(FALSE);

+          return retval;

+}

+

+static boolean_t reg_ibbus_print_pkey()

+{

+          int result;

+          char pkeyBuf[DEFAULT_BUFER_SIZE];

+          HKEY hreg = NULL;

+

+          result = reg_ibbus_pkey_show(TRUE,(char*)pkeyBuf,&hreg);

+          if(hreg)

+                      RegCloseKey( hreg );

+

+          if (result < 4)

+          {

+                      printf("No configured pkey found\n");

+                      return FALSE;

+          }

+          return TRUE;

+}

+

+static int reg_ibbus_pkey_add(const uint16_t *pkeys, uint16_t pkey_num,OUT pkey_array_t *pkey)

+{

+          char partKey[DEFAULT_BUFER_SIZE];

+          char tmp[10];

+          HKEY reg_handle;

+          LONG   ret;

+          int cnt;

+          int retval = 0;

+          uint16_t i = 0;

+          DWORD  read_length;

+

+          read_length = reg_ibbus_pkey_show(FALSE,(char*)partKey,&reg_handle);

+

+          if (read_length < 4)

+          {

+                      /* empty string read, simply write to registry */

+                      cnt = sprintf(partKey,"0x%04X",pkeys[0]);

+                      pkey->pkey_array[pkey->pkey_num] = pkeys[0];

+                      pkey->pkey_num++;

+                      i = 1;

+          }

+          else

+          {

+                      /* update the existed registry list */

+                      cnt = (int)strlen(partKey);

+                      i = 0;

+          }           

+

+          for ( ;i < pkey_num; i++)

+          {

+                      sprintf(tmp,"0x%04X",pkeys[i]);

+                      if (strstr(partKey,tmp))

+                      {

+                                  continue;

+                      }

+                      pkey->pkey_array[pkey->pkey_num] = pkeys[i];

+                      pkey->pkey_num++;

+                      cnt += sprintf(partKey + cnt,",0x%04X",pkeys[i]);

+          }

+          cnt += sprintf(partKey + cnt,"\0");

+

+          if(pkey->pkey_num)

+          {

+                      ret = RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)partKey, (DWORD)cnt);

+                      if (ERROR_SUCCESS != ret)

+                      {

+                                  printf("reg_ibbus_pkey_add RegSetValueEx error = %d\n",GetLastError());

+                                  retval = 1;

+                      }

+          }

+          else

+                      printf("No pkey to add\n");

+          RegCloseKey( reg_handle );

+          return retval;

+}

+

+static int reg_ibbus_pkey_rem(const unsigned __int16 *pkeys, unsigned short pkey_num,OUT pkey_array_t *pkey)

+{

+          char partKey[DEFAULT_BUFER_SIZE];

+          char newKey[DEFAULT_BUFER_SIZE] = {'\0'};

+

+          HKEY reg_handle;

+          LONG   ret;

+          DWORD  read_length;

+          int converted,cnt;

+          unsigned __int16 cur_pkey;

+          int retval = 0;

+          unsigned short i = 0;

+          char seps[] = ",";

+          char *token;

+          boolean_t found2remove;

+

+          read_length = reg_ibbus_pkey_show(FALSE,(char*)partKey,&reg_handle);

+          do

+          {

+                      if (read_length < 4)

+                      {

+                                  /* empty string read, nothing to delete */

+                                  printf("No pkey configured - nothing to remove\n");

+                                  retval = 1;

+                                  break;

+                      }

+

+                      token = strtok(partKey,seps);

+                      cnt = 0;

+                      while(token)

+                      {

+                                  found2remove = FALSE;

+                                  converted = sscanf(token,"0x%X",&cur_pkey);

+                                  if(! converted || (converted == EOF))

+                                  {

+                                              printf("invalid registry format\n");

+                                              retval = 1;

+                                              break;

+                                  }

+                                  for (i = 0; i < pkey_num; i++)

+                                  {

+                                              found2remove = (boolean_t)(cur_pkey == pkeys[i]);

+                                              if(found2remove)

+                                                          break;

+                                  }

+                                  

+                                  if(found2remove)

+                                  {

+                                              pkey->pkey_num++;

+                                  }

+                                  else

+                                  {

+                                              if(!cnt)

+                                                          cnt += sprintf(newKey + cnt,"0x%04X",cur_pkey);

+                                              else

+                                                          cnt += sprintf(newKey + cnt,",0x%04X",cur_pkey);

+                                  }

+                                  token = strtok(NULL,seps);

+                      }

+

+                      if(! pkey->pkey_num)

+                      {

+                                  /* nothing to delete */

+                                  printf("No pkey found to remove\n");

+                                  retval = 1;

+                                  break;

+                      }

+

+                      ret = RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)newKey, (DWORD)strlen(newKey));

+                      if (ERROR_SUCCESS != ret)

+                      {

+                                  printf("reg_ibbus_pkey_add RegSetValueEx error = %d\n",GetLastError());

+                                  retval = 1;

+                                  break;

+                      }

+          }

+          while(FALSE);

+

+          RegCloseKey( reg_handle );

+          return retval;

+}

+

+int send_create_pdo_req(pkey_array_t *pkeys)

+{

+          HANDLE hKernelLib;

+          DWORD                       bytesReturned;

+

+          hKernelLib =

+                      CreateFile(

+                      "\\\\.\\ibal",

+                      GENERIC_READ | GENERIC_WRITE,

+                      FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode none

+                      NULL,                               // no security

+                      OPEN_EXISTING,

+                      FILE_ATTRIBUTE_NORMAL,

+                      NULL                                // no template

+                      );

+

+          if (hKernelLib == INVALID_HANDLE_VALUE)

+          {

+                      printf("failed to open the kernel device : error = %d\n",GetLastError());

+                      return 1;

+          }

+

+          if (! DeviceIoControl(hKernelLib,

+                                                                        UAL_REQ_CREATE_PDO,

+                                                                        pkeys,sizeof(pkey_array_t),

+                                                                        NULL,0,

+                                                                        &bytesReturned,

+                                                                        NULL))

+          {

+                      printf("send_create_pdo_req failed error %d\n",GetLastError());

+                      CloseHandle(hKernelLib);

+                      return 1;

+          }

+          CloseHandle(hKernelLib);

+          return 0;

+}

+

+boolean_t reg_pkey_operation(const REQUEST_IN *input)

+{

+          pkey_array_t pkeys;

+          int result;

+          int i;

+          if(!input)

+          {

+                      printf("create_ipoib_pdo : invalid input parameter\n");

+                      return FALSE;

+          }

+

+          RtlZeroMemory(&pkeys,sizeof(pkeys));

+          if(input->u.guid_pkey.action == pkey_add)

+                      result = reg_ibbus_pkey_add((unsigned __int16*)input->u.guid_pkey.pkeys, input->u.guid_pkey.pkey_num, &pkeys);

+          else if(input->u.guid_pkey.action == pkey_rem)

+          {

+                      result = reg_ibbus_pkey_rem((unsigned __int16*)input->u.guid_pkey.pkeys, input->u.guid_pkey.pkey_num, &pkeys);

+                      return (boolean_t)(result == 0);

+          }

+          else if(input->u.guid_pkey.action == pkey_show)

+                      return reg_ibbus_print_pkey();

+

+          if(0 == result)

+          {

+                      if(pkeys.pkey_num)

+                                  return (boolean_t)( 0 == send_create_pdo_req(&pkeys));

+          }

+          return FALSE;

+}

+

+int prepare_reg_pkey_input(OUT REQUEST_IN *input,char* cmd[],int num)

+{

+          int i;

+          input->u.guid_pkey.pkey_num = 0;

+

+          if(strstr(cmd[1],"add"))

+                      input->u.guid_pkey.action = pkey_add;

+          else if(strstr(cmd[1],"rem"))

+                      input->u.guid_pkey.action = pkey_rem;

+          else if(strstr(cmd[1],"show"))

+          {

+                      input->u.guid_pkey.action = pkey_show;

+                      return 1;

+          }

+          else

+          {

+                      printf("invalid command %s\n",cmd[1]);

+                      return 0;

+          }

+

+          if(num < 3)

+          {

+                      printf("invalid command %s\n",cmd[1]);

+                      return 0;

+          }

+          for( i = 2; i < num; i++)

+          {

+                      if (strstr(cmd[i],"0x"))

+                                  sscanf(cmd[i],"0x%x",&input->u.guid_pkey.pkeys[input->u.guid_pkey.pkey_num]);

+                      else

+                                  sscanf(cmd[i],"%x",&input->u.guid_pkey.pkeys[input->u.guid_pkey.pkey_num]);

+

+                      input->u.guid_pkey.pkey_num++;

+          }

+          return 1;

+}

+

+void partition_operation(char* cmd[],int num)

+{

+          REQUEST_IN input;

+

+          if (! prepare_reg_pkey_input(&input, cmd, num))

+                      return;

+

+          if(! reg_pkey_operation(&input))

+                      printf("Pkey operation failed\n"); 

+          else

+                      printf("Done...\n");

+}

+

+int32_t __cdecl

+main(

+          int32_t argc,

+          char* argv[])

+{

+          BOOLEAN showHelp = FALSE;

+          if (argc < 2)

+          {

+                      showHelp = TRUE;

+          }

+          else

+          {

+                      if(!_stricmp(argv[1], "-h") || !_stricmp(argv[1], "-help"))

+                      {

+                                  showHelp = TRUE;

+                      }

+                      else

+                                  partition_operation(argv,argc);

+          }

+          if (showHelp)

+                      show_help();

+}

\ No newline at end of file

Index: tools/part_man/user/part_man.rc

===================================================================

--- tools/part_man/user/part_man.rc        (revision 0)

+++ tools/part_man/user/part_man.rc      (revision 0)

@@ -0,0 +1,18 @@

+

+

+

+#include <oib_ver.h>

+

+#define VER_FILETYPE                                              VFT_APP

+#define VER_FILESUBTYPE                                        VFT2_UNKNOWN

+

+#ifdef _DEBUG_

+#define VER_FILEDESCRIPTION_STR             "Partition manager application(Debug)"

+#else

+#define VER_FILEDESCRIPTION_STR             "Partition manager application"

+#endif

+

+#define VER_INTERNALNAME_STR                 "part_man.exe"

+#define VER_ORIGINALFILENAME_STR          "part_man.exe"

+

+#include <common.ver>

Index: tools/part_man/user/SOURCES

===================================================================

--- tools/part_man/user/SOURCES          (revision 0)

+++ tools/part_man/user/SOURCES        (revision 0)

@@ -0,0 +1,23 @@

+TARGETNAME=part_man

+TARGETPATH=..\..\..\bin\user\obj$(BUILD_ALT_DIR)

+TARGETTYPE=PROGRAM

+UMTYPE=console

+USE_CRTDLL=1

+

+SOURCES=part_man.c \

+          part_man.rc

+          

+INCLUDES=..\..\..\inc;..\..\..\inc\user;..\..\..\core\al

+

+RCOPTIONS=/I..\..\win\include

+

+TARGETLIBS= \

+!if $(FREEBUILD)

+                                  $(TARGETPATH)\*\complib.lib \

+                                  $(TARGETPATH)\*\ibal.lib

+!else

+                                  $(TARGETPATH)\*\complibd.lib \

+                                  $(TARGETPATH)\*\ibald.lib

+!endif

+

+MSC_WARNING_LEVEL= /W3

Index: ulp/ipoib/kernel/ipoib_adapter.c

===================================================================

--- ulp/ipoib/kernel/ipoib_adapter.c          (revision 1081)

+++ ulp/ipoib/kernel/ipoib_adapter.c       (working copy)

@@ -171,7 +171,7 @@

 

            IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,

                                    ("Port %016I64x (CA %016I64x port %d) initializing\n",

-                                   p_adapter->guids.port_guid, p_adapter->guids.ca_guid,

+                                  p_adapter->guids.port_guid.guid, p_adapter->guids.ca_guid,

                                    p_adapter->guids.port_num) );

 

            cl_status = cl_obj_init( &p_adapter->obj, CL_DESTROY_SYNC,

@@ -343,7 +343,7 @@

 

            /* Validate the port GUID and generate the MAC address. */

            status =

-                       ipoib_mac_from_guid( p_adapter->guids.port_guid, &p_adapter->mac );

+                      ipoib_mac_from_guid( p_adapter->guids.port_guid.guid, &p_adapter->mac );

            if( status != IB_SUCCESS )

            {

                        IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,

@@ -530,7 +530,7 @@

            case IB_PNP_PORT_ADD:

                        CL_ASSERT( !p_pnp_rec->context );

                        /* Only process our port GUID. */

-                       if( p_pnp_rec->guid != p_adapter->guids.port_guid )

+                      if( p_pnp_rec->guid != p_adapter->guids.port_guid.guid )

                        {

                                    status = IB_NOT_DONE;

                                    break;

Index: ulp/ipoib/kernel/ipoib_driver.c

===================================================================

--- ulp/ipoib/kernel/ipoib_driver.c (revision 1081)

+++ ulp/ipoib/kernel/ipoib_driver.c          (working copy)

@@ -767,7 +767,7 @@

 

            IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,

                                    ("Port %016I64x (CA %016I64x port %d) halting\n",

-                                   p_adapter->guids.port_guid, p_adapter->guids.ca_guid,

+                                  p_adapter->guids.port_guid.guid, p_adapter->guids.ca_guid,

                                    p_adapter->guids.port_num) );

 

            ipoib_destroy_adapter( p_adapter );

@@ -2330,13 +2330,19 @@

 

            IPOIB_ENTER( IPOIB_DBG_OID );

 

+          if(p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)

+          {

+                      IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,IPOIB_DBG_ERROR,

+                      ("ATS Service available for default pkey only\n"));      

+                      return;

+          }

            port_num = p_adapter->guids.port_num;

 

            /* Setup our service call with things common to all calls */

            cl_memset( &ib_service, 0, sizeof(ib_service) );

 

            /* BUGBUG Only register local subnet GID prefix for now */

-           ib_gid_set_default( &port_gid, p_adapter->guids.port_guid );

+          ib_gid_set_default( &port_gid, p_adapter->guids.port_guid.guid );

            ib_service.svc_rec.service_gid               = port_gid;

 

            ib_service.svc_rec.service_pkey             = IB_DEFAULT_PKEY;

@@ -2347,7 +2353,7 @@

            strcpy( (char *)ib_service.svc_rec.service_name, ATS_NAME );

 

            /* IP Address in question will be put in below */

-           ib_service.port_guid                   = p_adapter->guids.port_guid;

+          ib_service.port_guid                   = p_adapter->guids.port_guid.guid;

            ib_service.timeout_ms                = p_adapter->params.sa_timeout;

            ib_service.retry_cnt                   = p_adapter->params.sa_retry_cnt;

 

Index: ulp/ipoib/kernel/ipoib_endpoint.c

===================================================================

--- ulp/ipoib/kernel/ipoib_endpoint.c        (revision 1081)

+++ ulp/ipoib/kernel/ipoib_endpoint.c      (working copy)

@@ -312,13 +312,13 @@

 

            cl_memclr( &path, sizeof(ib_path_rec_t) );

            path.dgid = p_endpt->dgid;

-           ib_gid_set_default( &path.sgid, p_port->p_adapter->guids.port_guid );

+          ib_gid_set_default( &path.sgid, p_port->p_adapter->guids.port_guid.guid );

            path.num_path = 0x1;

 

            cl_memclr( &query, sizeof(ib_query_req_t) );

            query.query_type = IB_QUERY_USER_DEFINED;

            query.p_query_input = &info;

-           query.port_guid = p_port->p_adapter->guids.port_guid;

+          query.port_guid = p_port->p_adapter->guids.port_guid.guid;

            query.timeout_ms = p_port->p_adapter->params.sa_timeout;

            query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;

 

Index: ulp/ipoib/kernel/ipoib_ibat.c

===================================================================

--- ulp/ipoib/kernel/ipoib_ibat.c    (revision 1081)

+++ ulp/ipoib/kernel/ipoib_ibat.c (working copy)

@@ -140,7 +140,7 @@

            {

                        pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );

                        pOut->Ports[pOut->NumPorts].CaGuid = pAdapter->guids.ca_guid;

-                       pOut->Ports[pOut->NumPorts].PortGuid = pAdapter->guids.port_guid;

+                      pOut->Ports[pOut->NumPorts].PortGuid = pAdapter->guids.port_guid.guid;

                        pOut->Ports[pOut->NumPorts].PortNum = pAdapter->guids.port_num;

                        pOut->NumPorts++;

 

@@ -210,7 +210,7 @@

                        pItem = cl_qlist_next( pItem ) )

            {

                        pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );

-                       if( PortGuid && pAdapter->guids.port_guid != PortGuid )

+                      if( PortGuid && pAdapter->guids.port_guid.guid != PortGuid )

                                    continue;

 

                        cl_obj_lock( &pAdapter->obj );

@@ -300,7 +300,7 @@

                        pItem = cl_qlist_next( pItem ) )

            {

                        pAdapter = CONTAINING_RECORD( pItem, ipoib_adapter_t, entry );

-                       if( pIn->PortGuid != pAdapter->guids.port_guid )

+                      if( pIn->PortGuid != pAdapter->guids.port_guid.guid )

                                    continue;

 

                        /* Found the port - lookup the MAC. */

@@ -394,7 +394,7 @@

                                    if (!memcmp( &pIn->Address.Address[12], pAddr->address.as_bytes, IPV4_ADDR_SIZE))

                                    {

                                                pOut->Port.CaGuid = pAdapter->guids.ca_guid;

-                                               pOut->Port.PortGuid = pAdapter->guids.port_guid;

+                                              pOut->Port.PortGuid = pAdapter->guids.port_guid.guid;

                                                pOut->Port.PortNum = pAdapter->guids.port_num;

                                                pIrp->IoStatus.Information = sizeof(IOCTL_IBAT_IP_TO_PORT_OUT);

                                                status = STATUS_SUCCESS;

Index: ulp/ipoib/kernel/ipoib_port.c

===================================================================

--- ulp/ipoib/kernel/ipoib_port.c   (revision 1081)

+++ ulp/ipoib/kernel/ipoib_port.c (working copy)

@@ -793,6 +793,8 @@

            uint64_t                         vaddr;

            net32_t                                     rkey;

            ib_qp_attr_t                   qp_attr;

+          ib_ca_attr_t                   *ca_attr;

+          uint32_t                         ca_size;

 

            IPOIB_ENTER( IPOIB_DBG_INIT );

 

@@ -810,6 +812,51 @@

                        return status;

            }

 

+          /* Query the CA for Pkey table */

+          status = p_port->p_adapter->p_ifc->query_ca(p_port->ib_mgr.h_ca, NULL, &ca_size);

+          if(status != IB_INSUFFICIENT_MEMORY)

+          {

+                      IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,

+                                  ("ib_query_ca failed\n"));

+                                  return status;

+          }

+

+          ca_attr = (ib_ca_attr_t*)cl_zalloc(ca_size);

+          if          (!ca_attr)

+          {

+                      IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,

+                                  ("cl_zalloc can't allocate %d\n",ca_size));

+                      return IB_INSUFFICIENT_RESOURCES;

+          }

+

+          status = p_port->p_adapter->p_ifc->query_ca(p_port->ib_mgr.h_ca, ca_attr,&ca_size);     

+          if( status != IB_SUCCESS )

+          {

+                      IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,

+                                  ("ib_query_ca returned %s\n", 

+                                  p_port->p_adapter->p_ifc->get_err_str( status )) );

+                      return status;

+          }

+          if( ca_attr->p_port_attr->link_state == IB_LINK_ACTIVE)

+          {

+                      uint16_t index;

+                      CL_ASSERT(ca_attr->p_port_attr->p_pkey_table[0] == IB_DEFAULT_PKEY);

+                      for(index = 0; index < ca_attr->p_port_attr->num_pkeys; index++)

+                      {

+                                  if(p_port->p_adapter->guids.port_guid.pkey == ca_attr->p_port_attr->p_pkey_table[index])

+                                              break;

+                      }

+                      if(index >= ca_attr->p_port_attr->num_pkeys)

+                      {

+                                  IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,

+                                  ("Pkey table is invalid, index not found\n"));

+                          return IB_NOT_FOUND;

+                      }

+                      p_port->pkey_index = index;

+                      IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_IB,

+                                  ("for PKEY = 0x%04X got index = %d\n",p_port->p_adapter->guids.port_guid.pkey,index));

+          }

+          cl_free(ca_attr);

            /* Allocate the PD. */

            status = p_port->p_adapter->p_ifc->alloc_pd(

                        p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd );

@@ -3309,7 +3356,7 @@

 

                        CL_ASSERT( p_cid[1] == 21 );

                        p_cid[23]= DHCP_OPT_END;

-                       ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid );

+                      ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );

                        cl_memcpy( &p_cid[7], &gid, sizeof(ib_gid_t) );

                        cl_memcpy( &p_cid[3], &p_port->ib_mgr.qpn, sizeof(p_port->ib_mgr.qpn) );                     

                        p_ib_dhcp->htype = DHCP_HW_TYPE_IB;

@@ -3409,7 +3456,7 @@

            p_ib_arp->op = p_arp->op;

            p_ib_arp->src_hw.flags_qpn = p_port->ib_mgr.qpn;

            ib_gid_set_default( &p_ib_arp->src_hw.gid,

-                       p_port->p_adapter->guids.port_guid );

+                      p_port->p_adapter->guids.port_guid.guid );

            p_ib_arp->src_ip = p_arp->src_ip;

            if( cl_memcmp( &p_arp->dst_hw, &null_hw, sizeof(mac_addr_t) ) )

            {

@@ -3584,7 +3631,7 @@

            p_desc->wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;

            p_desc->wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;

            p_desc->wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;

-           p_desc->wr.dgrm.ud.pkey_index = 0;

+          p_desc->wr.dgrm.ud.pkey_index = p_port->pkey_index;

            p_desc->wr.dgrm.ud.rsvd = NULL;

 

            /* Store context in our reserved area of the packet. */

@@ -4683,7 +4730,7 @@

            cl_memclr( &query, sizeof(ib_query_req_t) );

            query.query_type = IB_QUERY_USER_DEFINED;

            query.p_query_input = &info;

-           query.port_guid = p_port->p_adapter->guids.port_guid;

+          query.port_guid = p_port->p_adapter->guids.port_guid.guid;

            query.timeout_ms = p_port->p_adapter->params.sa_timeout;

            query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;

            query.query_context = p_port;

@@ -4721,7 +4768,7 @@

 

            IPOIB_ENTER( IPOIB_DBG_INIT );

 

-           ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid );

+          ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );

            p_endpt = ipoib_endpt_create(

                        &gid, p_port_info->base_lid, p_port->ib_mgr.qpn );

            if( !p_endpt )

@@ -4894,10 +4941,13 @@

            cl_memclr( &member_rec, sizeof(ib_member_rec_t) );

            member_rec.mgid = bcast_mgid_template;

 

+    member_rec.mgid.raw[4] = (uint8_t) p_port->p_adapter->guids.port_guid.pkey ;

+          member_rec.mgid.raw[5] = (uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8);

+          member_rec.pkey = p_port->p_adapter->guids.port_guid.pkey;

            cl_memclr( &query, sizeof(ib_query_req_t) );

            query.query_type = IB_QUERY_USER_DEFINED;

            query.p_query_input = &info;

-           query.port_guid = p_port->p_adapter->guids.port_guid;

+          query.port_guid = p_port->p_adapter->guids.port_guid.guid;

            query.timeout_ms = p_port->p_adapter->params.sa_timeout;

            query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;

            query.query_context = p_port;

@@ -5031,14 +5081,14 @@

            /* We specify our port GID for the join operation. */

            mcast_req.member_rec.port_gid.unicast.prefix = IB_DEFAULT_SUBNET_PREFIX;

            mcast_req.member_rec.port_gid.unicast.interface_id =

-                       p_port->p_adapter->guids.port_guid;

+                      p_port->p_adapter->guids.port_guid.guid;

 

            mcast_req.mcast_context = p_port;

            mcast_req.pfn_mcast_cb = __bcast_cb;

            mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;

            mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;

-           mcast_req.port_guid = p_port->p_adapter->guids.port_guid;

-           mcast_req.pkey_index = 0;

+          mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;

+          mcast_req.pkey_index = p_port->pkey_index;

 

            if( ib_member_get_state( mcast_req.member_rec.scope_state ) !=

                        IB_MC_REC_STATE_FULL_MEMBER )

@@ -5085,8 +5135,10 @@

             * We specify the MGID since we don't want the SA to generate it for us.

             */

            mcast_req.member_rec.mgid = bcast_mgid_template;

+          mcast_req.member_rec.mgid.raw[4] = (uint8_t) p_port->p_adapter->guids.port_guid.pkey; 

+          mcast_req.member_rec.mgid.raw[5] = (uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8);

            ib_gid_set_default( &mcast_req.member_rec.port_gid,

-                       p_port->p_adapter->guids.port_guid );

+                      p_port->p_adapter->guids.port_guid.guid );

            /*

             * IPOIB spec requires that the QKEY have the MSb set so that the QKEY

             * from the QP is used rather than the QKEY in the send WR.

@@ -5096,7 +5148,7 @@

            mcast_req.member_rec.mtu =

                        (IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;

 

-           mcast_req.member_rec.pkey = IB_DEFAULT_PKEY;

+          mcast_req.member_rec.pkey = p_port->p_adapter->guids.port_guid.pkey;

 

            mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0 );

            mcast_req.member_rec.scope_state =

@@ -5106,8 +5158,8 @@

            mcast_req.pfn_mcast_cb = __bcast_cb;

            mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;

            mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;

-           mcast_req.port_guid = p_port->p_adapter->guids.port_guid;

-           mcast_req.pkey_index = 0;

+          mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;

+          mcast_req.pkey_index = p_port->pkey_index;

 

            /* reference the object for the multicast join request. */

            ipoib_port_ref( p_port, ref_join_bcast );

@@ -5362,9 +5414,9 @@

            }

 

            /* Move the QP to RTS. */

-           dgrm_info.port_guid = p_port->p_adapter->guids.port_guid;

+          dgrm_info.port_guid = p_port->p_adapter->guids.port_guid.guid;

            dgrm_info.qkey = p_port->ib_mgr.bcast_rec.qkey;

-           dgrm_info.pkey_index = 0;

+          dgrm_info.pkey_index = p_port->pkey_index;

            status = p_port->p_adapter->p_ifc->init_dgrm_svc( p_port->ib_mgr.h_qp, &dgrm_info );

            if( status != IB_SUCCESS )

            {

@@ -5464,9 +5516,9 @@

            mcast_req.pfn_mcast_cb = __mcast_cb;

            mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;

            mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;

-           mcast_req.port_guid = p_port->p_adapter->guids.port_guid;

-           mcast_req.pkey_index = 0;

-

+          mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;

+          mcast_req.pkey_index = p_port->pkey_index;

+          mcast_req.member_rec.pkey = p_port->p_adapter->guids.port_guid.pkey;

            /*

             * Create the endpoint and insert it in the port.  Since we don't wait for

             * the mcast SA operations to complete before returning from the multicast

Index: ulp/ipoib/kernel/ipoib_port.h

===================================================================

--- ulp/ipoib/kernel/ipoib_port.h   (revision 1081)

+++ ulp/ipoib/kernel/ipoib_port.h (working copy)

@@ -506,6 +506,7 @@

            atomic32_t                                            endpt_rdr;

 

            atomic32_t                                            hdr_idx;

+          uint16_t                                     pkey_index;

            ipoib_hdr_t                                            hdr[1];  /* Must be last! */

 

 }          ipoib_port_t;

 

Slava Strebkov

SW Engineer

Voltaire

099718750

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20080429/50c07d9f/attachment.html>


More information about the ofw mailing list