[OFW][patch] partition tool

Slava Strebkov slavas at voltaire.com
Tue Apr 29 23:02:44 PDT 2008


 

New PDO is created using existed hardware ID and differs by pkey value.

Currently there is no option to create PDO with arbitrary HW ID or
device description.

 

 

Slava

________________________________

From: James Yang [mailto:jyang at xsigo.com] 
Sent: Tuesday, April 29, 2008 9:46 PM
To: Slava Strebkov; ofw at lists.openfabrics.org
Subject: RE: [OFW][patch] partition tool

 

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,&re
ad_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_n
um]);

+                      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,&re
ad_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_n
um]);

+                      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/20080430/6ea3219b/attachment.html>


More information about the ofw mailing list