FW: [ofw] [PATCH 7/9] mthca/pnp: respond to query interface

Leonid Keller leonid at mellanox.co.il
Thu Jun 26 06:11:17 PDT 2008


Why do you remove "livefish" functionality ?
It's needed in case of incorrect FW.

See inline 

> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org 
> [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Sean Hefty
> Sent: Thursday, June 26, 2008 2:59 AM
> To: Hefty, Sean; ofw at lists.openfabrics.org
> Subject: [ofw] [PATCH 7/9] mthca/pnp: respond to query interface
> 
> Add infrastructure to respond to query calls for the 
> RDMA_INTERFACE_VERB interface.
> 
> Signed-off-by: Sean Hefty <sean.hefty at intel.com>
> ---
> Hmmm... I just noticed that we'll need something similar for mlx4.  
> Without it, winverbs would not work on mlx4 cards, but I don't think 
> this affects stability or other usage of mlx4.
> 
You can add the same stuff in mlx4\kernel\hca\drv.c

> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' 
> trunk/hw/mthca/kernel/hca_data.h
> branches\winverbs/hw/mthca/kernel/hca_data.h
> --- trunk/hw/mthca/kernel/hca_data.h	2008-06-03 
> 21:13:58.572875000 -0700
> +++ branches\winverbs/hw/mthca/kernel/hca_data.h	
> 2008-06-03 21:42:20.557250000 -0700
> @@ -236,7 +236,6 @@ extern mlnx_hobul_t *mlnx_hobul_array[]; void  
> setup_ci_interface(
>  	IN		const	ib_net64_t			
> 		ca_guid,
> -	IN		const	int				
> 			is_livefish,
>  		OUT			ci_interface_t		
> 		*p_interface );
>  
>  void
> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' 
> trunk/hw/mthca/kernel/hca_pnp.c
> branches\winverbs/hw/mthca/kernel/hca_pnp.c
> --- trunk/hw/mthca/kernel/hca_pnp.c	2008-04-30 
> 12:42:35.088000000 -0700
> +++ branches\winverbs/hw/mthca/kernel/hca_pnp.c	
> 2008-06-03 21:42:20.572875000 -0700
> @@ -12,6 +12,7 @@
>  
>  #include "hca_driver.h"
>  #include "mthca_dev.h"
> +#include <rdma\verbs.h>
>  
>  #if defined(EVENT_TRACING)
>  #ifdef offsetof
> @@ -23,6 +24,9 @@
>  #include <initguid.h>
>  #include <wdmguid.h>
>  
> +#define MTHCA_VERBS_MIN_VERSION		2
> +#define MTHCA_VERBS_MAX_VERSION		2
> +
>  extern const char *mthca_version;
>  
>  static NTSTATUS
> @@ -112,6 +116,12 @@ __alloc_hca_ifc(
>  	IN				hca_dev_ext_t* const	
> 	p_ext );
>  
>  static NTSTATUS
> +hca_query_interface(
> +	IN				DEVICE_OBJECT* const	
> 	p_dev_obj,
> +	IN				IRP* const		
> 			p_irp,
> +		OUT			cl_irp_action_t* const	
> 	p_action );
> +
> +static NTSTATUS
>  __get_ci_interface(
>  	IN				DEVICE_OBJECT* const	
> 	p_dev_obj );
>  
> @@ -145,6 +155,7 @@ __pnp_notify_ifc(
>  #pragma alloc_text (PAGE, hca_cancel_remove)  #pragma alloc_text 
> (PAGE, hca_surprise_remove)  #pragma alloc_text (PAGE, 
> hca_query_capabilities)
> +#pragma alloc_text (PAGE, hca_query_interface)
>  #pragma alloc_text (PAGE, hca_query_pnp_state)  #pragma alloc_text 
> (PAGE, hca_query_bus_relations)  #pragma alloc_text (PAGE, 
> hca_query_removal_relations) @@ -185,7
> +196,7 @@ hca_init_vfptr( void )
>  	vfptrHcaPnp.pfn_query_resources = cl_irp_ignore;
>  	vfptrHcaPnp.pfn_query_res_req = cl_irp_ignore;
>  	vfptrHcaPnp.pfn_query_bus_info = cl_irp_ignore;
> -	vfptrHcaPnp.pfn_query_interface = cl_irp_ignore;
> +	vfptrHcaPnp.pfn_query_interface = hca_query_interface;
>  	vfptrHcaPnp.pfn_read_config = cl_irp_ignore;
>  	vfptrHcaPnp.pfn_write_config = cl_irp_ignore;
>  	vfptrHcaPnp.pfn_eject = cl_irp_ignore; @@ -441,9 +452,7 @@ 
> __alloc_hca_ifc(
>  		return NULL;
>  	}
>  
> -	setup_ci_interface( p_ext->hca.guid,
> -		!!mthca_is_livefish(p_ext->hca.mdev),
> -		pIfc );
> +	setup_ci_interface( p_ext->hca.guid, pIfc );

Why do you remove "livefish" functionality ?
It's needed in case of incorrect FW.

>  
>  	pIfc->p_hca_dev = p_ext->cl_ext.p_pdo;
>  	pIfc->vend_id = (uint32_t)p_ext->hcaConfig.VendorID;
> @@ -1272,6 +1281,101 @@ hca_query_capabilities(  }
>  
>  
> +static VOID
> +__hca_noop( VOID *context )
> +{
> +	UNREFERENCED_PARAMETER(context);
> +}
> +
> +
> +static NTSTATUS
> +__query_ci_ifc(
> +	IN					DEVICE_OBJECT* 
> const		p_dev_obj,
> +	IN					
> IO_STACK_LOCATION* const	p_io_stack )
> +{
> +	RDMA_INTERFACE_VERBS	*p_ifc;
> +	hca_dev_ext_t			*p_ext;
> +	ci_interface_t			*p_hca_ifc;
> +	NTSTATUS				status;
> +	UINT8					version;
> +
> +	HCA_ENTER( HCA_DBG_PNP );
> +
> +	version =
> VerbsVersionMajor(p_io_stack->Parameters.QueryInterface.Version);
> +	if( version < MTHCA_VERBS_MIN_VERSION || version >
> MTHCA_VERBS_MAX_VERSION )
> +	{
> +		status = STATUS_NOT_SUPPORTED;
> +		goto exit;
> +	}
> +
> +	if( p_io_stack->Parameters.QueryInterface.Size <
> sizeof(RDMA_INTERFACE_VERBS) )
> +	{
> +		status = STATUS_BUFFER_TOO_SMALL;
> +		goto exit;
> +	}
> +
> +	p_ext = (hca_dev_ext_t*)p_dev_obj->DeviceExtension;
> +	p_hca_ifc = __alloc_hca_ifc( p_ext );
> +	if( !p_hca_ifc )
> +	{
> +		status = STATUS_NO_MEMORY;
> +		goto exit;
> +	}
> +
> +	p_ifc = (RDMA_INTERFACE_VERBS *)
> +p_io_stack->Parameters.QueryInterface.Interface;
> +
> +	p_ifc->InterfaceHeader.Size = sizeof(RDMA_INTERFACE_VERBS);
> +	p_ifc->InterfaceHeader.Version = VerbsVersion(version, 0);
> +	p_ifc->InterfaceHeader.Context = p_dev_obj;
> +	p_ifc->InterfaceHeader.InterfaceReference = __hca_noop;
> +	p_ifc->InterfaceHeader.InterfaceDereference = __hca_noop;
> +	p_ifc->Verbs = *p_hca_ifc;
> +	p_ifc->Verbs.p_hca_dev = &p_ext->hca.hob;
> +
> +	ExFreePool( p_hca_ifc );
> +	status = STATUS_SUCCESS;
> +
> +exit:
> +	HCA_EXIT( HCA_DBG_PNP );
> +	return status;
> +}
> +
> +
> +static NTSTATUS
> +hca_query_interface(
> +	IN				DEVICE_OBJECT* const	
> 	p_dev_obj,
> +	IN				IRP* const		
> 			p_irp,
> +		OUT			cl_irp_action_t* const	
> 	p_action )
> +{
> +	NTSTATUS			status;
> +	IO_STACK_LOCATION	*p_io_stack;
> +
> +	HCA_ENTER( HCA_DBG_PNP );
> +
> +#pragma warning( push, 3 )
> +	PAGED_CODE();
> +#pragma warning( pop )
> +
> +	p_io_stack = IoGetCurrentIrpStackLocation( p_irp );
> +	
> +	/* Compare requested GUID with our supported interface GUIDs. */
> +	if( IsEqualGUID(
> p_io_stack->Parameters.QueryInterface.InterfaceType,
> +		&GUID_RDMA_INTERFACE_VERBS ) )
> +	{
> +		status = __query_ci_ifc( p_dev_obj, p_io_stack );
> +		*p_action = IrpComplete;
> +	}
> +	else
> +	{
> +		status = p_irp->IoStatus.Status;
> +		*p_action = IrpSkip;
> +	}
> +
> +	HCA_EXIT( HCA_DBG_PNP );
> +	return status;
> +}
> +
> +
>  static NTSTATUS
>  hca_query_pnp_state(
>  	IN				DEVICE_OBJECT* const	
> 	p_dev_obj,
> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:' 
> trunk/hw/mthca/kernel/hca_verbs.c
> branches\winverbs/hw/mthca/kernel/hca_verbs.c
> --- trunk/hw/mthca/kernel/hca_verbs.c	2008-06-03 
> 21:13:58.588500000 -0700
> +++ branches\winverbs/hw/mthca/kernel/hca_verbs.c	
> 2008-06-03 21:42:20.588500000 -0700
> @@ -1632,7 +1632,6 @@ err_port_num:	
>  void
>  setup_ci_interface(
>  	IN		const	ib_net64_t			
> 		ca_guid,
> -	IN		const	int				
> 			is_livefish,
>  	IN	OUT			ci_interface_t		
> 		*p_interface )
>  {
>  	cl_memclr(p_interface, sizeof(*p_interface)); @@
> -1659,43 +1658,35 @@ setup_ci_interface(
>  	p_interface->deallocate_pd = mlnx_deallocate_pd;
>  	p_interface->vendor_call = fw_access_ctrl;
>  
> -	if (is_livefish) {
> -		mlnx_memory_if_livefish(p_interface);
> -	}
> -	else {	
> -		p_interface->modify_ca = mlnx_modify_ca; 
> -		
> -		p_interface->create_av = mlnx_create_av;
> -		p_interface->query_av = mlnx_query_av;
> -		p_interface->modify_av = mlnx_modify_av;
> -		p_interface->destroy_av = mlnx_destroy_av;
> -
> -		p_interface->create_srq = mlnx_create_srq;
> -		p_interface->modify_srq = mlnx_modify_srq;
> -		p_interface->query_srq = mlnx_query_srq;
> -		p_interface->destroy_srq = mlnx_destroy_srq;
> -
> -		p_interface->create_qp = mlnx_create_qp;
> -		p_interface->create_spl_qp = mlnx_create_spl_qp;
> -		p_interface->modify_qp = mlnx_modify_qp;
> -		p_interface->ndi_modify_qp = mlnx_ndi_modify_qp;
> -		p_interface->query_qp = mlnx_query_qp;
> -		p_interface->destroy_qp = mlnx_destroy_qp;
> -
> -		p_interface->create_cq = mlnx_create_cq;
> -		p_interface->resize_cq = mlnx_resize_cq;
> -		p_interface->query_cq = mlnx_query_cq;
> -		p_interface->destroy_cq = mlnx_destroy_cq;
> -
> -		p_interface->local_mad = mlnx_local_mad;
> -		
> -
> -		mlnx_memory_if(p_interface);
> -		mlnx_direct_if(p_interface);
> -		mlnx_mcast_if(p_interface);
> -	}
> -
> -	return;
> +	p_interface->modify_ca = mlnx_modify_ca;
> +	
> +	p_interface->create_av = mlnx_create_av;
> +	p_interface->query_av = mlnx_query_av;
> +	p_interface->modify_av = mlnx_modify_av;
> +	p_interface->destroy_av = mlnx_destroy_av;
> +
> +	p_interface->create_srq = mlnx_create_srq;
> +	p_interface->modify_srq = mlnx_modify_srq;
> +	p_interface->query_srq = mlnx_query_srq;
> +	p_interface->destroy_srq = mlnx_destroy_srq;
> +
> +	p_interface->create_qp = mlnx_create_qp;
> +	p_interface->create_spl_qp = mlnx_create_spl_qp;
> +	p_interface->modify_qp = mlnx_modify_qp;
> +	p_interface->ndi_modify_qp = mlnx_ndi_modify_qp;
> +	p_interface->query_qp = mlnx_query_qp;
> +	p_interface->destroy_qp = mlnx_destroy_qp;
> +
> +	p_interface->create_cq = mlnx_create_cq;
> +	p_interface->resize_cq = mlnx_resize_cq;
> +	p_interface->query_cq = mlnx_query_cq;
> +	p_interface->destroy_cq = mlnx_destroy_cq;
> +
> +	p_interface->local_mad = mlnx_local_mad;
> +
> +	mlnx_memory_if(p_interface);
> +	mlnx_direct_if(p_interface);
> +	mlnx_mcast_if(p_interface);
>  }
>  
>  
> 
> 
> _______________________________________________
> ofw mailing list
> ofw at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
> 



More information about the ofw mailing list