/************************************************************************************************************
 *
 * FILE   :  HCF.C
 *
 * DATE    : $Date: 2004/08/05 11:47:10 $   $Revision: 1.10 $
 * Original: 2004/06/02 10:22:22    Revision: 1.85      Tag: hcf7_t20040602_01
 * Original: 2004/04/15 09:24:41    Revision: 1.63      Tag: hcf7_t7_20040415_01
 * Original: 2004/04/13 14:22:44    Revision: 1.62      Tag: t7_20040413_01
 * Original: 2004/04/01 15:32:55    Revision: 1.59      Tag: t7_20040401_01
 * Original: 2004/03/10 15:39:27    Revision: 1.55      Tag: t20040310_01
 * Original: 2004/03/04 11:03:37    Revision: 1.53      Tag: t20040304_01
 * Original: 2004/03/02 14:51:21    Revision: 1.50      Tag: t20040302_03
 * Original: 2004/02/24 13:00:27    Revision: 1.43      Tag: t20040224_01
 * Original: 2004/02/19 10:57:25    Revision: 1.39      Tag: t20040219_01
 *
 * AUTHOR :  Nico Valster
 *
 * SPECIFICATION: ........
 *
 * DESCRIPTION : HCF Routines for Hermes-II (callable via the Wireless Connection I/F or WCI)
 *               Local Support Routines for above procedures
 *
 *           Customizable via HCFCFG.H, which is included by HCF.H
 *
 *************************************************************************************************************
 *
 *
 * SOFTWARE LICENSE
 *
 * This software is provided subject to the following terms and conditions,
 * which you should read carefully before using the software.  Using this
 * software indicates your acceptance of these terms and conditions.  If you do
 * not agree with these terms and conditions, do not use the software.
 *
 * COPYRIGHT © 1994 - 1995   by AT&T.                All Rights Reserved
 * COPYRIGHT © 1996 - 2000 by Lucent Technologies.   All Rights Reserved
 * COPYRIGHT © 2001 - 2004   by Agere Systems Inc.   All Rights Reserved
 * All rights reserved.
 *
 * Redistribution and use in source or binary forms, with or without
 * modifications, are permitted provided that the following conditions are met:
 *
 * . Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following Disclaimer as comments in the code as
 *    well as in the documentation and/or other materials provided with the
 *    distribution.
 *
 * . Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following Disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * . Neither the name of Agere Systems Inc. nor the names of the contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * Disclaimer
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  ANY
 * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN
 * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 *
 ************************************************************************************************************/


/************************************************************************************************************
 **
 ** Implementation Notes
 **
 * - a leading marker of //! is used. The purpose of such a sequence is to help to understand the flow
 *   An example is:  //!rc = HCF_SUCCESS;
 *   if this is superfluous because rc is already guaranteed to be 0 but it shows to the (maintenance)
 *   programmer it is an intentional omission at the place where someone could consider it most appropriate at
 *   first glance
 * - using near pointers in a model where ss!=ds is an invitation for disaster, so be aware of how you specify
 *   your model and how you define variables which are used at interrupt time
 * - remember that sign extension on 32 bit platforms may cause problems unless code is carefully constructed,
 *   e.g. use "(hcf_16)~foo" rather than "~foo"
 *
 ************************************************************************************************************/

#include "hcf.h"                // HCF and MSF common include file
#include "hcfdef.h"             // HCF specific include file
#include "mmd.h"                // MoreModularDriver common include file
#include <linux/bug.h>
#include <linux/kernel.h>

#if ! defined offsetof
#define offsetof(s,m)   ((unsigned int)&(((s *)0)->m))
#endif // offsetof


/***********************************************************************************************************/
/***************************************  PROTOTYPES  ******************************************************/
/***********************************************************************************************************/
HCF_STATIC int          cmd_exe( IFBP ifbp, hcf_16 cmd_code, hcf_16 par_0 );
HCF_STATIC int          init( IFBP ifbp );
HCF_STATIC int          put_info( IFBP ifbp, LTVP ltvp );
HCF_STATIC int          put_info_mb( IFBP ifbp, CFG_MB_INFO_STRCT FAR * ltvp );
#if (HCF_TYPE) & HCF_TYPE_WPA
HCF_STATIC void         calc_mic( hcf_32* p, hcf_32 M );
void                    calc_mic_rx_frag( IFBP ifbp, wci_bufp p, int len );
void                    calc_mic_tx_frag( IFBP ifbp, wci_bufp p, int len );
HCF_STATIC int          check_mic( IFBP ifbp );
#endif // HCF_TYPE_WPA

HCF_STATIC void         calibrate( IFBP ifbp );
HCF_STATIC int          cmd_cmpl( IFBP ifbp );
HCF_STATIC hcf_16       get_fid( IFBP ifbp );
HCF_STATIC void         isr_info( IFBP ifbp );
#if HCF_DMA
HCF_STATIC DESC_STRCT*  get_frame_lst(IFBP ifbp, int tx_rx_flag);
#endif // HCF_DMA
HCF_STATIC void         get_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) );   //char*, byte count (usually even)
#if HCF_DMA
HCF_STATIC void         put_frame_lst( IFBP ifbp, DESC_STRCT *descp, int tx_rx_flag );
#endif // HCF_DMA
HCF_STATIC void         put_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) );
HCF_STATIC void         put_frag_finalize( IFBP ifbp );
HCF_STATIC int          setup_bap( IFBP ifbp, hcf_16 fid, int offset, int type );
#if (HCF_ASSERT) & HCF_ASSERT_PRINTF
static int fw_printf(IFBP ifbp, CFG_FW_PRINTF_STRCT FAR *ltvp);
#endif // HCF_ASSERT_PRINTF

HCF_STATIC int          download( IFBP ifbp, CFG_PROG_STRCT FAR *ltvp );
HCF_STATIC hcf_8        hcf_encap( wci_bufp type );
HCF_STATIC hcf_8        null_addr[4] = { 0, 0, 0, 0 };
#if ! defined IN_PORT_WORD          //replace I/O Macros with logging facility
extern FILE *log_file;

#define IN_PORT_WORD(port)          in_port_word( (hcf_io)(port) )

static hcf_16 in_port_word( hcf_io port ) {
	hcf_16 i = (hcf_16)_inpw( port );
	if ( log_file ) {
		fprintf( log_file, "\nR %2.2x %4.4x", (port)&0xFF, i);
	}
	return i;
} // in_port_word

#define OUT_PORT_WORD(port, value)  out_port_word( (hcf_io)(port), (hcf_16)(value) )

static void out_port_word( hcf_io port, hcf_16 value ) {
	_outpw( port, value );
	if ( log_file ) {
		fprintf( log_file, "\nW %2.02x %4.04x", (port)&0xFF, value );
	}
}

void IN_PORT_STRING_32( hcf_io prt, hcf_32 FAR * dst, int n)    {
	int i = 0;
	hcf_16 FAR * p;
	if ( log_file ) {
		fprintf( log_file, "\nread string_32 length %04x (%04d) at port %02.2x to addr %lp",
			 (hcf_16)n, (hcf_16)n, (hcf_16)(prt)&0xFF, dst);
	}
	while ( n-- ) {
		p = (hcf_16 FAR *)dst;
		*p++ = (hcf_16)_inpw( prt );
		*p   = (hcf_16)_inpw( prt );
		if ( log_file ) {
			fprintf( log_file, "%s%08lx ", i++ % 0x08 ? " " : "\n", *dst);
		}
		dst++;
	}
} // IN_PORT_STRING_32

void IN_PORT_STRING_8_16( hcf_io prt, hcf_8 FAR * dst, int n) { //also handles byte alignment problems
	hcf_16 FAR * p = (hcf_16 FAR *)dst;                         //this needs more elaborate code in non-x86 platforms
	int i = 0;
	if ( log_file ) {
		fprintf( log_file, "\nread string_16 length %04x (%04d) at port %02.2x to addr %lp",
			 (hcf_16)n, (hcf_16)n, (hcf_16)(prt)&0xFF, dst );
	}
	while ( n-- ) {
		*p =(hcf_16)_inpw( prt);
		if ( log_file ) {
			if ( i++ % 0x10 ) {
				fprintf( log_file, "%04x ", *p);
			} else {
				fprintf( log_file, "\n%04x ", *p);
			}
		}
		p++;
	}
} // IN_PORT_STRING_8_16

void OUT_PORT_STRING_32( hcf_io prt, hcf_32 FAR * src, int n)   {
	int i = 0;
	hcf_16 FAR * p;
	if ( log_file ) {
		fprintf( log_file, "\nwrite string_32 length %04x (%04d) at port %02.2x",
			 (hcf_16)n, (hcf_16)n, (hcf_16)(prt)&0xFF);
	}
	while ( n-- ) {
		p = (hcf_16 FAR *)src;
		_outpw( prt, *p++ );
		_outpw( prt, *p   );
		if ( log_file ) {
			fprintf( log_file, "%s%08lx ", i++ % 0x08 ? " " : "\n", *src);
		}
		src++;
	}
} // OUT_PORT_STRING_32

void OUT_PORT_STRING_8_16( hcf_io prt, hcf_8 FAR * src, int n)  {   //also handles byte alignment problems
	hcf_16 FAR * p = (hcf_16 FAR *)src;                             //this needs more elaborate code in non-x86 platforms
	int i = 0;
	if ( log_file ) {
		fprintf( log_file, "\nwrite string_16 length %04x (%04d) at port %04x", n, n, (hcf_16)prt);
	}
	while ( n-- ) {
		(void)_outpw( prt, *p);
		if ( log_file ) {
			if ( i++ % 0x10 ) {
				fprintf( log_file, "%04x ", *p);
			} else {
				fprintf( log_file, "\n%04x ", *p);
			}
		}
		p++;
	}
} // OUT_PORT_STRING_8_16

#endif // IN_PORT_WORD

/************************************************************************************************************
 ******************************* D A T A    D E F I N I T I O N S ********************************************
 ************************************************************************************************************/

#if HCF_ASSERT
IFBP BASED assert_ifbp = NULL;          //to make asserts easily work under MMD and DHF
#endif // HCF_ASSERT

/* SNAP header to be inserted in Ethernet-II frames */
HCF_STATIC  hcf_8 BASED snap_header[] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, //5 bytes signature +
                                          0 };                          //1 byte protocol identifier

#if (HCF_TYPE) & HCF_TYPE_WPA
HCF_STATIC hcf_8 BASED mic_pad[8] = { 0x5A, 0, 0, 0, 0, 0, 0, 0 };      //MIC padding of message
#endif // HCF_TYPE_WPA

#if defined MSF_COMPONENT_ID
CFG_IDENTITY_STRCT BASED cfg_drv_identity = {
	sizeof(cfg_drv_identity)/sizeof(hcf_16) - 1,    //length of RID
	CFG_DRV_IDENTITY,           // (0x0826)
	MSF_COMPONENT_ID,
	MSF_COMPONENT_VAR,
	MSF_COMPONENT_MAJOR_VER,
	MSF_COMPONENT_MINOR_VER
} ;

CFG_RANGES_STRCT BASED cfg_drv_sup_range = {
	sizeof(cfg_drv_sup_range)/sizeof(hcf_16) - 1,   //length of RID
	CFG_DRV_SUP_RANGE,          // (0x0827)

	COMP_ROLE_SUPL,
	COMP_ID_DUI,
	{{  DUI_COMPAT_VAR,
	    DUI_COMPAT_BOT,
	    DUI_COMPAT_TOP
	}}
} ;

struct CFG_RANGE3_STRCT BASED cfg_drv_act_ranges_pri = {
	sizeof(cfg_drv_act_ranges_pri)/sizeof(hcf_16) - 1,  //length of RID
	CFG_DRV_ACT_RANGES_PRI,     // (0x0828)

	COMP_ROLE_ACT,
	COMP_ID_PRI,
	{
		{ 0, 0, 0 },                           // HCF_PRI_VAR_1 not supported by HCF 7
		{ 0, 0, 0 },                           // HCF_PRI_VAR_2 not supported by HCF 7
		{  3,                                  //var_rec[2] - Variant number
		   CFG_DRV_ACT_RANGES_PRI_3_BOTTOM,        //       - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_PRI_3_TOP            //       - Top Compatibility
		}
	}
} ;


struct CFG_RANGE4_STRCT BASED cfg_drv_act_ranges_sta = {
	sizeof(cfg_drv_act_ranges_sta)/sizeof(hcf_16) - 1,  //length of RID
	CFG_DRV_ACT_RANGES_STA,     // (0x0829)

	COMP_ROLE_ACT,
	COMP_ID_STA,
	{
#if defined HCF_STA_VAR_1
		{  1,                                  //var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_STA_1_BOTTOM,        //       - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_STA_1_TOP            //       - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_STA_VAR_1
#if defined HCF_STA_VAR_2
		{  2,                                  //var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_STA_2_BOTTOM,        //       - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_STA_2_TOP            //       - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_STA_VAR_2
// For Native_USB (Not used!)
#if defined HCF_STA_VAR_3
		{  3,                                  //var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_STA_3_BOTTOM,        //       - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_STA_3_TOP            //       - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_STA_VAR_3
// Warp
#if defined HCF_STA_VAR_4
		{  4,                                  //var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_STA_4_BOTTOM,        //           - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_STA_4_TOP            //           - Top Compatibility
		}
#else
		{ 0, 0, 0 }
#endif // HCF_STA_VAR_4
	}
} ;


struct CFG_RANGE6_STRCT BASED cfg_drv_act_ranges_hsi = {
	sizeof(cfg_drv_act_ranges_hsi)/sizeof(hcf_16) - 1,  //length of RID
	CFG_DRV_ACT_RANGES_HSI,     // (0x082A)
	COMP_ROLE_ACT,
	COMP_ID_HSI,
	{
#if defined HCF_HSI_VAR_0                   // Controlled deployment
		{  0,                                  // var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_HSI_0_BOTTOM,        //           - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_HSI_0_TOP            //           - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_HSI_VAR_0
		{ 0, 0, 0 },                           // HCF_HSI_VAR_1 not supported by HCF 7
		{ 0, 0, 0 },                           // HCF_HSI_VAR_2 not supported by HCF 7
		{ 0, 0, 0 },                           // HCF_HSI_VAR_3 not supported by HCF 7
#if defined HCF_HSI_VAR_4                   // Hermes-II all types
		{  4,                                  // var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_HSI_4_BOTTOM,        //           - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_HSI_4_TOP            //           - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_HSI_VAR_4
#if defined HCF_HSI_VAR_5                   // WARP Hermes-2.5
		{  5,                                  // var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_HSI_5_BOTTOM,        //           - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_HSI_5_TOP            //           - Top Compatibility
		}
#else
		{ 0, 0, 0 }
#endif // HCF_HSI_VAR_5
	}
} ;


CFG_RANGE4_STRCT BASED cfg_drv_act_ranges_apf = {
	sizeof(cfg_drv_act_ranges_apf)/sizeof(hcf_16) - 1,  //length of RID
	CFG_DRV_ACT_RANGES_APF,     // (0x082B)

	COMP_ROLE_ACT,
	COMP_ID_APF,
	{
#if defined HCF_APF_VAR_1               //(Fake) Hermes-I
		{  1,                                  //var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_APF_1_BOTTOM,        //           - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_APF_1_TOP            //           - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_APF_VAR_1
#if defined HCF_APF_VAR_2               //Hermes-II
		{  2,                                  // var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_APF_2_BOTTOM,        //           - Bottom Compatibility
		   CFG_DRV_ACT_RANGES_APF_2_TOP            //           - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_APF_VAR_2
#if defined HCF_APF_VAR_3                       // Native_USB
		{  3,                                      // var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_APF_3_BOTTOM,        //           - Bottom Compatibility !!!!!see note below!!!!!!!
		   CFG_DRV_ACT_RANGES_APF_3_TOP            //           - Top Compatibility
		},
#else
		{ 0, 0, 0 },
#endif // HCF_APF_VAR_3
#if defined HCF_APF_VAR_4                       // WARP Hermes 2.5
		{  4,                                      // var_rec[1] - Variant number
		   CFG_DRV_ACT_RANGES_APF_4_BOTTOM,        //           - Bottom Compatibility !!!!!see note below!!!!!!!
		   CFG_DRV_ACT_RANGES_APF_4_TOP            //           - Top Compatibility
		}
#else
		{ 0, 0, 0 }
#endif // HCF_APF_VAR_4
	}
} ;
#define HCF_VERSION  TEXT( "HCF$Revision: 1.10 $" )

static struct /*CFG_HCF_OPT_STRCT*/ {
	hcf_16  len;                    //length of cfg_hcf_opt struct
	hcf_16  typ;                    //type 0x082C
	hcf_16   v0;                        //offset HCF_VERSION
	hcf_16   v1;                        // MSF_COMPONENT_ID
	hcf_16   v2;                        // HCF_ALIGN
	hcf_16   v3;                        // HCF_ASSERT
	hcf_16   v4;                        // HCF_BIG_ENDIAN
	hcf_16   v5;                        // /* HCF_DLV | HCF_DLNV */
	hcf_16   v6;                        // HCF_DMA
	hcf_16   v7;                        // HCF_ENCAP
	hcf_16   v8;                        // HCF_EXT
	hcf_16   v9;                        // HCF_INT_ON
	hcf_16  v10;                        // HCF_IO
	hcf_16  v11;                        // HCF_LEGACY
	hcf_16  v12;                        // HCF_MAX_LTV
	hcf_16  v13;                        // HCF_PROT_TIME
	hcf_16  v14;                        // HCF_SLEEP
	hcf_16  v15;                        // HCF_TALLIES
	hcf_16  v16;                        // HCF_TYPE
	hcf_16  v17;                        // HCF_NIC_TAL_CNT
	hcf_16  v18;                        // HCF_HCF_TAL_CNT
	hcf_16  v19;                        // offset tallies
	char    val[sizeof(HCF_VERSION)];
} BASED cfg_hcf_opt = {
	sizeof(cfg_hcf_opt)/sizeof(hcf_16) -1,
	CFG_HCF_OPT,                // (0x082C)
	( sizeof(cfg_hcf_opt) - sizeof(HCF_VERSION) - 4 )/sizeof(hcf_16),
#if defined MSF_COMPONENT_ID
	MSF_COMPONENT_ID,
#else
	0,
#endif // MSF_COMPONENT_ID
	HCF_ALIGN,
	HCF_ASSERT,
	HCF_BIG_ENDIAN,
	0,                                  // /* HCF_DLV | HCF_DLNV*/,
	HCF_DMA,
	HCF_ENCAP,
	HCF_EXT,
	HCF_INT_ON,
	HCF_IO,
	HCF_LEGACY,
	HCF_MAX_LTV,
	HCF_PROT_TIME,
	HCF_SLEEP,
	HCF_TALLIES,
	HCF_TYPE,
#if (HCF_TALLIES) & ( HCF_TALLIES_NIC | HCF_TALLIES_HCF )
	HCF_NIC_TAL_CNT,
	HCF_HCF_TAL_CNT,
	offsetof(IFB_STRCT, IFB_TallyLen ),
#else
	0, 0, 0,
#endif // HCF_TALLIES_NIC / HCF_TALLIES_HCF
	HCF_VERSION
}; // cfg_hcf_opt
#endif // MSF_COMPONENT_ID

HCF_STATIC LTV_STRCT BASED cfg_null = { 1, CFG_NULL, {0} };

HCF_STATIC hcf_16* BASED xxxx[ ] = {
	&cfg_null.len,                          //CFG_NULL                      0x0820
#if defined MSF_COMPONENT_ID
	&cfg_drv_identity.len,                  //CFG_DRV_IDENTITY              0x0826
	&cfg_drv_sup_range.len,                 //CFG_DRV_SUP_RANGE             0x0827
	&cfg_drv_act_ranges_pri.len,            //CFG_DRV_ACT_RANGES_PRI        0x0828
	&cfg_drv_act_ranges_sta.len,            //CFG_DRV_ACT_RANGES_STA        0x0829
	&cfg_drv_act_ranges_hsi.len,            //CFG_DRV_ACT_RANGES_HSI        0x082A
	&cfg_drv_act_ranges_apf.len,            //CFG_DRV_ACT_RANGES_APF        0x082B
	&cfg_hcf_opt.len,                       //CFG_HCF_OPT                   0x082C
	NULL,                                   //IFB_PRIIdentity placeholder   0xFD02
	NULL,                                   //IFB_PRISup placeholder        0xFD03
#endif // MSF_COMPONENT_ID
	NULL                                    //endsentinel
};
#define xxxx_PRI_IDENTITY_OFFSET    (ARRAY_SIZE(xxxx) - 3)


/************************************************************************************************************
 ************************** T O P   L E V E L   H C F   R O U T I N E S **************************************
 ************************************************************************************************************/

/************************************************************************************************************
 *
 *.MODULE        int hcf_action( IFBP ifbp, hcf_16 action )
 *.PURPOSE       Changes the run-time Card behavior.
 *               Performs Miscellanuous actions.
 *
 *.ARGUMENTS
 *   ifbp                    address of the Interface Block
 *   action                  number identifying the type of change
 *    - HCF_ACT_INT_FORCE_ON enable interrupt generation by WaveLAN NIC
 *    - HCF_ACT_INT_OFF      disable interrupt generation by WaveLAN NIC
 *    - HCF_ACT_INT_ON       compensate 1 HCF_ACT_INT_OFF, enable interrupt generation if balance reached
 *    - HCF_ACT_PRS_SCAN     Hermes Probe Response Scan (F102) command
 *    - HCF_ACT_RX_ACK       acknowledge non-DMA receiver to Hermes
 *    - HCF_ACT_SCAN         Hermes Inquire Scan (F101) command (non-WARP only)
 *    - HCF_ACT_SLEEP        DDS Sleep request
 *    - HCF_ACT_TALLIES      Hermes Inquire Tallies (F100) command
 *
 *.RETURNS
 *   HCF_SUCCESS             all (including invalid)
 *   HCF_INT_PENDING         HCF_ACT_INT_OFF, interrupt pending
 *   HCF_ERR_NO_NIC          HCF_ACT_INT_OFF, NIC presence check fails
 *
 *.CONDITIONS
 * Except for hcf_action with HCF_ACT_INT_FORCE_ON or HCF_ACT_INT_OFF as parameter or hcf_connect with an I/O
 * address (i.e. not HCF_DISCONNECT), all hcf-function calls MUST be preceded by a call of hcf_action with
 * HCF_ACT_INT_OFF as parameter.
 * Note that hcf_connect defaults to NIC interrupt disabled mode, i.e. as if hcf_action( HCF_ACT_INT_OFF )
 * was called.
 *
 *.DESCRIPTION
 * hcf_action supports the following mode changing action-code pairs that are antonyms
 *    - HCF_ACT_INT_[FORCE_]ON / HCF_ACT_INT_OFF
 *
 * Additionally hcf_action can start the following actions in the NIC:
 *    - HCF_ACT_PRS_SCAN
 *    - HCF_ACT_RX_ACK
 *    - HCF_ACT_SCAN
 *    - HCF_ACT_SLEEP
 *    - HCF_ACT_TALLIES
 *
 * o HCF_ACT_INT_OFF: Sets NIC Interrupts mode Disabled.
 * This command, and the associated [Force] Enable NIC interrupts command, are only available if the HCF_INT_ON
 * compile time option is not set at 0x0000.
 *
 * o HCF_ACT_INT_ON: Sets NIC Interrupts mode Enabled.
 * Enable NIC Interrupts, depending on the number of preceding Disable NIC Interrupt calls.
 *
 * o HCF_ACT_INT_FORCE_ON: Force NIC Interrupts mode Enabled.
 * Sets NIC Interrupts mode Enabled, regardless off the number of preceding Disable NIC Interrupt calls.
 *
 * The disabling and enabling of interrupts are antonyms.
 * These actions must be balanced.
 * For each "disable interrupts" there must be a matching "enable interrupts".
 * The disable interrupts may be executed multiple times in a row without intervening enable interrupts, in
 * other words, the disable interrupts may be nested.
 * The interrupt generation mechanism is disabled at the first call with HCF_ACT_INT_OFF.
 * The interrupt generation mechanism is re-enabled when the number of calls with HCF_ACT_INT_ON matches the
 * number of calls with INT_OFF.
 *
 * It is not allowed to have more Enable NIC Interrupts calls than Disable NIC Interrupts calls.
 * The interrupt generation mechanism is initially (i.e. after hcf_connect) disabled.
 * An MSF based on a interrupt strategy must call hcf_action with INT_ON in its initialization logic.
 *
 *!  The INT_OFF/INT_ON housekeeping is initialized at 0x0000 by hcf_connect, causing the interrupt generation
 *   mechanism to be disabled at first. This suits MSF implementation based on a polling strategy.
 *
 * o HCF_ACT_SLEEP: Initiates the Disconnected DeepSleep process
 * This command is only available if the HCF_DDS compile time option is set. It triggers the F/W to start the
 * sleep handshaking. Regardless whether the Host initiates a Disconnected DeepSleep (DDS) or the F/W initiates
 * a Connected DeepSleep (CDS), the Host-F/W sleep handshaking is completed when the NIC Interrupts mode is
 * enabled (by means of the balancing HCF_ACT_INT_ON), i.e. at that moment the F/W really goes into sleep mode.
 * The F/W is wokenup by the HCF when the NIC Interrupts mode are disabled, i.e. at the first HCF_ACT_INT_OFF
 * after going into sleep.
 *
 * The following Miscellaneous actions are defined:
 *
 * o HCF_ACT_RX_ACK: Receiver Acknowledgement (non-DMA, non-USB mode only)
 * Acking the receiver, frees the NIC memory used to hold the Rx frame and allows the F/W to
 * report the existence of the next Rx frame.
 * If the MSF does not need access (any longer) to the current frame, e.g. because it is rejected based on the
 * look ahead or copied to another buffer, the receiver may be acked. Acking earlier is assumed to have the
 * potential of improving the performance.
 * If the MSF does not explicitly ack the receiver, the acking is done implicitly if:
 * - the received frame fits in the look ahead buffer, by the hcf_service_nic call that reported the Rx frame
 * - if not in the above step, by hcf_rcv_msg (assuming hcf_rcv_msg is called)
 * - if neither of the above implicit acks nor an explicit ack by the MSF, by the first hcf_service_nic after
 *   the hcf_service_nic that reported the Rx frame.
 * Note: If an Rx frame is already acked, an explicit ACK by the MSF acts as a NoOperation.
 *
 * o HCF_ACT_TALLIES: Inquire Tallies command
 * This command is only operational if the F/W is enabled.
 * The Inquire Tallies command requests the F/W to provide its current set of tallies.
 * See also hcf_get_info with CFG_TALLIES as parameter.
 *
 * o HCF_ACT_PRS_SCAN: Inquire Probe Response Scan command
 * This command is only operational if the F/W is enabled.
 * The Probe Response Scan command starts a scan sequence.
 * The HCF puts the result of this action in an MSF defined buffer (see CFG_RID_LOG_STRCT).
 *
 * o HCF_ACT_SCAN: Inquire Scan command
 * This command is only supported for HII F/W (i.e. pre-WARP) and it is operational if the F/W is enabled.
 * The Inquire Scan command starts a scan sequence.
 * The HCF puts the result of this action in an MSF defined buffer (see CFG_RID_LOG_STRCT).
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value.
 * - NIC interrupts are not disabled while required by parameter action.
 * - an invalid code is specified in parameter action.
 * - HCF_ACT_INT_ON commands outnumber the HCF_ACT_INT_OFF commands.
 * - reentrancy, may be caused by calling hcf_functions without adequate protection against NIC interrupts or
 *   multi-threading
 *
 * - Since the HCF does not maintain status information relative to the F/W enabled state, it is not asserted
 *   whether HCF_ACT_SCAN, HCF_ACT_PRS_SCAN or HCF_ACT_TALLIES are only used while F/W is enabled.
 *
 *.DIAGRAM
 * 0: The assert embedded in HCFLOGENTRY checks against re-entrancy. Re-entrancy could be caused by a MSF logic
 *   at task-level calling hcf_functions without shielding with HCF_ACT_ON/_OFF. However the HCF_ACT_INT_OFF
 *   action itself can per definition not be protected this way. Based on code inspection, it can be concluded,
 *   that there is no re-entrancy PROBLEM in this particular flow. It does not seem worth the trouble to
 *   explicitly check for this condition (although there was a report of an MSF which ran into this assert.
 * 2:IFB_IntOffCnt is used to balance the INT_OFF and INT_ON calls.  Disabling of the interrupts is achieved by
 *   writing a zero to the Hermes IntEn register.  In a shared interrupt environment (e.g. the mini-PCI NDIS
 *   driver) it is considered more correct to return the status HCF_INT_PENDING if and only if, the current
 *   invocation of hcf_service_nic is (apparently) called in the ISR when the ISR was activated as result of a
 *   change in HREG_EV_STAT matching a bit in HREG_INT_EN, i.e. not if invoked as result of another device
 *   generating an interrupt on the shared interrupt line.
 *   Note 1: it has been observed that under certain adverse conditions on certain platforms the writing of
 *   HREG_INT_EN can apparently fail, therefore it is paramount that HREG_INT_EN is written again with 0 for
 *   each and every call to HCF_ACT_INT_OFF.
 *   Note 2: it has been observed that under certain H/W & S/W architectures this logic is called when there is
 *   no NIC at all. To cater for this, the value of HREG_INT_EN is validated. If the unused bit 0x0100 is set,
 *   it is assumed there is no NIC.
 *   Note 3: During the download process, some versions of the F/W reset HREG_SW_0, hence checking this
 *   register for HCF_MAGIC (the classical NIC presence test) when HCF_ACT_INT_OFF is called due to another
 *   card interrupting via a shared IRQ during a download, fails.
 *4: The construction "if ( ifbp->IFB_IntOffCnt-- == 0 )" is optimal (in the sense of shortest/quickest
 *   path in error free flows) but NOT fail safe in case of too many INT_ON invocations compared to INT_OFF).
 *   Enabling of the interrupts is achieved by writing the Hermes IntEn register.
 *    - If the HCF is in Defunct mode, the interrupts stay disabled.
 *    - Under "normal" conditions, the HCF is only interested in Info Events, Rx Events and Notify Events.
 *    - When the HCF is out of Tx/Notify resources, the HCF is also interested in Alloc Events.
 *    - via HCF_EXT, the MSF programmer can also request HREG_EV_TICK and/or HREG_EV_TX_EXC interrupts.
 *   For DMA operation, the DMA hardware handles the alloc events. The DMA engine will generate a 'TxDmaDone'
 *   event as soon as it has pumped a frame from host ram into NIC-RAM (note that the frame does not have to be
 *   transmitted then), and a 'RxDmaDone' event as soon as a received frame has been pumped from NIC-RAM into
 *   host ram.  Note that the 'alloc' event has been removed from the event-mask, because the DMA engine will
 *   react to and acknowledge this event.
 *6: ack the "old" Rx-event. See "Rx Buffer free strategy" in hcf_service_nic above for more explanation.
 *   IFB_RxFID and IFB_RxLen must be cleared to bring both the internal HCF house keeping and the information
 *   supplied to the MSF in the state "no frame received".
 *8: The HCF_ACT_SCAN, HCF_ACT_PRS_SCAN and HCF_ACT_TALLIES activity are merged by "clever" algebraic
 *   manipulations of the RID-values and action codes, so foregoing robustness against migration problems for
 *   ease of implementation. The assumptions about numerical relationships between CFG_TALLIES etc and
 *   HCF_ACT_TALLIES etc are checked by the "#if" statements just prior to the body of this routine, resulting
 *   in: err "maintenance" during compilation if the assumptions are no longer met. The writing of HREG_PARAM_1
 *   with 0x3FFF in case of an PRS scan, is a kludge to get around lack of specification, hence different
 *   implementation in F/W and Host.
 *   When there is no NIC RAM available, some versions of the Hermes F/W do report 0x7F00 as error in the
 *   Result field of the Status register and some F/W versions don't. To mask this difference to the MSF all
 *   return codes of the Hermes are ignored ("best" and "most simple" solution to these types of analomies with
 *   an acceptable loss due to ignoring all error situations as well).
 *   The "No inquire space" is reported via the Hermes tallies.
 *30: do not HCFASSERT( rc, rc ) since rc == HCF_INT_PENDING is no error
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0
#if CFG_SCAN != CFG_TALLIES - HCF_ACT_TALLIES + HCF_ACT_SCAN
err: "maintenance" apparently inviolated the underlying assumption about the numerical values of these macros
#endif
#endif // HCF_TYPE_HII5
#if CFG_PRS_SCAN != CFG_TALLIES - HCF_ACT_TALLIES + HCF_ACT_PRS_SCAN
err: "maintenance" apparently inviolated the underlying assumption about the numerical values of these macros
#endif
int
hcf_action( IFBP ifbp, hcf_16 action )
{
	int rc = HCF_SUCCESS;

	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
#if HCF_INT_ON
	HCFLOGENTRY( action == HCF_ACT_INT_FORCE_ON ? HCF_TRACE_ACTION_KLUDGE : HCF_TRACE_ACTION, action );                                                      /* 0 */
#if (HCF_SLEEP)
	HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFE || action == HCF_ACT_INT_OFF,
		   MERGE_2( action, ifbp->IFB_IntOffCnt ) );
#else
	HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFE, action );
#endif // HCF_SLEEP
	HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFF ||
		   action == HCF_ACT_INT_OFF || action == HCF_ACT_INT_FORCE_ON,  action );
	HCFASSERT( ifbp->IFB_IntOffCnt <= 16 || ifbp->IFB_IntOffCnt >= 0xFFFE,
		   MERGE_2( action, ifbp->IFB_IntOffCnt ) ); //nesting more than 16 deep seems unreasonable
#endif // HCF_INT_ON

	switch (action) {
#if HCF_INT_ON
		hcf_16  i;
	case HCF_ACT_INT_OFF:                     // Disable Interrupt generation
#if HCF_SLEEP
		if ( ifbp->IFB_IntOffCnt == 0xFFFE ) {  // WakeUp test  ;?tie this to the "new" super-LinkStat
			ifbp->IFB_IntOffCnt++;                      // restore conventional I/F
			OPW(HREG_IO, HREG_IO_WAKEUP_ASYNC );        // set wakeup bit
			OPW(HREG_IO, HREG_IO_WAKEUP_ASYNC );        // set wakeup bit to counteract the clearing by F/W
			// 800 us latency before FW switches to high power
			MSF_WAIT(800);                              // MSF-defined function to wait n microseconds.
//OOR			if ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_DS_OOR ) { // OutOfRange
//				printk(KERN_NOTICE "ACT_INT_OFF: Deepsleep phase terminated, enable and go to AwaitConnection\n" );     //;?remove me 1 day
//				hcf_cntl( ifbp, HCF_CNTL_ENABLE );
//			}
//			ifbp->IFB_DSLinkStat &= ~( CFG_LINK_STAT_DS_IR | CFG_LINK_STAT_DS_OOR); //clear IR/OOR state
		}
#endif // HCF_SLEEP
	/*2*/   ifbp->IFB_IntOffCnt++;
//!		rc = 0;
		i = IPW( HREG_INT_EN );
		OPW( HREG_INT_EN, 0 );
		if ( i & 0x1000 ) {
			rc = HCF_ERR_NO_NIC;
		} else {
			if ( i & IPW( HREG_EV_STAT ) ) {
				rc = HCF_INT_PENDING;
			}
		}
		break;

	case HCF_ACT_INT_FORCE_ON:                // Enforce Enable Interrupt generation
		ifbp->IFB_IntOffCnt = 0;
		//Fall through in HCF_ACT_INT_ON

	case HCF_ACT_INT_ON:                      // Enable Interrupt generation
	/*4*/   if ( ifbp->IFB_IntOffCnt-- == 0 && ifbp->IFB_CardStat == 0 ) {
			                          //determine Interrupt Event mask
#if HCF_DMA
			if ( ifbp->IFB_CntlOpt & USE_DMA ) {
				i = HREG_EV_INFO | HREG_EV_RDMAD | HREG_EV_TDMAD | HREG_EV_TX_EXT;  //mask when DMA active
			} else
#endif // HCF_DMA
			{
				i = HREG_EV_INFO | HREG_EV_RX | HREG_EV_TX_EXT;                     //mask when DMA not active
				if ( ifbp->IFB_RscInd == 0 ) {
					i |= HREG_EV_ALLOC;                                         //mask when no TxFID available
				}
			}
#if HCF_SLEEP
			if ( ( IPW(HREG_EV_STAT) & ( i | HREG_EV_SLEEP_REQ ) ) == HREG_EV_SLEEP_REQ ) {
				// firmware indicates it would like to go into sleep modus
				// only acknowledge this request if no other events that can cause an interrupt are pending
				ifbp->IFB_IntOffCnt--;          //becomes 0xFFFE
				OPW( HREG_INT_EN, i | HREG_EV_TICK );
				OPW( HREG_EV_ACK, HREG_EV_SLEEP_REQ | HREG_EV_TICK | HREG_EV_ACK_REG_READY );
			} else
#endif // HCF_SLEEP
			{
				OPW( HREG_INT_EN, i | HREG_EV_SLEEP_REQ );
			}
		}
		break;
#endif // HCF_INT_ON

#if (HCF_SLEEP) & HCF_DDS
	case HCF_ACT_SLEEP:                       // DDS Sleep request
		hcf_cntl( ifbp, HCF_CNTL_DISABLE );
		cmd_exe( ifbp, HCMD_SLEEP, 0 );
		break;
//	case HCF_ACT_WAKEUP:                      // DDS Wakeup request
//		HCFASSERT( ifbp->IFB_IntOffCnt == 0xFFFE, ifbp->IFB_IntOffCnt );
//		ifbp->IFB_IntOffCnt++;                  // restore conventional I/F
//		OPW( HREG_IO, HREG_IO_WAKEUP_ASYNC );
//		MSF_WAIT(800);                          // MSF-defined function to wait n microseconds.
//		rc = hcf_action( ifbp, HCF_ACT_INT_OFF );   /*bogus, IFB_IntOffCnt == 0xFFFF, so if you carefully look
//		                                             *at the #if HCF_DDS statements, HCF_ACT_INT_OFF is empty
//		                                             *for DDS. "Much" better would be to merge the flows for
//		                                             *DDS and DEEP_SLEEP
//		                                             */
//		break;
#endif // HCF_DDS

	case HCF_ACT_RX_ACK:                      //Receiver ACK
	/*6*/   if ( ifbp->IFB_RxFID ) {
			DAWA_ACK( HREG_EV_RX );
		}
		ifbp->IFB_RxFID = ifbp->IFB_RxLen = 0;
		break;

  /*8*/ case  HCF_ACT_PRS_SCAN:                   // Hermes PRS Scan (F102)
		OPW( HREG_PARAM_1, 0x3FFF );
		//Fall through in HCF_ACT_TALLIES
	case HCF_ACT_TALLIES:                     // Hermes Inquire Tallies (F100)
#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0
	case HCF_ACT_SCAN:                        // Hermes Inquire Scan (F101)
#endif // HCF_TYPE_HII5
		/*!! the assumptions about numerical relationships between CFG_TALLIES etc and HCF_ACT_TALLIES etc
		 *   are checked by #if statements just prior to this routine resulting in: err "maintenance"   */
		cmd_exe( ifbp, HCMD_INQUIRE, action - HCF_ACT_TALLIES + CFG_TALLIES );
		break;

	default:
		HCFASSERT( DO_ASSERT, action );
		break;
	}
	//! do not HCFASSERT( rc == HCF_SUCCESS, rc )                                                       /* 30*/
	HCFLOGEXIT( HCF_TRACE_ACTION );
	return rc;
} // hcf_action


/************************************************************************************************************
 *
 *.MODULE        int hcf_cntl( IFBP ifbp, hcf_16 cmd )
 *.PURPOSE       Connect or disconnect a specific port to a specific network.
 *!!  ;???????????????? continue needs more explanation
 *               recovers by means of "continue" when the connect process in CCX mode fails
 *               Enables or disables data transmission and reception for the NIC.
 *               Activates static NIC configuration for a specific port at connect.
 *               Activates static configuration for all ports at enable.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   cmd         0x001F: Hermes command (disable, enable, connect, disconnect, continue)
 *                   HCF_CNTL_ENABLE     Enable
 *                   HCF_CNTL_DISABLE    Disable
 *                   HCF_CNTL_CONTINUE   Continue
 *                   HCF_CNTL_CONNECT    Connect
 *                   HCF_CNTL_DISCONNECT Disconnect
 *               0x0100: command qualifier (continue)
 *                   HCMD_RETRY          retry flag
 *               0x0700:  port number (connect/disconnect)
 *                   HCF_PORT_0          MAC Port 0
 *                   HCF_PORT_1          MAC Port 1
 *                   HCF_PORT_2          MAC Port 2
 *                   HCF_PORT_3          MAC Port 3
 *                   HCF_PORT_4          MAC Port 4
 *                   HCF_PORT_5          MAC Port 5
 *                   HCF_PORT_6          MAC Port 6
 *
 *.RETURNS
 *   HCF_SUCCESS
 *!! via cmd_exe
 *   HCF_ERR_NO_NIC
 *   HCF_ERR_DEFUNCT_...
 *   HCF_ERR_TIME_OUT
 *
 *.DESCRIPTION
 * The parameter cmd contains a number of subfields.
 * The actual value for cmd is created by logical or-ing the appropriate mnemonics for the subfields.
 * The field 0x001F contains the command code
 *  - HCF_CNTL_ENABLE
 *  - HCF_CNTL_DISABLE
 *  - HCF_CNTL_CONNECT
 *  - HCF_CNTL_DISCONNECT
 *  - HCF_CNTL_CONTINUE
 *
 * For HCF_CNTL_CONTINUE, the field 0x0100 contains the retry flag HCMD_RETRY.
 * For HCF_CNTL_CONNECT and HCF_CNTL_DISCONNECT, the field 0x0700 contains the port number as HCF_PORT_#.
 * For Station as well as AccessPoint F/W, MAC Port 0 is the "normal" communication channel.
 * For AccessPoint F/W, MAC Port 1 through 6 control the WDS links.
 *
 * Note that despite the names HCF_CNTL_DISABLE and HCF_CNTL_ENABLE, hcf_cntl does not influence the NIC
 * Interrupts mode.
 *
 * The Connect is used by the MSF to bring a particular port in an inactive state as far as data transmission
 * and reception are concerned.
 * When a particular port is disconnected:
 * - the F/W disables the receiver for that port.
 * - the F/W ignores send commands for that port.
 * - all frames (Receive as well as pending Transmit) for that port on the NIC are discarded.
 *
 * When the NIC is disabled, above list applies to all ports, i.e. the result is like all ports are
 * disconnected.
 *
 * When a particular port is connected:
 * - the F/W effectuates the static configuration for that port.
 * - enables the receiver for that port.
 * - accepts send commands for that port.
 *
 * Enabling has the following effects:
 * - the F/W effectuates the static configuration for all ports.
 *   The F/W only updates its static configuration at a transition from disabled to enabled or from
 *   disconnected to connected.
 *   In order to enforce the static configuration, the MSF must assure that such a transition takes place.
 *   Due to such a disable/enable or disconnect/connect sequence, Rx/Tx frames may be lost, in other words,
 *   configuration may impact communication.
 * - The DMA Engine (if applicable) is enabled.
 * Note that the Enable Function by itself only enables data transmission and reception, it
 * does not enable the Interrupt Generation mechanism. This is done by hcf_action.
 *
 * Disabling has the following effects:
 *!!  ;?????is the following statement really true
 * - it acts as a disconnect on all ports.
 * - The DMA Engine (if applicable) is disabled.
 *
 * For impact of the disable command on the behavior of hcf_dma_tx/rx_get see the appropriate sections.
 *
 * Although the Enable/Disable and Connect/Disconnect are antonyms, there is no restriction on their sequencing,
 * in other words, they may be called multiple times in arbitrary sequence without being paired or balanced.
 * Each time one of these functions is called, the effects of the preceding calls cease.
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value.
 * - NIC interrupts are not disabled.
 * - A command other than Continue, Enable, Disable, Connect or Disconnect is given.
 * - An invalid combination of the subfields is given or a bit outside the subfields is given.
 * - any return code besides HCF_SUCCESS.
 * - reentrancy, may be caused by calling a hcf_function without adequate protection against NIC interrupts or
 *   multi-threading
 *
 *.DIAGRAM
 *   hcf_cntl takes successively the following actions:
 *2: If the HCF is in Defunct mode or incompatible with the Primary or Station Supplier in the Hermes,
 *   hcf_cntl() returns immediately with HCF_ERR_NO_NIC;? as status.
 *8: when the port is disabled, the DMA engine needs to be de-activated, so the host can safely reclaim tx
 *   packets from the tx descriptor chain.
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
int
hcf_cntl( IFBP ifbp, hcf_16 cmd )
{
	int rc = HCF_ERR_INCOMP_FW;
#if HCF_ASSERT
	{   int x = cmd & HCMD_CMD_CODE;
		if ( x == HCF_CNTL_CONTINUE ) x &= ~HCMD_RETRY;
		else if ( (x == HCMD_DISABLE || x == HCMD_ENABLE) && ifbp->IFB_FWIdentity.comp_id == COMP_ID_FW_AP ) {
			x &= ~HFS_TX_CNTL_PORT;
		}
		HCFASSERT( x==HCF_CNTL_ENABLE  || x==HCF_CNTL_DISABLE    || HCF_CNTL_CONTINUE ||
			   x==HCF_CNTL_CONNECT || x==HCF_CNTL_DISCONNECT, cmd );
	}
#endif // HCF_ASSERT
// #if (HCF_SLEEP) & HCF_DDS
//	HCFASSERT( ifbp->IFB_IntOffCnt != 0xFFFE, cmd );
// #endif // HCF_DDS
	HCFLOGENTRY( HCF_TRACE_CNTL, cmd );
	if ( ifbp->IFB_CardStat == 0 ) {                                                                 /*2*/
	/*6*/   rc = cmd_exe( ifbp, cmd, 0 );
#if (HCF_SLEEP) & HCF_DDS
		ifbp->IFB_TickCnt = 0;              //start 2 second period (with 1 tick uncertanty)
#endif // HCF_DDS
	}
#if HCF_DMA
	//!rlav : note that this piece of code is always executed, regardless of the DEFUNCT bit in IFB_CardStat.
	// The reason behind this is that the MSF should be able to get all its DMA resources back from the HCF,
	// even if the hardware is disfunctional. Practical example under Windows : surprise removal.
	if ( ifbp->IFB_CntlOpt & USE_DMA ) {
		hcf_io io_port = ifbp->IFB_IOBase;
		DESC_STRCT *p;
		if ( cmd == HCF_CNTL_DISABLE || cmd == HCF_CNTL_ENABLE ) {
			OUT_PORT_DWORD( (io_port + HREG_DMA_CTRL), DMA_CTRLSTAT_RESET);                     /*8*/
			ifbp->IFB_CntlOpt &= ~DMA_ENABLED;
		}
		if ( cmd == HCF_CNTL_ENABLE ) {
			OUT_PORT_DWORD( (io_port + HREG_DMA_CTRL), DMA_CTRLSTAT_GO);
			/* ;? by rewriting hcf_dma_rx_put you can probably just call hcf_dma_rx_put( ifbp->IFB_FirstDesc[DMA_RX] )
			 * as additional beneficiary side effect, the SOP and EOP bits will also be cleared
			 */
			ifbp->IFB_CntlOpt |= DMA_ENABLED;
			HCFASSERT( NT_ASSERT, NEVER_TESTED );
			// make the entire rx descriptor chain DMA-owned, so the DMA engine can (re-)use it.
			p = ifbp->IFB_FirstDesc[DMA_RX];
			if (p != NULL) {   //;? Think this over again in the light of the new chaining strategy
				if ( 1 )    { //begin alternative
					HCFASSERT( NT_ASSERT, NEVER_TESTED );
					put_frame_lst( ifbp, ifbp->IFB_FirstDesc[DMA_RX], DMA_RX );
					if ( ifbp->IFB_FirstDesc[DMA_RX] ) {
						put_frame_lst( ifbp, ifbp->IFB_FirstDesc[DMA_RX]->next_desc_addr, DMA_RX );
					}
				} else {
					while ( p ) {
						//p->buf_cntl.cntl_stat |= DESC_DMA_OWNED;
						p->BUF_CNT |= DESC_DMA_OWNED;
						p = p->next_desc_addr;
					}
					// a rx chain is available so hand it over to the DMA engine
					p = ifbp->IFB_FirstDesc[DMA_RX];
					OUT_PORT_DWORD( (io_port + HREG_RXDMA_PTR32), p->desc_phys_addr);
				}  //end alternative
			}
		}
	}
#endif // HCF_DMA
	HCFASSERT( rc == HCF_SUCCESS, rc );
	HCFLOGEXIT( HCF_TRACE_CNTL );
	return rc;
} // hcf_cntl


/************************************************************************************************************
 *
 *.MODULE        int hcf_connect( IFBP ifbp, hcf_io io_base )
 *.PURPOSE       Grants access right for the HCF to the IFB.
 *               Initializes Card and HCF housekeeping.
 *
 *.ARGUMENTS
 *   ifbp        (near) address of the Interface Block
 *   io_base     non-USB: I/O Base address of the NIC (connect)
 *               non-USB: HCF_DISCONNECT
 *               USB:     HCF_CONNECT, HCF_DISCONNECT
 *
 *.RETURNS
 *   HCF_SUCCESS
 *   HCF_ERR_INCOMP_PRI
 *   HCF_ERR_INCOMP_FW
 *   HCF_ERR_DEFUNCT_CMD_SEQ
 *!! HCF_ERR_NO_NIC really returned ;?
 *   HCF_ERR_NO_NIC
 *   HCF_ERR_TIME_OUT
 *
 *   MSF-accessible fields of Result Block:
 *   IFB_IOBase              entry parameter io_base
 *   IFB_IORange             HREG_IO_RANGE (0x40/0x80)
 *   IFB_Version             version of the IFB layout
 *   IFB_FWIdentity          CFG_FW_IDENTITY_STRCT, specifies the identity of the
 *                           "running" F/W, i.e. tertiary F/W under normal conditions
 *   IFB_FWSup               CFG_SUP_RANGE_STRCT, specifies the supplier range of
 *                           the "running" F/W, i.e. tertiary F/W under normal conditions
 *   IFB_HSISup              CFG_SUP_RANGE_STRCT, specifies the HW/SW I/F range of the NIC
 *   IFB_PRIIdentity         CFG_PRI_IDENTITY_STRCT, specifies the Identity of the Primary F/W
 *   IFB_PRISup              CFG_SUP_RANGE_STRCT, specifies the supplier range of the Primary F/W
 *   all other               all MSF accessible fields, which are not specified above, are zero-filled
 *
 *.CONDITIONS
 * It is the responsibility of the MSF to assure the correctness of the I/O Base address.
 *
 * Note: hcf_connect defaults to NIC interrupt disabled mode, i.e. as if hcf_action( HCF_ACT_INT_OFF )
 * was called.
 *
 *.DESCRIPTION
 * hcf_connect passes the MSF-defined location of the IFB to the HCF and grants or revokes access right for the
 * HCF to the IFB. Revoking is done by specifying HCF_DISCONNECT rather than an I/O address for the parameter
 * io_base.  Every call of hcf_connect in "connect" mode, must eventually be followed by a call of hcf_connect
 * in "disconnect" mode. Calling hcf_connect in "connect"/"disconnect" mode can not be nested.
 * The IFB address must be used as a handle with all subsequent HCF-function calls and the HCF uses the IFB
 * address as a handle when it performs a call(back) of an MSF-function (i.e. msf_assert).
 *
 * Note that not only the MSF accessible fields are cleared, but also all internal housekeeping
 * information is re-initialized.
 * This implies that all settings which are done via hcf_action and hcf_put_info (e.g. CFG_MB_ASSERT, CFG_REG_MB,
 * CFG_REG_INFO_LOG) must be done again. The only field which is not cleared, is IFB_MSFSup.
 *
 * If HCF_INT_ON is selected as compile option, NIC interrupts are disabled.
 *
 * Assert fails if
 * - ifbp is not properly aligned ( ref chapter HCF_ALIGN in 4.1.1)
 * - I/O Base Address is not a multiple of 0x40 (note: 0x0000 is explicitly allowed).
 *
 *.DIAGRAM
 *
 *0: Throughout hcf_connect you need to distinguish the connect from the disconnect case, which requires
 *   some attention about what to use as "I/O" address when for which purpose.
 *2:
 *2a: Reset H-II by toggling reset bit in IO-register on and off.
 *   The HCF_TYPE_PRELOADED caters for the DOS environment where H-II is loaded by a separate program to
 *   overcome the 64k size limit posed on DOS drivers.
 *   The macro OPW is not yet useable because the IFB_IOBase field is not set.
 *   Note 1: hopefully the clearing and initializing of the IFB (see below) acts as a delay which meets the
 *   specification for S/W reset
 *   Note 2: it turns out that on some H/W constellations, the clock to access the EEProm is not lowered
 *   to an appropriate frequency by HREG_IO_SRESET. By giving an HCMD_INI first, this problem is worked around.
 *2b: Experimentally it is determined over a wide range of F/W versions that are waiting for the for Cmd bit in
 *   Ev register gives a workable strategy. The available documentation does not give much clues.
 *4: clear and initialize the IFB
 *   The HCF house keeping info is designed such that zero is the appropriate initial value for as much as
 *   feasible IFB-items.
 *   The readable fields mentioned in the description section and some HCF specific fields are given their
 *   actual value.
 *   IFB_TickIni is initialized at best guess before calibration
 *   Hcf_connect defaults to "no interrupt generation" (implicitly achieved by the zero-filling).
 *6: Register compile-time linked MSF Routine and set default filter level
 *   cast needed to get around the "near" problem in DOS COM model
 *   er C2446: no conversion from void (__near __cdecl *)(unsigned char __far *,unsigned int,unsigned short,int)
 *                           to   void (__far  __cdecl *)(unsigned char __far *,unsigned int,unsigned short,int)
 *8: If a command is apparently still active (as indicated by the Busy bit in Cmd register) this may indicate a
 *   blocked cmd pipe line.  To unblock the following actions are done:
 *    - Ack everything
 *    - Wait for Busy bit drop  in Cmd register
 *    - Wait for Cmd  bit raise in Ev  register
 *   The two waits are combined in a single HCF_WAIT_WHILE to optimize memory size. If either of these waits
 *   fail (prot_cnt becomes 0), then something is serious wrong. Rather than PANICK, the assumption is that the
 *   next cmd_exe will fail, causing the HCF to go into DEFUNCT mode
 *10:    Ack everything to unblock a (possibly blocked) cmd pipe line
 *   Note 1: it is very likely that an Alloc event is pending and very well possible that a (Send) Cmd event is
 *   pending on non-initial calls
 *   Note 2: it is assumed that this strategy takes away the need to ack every conceivable event after an
 *   Hermes Initialize
 *12:    Only H-II NEEDS the Hermes Initialize command. Due to the different semantics for H-I and H-II
 *   Initialize command, init() does not (and can not, since it is called e.g. after a download) execute the
 *   Hermes Initialize command. Executing the Hermes Initialize command for H-I would not harm but not do
 *   anything useful either, so it is skipped.
 *   The return status of cmd_exe is ignored. It is assumed that if cmd_exe fails, init fails too
 *14:    use io_base as a flag to merge hcf_connect and hcf_disconnect into 1 routine
 *   the call to init and its subsequent call of cmd_exe will return HCF_ERR_NO_NIC if appropriate. This status
 *   is (badly) needed by some legacy combination of NT4 and card services which do not yield an I/O address in
 *   time.
 *
 *.NOTICE
 *   On platforms where the NULL-pointer is not a bit-pattern of all zeros, the zero-filling of the IFB results
 *   in an incorrect initialization of pointers.
 *   The implementation of the MailBox manipulation in put_mb_info protects against the absence of a MailBox
 *   based on IFB_MBSize, IFB_MBWp and ifbp->IFB_MBRp. This has ramifications on the initialization of the
 *   MailBox via hcf_put_info with the CFG_REG_MB type, but it prevents dependency on the "NULL-"ness of
 *   IFB_MBp.
 *
 *.NOTICE
 *   There are a number of problems when asserting and logging hcf_connect, e.g.
 *    - Asserting on re-entrancy of hcf_connect by means of
 *    "HCFASSERT( (ifbp->IFB_AssertTrace & HCF_ASSERT_CONNECT) == 0, 0 )" is not useful because IFB contents
 *    are undefined
 *    - Asserting before the IFB is cleared will cause mdd_assert() to interpret the garbage in IFB_AssertRtn
 *    as a routine address
 *   Therefore HCFTRACE nor HCFLOGENTRY is called by hcf_connect.
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
int
hcf_connect( IFBP ifbp, hcf_io io_base )
{
	int         rc = HCF_SUCCESS;
	hcf_io      io_addr;
	hcf_32      prot_cnt;
	hcf_8       *q;
	LTV_STRCT   x;
#if HCF_ASSERT
	hcf_16 xa = ifbp->IFB_FWIdentity.typ;
	/* is assumed to cause an assert later on if hcf_connect is called without intervening hcf_disconnect.
	 * xa == CFG_FW_IDENTITY in subsequent calls without preceding hcf_disconnect,
	 * xa == 0 in subsequent calls with preceding hcf_disconnect,
	 * xa == "garbage" (any value except CFG_FW_IDENTITY is acceptable) in the initial call
	 */
#endif // HCF_ASSERT

	if ( io_base == HCF_DISCONNECT ) {                  //disconnect
		io_addr = ifbp->IFB_IOBase;
		OPW( HREG_INT_EN, 0 );      //;?workaround against dying F/W on subsequent hcf_connect calls
	} else {                                            //connect                               /* 0 */
		io_addr = io_base;
	}

#if 0 //;? if a subsequent hcf_connect is preceded by an hcf_disconnect the wakeup is not needed !!
#if HCF_SLEEP
	OUT_PORT_WORD( .....+HREG_IO, HREG_IO_WAKEUP_ASYNC );       //OPW not yet useable
	MSF_WAIT(800);                              // MSF-defined function to wait n microseconds.
	note that MSF_WAIT uses not yet defined!!!! IFB_IOBase and IFB_TickIni (via PROT_CNT_INI)
	so be careful if this code is restored
#endif // HCF_SLEEP
#endif // 0

#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0    //switch clock back for SEEPROM access  !!!
	OUT_PORT_WORD( io_addr + HREG_CMD, HCMD_INI );          //OPW not yet useable
	prot_cnt = INI_TICK_INI;
	HCF_WAIT_WHILE( (IN_PORT_WORD( io_addr +  HREG_EV_STAT) & HREG_EV_CMD) == 0 );
	OUT_PORT_WORD( (io_addr + HREG_IO), HREG_IO_SRESET );   //OPW not yet useable                   /* 2a*/
#endif // HCF_TYPE_PRELOADED
	for ( q = (hcf_8*)(&ifbp->IFB_Magic); q > (hcf_8*)ifbp; *--q = 0 ) /*NOP*/;                     /* 4 */
	ifbp->IFB_Magic     = HCF_MAGIC;
	ifbp->IFB_Version   = IFB_VERSION;
#if defined MSF_COMPONENT_ID //a new IFB demonstrates how dirty the solution is
	xxxx[xxxx_PRI_IDENTITY_OFFSET] = NULL;      //IFB_PRIIdentity placeholder   0xFD02
	xxxx[xxxx_PRI_IDENTITY_OFFSET+1] = NULL;    //IFB_PRISup placeholder        0xFD03
#endif // MSF_COMPONENT_ID
#if (HCF_TALLIES) & ( HCF_TALLIES_NIC | HCF_TALLIES_HCF )
	ifbp->IFB_TallyLen = 1 + 2 * (HCF_NIC_TAL_CNT + HCF_HCF_TAL_CNT);   //convert # of Tallies to L value for LTV
	ifbp->IFB_TallyTyp = CFG_TALLIES;           //IFB_TallyTyp: set T value
#endif // HCF_TALLIES_NIC / HCF_TALLIES_HCF
	ifbp->IFB_IOBase    = io_addr;              //set IO_Base asap, so asserts via HREG_SW_2 don't harm
	ifbp->IFB_IORange   = HREG_IO_RANGE;
	ifbp->IFB_CntlOpt   = USE_16BIT;
#if HCF_ASSERT
	assert_ifbp = ifbp;
	ifbp->IFB_AssertLvl = 1;
#if (HCF_ASSERT) & HCF_ASSERT_LNK_MSF_RTN
	if ( io_base != HCF_DISCONNECT ) {
		ifbp->IFB_AssertRtn = (MSF_ASSERT_RTNP)msf_assert;                                          /* 6 */
	}
#endif // HCF_ASSERT_LNK_MSF_RTN
#if (HCF_ASSERT) & HCF_ASSERT_MB                //build the structure to pass the assert info to hcf_put_info
	ifbp->IFB_AssertStrct.len = sizeof(ifbp->IFB_AssertStrct)/sizeof(hcf_16) - 1;
	ifbp->IFB_AssertStrct.typ = CFG_MB_INFO;
	ifbp->IFB_AssertStrct.base_typ = CFG_MB_ASSERT;
	ifbp->IFB_AssertStrct.frag_cnt = 1;
	ifbp->IFB_AssertStrct.frag_buf[0].frag_len =
		( offsetof(IFB_STRCT, IFB_AssertLvl) - offsetof(IFB_STRCT, IFB_AssertLine) ) / sizeof(hcf_16);
	ifbp->IFB_AssertStrct.frag_buf[0].frag_addr = &ifbp->IFB_AssertLine;
#endif // HCF_ASSERT_MB
#endif // HCF_ASSERT
	IF_PROT_TIME( prot_cnt = ifbp->IFB_TickIni = INI_TICK_INI );
#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0
	//!! No asserts before Reset-bit in HREG_IO is cleared
	OPW( HREG_IO, 0x0000 );                     //OPW useable                                       /* 2b*/
	HCF_WAIT_WHILE( (IPW( HREG_EV_STAT) & HREG_EV_CMD) == 0 );
	IF_PROT_TIME( HCFASSERT( prot_cnt, IPW( HREG_EV_STAT) ) );
	IF_PROT_TIME( if ( prot_cnt ) prot_cnt = ifbp->IFB_TickIni );
#endif // HCF_TYPE_PRELOADED
	//!! No asserts before Reset-bit in HREG_IO is cleared
	HCFASSERT( DO_ASSERT, MERGE_2( HCF_ASSERT, 0xCAF0 ) ); //just to proof that the complete assert machinery is working
	HCFASSERT( xa != CFG_FW_IDENTITY, 0 );       // assert if hcf_connect is called without intervening hcf_disconnect.
	HCFASSERT( ((hcf_32)(void*)ifbp & (HCF_ALIGN-1) ) == 0, (hcf_32)(void*)ifbp );
	HCFASSERT( (io_addr & 0x003F) == 0, io_addr );
	                                        //if Busy bit in Cmd register
	if (IPW( HREG_CMD ) & HCMD_BUSY ) {                                                             /* 8 */
		//.  Ack all to unblock a (possibly) blocked cmd pipe line
		OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ );
		                                //.  Wait for Busy bit drop  in Cmd register
		                                //.  Wait for Cmd  bit raise in Ev  register
		HCF_WAIT_WHILE( ( IPW( HREG_CMD ) & HCMD_BUSY ) && (IPW( HREG_EV_STAT) & HREG_EV_CMD) == 0 );
		IF_PROT_TIME( HCFASSERT( prot_cnt, IPW( HREG_EV_STAT) ) ); /* if prot_cnt == 0, cmd_exe will fail, causing DEFUNCT */
	}
	OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ );
#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0                                                        /*12*/
	(void)cmd_exe( ifbp, HCMD_INI, 0 );
#endif // HCF_TYPE_PRELOADED
	if ( io_base != HCF_DISCONNECT ) {
		rc = init( ifbp );                                                                          /*14*/
		if ( rc == HCF_SUCCESS ) {
			x.len = 2;
			x.typ = CFG_NIC_BUS_TYPE;
			(void)hcf_get_info( ifbp, &x );
			ifbp->IFB_BusType = x.val[0];
			//CFG_NIC_BUS_TYPE not supported -> default 32 bits/DMA, MSF has to overrule via CFG_CNTL_OPT
			if ( x.len == 0 || x.val[0] == 0x0002 || x.val[0] == 0x0003 ) {
#if (HCF_IO) & HCF_IO_32BITS
				ifbp->IFB_CntlOpt &= ~USE_16BIT;            //reset USE_16BIT
#endif // HCF_IO_32BITS
#if HCF_DMA
				ifbp->IFB_CntlOpt |= USE_DMA;               //SET DMA
#else
				ifbp->IFB_IORange = 0x40 /*i.s.o. HREG_IO_RANGE*/;
#endif // HCF_DMA
			}
		}
	} else HCFASSERT(  ( ifbp->IFB_Magic ^= HCF_MAGIC ) == 0, ifbp->IFB_Magic ) /*NOP*/;
	/* of above HCFASSERT only the side effect is needed, NOP in case HCFASSERT is dummy */
	ifbp->IFB_IOBase = io_base;                                                                     /* 0*/
	return rc;
} // hcf_connect

#if HCF_DMA
/************************************************************************************************************
 * Function get_frame_lst
 *  - resolve the "last host-owned descriptor" problems when a descriptor list is reclaimed by the MSF.
 *
 * The FrameList to be reclaimed as well as the DescriptorList always start in IFB_FirstDesc[tx_rx_flag]
 * and this is always the "current" DELWA Descriptor.
 *
 * If a FrameList is available, the last descriptor of the FrameList to turned into a new DELWA Descriptor:
 *  - a copy is made from the information in the last descriptor of the FrameList into the current
 *    DELWA Descriptor
 *  - the remainder of the DescriptorList is detached from the copy by setting the next_desc_addr at NULL
 *  - the DMA control bits of the copy are cleared to do not confuse the MSF
 *  - the copy of the last descriptor (i.e. the "old" DELWA Descriptor) is chained to the prev Descriptor
 *    of the FrameList, thus replacing the original last Descriptor of the FrameList.
 *  - IFB_FirstDesc is changed to the address of that replaced (original) last descriptor of the FrameList,
 *    i.e. the "new" DELWA Descriptor.
 *
 * This function makes a copy of that last host-owned descriptor, so the MSF will get a copy of the descriptor.
 * On top of that, it adjusts DMA related fields in the IFB structure.
 // perform a copying-scheme to circumvent the 'last host owned descriptor cannot be reclaimed' limitation imposed by H2.5's DMA hardware design
 // a 'reclaim descriptor' should be available in the HCF:
 *
 * Returns: address of the first descriptor of the FrameList
 *
 8: Be careful once you start re-ordering the steps in the copy process, that it still works for cases
 *   of FrameLists of 1, 2 and more than 2 descriptors
 *
 * Input parameters:
 * tx_rx_flag      : specifies 'transmit' or 'receive' descriptor.
 *
 ************************************************************************************************************/
HCF_STATIC DESC_STRCT*
get_frame_lst( IFBP ifbp, int tx_rx_flag )
{

	DESC_STRCT *head = ifbp->IFB_FirstDesc[tx_rx_flag];
	DESC_STRCT *copy, *p, *prev;

	HCFASSERT( tx_rx_flag == DMA_RX || tx_rx_flag == DMA_TX, tx_rx_flag );
	                                        //if FrameList
	if ( head ) {
		                                //.  search for last descriptor of first FrameList
		p = prev = head;
		while ( ( p->BUF_SIZE & DESC_EOP ) == 0 && p->next_desc_addr ) {
			if ( ( ifbp->IFB_CntlOpt & DMA_ENABLED ) == 0 ) {   //clear control bits when disabled
				p->BUF_CNT &= DESC_CNT_MASK;
			}
			prev = p;
			p = p->next_desc_addr;
		}
		                                //.  if DMA enabled
		if ( ifbp->IFB_CntlOpt & DMA_ENABLED ) {
			                        //.  .  if last descriptor of FrameList is DMA owned
			                        //.  .  or if FrameList is single (DELWA) Descriptor
			if ( p->BUF_CNT & DESC_DMA_OWNED || head->next_desc_addr == NULL ) {
				                //.  .  .  refuse to return FrameList to caller
				head = NULL;
			}
		}
	}
	                                        //if returnable FrameList found
	if ( head ) {
		                                //.  if FrameList is single (DELWA) Descriptor (implies DMA disabled)
		if ( head->next_desc_addr == NULL ) {
			                        //.  .  clear DescriptorList
			/*;?ifbp->IFB_LastDesc[tx_rx_flag] =*/ ifbp->IFB_FirstDesc[tx_rx_flag] = NULL;
			                        //.  else
		} else {
			                        //.  .  strip hardware-related bits from last descriptor
			                        //.  .  remove DELWA Descriptor from head of DescriptorList
			copy = head;
			head = head->next_desc_addr;
			                        //.   .  exchange first (Confined) and last (possibly imprisoned) Descriptor
			copy->buf_phys_addr = p->buf_phys_addr;
			copy->buf_addr = p->buf_addr;
			copy->BUF_SIZE = p->BUF_SIZE &= DESC_CNT_MASK;  //get rid of DESC_EOP and possibly DESC_SOP
			copy->BUF_CNT = p->BUF_CNT &= DESC_CNT_MASK;    //get rid of DESC_DMA_OWNED
#if (HCF_EXT) & HCF_DESC_STRCT_EXT
			copy->DESC_MSFSup = p->DESC_MSFSup;
#endif // HCF_DESC_STRCT_EXT
			                        //.  .  turn into a DELWA Descriptor
			p->buf_addr = NULL;
			                        //.  .  chain copy to prev                                          /* 8*/
			prev->next_desc_addr = copy;
			                        //.  .  detach remainder of the DescriptorList from FrameList
			copy->next_desc_addr = NULL;
			copy->next_desc_phys_addr = 0xDEAD0000; //! just to be nice, not really needed
			                        //.  .  save the new start (i.e. DELWA Descriptor) in IFB_FirstDesc
			ifbp->IFB_FirstDesc[tx_rx_flag] = p;
		}
		                                //.  strip DESC_SOP from first descriptor
		head->BUF_SIZE &= DESC_CNT_MASK;
		//head->BUF_CNT &= DESC_CNT_MASK;  get rid of DESC_DMA_OWNED
		head->next_desc_phys_addr = 0xDEAD0000; //! just to be nice, not really needed
	}
	                                        //return the just detached FrameList (if any)
	return head;
} // get_frame_lst


/************************************************************************************************************
 * Function put_frame_lst
 *
 * This function
 *
 * Returns: address of the first descriptor of the FrameList
 *
 * Input parameters:
 * tx_rx_flag      : specifies 'transmit' or 'receive' descriptor.
 *
 * The following list should be kept in sync with hcf_dma_tx/rx_put, in order to get them in the WCI-spec !!!!
 * Assert fails if
 * - DMA is not enabled
 * - descriptor list is NULL
 * - a descriptor in the descriptor list is not double word aligned
 * - a count of size field of a descriptor contains control bits, i.e. bits in the high order nibble.
 * - the DELWA descriptor is not a "singleton" DescriptorList.
 * - the DELWA descriptor is not the first Descriptor supplied
 * - a non_DMA descriptor is supplied before the DELWA Descriptor is supplied
 * - Possibly more checks could be added !!!!!!!!!!!!!

 *.NOTICE
 * The asserts marked with *sc* are really sanity checks for the HCF, they can (supposedly) not be influenced
 * by incorrect MSF behavior

 // The MSF is required to supply the HCF with a single descriptor for MSF tx reclaim purposes.
 // This 'reclaim descriptor' can be recognized by the fact that its buf_addr field is zero.
 *********************************************************************************************
 * Although not required from a hardware perspective:
 * - make each descriptor in this rx-chain DMA-owned.
 * - Also set the count to zero. EOP and SOP bits are also cleared.
 *********************************************************************************************/
HCF_STATIC void
put_frame_lst( IFBP ifbp, DESC_STRCT *descp, int tx_rx_flag )
{
	DESC_STRCT  *p = descp;
	hcf_16 port;

	HCFASSERT( ifbp->IFB_CntlOpt & USE_DMA, ifbp->IFB_CntlOpt); //only hcf_dma_tx_put must also be DMA_ENABLED
	HCFASSERT( tx_rx_flag == DMA_RX || tx_rx_flag == DMA_TX, tx_rx_flag );
	HCFASSERT( p , 0 );

	while ( p ) {
		HCFASSERT( ((hcf_32)p & 3 ) == 0, (hcf_32)p );
		HCFASSERT( (p->BUF_CNT & ~DESC_CNT_MASK) == 0, p->BUF_CNT );
		HCFASSERT( (p->BUF_SIZE & ~DESC_CNT_MASK) == 0, p->BUF_SIZE );
		p->BUF_SIZE &= DESC_CNT_MASK;                   //!!this SHOULD be superfluous in case of correct MSF
		p->BUF_CNT &= tx_rx_flag == DMA_RX ? 0 : DESC_CNT_MASK; //!!this SHOULD be superfluous in case of correct MSF
		p->BUF_CNT |= DESC_DMA_OWNED;
		if ( p->next_desc_addr ) {
//			HCFASSERT( p->buf_addr && p->buf_phys_addr  && p->BUF_SIZE && +/- p->BUF_SIZE, ... );
			HCFASSERT( p->next_desc_addr->desc_phys_addr, (hcf_32)p->next_desc_addr );
			p->next_desc_phys_addr = p->next_desc_addr->desc_phys_addr;
		} else {                                    //
			p->next_desc_phys_addr = 0;
			if ( p->buf_addr == NULL ) {            // DELWA Descriptor
				HCFASSERT( descp == p, (hcf_32)descp );  //singleton DescriptorList
				HCFASSERT( ifbp->IFB_FirstDesc[tx_rx_flag] == NULL, (hcf_32)ifbp->IFB_FirstDesc[tx_rx_flag]);
				HCFASSERT( ifbp->IFB_LastDesc[tx_rx_flag] == NULL, (hcf_32)ifbp->IFB_LastDesc[tx_rx_flag]);
				descp->BUF_CNT = 0; //&= ~DESC_DMA_OWNED;
				ifbp->IFB_FirstDesc[tx_rx_flag] = descp;
// part of alternative ifbp->IFB_LastDesc[tx_rx_flag] = ifbp->IFB_FirstDesc[tx_rx_flag] = descp;
				                // if "recycling" a FrameList
				                // (e.g. called from hcf_cntl( HCF_CNTL_ENABLE )
				                // .  prepare for activation DMA controller
// part of alternative descp = descp->next_desc_addr;
			} else {                                //a "real" FrameList, hand it over to the DMA engine
				HCFASSERT( ifbp->IFB_FirstDesc[tx_rx_flag], (hcf_32)descp );
				HCFASSERT( ifbp->IFB_LastDesc[tx_rx_flag], (hcf_32)descp );
				HCFASSERT( ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_addr == NULL,
					   (hcf_32)ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_addr);
//				p->buf_cntl.cntl_stat |= DESC_DMA_OWNED;
				ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_addr = descp;
				ifbp->IFB_LastDesc[tx_rx_flag]->next_desc_phys_addr = descp->desc_phys_addr;
				port = HREG_RXDMA_PTR32;
				if ( tx_rx_flag ) {
					p->BUF_SIZE |= DESC_EOP;    // p points at the last descriptor in the caller-supplied descriptor chain
					descp->BUF_SIZE |= DESC_SOP;
					port = HREG_TXDMA_PTR32;
				}
				OUT_PORT_DWORD( (ifbp->IFB_IOBase + port), descp->desc_phys_addr );
			}
			ifbp->IFB_LastDesc[tx_rx_flag] = p;
		}
		p = p->next_desc_addr;
	}
} // put_frame_lst


/************************************************************************************************************
 *
 *.MODULE        DESC_STRCT* hcf_dma_rx_get( IFBP ifbp )
 *.PURPOSE       decapsulate a message and provides that message to the MSF.
 *               reclaim all descriptors in the rx descriptor chain.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS
 *   pointer to a FrameList
 *
 *.DESCRIPTION
 * hcf_dma_rx_get is intended to  return a received frame when such a frame is deposited in Host memory by the
 * DMA engine. In addition hcf_dma_rx_get can be used to reclaim all descriptors in the rx descriptor chain
 * when the DMA Engine is disabled, e.g. as part of a driver unloading strategy.
 * hcf_dma_rx_get must be called repeatedly by the MSF when hcf_service_nic signals availability of a rx frame
 * through the HREG_EV_RDMAD flag of IFB_DmaPackets. The calling must stop when a NULL pointer is returned, at
 * which time the HREG_EV_RDMAD flag is also cleared by the HCF to arm the mechanism for the next frame
 * reception.
 * Regardless whether the DMA Engine is currently enabled (as controlled via hcf_cntl), if the DMA controller
 * deposited an Rx-frame in the Rx-DescriptorList, this frame is detached from the Rx-DescriptorList,
 * transformed into a FrameList (i.e.  updating the housekeeping fields in the descriptors) and returned to the
 * caller.
 * If no such Rx-frame is available in the Rx-DescriptorList, the behavior of hcf_dma_rx_get depends on the
 * status of the DMA Engine.
 * If the DMA Engine is enabled, a NULL pointer is returned.
 * If the DMA Engine is disabled, the following strategy is used:
 * - the complete Rx-DescriptorList is returned. The DELWA Descriptor is not part of the Rx-DescriptorList.
 * - If there is no Rx-DescriptorList, the DELWA Descriptor is returned.
 * - If there is no DELWA Descriptor, a NULL pointer is returned.
 *
 * If the MSF performs an disable/enable sequence without exhausting the Rx-DescriptorList as described above,
 * the enable command will reset all house keeping information, i.e. already received but not yet by the MSF
 * retrieved frames are lost and the next frame will be received starting with the oldest descriptor.
 *
 * The HCF can be used in 2 fashions: with and without decapsulation for data transfer.
 * This is controlled at compile time by the HCF_ENC bit of the HCF_ENCAP system constant.
 * If appropriate, decapsulation is done by moving some data inside the buffers and updating the descriptors
 * accordingly.
 *!! ;?????where did I describe why a simple manipulation with the count values does not suffice?
 *
 *.DIAGRAM
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/

DESC_STRCT*
hcf_dma_rx_get (IFBP ifbp)
{
	DESC_STRCT *descp;  // pointer to start of FrameList

	descp = get_frame_lst( ifbp, DMA_RX );
	if ( descp && descp->buf_addr ) {

		                                //skip decapsulation at confined descriptor
#if (HCF_ENCAP) == HCF_ENC
		int i;
		DESC_STRCT *p = descp->next_desc_addr;  //pointer to 2nd descriptor of frame
		HCFASSERT(p, 0);
		// The 2nd descriptor contains (maybe) a SNAP header plus part or whole of the payload.
		//determine decapsulation sub-flag in RxFS
		i = *(wci_recordp)&descp->buf_addr[HFS_STAT] & ( HFS_STAT_MSG_TYPE | HFS_STAT_ERR );
		if ( i == HFS_STAT_TUNNEL ||
		     ( i == HFS_STAT_1042 && hcf_encap( (wci_bufp)&p->buf_addr[HCF_DASA_SIZE] ) != ENC_TUNNEL )) {
			// The 2nd descriptor contains a SNAP header plus part or whole of the payload.
			HCFASSERT( p->BUF_CNT == (p->buf_addr[5] + (p->buf_addr[4]<<8) + 2*6 + 2 - 8), p->BUF_CNT );
			// perform decapsulation
			HCFASSERT(p->BUF_SIZE >=8, p->BUF_SIZE);
			// move SA[2:5] in the second buffer to replace part of the SNAP header
			for ( i=3; i >= 0; i--) p->buf_addr[i+8] = p->buf_addr[i];
			// copy DA[0:5], SA[0:1] from first buffer to second buffer
			for ( i=0; i<8; i++) p->buf_addr[i] = descp->buf_addr[HFS_ADDR_DEST + i];
			// make first buffer shorter in count
			descp->BUF_CNT = HFS_ADDR_DEST;
		}
	}
#endif // HCF_ENC
	if ( descp == NULL ) ifbp->IFB_DmaPackets &= (hcf_16)~HREG_EV_RDMAD;  //;?could be integrated into get_frame_lst
	HCFLOGEXIT( HCF_TRACE_DMA_RX_GET );
	return descp;
} // hcf_dma_rx_get


/************************************************************************************************************
 *
 *.MODULE        void hcf_dma_rx_put( IFBP ifbp, DESC_STRCT *descp )
 *.PURPOSE       supply buffers for receive purposes.
 *               supply the Rx-DELWA descriptor.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   descp       address of a DescriptorList
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * This function is called by the MSF to supply the HCF with new/more buffers for receive purposes.
 * The HCF can be used in 2 fashions: with and without encapsulation for data transfer.
 * This is controlled at compile time by the HCF_ENC bit of the HCF_ENCAP system constant.
 * As a consequence, some additional constraints apply to the number of descriptor and the buffers associated
 * with the first 2 descriptors. Independent of the encapsulation feature, the COUNT fields are ignored.
 * A special case is the supplying of the DELWA descriptor, which must be supplied as the first descriptor.
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value.
 * - NIC interrupts are not disabled while required by parameter action.
 * - in case decapsulation by the HCF is selected:
 *     - The first databuffer does not have the exact size corresponding with the RxFS up to the 802.3 DestAddr
 *       field (== 29 words).
 *     - The FrameList does not consists of at least 2 Descriptors.
 *     - The second databuffer does not have the minimum size of 8 bytes.
 *!! The 2nd part of the list of asserts should be kept in sync with put_frame_lst, in order to get
 *!! them in the WCI-spec !!!!
 * - DMA is not enabled
 * - descriptor list is NULL
 * - a descriptor in the descriptor list is not double word aligned
 * - a count of size field of a descriptor contains control bits, i.e. bits in the high order nibble.
 * - the DELWA descriptor is not a "singleton" DescriptorList.
 * - the DELWA descriptor is not the first Descriptor supplied
 * - a non_DMA descriptor is supplied before the DELWA Descriptor is supplied
 *!! - Possibly more checks could be added !!!!!!!!!!!!!
 *
 *.DIAGRAM
 *
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
void
hcf_dma_rx_put( IFBP ifbp, DESC_STRCT *descp )
{

	HCFLOGENTRY( HCF_TRACE_DMA_RX_PUT, 0xDA01 );
	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
	HCFASSERT_INT;

	put_frame_lst( ifbp, descp, DMA_RX );
#if HCF_ASSERT && (HCF_ENCAP) == HCF_ENC
	if ( descp->buf_addr ) {
		HCFASSERT( descp->BUF_SIZE == HCF_DMA_RX_BUF1_SIZE, descp->BUF_SIZE );
		HCFASSERT( descp->next_desc_addr, 0 ); // first descriptor should be followed by another descriptor
		// The second DB is for SNAP and payload purposes. It should be a minimum of 12 bytes in size.
		HCFASSERT( descp->next_desc_addr->BUF_SIZE >= 12, descp->next_desc_addr->BUF_SIZE );
	}
#endif // HCFASSERT / HCF_ENC
	HCFLOGEXIT( HCF_TRACE_DMA_RX_PUT );
} // hcf_dma_rx_put


/************************************************************************************************************
 *
 *.MODULE        DESC_STRCT* hcf_dma_tx_get( IFBP ifbp )
 *.PURPOSE       DMA mode: reclaims and decapsulates packets in the tx descriptor chain if:
 *                - A Tx packet has been copied from host-RAM into NIC-RAM by the DMA engine
 *                - The Hermes/DMAengine have been disabled
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS
 *   pointer to a reclaimed Tx packet.
 *
 *.DESCRIPTION
 * impact of the disable command:
 * When a non-empty pool of Tx descriptors exists (created by means of hcf_dma_put_tx), the MSF
 * is supposed to empty that pool by means of hcf_dma_tx_get calls after the disable in an
 * disable/enable sequence.
 *
 *.DIAGRAM
 *
 *.NOTICE
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
DESC_STRCT*
hcf_dma_tx_get( IFBP ifbp )
{
	DESC_STRCT *descp;  // pointer to start of FrameList

	descp = get_frame_lst( ifbp, DMA_TX );
	if ( descp && descp->buf_addr ) {
		                                //skip decapsulation at confined descriptor
#if (HCF_ENCAP) == HCF_ENC
		if ( ( descp->BUF_CNT == HFS_TYPE )) {
			// perform decapsulation if needed
			descp->next_desc_addr->buf_phys_addr -= HCF_DASA_SIZE;
			descp->next_desc_addr->BUF_CNT       += HCF_DASA_SIZE;
		}
#endif // HCF_ENC
	}
	if ( descp == NULL ) {  //;?could be integrated into get_frame_lst
		ifbp->IFB_DmaPackets &= (hcf_16)~HREG_EV_TDMAD;
	}
	HCFLOGEXIT( HCF_TRACE_DMA_TX_GET );
	return descp;
} // hcf_dma_tx_get


/************************************************************************************************************
 *
 *.MODULE        void hcf_dma_tx_put( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl )
 *.PURPOSE       puts a packet in the Tx DMA queue in host ram and kicks off the TxDma engine.
 *               supply the Tx-DELWA descriptor.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   descp       address of Tx Descriptor Chain (i.e. a single Tx frame)
 *   tx_cntl     indicates MAC-port and (Hermes) options
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * The HCF can be used in 2 fashions: with and without encapsulation for data transfer.
 * This is controlled at compile time by the HCF_ENC bit of the HCF_ENCAP system constant.
 *
 * Regardless of the HCF_ENCAP system constant, the descriptor list created to describe the frame to be
 * transmitted, must supply space to contain the 802.11 header, preceding the actual frame to be transmitted.
 * Basically, this only supplies working storage to the HCF which passes this on to the DMA engine.
 * As a consequence the contents of this space do not matter.
 * Nevertheless BUF_CNT must take in account this storage.
 * This working space to contain the 802.11 header may not be fragmented, the first buffer must be
 * sufficiently large to contain at least the 802.11 header, i.e. HFS_ADDR_DEST (29 words or 0x3A bytes).
 * This way, the HCF can simply, regardless whether or not the HCF encapsulates the frame, write the parameter
 * tx_cntl at offset 0x36 (HFS_TX_CNTL) in the first buffer.
 * Note that it is allowed to have part or all of the actual frame represented by the first descriptor as long
 * as the requirement for storage for the 802.11 header is met, i.e. the 802.3 frame starts at offset
 * HFS_ADDR_DEST.
 * Except for the Assert on the 1st buffer in case of Encapsualtion, the SIZE fields are ignored.
 *
 * In case the encapsulation feature is compiled in, there are the following additional requirements.
 * o The BUF_CNT of the first buffer changes from a minimum of 0x3A bytes to exactly 0x3A, i.e. the workspace
 *   to store the 802.11 header
 * o The BUF_SIZE of the first buffer is at least the space needed to store the
 *   - 802.11 header (29 words)
 *   - 802.3 header, i.e. 12 bytes addressing information and 2 bytes length field
 *   - 6 bytes SNAP-header
 *   This results in 39 words or 0x4E bytes or HFS_TYPE.
 *   Note that if the BUF_SIZE is larger than 0x4E, this surplus is not used.
 * o The actual frame begins in the 2nd descriptor (which is already implied by the BUF_CNT == 0x3A requirement) and the associated buffer contains at least the 802.3 header, i.e. the 14 bytes representing addressing information and length/type field
 *
 *   When the HCF does not encapsulates (i.e. length/type field <= 1500),  no changes are made to descriptors
 *   or buffers.
 *
 *   When the HCF actually encapsulates (i.e. length/type field > 1500), it successively writes, starting at
 *   offset HFS_ADDR_DEST (0x3A) in the first buffer:
 *     - the 802.3 addressing information, copied from the begin of the second buffer
 *     - the frame length, derived from the total length of the individual fragments, corrected for the SNAP
 *       header length and Type field and ignoring the Destination Address, Source Address and Length field
 *     - the appropriate snap header (Tunnel or 1042, depending on the value of the type field).
 *
 *    The information in the first two descriptors is adjusted accordingly:
 *     - the first descriptor count is changed from 0x3A to 0x4E (HFS_TYPE), which matches 0x3A + 12 + 2 + 6
 *     - the second descriptor count is decreased by 12, being the moved addressing information
 *     - the second descriptor (physical) buffer address is increased by 12.
 *
 * When the descriptors are returned by hcf_dma_tx_get, the transformation of the first two descriptors is
 * undone.
 *
 * Under any of the above scenarios, the assert BUF_CNT <= BUF_SIZE must be true for all descriptors
 * In case of encapsulation, BUF_SIZE of the 1st descriptor is asserted to be at least HFS_TYPE (0x4E), so it is NOT tested.
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value.
 * - tx_cntl has a recognizable out-of-range value.
 * - NIC interrupts are not disabled while required by parameter action.
 * - in case encapsulation by the HCF is selected:
 *     - The FrameList does not consists of at least 2 Descriptors.
 *     - The first databuffer does not contain exactly the (space for) the 802.11 header (== 28 words)
 *     - The first databuffer does not have a size to additionally accommodate the 802.3 header and the
 *       SNAP header of the frame after encapsulation (== 39 words).
 *     - The second databuffer does not contain at least DA, SA and 'type/length' (==14 bytes or 7 words)
 *!! The 2nd part of the list of asserts should be kept in sync with put_frame_lst, in order to get
 *!! them in the WCI-spec !!!!
 * - DMA is not enabled
 * - descriptor list is NULL
 * - a descriptor in the descriptor list is not double word aligned
 * - a count of size field of a descriptor contains control bits, i.e. bits in the high order nibble.
 * - the DELWA descriptor is not a "singleton" DescriptorList.
 * - the DELWA descriptor is not the first Descriptor supplied
 * - a non_DMA descriptor is supplied before the DELWA Descriptor is supplied
 *!! - Possibly more checks could be added !!!!!!!!!!!!!
 *.DIAGRAM
 *
 *.NOTICE
 *
 *.ENDDOC                END DOCUMENTATION
 *
 *
 *1: Write tx_cntl parameter to HFS_TX_CNTL field into the Hermes-specific header in buffer 1
 *4: determine whether encapsulation is needed and write the type (tunnel or 1042) already at the appropriate
 *   offset in the 1st buffer
 *6: Build the encapsualtion enveloppe in the free space at the end of the 1st buffer
 *   - Copy DA/SA fields from the 2nd buffer
 *   - Calculate total length of the message (snap-header + type-field + the length of all buffer fragments
 *     associated with the 802.3 frame (i.e all descriptors except the first), but not the DestinationAddress,
 *     SourceAddress and length-field)
 *     Assert the message length
 *     Write length. Note that the message is in BE format, hence on LE platforms the length must be converted
 *     ;? THIS IS NOT WHAT CURRENTLY IS IMPLEMENTED
 *   - Write snap header. Note that the last byte of the snap header is NOT copied, that byte is already in
 *     place as result of the call to hcf_encap.
 *   Note that there are many ways to skin a cat. To express the offsets in the 1st buffer while writing
 *   the snap header, HFS_TYPE is chosen as a reference point to make it easier to grasp that the snap header
 *   and encapsualtion type are at least relative in the right.
 *8: modify 1st descriptor to reflect moved part of the 802.3 header + Snap-header
 *   modify 2nd descriptor to skip the moved part of the 802.3 header (DA/SA
 *10: set each descriptor to 'DMA owned',  clear all other control bits.
 *   Set SOP bit on first descriptor. Set EOP bit on last descriptor.
 *12: Either append the current frame to an existing descriptor list or
 *14: create a list beginning with the current frame
 *16: remember the new end of the list
 *20: hand the frame over to the DMA engine
 ************************************************************************************************************/
void
hcf_dma_tx_put( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl )
{
	DESC_STRCT  *p = descp->next_desc_addr;
	int         i;

#if HCF_ASSERT
	int x = ifbp->IFB_FWIdentity.comp_id == COMP_ID_FW_AP ? tx_cntl & ~HFS_TX_CNTL_PORT : tx_cntl;
	HCFASSERT( (x & ~HCF_TX_CNTL_MASK ) == 0, tx_cntl );
#endif // HCF_ASSERT
	HCFLOGENTRY( HCF_TRACE_DMA_TX_PUT, 0xDA03 );
	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
	HCFASSERT_INT;
	HCFASSERT( ( ifbp->IFB_CntlOpt & (USE_DMA|DMA_ENABLED) ) == (USE_DMA|DMA_ENABLED), ifbp->IFB_CntlOpt);

	if ( descp->buf_addr ) {
		*(hcf_16*)(descp->buf_addr + HFS_TX_CNTL) = tx_cntl;                                            /*1*/
#if (HCF_ENCAP) == HCF_ENC
		HCFASSERT( descp->next_desc_addr, 0 );                                   //at least 2 descripors
		HCFASSERT( descp->BUF_CNT == HFS_ADDR_DEST, descp->BUF_CNT );    //exact length required for 1st buffer
		HCFASSERT( descp->BUF_SIZE >= HCF_DMA_TX_BUF1_SIZE, descp->BUF_SIZE );   //minimal storage for encapsulation
		HCFASSERT( p->BUF_CNT >= 14, p->BUF_CNT );                  //at least DA, SA and 'type' in 2nd buffer

		descp->buf_addr[HFS_TYPE-1] = hcf_encap(&descp->next_desc_addr->buf_addr[HCF_DASA_SIZE]);       /*4*/
		if ( descp->buf_addr[HFS_TYPE-1] != ENC_NONE ) {
			for ( i=0; i < HCF_DASA_SIZE; i++ ) {                                                       /*6*/
				descp->buf_addr[i + HFS_ADDR_DEST] = descp->next_desc_addr->buf_addr[i];
			}
			i = sizeof(snap_header) + 2 - ( 2*6 + 2 );
			do { i += p->BUF_CNT; } while ( ( p = p->next_desc_addr ) != NULL );
			*(hcf_16*)(&descp->buf_addr[HFS_LEN]) = CNV_END_SHORT(i);   //!! this converts on ALL platforms, how does that relate to the CCX code
			for ( i=0; i < sizeof(snap_header) - 1; i++) {
				descp->buf_addr[HFS_TYPE - sizeof(snap_header) + i] = snap_header[i];
			}
			descp->BUF_CNT = HFS_TYPE;                                                                  /*8*/
			descp->next_desc_addr->buf_phys_addr    += HCF_DASA_SIZE;
			descp->next_desc_addr->BUF_CNT          -= HCF_DASA_SIZE;
		}
#endif // HCF_ENC
	}
	put_frame_lst( ifbp, descp, DMA_TX );
	HCFLOGEXIT( HCF_TRACE_DMA_TX_PUT );
} // hcf_dma_tx_put

#endif // HCF_DMA

/************************************************************************************************************
 *
 *.MODULE        hcf_8 hcf_encap( wci_bufp type )
 *.PURPOSE       test whether RFC1042 or Bridge-Tunnel encapsulation is needed.
 *
 *.ARGUMENTS
 *   type        (Far) pointer to the (Big Endian) Type/Length field in the message
 *
 *.RETURNS
 *   ENC_NONE        len/type is "len" ( (BIG_ENDIAN)type <= 1500 )
 *   ENC_TUNNEL      len/type is "type" and 0x80F3 or 0x8137
 *   ENC_1042        len/type is "type" but not 0x80F3 or 0x8137
 *
 *.CONDITIONS
 *   NIC Interrupts  d.c
 *
 *.DESCRIPTION
 * Type must point to the Len/Type field of the message, this is the 2-byte field immediately after the 6 byte
 * Destination Address and 6 byte Source Address.  The 2 successive bytes addressed by type are interpreted as
 * a Big Endian value.  If that value is less than or equal to 1500, the message is assumed to be in 802.3
 * format.  Otherwise the message is assumed to be in Ethernet-II format.  Depending on the value of Len/Typ,
 * Bridge Tunnel or RFC1042 encapsulation is needed.
 *
 *.DIAGRAM
 *
 *  1:   presume 802.3, hence preset return value at ENC_NONE
 *  2:   convert type from "network" Endian format to native Endian
 *  4:   the litmus test to distinguish type and len.
 *   The hard code "magic" value of 1500 is intentional and should NOT be replaced by a mnemonic because it is
 *   not related at all to the maximum frame size supported  by the Hermes.
 *  6:   check type against:
 *       0x80F3  //AppleTalk Address Resolution Protocol (AARP)
 *       0x8137  //IPX
 *   to determine the type of encapsulation
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC hcf_8
hcf_encap( wci_bufp type )
{

	hcf_8   rc = ENC_NONE;                                                                                  /* 1 */
	hcf_16  t = (hcf_16)(*type<<8) + *(type+1);                                                             /* 2 */

	if ( t > 1500 ) {                                                                                   /* 4 */
		if ( t == 0x8137 || t == 0x80F3 ) {
			rc = ENC_TUNNEL;                                                                            /* 6 */
		} else {
			rc = ENC_1042;
		}
	}
	return rc;
} // hcf_encap


/************************************************************************************************************
 *
 *.MODULE        int hcf_get_info( IFBP ifbp, LTVP ltvp )
 *.PURPOSE       Obtains transient and persistent configuration information from the Card and from the HCF.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   ltvp        address of LengthTypeValue structure specifying the "what" and the "how much" of the
 *               information to be collected from the HCF or from the Hermes
 *
 *.RETURNS
 *   HCF_ERR_LEN         The provided buffer was too small
 *   HCF_SUCCESS         Success
 *!! via cmd_exe ( type >= CFG_RID_FW_MIN )
 *   HCF_ERR_NO_NIC      NIC removed during retrieval
 *   HCF_ERR_TIME_OUT    Expected Hermes event did not occur in expected time
 *!! via cmd_exe and setup_bap (type >= CFG_RID_FW_MIN )
 *   HCF_ERR_DEFUNCT_... HCF is in defunct mode (bits 0x7F reflect cause)
 *
 *.DESCRIPTION
 * The T-field of the LTV-record (provided by the MSF in parameter ltvp) specifies the RID wanted. The RID
 * information identified by the T-field is copied into the V-field.
 * On entry, the L-field specifies the size of the buffer, also called the "Initial DataLength". The L-value
 * includes the size of the T-field, but not the size of the L-field itself.
 * On return, the L-field indicates the number of words actually contained by the Type and Value fields.
 * As the size of the Type field in the LTV-record is included in the "Initial DataLength" of the record, the
 * V-field can contain at most "Initial DataLength" - 1 words of data.
 * Copying stops if either the complete Information is copied or if the number of words indicated by the
 * "Initial DataLength" were copied.  The "Initial DataLength" acts as a safe guard against Configuration
 * Information blocks that have different sizes for different F/W versions, e.g. when later versions support
 * more tallies than earlier versions.
 * If the size of Value field of the RID exceeds the size of the "Initial DataLength" -1, as much data
 * as fits is copied, and an error status of HCF_ERR_LEN is returned.
 *
 * It is the responsibility of the MSF to detect card removal and re-insertion and not call the HCF when the
 * NIC is absent. The MSF cannot, however, timely detect a Card removal if the Card is removed while
 * hcf_get_info is in progress.  Therefore, the HCF performs its own check on Card presence after the read
 * operation of the NIC data.  If the Card is not present or removed during the execution of hcf_get_info,
 * HCF_ERR_NO_NIC is returned and the content of the Data Buffer is unpredictable. This check is not performed
 * in case of the "HCF embedded" pseudo RIDs like CFG_TALLIES.
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value.
 * - reentrancy, may be  caused by calling hcf_functions without adequate protection
 *   against NIC interrupts or multi-threading.
 * - ltvp is a NULL pointer.
 * - length field of the LTV-record at entry is 0 or 1 or has an excessive value (i.e. exceeds HCF_MAX_LTV).
 * - type field of the LTV-record is invalid.
 *
 *.DIAGRAM
 *   Hcf_get_mb_info copies the contents of the oldest MailBox Info block in the MailBox to PC RAM. If len is
 *   less than the size of the MailBox Info block, only as much as fits in the PC RAM buffer is copied. After
 *   the copying the MailBox Read pointer is updated to point to the next MailBox Info block, hence the
 *   remainder of an "oversized" MailBox Info block is lost. The truncation of the MailBox Info block is NOT
 *   reflected in the return status. Note that hcf_get_info guarantees the length of the PC RAM buffer meets
 *   the minimum requirements of at least 2, so no PC RAM buffer overrun.
 *
 *   Calling hcf_get_mb_info when their is no MailBox Info block available or when there is no MailBox at all,
 *   results in a "NULL" MailBox Info block.
 *
 *12:    see NOTICE
 *17: The return status of cmd_wait and the first hcfio_in_string can be ignored, because when one fails, the
 *   other fails via the IFB_DefunctStat mechanism
 *20: "HCFASSERT( rc == HCF_SUCCESS, rc )" is not suitable because this will always trigger as side effect of
 *   the HCFASSERT in hcf_put_info which calls hcf_get_info to figure out whether the RID exists at all.

 *.NOTICE
 *
 *   "HCF embedded" pseudo RIDs:
 *   CFG_MB_INFO, CFG_TALLIES, CFG_DRV_IDENTITY, CFG_DRV_SUP_RANGE, CFG_DRV_ACT_RANGES_PRI,
 *   CFG_DRV_ACT_RANGES_STA, CFG_DRV_ACT_RANGES_HSI
 *   Note the HCF_ERR_LEN is NOT adequately set, when L >= 2 but less than needed
 *
 *   Remarks: Transfers operation information and transient and persistent configuration information from the
 *   Card and from the HCF to the MSF.
 *   The exact layout of the provided data structure depends on the action code. Copying stops if either the
 *   complete Configuration Information is copied or if the number of bytes indicated by len is copied.  Len
 *   acts as a safe guard against Configuration Information blocks which have different sizes for different
 *   Hermes versions, e.g. when later versions support more tallies than earlier versions. It is a conscious
 *   decision that unused parts of the PC RAM buffer are not cleared.
 *
 *   Remarks: The only error against which is protected is the "Read error" as result of Card removal. Only the
 *   last hcf_io_string need to be protected because if the first fails the second will fail as well. Checking
 *   for cmd_exe errors is supposed superfluous because problems in cmd_exe are already caught or will be
 *   caught by hcf_enable.
 *
 *   CFG_MB_INFO: copy the oldest MailBox Info Block or the "null" block if none available.
 *
 *   The mechanism to HCF_ASSERT on invalid typ-codes in the LTV record is based on the following strategy:
 *     - during the pseudo-asynchronous Hermes commands (diagnose, download) only CFG_MB_INFO is acceptable
 *     - some codes (e.g. CFG_TALLIES) are explicitly handled by the HCF which implies that these codes
 *       are valid
 *     - all other codes in the range 0xFC00 through 0xFFFF are passed to the Hermes.  The Hermes returns an
 *       LTV record with a zero value in the L-field for all Typ-codes it does not recognize. This is
 *       defined and intended behavior, so HCF_ASSERT does not catch on this phenomena.
 *     - all remaining codes are invalid and cause an ASSERT.
 *
 *.CONDITIONS
 * In case of USB, HCF_MAX_MSG ;?USED;? to limit the amount of data that can be retrieved via hcf_get_info.
 *
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
int
hcf_get_info( IFBP ifbp, LTVP ltvp )
{

	int         rc = HCF_SUCCESS;
	hcf_16      len = ltvp->len;
	hcf_16      type = ltvp->typ;
	wci_recordp p = &ltvp->len;     //destination word pointer (in LTV record)
	hcf_16      *q = NULL;              /* source word pointer  Note!! DOS COM can't cope with FAR
					     * as a consequence MailBox must be near which is usually true anyway
					     */
	int         i;

	HCFLOGENTRY( HCF_TRACE_GET_INFO, ltvp->typ );
	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
	HCFASSERT_INT;
	HCFASSERT( ltvp, 0 );
	HCFASSERT( 1 < ltvp->len && ltvp->len <= HCF_MAX_LTV + 1, MERGE_2( ltvp->typ, ltvp->len ) );

	ltvp->len = 0;                              //default to: No Info Available
	//filter out all specials
	for ( i = 0; ( q = xxxx[i] ) != NULL && q[1] != type; i++ ) /*NOP*/;

#if HCF_TALLIES
	if ( type == CFG_TALLIES ) {                                                    /*3*/
		(void)hcf_action( ifbp, HCF_ACT_TALLIES );
		q = (hcf_16*)&ifbp->IFB_TallyLen;
	}
#endif // HCF_TALLIES

	if ( type == CFG_MB_INFO ) {
		if ( ifbp->IFB_MBInfoLen ) {
			if ( ifbp->IFB_MBp[ifbp->IFB_MBRp] == 0xFFFF ) {
				ifbp->IFB_MBRp = 0; //;?Probably superfluous
			}
			q = &ifbp->IFB_MBp[ifbp->IFB_MBRp];
			ifbp->IFB_MBRp += *q + 1;   //update read pointer
			if ( ifbp->IFB_MBp[ifbp->IFB_MBRp] == 0xFFFF ) {
				ifbp->IFB_MBRp = 0;
			}
			ifbp->IFB_MBInfoLen = ifbp->IFB_MBp[ifbp->IFB_MBRp];
		}
	}

	if ( q != NULL ) {                      //a special or CFG_TALLIES or CFG_MB_INFO
		i = min( len, *q ) + 1;             //total size of destination (including T-field)
		while ( i-- ) {
			*p++ = *q;
#if (HCF_TALLIES) & HCF_TALLIES_RESET
			if ( q > &ifbp->IFB_TallyTyp && type == CFG_TALLIES ) {
				*q = 0;
			}
#endif // HCF_TALLIES_RESET
			q++;
		}
	} else {                                // not a special nor CFG_TALLIES nor CFG_MB_INFO
		if ( type == CFG_CNTL_OPT ) {                                       //read back effective options
			ltvp->len = 2;
			ltvp->val[0] = ifbp->IFB_CntlOpt;
#if (HCF_EXT) & HCF_EXT_NIC_ACCESS
		} else if ( type == CFG_PROD_DATA ) {  //only needed for some test tool on top of H-II NDIS driver
			hcf_io      io_port;
			wci_bufp    pt;                 //pointer with the "right" type, just to help ease writing macros with embedded assembly
			OPW( HREG_AUX_PAGE, (hcf_16)(PLUG_DATA_OFFSET >> 7) );
			OPW( HREG_AUX_OFFSET, (hcf_16)(PLUG_DATA_OFFSET & 0x7E) );
			io_port = ifbp->IFB_IOBase + HREG_AUX_DATA;     //to prevent side effects of the MSF-defined macro
			p = ltvp->val;                  //destination char pointer (in LTV record)
			i = len - 1;
			if (i > 0 ) {
				pt = (wci_bufp)p;   //just to help ease writing macros with embedded assembly
				IN_PORT_STRING_8_16( io_port, pt, i ); //space used by T: -1
			}
		} else if ( type == CFG_CMD_HCF ) {
#define P ((CFG_CMD_HCF_STRCT FAR *)ltvp)
			HCFASSERT( P->cmd == CFG_CMD_HCF_REG_ACCESS, P->cmd );       //only Hermes register access supported
			if ( P->cmd == CFG_CMD_HCF_REG_ACCESS ) {
				HCFASSERT( P->mode < ifbp->IFB_IOBase, P->mode );        //Check Register space
				ltvp->len = min( len, 4 );                              //RESTORE ltv length
				P->add_info = IPW( P->mode );
			}
#undef P
#endif // HCF_EXT_NIC_ACCESS
#if (HCF_ASSERT) & HCF_ASSERT_PRINTF
		} else if (type == CFG_FW_PRINTF) {
			rc = fw_printf(ifbp, (CFG_FW_PRINTF_STRCT*)ltvp);
#endif // HCF_ASSERT_PRINTF
		} else if ( type >= CFG_RID_FW_MIN ) {
//;? by using HCMD_BUSY option when calling cmd_exe, using a get_frag with length 0 just to set up the
//;? BAP and calling cmd_cmpl, you could merge the 2 Busy waits. Whether this really helps (and what
//;? would be the optimal sequence in cmd_exe and get_frag) would have to be MEASURED
		/*17*/  if ( ( rc = cmd_exe( ifbp, HCMD_ACCESS, type ) ) == HCF_SUCCESS &&
				 ( rc = setup_bap( ifbp, type, 0, IO_IN ) ) == HCF_SUCCESS ) {
				get_frag( ifbp, (wci_bufp)&ltvp->len, 2*len+2 BE_PAR(2) );
				if ( IPW( HREG_STAT ) == 0xFFFF ) {                 //NIC removal test
					ltvp->len = 0;
					HCFASSERT( DO_ASSERT, type );
				}
			}
	/*12*/  } else HCFASSERT( DO_ASSERT, type ) /*NOP*/; //NOP in case HCFASSERT is dummy
	}
	if ( len < ltvp->len ) {
		ltvp->len = len;
		if ( rc == HCF_SUCCESS ) {
			rc = HCF_ERR_LEN;
		}
	}
	HCFASSERT( rc == HCF_SUCCESS || ( rc == HCF_ERR_LEN && ifbp->IFB_AssertTrace & 1<<HCF_TRACE_PUT_INFO ),
		   MERGE_2( type, rc ) );                                                                /*20*/
	HCFLOGEXIT( HCF_TRACE_GET_INFO );
	return rc;
} // hcf_get_info


/************************************************************************************************************
 *
 *.MODULE        int hcf_put_info( IFBP ifbp, LTVP ltvp )
 *.PURPOSE       Transfers operation and configuration information to the Card and to the HCF.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   ltvp        specifies the RID (as defined by Hermes I/F) or pseudo-RID (as defined by WCI)
 *
 *.RETURNS
 *   HCF_SUCCESS
 *!! via cmd_exe
 *   HCF_ERR_NO_NIC      NIC removed during data retrieval
 *   HCF_ERR_TIME_OUT    Expected F/W event did not occur in time
 *   HCF_ERR_DEFUNCT_...
 *!! via download                CFG_DLNV_START <= type <= CFG_DL_STOP
 *!! via put_info                CFG_RID_CFG_MIN <= type <= CFG_RID_CFG_MAX
 *!! via put_frag
 *
 *.DESCRIPTION
 * The L-field of the LTV-record (provided by the MSF in parameter ltvp) specifies the size of the buffer.
 * The L-value includes the size of the T-field, but not the size of the L-field.
 * The T- field specifies the RID placed in the V-field by the MSF.
 *
 * Not all CFG-codes can be used for hcf_put_info.  The following CFG-codes are valid for hcf_put_info:
 * o One of the CFG-codes in the group "Network Parameters, Static Configuration Entities"
 * Changes made by hcf_put_info to CFG_codes in this group will not affect the F/W
 * and HCF behavior until hcf_cntl_port( HCF_PORT_ENABLE) is called.
 * o One of the CFG-codes in the group "Network Parameters, Dynamic Configuration Entities"
 * Changes made by hcf_put_info to CFG_codes will affect the F/W and HCF behavior immediately.
 * o CFG_PROG.
 * This code is used to initiate and terminate the process to download data either to
 * volatile or to non-volatile RAM on the NIC as well as for the actual download.
 * o CFG-codes related to the HCF behavior.
 * The related CFG-codes are:
 *  - CFG_REG_MB
 *  - CFG_REG_ASSERT_RTNP
 *  - CFG_REG_INFO_LOG
 *  - CFG_CMD_NIC
 *  - CFG_CMD_DONGLE
 *  - CFG_CMD_HCF
 *  - CFG_NOTIFY
 *
 * All LTV-records "unknown" to the HCF are forwarded to the F/W.
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value.
 * - ltvp is a NULL pointer.
 * - hcf_put_info was called without prior call to hcf_connect
 * - type field of the LTV-record is invalid, i.e. neither HCF nor F/W can handle the value.
 * - length field of the LTV-record at entry is less than 1 or exceeds MAX_LTV_SIZE.
 * - registering a MailBox with size less than 60 or a non-aligned buffer address is used.
 * - reentrancy, may be  caused by calling hcf_functions without adequate protection against
 *   NIC interrupts or multi-threading.
 *
 *.DIAGRAM
 *
 *.NOTICE
 *   Remarks:  In case of Hermes Configuration LTVs, the codes for the type are "cleverly" chosen to be
 *   identical to the RID. Hermes Configuration information is copied from the provided data structure into the
 *   Card.
 *   In case of HCF Configuration LTVs, the type values are chosen in a range which does not overlap the
 *   RID-range.
 *
 *20:
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/

int
hcf_put_info( IFBP ifbp, LTVP ltvp )
{
	int rc = HCF_SUCCESS;

	HCFLOGENTRY( HCF_TRACE_PUT_INFO, ltvp->typ );
	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
	HCFASSERT_INT;
	HCFASSERT( ltvp, 0 );
	HCFASSERT( 1 < ltvp->len && ltvp->len <= HCF_MAX_LTV + 1, ltvp->len );

	                                        //all codes between 0xFA00 and 0xFCFF are passed to Hermes
#if (HCF_TYPE) & HCF_TYPE_WPA
	{
		hcf_16 i;
		hcf_32 FAR * key_p;

		if ( ltvp->typ == CFG_ADD_TKIP_DEFAULT_KEY || ltvp->typ == CFG_ADD_TKIP_MAPPED_KEY ) {
			key_p = (hcf_32*)((CFG_ADD_TKIP_MAPPED_KEY_STRCT FAR *)ltvp)->tx_mic_key;
			i = TX_KEY;     //i.e. TxKeyIndicator == 1, KeyID == 0
			if ( ltvp->typ == CFG_ADD_TKIP_DEFAULT_KEY ) {
				key_p = (hcf_32*)((CFG_ADD_TKIP_DEFAULT_KEY_STRCT FAR *)ltvp)->tx_mic_key;
				i = CNV_LITTLE_TO_SHORT(((CFG_ADD_TKIP_DEFAULT_KEY_STRCT FAR *)ltvp)->tkip_key_id_info);
			}
			if ( i & TX_KEY ) { /* TxKeyIndicator == 1
					       (either really set by MSF in case of DEFAULT or faked by HCF in case of MAPPED ) */
				ifbp->IFB_MICTxCntl = (hcf_16)( HFS_TX_CNTL_MIC | (i & KEY_ID )<<8 );
				ifbp->IFB_MICTxKey[0] = CNV_LONGP_TO_LITTLE( key_p );
				ifbp->IFB_MICTxKey[1] = CNV_LONGP_TO_LITTLE( (key_p+1) );
			}
			i = ( i & KEY_ID ) * 2;
			ifbp->IFB_MICRxKey[i]   = CNV_LONGP_TO_LITTLE( (key_p+2) );
			ifbp->IFB_MICRxKey[i+1] = CNV_LONGP_TO_LITTLE( (key_p+3) );
		}
#define P ((CFG_REMOVE_TKIP_DEFAULT_KEY_STRCT FAR *)ltvp)
		if ( ( ltvp->typ == CFG_REMOVE_TKIP_MAPPED_KEY )    ||
		     ( ltvp->typ == CFG_REMOVE_TKIP_DEFAULT_KEY &&
		       ( (ifbp->IFB_MICTxCntl >> 8) & KEY_ID ) == CNV_SHORT_TO_LITTLE(P->tkip_key_id )
			     )
			) { ifbp->IFB_MICTxCntl = 0; }      //disable MIC-engine
#undef P
	}
#endif // HCF_TYPE_WPA

	if ( ltvp->typ == CFG_PROG ) {
		rc = download( ifbp, (CFG_PROG_STRCT FAR *)ltvp );
	} else switch (ltvp->typ) {
#if (HCF_ASSERT) & HCF_ASSERT_RT_MSF_RTN
		case CFG_REG_ASSERT_RTNP:                                         //Register MSF Routines
#define P ((CFG_REG_ASSERT_RTNP_STRCT FAR *)ltvp)
			ifbp->IFB_AssertRtn = P->rtnp;
//			ifbp->IFB_AssertLvl = P->lvl;       //TODO not yet supported so default is set in hcf_connect
			HCFASSERT( DO_ASSERT, MERGE_2( HCF_ASSERT, 0xCAF1 ) );   //just to proof that the complete assert machinery is working
#undef P
			break;
#endif // HCF_ASSERT_RT_MSF_RTN
#if (HCF_EXT) & HCF_EXT_INFO_LOG
		case CFG_REG_INFO_LOG:                                            //Register Log filter
			ifbp->IFB_RIDLogp = ((CFG_RID_LOG_STRCT FAR*)ltvp)->recordp;
			break;
#endif // HCF_EXT_INFO_LOG
		case CFG_CNTL_OPT:                                                //overrule option
			HCFASSERT( ( ltvp->val[0] & ~(USE_DMA | USE_16BIT) ) == 0, ltvp->val[0] );
			if ( ( ltvp->val[0] & USE_DMA ) == 0 ) ifbp->IFB_CntlOpt &= ~USE_DMA;
			ifbp->IFB_CntlOpt |=  ltvp->val[0] & USE_16BIT;
			break;

		case CFG_REG_MB:                                                  //Register MailBox
#define P ((CFG_REG_MB_STRCT FAR *)ltvp)
			HCFASSERT( ( (hcf_32)P->mb_addr & 0x0001 ) == 0, (hcf_32)P->mb_addr );
			HCFASSERT( (P)->mb_size >= 60, (P)->mb_size );
			ifbp->IFB_MBp = P->mb_addr;
			/* if no MB present, size must be 0 for ;?the old;? put_info_mb to work correctly */
			ifbp->IFB_MBSize = ifbp->IFB_MBp == NULL ? 0 : P->mb_size;
			ifbp->IFB_MBWp = ifbp->IFB_MBRp = 0;
			ifbp->IFB_MBp[0] = 0;                                           //flag the MailBox as empty
			ifbp->IFB_MBInfoLen = 0;
			HCFASSERT( ifbp->IFB_MBSize >= 60 || ifbp->IFB_MBp == NULL, ifbp->IFB_MBSize );
#undef P
			break;
		case CFG_MB_INFO:                                                 //store MailBoxInfoBlock
			rc = put_info_mb( ifbp, (CFG_MB_INFO_STRCT FAR *)ltvp );
			break;

#if (HCF_EXT) & HCF_EXT_NIC_ACCESS
		case CFG_CMD_NIC:
#define P ((CFG_CMD_NIC_STRCT FAR *)ltvp)
			OPW( HREG_PARAM_2, P->parm2 );
			OPW( HREG_PARAM_1, P->parm1 );
			rc = cmd_exe( ifbp, P->cmd, P->parm0 );
			P->hcf_stat = (hcf_16)rc;
			P->stat = IPW( HREG_STAT );
			P->resp0 = IPW( HREG_RESP_0 );
			P->resp1 = IPW( HREG_RESP_1 );
			P->resp2 = IPW( HREG_RESP_2 );
			P->ifb_err_cmd = ifbp->IFB_ErrCmd;
			P->ifb_err_qualifier = ifbp->IFB_ErrQualifier;
#undef P
			break;
		case CFG_CMD_HCF:
#define P ((CFG_CMD_HCF_STRCT FAR *)ltvp)
			HCFASSERT( P->cmd == CFG_CMD_HCF_REG_ACCESS, P->cmd );       //only Hermes register access supported
			if ( P->cmd == CFG_CMD_HCF_REG_ACCESS ) {
				HCFASSERT( P->mode < ifbp->IFB_IOBase, P->mode );        //Check Register space
				OPW( P->mode, P->add_info);
			}
#undef P
			break;
#endif // HCF_EXT_NIC_ACCESS

#if (HCF_ASSERT) & HCF_ASSERT_PRINTF
		case CFG_FW_PRINTF_BUFFER_LOCATION:
			ifbp->IFB_FwPfBuff = *(CFG_FW_PRINTF_BUFFER_LOCATION_STRCT*)ltvp;
			break;
#endif // HCF_ASSERT_PRINTF

		default:                      //pass everything unknown above the "FID" range to the Hermes or Dongle
			rc = put_info( ifbp, ltvp );
		}
	//DO NOT !!! HCFASSERT( rc == HCF_SUCCESS, rc )                                             /* 20 */
	HCFLOGEXIT( HCF_TRACE_PUT_INFO );
	return rc;
} // hcf_put_info


/************************************************************************************************************
 *
 *.MODULE        int hcf_rcv_msg( IFBP ifbp, DESC_STRCT *descp, unsigned int offset )
 *.PURPOSE       All: decapsulate a message.
 *               pre-HermesII.5: verify MIC.
 *               non-USB, non-DMA mode: Transfer a message from the NIC to the Host and acknowledge reception.
 *               USB: Transform a message from proprietary USB format to 802.3 format
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   descp       Pointer to the Descriptor List location.
 *   offset      USB: not used
 *               non-USB: specifies the beginning of the data to be obtained (0 corresponds with DestAddr field
 *               of frame).
 *
 *.RETURNS
 *   HCF_SUCCESS         No WPA error ( or HCF_ERR_MIC already reported by hcf_service_nic)
 *   HCF_ERR_MIC         message contains an erroneous MIC ( HCF_SUCCESS is reported if HCF_ERR_MIC is already
 *                       reported by hcf_service_nic)
 *   HCF_ERR_NO_NIC      NIC removed during data retrieval
 *   HCF_ERR_DEFUNCT...
 *
 *.DESCRIPTION
 * The Receive Message Function can be executed by the MSF to obtain the Data Info fields of the message that
 * is reported to be available by the Service NIC Function.
 *
 * The Receive Message Function copies the message data available in the Card memory into a buffer structure
 * provided by the MSF.
 * Only data of the message indicated by the Service NIC Function can be obtained.
 * Execution of the Service NIC function may result in the availability of a new message, but it definitely
 * makes the message reported by the preceding Service NIC function, unavailable.
 *
 * in non-USB/non-DMA mode, hcf_rcv_msg starts the copy process at the (non-negative) offset requested by the
 * parameter offset, relative to HFS_ADDR_DEST, e.g offset 0 starts copying from the Destination Address, the
 * very begin of the 802.3 frame message. Offset must either lay within the part of the 802.3 frame as stored
 * by hcf_service_nic in the lookahead buffer or be just behind it, i.e. the first byte not yet read.
 * When offset is within lookahead, data is copied from lookahead.
 * When offset is beyond lookahead, data is read directly from RxFS in NIC with disregard of the actual value
 * of offset
 *
 *.NOTICE:
 * o at entry: look ahead buffer as passed with hcf_service_nic is still accessible and unchanged
 * o at exit: Receive Frame in NIC memory is released
 *
 * Description:
 * Starting at the byte indicated by the Offset value, the bytes are copied from the Data Info
 * Part of the current Receive Frame Structure to the Host memory data buffer structure
 * identified by descp.
 * The maximum value for Offset is the number of characters of the 802.3 frame read into the
 * look ahead buffer by hcf_service_nic (i.e. the look ahead buffer size minus
 * Control and 802.11 fields)
 * If Offset is less than the maximum value, copying starts from the look ahead buffer till the
 * end of that buffer is reached
 * Then (or if the maximum value is specified for Offset), the
 * message is directly copied from NIC memory to Host memory.
 * If an invalid (i.e. too large) offset is specified, an assert catches but the buffer contents are
 * undefined.
 * Copying stops if either:
 * o the end of the 802.3 frame is reached
 * o the Descriptor with a NULL pointer in the next_desc_addr field is reached
 *
 * When the copying stops, the receiver is ack'ed, thus freeing the NIC memory where the frame is stored
 * As a consequence, hcf_rcv_msg can only be called once for any particular Rx frame.
 *
 * For the time being (PCI Bus mastering not yet supported), only the following fields of each
 * of the descriptors in the descriptor list must be set by the MSF:
 * o buf_cntl.buf_dim[1]
 * o *next_desc_addr
 * o *buf_addr
 * At return from hcf_rcv_msg, the field buf_cntl.buf_dim[0] of the used Descriptors reflects
 * the number of bytes in the buffer corresponding with the Descriptor.
 * On the last used Descriptor, buf_cntl.buf_dim[0] is less or equal to buf_cntl.buf_dim[1].
 * On all preceding Descriptors buf_cntl.buf_dim[0] is equal to buf_cntl.buf_dim[1].
 * On all succeeding (unused) Descriptors, buf_cntl.buf_dim[0] is zero.
 * Note: this I/F is based on the assumptions how the I/F needed for PCI Bus mastering will
 * be, so it may change.
 *
 * The most likely handling of HCF_ERR_NO_NIC by the MSF is to drop the already copied
 * data as elegantly as possible under the constraints and requirements posed by the (N)OS.
 * If no received Frame Structure is pending, "Success" rather than "Read error" is returned.
 * This error constitutes a logic flaw in the MSF
 * The HCF can only catch a minority of this
 * type of errors
 * Based on consistency ideas, the HCF catches none of these errors.
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value
 * - there is no unacknowledged Rx-message available
 * - offset is out of range (outside look ahead buffer)
 * - descp is a NULL pointer
 * - any of the descriptors is not double word aligned
 * - reentrancy, may be  caused by calling hcf_functions without adequate protection
 *   against NIC interrupts or multi-threading.
 * - Interrupts are enabled.
 *
 *.DIAGRAM
 *
 *.NOTICE
 * - by using unsigned int as type for offset, no need to worry about negative offsets
 * - Asserting on being enabled/present is superfluous, since a non-zero IFB_lal implies that hcf_service_nic
 *   was called and detected a Rx-message. A zero IFB_lal will set the BUF_CNT field of at least the first
 *   descriptor to zero.
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
int
hcf_rcv_msg( IFBP ifbp, DESC_STRCT *descp, unsigned int offset )
{
	int         rc = HCF_SUCCESS;
	wci_bufp    cp;                                     //char oriented working pointer
	hcf_16      i;
	int         tot_len = ifbp->IFB_RxLen - offset;     //total length
	wci_bufp    lap = ifbp->IFB_lap + offset;           //start address in LookAhead Buffer
	hcf_16      lal = ifbp->IFB_lal - offset;           //available data within LookAhead Buffer
	hcf_16      j;

	HCFLOGENTRY( HCF_TRACE_RCV_MSG, offset );
	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
	HCFASSERT_INT;
	HCFASSERT( descp, HCF_TRACE_RCV_MSG );
	HCFASSERT( ifbp->IFB_RxLen, HCF_TRACE_RCV_MSG );
	HCFASSERT( ifbp->IFB_RxLen >= offset, MERGE_2( offset, ifbp->IFB_RxLen ) );
	HCFASSERT( ifbp->IFB_lal >= offset, offset );
	HCFASSERT( (ifbp->IFB_CntlOpt & USE_DMA) == 0, 0xDADA );

	if ( tot_len < 0 ) {
		lal = 0; tot_len = 0;               //suppress all copying activity in the do--while loop
	}
	do {                                    //loop over all available fragments
		// obnoxious hcf.c(1480) : warning C4769: conversion of near pointer to long integer
		HCFASSERT( ((hcf_32)descp & 3 ) == 0, (hcf_32)descp );
		cp = descp->buf_addr;
		j = min( (hcf_16)tot_len, descp->BUF_SIZE );    //minimum of "what's` available" and fragment size
		descp->BUF_CNT = j;
		tot_len -= j;                       //adjust length still to go
		if ( lal ) {                        //if lookahead Buffer not yet completely copied
			i = min( lal, j );              //minimum of "what's available" in LookAhead and fragment size
			lal -= i;                       //adjust length still available in LookAhead
			j -= i;                         //adjust length still available in current fragment
			/*;? while loop could be improved by moving words but that is complicated on platforms with
			 * alignment requirements*/
			while ( i-- ) *cp++ = *lap++;
		}
		if ( j ) {  //if LookAhead Buffer exhausted but still space in fragment, copy directly from NIC RAM
			get_frag( ifbp, cp, j BE_PAR(0) );
			CALC_RX_MIC( cp, j );
		}
	} while ( ( descp = descp->next_desc_addr ) != NULL );
#if (HCF_TYPE) & HCF_TYPE_WPA
	if ( ifbp->IFB_RxFID ) {
		rc = check_mic( ifbp );             //prevents MIC error report if hcf_service_nic already consumed all
	}
#endif // HCF_TYPE_WPA
	(void)hcf_action( ifbp, HCF_ACT_RX_ACK );       //only 1 shot to get the data, so free the resources in the NIC
	HCFASSERT( rc == HCF_SUCCESS, rc );
	HCFLOGEXIT( HCF_TRACE_RCV_MSG );
	return rc;
} // hcf_rcv_msg


/************************************************************************************************************
 *
 *.MODULE        int hcf_send_msg( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl )
 *.PURPOSE       Encapsulate a message and append padding and MIC.
 *               non-USB: Transfers the resulting message from Host to NIC and initiates transmission.
 *               USB: Transfer resulting message into a flat buffer.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   descp       pointer to the DescriptorList or NULL
 *   tx_cntl     indicates MAC-port and (Hermes) options
 *                   HFS_TX_CNTL_SPECTRALINK
 *                   HFS_TX_CNTL_PRIO
 *                   HFS_TX_CNTL_TX_OK
 *                   HFS_TX_CNTL_TX_EX
 *                   HFS_TX_CNTL_TX_DELAY
 *                   HFS_TX_CNTL_TX_CONT
 *                   HCF_PORT_0               MAC Port 0 (default)
 *                   HCF_PORT_1 (AP only)     MAC Port 1
 *                   HCF_PORT_2 (AP only)     MAC Port 2
 *                   HCF_PORT_3 (AP only)     MAC Port 3
 *                   HCF_PORT_4 (AP only)     MAC Port 4
 *                   HCF_PORT_5 (AP only)     MAC Port 5
 *                   HCF_PORT_6 (AP only)     MAC Port 6
 *
 *.RETURNS
 *   HCF_SUCCESS
 *   HCF_ERR_DEFUNCT_..
 *   HCF_ERR_TIME_OUT
 *
 *.DESCRIPTION:
 * The Send Message Function embodies 2 functions:
 * o transfers a message (including MAC header) from the provided buffer structure in Host memory to the Transmit
 * Frame Structure (TxFS) in NIC memory.
 * o Issue a send command to the F/W to actually transmit the contents of the TxFS.
 *
 * Control is based on the Resource Indicator IFB_RscInd.
 * The Resource Indicator is maintained by the HCF and should only be interpreted but not changed by the MSF.
 * The MSF must check IFB_RscInd to be non-zero before executing the call to the Send Message Function.
 * When no resources are available, the MSF must handle the queuing of the Transmit frame and check the
 * Resource Indicator periodically after calling hcf_service_nic.
 *
 * The Send Message Functions transfers a message to NIC memory when it is called with a non-NULL descp.
 * Before the Send Message Function is invoked this way, the Resource Indicator (IFB_RscInd) must be checked.
 * If the Resource is not available, Send Message Function execution must be postponed until after processing of
 * a next hcf_service_nic it appears that the Resource has become available.
 * The message is copied from the buffer structure identified by descp to the NIC.
 * Copying stops if a NULL pointer in the next_desc_addr field is reached.
 * Hcf_send_msg does not check for transmit buffer overflow, because the F/W does this protection.
 * In case of a transmit buffer overflow, the surplus which does not fit in the buffer is simply dropped.
 *
 * The Send Message Function activates the F/W to actually send the message to the medium when the
 * HFS_TX_CNTL_TX_DELAY bit of the tx_cntl parameter is not set.
 * If the descp parameter of the current call is non-NULL, the message as represented by descp is send.
 * If the descp parameter of the current call is NULL, and if the preceding call of the Send Message Function had
 * a non-NULL descp and the preceding call had the HFS_TX_CNTL_TX_DELAY bit of tx_cntl set, then the message as
 * represented by the descp of the preceding call is send.
 *
 * Hcf_send_msg supports encapsulation (see HCF_ENCAP) of Ethernet-II frames.
 * An Ethernet-II frame is transferred to the Transmit Frame structure as an 802.3 frame.
 * Hcf_send_msg distinguishes between an 802.3 and an Ethernet-II frame by looking at the data length/type field
 * of the frame. If this field contains a value larger than 1514, the frame is considered to be an Ethernet-II
 * frame, otherwise it is treated as an 802.3 frame.
 * To ease implementation of the HCF, this type/type field must be located in the first descriptor structure,
 * i.e. the 1st fragment must have a size of at least 14 (to contain DestAddr, SrcAddr and Len/Type field).
 * An Ethernet-II frame is encapsulated by inserting a SNAP header between the addressing information and the
 * type field.  This insertion is transparent for the MSF.
 * The HCF contains a fixed table that stores a number of types. If the value specified by the type/type field
 * occurs in this table, Bridge Tunnel Encapsulation is used, otherwise RFC1042 encapsulation is used.
 * Bridge Tunnel uses    AA AA 03 00 00 F8 as SNAP header,
 * RFC1042 uses  AA AA 03 00 00 00 as SNAP header.
 * The table currently contains:
 * 0 0x80F3  AppleTalk Address Resolution Protocol (AARP)
 * 0 0x8137  IPX
 *
 * The algorithm to distinguish between 802.3 and Ethernet-II frames limits the maximum length for frames of
 * 802.3 frames to 1514 bytes.
 * Encapsulation can be suppressed by means of the system constant HCF_ENCAP, e.g. to support proprietary
 * protocols with 802.3 like frames with a size larger than 1514 bytes.
 *
 * In case the HCF encapsulates the frame, the number of bytes that is actually transmitted is determined by the
 * cumulative value of the buf_cntl.buf_dim[0] fields.
 * In case the HCF does not encapsulate the frame, the number of bytes that is actually transmitted is not
 * determined by the cumulative value of the buf_cntl.buf_dim[DESC_CNTL_CNT] fields of the desc_strct's but by
 * the Length field of the 802.3 frame.
 * If there is a conflict between the cumulative value of the buf_cntl.buf_dim[0] fields and the
 * 802.3 Length field the 802.3 Length field determines the number of bytes actually transmitted by the NIC while
 * the cumulative value of the buf_cntl.buf_dim[0] fields determines the position of the MIC, hence a mismatch
 * will result in MIC errors on the Receiving side.
 * Currently this problem is flagged on the Transmit side by an Assert.
 * The following fields of each of the descriptors in the descriptor list must be set by the MSF:
 * o buf_cntl.buf_dim[0]
 * o *next_desc_addr
 * o *buf_addr
 *
 * All bits of the tx_cntl parameter except HFS_TX_CNTL_TX_DELAY and the HCF_PORT# bits are passed to the F/W via
 * the HFS_TX_CNTL field of the TxFS.
 *
 * Note that hcf_send_msg does not detect NIC absence.  The MSF is supposed to have its own -platform dependent-
 * way to recognize card removal/insertion.
 * The total system must be robust against card removal and there is no principal difference between card removal
 * just after hcf_send_msg returns but before the actual transmission took place or sometime earlier.
 *
 * Assert fails if
 * - ifbp has a recognizable out-of-range value
 * - descp is a NULL pointer
 * - no resources for PIF available.
 * - Interrupts are enabled.
 * - reentrancy, may be  caused by calling hcf_functions without adequate protection
 *   against NIC interrupts or multi-threading.
 *
 *.DIAGRAM
 *4: for the normal case (i.e. no HFS_TX_CNTL_TX_DELAY option active), a fid is acquired via the
 *   routine get_fid.  If no FID is acquired, the remainder is skipped without an error notification.  After
 *   all, the MSF is not supposed to call hcf_send_msg when no Resource is available.
 *7: The ControlField of the TxFS is written.  Since put_frag can only return the fatal Defunct or "No NIC", the
 *   return status can be ignored because when it fails, cmd_wait will fail as well.  (see also the note on the
 *   need for a return code below).
 *   Note that HFS_TX_CNTL has different values for H-I, H-I/WPA and H-II and HFS_ADDR_DEST has different
 *   values for H-I (regardless of WPA) and H-II.
 *   By writing 17, 1 or 2 ( implying 16, 0 or 1 garbage word after HFS_TX_CNTL) the BAP just gets to
 *   HFS_ADDR_DEST for H-I, H-I/WPA and H-II respectively.
 *10: if neither encapsulation nor MIC calculation is needed, splitting the first fragment in two does not
 *   really help but it makes the flow easier to follow to do not optimize on this difference
 *
 *   hcf_send_msg checks whether the frame is an Ethernet-II rather than an "official" 802.3 frame.
 *   The E-II check is based on the length/type field in the MAC header. If this field has a value larger than
 *   1500, E-II is assumed. The implementation of this test fails if the length/type field is not in the first
 *   descriptor.  If E-II is recognized, a SNAP header is inserted. This SNAP header represents either RFC1042
 *   or Bridge-Tunnel encapsulation, depending on the return status of the support routine hcf_encap.
 *
 *.NOTICE
 *   hcf_send_msg leaves the responsibility to only send messages on enabled ports at the MSF level.
 *   This is considered the strategy which is sufficiently adequate for all "robust" MSFs, have the least
 *   processor utilization and being still acceptable robust at the WCI !!!!!
 *
 *   hcf_send_msg does not NEED a return value to report NIC absence or removal during the execution of
 *   hcf_send_msg(), because the MSF and higher layers must be able to cope anyway with the NIC being removed
 *   after a successful completion of hcf_send_msg() but before the actual transmission took place.
 *   To accommodate user expectations the current implementation does report NIC absence.
 *   Defunct blocks all NIC access and will (also) be reported on a number of other calls.
 *
 *   hcf_send_msg does not check for transmit buffer overflow because the Hermes does this protection.
 *   In case of a transmit buffer overflow, the surplus which does not fit in the buffer is simply dropped.
 *   Note that this possibly results in the transmission of incomplete frames.
 *
 *   After some deliberation with F/W team, it is decided that - being in the twilight zone of not knowing
 *   whether the problem at hand is an MSF bug, HCF buf, F/W bug, H/W malfunction or even something else - there
 *   is no "best thing to do" in case of a failing send, hence the HCF considers the TxFID ownership to be taken
 *   over by the F/W and hopes for an Allocate event in due time
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
int
hcf_send_msg( IFBP ifbp, DESC_STRCT *descp, hcf_16 tx_cntl )
{
	int         rc = HCF_SUCCESS;
	DESC_STRCT  *p /* = descp*/;        //working pointer
	hcf_16      len;                    // total byte count
	hcf_16      i;

	hcf_16      fid = 0;

	HCFASSERT( ifbp->IFB_RscInd || descp == NULL, ifbp->IFB_RscInd );
	HCFASSERT( (ifbp->IFB_CntlOpt & USE_DMA) == 0, 0xDADB );

	HCFLOGENTRY( HCF_TRACE_SEND_MSG, tx_cntl );
	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
	HCFASSERT_INT;
	/* obnoxious c:/hcf/hcf.c(1480) : warning C4769: conversion of near pointer to long integer,
	 * so skip */
	HCFASSERT( ((hcf_32)descp & 3 ) == 0, (hcf_32)descp );
#if HCF_ASSERT
	{   int x = ifbp->IFB_FWIdentity.comp_id == COMP_ID_FW_AP ? tx_cntl & ~HFS_TX_CNTL_PORT : tx_cntl;
		HCFASSERT( (x & ~HCF_TX_CNTL_MASK ) == 0, tx_cntl );
	}
#endif // HCF_ASSERT

	if ( descp ) ifbp->IFB_TxFID = 0;               //cancel a pre-put message

	/* the following initialization code is redundant for a pre-put message
	 * but moving it inside the "if fid" logic makes the merging with the
	 * USB flow awkward
	 */
#if (HCF_TYPE) & HCF_TYPE_WPA
	tx_cntl |= ifbp->IFB_MICTxCntl;
#endif // HCF_TYPE_WPA
	fid = ifbp->IFB_TxFID;
	if (fid == 0 && ( fid = get_fid( ifbp ) ) != 0 )        /* 4 */
		/* skip the next compound statement if:
		   - pre-put message or
		   - no fid available (which should never occur if the MSF adheres to the WCI)
		*/
	{       // to match the closing curly bracket of above "if" in case of HCF_TYPE_USB
		                                //calculate total length ;? superfluous unless CCX or Encapsulation
		len = 0;
		p = descp;
		do len += p->BUF_CNT; while ( ( p = p->next_desc_addr ) != NULL );
		p = descp;
//;?		HCFASSERT( len <= HCF_MAX_MSG, len );
	/*7*/   (void)setup_bap( ifbp, fid, HFS_TX_CNTL, IO_OUT );
#if (HCF_TYPE) & HCF_TYPE_TX_DELAY
		HCFASSERT( ( descp != NULL ) ^ ( tx_cntl & HFS_TX_CNTL_TX_DELAY ), tx_cntl );
		if ( tx_cntl & HFS_TX_CNTL_TX_DELAY ) {
			tx_cntl &= ~HFS_TX_CNTL_TX_DELAY;       //!!HFS_TX_CNTL_TX_DELAY no longer available
			ifbp->IFB_TxFID = fid;
			fid = 0;                                //!!fid no longer available, be careful when modifying code
		}
#endif // HCF_TYPE_TX_DELAY
		OPW( HREG_DATA_1, tx_cntl ) ;
		OPW( HREG_DATA_1, 0 );

		HCFASSERT( p->BUF_CNT >= 14, p->BUF_CNT );
		                                /* assume DestAddr/SrcAddr/Len/Type ALWAYS contained in 1st fragment
		                                 * otherwise life gets too cumbersome for MIC and Encapsulation !!!!!!!!
		 if ( p->BUF_CNT >= 14 ) {   alternatively: add a safety escape !!!!!!!!!!!! }   */

		CALC_TX_MIC( NULL, -1 );        //initialize MIC
	/*10*/  put_frag( ifbp, p->buf_addr, HCF_DASA_SIZE BE_PAR(0) ); //write DA, SA with MIC calculation
		CALC_TX_MIC( p->buf_addr, HCF_DASA_SIZE );      //MIC over DA, SA
		CALC_TX_MIC( null_addr, 4 );        //MIC over (virtual) priority field

			                        //if encapsulation needed
#if (HCF_ENCAP) == HCF_ENC
			                        //write length (with SNAP-header,Type, without //DA,SA,Length ) no MIC calc.
		if ( ( snap_header[sizeof(snap_header)-1] = hcf_encap( &p->buf_addr[HCF_DASA_SIZE] ) ) != ENC_NONE ) {
			OPW( HREG_DATA_1, CNV_END_SHORT( len + (sizeof(snap_header) + 2) - ( 2*6 + 2 ) ) );
				                //write splice with MIC calculation
			put_frag( ifbp, snap_header, sizeof(snap_header) BE_PAR(0) );
			CALC_TX_MIC( snap_header, sizeof(snap_header) );    //MIC over 6 byte SNAP
			i = HCF_DASA_SIZE;
		} else
#endif // HCF_ENC
		{
			OPW( HREG_DATA_1, *(wci_recordp)&p->buf_addr[HCF_DASA_SIZE] );
			i = 14;
		}
			                        //complete 1st fragment starting with Type with MIC calculation
		put_frag( ifbp, &p->buf_addr[i], p->BUF_CNT - i BE_PAR(0) );
		CALC_TX_MIC( &p->buf_addr[i], p->BUF_CNT - i );

		                                //do the remaining fragments with MIC calculation
		while ( ( p = p->next_desc_addr ) != NULL ) {
			/* obnoxious c:/hcf/hcf.c(1480) : warning C4769: conversion of near pointer to long integer,
			 * so skip */
			HCFASSERT( ((hcf_32)p & 3 ) == 0, (hcf_32)p );
			put_frag( ifbp, p->buf_addr, p->BUF_CNT BE_PAR(0) );
			CALC_TX_MIC( p->buf_addr, p->BUF_CNT );
		}
		                                //pad message, finalize MIC calculation and write MIC to NIC
		put_frag_finalize( ifbp );
	}
	if ( fid ) {
	/*16*/  rc = cmd_exe( ifbp, HCMD_BUSY | HCMD_TX | HCMD_RECL, fid );
		ifbp->IFB_TxFID = 0;
		/* probably this (i.e. no RscInd AND "HREG_EV_ALLOC") at this point in time occurs so infrequent,
		 * that it might just as well be acceptable to skip this
		 * "optimization" code and handle that additional interrupt once in a while
		 */
// 180 degree error in logic ;? #if ALLOC_15
	/*20*/  if ( ifbp->IFB_RscInd == 0 ) {
			ifbp->IFB_RscInd = get_fid( ifbp );
		}
// #endif // ALLOC_15
	}
//	HCFASSERT( level::ifbp->IFB_RscInd, ifbp->IFB_RscInd );
	HCFLOGEXIT( HCF_TRACE_SEND_MSG );
	return rc;
} // hcf_send_msg


/************************************************************************************************************
 *
 *.MODULE        int hcf_service_nic( IFBP ifbp, wci_bufp bufp, unsigned int len )
 *.PURPOSE       Services (most) NIC events.
 *               Provides received message
 *               Provides status information.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *  In non-DMA mode:
 *   bufp        address of char buffer, sufficiently large to hold the first part of the RxFS up through HFS_TYPE
 *   len         length in bytes of buffer specified by bufp
 *               value between HFS_TYPE + 2 and HFS_ADDR_DEST + HCF_MAX_MSG
 *
 *.RETURNS
 *   HCF_SUCCESS
 *   HCF_ERR_MIC message contains an erroneous MIC (only if frame fits completely in bufp)
 *
 *.DESCRIPTION
 *
 * MSF-accessible fields of Result Block
 * - IFB_RxLen           0 or Frame size.
 * - IFB_MBInfoLen       0 or the L-field of the oldest MBIB.
 * - IFB_RscInd
 * - IFB_HCF_Tallies     updated if a corresponding event occurred.
 * - IFB_NIC_Tallies     updated if a Tally Info frame received from the NIC.
 * - IFB_DmaPackets
 * - IFB_TxFsStat
 * - IFB_TxFsSwSup
 * - IFB_LinkStat        reflects new link status or 0x0000 if no change relative to previous hcf_service_nic call.
or
* - IFB_LinkStat        link status, 0x8000 reflects change relative to previous hcf_service_nic call.
*
* When IFB_MBInfoLen is non-zero, at least one MBIB is available.
*
* IFB_RxLen reflects the number of received bytes in 802.3 view (Including DestAddr, SrcAddr and Length,
* excluding MIC-padding, MIC and sum check) of active Rx Frame Structure. If no Rx Data s available, IFB_RxLen
* equals 0x0000.
* Repeated execution causes the Service NIC Function to provide information about subsequently received
* messages, irrespective whether a hcf_rcv_msg or hcf_action(HCF_ACT_RX) is performed in between.
*
* When IFB_RxLen is non-zero, a Received Frame Structure is available to be routed to the protocol stack.
* When Monitor Mode is not active, this is guaranteed to be an error-free non-WMP frame.
* In case of Monitor Mode, it may also be a frame with an error or a WMP frame.
* Erroneous frames have a non-zero error-sub field in the HFS_STAT field in the look ahead buffer.
*
* If a Receive message is available in NIC RAM, the Receive Frame Structure is (partly) copied from the NIC to
* the buffer identified by bufp.
* Copying stops either after len bytes or when the complete 802.3 frame is copied.
* During the copying the message is decapsulated (if appropriate).
* If the frame is read completely by hcf_service_nic (i.e. the frame fits completely in the lookahead buffer),
* the frame is automatically ACK'ed to the F/W and still available via the look ahead buffer and hcf_rcv_msg.
* Only if the frame is read completely by hcf_service_nic, hcf_service_nic checks the MIC and sets the return
* status accordingly.  In this case, hcf_rcv_msg does not check the MIC.
*
* The MIC calculation algorithm works more efficient if the length of the look ahead buffer is
* such that it fits exactly 4 n bytes of the 802.3 frame, i.e. len == HFS_ADDR_DEST + 4*n.
*
* The Service NIC Function supports the NIC event service handling process.
* It performs the appropriate actions to service the NIC, such that the event cause is eliminated and related
* information is saved.
* The Service NIC Function is executed by the MSF ISR or polling routine as first step to determine the event
* cause(s).  It is the responsibility of the MSF to perform all not directly NIC related interrupt service
* actions, e.g. in a PC environment this includes servicing the PIC, and managing the Processor Interrupt
* Enabling/Disabling.
* In case of a polled based system, the Service NIC Function must be executed "frequently".
* The Service NIC Function may have side effects related to the Mailbox and Resource Indicator (IFB_RscInd).
*
* hcf_service_nic returns:
* - The length of the data in the available MBIB (IFB_MBInfoLen)
* - Changes in the link status (IFB_LinkStat)
* - The length of the data in the available Receive Frame Structure (IFB_RxLen)
* - updated IFB_RscInd
* - Updated Tallies
*
* hcf_service_nic is presumed to neither interrupt other HCF-tasks nor to be interrupted by other HCF-tasks.
* A way to achieve this is to precede hcf_service_nic as well as all other HCF-tasks with a call to
* hcf_action to disable the card interrupts and, after all work is completed, with a call to hcf_action to
* restore (which is not necessarily the same as enabling) the card interrupts.
* In case of a polled environment, it is assumed that the MSF programmer is sufficiently familiar with the
* specific requirements of that environment to translate the interrupt strategy to a polled strategy.
*
* hcf_service_nic services the following Hermes events:
* - HREG_EV_INFO        Asynchronous Information Frame
* - HREG_EV_INFO_DROP   WMAC did not have sufficient RAM to build Unsolicited Information Frame
* - HREG_EV_TX_EXC      (if applicable, i.e. selected via HCF_EXT_INT_TX_EX bit of HCF_EXT)
* - HREG_EV_SLEEP_REQ   (if applicable, i.e. selected via HCF_DDS/HCF_CDS bit of HCF_SLEEP)
* ** in non_DMA mode
* - HREG_EV_ALLOC       Asynchronous part of Allocation/Reclaim completed while out of resources at
*                       completion of hcf_send_msg/notify
* - HREG_EV_RX          the detection of the availability of received messages
*                       including WaveLAN Management Protocol (WMP) message processing
* ** in DMA mode
* - HREG_EV_RDMAD
* - HREG_EV_TDMAD
*!! hcf_service_nic does not service the following Hermes events:
*!!     HREG_EV_TX          (the "OK" Tx Event) is no longer supported by the WCI, if it occurs it is unclear
*!!                         what the cause is, so no meaningful strategy is available. Not acking the bit is
*!!                         probably the best help that can be given to the debugger.
*!!     HREG_EV_CMD         handled in cmd_wait.
*!!     HREG_EV_FW_DMA      (i.e. HREG_EV_RXDMA, HREG_EV_TXDMA and_EV_LPESC) are either not used or used
*!!                         between the F/W and the DMA engine.
*!!     HREG_EV_ACK_REG_READY is only applicable for H-II (i.e. not HII.5 and up, see DAWA)
*
*   If, in non-DMA mode, a Rx message is available, its length is reflected by the IFB_RxLen field of the IFB.
*   This length reflects the data itself and the Destination Address, Source Address and DataLength/Type field
*   but not the SNAP-header in case of decapsulation by the HCF.  If no message is available, IFB_RxLen is
*   zero.  Former versions of the HCF handled WMP messages and supported a "monitor" mode in hcf_service_nic,
*   which deposited certain or all Rx messages in the MailBox. The responsibility to handle these frames is
*   moved to the MSF. The HCF offers as supports hcf_put_info with CFG_MB_INFO as parameter to emulate the old
*   implementation under control of the MSF.
*
* **Rx Buffer free strategy
*   When hcf_service_nic reports the availability of a non-DMA message, the MSF can access that message by
*   means of hcf_rcv_msg. It must be prevented that the LAN Controller writes new data in the NIC buffer
*   before the MSF is finished with the current message. The NIC buffer is returned to the LAN Controller
*   when:
*    - the complete frame fits in the lookahead buffer or
*    - hcf_rcv_msg is called or
*    - hcf_action with HCF_ACT_RX is called or
*    - hcf_service_nic is called again
*   It can be reasoned that hcf_action( INT_ON ) should not be given before the MSF has completely processed
*   a reported Rx-frame. The reason is that the INT_ON action is guaranteed to cause a (Rx-)interrupt (the
*   MSF is processing a Rx-frame, hence the Rx-event bit in the Hermes register must be active). This
*   interrupt will cause hcf_service_nic to be called, which will cause the ack-ing of the "last" Rx-event
*   to the Hermes, causing the Hermes to discard the associated NIC RAM buffer.
* Assert fails if
* - ifbp is zero or other recognizable out-of-range value.
* - hcf_service_nic is called without a prior call to hcf_connect.
* - interrupts are enabled.
* - reentrancy, may be  caused by calling hcf_functions without adequate protection
*   against NIC interrupts or multi-threading.
*
*
*.DIAGRAM
*1: IFB_LinkStat is cleared, if a LinkStatus frame is received, IFB_LinkStat will be updated accordingly
*   by isr_info.
or
*1: IFB_LinkStat change indication is cleared. If a LinkStatus frame is received, IFB_LinkStat will be updated
*   accordingly by isr_info.
*2: IFB_RxLen must be cleared before the NIC presence check otherwise:
*    -  this value may stay non-zero if the NIC is pulled out at an inconvenient moment.
*    -  the RxAck on a zero-FID needs a zero-value for IFB_RxLen to work
*    Note that as side-effect of the hcf_action call, the remainder of Rx related info is re-initialized as
*    well.
*4: In case of Defunct mode, the information supplied by Hermes is unreliable, so the body of
*   hcf_service_nic is skipped. Since hcf_cntl turns into a NOP if Primary or Station F/W is incompatible,
*   hcf_service_nic is also skipped in those cases.
*   To prevent that hcf_service_nic reports bogus information to the MSF with all - possibly difficult to
*   debug - undesirable side effects, it is paramount to check the NIC presence. In former days the presence
*   test was based on the Hermes register HREG_SW_0. Since in HCF_ACT_INT_OFF is chosen for strategy based on
*   HREG_EV_STAT, this is now also used in hcf_service_nic. The motivation to change strategy is partly
*   due to inconsistent F/W implementations with respect to HREG_SW_0 manipulation around reset and download.
*   Note that in polled environments Card Removal is not detected by INT_OFF which makes the check in
*   hcf_service_nic even more important.
*8: The event status register of the Hermes is sampled
*   The assert checks for unexpected events ;?????????????????????????????????????.
*    - HREG_EV_INFO_DROP is explicitly excluded from the acceptable HREG_EV_STAT bits because it indicates
*      a too heavily loaded system.
*    - HREG_EV_ACK_REG_READY is 0x0000 for H-I (and hopefully H-II.5)
*
*
*   HREG_EV_TX_EXC is accepted (via HREG_EV_TX_EXT) if and only if HCF_EXT_INT_TX_EX set in the HCF_EXT
*   definition at compile time.
*   The following activities are handled:
*    -  Alloc events are handled by hcf_send_msg (and notify). Only if there is no "spare" resource, the
*       alloc event is superficially serviced by hcf_service_nic to create a pseudo-resource with value
*       0x001. This value is recognized by get_fid (called by hcf_send_msg and notify) where the real
*       TxFid is retrieved and the Hermes is acked and - hopefully - the "normal" case with a spare TxFid
*       in IFB_RscInd is restored.
*    -  Info drop events are handled by incrementing a tally
*    -  LinkEvent (including solicited and unsolicited tallies) are handled by procedure isr_info.
*   -   TxEx (if selected at compile time) is handled by copying the significant part of the TxFS
*       into the IFB for further processing by the MSF.
*       Note the complication of the zero-FID protection sub-scheme in DAWA.
*   Note, the Ack of all of above events is handled at the end of hcf_service_nic
*16: In case of  non-DMA ( either not compiled in or due to a run-time choice):
*   If an Rx-frame is available, first the FID of that frame is read, including the complication of the
*   zero-FID protection sub-scheme in DAWA. Note that such a zero-FID is acknowledged at the end of
*   hcf_service_nic and that this depends on the IFB_RxLen initialization in the begin of hcf_service_nic.
*   The Assert validates the HCF assumption about Hermes implementation upon which the range of
*   Pseudo-RIDs is based.
*   Then the control fields up to the start of the 802.3 frame are read from the NIC into the lookahead buffer.
*   The status field is converted to native Endianness.
*   The length is, after implicit Endianness conversion if needed, and adjustment for the 14 bytes of the
*   802.3 MAC header, stored in IFB_RxLen.
*   In MAC Monitor mode, 802.11 control frames with a TOTAL length of 14 are received, so without this
*   length adjustment, IFB_RxLen could not be used to distinguish these frames from "no frame".
*   No MIC calculation processes are associated with the reading of these Control fields.
*26: This length test feels like superfluous robustness against malformed frames, but it turned out to be
*   needed in the real (hostile) world.
*   The decapsulation check needs sufficient data to represent DA, SA, L, SNAP and Type which amounts to
*   22 bytes. In MAC Monitor mode, 802.11 control frames with a smaller length are received. To prevent
*   that the implementation goes haywire, a check on the length is needed.
*   The actual decapsulation takes place on the fly in the copying process by overwriting the SNAP header.
*   Note that in case of decapsulation the SNAP header is not passed to the MSF, hence IFB_RxLen must be
*   compensated for the SNAP header length.
*   The 22 bytes needed for decapsulation are (more than) sufficient for the exceptional handling of the
*   MIC algorithm of the L-field (replacing the 2 byte L-field with 4 0x00 bytes).
*30: The 12 in the no-WPA branch corresponds with the get_frag, the 2 with the IPW of the WPA branch
*32: If Hermes reported MIC-presence, than the MIC engine is initialized with the non-dummy MIC calculation
*   routine address and appropriate key.
*34: The 8 bytes after the DA, SA, L are read and it is checked whether decapsulation is needed i.e.:
*     - the Hermes reported Tunnel encapsulation or
*     - the Hermes reported 1042 Encapsulation and hcf_encap reports that the HCF would not have used
*       1042 as the encapsulation mechanism
*   Note that the first field of the RxFS in bufp has Native Endianness due to the conversion done by the
*   BE_PAR in get_frag.
*36: The Type field is the only word kept (after moving) of the just read 8 bytes, it is moved to the
*   L-field.  The original L-field and 6 byte SNAP header are discarded, so IFB_RxLen and buf_addr must
*   be adjusted by 8.
*40: Determine how much of the frame (starting with DA) fits in the Lookahead buffer, then read the not-yet
*   read data into the lookahead buffer.
*   If the lookahead buffer contains the complete message, check the MIC. The majority considered this
*   I/F more appropriate then have the MSF call hcf_get_data only to check the MIC.
*44: Since the complete message is copied from NIC RAM to PC RAM, the Rx can be acknowledged to the Hermes
*   to optimize the flow ( a better chance to get new Rx data in the next pass through hcf_service_nic ).
*   This acknowledgement can not be done via hcf_action( HCF_ACT_RX_ACK ) because this also clears
*   IFB_RxLEN thus corrupting the I/F to the MSF.
*;?: In case of DMA (compiled in and activated):


*54: Limiting the number of places where the F/W is acked (e.g. the merging of the Rx-ACK with the other
*   ACKs), is supposed to diminish the potential of race conditions in the F/W.
*   Note 1: The CMD event is acknowledged in cmd_cmpl
*   Note 2: HREG_EV_ACK_REG_READY is 0x0000 for H-I (and hopefully H-II.5)
*   Note 3: The ALLOC event is acknowledged in get_fid (except for the initialization flow)
*
*.NOTICE
* The Non-DMA HREG_EV_RX is handled different compared with the other F/W events.
* The HREG_EV_RX event is acknowledged by the first hcf_service_nic call after the
* hcf_service_nic call that reported the occurrence of this event.
* This acknowledgment
* makes the next Receive Frame Structure (if any) available.
* An updated IFB_RxLen
* field reflects this availability.
*
*.NOTICE
* The minimum size for Len must supply space for:
* - an F/W dependent number of bytes of Control Info field including the 802.11 Header field
* - Destination Address
* - Source Address
* - Length field
* - [ SNAP Header]
* - [ Ethernet-II Type]
* This results in 68 for Hermes-I and 80 for Hermes-II
* This way the minimum amount of information is available needed by the HCF to determine whether the frame
* must be decapsulated.
*.ENDDOC                END DOCUMENTATION
*
************************************************************************************************************/
int
hcf_service_nic( IFBP ifbp, wci_bufp bufp, unsigned int len )
{

	int         rc = HCF_SUCCESS;
	hcf_16      stat;
	wci_bufp    buf_addr;
	hcf_16      i;

	HCFLOGENTRY( HCF_TRACE_SERVICE_NIC, ifbp->IFB_IntOffCnt );
	HCFASSERT( ifbp->IFB_Magic == HCF_MAGIC, ifbp->IFB_Magic );
	HCFASSERT_INT;

	ifbp->IFB_LinkStat = 0; // ;? to be obsoleted ASAP                                              /* 1*/
	ifbp->IFB_DSLinkStat &= ~CFG_LINK_STAT_CHANGE;                                                  /* 1*/
	(void)hcf_action( ifbp, HCF_ACT_RX_ACK );                                                       /* 2*/
	if ( ifbp->IFB_CardStat == 0 && ( stat = IPW( HREG_EV_STAT ) ) != 0xFFFF ) {                    /* 4*/
/*		IF_NOT_DMA( HCFASSERT( !( stat & ~HREG_EV_BASIC_MASK, stat ) )
 *		IF_NOT_USE_DMA( HCFASSERT( !( stat & ~HREG_EV_BASIC_MASK, stat ) )
 *		IF_USE_DMA( HCFASSERT( !( stat & ~( HREG_EV_BASIC_MASK ^ ( HREG_EV_...DMA.... ), stat ) )
 */
		                                                                                        /* 8*/
		if ( ifbp->IFB_RscInd == 0 && stat & HREG_EV_ALLOC ) { //Note: IFB_RscInd is ALWAYS 1 for DMA
			ifbp->IFB_RscInd = 1;
		}
		IF_TALLY( if ( stat & HREG_EV_INFO_DROP ) { ifbp->IFB_HCF_Tallies.NoBufInfo++; } );
#if (HCF_EXT) & HCF_EXT_INT_TICK
		if ( stat & HREG_EV_TICK ) {
			ifbp->IFB_TickCnt++;
		}
#if 0 // (HCF_SLEEP) & HCF_DDS
		if ( ifbp->IFB_TickCnt == 3 && ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_CONNECTED ) == 0 ) {
			CFG_DDS_TICK_TIME_STRCT ltv;
			// 2 second period (with 1 tick uncertanty) in not-connected mode -->go into DS_OOR
			hcf_action( ifbp, HCF_ACT_SLEEP );
			ifbp->IFB_DSLinkStat |= CFG_LINK_STAT_DS_OOR; //set OutOfRange
			ltv.len = 2;
			ltv.typ = CFG_DDS_TICK_TIME;
			ltv.tick_time = ( ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_TIMER ) + 0x10 ) *64; //78 is more right
			hcf_put_info( ifbp, (LTVP)&ltv );
			printk(KERN_NOTICE "Preparing for sleep, link_status: %04X, timer : %d\n",
				ifbp->IFB_DSLinkStat, ltv.tick_time );//;?remove me 1 day
			ifbp->IFB_TickCnt++; //;?just to make sure we do not keep on printing above message
			if ( ltv.tick_time < 300 * 125 ) ifbp->IFB_DSLinkStat += 0x0010;

		}
#endif // HCF_DDS
#endif // HCF_EXT_INT_TICK
		if ( stat & HREG_EV_INFO ) {
			isr_info( ifbp );
		}
#if (HCF_EXT) & HCF_EXT_INT_TX_EX
		if ( stat & HREG_EV_TX_EXT && ( i = IPW( HREG_TX_COMPL_FID ) ) != 0 /*DAWA*/ ) {
			DAWA_ZERO_FID( HREG_TX_COMPL_FID );
			(void)setup_bap( ifbp, i, 0, IO_IN );
			get_frag( ifbp, &ifbp->IFB_TxFsStat, HFS_SWSUP BE_PAR(1) );
		}
#endif // HCF_EXT_INT_TX_EX
//!rlav DMA engine will handle the rx event, not the driver
#if HCF_DMA
		if ( !( ifbp->IFB_CntlOpt & USE_DMA ) ) //!! be aware of the logical indentations
#endif // HCF_DMA
		/*16*/  if ( stat & HREG_EV_RX && ( ifbp->IFB_RxFID = IPW( HREG_RX_FID ) ) != 0 ) { //if 0 then DAWA_ACK
				HCFASSERT( bufp, len );
				HCFASSERT( len >= HFS_DAT + 2, len );
				DAWA_ZERO_FID( HREG_RX_FID );
				HCFASSERT( ifbp->IFB_RxFID < CFG_PROD_DATA, ifbp->IFB_RxFID);
				(void)setup_bap( ifbp, ifbp->IFB_RxFID, 0, IO_IN );
				get_frag( ifbp, bufp, HFS_ADDR_DEST BE_PAR(1) );
				ifbp->IFB_lap = buf_addr = bufp + HFS_ADDR_DEST;
				ifbp->IFB_RxLen = (hcf_16)(bufp[HFS_DAT_LEN] + (bufp[HFS_DAT_LEN+1]<<8) + 2*6 + 2);
			/*26*/  if ( ifbp->IFB_RxLen >= 22 ) {  // convenient for MIC calculation (5 DWs + 1 "skipped" W)
								//.  get DA,SA,Len/Type and (SNAP,Type or 8 data bytes)
				/*30*/  get_frag( ifbp, buf_addr, 22 BE_PAR(0) );
				/*32*/  CALC_RX_MIC( bufp, -1 );        //.  initialize MIC
					CALC_RX_MIC( buf_addr, HCF_DASA_SIZE ); //.  MIC over DA, SA
					CALC_RX_MIC( null_addr, 4 );    //.  MIC over (virtual) priority field
					CALC_RX_MIC( buf_addr+14, 8 );  //.  skip Len, MIC over SNAP,Type or 8 data bytes)
					buf_addr += 22;
#if (HCF_ENCAP) == HCF_ENC
					HCFASSERT( len >= HFS_DAT + 2 + sizeof(snap_header), len );
				/*34*/  i = *(wci_recordp)&bufp[HFS_STAT] & ( HFS_STAT_MSG_TYPE | HFS_STAT_ERR );
					if ( i == HFS_STAT_TUNNEL ||
					     ( i == HFS_STAT_1042 && hcf_encap( (wci_bufp)&bufp[HFS_TYPE] ) != ENC_TUNNEL ) ) {
							                //.  copy E-II Type to 802.3 LEN field
				/*36*/  bufp[HFS_LEN  ] = bufp[HFS_TYPE  ];
						bufp[HFS_LEN+1] = bufp[HFS_TYPE+1];
							                //.  discard Snap by overwriting with data
						ifbp->IFB_RxLen -= (HFS_TYPE - HFS_LEN);
						buf_addr -= ( HFS_TYPE - HFS_LEN ); // this happens to bring us at a DW boundary of 36
					}
#endif // HCF_ENC
				}
			/*40*/  ifbp->IFB_lal = min( (hcf_16)(len - HFS_ADDR_DEST), ifbp->IFB_RxLen );
				i = ifbp->IFB_lal - ( buf_addr - ( bufp + HFS_ADDR_DEST ) );
				get_frag( ifbp, buf_addr, i BE_PAR(0) );
				CALC_RX_MIC( buf_addr, i );
#if (HCF_TYPE) & HCF_TYPE_WPA
				if ( ifbp->IFB_lal == ifbp->IFB_RxLen ) {
					rc = check_mic( ifbp );
				}
#endif // HCF_TYPE_WPA
			/*44*/  if ( len - HFS_ADDR_DEST >= ifbp->IFB_RxLen ) {
					ifbp->IFB_RxFID = 0;
				} else { /* IFB_RxFID is cleared, so  you do not get another Rx_Ack at next entry of hcf_service_nic */
					stat &= (hcf_16)~HREG_EV_RX;    //don't ack Rx if processing not yet completed
				}
			}
		// in case of DMA: signal availability of rx and/or tx packets to MSF
		IF_USE_DMA( ifbp->IFB_DmaPackets |= stat & ( HREG_EV_RDMAD | HREG_EV_TDMAD ) );
		// rlav : pending HREG_EV_RDMAD or HREG_EV_TDMAD events get acknowledged here.
	/*54*/  stat &= (hcf_16)~( HREG_EV_SLEEP_REQ | HREG_EV_CMD | HREG_EV_ACK_REG_READY | HREG_EV_ALLOC | HREG_EV_FW_DMA );
//a positive mask would be easier to understand /*54*/  stat &= (hcf_16)~( HREG_EV_SLEEP_REQ | HREG_EV_CMD | HREG_EV_ACK_REG_READY | HREG_EV_ALLOC | HREG_EV_FW_DMA );
		IF_USE_DMA( stat &= (hcf_16)~HREG_EV_RX );
		if ( stat ) {
			DAWA_ACK( stat );   /*DAWA*/
		}
	}
	HCFLOGEXIT( HCF_TRACE_SERVICE_NIC );
	return rc;
} // hcf_service_nic


/************************************************************************************************************
 ************************** H C F   S U P P O R T   R O U T I N E S ******************************************
 ************************************************************************************************************/


/************************************************************************************************************
 *
 *.SUBMODULE     void calc_mic( hcf_32* p, hcf_32 m )
 *.PURPOSE       calculate MIC on a quad byte.
 *
 *.ARGUMENTS
 *   p           address of the MIC
 *   m           32 bit value to be processed by the MIC calculation engine
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * calc_mic is the implementation of the MIC algorithm. It is a monkey-see monkey-do copy of
 * Michael::appendByte()
 * of Appendix C of ..........
 *
 *
 *.DIAGRAM
 *
 *.NOTICE
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/

#if (HCF_TYPE) & HCF_TYPE_WPA

#define ROL32( A, n ) ( ((A) << (n)) | ( ((A)>>(32-(n)))  & ( (1UL << (n)) - 1 ) ) )
#define ROR32( A, n ) ROL32( (A), 32-(n) )

#define L   *p
#define R   *(p+1)

void
calc_mic( hcf_32* p, hcf_32 m )
{
#if HCF_BIG_ENDIAN
	m = (m >> 16) | (m << 16);
#endif // HCF_BIG_ENDIAN
	L ^= m;
	R ^= ROL32( L, 17 );
	L += R;
	R ^= ((L & 0xff00ff00) >> 8) | ((L & 0x00ff00ff) << 8);
	L += R;
	R ^= ROL32( L, 3 );
	L += R;
	R ^= ROR32( L, 2 );
	L += R;
} // calc_mic
#undef R
#undef L
#endif // HCF_TYPE_WPA



#if (HCF_TYPE) & HCF_TYPE_WPA
/************************************************************************************************************
 *
 *.SUBMODULE     void calc_mic_rx_frag( IFBP ifbp, wci_bufp p, int len )
 *.PURPOSE       calculate MIC on a single fragment.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   bufp        (byte) address of buffer
 *   len         length in bytes of buffer specified by bufp
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * calc_mic_rx_frag ........
 *
 * The MIC is located in the IFB.
 * The MIC is separate for Tx and Rx, thus allowing hcf_send_msg to occur between hcf_service_nic and
 * hcf_rcv_msg.
 *
 *
 *.DIAGRAM
 *
 *.NOTICE
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
void
calc_mic_rx_frag( IFBP ifbp, wci_bufp p, int len )
{
	static union { hcf_32 x32; hcf_16 x16[2]; hcf_8 x8[4]; } x; //* area to accumulate 4 bytes input for MIC engine
	int i;

	if ( len == -1 ) {                              //initialize MIC housekeeping
		i = *(wci_recordp)&p[HFS_STAT];
		/* i = CNV_SHORTP_TO_LITTLE(&p[HFS_STAT]); should not be neede to prevent alignment poroblems
		 * since len == -1 if and only if p is lookahaead buffer which MUST be word aligned
		 * to be re-investigated by NvR
		 */

		if ( ( i & HFS_STAT_MIC ) == 0 ) {
			ifbp->IFB_MICRxCarry = 0xFFFF;          //suppress MIC calculation
		} else {
			ifbp->IFB_MICRxCarry = 0;
//* Note that "coincidentally" the bit positions used in HFS_STAT
//* correspond with the offset of the key in IFB_MICKey
			i = ( i & HFS_STAT_MIC_KEY_ID ) >> 10;  /* coincidentally no shift needed for i itself */
			ifbp->IFB_MICRx[0] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICRxKey[i  ]);
			ifbp->IFB_MICRx[1] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICRxKey[i+1]);
		}
	} else {
		if ( ifbp->IFB_MICRxCarry == 0 ) {
			x.x32 = CNV_LONGP_TO_LITTLE(p);
			p += 4;
			if ( len < 4 ) {
				ifbp->IFB_MICRxCarry = (hcf_16)len;
			} else {
				ifbp->IFB_MICRxCarry = 4;
				len -= 4;
			}
		} else while ( ifbp->IFB_MICRxCarry < 4 && len ) {      //note for hcf_16 applies: 0xFFFF > 4
				x.x8[ifbp->IFB_MICRxCarry++] = *p++;
				len--;
			}
		while ( ifbp->IFB_MICRxCarry == 4 ) {   //contrived so we have only 1 call to calc_mic so we could bring it in-line
			calc_mic( ifbp->IFB_MICRx, x.x32 );
			x.x32 = CNV_LONGP_TO_LITTLE(p);
			p += 4;
			if ( len < 4 ) {
				ifbp->IFB_MICRxCarry = (hcf_16)len;
			}
			len -= 4;
		}
	}
} // calc_mic_rx_frag
#endif // HCF_TYPE_WPA


#if (HCF_TYPE) & HCF_TYPE_WPA
/************************************************************************************************************
 *
 *.SUBMODULE     void calc_mic_tx_frag( IFBP ifbp, wci_bufp p, int len )
 *.PURPOSE       calculate MIC on a single fragment.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   bufp        (byte) address of buffer
 *   len         length in bytes of buffer specified by bufp
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * calc_mic_tx_frag ........
 *
 * The MIC is located in the IFB.
 * The MIC is separate for Tx and Rx, thus allowing hcf_send_msg to occur between hcf_service_nic and
 * hcf_rcv_msg.
 *
 *
 *.DIAGRAM
 *
 *.NOTICE
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
void
calc_mic_tx_frag( IFBP ifbp, wci_bufp p, int len )
{
	static union { hcf_32 x32; hcf_16 x16[2]; hcf_8 x8[4]; } x; //* area to accumulate 4 bytes input for MIC engine

	                                        //if initialization request
	if ( len == -1 ) {
		                                //.  presume MIC calculation disabled
		ifbp->IFB_MICTxCarry = 0xFFFF;
		                                //.  if MIC calculation enabled
		if ( ifbp->IFB_MICTxCntl ) {
			                        //.  .  clear MIC carry
			ifbp->IFB_MICTxCarry = 0;
			                        //.  .  initialize MIC-engine
			ifbp->IFB_MICTx[0] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICTxKey[0]); /*Tx always uses Key 0 */
			ifbp->IFB_MICTx[1] = CNV_LONG_TO_LITTLE(ifbp->IFB_MICTxKey[1]);
		}
		                                //else
	} else {
		                                //.  if MIC enabled (Tx) / if MIC present (Rx)
		                                //.  and no carry from previous calc_mic_frag
		if ( ifbp->IFB_MICTxCarry == 0 ) {
			                        //.  .  preset accu with 4 bytes from buffer
			x.x32 = CNV_LONGP_TO_LITTLE(p);
			                        //.  .  adjust pointer accordingly
			p += 4;
			                        //.  .  if buffer contained less then 4 bytes
			if ( len < 4 ) {
				                //.  .  .  promote valid bytes in accu to carry
				                //.  .  .  flag accu to contain incomplete double word
				ifbp->IFB_MICTxCarry = (hcf_16)len;
				                //.  .  else
			} else {
				                //.  .  .  flag accu to contain complete double word
				ifbp->IFB_MICTxCarry = 4;
				                //.  .  adjust remaining buffer length
				len -= 4;
			}
			                        //.  else if MIC enabled
			                        //.  and if carry bytes from previous calc_mic_tx_frag
			                        //.  .  move (1-3) bytes from carry into accu
		} else while ( ifbp->IFB_MICTxCarry < 4 && len ) {      /* note for hcf_16 applies: 0xFFFF > 4 */
				x.x8[ifbp->IFB_MICTxCarry++] = *p++;
				len--;
			}
		                                //.  while accu contains complete double word
		                                //.  and MIC enabled
		while ( ifbp->IFB_MICTxCarry == 4 ) {
			                        //.  .  pass accu to MIC engine
			calc_mic( ifbp->IFB_MICTx, x.x32 );
			                        //.  .  copy next 4 bytes from buffer to accu
			x.x32 = CNV_LONGP_TO_LITTLE(p);
			                        //.  .  adjust buffer pointer
			p += 4;
			                        //.  .  if buffer contained less then 4 bytes
			                        //.  .  .  promote valid bytes in accu to carry
			                        //.  .  .  flag accu to contain incomplete double word
			if ( len < 4 ) {
				ifbp->IFB_MICTxCarry = (hcf_16)len;
			}
			                        //.  .  adjust remaining buffer length
			len -= 4;
		}
	}
} // calc_mic_tx_frag
#endif // HCF_TYPE_WPA


#if HCF_PROT_TIME
/************************************************************************************************************
 *
 *.SUBMODULE     void calibrate( IFBP ifbp )
 *.PURPOSE       calibrates the S/W protection counter against the Hermes Timer tick.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * calibrates the S/W protection counter against the Hermes Timer tick
 * IFB_TickIni is the value used to initialize the S/W protection counter such that the expiration period
 * more or less independent of the processor speed. If IFB_TickIni is not yet calibrated, it is done now.
 * This calibration is "reasonably" accurate because the Hermes is in a quiet state as a result of the
 * Initialize command.
 *
 *
 *.DIAGRAM
 *
 *1: IFB_TickIni is initialized at INI_TICK_INI by hcf_connect. If calibrate succeeds, IFB_TickIni is
 *   guaranteed to be changed. As a consequence there will be only 1 shot at calibration (regardless of the
 *   number of init calls) under normal circumstances.
 *2: Calibration is done HCF_PROT_TIME_CNT times. This diminish the effects of jitter and interference,
 *   especially in a pre-emptive environment. HCF_PROT_TIME_CNT is in the range of 16 through 32 and derived
 *   from the HCF_PROT_TIME specified by the MSF programmer. The divisor needed to scale HCF_PROT_TIME into the
 *   16-32 range, is used as a multiplicator after the calibration, to scale the found value back to the
 *   requested range. This way a compromise is achieved between accuracy and duration of the calibration
 *   process.
 *3: Acknowledge the Timer Tick Event.
 *   Each cycle is limited to at most INI_TICK_INI samples of the TimerTick status of the Hermes.
 *   Since the start of calibrate is unrelated to the Hermes Internal Timer, the first interval may last from 0
 *   to the normal interval, all subsequent intervals should be the full length of the Hermes Tick interval.
 *   The Hermes Timer Tick is not reprogrammed by the HCF, hence it is running at the default of 10 k
 *   microseconds.
 *4: If the Timer Tick Event is continuously up (prot_cnt still has the value INI_TICK_INI) or no Timer Tick
 *   Event occurred before the protection counter expired, reset IFB_TickIni to INI_TICK_INI,
 *   set the defunct bit of IFB_CardStat (thus rendering the Hermes inoperable) and exit the calibrate routine.
 *8: ifbp->IFB_TickIni is multiplied to scale the found value back to the requested range as explained under 2.
 *
 *.NOTICE
 * o Although there are a number of viewpoints possible, calibrate() uses as error strategy that a single
 *   failure of the Hermes TimerTick is considered fatal.
 * o There is no hard and concrete time-out value defined for Hermes activities. The default 1 seconds is
 *   believed to be sufficiently "relaxed" for real life and to be sufficiently short to be still useful in an
 *   environment with humans.
 * o Note that via IFB_DefunctStat time outs in cmd_wait and in hcfio_string block all Hermes access till the
 *   next init so functions which call a mix of cmd_wait and hcfio_string only need to check the return status
 *   of the last call
 * o The return code is preset at Time out.
 *   The additional complication that no calibrated value for the protection count can be assumed since
 *   calibrate() does not yet have determined a calibrated value (a catch 22), is handled by setting the
 *   initial value at INI_TICK_INI (by hcf_connect). This approach is considered safe, because:
 *     - the HCF does not use the pipeline mechanism of Hermes commands.
 *     - the likelihood of failure (the only time when protection count is relevant) is small.
 *     - the time will be sufficiently large on a fast machine (busy bit drops on good NIC before counter
 *       expires)
 *     - the time will be sufficiently small on a slow machine (counter expires on bad NIC before the end user
 *       switches the power off in despair
 *   The time needed to wrap a 32 bit counter around is longer than many humans want to wait, hence the more or
 *   less arbitrary value of 0x40000L is chosen, assuming it does not take too long on an XT and is not too
 *   short on a scream-machine.
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC void
calibrate( IFBP ifbp )
{
	int     cnt = HCF_PROT_TIME_CNT;
	hcf_32  prot_cnt;

	HCFTRACE( ifbp, HCF_TRACE_CALIBRATE );
	if ( ifbp->IFB_TickIni == INI_TICK_INI ) {                                                  /*1*/
		ifbp->IFB_TickIni = 0;                                                                  /*2*/
		while ( cnt-- ) {
			prot_cnt = INI_TICK_INI;
			OPW( HREG_EV_ACK, HREG_EV_TICK );                                               /*3*/
			while ( (IPW( HREG_EV_STAT ) & HREG_EV_TICK) == 0 && --prot_cnt ) {
				ifbp->IFB_TickIni++;
			}
			if ( prot_cnt == 0 || prot_cnt == INI_TICK_INI ) {                              /*4*/
				ifbp->IFB_TickIni = INI_TICK_INI;
				ifbp->IFB_DefunctStat = HCF_ERR_DEFUNCT_TIMER;
				ifbp->IFB_CardStat |= CARD_STAT_DEFUNCT;
				HCFASSERT( DO_ASSERT, prot_cnt );
			}
		}
		ifbp->IFB_TickIni <<= HCF_PROT_TIME_SHFT;                                               /*8*/
	}
	HCFTRACE( ifbp, HCF_TRACE_CALIBRATE | HCF_TRACE_EXIT );
} // calibrate
#endif // HCF_PROT_TIME


#if (HCF_TYPE) & HCF_TYPE_WPA
/************************************************************************************************************
 *
 *.SUBMODULE     int check_mic( IFBP ifbp )
 *.PURPOSE       verifies the MIC of a received non-USB frame.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS
 *   HCF_SUCCESS
 *   HCF_ERR_MIC
 *
 *.DESCRIPTION
 *
 *
 *.DIAGRAM
 *
 *4: test whether or not a MIC is reported by the Hermes
 *14: the calculated MIC and the received MIC are compared, the return status is set when there is a mismatch
 *
 *.NOTICE
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
int
check_mic( IFBP ifbp )
{
	int     rc = HCF_SUCCESS;
	hcf_32 x32[2];              //* area to save rcvd 8 bytes MIC

	                                                    //if MIC present in RxFS
	if ( *(wci_recordp)&ifbp->IFB_lap[-HFS_ADDR_DEST] & HFS_STAT_MIC ) {
		//or if ( ifbp->IFB_MICRxCarry != 0xFFFF )
		CALC_RX_MIC( mic_pad, 8 );                  //.  process up to 3 remaining bytes of data and append 5 to 8 bytes of padding to MIC calculation
		get_frag( ifbp, (wci_bufp)x32, 8 BE_PAR(0));//.  get 8 byte MIC from NIC
		                                            //.  if calculated and received MIC do not match
		                                            //.  .  set status at HCF_ERR_MIC
	/*14*/  if ( x32[0] != CNV_LITTLE_TO_LONG(ifbp->IFB_MICRx[0]) ||
		     x32[1] != CNV_LITTLE_TO_LONG(ifbp->IFB_MICRx[1])     ) {
			rc = HCF_ERR_MIC;
		}
	}
	                                                    //return status
	return rc;
} // check_mic
#endif // HCF_TYPE_WPA


/************************************************************************************************************
 *
 *.SUBMODULE     int cmd_cmpl( IFBP ifbp )
 *.PURPOSE       waits for Hermes Command Completion.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS
 *   IFB_DefunctStat
 *   HCF_ERR_TIME_OUT
 *   HCF_ERR_DEFUNCT_CMD_SEQ
 *   HCF_SUCCESS
 *
 *.DESCRIPTION
 *
 *
 *.DIAGRAM
 *
 *2: Once cmd_cmpl is called, the Busy option bit in IFB_Cmd must be cleared
 *4: If Status register and command code don't match either:
 *    - the Hermes and Host are out of sync ( a fatal error)
 *    - error bits are reported via the Status Register.
 *   Out of sync is considered fatal and brings the HCF in Defunct mode
 *   Errors reported via the Status Register should be caused by sequence violations in Hermes command
 *   sequences and hence these bugs should have been found during engineering testing. Since there is no
 *   strategy to cope with this problem, it might as well be ignored at run time. Note that for any particular
 *   situation where a strategy is formulated to handle the consequences of a particular bug causing a
 *   particular Error situation reported via the Status Register, the bug should be removed rather than adding
 *   logic to cope with the consequences of the bug.
 *   There have been HCF versions where an error report via the Status Register even brought the HCF in defunct
 *   mode (although it was not yet named like that at that time). This is particular undesirable behavior for a
 *   general library.
 *   Simply reporting the error (as "interesting") is debatable. There also have been HCF versions with this
 *   strategy using the "vague" HCF_FAILURE code.
 *   The error is reported via:
 *    - MiscErr tally of the HCF Tally set
 *    - the (informative) fields IFB_ErrCmd and IFB_ErrQualifier
 *    - the assert mechanism
 *8: Here the Defunct case and the Status error are separately treated
 *
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC int
cmd_cmpl( IFBP ifbp )
{

	PROT_CNT_INI;
	int     rc = HCF_SUCCESS;
	hcf_16  stat;

	HCFLOGENTRY( HCF_TRACE_CMD_CPL, ifbp->IFB_Cmd );
	ifbp->IFB_Cmd &= ~HCMD_BUSY;                                                /* 2 */
	HCF_WAIT_WHILE( (IPW( HREG_EV_STAT) & HREG_EV_CMD) == 0 );                  /* 4 */
	stat = IPW( HREG_STAT );
#if HCF_PROT_TIME
	if ( prot_cnt == 0 ) {
		IF_TALLY( ifbp->IFB_HCF_Tallies.MiscErr++ );
		rc = HCF_ERR_TIME_OUT;
		HCFASSERT( DO_ASSERT, ifbp->IFB_Cmd );
	} else
#endif // HCF_PROT_TIME
	{
		DAWA_ACK( HREG_EV_CMD );
	/*4*/   if ( stat != (ifbp->IFB_Cmd & HCMD_CMD_CODE) ) {
		/*8*/   if ( ( (stat ^ ifbp->IFB_Cmd ) & HCMD_CMD_CODE) != 0 ) {
				rc = ifbp->IFB_DefunctStat = HCF_ERR_DEFUNCT_CMD_SEQ;
				ifbp->IFB_CardStat |= CARD_STAT_DEFUNCT;
			}
			IF_TALLY( ifbp->IFB_HCF_Tallies.MiscErr++ );
			ifbp->IFB_ErrCmd = stat;
			ifbp->IFB_ErrQualifier = IPW( HREG_RESP_0 );
			HCFASSERT( DO_ASSERT, MERGE_2( IPW( HREG_PARAM_0 ), ifbp->IFB_Cmd ) );
			HCFASSERT( DO_ASSERT, MERGE_2( ifbp->IFB_ErrQualifier, ifbp->IFB_ErrCmd ) );
		}
	}
	HCFASSERT( rc == HCF_SUCCESS, rc);
	HCFLOGEXIT( HCF_TRACE_CMD_CPL );
	return rc;
} // cmd_cmpl


/************************************************************************************************************
 *
 *.SUBMODULE     int cmd_exe( IFBP ifbp, int cmd_code, int par_0 )
 *.PURPOSE       Executes synchronous part of Hermes Command and - optionally - waits for Command Completion.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   cmd_code
 *   par_0
 *
 *.RETURNS
 *   IFB_DefunctStat
 *   HCF_ERR_DEFUNCT_CMD_SEQ
 *   HCF_SUCCESS
 *   HCF_ERR_TO_BE_ADDED <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 *
 *.DESCRIPTION
 * Executes synchronous Hermes Command and waits for Command Completion
 *
 * The general HCF strategy is to wait for command completion. As a consequence:
 * - the read of the busy bit before writing the command register is superfluous
 * - the Hermes requirement that no Inquiry command may be executed if there is still an unacknowledged
 *   Inquiry command outstanding, is automatically met.
 * The Tx command uses the "Busy" bit in the cmd_code parameter to deviate from this general HCF strategy.
 * The idea is that by not busy-waiting on completion of this frequently used command the processor
 * utilization is diminished while using the busy-wait on all other seldom used commands the flow is kept
 * simple.
 *
 *
 *
 *.DIAGRAM
 *
 *1: skip the body of cmd_exe when in defunct mode or when - based on the S/W Support register write and
 *   read back test - there is apparently no NIC.
 *   Note: we gave up on the "old" strategy to write the S/W Support register at magic only when needed. Due to
 *   the intricateness of Hermes F/W varieties ( which behave differently as far as corruption of the S/W
 *   Support register is involved), the increasing number of Hermes commands which do an implicit initialize
 *   (thus modifying the S/W Support register) and the workarounds of some OS/Support S/W induced aspects (e.g.
 *   the System Soft library at WinNT which postpones the actual mapping of I/O space up to 30 seconds after
 *   giving the go-ahead), the "magic" strategy is now reduced to a simple write and read back. This means that
 *   problems like a bug tramping over the memory mapped Hermes registers will no longer be noticed as side
 *   effect of the S/W Support register check.
 *2: check whether the preceding command skipped the busy wait and if so, check for command completion
 *
 *.NOTICE
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/

HCF_STATIC int
cmd_exe( IFBP ifbp, hcf_16 cmd_code, hcf_16 par_0 ) //if HCMD_BUSY of cmd_code set, then do NOT wait for completion
{
	int rc;

	HCFLOGENTRY( HCF_TRACE_CMD_EXE, cmd_code );
	HCFASSERT( (cmd_code & HCMD_CMD_CODE) != HCMD_TX || cmd_code & HCMD_BUSY, cmd_code ); //Tx must have Busy bit set
	OPW( HREG_SW_0, HCF_MAGIC );
	if ( IPW( HREG_SW_0 ) == HCF_MAGIC ) {                                                      /* 1 */
		rc = ifbp->IFB_DefunctStat;
	}
	else rc = HCF_ERR_NO_NIC;
	if ( rc == HCF_SUCCESS ) {
		//;?is this a hot idea, better MEASURE performance impact
	/*2*/   if ( ifbp->IFB_Cmd & HCMD_BUSY ) {
			rc = cmd_cmpl( ifbp );
		}
		OPW( HREG_PARAM_0, par_0 );
		OPW( HREG_CMD, cmd_code &~HCMD_BUSY );
		ifbp->IFB_Cmd = cmd_code;
		if ( (cmd_code & HCMD_BUSY) == 0 ) {    //;?is this a hot idea, better MEASURE performance impact
			rc = cmd_cmpl( ifbp );
		}
	}
	HCFASSERT( rc == HCF_SUCCESS, MERGE_2( rc, cmd_code ) );
	HCFLOGEXIT( HCF_TRACE_CMD_EXE );
	return rc;
} // cmd_exe


/************************************************************************************************************
 *
 *.SUBMODULE     int download( IFBP ifbp, CFG_PROG_STRCT FAR *ltvp )
 *.PURPOSE       downloads F/W image into NIC and initiates execution of the downloaded F/W.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   ltvp        specifies the pseudo-RID (as defined by WCI)
 *
 *.RETURNS
 *
 *.DESCRIPTION
 *
 *
 *.DIAGRAM
 *1: First, Ack everything to unblock a (possibly) blocked cmd pipe line
 *   Note 1: it is very likely that an Alloc event is pending and very well possible that a (Send) Cmd event is
 *   pending
 *   Note 2: it is assumed that this strategy takes away the need to ack every conceivable event after an
 *   Hermes Initialize
 *
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC int
download( IFBP ifbp, CFG_PROG_STRCT FAR *ltvp )                     //Hermes-II download (volatile only)
{
	hcf_16              i;
	int                 rc = HCF_SUCCESS;
	wci_bufp            cp;
	hcf_io              io_port = ifbp->IFB_IOBase + HREG_AUX_DATA;

	HCFLOGENTRY( HCF_TRACE_DL, ltvp->typ );
#if (HCF_TYPE) & HCF_TYPE_PRELOADED
	HCFASSERT( DO_ASSERT, ltvp->mode );
#else
	                                        //if initial "program" LTV
	if ( ifbp->IFB_DLMode == CFG_PROG_STOP && ltvp->mode == CFG_PROG_VOLATILE) {
		                                //.  switch Hermes to initial mode
	/*1*/   OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ );
		rc = cmd_exe( ifbp, HCMD_INI, 0 );  /* HCMD_INI can not be part of init() because that is called on
						     * other occasions as well */
		rc = init( ifbp );
	}
	                                        //if final "program" LTV
	if ( ltvp->mode == CFG_PROG_STOP && ifbp->IFB_DLMode == CFG_PROG_VOLATILE) {
		                                //.  start tertiary (or secondary)
		OPW( HREG_PARAM_1, (hcf_16)(ltvp->nic_addr >> 16) );
		rc = cmd_exe( ifbp, HCMD_EXECUTE, (hcf_16) ltvp->nic_addr );
		if (rc == HCF_SUCCESS) {
			rc = init( ifbp );  /*;? do we really want to skip init if cmd_exe failed, i.e.
					     *   IFB_FW_Comp_Id is than possibly incorrect */
		}
		                                //else (non-final)
	} else {
		                                //.  if mode == Readback SEEPROM
#if 0   //;? as long as the next if contains a hard coded 0, might as well leave it out even more obvious
		if ( 0 /*len is definitely not want we want;?*/ && ltvp->mode == CFG_PROG_SEEPROM_READBACK ) {
			OPW( HREG_PARAM_1, (hcf_16)(ltvp->nic_addr >> 16) );
			OPW( HREG_PARAM_2, (hcf_16)((ltvp->len - 4) << 1) );
			                        //.  .  perform Hermes prog cmd with appropriate mode bits
			rc = cmd_exe( ifbp, HCMD_PROGRAM | ltvp->mode, (hcf_16)ltvp->nic_addr );
			                        //.  .  set up NIC RAM addressability according Resp0-1
			OPW( HREG_AUX_PAGE,   IPW( HREG_RESP_1) );
			OPW( HREG_AUX_OFFSET, IPW( HREG_RESP_0) );
			                        //.  .  set up L-field of LTV according Resp2
			i = ( IPW( HREG_RESP_2 ) + 1 ) / 2;  // i contains max buffer size in words, a probably not very useful piece of information ;?
/*Nico's code based on i is the "real amount of data available"
			if ( ltvp->len - 4 < i ) rc = HCF_ERR_LEN;
			else ltvp->len = i + 4;
*/
/* Rolands code based on the idea that a MSF should not ask for more than is available
			// check if number of bytes requested exceeds max buffer size
			if ( ltvp->len - 4 > i ) {
				rc = HCF_ERR_LEN;
				ltvp->len = i + 4;
			}
*/
			                        //.  .  copy data from NIC via AUX port to LTV
			cp = (wci_bufp)ltvp->host_addr;                     /*IN_PORT_STRING_8_16 macro may modify its parameters*/
			i = ltvp->len - 4;
			IN_PORT_STRING_8_16( io_port, cp, i );      //!!!WORD length, cp MUST be a char pointer // $$ char
			                        //.  else (non-final programming)
		} else
#endif //;? as long as the above if contains a hard coded 0, might as well leave it out even more obvious
		{                               //.  .  get number of words to program
			HCFASSERT( ltvp->segment_size, *ltvp->host_addr );
			i = ltvp->segment_size/2;
			                        //.  .  copy data (words) from LTV via AUX port to NIC
			cp = (wci_bufp)ltvp->host_addr;                     //OUT_PORT_STRING_8_16 macro may modify its parameters
			                        //.  .  if mode == volatile programming
			if ( ltvp->mode == CFG_PROG_VOLATILE ) {
				                //.  .  .  set up NIC RAM addressability via AUX port
				OPW( HREG_AUX_PAGE, (hcf_16)(ltvp->nic_addr >> 16 << 9 | (ltvp->nic_addr & 0xFFFF) >> 7 ) );
				OPW( HREG_AUX_OFFSET, (hcf_16)(ltvp->nic_addr & 0x007E) );
				OUT_PORT_STRING_8_16( io_port, cp, i );     //!!!WORD length, cp MUST be a char pointer
			}
		}
	}
	ifbp->IFB_DLMode = ltvp->mode;                  //save state in IFB_DLMode
#endif // HCF_TYPE_PRELOADED
	HCFASSERT( rc == HCF_SUCCESS, rc );
	HCFLOGEXIT( HCF_TRACE_DL );
	return rc;
} // download


#if (HCF_ASSERT) & HCF_ASSERT_PRINTF
/**************************************************
 * Certain Hermes-II firmware versions can generate
 * debug information. This debug information is
 * contained in a buffer in nic-RAM, and can be read
 * via the aux port.
 **************************************************/
HCF_STATIC int
fw_printf(IFBP ifbp, CFG_FW_PRINTF_STRCT FAR *ltvp)
{
	int rc = HCF_SUCCESS;
	hcf_16 fw_cnt;
//	hcf_32 DbMsgBuffer = 0x29D2, DbMsgCount= 0x000029D0;
//	hcf_16 DbMsgSize=0x00000080;
	hcf_32 DbMsgBuffer;
	CFG_FW_PRINTF_BUFFER_LOCATION_STRCT *p = &ifbp->IFB_FwPfBuff;
	ltvp->len = 1;
	if ( p->DbMsgSize != 0 ) {
		// first, check the counter in nic-RAM and compare it to the latest counter value of the HCF
		OPW( HREG_AUX_PAGE, (hcf_16)(p->DbMsgCount >> 7) );
		OPW( HREG_AUX_OFFSET, (hcf_16)(p->DbMsgCount & 0x7E) );
		fw_cnt = ((IPW( HREG_AUX_DATA) >>1 ) & ((hcf_16)p->DbMsgSize - 1));
		if ( fw_cnt != ifbp->IFB_DbgPrintF_Cnt ) {
//			DbgPrint("fw_cnt=%d IFB_DbgPrintF_Cnt=%d\n", fw_cnt, ifbp->IFB_DbgPrintF_Cnt);
			DbMsgBuffer = p->DbMsgBuffer + ifbp->IFB_DbgPrintF_Cnt * 6; // each entry is 3 words
			OPW( HREG_AUX_PAGE, (hcf_16)(DbMsgBuffer >> 7) );
			OPW( HREG_AUX_OFFSET, (hcf_16)(DbMsgBuffer & 0x7E) );
			ltvp->msg_id     = IPW(HREG_AUX_DATA);
			ltvp->msg_par    = IPW(HREG_AUX_DATA);
			ltvp->msg_tstamp = IPW(HREG_AUX_DATA);
			ltvp->len = 4;
			ifbp->IFB_DbgPrintF_Cnt++;
			ifbp->IFB_DbgPrintF_Cnt &= (p->DbMsgSize - 1);
		}
	}
	return rc;
};
#endif // HCF_ASSERT_PRINTF


/************************************************************************************************************
 *
 *.SUBMODULE     hcf_16 get_fid( IFBP ifbp )
 *.PURPOSE       get allocated FID for either transmit or notify.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS
 *   0   no FID available
 *   <>0 FID number
 *
 *.DESCRIPTION
 *
 *
 *.DIAGRAM
 *   The preference is to use a "pending" alloc. If no alloc is pending, then - if available - the "spare" FID
 *   is used.
 *   If the spare FID is used, IFB_RscInd (representing the spare FID) must be cleared
 *   If the pending alloc is used, the alloc event must be acknowledged to the Hermes.
 *   In case the spare FID was depleted and the IFB_RscInd has been "faked" as pseudo resource with a 0x0001
 *   value by hcf_service_nic, IFB_RscInd has to be "corrected" again to its 0x0000 value.
 *
 *   Note that due to the Hermes-II H/W problems which are intended to be worked around by DAWA, the Alloc bit
 *   in the Event register is no longer a reliable indication of the presence/absence of a FID. The "Clear FID"
 *   part of the DAWA logic, together with the choice of the definition of the return information from get_fid,
 *   handle this automatically, i.e. without additional code in get_fid.
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC hcf_16
get_fid( IFBP ifbp )
{

	hcf_16 fid = 0;
#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0
	PROT_CNT_INI;
#endif // HCF_TYPE_HII5

	IF_DMA( HCFASSERT(!(ifbp->IFB_CntlOpt & USE_DMA), ifbp->IFB_CntlOpt) );

	if ( IPW( HREG_EV_STAT) & HREG_EV_ALLOC) {
		fid = IPW( HREG_ALLOC_FID );
		HCFASSERT( fid, ifbp->IFB_RscInd );
		DAWA_ZERO_FID( HREG_ALLOC_FID );
#if ( (HCF_TYPE) & HCF_TYPE_HII5 ) == 0
		HCF_WAIT_WHILE( ( IPW( HREG_EV_STAT ) & HREG_EV_ACK_REG_READY ) == 0 );
		HCFASSERT( prot_cnt, IPW( HREG_EV_STAT ) );
#endif // HCF_TYPE_HII5
		DAWA_ACK( HREG_EV_ALLOC );          //!!note that HREG_EV_ALLOC is written only once
// 180 degree error in logic ;? #if ALLOC_15
		if ( ifbp->IFB_RscInd == 1 ) {
			ifbp->IFB_RscInd = 0;
		}
//#endif // ALLOC_15
	} else {
// 180 degree error in logic ;? #if ALLOC_15
		fid = ifbp->IFB_RscInd;
//#endif // ALLOC_15
		ifbp->IFB_RscInd = 0;
	}
	return fid;
} // get_fid


/************************************************************************************************************
 *
 *.SUBMODULE     void get_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) )
 *.PURPOSE       reads with 16/32 bit I/O via BAP1 port from NIC RAM to Host memory.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   bufp        (byte) address of buffer
 *   len         length in bytes of buffer specified by bufp
 *   word_len    Big Endian only: number of leading bytes to swap in pairs
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * process the single byte (if applicable) read by the previous get_frag and copy len (or len-1) bytes from
 * NIC to bufp.
 * On a Big Endian platform, the parameter word_len controls the number of leading bytes whose endianness is
 * converted (i.e. byte swapped)
 *
 *
 *.DIAGRAM
 *10: The PCMCIA card can be removed in the middle of the transfer. By depositing a "magic number" in the
 *   HREG_SW_0 register of the Hermes at initialization time and by verifying this register, it can be
 *   determined whether the card is still present. The return status is set accordingly.
 *   Clearing the buffer is a (relative) cheap way to prevent that failing I/O results in run-away behavior
 *   because the garbage in the buffer is interpreted by the caller irrespective of the return status (e.g.
 *   hcf_service_nic has this behavior).
 *
 *.NOTICE
 *   It turns out DOS ODI uses zero length fragments. The HCF code can cope with it, but as a consequence, no
 *   Assert on len is possible
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC void
get_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) )
{
	hcf_io      io_port = ifbp->IFB_IOBase + HREG_DATA_1;   //BAP data register
	wci_bufp    p = bufp;                                   //working pointer
	int         i;                                          //prevent side effects from macro
	int         j;

	HCFASSERT( ((hcf_32)bufp & (HCF_ALIGN-1) ) == 0, (hcf_32)bufp );

/*1:    here recovery logic for intervening BAP access between hcf_service_nic and hcf_rcv_msg COULD be added
 *  if current access is RxInitial
 *  .  persistent_offset += len
 */

	i = len;
	                                        //if buffer length > 0 and carry from previous get_frag
	if ( i && ifbp->IFB_CarryIn ) {
		                                //.  move carry to buffer
		                                //.  adjust buffer length and pointer accordingly
		*p++ = (hcf_8)(ifbp->IFB_CarryIn>>8);
		i--;
		                                //.  clear carry flag
		ifbp->IFB_CarryIn = 0;
	}
#if (HCF_IO) & HCF_IO_32BITS
	//skip zero-length I/O, single byte I/O and I/O not worthwhile (i.e. less than 6 bytes)for DW logic
	                                        //if buffer length >= 6 and 32 bits I/O support
	if ( !(ifbp->IFB_CntlOpt & USE_16BIT) && i >= 6 ) {
		hcf_32 FAR  *p4; //prevent side effects from macro
		if ( ( (hcf_32)p & 0x1 ) == 0 ) {           //.  if buffer at least word aligned
			if ( (hcf_32)p & 0x2 ) {            //.  .  if buffer not double word aligned
							    //.  .  .  read single word to get double word aligned
				*(wci_recordp)p = IN_PORT_WORD( io_port );
				                            //.  .  .  adjust buffer length and pointer accordingly
				p += 2;
				i -= 2;
			}
			                                    //.  .  read as many double word as possible
			p4 = (hcf_32 FAR *)p;
			j = i/4;
			IN_PORT_STRING_32( io_port, p4, j );
			                                    //.  .  adjust buffer length and pointer accordingly
			p += i & ~0x0003;
			i &= 0x0003;
		}
	}
#endif // HCF_IO_32BITS
	                                        //if no 32-bit support OR byte aligned OR 1-3 bytes left
	if ( i ) {
		                                //.  read as many word as possible in "alignment safe" way
		j = i/2;
		IN_PORT_STRING_8_16( io_port, p, j );
		                                //.  if 1 byte left
		if ( i & 0x0001 ) {
			                        //.  .  read 1 word
			ifbp->IFB_CarryIn = IN_PORT_WORD( io_port );
			                        //.  .  store LSB in last char of buffer
			bufp[len-1] = (hcf_8)ifbp->IFB_CarryIn;
			                        //.  .  save MSB in carry, set carry flag
			ifbp->IFB_CarryIn |= 0x1;
		}
	}
#if HCF_BIG_ENDIAN
	HCFASSERT( word_len == 0 || word_len == 2 || word_len == 4, word_len );
	HCFASSERT( word_len == 0 || ((hcf_32)bufp & 1 ) == 0, (hcf_32)bufp );
	HCFASSERT( word_len <= len, MERGE2( word_len, len ) );
	//see put_frag for an alternative implementation, but be careful about what are int's and what are
	//hcf_16's
	if ( word_len ) {                               //.  if there is anything to convert
		hcf_8 c;
		c = bufp[1];                                //.  .  convert the 1st hcf_16
		bufp[1] = bufp[0];
		bufp[0] = c;
		if ( word_len > 1 ) {                       //.  .  if there is to convert more than 1 word ( i.e 2 )
			c = bufp[3];                            //.  .  .  convert the 2nd hcf_16
			bufp[3] = bufp[2];
			bufp[2] = c;
		}
	}
#endif // HCF_BIG_ENDIAN
} // get_frag

/************************************************************************************************************
 *
 *.SUBMODULE     int init( IFBP ifbp )
 *.PURPOSE       Handles common initialization aspects (H-I init, calibration, config.mngmt, allocation).
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS
 *   HCF_ERR_INCOMP_PRI
 *   HCF_ERR_INCOMP_FW
 *   HCF_ERR_TIME_OUT
 *   >>hcf_get_info
 *       HCF_ERR_NO_NIC
 *       HCF_ERR_LEN
 *
 *.DESCRIPTION
 * init will successively:
 * - in case of a (non-preloaded) H-I, initialize the NIC
 * - calibrate the S/W protection timer against the Hermes Timer
 * - collect HSI, "active" F/W Configuration Management Information
 * - in case active F/W is Primary F/W: collect Primary F/W Configuration Management Information
 * - check HSI and Primary F/W compatibility with the HCF
 * - in case active F/W is Station or AP F/W: check Station or AP F/W compatibility with the HCF
 * - in case active F/W is not Primary F/W: allocate FIDs to be used in transmit/notify process
 *
 *
 *.DIAGRAM
 *2: drop all error status bits in IFB_CardStat since they are expected to be re-evaluated.
 *4: Ack everything except HREG_EV_SLEEP_REQ. It is very likely that an Alloc event is pending and
 *   very well possible that a Send Cmd event is pending. Acking HREG_EV_SLEEP_REQ is handled by hcf_action(
 *   HCF_ACT_INT_ON ) !!!
 *10: Calibrate the S/W time-out protection mechanism by calling calibrate(). Note that possible errors
 *   in the calibration process are nor reported by init but will show up via the defunct mechanism in
 *   subsequent hcf-calls.
 *14: usb_check_comp() is called to have the minimal visual clutter for the legacy H-I USB dongle
 *   compatibility check.
 *16: The following configuration management related information is retrieved from the NIC:
 *    - HSI supplier
 *    - F/W Identity
 *    - F/W supplier
 *    if appropriate:
 *    - PRI Identity
 *    - PRI supplier
 *    appropriate means on H-I: always
 *    and on H-II if F/W supplier reflects a primary (i.e. only after an Hermes Reset or Init
 *    command).
 *    QUESTION ;? !!!!!! should, For each of the above RIDs the Endianness is converted to native Endianness.
 *    Only the return code of the first hcf_get_info is used. All hcf_get_info calls are made, regardless of
 *    the success or failure of the 1st hcf_get_info. The assumptions are:
 *     - if any call fails, they all fail, so remembering the result of the 1st call is adequate
 *     - a failing call will overwrite the L-field with a 0x0000 value, which services both as an
 *       error indication for the values cached in the IFB as making mmd_check_comp fail.
 *    In case of H-I, when getting the F/W identity fails, the F/W is assumed to be H-I AP F/W pre-dating
 *    version 9.0 and the F/W Identity and Supplier are faked accordingly.
 *    In case of H-II, the Primary, Station and AP Identity are merged into a single F/W Identity.
 *    The same applies to the Supplier information. As a consequence the PRI information can no longer be
 *    retrieved when a Tertiary runs. To accommodate MSFs and Utilities who depend on PRI information being
 *    available at any time, this information is cached in the IFB. In this cache the generic "F/W" value of
 *    the typ-fields is overwritten with the specific (legacy) "PRI" values. To actually re-route the (legacy)
 *    PRI request via hcf_get_info, the xxxx-table must be set.  In case of H-I, this caching, modifying and
 *    re-routing is not needed because PRI information is always available directly from the NIC. For
 *    consistency the caching fields in the IFB are filled with the PRI information anyway.
 *18: mdd_check_comp() is called to check the Supplier Variant and Range of the Host-S/W I/F (HSI) and the
 *   Primary Firmware Variant and Range against the Top and Bottom level supported by this HCF.  If either of
 *   these tests fails, the CARD_STAT_INCOMP_PRI bit of IFB_CardStat is set
 *   Note: There should always be a primary except during production, so this makes the HCF in its current form
 *   unsuitable for manufacturing test systems like the FTS. This can be remedied by an adding a test like
 *   ifbp->IFB_PRISup.id == COMP_ID_PRI
 *20: In case there is Tertiary F/W and this F/W is Station F/W, the Supplier Variant and Range of the Station
 *   Firmware function as retrieved from the Hermes is checked against the Top and Bottom level supported by
 *   this HCF.
 *   Note: ;? the tertiary F/W compatibility checks could be moved to the DHF, which already has checked the
 *   CFI and MFI compatibility of the image with the NIC before the image was downloaded.
 *28: In case of non-Primary F/W: allocates and acknowledge a (TX or Notify) FID and allocates without
 *   acknowledge another (TX or Notify) FID (the so-called 1.5 alloc scheme) with the following steps:
 *   - execute the allocate command by calling cmd_exe
 *   - wait till either the alloc event or a time-out occurs
 *   - regardless whether the alloc event occurs, call get_fid to
 *     - read the FID and save it in IFB_RscInd to be used as "spare FID"
 *     - acknowledge the alloc event
 *     - do another "half" allocate to complete the "1.5 Alloc scheme"
 *     Note that above 3 steps do not harm and thus give the "cheapest" acceptable strategy.
 *     If a time-out occurred, then report time out status (after all)
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC int
init( IFBP ifbp )
{

	int rc = HCF_SUCCESS;

	HCFLOGENTRY( HCF_TRACE_INIT, 0 );

	ifbp->IFB_CardStat = 0;                                                                         /* 2*/
	OPW( HREG_EV_ACK, ~HREG_EV_SLEEP_REQ );                                             /* 4*/
	IF_PROT_TIME( calibrate( ifbp ) );                                                  /*10*/
#if 0 // OOR
	ifbp->IFB_FWIdentity.len = 2;                           //misuse the IFB space for a put
	ifbp->IFB_FWIdentity.typ = CFG_TICK_TIME;
	ifbp->IFB_FWIdentity.comp_id = (1000*1000)/1024 + 1;    //roughly 1 second
	hcf_put_info( ifbp, (LTVP)&ifbp->IFB_FWIdentity.len );
#endif // OOR
	ifbp->IFB_FWIdentity.len = sizeof(CFG_FW_IDENTITY_STRCT)/sizeof(hcf_16) - 1;
	ifbp->IFB_FWIdentity.typ = CFG_FW_IDENTITY;
	rc = hcf_get_info( ifbp, (LTVP)&ifbp->IFB_FWIdentity.len );
/* ;? conversion should not be needed for mmd_check_comp */
#if HCF_BIG_ENDIAN
	ifbp->IFB_FWIdentity.comp_id       = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.comp_id );
	ifbp->IFB_FWIdentity.variant       = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.variant );
	ifbp->IFB_FWIdentity.version_major = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.version_major );
	ifbp->IFB_FWIdentity.version_minor = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWIdentity.version_minor );
#endif // HCF_BIG_ENDIAN
#if defined MSF_COMPONENT_ID                                                                        /*14*/
	if ( rc == HCF_SUCCESS ) {                                                                      /*16*/
		ifbp->IFB_HSISup.len = sizeof(CFG_SUP_RANGE_STRCT)/sizeof(hcf_16) - 1;
		ifbp->IFB_HSISup.typ = CFG_NIC_HSI_SUP_RANGE;
		rc = hcf_get_info( ifbp, (LTVP)&ifbp->IFB_HSISup.len );
/* ;? conversion should not be needed for mmd_check_comp , BUT according to a report of a BE-user it is
 * should be resolved in the WARP release
 * since some compilers make ugly but unnecessary code of these instructions even for LE,
 * it is conditionally compiled */
#if HCF_BIG_ENDIAN
		ifbp->IFB_HSISup.role    = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.role );
		ifbp->IFB_HSISup.id      = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.id );
		ifbp->IFB_HSISup.variant = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.variant );
		ifbp->IFB_HSISup.bottom  = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.bottom );
		ifbp->IFB_HSISup.top     = CNV_LITTLE_TO_SHORT( ifbp->IFB_HSISup.top );
#endif // HCF_BIG_ENDIAN
		ifbp->IFB_FWSup.len = sizeof(CFG_SUP_RANGE_STRCT)/sizeof(hcf_16) - 1;
		ifbp->IFB_FWSup.typ = CFG_FW_SUP_RANGE;
		(void)hcf_get_info( ifbp, (LTVP)&ifbp->IFB_FWSup.len );
/* ;? conversion should not be needed for mmd_check_comp */
#if HCF_BIG_ENDIAN
		ifbp->IFB_FWSup.role    = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.role );
		ifbp->IFB_FWSup.id      = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.id );
		ifbp->IFB_FWSup.variant = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.variant );
		ifbp->IFB_FWSup.bottom  = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.bottom );
		ifbp->IFB_FWSup.top     = CNV_LITTLE_TO_SHORT( ifbp->IFB_FWSup.top );
#endif // HCF_BIG_ENDIAN

		if ( ifbp->IFB_FWSup.id == COMP_ID_PRI ) {                                              /* 20*/
			int i = sizeof( CFG_FW_IDENTITY_STRCT) + sizeof(CFG_SUP_RANGE_STRCT );
			while ( i-- ) ((hcf_8*)(&ifbp->IFB_PRIIdentity))[i] = ((hcf_8*)(&ifbp->IFB_FWIdentity))[i];
			ifbp->IFB_PRIIdentity.typ = CFG_PRI_IDENTITY;
			ifbp->IFB_PRISup.typ = CFG_PRI_SUP_RANGE;
			xxxx[xxxx_PRI_IDENTITY_OFFSET] = &ifbp->IFB_PRIIdentity.len;
			xxxx[xxxx_PRI_IDENTITY_OFFSET+1] = &ifbp->IFB_PRISup.len;
		}
		if ( !mmd_check_comp( (void*)&cfg_drv_act_ranges_hsi, &ifbp->IFB_HSISup)                 /* 22*/
#if ( (HCF_TYPE) & HCF_TYPE_PRELOADED ) == 0
//;? the PRI compatibility check is only relevant for DHF
		     || !mmd_check_comp( (void*)&cfg_drv_act_ranges_pri, &ifbp->IFB_PRISup)
#endif // HCF_TYPE_PRELOADED
			) {
			ifbp->IFB_CardStat = CARD_STAT_INCOMP_PRI;
			rc = HCF_ERR_INCOMP_PRI;
		}
		if ( ( ifbp->IFB_FWSup.id == COMP_ID_STA && !mmd_check_comp( (void*)&cfg_drv_act_ranges_sta, &ifbp->IFB_FWSup) ) ||
		     ( ifbp->IFB_FWSup.id == COMP_ID_APF && !mmd_check_comp( (void*)&cfg_drv_act_ranges_apf, &ifbp->IFB_FWSup) )
			) {                                                                                  /* 24 */
			ifbp->IFB_CardStat |= CARD_STAT_INCOMP_FW;
			rc = HCF_ERR_INCOMP_FW;
		}
	}
#endif // MSF_COMPONENT_ID

	if ( rc == HCF_SUCCESS && ifbp->IFB_FWIdentity.comp_id >= COMP_ID_FW_STA ) {
		PROT_CNT_INI;
		/**************************************************************************************
		 * rlav: the DMA engine needs the host to cause a 'hanging alloc event' for it to consume.
		 * not sure if this is the right spot in the HCF, thinking about hcf_enable...
		 **************************************************************************************/
		rc = cmd_exe( ifbp, HCMD_ALLOC, 0 );
// 180 degree error in logic ;? #if ALLOC_15
//		ifbp->IFB_RscInd = 1;   //let's hope that by the time hcf_send_msg isa called, there will be a FID
//#else
		if ( rc == HCF_SUCCESS ) {
			HCF_WAIT_WHILE( (IPW( HREG_EV_STAT ) & HREG_EV_ALLOC) == 0 );
			IF_PROT_TIME( HCFASSERT(prot_cnt, IPW( HREG_EV_STAT )) );
#if HCF_DMA
			if ( ! ( ifbp->IFB_CntlOpt & USE_DMA ) )
#endif // HCF_DMA
			{
				ifbp->IFB_RscInd = get_fid( ifbp );
				HCFASSERT( ifbp->IFB_RscInd, 0 );
				cmd_exe( ifbp, HCMD_ALLOC, 0 );
				IF_PROT_TIME( if ( prot_cnt == 0 ) rc = HCF_ERR_TIME_OUT );
			}
		}
//#endif // ALLOC_15
	}

	HCFASSERT( rc == HCF_SUCCESS, rc );
	HCFLOGEXIT( HCF_TRACE_INIT );
	return rc;
} // init

/************************************************************************************************************
 *
 *.SUBMODULE     void isr_info( IFBP ifbp )
 *.PURPOSE       handles link events.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 *
 *
 *.DIAGRAM
 *1: First the FID number corresponding with the InfoEvent is determined.
 *   Note the complication of the zero-FID protection sub-scheme in DAWA.
 *   Next the L-field and the T-field are fetched into scratch buffer info.
 *2: In case of tallies, the 16 bits Hermes values are accumulated in the IFB into 32 bits values. Info[0]
 *   is (expected to be) HCF_NIC_TAL_CNT + 1. The contraption "while ( info[0]-- >1 )" rather than
 *   "while ( --info[0] )" is used because it is dangerous to determine the length of the Value field by
 *   decrementing info[0]. As a result of a bug in some version of the F/W, info[0] may be 0, resulting
 *   in a very long loop in the pre-decrement logic.
 *4: In case of a link status frame, the information is copied to the IFB field IFB_linkStat
 *6: All other than Tallies (including "unknown" ones) are checked against the selection set by the MSF
 *   via CFG_RID_LOG. If a match is found or the selection set has the wild-card type (i.e non-NULL buffer
 *   pointer at the terminating zero-type), the frame is copied to the (type-specific) log buffer.
 *   Note that to accumulate tallies into IFB AND to log them or to log a frame when a specific match occures
 *   AND based on the wild-card selection, you have to call setup_bap again after the 1st copy.
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC void
isr_info( IFBP ifbp )
{
	hcf_16  info[2], fid;
#if (HCF_EXT) & HCF_EXT_INFO_LOG
	RID_LOGP    ridp = ifbp->IFB_RIDLogp;   //NULL or pointer to array of RID_LOG structures (terminated by zero typ)
#endif // HCF_EXT_INFO_LOG

	HCFTRACE( ifbp, HCF_TRACE_ISR_INFO );                                                               /* 1 */
	fid = IPW( HREG_INFO_FID );
	DAWA_ZERO_FID( HREG_INFO_FID );
	if ( fid ) {
		(void)setup_bap( ifbp, fid, 0, IO_IN );
		get_frag( ifbp, (wci_bufp)info, 4 BE_PAR(2) );
		HCFASSERT( info[0] <= HCF_MAX_LTV + 1, MERGE_2( info[1], info[0] ) );  //;? a smaller value makes more sense
#if (HCF_TALLIES) & HCF_TALLIES_NIC     //Hermes tally support
		if ( info[1] == CFG_TALLIES ) {
			hcf_32  *p;
		/*2*/   if ( info[0] > HCF_NIC_TAL_CNT ) {
				info[0] = HCF_NIC_TAL_CNT + 1;
			}
			p = (hcf_32*)&ifbp->IFB_NIC_Tallies;
			while ( info[0]-- >1 ) *p++ += IPW( HREG_DATA_1 );  //request may return zero length
		}
		else
#endif // HCF_TALLIES_NIC
		{
		/*4*/   if ( info[1] == CFG_LINK_STAT ) {
				ifbp->IFB_LinkStat = IPW( HREG_DATA_1 );
			}
#if (HCF_EXT) & HCF_EXT_INFO_LOG
		/*6*/   while ( 1 ) {
				if ( ridp->typ == 0 || ridp->typ == info[1] ) {
					if ( ridp->bufp ) {
						HCFASSERT( ridp->len >= 2, ridp->typ );
						ridp->bufp[0] = min((hcf_16)(ridp->len - 1), info[0] );     //save L
						ridp->bufp[1] = info[1];                        //save T
						get_frag( ifbp, (wci_bufp)&ridp->bufp[2], (ridp->bufp[0] - 1)*2 BE_PAR(0) );
					}
					break;
				}
				ridp++;
			}
#endif // HCF_EXT_INFO_LOG
		}
		HCFTRACE( ifbp, HCF_TRACE_ISR_INFO | HCF_TRACE_EXIT );
	}
	return;
} // isr_info

//
//
// #endif // HCF_TALLIES_NIC
// /*4*/    if ( info[1] == CFG_LINK_STAT ) {
//          ifbp->IFB_DSLinkStat = IPW( HREG_DATA_1 ) | CFG_LINK_STAT_CHANGE;   //corrupts BAP !! ;?
//          ifbp->IFB_LinkStat = ifbp->IFB_DSLinkStat & CFG_LINK_STAT_FW; //;? to be obsoleted
//          printk(KERN_ERR "linkstatus: %04x\n", ifbp->IFB_DSLinkStat );        //;?remove me 1 day
// #if (HCF_SLEEP) & HCF_DDS
//          if ( ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_CONNECTED ) == 0 ) {    //even values are disconnected etc.
//              ifbp->IFB_TickCnt = 0;              //start 2 second period (with 1 tick uncertanty)
//              printk(KERN_NOTICE "isr_info: AwaitConnection phase started, IFB_TickCnt = 0\n" );      //;?remove me 1 day
//          }
// #endif // HCF_DDS
//      }
// #if (HCF_EXT) & HCF_EXT_INFO_LOG
// /*6*/    while ( 1 ) {
//          if ( ridp->typ == 0 || ridp->typ == info[1] ) {
//              if ( ridp->bufp ) {
//                  HCFASSERT( ridp->len >= 2, ridp->typ );
//                  (void)setup_bap( ifbp, fid, 2, IO_IN );         //restore BAP for tallies, linkstat and specific type followed by wild card
//                  ridp->bufp[0] = min( ridp->len - 1, info[0] );  //save L
//                  get_frag( ifbp, (wci_bufp)&ridp->bufp[1], ridp->bufp[0]*2 BE_PAR(0) );
//              }
//              break; //;?this break is no longer needed due to setup_bap but lets concentrate on DDS first
//          }
//          ridp++;
//      }
// #endif // HCF_EXT_INFO_LOG
//  }
//  HCFTRACE( ifbp, HCF_TRACE_ISR_INFO | HCF_TRACE_EXIT );
//
//
//
//
//  return;
//} // isr_info


/************************************************************************************************************
 *
 *.SUBMODULE     void mdd_assert( IFBP ifbp, unsigned int line_number, hcf_32 q )
 *.PURPOSE       filters assert on level and interfaces to the MSF supplied msf_assert routine.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   line_number line number of the line which caused the assert
 *   q           qualifier, additional information which may give a clue about the problem
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 *
 *
 *.DIAGRAM
 *
 *.NOTICE
 * mdd_assert has been through a turmoil, renaming hcf_assert to assert and hcf_assert again and supporting off
 * and on being called from the MSF level and other ( immature ) ModularDriverDevelopment modules like DHF and
 * MMD.
 * !!!! The assert routine is not an hcf_..... routine in the sense that it may be called by the MSF,
 *      however it is called from mmd.c and dhf.c, so it must be external.
 *      To prevent namespace pollution it needs a prefix, to prevent that MSF programmers think that
 *      they are allowed to call the assert logic, the prefix HCF can't be used, so MDD is selected!!!!
 *
 * When called from the DHF module the line number is incremented by DHF_FILE_NAME_OFFSET and when called from
 * the MMD module by MMD_FILE_NAME_OFFSET.
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
#if HCF_ASSERT
void
mdd_assert( IFBP ifbp, unsigned int line_number, hcf_32 q )
{
	hcf_16  run_time_flag = ifbp->IFB_AssertLvl;

	if ( run_time_flag /* > ;?????? */ ) { //prevent recursive behavior, later to be extended to level filtering
		ifbp->IFB_AssertQualifier = q;
		ifbp->IFB_AssertLine = (hcf_16)line_number;
#if (HCF_ASSERT) & ( HCF_ASSERT_LNK_MSF_RTN | HCF_ASSERT_RT_MSF_RTN )
		if ( ifbp->IFB_AssertRtn ) {
			ifbp->IFB_AssertRtn( line_number, ifbp->IFB_AssertTrace, q );
		}
#endif // HCF_ASSERT_LNK_MSF_RTN / HCF_ASSERT_RT_MSF_RTN
#if (HCF_ASSERT) & HCF_ASSERT_SW_SUP
		OPW( HREG_SW_2, line_number );
		OPW( HREG_SW_2, ifbp->IFB_AssertTrace );
		OPW( HREG_SW_2, (hcf_16)q );
		OPW( HREG_SW_2, (hcf_16)(q >> 16 ) );
#endif // HCF_ASSERT_SW_SUP

#if (HCF_ASSERT) & HCF_ASSERT_MB
		ifbp->IFB_AssertLvl = 0;                                    // prevent recursive behavior
		hcf_put_info( ifbp, (LTVP)&ifbp->IFB_AssertStrct );
		ifbp->IFB_AssertLvl = run_time_flag;                        // restore appropriate filter level
#endif // HCF_ASSERT_MB
	}
} // mdd_assert
#endif // HCF_ASSERT


/************************************************************************************************************
 *
 *.SUBMODULE     void put_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) )
 *.PURPOSE       writes with 16/32 bit I/O via BAP1 port from Host memory to NIC RAM.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   bufp        (byte) address of buffer
 *   len         length in bytes of buffer specified by bufp
 *   word_len    Big Endian only: number of leading bytes to swap in pairs
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * process the single byte (if applicable) not yet written by the previous put_frag and copy len
 * (or len-1) bytes from bufp to NIC.
 *
 *
 *.DIAGRAM
 *
 *.NOTICE
 *   It turns out DOS ODI uses zero length fragments. The HCF code can cope with it, but as a consequence, no
 *   Assert on len is possible
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC void
put_frag( IFBP ifbp, wci_bufp bufp, int len BE_PAR( int word_len ) )
{
	hcf_io      io_port = ifbp->IFB_IOBase + HREG_DATA_1;   //BAP data register
	int         i;                                          //prevent side effects from macro
	hcf_16      j;
	HCFASSERT( ((hcf_32)bufp & (HCF_ALIGN-1) ) == 0, (hcf_32)bufp );
#if HCF_BIG_ENDIAN
	HCFASSERT( word_len == 0 || word_len == 2 || word_len == 4, word_len );
	HCFASSERT( word_len == 0 || ((hcf_32)bufp & 1 ) == 0, (hcf_32)bufp );
	HCFASSERT( word_len <= len, MERGE_2( word_len, len ) );

	if ( word_len ) {                                   //if there is anything to convert
		                                //.  convert and write the 1st hcf_16
		j = bufp[1] | bufp[0]<<8;
		OUT_PORT_WORD( io_port, j );
		                                //.  update pointer and counter accordingly
		len -= 2;
		bufp += 2;
		if ( word_len > 1 ) {           //.  if there is to convert more than 1 word ( i.e 2 )
			                        //.  .  convert and write the 2nd hcf_16
			j = bufp[1] | bufp[0]<<8;   /*bufp is already incremented by 2*/
			OUT_PORT_WORD( io_port, j );
			                        //.  .  update pointer and counter accordingly
			len -= 2;
			bufp += 2;
		}
	}
#endif // HCF_BIG_ENDIAN
	i = len;
	if ( i && ifbp->IFB_CarryOut ) {                    //skip zero-length
		j = ((*bufp)<<8) + ( ifbp->IFB_CarryOut & 0xFF );
		OUT_PORT_WORD( io_port, j );
		bufp++; i--;
		ifbp->IFB_CarryOut = 0;
	}
#if (HCF_IO) & HCF_IO_32BITS
	//skip zero-length I/O, single byte I/O and I/O not worthwhile (i.e. less than 6 bytes)for DW logic
	                                                        //if buffer length >= 6 and 32 bits I/O support
	if ( !(ifbp->IFB_CntlOpt & USE_16BIT) && i >= 6 ) {
		hcf_32 FAR  *p4; //prevent side effects from macro
		if ( ( (hcf_32)bufp & 0x1 ) == 0 ) {            //.  if buffer at least word aligned
			if ( (hcf_32)bufp & 0x2 ) {             //.  .  if buffer not double word aligned
								//.  .  .  write a single word to get double word aligned
				j = *(wci_recordp)bufp;     //just to help ease writing macros with embedded assembly
				OUT_PORT_WORD( io_port, j );
				                                //.  .  .  adjust buffer length and pointer accordingly
				bufp += 2; i -= 2;
			}
			                                        //.  .  write as many double word as possible
			p4 = (hcf_32 FAR *)bufp;
			j = (hcf_16)i/4;
			OUT_PORT_STRING_32( io_port, p4, j );
			                                        //.  .  adjust buffer length and pointer accordingly
			bufp += i & ~0x0003;
			i &= 0x0003;
		}
	}
#endif // HCF_IO_32BITS
	                                        //if no 32-bit support OR byte aligned OR 1 word left
	if ( i ) {
		                                //.  if odd number of bytes left
		if ( i & 0x0001 ) {
			                        //.  .  save left over byte (before bufp is corrupted) in carry, set carry flag
			ifbp->IFB_CarryOut = (hcf_16)bufp[i-1] | 0x0100;    //note that i and bufp are always simultaneously modified, &bufp[i-1] is invariant
		}
		                                //.  write as many word as possible in "alignment safe" way
		j = (hcf_16)i/2;
		OUT_PORT_STRING_8_16( io_port, bufp, j );
	}
} // put_frag


/************************************************************************************************************
 *
 *.SUBMODULE     void put_frag_finalize( IFBP ifbp )
 *.PURPOSE       cleanup after put_frag for trailing odd byte and MIC transfer to NIC.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *
 *.RETURNS       N.A.
 *
 *.DESCRIPTION
 * finalize the MIC calculation with the padding pattern, output the last byte (if applicable)
 * of the message and the MIC to the TxFS
 *
 *
 *.DIAGRAM
 *2: 1 byte of the last put_frag may be still in IFB_CarryOut ( the put_frag carry holder ), so ........
 *   1 - 3 bytes of the last put_frag may be still in IFB_tx_32 ( the MIC engine carry holder ), so ........
 *   The call to the MIC calculation routine feeds these remaining bytes (if any) of put_frag and the
 *   just as many bytes of the padding as needed to the MIC calculation engine. Note that the "unneeded" pad
 *   bytes simply end up in the MIC engine carry holder and are never used.
 *8: write the remainder of the MIC and possible some garbage to NIC RAM
 *   Note: i is always 4 (a loop-invariant of the while in point 2)
 *
 *.NOTICE
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC void
put_frag_finalize( IFBP ifbp )
{
#if (HCF_TYPE) & HCF_TYPE_WPA
	if ( ifbp->IFB_MICTxCarry != 0xFFFF) {      //if MIC calculation active
		CALC_TX_MIC( mic_pad, 8);               //.  feed (up to 8 bytes of) virtual padding to MIC engine
		                                        //.  write (possibly) trailing byte + (most of) MIC
		put_frag( ifbp, (wci_bufp)ifbp->IFB_MICTx, 8 BE_PAR(0) );
	}
#endif // HCF_TYPE_WPA
	put_frag( ifbp, null_addr, 1 BE_PAR(0) );   //write (possibly) trailing data or MIC byte
} // put_frag_finalize


/************************************************************************************************************
 *
 *.SUBMODULE     int put_info( IFBP ifbp, LTVP ltvp )
 *.PURPOSE       support routine to handle the "basic" task of hcf_put_info to pass RIDs to the NIC.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   ltvp        address in NIC RAM where LVT-records are located
 *
 *.RETURNS
 *   HCF_SUCCESS
 *   >>put_frag
 *   >>cmd_wait
 *
 *.DESCRIPTION
 *
 *
 *.DIAGRAM
 *20: do not write RIDs to NICs which have incompatible Firmware
 *24: If the RID does not exist, the L-field is set to zero.
 *   Note that some RIDs can not be read, e.g. the pseudo RIDs for direct Hermes commands and CFG_DEFAULT_KEYS
 *28: If the RID is written successful, pass it to the NIC by means of an Access Write command
 *
 *.NOTICE
 *   The mechanism to HCF_ASSERT on invalid typ-codes in the LTV record is based on the following strategy:
 *     - some codes (e.g. CFG_REG_MB) are explicitly handled by the HCF which implies that these codes
 *       are valid. These codes are already consumed by hcf_put_info.
 *     - all other codes are passed to the Hermes. Before the put action is executed, hcf_get_info is called
 *       with an LTV record with a value of 1 in the L-field and the intended put action type in the Typ-code
 *       field. If the put action type is valid, it is also valid as a get action type code - except
 *       for CFG_DEFAULT_KEYS and CFG_ADD_TKIP_DEFAULT_KEY - so the HCF_ASSERT logic of hcf_get_info should
 *       not catch.
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC int
put_info( IFBP ifbp, LTVP ltvp  )
{

	int rc = HCF_SUCCESS;

	HCFASSERT( ifbp->IFB_CardStat == 0, MERGE_2( ltvp->typ, ifbp->IFB_CardStat ) );
	HCFASSERT( CFG_RID_CFG_MIN <= ltvp->typ && ltvp->typ <= CFG_RID_CFG_MAX, ltvp->typ );

	if ( ifbp->IFB_CardStat == 0 &&                                                             /* 20*/
	     ( ( CFG_RID_CFG_MIN <= ltvp->typ    && ltvp->typ <= CFG_RID_CFG_MAX ) ||
	       ( CFG_RID_ENG_MIN <= ltvp->typ /* && ltvp->typ <= 0xFFFF */       )     ) ) {
#if HCF_ASSERT //FCC8, FCB0, FCB4, FCB6, FCB7, FCB8, FCC0, FCC4, FCBC, FCBD, FCBE, FCBF
		{
			hcf_16     t = ltvp->typ;
			LTV_STRCT  x = { 2, t, {0} };                                                          /*24*/
			hcf_get_info( ifbp, (LTVP)&x );
			if ( x.len == 0 &&
			     ( t != CFG_DEFAULT_KEYS && t != CFG_ADD_TKIP_DEFAULT_KEY && t != CFG_REMOVE_TKIP_DEFAULT_KEY &&
			       t != CFG_ADD_TKIP_MAPPED_KEY && t != CFG_REMOVE_TKIP_MAPPED_KEY &&
			       t != CFG_HANDOVER_ADDR && t != CFG_DISASSOCIATE_ADDR &&
			       t != CFG_FCBC && t != CFG_FCBD && t != CFG_FCBE && t != CFG_FCBF &&
			       t != CFG_DEAUTHENTICATE_ADDR
				     )
				) {
				HCFASSERT( DO_ASSERT, ltvp->typ );
			}
		}
#endif // HCF_ASSERT

		rc = setup_bap( ifbp, ltvp->typ, 0, IO_OUT );
		put_frag( ifbp, (wci_bufp)ltvp, 2*ltvp->len + 2 BE_PAR(2) );
	/*28*/  if ( rc == HCF_SUCCESS ) {
			rc = cmd_exe( ifbp, HCMD_ACCESS + HCMD_ACCESS_WRITE, ltvp->typ );
		}
	}
	return rc;
} // put_info


/************************************************************************************************************
 *
 *.SUBMODULE     int put_info_mb( IFBP ifbp, CFG_MB_INFO_STRCT FAR * ltvp )
 *.PURPOSE       accumulates a ( series of) buffers into a single Info block into the MailBox.
 *
 *.ARGUMENTS
 *   ifbp        address of the Interface Block
 *   ltvp        address of structure specifying the "type" and the fragments of the information to be synthesized
 *               as an LTV into the MailBox
 *
 *.RETURNS
 *
 *.DESCRIPTION
 * If the data does not fit (including no MailBox is available), the IFB_MBTally is incremented and an
 * error status is returned.
 * HCF_ASSERT does not catch.
 * Calling put_info_mb when their is no MailBox available, is considered a design error in the MSF.
 *
 * Note that there is always at least 1 word of unused space in the mail box.
 * As a consequence:
 * - no problem in pointer arithmetic (MB_RP == MB_WP means unambiguously mail box is completely empty
 * - There is always free space to write an L field with a value of zero after each MB_Info block.  This
 *   allows for an easy scan mechanism in the "get MB_Info block" logic.
 *
 *
 *.DIAGRAM
 *1: Calculate L field of the MBIB, i.e. 1 for the T-field + the cumulative length of the fragments.
 *2: The free space in the MailBox is calculated (2a: free part from Write Ptr to Read Ptr, 2b: free part
 *   turns out to wrap around) . If this space suffices to store the number of words reflected by len (T-field
 *   + Value-field) plus the additional MailBox Info L-field + a trailing 0 to act as the L-field of a trailing
 *   dummy or empty LTV record, then a MailBox Info block is build in the MailBox consisting of
 *     - the value len in the first word
 *     - type in the second word
 *     - a copy of the contents of the fragments in the second and higher word
 *
 *4: Since put_info_mb() can more or less directly be called from the MSF level, the I/F must be robust
 *   against out-of-range variables. As failsafe coding, the MB update is skipped by changing tlen to 0 if
 *   len == 0; This will indirectly cause an assert as result of the violation of the next if clause.
 *6: Check whether the free space in MailBox suffices (this covers the complete absence of the MailBox).
 *   Note that len is unsigned, so even MSF I/F violation works out O.K.
 *   The '2' in the expression "len+2" is used because 1 word is needed for L itself and 1 word is needed
 *   for the zero-sentinel
 *8: update MailBox Info length report to MSF with "oldest" MB Info Block size. Be careful here, if you get
 *   here before the MailBox is registered, you can't read from the buffer addressed by IFB_MBp (it is the
 *   Null buffer) so don't move this code till the end of this routine but keep it where there is garuanteed
 *   a buffer.
 *
 *.NOTICE
 *   boundary testing depends on the fact that IFB_MBSize is guaranteed to be zero if no MailBox is present,
 *   and to a lesser degree, that IFB_MBWp = IFB_MBRp = 0
 *
 *.ENDDOC                END DOCUMENTATION
 *
 ************************************************************************************************************/

HCF_STATIC int
put_info_mb( IFBP ifbp, CFG_MB_INFO_STRCT FAR * ltvp )
{

	int         rc = HCF_SUCCESS;
	hcf_16      i;                      //work counter
	hcf_16      *dp;                    //destination pointer (in MailBox)
	wci_recordp sp;                     //source pointer
	hcf_16      len;                    //total length to copy to MailBox
	hcf_16      tlen;                   //free length/working length/offset in WMP frame

	if ( ifbp->IFB_MBp == NULL ) return rc;  //;?not sufficient
	HCFASSERT( ifbp->IFB_MBp != NULL, 0 );                   //!!!be careful, don't get into an endless recursion
	HCFASSERT( ifbp->IFB_MBSize, 0 );

	len = 1;                                                                                            /* 1 */
	for ( i = 0; i < ltvp->frag_cnt; i++ ) {
		len += ltvp->frag_buf[i].frag_len;
	}
	if ( ifbp->IFB_MBRp > ifbp->IFB_MBWp ) {
		tlen = ifbp->IFB_MBRp - ifbp->IFB_MBWp;                                                         /* 2a*/
	} else {
		if ( ifbp->IFB_MBRp == ifbp->IFB_MBWp ) {
			ifbp->IFB_MBRp = ifbp->IFB_MBWp = 0;    // optimize Wrapping
		}
		tlen = ifbp->IFB_MBSize - ifbp->IFB_MBWp;                                                       /* 2b*/
		if ( ( tlen <= len + 2 ) && ( len + 2 < ifbp->IFB_MBRp ) ) {    //if trailing space is too small but
			                                                        //   leading space is sufficiently large
			ifbp->IFB_MBp[ifbp->IFB_MBWp] = 0xFFFF;                 //flag dummy LTV to fill the trailing space
			ifbp->IFB_MBWp = 0;                                     //reset WritePointer to begin of MailBox
			tlen = ifbp->IFB_MBRp;                                  //get new available space size
		}
	}
	dp = &ifbp->IFB_MBp[ifbp->IFB_MBWp];
	if ( len == 0 ) {
		tlen = 0; //;? what is this good for
	}
	if ( len + 2 >= tlen ){                                                                             /* 6 */
		//Do Not ASSERT, this is a normal condition
		IF_TALLY( ifbp->IFB_HCF_Tallies.NoBufMB++ );
		rc = HCF_ERR_LEN;
	} else {
		*dp++ = len;                                    //write Len (= size of T+V in words to MB_Info block
		*dp++ = ltvp->base_typ;                         //write Type to MB_Info block
		ifbp->IFB_MBWp += len + 1;                      //update WritePointer of MailBox
		for ( i = 0; i < ltvp->frag_cnt; i++ ) {                // process each of the fragments
			sp = ltvp->frag_buf[i].frag_addr;
			len = ltvp->frag_buf[i].frag_len;
			while ( len-- ) *dp++ = *sp++;
		}
		ifbp->IFB_MBp[ifbp->IFB_MBWp] = 0;              //to assure get_info for CFG_MB_INFO stops
		ifbp->IFB_MBInfoLen = ifbp->IFB_MBp[ifbp->IFB_MBRp];                                            /* 8 */
	}
	return rc;
} // put_info_mb


/************************************************************************************************************
 *
 *.SUBMODULE     int setup_bap( IFBP ifbp, hcf_16 fid, int offset, int type )
 *.PURPOSE       set up data access to NIC RAM via BAP_1.
 *
 *.ARGUMENTS
 *   ifbp            address of I/F Block
 *   fid             FID/RID
 *   offset          !!even!! offset in FID/RID
 *   type            IO_IN, IO_OUT
 *
 *.RETURNS
 *   HCF_SUCCESS                 O.K
 *   HCF_ERR_NO_NIC              card is removed
 *   HCF_ERR_DEFUNCT_TIME_OUT    Fatal malfunction detected
 *   HCF_ERR_DEFUNCT_.....       if and only if IFB_DefunctStat <> 0
 *
 *.DESCRIPTION
 *
 * A non-zero return status indicates:
 * - the NIC is considered nonoperational, e.g. due to a time-out of some Hermes activity in the past
 * - BAP_1 could not properly be initialized
 * - the card is removed before completion of the data transfer
 * In all other cases, a zero is returned.
 * BAP Initialization failure indicates an H/W error which is very likely to signal complete H/W failure.
 * Once a BAP Initialization failure has occurred all subsequent interactions with the Hermes will return a
 * "defunct" status till the Hermes is re-initialized by means of an hcf_connect.
 *
 * A BAP is a set of registers (Offset, Select and Data) offering read/write access to a particular FID or
 * RID. This access is based on a auto-increment feature.
 * There are two BAPs but these days the HCF uses only BAP_1 and leaves BAP_0 to the PCI Busmastering H/W.
 *
 * The BAP-mechanism is based on the Busy bit in the Offset register (see the Hermes definition). The waiting
 * for Busy must occur between writing the Offset register and accessing the Data register. The
 * implementation to wait for the Busy bit drop after each write to the Offset register, implies that the
 * requirement that the Busy bit is low  before the Select register is written, is automatically met.
 * BAP-setup may be time consuming (e.g. 380 usec for large offsets occurs frequently). The wait for Busy bit
 * drop is protected by a loop counter, which is initialized with IFB_TickIni, which is calibrated in init.
 *
 * The NIC I/F is optimized for word transfer and can only handle word transfer at a word boundary in NIC
 * RAM. The intended solution for transfer of a single byte has multiple H/W flaws. There have been different
 * S/W Workaround strategies. RID access is hcf_16 based by "nature", so no byte access problems.  For Tx/Rx
 * FID access,  the byte logic became obsolete by absorbing it in the double word oriented nature of the MIC
 * feature.
 *
 *
 *.DIAGRAM
 *
 *2: the test on rc checks whether the HCF went into "defunct" mode ( e.g. BAP initialization or a call to
 *   cmd_wait did ever fail).
 *4: the select register and offset register are set
 *   the offset register is monitored till a successful condition (no busy bit) is detected or till the
 *   (calibrated) protection counter expires
 *   If the counter expires, this is reflected in IFB_DefunctStat, so all subsequent calls to setup_bap fail
 *   immediately ( see 2)
 *6: initialization of the carry as used by pet/get_frag
 *8: HREG_OFFSET_ERR is ignored as error because:
 *    a: the Hermes is robust against it
 *    b: it is not known what causes it (probably a bug), hence no strategy can be specified which level is
 *       to handle this error in which way. In the past, it could be induced by the MSF level, e.g. by calling
 *       hcf_rcv_msg while there was no Rx-FID available. Since this is an MSF-error which is caught by ASSERT,
 *       there is no run-time action required by the HCF.
 *   Lumping the Offset error in with the Busy bit error, as has been done in the past turns out to be a
 *   disaster or a life saver, just depending on what the cause of the error is. Since no prediction can be
 *   done about the future, it is "felt" to be the best strategy to ignore this error. One day the code was
 *   accompanied by the following comment:
 *   //  ignore HREG_OFFSET_ERR, someone, supposedly the MSF programmer ;) made a bug. Since we don't know
 *   //  what is going on, we might as well go on - under management pressure - by ignoring it
 *
 *.ENDDOC                          END DOCUMENTATION
 *
 ************************************************************************************************************/
HCF_STATIC int
setup_bap( IFBP ifbp, hcf_16 fid, int offset, int type )
{
	PROT_CNT_INI;
	int rc;

	HCFTRACE( ifbp, HCF_TRACE_STRIO );
	rc = ifbp->IFB_DefunctStat;
	if (rc == HCF_SUCCESS) {                                        /*2*/
		OPW( HREG_SELECT_1, fid );                                                              /*4*/
		OPW( HREG_OFFSET_1, offset );
		if ( type == IO_IN ) {
			ifbp->IFB_CarryIn = 0;
		}
		else ifbp->IFB_CarryOut = 0;
		HCF_WAIT_WHILE( IPW( HREG_OFFSET_1) & HCMD_BUSY );
		HCFASSERT( !( IPW( HREG_OFFSET_1) & HREG_OFFSET_ERR ), MERGE_2( fid, offset ) );         /*8*/
		if ( prot_cnt == 0 ) {
			HCFASSERT( DO_ASSERT, MERGE_2( fid, offset ) );
			rc = ifbp->IFB_DefunctStat = HCF_ERR_DEFUNCT_TIME_OUT;
			ifbp->IFB_CardStat |= CARD_STAT_DEFUNCT;
		}
	}
	HCFTRACE( ifbp, HCF_TRACE_STRIO | HCF_TRACE_EXIT );
	return rc;
} // setup_bap

