369 lines
9.6 KiB
C
369 lines
9.6 KiB
C
|
/*
|
||
|
************************************************************************
|
||
|
*
|
||
|
* SETTINGS.h
|
||
|
*
|
||
|
*
|
||
|
* Portions Copyright (C) 1996-1998 National Semiconductor Corp.
|
||
|
* All rights reserved.
|
||
|
* Copyright (C) 1996-1998 Microsoft Corporation. All Rights Reserved.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
*************************************************************************
|
||
|
*/
|
||
|
|
||
|
#ifndef SETTINGS_H
|
||
|
#define SETTINGS_H
|
||
|
|
||
|
#include "dongle.h"
|
||
|
|
||
|
#if DBG /* { */
|
||
|
|
||
|
/*
|
||
|
* The DBG_ADD_PKT_ID flag causes the miniport to add/delete a packet
|
||
|
* id to each packet. This is only for debugging purposes; it makes
|
||
|
* the miniport INCOMPATIBLE with all others.
|
||
|
*/
|
||
|
//#define DBG_ADD_PKT_ID
|
||
|
|
||
|
|
||
|
#ifdef DBG_ADD_PKT_ID
|
||
|
extern BOOLEAN addPktIdOn;
|
||
|
#endif
|
||
|
|
||
|
typedef enum {
|
||
|
DBG_ERR = (1 << 0),
|
||
|
DBG_STAT = (1 << 1),
|
||
|
DBG_MSG = (1 << 2),
|
||
|
DBG_OUT = (1 << 2),
|
||
|
DBG_BUF = (1 << 3),
|
||
|
DBG_PACKET = (1 << 4),
|
||
|
DBG_PKT = (1 << 4),
|
||
|
|
||
|
// Added so we can look at an ndis buffer.
|
||
|
DBG_NDIS_PACKET = (1 << 5),
|
||
|
|
||
|
DBG_DUMPLOG = (1 << 6),
|
||
|
DBG_LOG = (1 << 7),
|
||
|
DBG_ALL = (DBG_ERR|DBG_STAT|DBG_MSG|DBG_BUF|DBG_PACKET),
|
||
|
DBG_SIR_MODE = (1 << 8),
|
||
|
DBG_FIR_MODE = (1 << 9),
|
||
|
DBG_TX = (1 << 10),
|
||
|
DBG_RX = (1 << 11),
|
||
|
DBG_DMA = (1 << 12),
|
||
|
DBG_ISR = (1 << 13),
|
||
|
DBG_TRACE_TX = (1 << 14)
|
||
|
};
|
||
|
|
||
|
// extern ULONG _cdecl DbgPrint(PCHAR Format, ...);
|
||
|
extern UINT dbgOpt;
|
||
|
|
||
|
|
||
|
#define DBG_NDIS_RESULT_STR(_ndisResult) \
|
||
|
((PUCHAR) ((_ndisResult == NDIS_STATUS_SUCCESS) ? \
|
||
|
"NDIS_STATUS_SUCCESS" : (_ndisResult == NDIS_STATUS_FAILURE) ? \
|
||
|
"NDIS_STATUS_FAILURE" : (_ndisResult == NDIS_STATUS_PENDING) ? \
|
||
|
"NDIS_STATUS_PENDING" : "NDIS_STATUS_???"))
|
||
|
|
||
|
#define DBGPRINT(dbgprint_params_in_parens) \
|
||
|
{ \
|
||
|
DbgPrint("NSC: "); \
|
||
|
DbgPrint dbgprint_params_in_parens; \
|
||
|
DbgPrint("\r\n"); \
|
||
|
}
|
||
|
|
||
|
#define DEBUGMSG(flags, dbgprint_params_in_parens) \
|
||
|
if (dbgOpt & (flags)) \
|
||
|
{ \
|
||
|
DbgPrint dbgprint_params_in_parens; \
|
||
|
}
|
||
|
|
||
|
#define DEBUGFIR(flags, dbgprint_params_in_parens) \
|
||
|
if (dbgOpt & DBG_FIR_MODE && dbgOpt & (flags)) \
|
||
|
{ \
|
||
|
DbgPrint dbgprint_params_in_parens; \
|
||
|
}
|
||
|
|
||
|
#define DBGOUT(dbgprint_params_in_parens) \
|
||
|
if (dbgOpt & DBG_MSG) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define DBGERR(dbgprint_params_in_parens) \
|
||
|
if (dbgOpt & DBG_ERR) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define DBGSTAT(dbgprint_params_in_parens) \
|
||
|
if (dbgOpt & DBG_STAT) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define DBGPKT(dbgprint_params_in_parens) \
|
||
|
if (dbgOpt & DBG_PACKET) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
DBGPRINT(dbgprint_params_in_parens); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#define DBG_D(i) DbgPrint("IRSIR:"#i"==%d\n", (i))
|
||
|
#define DBG_X(x) DbgPrint("IRSIR:"#x"==0x%0*X\n", sizeof(x)*2, ((ULONG_PTR)(x))&((1<<(sizeof(x)*8))-1) )
|
||
|
#define DBG_UNISTR(s) DbgPrint("IRSIR:"#s"==%wZ\n", (s))
|
||
|
|
||
|
|
||
|
extern VOID DBG_NDIS_Buffer(PNDIS_BUFFER ndisBuf);
|
||
|
|
||
|
#define DBG_NDIS_BUFFER(Ndis_buffer) \
|
||
|
if (dbgOpt & DBG_NDIS_PACKET) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
DBG_NDIS_Buffer(Ndis_buffer); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
DBG_NDIS_Buffer(Ndis_buffer); \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
extern VOID DBG_PrintBuf(PUCHAR bufptr, UINT buflen);
|
||
|
|
||
|
#define DBGPRINTBUF(bufptr, buflen) \
|
||
|
if (dbgOpt & DBG_BUF) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
DBG_PrintBuf((PUCHAR)(bufptr), (UINT)(buflen)); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
DBG_PrintBuf((PUCHAR)(bufptr), (UINT)(buflen)); \
|
||
|
} \
|
||
|
}
|
||
|
/*
|
||
|
* LOGGING stuff
|
||
|
*/
|
||
|
struct logEntry {
|
||
|
char *msg;
|
||
|
LONGLONG usec;
|
||
|
UINT val;
|
||
|
};
|
||
|
|
||
|
#define LOG_LENGTH 10000
|
||
|
|
||
|
extern UINT dbgLogIndex;
|
||
|
extern struct logEntry dbgLog[];
|
||
|
|
||
|
#define LOG(logmsg, val) \
|
||
|
{ \
|
||
|
if (dbgOpt & DBG_LOG) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
LogEvent((logmsg), (UINT)(val)); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
LogEvent((logmsg), (UINT)(val)); \
|
||
|
} \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_DUMPLOG) { \
|
||
|
if ((DebugSpeed > MAX_SIR_SPEED) && \
|
||
|
(dbgOpt & DBG_FIR_MODE)) { \
|
||
|
DumpLog(); \
|
||
|
} \
|
||
|
else if (dbgOpt & DBG_SIR_MODE) { \
|
||
|
DumpLog(); \
|
||
|
} \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#else /* } { */
|
||
|
|
||
|
#define DbgBreakPoint()
|
||
|
#define DBGOUT(dbgprint_params_in_parens)
|
||
|
#define DBGERR(dbgprint_params_in_parens)
|
||
|
#define DBGPRINTBUF(bufptr, buflen)
|
||
|
#define DBGSTAT(dbgprint_params_in_parens)
|
||
|
#define DBGPKT(dbgprint_params_in_parens)
|
||
|
#define DBG_NDIS_RESULT_STR(_ndisResult)
|
||
|
#define LOG(logmsg, val)
|
||
|
#define DEBUGFIR(flags, dbgprint_params_in_parens)
|
||
|
#define DEBUGMSG(flags, dbgprint_params_in_parens)
|
||
|
#define DBG_D(i)
|
||
|
#define DBG_X(x)
|
||
|
#define DBG_UNISTR(s)
|
||
|
|
||
|
|
||
|
|
||
|
#endif /* } #if DBG */
|
||
|
|
||
|
enum baudRates {
|
||
|
|
||
|
/* Slow IR */
|
||
|
BAUDRATE_2400 = 0,
|
||
|
BAUDRATE_9600,
|
||
|
BAUDRATE_19200,
|
||
|
BAUDRATE_38400,
|
||
|
BAUDRATE_57600,
|
||
|
BAUDRATE_115200,
|
||
|
|
||
|
/* Medium IR */
|
||
|
BAUDRATE_576000,
|
||
|
BAUDRATE_1152000,
|
||
|
|
||
|
/* Fast IR */
|
||
|
BAUDRATE_4000000,
|
||
|
|
||
|
NUM_BAUDRATES /* must be last */
|
||
|
};
|
||
|
|
||
|
#define DEFAULT_BAUDRATE BAUDRATE_115200
|
||
|
|
||
|
#define ALL_SLOW_IRDA_SPEEDS ( \
|
||
|
NDIS_IRDA_SPEED_2400 | NDIS_IRDA_SPEED_9600 | \
|
||
|
NDIS_IRDA_SPEED_19200 | NDIS_IRDA_SPEED_38400 | \
|
||
|
NDIS_IRDA_SPEED_57600 | NDIS_IRDA_SPEED_115200)
|
||
|
|
||
|
#define ALL_IRDA_SPEEDS ( \
|
||
|
ALL_SLOW_IRDA_SPEEDS | NDIS_IRDA_SPEED_1152K | NDIS_IRDA_SPEED_4M)
|
||
|
|
||
|
|
||
|
#define MAX_SIR_SPEED 115200
|
||
|
#define MIN_FIR_SPEED 4000000
|
||
|
|
||
|
#define DEFAULT_BOFS_CODE BOFS_48
|
||
|
#define MAX_NUM_EXTRA_BOFS 48
|
||
|
#define DEFAULT_NUM_EXTRA_BOFS MAX_NUM_EXTRA_BOFS
|
||
|
|
||
|
|
||
|
#define DEFAULT_TURNAROUND_usec 1000
|
||
|
|
||
|
typedef struct {
|
||
|
enum baudRates tableIndex;
|
||
|
UINT bitsPerSec;
|
||
|
UINT ndisCode; // bitmask element
|
||
|
} baudRateInfo;
|
||
|
|
||
|
#define DEFAULT_BAUD_RATE 9600
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* This is the largest IR packet size (counting _I_ field only,
|
||
|
* and not counting ESC characters) that we handle.
|
||
|
*
|
||
|
* Note: There is an apparent bug with the NSC part. It cannot transfer
|
||
|
* more than 2048 bytes TOTAL, including the 2-byte header. Unfortunately,
|
||
|
* the actual frame size will be 2 bytes more than what we indicate to the
|
||
|
* protocol. We will indicate 2046, but the protocol will actually jump down
|
||
|
* to 1024, the next step down in frame sizes.
|
||
|
*/
|
||
|
#define MAX_I_DATA_SIZE 2048
|
||
|
//#define MAX_I_DATA_SIZE 1024
|
||
|
#define MAX_NDIS_DATA_SIZE (IR_ADDR_SIZE+IR_CONTROL_SIZE+MAX_I_DATA_SIZE)
|
||
|
|
||
|
#ifdef DBG_ADD_PKT_ID
|
||
|
#pragma message("WARNING: INCOMPATIBLE DEBUG VERSION")
|
||
|
#define MAX_RCV_DATA_SIZE (MAX_NDIS_DATA_SIZE+SLOW_IR_FCS_SIZE+2)
|
||
|
#define MAX_DMA_XMIT_DATA_SIZE (MAX_NDIS_DATA_SIZE+SLOW_IR_FCS_SIZE+2)
|
||
|
#else
|
||
|
#define MAX_RCV_DATA_SIZE (MAX_NDIS_DATA_SIZE+SLOW_IR_FCS_SIZE)
|
||
|
#define MAX_DMA_XMIT_DATA_SIZE (MAX_NDIS_DATA_SIZE+SLOW_IR_FCS_SIZE)
|
||
|
#endif
|
||
|
|
||
|
#define MAX_TX_PACKETS 7
|
||
|
#define MAX_RX_PACKETS 7
|
||
|
/*
|
||
|
* We loop an extra time in the receive FSM in order to see EOF after the
|
||
|
* last data byte; so we need some extra space in readBuf in case we then
|
||
|
* get garbage instead.
|
||
|
*/
|
||
|
#define RCV_BUFFER_SIZE (MAX_RCV_DATA_SIZE +4+sizeof(LIST_ENTRY))
|
||
|
#define RCV_DMA_SIZE ((MAX_RX_PACKETS+2) * (MAX_RCV_DATA_SIZE + FAST_IR_FCS_SIZE))
|
||
|
|
||
|
#define RCV_BUF_TO_LIST_ENTRY(b) ((PLIST_ENTRY)((PUCHAR)(b)-sizeof(LIST_ENTRY)))
|
||
|
#define LIST_ENTRY_TO_RCV_BUF(e) ((PVOID)((PUCHAR)(e)+sizeof(LIST_ENTRY)))
|
||
|
|
||
|
#if (RCV_DMA_SIZE > 0x10000)
|
||
|
#error "RCV_DMA_SIZE can't span physical segments"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*
|
||
|
* We allocate buffers twice as large as the max rcv size to accomodate ESC
|
||
|
* characters and BOFs, etc. Recall that in the worst possible case, the
|
||
|
* data contains all BOF/EOF/ESC characters, in which case we must expand
|
||
|
* it to twice its original size.
|
||
|
*/
|
||
|
#define MAX_POSSIBLE_IR_PACKET_SIZE_FOR_DATA(dataLen) ( \
|
||
|
(dataLen) * 2 + (MAX_NUM_EXTRA_BOFS + 1) * \
|
||
|
SLOW_IR_BOF_SIZE + IR_ADDR_SIZE + IR_CONTROL_SIZE + \
|
||
|
SLOW_IR_FCS_SIZE + SLOW_IR_EOF_SIZE)
|
||
|
|
||
|
#define MAX_IRDA_DATA_SIZE \
|
||
|
MAX_POSSIBLE_IR_PACKET_SIZE_FOR_DATA(MAX_I_DATA_SIZE)
|
||
|
|
||
|
/*
|
||
|
* When FCS is computed on an IR packet with FCS appended, the result
|
||
|
* should be this constant.
|
||
|
*/
|
||
|
#define GOOD_FCS ((USHORT) ~0xf0b8)
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Sizes of IrLAP frame fields:
|
||
|
* Beginning Of Frame (BOF)
|
||
|
* End Of Frame (EOF)
|
||
|
* Address
|
||
|
* Control
|
||
|
*/
|
||
|
#define IR_ADDR_SIZE 1
|
||
|
#define IR_CONTROL_SIZE 1
|
||
|
|
||
|
#define SLOW_IR_BOF_TYPE UCHAR
|
||
|
#define SLOW_IR_BOF_SIZE sizeof(SLOW_IR_BOF_TYPE)
|
||
|
#define SLOW_IR_EXTRA_BOF_TYPE UCHAR
|
||
|
#define SLOW_IR_EXTRA_BOF_SIZE sizeof(SLOW_IR_EXTRA_BOF_TYPE)
|
||
|
#define SLOW_IR_EOF_TYPE UCHAR
|
||
|
#define SLOW_IR_EOF_SIZE sizeof(SLOW_IR_EOF_TYPE)
|
||
|
#define SLOW_IR_FCS_TYPE USHORT
|
||
|
#define SLOW_IR_FCS_SIZE sizeof(SLOW_IR_FCS_TYPE)
|
||
|
#define SLOW_IR_BOF 0xC0
|
||
|
/* don't use 0xFF, it breaks some HP printers! */
|
||
|
#define SLOW_IR_EXTRA_BOF 0xC0
|
||
|
#define SLOW_IR_EOF 0xC1
|
||
|
#define SLOW_IR_ESC 0x7D
|
||
|
#define SLOW_IR_ESC_COMP 0x20
|
||
|
|
||
|
#define MEDIUM_IR_BOF 0x7E
|
||
|
#define MEDIUM_IR_EOF 0x7E
|
||
|
#define MEDIUM_IR_FCS_SIZE 2
|
||
|
|
||
|
#define FAST_IR_FCS_SIZE 4
|
||
|
#define FAST_IR_EOF_SIZE 1
|
||
|
|
||
|
|
||
|
#define MIN(a,b) (((a) <= (b)) ? (a) : (b))
|
||
|
#define MAX(a,b) (((a) >= (b)) ? (a) : (b))
|
||
|
|
||
|
|
||
|
#endif SETTINGS_H
|