[ofw] [PATCH] partition
Slava Strebkov
slavas at voltaire.com
Wed Apr 2 05:39:10 PDT 2008
Hi,
The following patch implements partition feature. It's still not
working; CQ completes WR's with IB_WCS_WR_FLUSHED_ERR.
Pkey value is written into registry under
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ibbus\Parameters.
To use partition, specify valid pkey value in IbPkey.
Ibbus driver creates additional PDO for each Pkey value read from
registry.
Index: core/bus/kernel/bus_driver.c
===================================================================
--- core/bus/kernel/bus_driver.c (revision 1026)
+++ core/bus/kernel/bus_driver.c (working copy)
@@ -56,6 +56,8 @@
#else
#define DEFAULT_NODE_DESC "OpenIB Windows(r) Host"
#endif
+/* Pkey read from registry */
+pkey_array g_ib_pkey_array;
char node_desc[IB_NODE_DESCRIPTION_SIZE];
@@ -185,7 +187,100 @@
BUS_ENTER( BUS_DBG_DRV );
}
+static void __prepare_pKey_array(const UNICODE_STRING *str)
+{
+ uint16_t i;
+ NTSTATUS status;
+ ANSI_STRING ansi_str;
+ g_ib_pkey_array.num_pKeys = 0;
+ status = RtlUnicodeStringToAnsiString(&ansi_str,str,TRUE);
+ if(! NT_SUCCESS(status))
+ return;
+
+ for (i = 0; (i < ansi_str.MaximumLength) &&
(g_ib_pkey_array.num_pKeys < MAX_NUM_PKEY) ; i++)
+ {
+ switch(ansi_str.Buffer[i])
+ {
+ case '0':
+ if (((i+1) < ansi_str.Length) && ( (
ansi_str.Buffer[i+1] == 'x') || ( ansi_str.Buffer[i+1] == 'X')))
+ break;
+ else
+ {
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)| 0;
+ break;
+ }
+
+ case 'x':
+ case 'X':
+ break;
+
+ case ',':
+ g_ib_pkey_array.num_pKeys++;
+ break;
+
+ case 'A':
+ case 'a':
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)| 0xA;
+ break;
+
+ case 'B':
+ case 'b':
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)| 0xB;
+ break;
+
+ case 'C':
+ case 'c':
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)| 0xC;
+ break;
+
+ case 'D':
+ case 'd':
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)| 0xD;
+ break;
+
+ case 'E':
+ case 'e':
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)| 0xE;
+ break;
+
+ case 'F':
+ case 'f':
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)| 0xF;
+ break;
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+
g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] = \
+
(g_ib_pkey_array.pKey[g_ib_pkey_array.num_pKeys] << 4)|
(ansi_str.Buffer[i] - '0');
+ break;
+
+ case '\0':
+ g_ib_pkey_array.num_pKeys++;
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ RtlFreeAnsiString(&ansi_str);
+}
static NTSTATUS
__read_registry(
IN
UNICODE_STRING* const p_registry_path )
@@ -194,6 +289,7 @@
/* Remember the terminating entry in the table below. */
RTL_QUERY_REGISTRY_TABLE table[9];
UNICODE_STRING
param_path;
+ UNICODE_STRING
pkeyString;
BUS_ENTER( BUS_DBG_DRV );
@@ -212,7 +308,18 @@
RtlAppendUnicodeStringToString( ¶m_path, p_registry_path
);
RtlAppendUnicodeToString( ¶m_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;
+ }
+
/*
* Clear the table. This clears all the query callback
pointers,
* and sets up the terminating table entry.
@@ -277,9 +384,17 @@
table[7].DefaultData = &g_ioc_poll_interval;
table[7].DefaultLength = sizeof(ULONG);
+ table[8].Flags = RTL_QUERY_REGISTRY_DIRECT;
+ table[8].Name = L"IbPkey";
+ table[8].EntryContext = &pkeyString;
+ table[8].DefaultType = REG_SZ;
+ table[8].DefaultData = NULL;
+ table[8].DefaultLength = 1024*sizeof(WCHAR);
/* Have at it! */
status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE,
param_path.Buffer, table, NULL, NULL );
+ if (NT_SUCCESS(status))
+ __prepare_pKey_array(&pkeyString);
#if DBG
if( g_al_dbg_flags & AL_DBG_ERR )
@@ -291,6 +406,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;
Index: core/bus/kernel/bus_driver.h
===================================================================
--- core/bus/kernel/bus_driver.h (revision 1026)
+++ core/bus/kernel/bus_driver.h (working copy)
@@ -203,5 +203,11 @@
extern bus_globals_t bus_globals;
+#define MAX_NUM_PKEY 10
+typedef struct
+{
+ uint16_t pKey[MAX_NUM_PKEY];
+ uint8_t num_pKeys;
+}pkey_array;
#endif /* !defined _BUS_DRIVER_H_ */
Index: core/bus/kernel/bus_port_mgr.c
===================================================================
--- core/bus/kernel/bus_port_mgr.c (revision 1026)
+++ core/bus/kernel/bus_port_mgr.c (working copy)
@@ -54,6 +54,8 @@
DEFINE_GUID(GUID_BUS_TYPE_IBA,
0x5a9649f4, 0x101, 0x4a7c, 0x83, 0x37, 0x79, 0x6c, 0x48, 0x8, 0x2d,
0xa2);
+/* IB pKey array from registry */
+extern pkey_array g_ib_pkey_array ;
/*
* Device extension for IPoIB port PDOs.
@@ -62,7 +64,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. */
@@ -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.port_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.port_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.port_guid ) );
}
}
else
@@ -567,9 +568,9 @@
IN
ib_pnp_port_rec_t* p_pnp_rec )
{
NTSTATUS status;
- DEVICE_OBJECT *p_pdo;
bus_port_ext_t *p_port_ext;
-
+ DEVICE_OBJECT *p_pdo[MAX_NUM_PKEY + 1];
+ uint8_t num_pdo;
BUS_ENTER( BUS_DBG_PNP );
if( !bus_globals.b_report_port_nic )
@@ -588,11 +589,15 @@
return status;
}
+ p_port_ext = NULL;
+
+ for (num_pdo = 0; num_pdo < g_ib_pkey_array.num_pKeys + 1;
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 +606,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,22 +620,33 @@
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. */
- p_port_ext->pdo.h_ca = acquire_ca(
p_pnp_rec->p_ca_attr->ca_guid );
+ 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 );
+ 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.port_guid =
p_pnp_rec->p_port_attr->port_guid;
+ p_port_ext->port_guid.pkey = IB_DEFAULT_PKEY;
+
+ if(num_pdo > 0)
+ {
+ p_port_ext->port_guid.pkey =
g_ib_pkey_array.pKey[num_pdo -1];
+ }
p_port_ext->n_port = p_pnp_rec->p_port_attr->port_num;
/* Store the device extension in the port vector for future
queries. */
@@ -643,8 +659,11 @@
* 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;
+ }
+
/* 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 );
Index: core/bus/kernel/ib_bus.inf
===================================================================
--- core/bus/kernel/ib_bus.inf (revision 1026)
+++ 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","IbPkey",%REG_SZ%,"0xBABA"
[Iou.ParamsReg]
HKR,"Parameters","DebugLevel",%REG_DWORD%,2
Index: ulp/ipoib/kernel/ipoib_adapter.c
===================================================================
--- ulp/ipoib/kernel/ipoib_adapter.c (revision 1026)
+++ 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.port_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.port_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.port_guid )
{
status = IB_NOT_DONE;
break;
Index: ulp/ipoib/kernel/ipoib_driver.c
===================================================================
--- ulp/ipoib/kernel/ipoib_driver.c (revision 1026)
+++ ulp/ipoib/kernel/ipoib_driver.c (working copy)
@@ -2336,10 +2336,10 @@
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.port_guid );
ib_service.svc_rec.service_gid = port_gid;
- ib_service.svc_rec.service_pkey =
IB_DEFAULT_PKEY;
+ ib_service.svc_rec.service_pkey =
p_adapter->guids.port_guid.pkey;
ib_service.svc_rec.service_lease =
IB_INFINITE_SERVICE_LEASE;
/* Must cast here because the service name is an array of
unsigned chars but
@@ -2347,7 +2347,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.port_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 1026)
+++ 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.port_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.port_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 1026)
+++ 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.port_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.port_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.port_guid )
continue;
/* Found the port - lookup the MAC. */
Index: ulp/ipoib/kernel/ipoib_port.c
===================================================================
--- ulp/ipoib/kernel/ipoib_port.c (revision 1026)
+++ 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,44 @@
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;
+ }
+ p_port->pkey_index = 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 +3349,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.port_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 +3449,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.port_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 +3624,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 +4723,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.port_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 +4761,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.port_guid );
p_endpt = ipoib_endpt_create(
&gid, p_port_info->base_lid, p_port->ib_mgr.qpn
);
if( !p_endpt )
@@ -4894,10 +4934,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 >> 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;
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.port_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,13 +5074,13 @@
/* 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.port_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.port_guid =
p_port->p_adapter->guids.port_guid.port_guid;
mcast_req.pkey_index = 0;
if( ib_member_get_state( mcast_req.member_rec.scope_state )
!=
@@ -5086,7 +5129,9 @@
*/
mcast_req.member_rec.mgid = bcast_mgid_template;
ib_gid_set_default( &mcast_req.member_rec.port_gid,
- p_port->p_adapter->guids.port_guid );
+ p_port->p_adapter->guids.port_guid.port_guid );
+ mcast_req.member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8);
+ mcast_req.member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;
/*
* 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 +5141,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 +5151,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.port_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 +5407,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.port_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 +5509,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.port_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 1026)
+++ 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/20080402/1379f5b7/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: partitions.diff
Type: application/octet-stream
Size: 23341 bytes
Desc: partitions.diff
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20080402/1379f5b7/attachment.obj>
More information about the ofw
mailing list