[ofw][patch] partition pkey change event
    Tzachi Dar 
    tzachid at mellanox.co.il
       
    Mon Aug 25 07:02:19 PDT 2008
    
    
  
Applied in version 1499.
 
Thanks
Tzachi
________________________________
	From: Slava Strebkov [mailto:slavas at voltaire.com] 
	Sent: Tuesday, August 12, 2008 12:31 PM
	To: ofw at lists.openfabrics.org; Tzachi Dar
	Subject: [ofw][patch] partition pkey change event
	
	
	Fixed pkey change event.
	Partition tool (part_man.exe) input now takes vstat output node
guid as input.
	 
	Index: core/al/al_dev.h
	
===================================================================
	--- core/al/al_dev.h        (revision 1478)
	+++ core/al/al_dev.h      (working copy)
	@@ -62,6 +62,7 @@
	 
	 typedef struct _pkey_array
	 {
	+          ib_net64_t            port_guid;
	            ib_net16_t            pkey_num;
	            ib_net16_t     pkey_array[MAX_NUM_PKEY];
	 }pkey_array_t;
	@@ -93,6 +94,9 @@
	 cl_status_t
	 bus_add_pkey(
	            IN
cl_ioctl_handle_t                                    h_ioctl );
	+cl_status_t
	+bus_rem_pkey(
	+          IN
cl_ioctl_handle_t                                    h_ioctl );
	 
	 /* Define data structures for user-mode proxy */
	 #else               /* CL_KERNEL */
	@@ -142,7 +146,6 @@
	            ual_bind_cq,
	            ual_bind_destroy,
	            ual_bind_nd,
	-           ual_req_create_pdo,
	            al_proxy_maxops
	 
	 }          al_proxy_ops_t;
	@@ -165,7 +168,6 @@
	 #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)
	@@ -287,9 +289,10 @@
	            ual_reject_ioc_cmd,
	            ual_add_svc_entry_cmd,
	            ual_remove_svc_entry_cmd,
	+          ual_req_create_pdo,
	+          ual_req_remove_pdo,
	+          al_ioc_maxops,
	 
	-           al_ioc_maxops
	-
	 }          al_ioc_ops_t;
	 
	 #define AL_IOC_OPS_START   IOCTL_CODE(ALDEV_KEY,
al_ioc_ops_start)
	@@ -534,6 +537,8 @@
	 
	 
	 #define UAL_GET_CA_ATTR_INFO       IOCTL_CODE(ALDEV_KEY,
ual_get_ca_attr)
	+#define UAL_REQ_CREATE_PDO
IOCTL_CODE(ALDEV_KEY, ual_req_create_pdo)
	+#define UAL_REQ_REMOVE_PDO
IOCTL_CODE(ALDEV_KEY, ual_req_remove_pdo)
	 
	 /* PnP related ioctl commands. */
	 #define UAL_REG_PNP
IOCTL_CODE(ALDEV_KEY, ual_reg_pnp_cmd)
	Index: core/al/kernel/al_pnp.c
	
===================================================================
	--- core/al/kernel/al_pnp.c          (revision 1478)
	+++ core/al/kernel/al_pnp.c        (working copy)
	@@ -1507,8 +1507,14 @@
	 
	                        CL_ASSERT( p_port_attr_1->port_guid ==
p_port_attr_2->port_guid );
	 
	-                       if( cl_memcmp( p_port_attr_1,
p_port_attr_2,
	-                                               offsetof(
ib_port_attr_t, p_gid_table ) ) != 0 )
	+                      if( (cl_memcmp( p_port_attr_1,
p_port_attr_2,
	+                                              offsetof(
ib_port_attr_t, p_gid_table ) ) != 0 ) ||
	+
(cl_memcmp(p_port_attr_1->p_gid_table,p_port_attr_2->p_gid_table,
	+
p_port_attr_1->num_gids*sizeof(p_port_attr_1->p_gid_table[0]))) ||
	+
(cl_memcmp(p_port_attr_1->p_pkey_table,p_port_attr_2->p_pkey_table,
	+
p_port_attr_1->num_pkeys*sizeof(p_port_attr_1->p_pkey_table[0]))) 
	+                                  )
	+
	                        {
	                                    return FALSE;
	                        }
	Index: core/al/kernel/al_proxy.c
	
===================================================================
	--- core/al/kernel/al_proxy.c        (revision 1478)
	+++ core/al/kernel/al_proxy.c     (working copy)
	@@ -617,9 +617,6 @@
	            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/al/kernel/al_proxy_ioc.c
	
===================================================================
	--- core/al/kernel/al_proxy_ioc.c (revision 1478)
	+++ core/al/kernel/al_proxy_ioc.c           (working copy)
	@@ -35,10 +35,11 @@
	 #include <iba/ib_al.h>
	 #include <iba/ib_al_ioctl.h>
	 #include "al_debug.h"
	+#include "al.h"
	 #include "al_dev.h"
	 #include "al_proxy.h"
	+#include "ib_common.h"
	 
	-
	 cl_status_t
	 ioc_ioctl(
	            IN                     cl_ioctl_handle_t
h_ioctl,
	@@ -50,6 +51,17 @@
	 
	            switch( cl_ioctl_ctl_code( h_ioctl ) )
	            {
	+          case UAL_REQ_CREATE_PDO:
	+                      {
	+                                  cl_status =
bus_add_pkey(h_ioctl);
	+                                  break;
	+                      }
	+
	+          case UAL_REQ_REMOVE_PDO:
	+                      {
	+                                  cl_status =
bus_rem_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 1478)
	+++ core/bus/kernel/bus_driver.c           (working copy)
	@@ -56,16 +56,17 @@
	 #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 = {
	            BUS_DBG_ERROR,
	            TRUE,
	            NULL,
	-           NULL
	+          NULL,
	+          NULL,
	 };
	 
	 static void
	@@ -182,6 +183,7 @@
	                        RtlStringCbCopyNA( node_desc,
sizeof(node_desc),
	                                    DEFAULT_NODE_DESC,
sizeof(DEFAULT_NODE_DESC) );
	            }
	+          BUS_EXIT( BUS_DBG_DRV );
	 }
	
/***********************************************************************
*************
	 * name :           __prepare_pKey_array
	@@ -191,134 +193,176 @@
	 * 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)
	+static void __prepare_pKey_array(IN const char *str, size_t
str_len,OUT pkey_array_t *cur_pkey)
	 {
	-           uint16_t i, num_pKeys, cur_pkey_length;
	            NTSTATUS status;
	-           ANSI_STRING ansi_str;
	-           static const uint16_t PATTERN_LENGTH = 6;
	+          size_t i;
	+          uint8_t j;
	+          char pkey_str[7];
	+          ULONG tmp_val;
	            BUS_ENTER( BUS_DBG_DRV );
	 
	-           CL_ASSERT(pkey_array);
	+          CL_ASSERT(cur_pkey);
	            CL_ASSERT(str);
	 
	-           num_pKeys = 0;
	-    cur_pkey_length = 0;
	+          cur_pkey->pkey_num = 0;
	+          j = 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++)
	+          for (i = 0; (i < str_len) && (cur_pkey->pkey_num <
MAX_NUM_PKEY) ; i++)
	     {
	-                       switch(ansi_str.Buffer[i])
	+                      if(str[i] == ' ')
	+                                  continue;
	+
	+                      if( (str[i] != ',') && (str[i] != '\0'))
	                        {
	-                       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
	+                          if(j >= 7)
	                                    {
	-
pkey_array[num_pKeys] = \
	-
(pkey_array[num_pKeys] << 4)| 0;
	+
BUS_TRACE(BUS_DBG_ERROR ,
	+                                              ("Incorrect
format of pkey value\n") );
	                                                break;
	                                    }
	-
	-                       case 'x':
	-                       case 'X':
	-                                   cur_pkey_length++;
	-                                   break;
	-
	-                       case ',':
	-                                   if(cur_pkey_length ==
PATTERN_LENGTH)
	+                                  pkey_str[j] = str[i];
	+                                  j++;
	+                      }
	+                      else
	+                      {
	+                                  pkey_str[j] = '\0';
	+                                  status =
RtlCharToInteger(&pkey_str[2],16,&tmp_val);
	+                                  if(! NT_SUCCESS(status))
	                                    {
	-                                               cur_pkey_length
= 0;
	-                                               num_pKeys++;
	+
BUS_TRACE(BUS_DBG_ERROR ,
	+                                              ("Failed to
convert, status = 0x%08X\n",status) );
	+                                              break;   
	                                    }
	-                                   break;
	+
cur_pkey->pkey_array[cur_pkey->pkey_num++] = (uint16_t)tmp_val;
	+                                  j = 0;
	+                      }
	+          }
	+          BUS_EXIT( BUS_DBG_DRV );
	+}
	 
	-                       case 'A':
	-                       case 'a':
	-                                   pkey_array[num_pKeys] = \
	-                                   (pkey_array[num_pKeys] <<
4)| 0xA;
	-                                   cur_pkey_length++;
	-                                   break;
	+static pkey_conf_t*
	+create_pkey_conf(pkey_conf_t **pp_cur_conf, char *guid_str,
uint32_t guid_str_len)
	+{
	+          NTSTATUS status;
	+          char     tmp_char;
	+          uint32_t tmp_val;
	 
	-                       case 'B':
	-                       case 'b':
	-                                   pkey_array[num_pKeys] = \
	-                                   (pkey_array[num_pKeys] <<
4)| 0xB;
	-                                   cur_pkey_length++;
	-                                   break;
	+          if (! *pp_cur_conf)
	+                      pp_cur_conf = &bus_globals.p_pkey_conf;
	+          else
	+                      pp_cur_conf =
&((*pp_cur_conf)->next_conf);
	 
	-                       case 'C':
	-                       case 'c':
	-                                   pkey_array[num_pKeys] = \
	-                                   (pkey_array[num_pKeys] <<
4)| 0xC;
	-                                   cur_pkey_length++;
	-                                   break;
	+          *pp_cur_conf = cl_zalloc( sizeof( pkey_conf_t ) );
	+          if (!(*pp_cur_conf) )
	+          {
	+                      BUS_TRACE(BUS_DBG_ERROR ,
	+                      ("Failed to allocate pkey
configuration\n") );
	+                      return NULL;     
	+          }
	 
	-                       case 'D':
	-                       case 'd':
	-                                   pkey_array[num_pKeys] = \
	-                                   (pkey_array[num_pKeys] <<
4)| 0xD;
	-                                   cur_pkey_length++;
	-                                   break;
	+          tmp_char = guid_str[1 + guid_str_len/2];
	+          guid_str[1 + guid_str_len/2] = '\0';
	+          status =
RtlCharToInteger(&guid_str[2],16,(PULONG)&tmp_val);
	+          if(! NT_SUCCESS(status))
	+          {
	+                      cl_free((*pp_cur_conf));
	+                      (*pp_cur_conf) = NULL;
	+                      BUS_TRACE(BUS_DBG_ERROR ,
	+                      ("Failed to convert, status =
0x%08X\n",status) );
	+                      return NULL;     
	+          }
	+          guid_str[1 + guid_str_len/2] = tmp_char;
	+          (*pp_cur_conf)->pkeys_per_port.port_guid = tmp_val;
	 
	-                       case 'E':
	-                       case 'e':
	-                                   pkey_array[num_pKeys] = \
	-                                   (pkey_array[num_pKeys] <<
4)| 0xE;
	-                                   cur_pkey_length++;
	-                                   break;
	+          status = RtlCharToInteger(&guid_str[1 +
guid_str_len/2],16,(PULONG)&tmp_val);
	+          if(! NT_SUCCESS(status))
	+          {
	+                      cl_free((*pp_cur_conf));
	+                      (*pp_cur_conf) = NULL;
	+                      BUS_TRACE(BUS_DBG_ERROR ,
	+                      ("Failed to convert, status =
0x%08X\n",status) );
	+                      return NULL;     
	+          }
	+          (*pp_cur_conf)->pkeys_per_port.port_guid =
((*pp_cur_conf)->pkeys_per_port.port_guid << 32) | tmp_val;
	+          return (*pp_cur_conf);
	+}
	 
	-                       case 'F':
	-                       case 'f':
	-                                   pkey_array[num_pKeys] = \
	-                                   (pkey_array[num_pKeys] <<
4)| 0xF;
	-                                   cur_pkey_length++;
	-                                   break;
	
+/**********************************************************************
**
	+* name:                       __build_pkeys_per_port
	+*                                 extracts pkeys and port guids
from registry string.
	+*                                 builds pkey array per port
	+* input:            UNICODE_STRING *str
	+* return:          NTSTATUS
	
+***********************************************************************
*/
	+static NTSTATUS
	+__build_pkeys_per_port(IN const UNICODE_STRING *str)
	+{
	+          NTSTATUS    status;
	+          ANSI_STRING ansi_str;
	+          uint32_t i,j;
	+          char *p_end, *p_start;
	+          boolean_t          port_guid_found;
	+          pkey_conf_t      *cur_pkey_conf = NULL;
	+          char tmp_guid[32] = {'\0'};
	+          p_start = NULL;
	 
	-                       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)
	+          status =
RtlUnicodeStringToAnsiString(&ansi_str,str,TRUE);
	+          if(! NT_SUCCESS(status))
	+          {
	+                      BUS_TRACE(BUS_DBG_ERROR ,
	+                      ("RtlUnicodeStringToAnsiString returned
0x%.8x\n", status) );
	+                      return status;
	+          }
	+
	+          port_guid_found = FALSE;
	+          j = 0;
	+          for ( i = 0; i < ansi_str.MaximumLength; i++)
	+          {
	+                      if(! port_guid_found)
	+                      {
	+                                  if(ansi_str.Buffer[i] == ':')
	                                    {
	-                                               cur_pkey_length
= 0;
	-                                               num_pKeys++;
	+                                              port_guid_found =
TRUE;
	+                                              tmp_guid[j] =
'\0';
	+                                              cur_pkey_conf =
create_pkey_conf(&cur_pkey_conf,(char*)tmp_guid,j);
	+                                              if(!
cur_pkey_conf)
	+                                              {
	+
RtlFreeAnsiString(&ansi_str);
	+
BUS_TRACE(BUS_DBG_ERROR ,
	+                                                 ("Failed to
create pkey configuration\n"));
	+                                                 return
STATUS_INVALID_PARAMETER;
	+                                              }
	+
RtlZeroMemory(tmp_guid,sizeof(tmp_guid));
	+                                              j = 0;
	+                                              p_start = NULL;
	                                    }
	                                    else
	                                    {
	-
RtlFreeAnsiString(&ansi_str);
	-                                               return
num_pKeys;
	+                                              tmp_guid[j] =
ansi_str.Buffer[i]; 
	+                                              j++;
	+                                              continue;
	                                    }
	-                                   break;
	+                      }
	+                      else
	+                      {
	+                                  if(!p_start)
	+                                              p_start =
&ansi_str.Buffer[i]; 
	 
	-                       default:
	-                                   break;
	+                                  if(ansi_str.Buffer[i] == ';')
	+                                  {
	+                                              p_end =
&ansi_str.Buffer[i];
	+
ansi_str.Buffer[i] = '\0';
	+
__prepare_pKey_array(p_start,(size_t)(p_end - p_start) +
1,&cur_pkey_conf->pkeys_per_port);
	 
	+
ansi_str.Buffer[i] = ';';
	+                                              p_start = NULL;
	+                                              port_guid_found =
FALSE;
	+                                  }
	                        }
	            }
	-
	     RtlFreeAnsiString(&ansi_str);
	-           BUS_EXIT( BUS_DBG_DRV );
	-           return num_pKeys;
	+          return STATUS_SUCCESS;
	 }
	 static NTSTATUS
	 __read_registry(
	@@ -326,7 +370,7 @@
	 {
	            NTSTATUS
status;
	            /* Remember the terminating entry in the table
below. */
	-           RTL_QUERY_REGISTRY_TABLE           table[10];
	+          RTL_QUERY_REGISTRY_TABLE           table[12];
	            UNICODE_STRING
param_path;
	            UNICODE_STRING
pkeyString;
	            UNICODE_STRING
empty_string;
	@@ -360,8 +404,6 @@
	         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.
	@@ -432,11 +474,30 @@
	            table[8].DefaultType  = REG_SZ;
	            table[8].DefaultData  = &empty_string;
	            table[8].DefaultLength = 0;
	+#ifdef NNN
	+          table[9].Flags = RTL_QUERY_REGISTRY_DIRECT;
	+          table[9].Name = L"McDestrRetrCnt";
	+          table[9].EntryContext = &g_mc_destr_retr_count;
	+          table[9].DefaultType = REG_DWORD;
	+          table[9].DefaultData = &g_mc_destr_retr_count;
	+          table[9].DefaultLength = sizeof(ULONG);
	+
	+          table[10].Flags = RTL_QUERY_REGISTRY_DIRECT;
	+          table[10].Name = L"McDestrRetrTimeout";
	+          table[10].EntryContext = &g_mc_destr_retr_timeout;
	+          table[10].DefaultType = REG_DWORD;
	+          table[10].DefaultData = &g_mc_destr_retr_timeout;
	+          table[10].DefaultLength = sizeof(ULONG);
	+#endif
	            /* 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(
!NT_SUCCESS(__build_pkeys_per_port(&pkeyString)))
	+
BUS_TRACE(BUS_DBG_ERROR ,
	+
("Failed to build pkey configuration\n"));
	+          }
	 #if DBG
	            if( g_al_dbg_flags & AL_DBG_ERR )
	                        g_al_dbg_flags |= CL_DBG_ERROR;
	@@ -608,6 +669,37 @@
	            return status;
	 }
	 
	+cl_status_t
	+bus_rem_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;
	+
	+          /* removes pdo */
	+          status = port_mgr_pkey_rem(pkeys);
	+          if (! NT_SUCCESS(status))
	+          {
	+                      BUS_TRACE_EXIT( BUS_DBG_ERROR, 
	+                                  ("port_mgr_pkey_rem returned
%08x.\n", status) );
	+          }
	+
	+          BUS_EXIT( BUS_DBG_DRV );
	+          return status;
	+}
	 static NTSTATUS
	 bus_drv_sysctl(
	            IN
DEVICE_OBJECT                                             *p_dev_obj,
	@@ -643,14 +735,21 @@
	 bus_drv_unload(
	            IN
DRIVER_OBJECT                                             *p_driver_obj
)
	 {
	+          pkey_conf_t *cur_conf,*tmp;
	            UNICODE_STRING                    dos_name;
	-           UNUSED_PARAM( p_driver_obj );
	 
	            BUS_ENTER( BUS_DBG_DRV );
	            
	            RtlInitUnicodeString( &dos_name,
L"\\DosDevices\\Global\\ibal" );
	+          UNUSED_PARAM( p_driver_obj );
	            IoDeleteSymbolicLink( &dos_name );
	-
	+          cur_conf = bus_globals.p_pkey_conf;
	+          while(cur_conf)
	+          {
	+                      tmp = cur_conf;
	+                      cur_conf = cur_conf->next_conf;
	+                      cl_free(tmp);
	+          }
	            CL_DEINIT;
	 
	 #if defined(EVENT_TRACING)
	Index: core/bus/kernel/bus_driver.h
	
===================================================================
	--- core/bus/kernel/bus_driver.h  (revision 1478)
	+++ core/bus/kernel/bus_driver.h           (working copy)
	@@ -45,7 +45,7 @@
	 #include "iba/ib_al.h"
	 #include "bus_port_mgr.h"
	 #include "bus_iou_mgr.h"
	-
	+#include "al_dev.h"
	 /* Safe string functions. */
	 #if WINVER == 0x500
	 /*
	@@ -178,9 +178,15 @@
	 
	            /* work item for handling Power Management request
*/
	            PIO_WORKITEM
p_po_work_item;
	-           
	+          boolean_t
is_partition_pdo;
	 }          bus_pdo_ext_t;
	 
	+/* pkey configuration */
	+typedef struct _pkey_conf_t
	+{
	+          pkey_array_t    pkeys_per_port;
	+          struct _pkey_conf_t *next_conf;
	+}pkey_conf_t;
	 
	 /*
	  * Global Driver parameters.
	@@ -199,6 +205,8 @@
	            /* Pointer to the one and only bus root. */
	            bus_fdo_ext_t                            *p_bus_ext;
	 
	+          /* pkey array to be read */
	+          pkey_conf_t
*p_pkey_conf;
	 }          bus_globals_t;
	 
	 
	Index: core/bus/kernel/bus_pnp.h
	
===================================================================
	--- core/bus/kernel/bus_pnp.h     (revision 1478)
	+++ core/bus/kernel/bus_pnp.h  (working copy)
	@@ -87,4 +87,5 @@
	            IN                                             IRP*
const                                                        p_irp );
	 
	 NTSTATUS port_mgr_pkey_add();
	+NTSTATUS port_mgr_pkey_rem();
	 #endif  // !defined _BUS_DRV_PNP_H_
	Index: core/bus/kernel/bus_port_mgr.c
	
===================================================================
	--- core/bus/kernel/bus_port_mgr.c         (revision 1478)
	+++ core/bus/kernel/bus_port_mgr.c       (working copy)
	@@ -44,10 +44,12 @@
	 #include "iba/ipoib_ifc.h"
	 #include "al_dev.h"
	 
	+#define IPOIB_PART_DEVICE_ID        L"IBA\\IPoIBP"
	 #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. */
	 #define IPOIB_HARDWARE_ID             IPOIB_DEVICE_ID L"\0"
	+#define IPOIB_PART_HARDWARE_ID IPOIB_PART_DEVICE_ID L"\0"
	 #define IPOIB_DESCRIPTION               L"OpenIB IPoIB Adapter"
	 
	 /* {5A9649F4-0101-4a7c-8337-796C48082DA2} */
	@@ -62,7 +64,7 @@
	 {
	            bus_pdo_ext_t                           pdo;
	 
	-           port_guid_pkey                          port_guid;
	+          port_guid_pkey_t                       port_guid;
	            uint32_t                                     n_port;
	 
	            /* Number of references on the upper interface. */
	@@ -73,9 +75,6 @@
	 
	 port_mgr_t*
gp_port_mgr = NULL;
	 
	-extern pkey_array_t  g_pkeys;
	-
	-static boolean_t pkeys_enumerated = FALSE;
	 /*
	  * Function prototypes.
	  */
	@@ -391,7 +390,7 @@
	
p_ext->cl_ext.vfptr_pnp_po->identity, p_ext->cl_ext.p_self_do, p_ext,
p_ext->b_present, p_ext->b_reported_missing ) );
	                                    continue;
	                        }
	-                       if( p_ext->h_ca )
	+                      if( p_ext->h_ca &&
(!p_ext->is_partition_pdo))
	                        {
	                                    /* Invalidate bus relations
for the HCA. */
	                                    IoInvalidateDeviceRelations(
	@@ -564,6 +563,7 @@
	            return status;
	 }
	 
	+
	 ib_api_status_t
	 port_mgr_port_add(
	            IN
ib_pnp_port_rec_t*                                p_pnp_rec )
	@@ -573,6 +573,8 @@
	     uint8_t         num_pdo;
	            bus_port_ext_t   *p_port_ext;
	            ib_net16_t      pdo_cnt;
	+          pkey_conf_t                  *cur_conf; 
	+          pkey_array_t     *cur_pkeys = NULL;
	            BUS_ENTER( BUS_DBG_PNP );
	 
	            if( !bus_globals.b_report_port_nic )
	@@ -591,12 +593,22 @@
	                        return status;
	            }
	 
	+          cur_conf = bus_globals.p_pkey_conf;
	+          while(cur_conf)
	+          {
	+                      if(p_pnp_rec->p_port_attr->port_guid ==
cur_conf->pkeys_per_port.port_guid)
	+                      {
	+                                  cur_pkeys =
&cur_conf->pkeys_per_port;
	+                                  break;
	+                      }
	+                      cur_conf = cur_conf->next_conf;
	+          }
	     p_port_ext = NULL;
	 
	-           if( pkeys_enumerated)
	+          if( !cur_pkeys)
	                        pdo_cnt = 1;
	            else
	-                       pdo_cnt = g_pkeys.pkey_num + 1;
	+                      pdo_cnt =
cur_conf->pkeys_per_port.pkey_num + 1;
	 
	     for (num_pdo = 0; num_pdo < pdo_cnt; num_pdo++)
	     {
	@@ -637,6 +649,7 @@
	                        if(num_pdo > 0)
	                        {
	                                    p_port_ext->pdo.h_ca =
((bus_port_ext_t*)p_pdo[0]->DeviceExtension)->pdo.h_ca;
	+
p_port_ext->pdo.is_partition_pdo = TRUE;
	                        }
	                        else
	            p_port_ext->pdo.h_ca = acquire_ca(
p_pnp_rec->p_ca_attr->ca_guid );
	@@ -652,9 +665,8 @@
	                        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];
	-                       }
	+                                  p_port_ext->port_guid.pkey =
cur_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,
	@@ -668,7 +680,6 @@
	                        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(
	@@ -683,24 +694,79 @@
	 }
	 
	
/***********************************************************************
*************
	+* name            :           port_mgr_pkey_rem
	+*           removes pdo for each pkey value in pkey_array 
	+* input :           g_pkeys
	+* output:          none
	+* return:          cl_status
	
+***********************************************************************
**************/
	+cl_status_t port_mgr_pkey_rem(pkey_array_t *pkeys)
	+{
	+
	+          uint16_t                                     cnt;
	+          cl_list_item_t                  *p_list_item;
	+          bus_port_ext_t               *p_port_ext;
	+          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.guid ==
pkeys->port_guid)
	+                      {
	+                                  for(cnt = 0; cnt <
pkeys->pkey_num; cnt++)
	+                                  {
	+                                              if(
(p_port_ext->port_guid.pkey == pkeys->pkey_array[cnt]) &&
	+
(p_port_ext->port_guid.pkey != IB_DEFAULT_PKEY))
	+                                              {
	+
p_port_ext->pdo.b_present = FALSE;
	+
break;
	+                                              }
	+                                  }
	+                      }
	+          }
	+          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;
	+}
	
+/**********************************************************************
**************
	 * 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)
	+cl_status_t port_mgr_pkey_add(pkey_array_t *req_pkeys)
	 {
	            uint16_t                                     cnt;
	            NTSTATUS            status;
	            cl_list_item_t                  *p_list_item;
	-           bus_port_ext_t               *p_port_ext,
*pkey_port_ext;
	+          bus_port_ext_t               *p_port_ext,
*pkey_port_ext, *pmatched_guid_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 );
	 
	+          pmatched_guid_ext = NULL;
	            p_port_ext = NULL;
	            cl_mutex_acquire( &gp_port_mgr->pdo_mutex );
	            
	@@ -709,23 +775,38 @@
	                        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;
	+                      p_port_ext =
(bus_port_ext_t*)PARENT_STRUCT( p_list_item, bus_pdo_ext_t, list_item );
	 
	-                       if(p_port_ext->port_guid.pkey !=
IB_DEFAULT_PKEY)
	-                                   break;
	+                      if(p_port_ext->port_guid.guid ==
req_pkeys->port_guid)
	+                      {
	+                                  uint16_t i;
	+                                  for(i = 0; i <
req_pkeys->pkey_num; i++)
	+                                  {
	+
if(p_port_ext->port_guid.pkey == req_pkeys->pkey_array[i])
	+                                              {
	+                                                          /*
was removed previously */
	+
p_port_ext->pdo.b_present = TRUE;
	+
p_port_ext->pdo.b_reported_missing = FALSE;
	+
req_pkeys->pkey_array[i] = 0;  
	+                                              }
	+                                  }
	+                                  if(!pmatched_guid_ext)
	+                                              pmatched_guid_ext
= p_port_ext;
	+                      }
	            }
	            cl_mutex_release( &gp_port_mgr->pdo_mutex );
	 
	-           if (!p_port_ext)
	+          if (!pmatched_guid_ext)
	            {
	                        BUS_TRACE_EXIT( BUS_DBG_ERROR,
	                                    ("No existed pdo found.\n")
);
	-                       return CL_ERROR;
	+                      return CL_NOT_FOUND;
	            }
	 
	-    for (cnt = 0; cnt < pkeys->pkey_num; cnt++)
	+    for (cnt = 0; cnt < req_pkeys->pkey_num; cnt++)
	     {
	+                      if(!
(cl_hton16(req_pkeys->pkey_array[cnt]) & IB_PKEY_BASE_MASK) )
	+                                  continue;
	 
	                        /* Create the PDO for the new port
device. */
	                        status = IoCreateDevice(
bus_globals.p_driver_obj, sizeof(bus_port_ext_t),
	@@ -758,12 +839,12 @@
	
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];
	-
	+                      pkey_port_ext->pdo.ca_guid =
pmatched_guid_ext->pdo.ca_guid;
	+                      pkey_port_ext->pdo.h_ca =
pmatched_guid_ext->pdo.h_ca;
	+                      pkey_port_ext->port_guid.guid =
pmatched_guid_ext->port_guid.guid;
	+                      pkey_port_ext->n_port =
pmatched_guid_ext->n_port;
	+                      pkey_port_ext->port_guid.pkey =
req_pkeys->pkey_array[cnt];
	+                      pkey_port_ext->pdo.is_partition_pdo =
TRUE;
	                        /* 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,
	@@ -773,7 +854,7 @@
	 
	            /* 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 );
	+
pmatched_guid_ext->pdo.h_ca->obj.p_ci_ca->verbs.p_hca_dev, BusRelations
);
	 
	            /* Invalidate removal relations for the bus driver.
*/
	            IoInvalidateDeviceRelations(
	@@ -1079,6 +1160,7 @@
	 {
	            WCHAR
*p_string;
	            bus_port_ext_t               *p_ext;
	+          size_t
dev_id_size;
	            
	            BUS_ENTER( BUS_DBG_PNP );
	 
	@@ -1089,17 +1171,24 @@
	                        BUS_TRACE_EXIT( BUS_DBG_ERROR, ("Device
not present.\n") );
	                        return STATUS_NO_SUCH_DEVICE;
	            }
	-
	+          if(p_ext->port_guid.pkey == IB_DEFAULT_PKEY)
	+                      dev_id_size = sizeof(IPOIB_DEVICE_ID);
	+          else
	+                      dev_id_size = sizeof(IPOIB_PART_DEVICE_ID
);
	            /* Device ID is "IBA\SID_<sid> where <sid> is the
IPoIB Service ID. */
	-           p_string = ExAllocatePoolWithTag( PagedPool,
sizeof(IPOIB_DEVICE_ID), 'vedq' );
	+          p_string = ExAllocatePoolWithTag( PagedPool,
dev_id_size, 'vedq' );
	            if( !p_string )
	            {
	                        BUS_TRACE_EXIT( BUS_DBG_ERROR,
	                                    ("Failed to allocate device
ID buffer (%d bytes).\n",
	-                                   sizeof(IPOIB_DEVICE_ID)) );
	+                                  dev_id_size) );
	                        return STATUS_INSUFFICIENT_RESOURCES;
	            }
	-           cl_memcpy( p_string, IPOIB_DEVICE_ID,
sizeof(IPOIB_DEVICE_ID) );
	+
	+          if(p_ext->port_guid.pkey == IB_DEFAULT_PKEY)
	+                      cl_memcpy( p_string, IPOIB_DEVICE_ID,
sizeof(IPOIB_DEVICE_ID) );
	+          else
	+                      cl_memcpy( p_string,
IPOIB_PART_DEVICE_ID, sizeof(IPOIB_PART_DEVICE_ID) );
	            p_irp->IoStatus.Information = (ULONG_PTR)p_string;
	 
	            BUS_EXIT( BUS_DBG_PNP );
	@@ -1114,26 +1203,30 @@
	 {
	            WCHAR
*p_string;
	            bus_port_ext_t               *p_ext;
	+          size_t
dev_id_size;
	 
	            BUS_ENTER( BUS_DBG_PNP );
	 
	 
	            p_ext = (bus_port_ext_t*)p_dev_obj->DeviceExtension;
	-           if( !p_ext->pdo.b_present )
	-           {
	-                       BUS_TRACE_EXIT( BUS_DBG_ERROR, ("Device
not present.\n") );
	-                       return STATUS_NO_SUCH_DEVICE;
	-           }
	 
	-           p_string = ExAllocatePoolWithTag( PagedPool,
sizeof(IPOIB_HARDWARE_ID), 'ihqp' );
	+          if(p_ext->port_guid.pkey == IB_DEFAULT_PKEY)
	+                      dev_id_size = sizeof(IPOIB_HARDWARE_ID);
	+          else
	+                      dev_id_size =
sizeof(IPOIB_PART_HARDWARE_ID );
	+
	+          p_string = ExAllocatePoolWithTag( PagedPool,
dev_id_size, 'ihqp' );
	            if( !p_string )
	            {
	                        BUS_TRACE_EXIT( BUS_DBG_ERROR,
	                                    ("Failed to allocate
hardware ID buffer (%d bytes).\n",
	-                                   sizeof(IPOIB_HARDWARE_ID))
);
	+                                  dev_id_size) );
	                        return STATUS_INSUFFICIENT_RESOURCES;
	            }
	-           cl_memcpy( p_string, IPOIB_HARDWARE_ID,
sizeof(IPOIB_HARDWARE_ID) );
	+          if(p_ext->port_guid.pkey == IB_DEFAULT_PKEY)
	+                      cl_memcpy( p_string, IPOIB_HARDWARE_ID,
sizeof(IPOIB_HARDWARE_ID) );
	+          else
	+                      cl_memcpy( p_string,
IPOIB_PART_HARDWARE_ID, sizeof(IPOIB_PART_HARDWARE_ID) );
	            p_irp->IoStatus.Information = (ULONG_PTR)p_string;
	 
	            BUS_EXIT( BUS_DBG_PNP );
	Index: hw/mthca/kernel/mt_cache.c
	
===================================================================
	--- hw/mthca/kernel/mt_cache.c  (revision 1478)
	+++ hw/mthca/kernel/mt_cache.c           (working copy)
	@@ -321,7 +321,7 @@
	                                                // allocate work
item
	                                                work->work_item
= IoAllocateWorkItem(pdo);
	                                                if
(work->work_item == NULL) {
	-
//TODO: at least - print error. Need to return code, but the function is
void 
	+
HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_LOW,("Failed to allocate workitem
for cache update.\n"));
	                                                }
	                                                else { //
schedule the work
	
IoQueueWorkItem(
	@@ -334,6 +334,10 @@
	                                    }
	                                    
	                        }
	+                      else
	+                      {
	+                                  HCA_PRINT(TRACE_LEVEL_ERROR
,HCA_DBG_MEMORY,("Failed to memory for workitem.\n"));
	+                      }
	            }
	 }
	 
	Index: inc/kernel/iba/ipoib_ifc.h
	
===================================================================
	--- inc/kernel/iba/ipoib_ifc.h        (revision 1478)
	+++ inc/kernel/iba/ipoib_ifc.h     (working copy)
	@@ -68,7 +68,7 @@
	 {
	            net64_t             guid;
	            ib_net16_t         pkey;
	-} port_guid_pkey;
	+} port_guid_pkey_t;
	 
	 
	 /*
	@@ -79,7 +79,7 @@
	 typedef struct _ipoib_ifc_data
	 {
	            net64_t
ca_guid;
	-           port_guid_pkey
port_guid;
	+          port_guid_pkey_t
port_guid;
	            uint8_t
port_num;
	 
	 }          ipoib_ifc_data_t;
	Index: tools/part_man/user/part_man.c
	
===================================================================
	--- tools/part_man/user/part_man.c         (revision 1478)
	+++ tools/part_man/user/part_man.c       (working copy)
	@@ -1,3 +1,4 @@
	+
	 #include "stdio.h"
	 #include "string.h"
	 #include "stdlib.h"
	@@ -2,7 +3,7 @@
	 #include <windows.h>
	-
	 #include <iba/ib_types.h>
	 #include <iba/ib_al.h>
	 #include "al_dev.h"
	 
	+
	 typedef enum
	@@ -21,6 +22,7 @@
	            {
	                        struct
	                        {
	+                                  net64_t
port_guid;
	                                    unsigned short     pkey_num;
	                                    unsigned __int16
pkeys[MAX_NUM_PKEY];
	                                    Pkey_action
action;
	@@ -33,7 +35,7 @@
	 
	 void show_help()
	 {
	-           printf("Usage : part_man.exe <show|add|rem> <pkey1
pkey2 ...>\n");
	+          printf("Usage : part_man.exe <show|add|rem>
<port_guid> <pkey1, pkey2, ...>\n");
	 }
	 
	
/********************************************************************
	@@ -85,7 +87,7 @@
	            return retval;
	 }
	 
	-static boolean_t reg_ibbus_print_pkey()
	+static int reg_ibbus_print_pkey()
	 {
	            int result;
	            char pkeyBuf[DEFAULT_BUFER_SIZE];
	@@ -98,71 +100,100 @@
	            if (result < 4)
	            {
	                        printf("No configured pkey found\n");
	-                       return FALSE;
	+                      return 1;
	            }
	-           return TRUE;
	+          return 0;
	 }
	 
	-static int reg_ibbus_pkey_add(const uint16_t *pkeys, uint16_t
pkey_num,OUT pkey_array_t *pkey)
	+static int reg_ibbus_pkey_add(const uint16_t *pkeys, uint16_t
pkey_num,OUT pkey_array_t *pkey, OUT char **final_reg_string, OUT DWORD
*reg_length)
	 {
	-           char partKey[DEFAULT_BUFER_SIZE];
	-           char tmp[10];
	+          static char partKey[DEFAULT_BUFER_SIZE];
	+          char tmp[20];
	+          char *guid_string, *p;
	            HKEY reg_handle;
	            LONG   ret;
	+          char *tmpbuff = NULL;
	            int cnt;
	            int retval = 0;
	            uint16_t i = 0;
	            DWORD  read_length;
	 
	+          *final_reg_string = NULL;
	            read_length =
reg_ibbus_pkey_show(FALSE,(char*)partKey,®_handle);
	-
	+          p = NULL;
	+          guid_string = NULL;
	            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;
	+                      cnt =
sprintf(partKey,"0x%I64X:",pkey->port_guid);
	            }
	            else
	            {
	                        /* update the existed registry list */
	-                       cnt = (int)strlen(partKey);
	-                       i = 0;
	+                      sprintf(tmp,"0x%I64X",pkey->port_guid);
	+                      guid_string = strstr(partKey,tmp);
	+                      if(guid_string)
	+                      {
	+                                  p = strstr(guid_string,";");
	+                                  tmpbuff =
(char*)malloc(strlen(p) + 1);
	+                                  if(!tmpbuff)
	+                                  {
	+                                              printf("Failed
memory allocation\n");
	+                                              return 1;
	+                                  }
	+                                  /* save the rest of the
string */
	+                                  strcpy(tmpbuff,p);
	+                                  cnt = (int)(p - partKey);
	+                      }
	+                      else
	+                      {
	+                                  cnt = strlen(partKey) +
sprintf(partKey + strlen(partKey),"%s:",tmp);
	+                      }
	            }           
	 
	-           for ( ;i < pkey_num; i++)
	+          for (i = 0 ;i < pkey_num; i++)
	            {
	+                      char *same_pkey;
	                        sprintf(tmp,"0x%04X",pkeys[i]);
	-                       if (strstr(partKey,tmp))
	+                      if ( guid_string )
	                        {
	-                                   continue;
	+                                  same_pkey =
strstr(guid_string,tmp);
	+                                  if( same_pkey && (same_pkey <
p) )
	+                                              continue;
	                        }
	                        pkey->pkey_array[pkey->pkey_num] =
pkeys[i];
	                        pkey->pkey_num++;
	-                       cnt += sprintf(partKey +
cnt,",0x%04X",pkeys[i]);
	+                      if( (i == 0) && (!guid_string))
	+                                  cnt += sprintf(partKey +
cnt,"0x%04X",pkeys[i]);
	+                      else
	+                                  cnt += sprintf(partKey +
cnt,",0x%04X",pkeys[i]);
	            }
	-           cnt += sprintf(partKey + cnt,"\0");
	+          if(tmpbuff)
	+          {
	+                      cnt += sprintf(partKey +
cnt,"%s",tmpbuff);
	+                      free(tmpbuff);
	+          }
	+          else
	+                      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;
	-                       }
	+          {                                   
	+                                  *final_reg_string = partKey;
	+                                  *reg_length = (DWORD)cnt;
	            }
	            else
	+          {
	                        printf("No pkey to add\n");
	+                      retval = 1;
	+          }
	            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'};
	+          static char partKey[DEFAULT_BUFER_SIZE];
	+          static char newKey[DEFAULT_BUFER_SIZE] = {'\0'};
	 
	            HKEY reg_handle;
	            LONG   ret;
	@@ -171,9 +202,14 @@
	            unsigned __int16 cur_pkey;
	            int retval = 0;
	            unsigned short i = 0;
	-           char seps[] = ",";
	+          char pkey_sep[] = ",";
	+          char *pfrom, *pto;
	+          char *guid_string;
	+          char tmp[20];
	            char *token;
	+          char *pafter = NULL;
	            boolean_t found2remove;
	+          boolean_t pkey_not_written = TRUE;
	 
	            read_length =
reg_ibbus_pkey_show(FALSE,(char*)partKey,®_handle);
	            do
	@@ -186,23 +222,57 @@
	                                    break;
	                        }
	 
	-                       token = strtok(partKey,seps);
	-                       cnt = 0;
	+                      sprintf(tmp,"0x%I64X\0",pkey->port_guid);
	+                      guid_string = strstr(partKey,tmp);
	+                      if (! guid_string)
	+                      {
	+                                  printf("No guid configured -
nothing to remove\n");
	+                                  retval = 1;
	+                                  break;
	+                      }
	+                      pfrom = strstr(guid_string,":");
	+                      pto   = strstr(guid_string,";");
	+                      if ( (!pfrom) || (!pto))
	+                      {
	+                                  printf("Error
configuration\n");
	+                                  retval = 1;
	+                                  break;
	+                      }
	+
	+                      pfrom++;
	+                      pafter  = (char*)malloc(strlen(pto) + 1);
	+
	+                      if(!pafter)
	+                      {
	+                                  printf("Allocation
failed\n");
	+                                  retval = 1;
	+                                  break;
	+                      }
	+                      _snprintf(newKey,(int)(pfrom -
partKey),"%s",partKey);
	+                      cnt = (int)(pfrom - partKey);
	+                      strcpy(pafter,pto);
	+                      pto[0] = '\0';
	+                      strcpy(partKey,pfrom);
	+                      token = strtok(partKey,pkey_sep);
	                        while(token)
	                        {
	                                    found2remove = FALSE;
	                                    converted =
sscanf(token,"0x%X",&cur_pkey);
	-                                   if(! converted || (converted
== EOF))
	+                                  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)
	+                                              {
	+
pkey->pkey_array[pkey->pkey_num] = pkeys[i];
	
break;
	+                                              }
	                                    }
	                                    
	                                    if(found2remove)
	@@ -211,12 +281,15 @@
	                                    }
	                                    else
	                                    {
	-                                               if(!cnt)
	+
if(pkey_not_written)
	+                                              {
	                                                            cnt
+= sprintf(newKey + cnt,"0x%04X",cur_pkey);
	+
pkey_not_written = FALSE;
	+                                              }
	                                                else
	                                                            cnt
+= sprintf(newKey + cnt,",0x%04X",cur_pkey);
	                                    }
	-                                   token = strtok(NULL,seps);
	+                                  token =
strtok(NULL,pkey_sep);
	                        }
	 
	                        if(! pkey->pkey_num)
	@@ -227,6 +300,10 @@
	                                    break;
	                        }
	 
	+                      if(pkey_not_written)
	+                                  cnt -= (2 + strlen(tmp));
	+                      
	+                      strcpy(newKey + cnt,pafter);
	                        ret =
RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)newKey,
(DWORD)strlen(newKey));
	                        if (ERROR_SUCCESS != ret)
	                        {
	@@ -236,12 +313,14 @@
	                        }
	            }
	            while(FALSE);
	+          if(pafter)
	+                      free(pafter);
	 
	            RegCloseKey( reg_handle );
	            return retval;
	 }
	 
	-int send_create_pdo_req(pkey_array_t *pkeys)
	+static int send_pdo_req(pkey_array_t *pkeys,DWORD iocode)
	 {
	            HANDLE hKernelLib;
	            DWORD                       bytesReturned;
	@@ -264,13 +343,22 @@
	            }
	 
	            if (! DeviceIoControl(hKernelLib,
	-
UAL_REQ_CREATE_PDO,
	+
iocode,
	
pkeys,sizeof(pkey_array_t),
	
NULL,0,
	
&bytesReturned,
	
NULL))
	            {
	-                       printf("send_create_pdo_req failed error
%d\n",GetLastError());
	+                      DWORD err = GetLastError();
	+                      if (err == 1168)
	+                                  printf("No matched port guid
(0x%I64X) found\n",pkeys->port_guid);
	+                      else if (err == 1117)
	+                                  printf("operation failed -
internal driver error\n");
	+                      else if(err == 87)
	+                                  printf("operation failed -
invalid input to driver\n");
	+                      else
	+                                  printf("operation failed with
error %d\n",err);
	+
	                        CloseHandle(hKernelLib);
	                        return 1;
	            }
	@@ -278,11 +366,16 @@
	            return 0;
	 }
	 
	+
	 boolean_t reg_pkey_operation(const REQUEST_IN *input)
	 {
	            pkey_array_t pkeys;
	+          HKEY reg_handle;
	+          char *p_reg_string;
	+          DWORD reg_length = 0;
	            int result;
	            int i;
	+          LONG   ret;
	            if(!input)
	            {
	                        printf("create_ipoib_pdo : invalid input
parameter\n");
	@@ -290,20 +383,44 @@
	            }
	 
	            RtlZeroMemory(&pkeys,sizeof(pkeys));
	+          pkeys.port_guid = input->u.guid_pkey.port_guid;
	+
	            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);
	+                      result = reg_ibbus_pkey_add((unsigned
__int16*)input->u.guid_pkey.pkeys, input->u.guid_pkey.pkey_num,
&pkeys,&p_reg_string,®_length);
	            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();
	+                      result =  reg_ibbus_print_pkey();
	+          else
	+                      printf("Invalid command to
part_man.exe\n");
	 
	-           if(0 == result)
	+          if( 0 != result)
	+                      return FALSE;
	+
	+          if(pkeys.pkey_num)
	            {
	-                       if(pkeys.pkey_num)
	-                                   return (boolean_t)( 0 ==
send_create_pdo_req(&pkeys));
	+                      if(input->u.guid_pkey.action == pkey_add)
	+                      {
	+                                  if( 0 ==
send_pdo_req(&pkeys,UAL_REQ_CREATE_PDO))
	+                                  {
	+                                              ret =
RegOpenKeyEx(HKEY_LOCAL_MACHINE,IBBUS_SERV_KEY,0,KEY_SET_VALUE |
KEY_QUERY_VALUE ,®_handle);
	+
	+                                              ret =
RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)p_reg_string,reg
_length);
	+                                              RegCloseKey(
reg_handle );
	+                                              if (ERROR_SUCCESS
== ret)
	+                                              {
	+
return TRUE;
	+                                              }
	+                                              else
	+                                              {
	+
printf("reg_ibbus_pkey_add RegSetValueEx error = %d\n",GetLastError());
	+                                              }
	+                                  }
	+                      }
	+                      else if(input->u.guid_pkey.action ==
pkey_rem)
	+                      {
	+                                  return (boolean_t)( 0 ==
send_pdo_req(&pkeys,UAL_REQ_REMOVE_PDO));
	+                      }
	            }
	            return FALSE;
	 }
	@@ -328,18 +445,38 @@
	                        return 0;
	            }
	 
	-           if(num < 3)
	+          if(num < 4)
	            {
	                        printf("invalid command %s\n",cmd[1]);
	                        return 0;
	            }
	-           for( i = 2; i < num; i++)
	+
	+    /* vstat output format 0008:f104:0397:7ccc 
	+             For port guid add 1 for each port 
	+          */
	+          if (strstr(cmd[2],":"))
	            {
	-                       if (strstr(cmd[i],"0x"))
	+                      int i;
	+                      unsigned short *guid_vstat;
	+                      guid_vstat = (unsigned
short*)&input->u.guid_pkey.port_guid;
	+
sscanf(cmd[2],"%x:%x:%x:%x",&guid_vstat[0],&guid_vstat[1],&guid_vstat[2]
,&guid_vstat[3]);
	+                      for( i = 0; i < 4; i++)
	+                                  guid_vstat[i] =
(guid_vstat[i] << 8) | (guid_vstat[i] >> 8);
	+          }
	+          else
	+          {
	+                      printf("port guid %s - illegal string
format\n",cmd[2]);
	+                      return 0;
	+          }
	+          
	+          for( i = 3; i < num; i++)
	+          {
	+                      if((strstr(cmd[i],"ffff")) ||
(strstr(cmd[i],"FFFF")))
	+                                  continue;
	+                      if (strstr(cmd[i],"0x") ||
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;
	Index: ulp/ipoib/kernel/ipoib_adapter.c
	
===================================================================
	--- ulp/ipoib/kernel/ipoib_adapter.c          (revision 1478)
	+++ ulp/ipoib/kernel/ipoib_adapter.c       (working copy)
	@@ -488,14 +488,74 @@
	 
	 
	 static ib_api_status_t
	+ipoib_query_pkey_index(ipoib_adapter_t           *p_adapter)
	+{
	+          ib_api_status_t                          status;
	+          ib_ca_attr_t                       *ca_attr;
	+          uint32_t                             ca_size;
	+          uint16_t index = 0;
	+
	+          /* Query the CA for Pkey table */
	+          status =
p_adapter->p_ifc->query_ca(p_adapter->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_MEMORY;
	+          }
	+
	+          status =
p_adapter->p_ifc->query_ca(p_adapter->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_adapter->p_ifc->get_err_str( status )) );
	+                      goto pkey_end;
	+          }
	+
	+          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(cl_hton16(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"));
	+                      NdisWriteErrorLogEntry(
p_adapter->h_adapter,
	+                                  EVENT_IPOIB_PARTITION_ERR, 1,
p_adapter->guids.port_guid.pkey );
	+                      p_adapter->p_port->pkey_index =
PKEY_INVALID_INDEX;
	+                      goto pkey_end;
	+          }
	+
	+          p_adapter->p_port->pkey_index = index;
	+          IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_IB,
	+                                                          ("for
PKEY = 0x%04X got index = %d\n",p_adapter->guids.port_guid.pkey,index));
	+
	+pkey_end:
	+          if(ca_attr)
	+                      cl_free(ca_attr);
	+          return status;
	+}
	+
	+static ib_api_status_t
	 __ipoib_pnp_cb(
	            IN
ib_pnp_rec_t                                         *p_pnp_rec )
	 {
	-           ib_api_status_t              status;
	            ipoib_adapter_t              *p_adapter;
	            ipoib_port_t                   *p_port;
	            ib_pnp_event_t              old_state;
	            ib_pnp_port_rec_t          *p_port_rec;
	+          ib_api_status_t              status = IB_SUCCESS;
	 
	            IPOIB_ENTER( IPOIB_DBG_PNP );
	 
	@@ -654,16 +714,26 @@
	                                    ("IPOIB: Received unhandled
PnP event 0x%x (%s)\n",
	                                    p_pnp_rec->pnp_event,
ib_get_pnp_event_str( p_pnp_rec->pnp_event )) );
	                        /* Fall through. */
	-           case IB_PNP_PKEY_CHANGE:
	-           case IB_PNP_SM_CHANGE:
	-           case IB_PNP_GID_CHANGE:
	-           case IB_PNP_LID_CHANGE:
	+
	                        status = IB_SUCCESS;
	 
	-                       /* We ignore this event if the link is
not active. */
	+                      /* We ignore events below if the link is
not active. */
	                        if( p_port_rec->p_port_attr->link_state
!= IB_LINK_ACTIVE )
	-                                   break;
	+                                  break;
	 
	+                      case IB_PNP_PKEY_CHANGE:
	+                                  if(p_pnp_rec->pnp_event ==
IB_PNP_PKEY_CHANGE && 
	+
p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)
	+                                  {
	+                                              status =
ipoib_query_pkey_index(p_adapter);
	+                                              if(status !=
IB_SUCCESS)
	+
break;
	+                                  }
	+
	+                      case IB_PNP_SM_CHANGE:
	+                      case IB_PNP_GID_CHANGE:
	+                      case IB_PNP_LID_CHANGE:
	+
	                        cl_obj_lock( &p_adapter->obj );
	                        old_state = p_adapter->state;
	                        switch( old_state )
	@@ -1006,6 +1076,9 @@
	                        break;
	 
	            default:
	+                      if (p_adapter->guids.port_guid.pkey !=
IB_DEFAULT_PKEY)
	+
ipoib_query_pkey_index(p_adapter);
	+
	                        /* Join all programmed multicast groups.
*/
	                        for( i = 0; i <
p_adapter->mcast_array_size; i++ )
	                        {
	Index: ulp/ipoib/kernel/ipoib_log.mc
	
===================================================================
	--- ulp/ipoib/kernel/ipoib_log.mc  (revision 1478)
	+++ ulp/ipoib/kernel/ipoib_log.mc            (working copy)
	@@ -307,3 +307,12 @@
	 Language=English
	 %2: Incorrect value or non-existing registry  for the optional
IPoIB parameter %3, overriding it by default value: %4
	 .
	+
	+MessageId=0x005B
	+Facility=IPoIB
	+Severity=Error
	+SymbolicName=EVENT_IPOIB_PARTITION_ERR
	+Language=English
	+%2: Pkey index not found for partition , change switch pkey
configuration.
	+.
	+
	Index: ulp/ipoib/kernel/ipoib_port.c
	
===================================================================
	--- ulp/ipoib/kernel/ipoib_port.c   (revision 1478)
	+++ ulp/ipoib/kernel/ipoib_port.c (working copy)
	@@ -815,8 +815,6 @@
	            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 );
	 
	@@ -834,52 +832,6 @@
	                        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 )
	-           {
	-                       cl_free(ca_attr);
	-                       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 );
	@@ -5206,7 +5158,7 @@
	 
	     member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8) ;
	            member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;
	-           member_rec.pkey =
p_port->p_adapter->guids.port_guid.pkey;
	+          member_rec.pkey =
cl_hton16(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;
	@@ -5411,7 +5363,7 @@
	            mcast_req.member_rec.mtu =
	                        (IB_PATH_SELECTOR_EXACTLY << 6) |
IB_MTU_LEN_2048;
	 
	-           mcast_req.member_rec.pkey =
p_port->p_adapter->guids.port_guid.pkey;
	+          mcast_req.member_rec.pkey =
cl_hton16(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 =
	@@ -5791,7 +5743,7 @@
	            mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;
	            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;
	+          mcast_req.member_rec.pkey =
cl_hton16(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 1478)
	+++ ulp/ipoib/kernel/ipoib_port.h (working copy)
	@@ -56,6 +56,11 @@
	 #define MAX_SEND_SGE         8
	 
	 
	+/* 
	+ *  Invalid pkey index
	+ */
	+#define PKEY_INVALID_INDEX           0xFFFF
	+
	 /*
	  * Define to control how transfers are done.  When defined as
1, causes
	  * packets to be sent using NDIS DMA facilities (getting the
SGL from the
	Index: ulp/ipoib/kernel/netipoib.inx
	
===================================================================
	--- ulp/ipoib/kernel/netipoib.inx    (revision 1478)
	+++ ulp/ipoib/kernel/netipoib.inx  (working copy)
	@@ -21,12 +21,15 @@
	 
	 [OPENIB.ntx86]
	 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet
Protocol over InfiniBand Adapter
	+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet
Protocol over InfiniBand Adapter with partition key
	 
	 [OPENIB.ntamd64]
	 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet
Protocol over InfiniBand Adapter
	+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet
Protocol over InfiniBand Adapter with partition key
	 
	 [OPENIB.ntia64]
	 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet
Protocol over InfiniBand Adapter
	+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet
Protocol over InfiniBand Adapter with partition key
	 
	 [Ipoib.DDInstall.ntx86]
	 Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL
	@@ -130,12 +133,15 @@
	 HKR, Ndi\Params\PayloadMtu,              Min,
0, "60"
	 HKR, Ndi\Params\PayloadMtu,              Max,
0, "4092"
	 
	+
	 HKR, Ndi\Params\MCLeaveRescan,                   ParamDesc,
0, "MC leave rescan (sec)"
	 HKR, Ndi\Params\MCLeaveRescan,                   Type,
0, "dword"
	 HKR, Ndi\Params\MCLeaveRescan,                   Default, 0,
"260"
	 HKR, Ndi\Params\MCLeaveRescan,                   Optional,
0, "0"
	 HKR, Ndi\Params\MCLeaveRescan,                   Min,
0, "1"
	 HKR, Ndi\Params\MCLeaveRescan,                   Max,
0, "3600"
	+
	+
	 [IpoibService]
	 DisplayName     = %IpoibServiceDispName%
	 ServiceType     = 1 ;%SERVICE_KERNEL_DRIVER%
	@@ -209,6 +215,7 @@
	 [Strings]
	 OPENIB               = "OpenIB Alliance"
	 IpoibDesc            = "OpenIB IPoIB Adapter"
	+IpoibDescP           = "OpenIB IPoIB Adapter Partition"
	 IpoibServiceDispName = "IPoIB"
	 IcsDisk1             = "OpenIB IPoIB Disk #1"
	 DIRID_SYSTEM         = 11
	 
	 
	Slava 
	 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20080825/b0206259/attachment.html>
    
    
More information about the ofw
mailing list