1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
ushort.c
Abstract:
The following is a workaround for 386 cc optimization. The 386 cc generates
code that will optimize out one of the bytes of a 16-bit "OR" operation
if the constant that is part of the "OR" has a byte equal to zero. For
instance, "(USHORT)xx |= SCBINTCX;" will generate code that will "OR"
0x80 with (UCHAR)((PUCHAR)&xx +1) which causes hardware problems with
pc586 card.
The workaround is to replace #defines in pc586hrd.h with the following
USHORTS
--*/
#include <ntos.h>
#include <ndis.h>
USHORT SCBINTMSK = 0xf000; // SCB STAT bit mask
USHORT SCBINTCX = 0x8000; // CX bit, CU finished a command with "I" set
USHORT SCBINTFR = 0x4000; // FR bit, RU finished receiving a frame
USHORT SCBINTCNA = 0x2000; // CNA bit, CU not active
USHORT SCBINTRNR = 0x1000; // RNR bit, RU not ready
// command unit status bits
USHORT SCBCUSMSK = 0x0700; // SCB CUS bit mask
USHORT SCBCUSIDLE = 0x0000; // CU idle
USHORT SCBCUSSUSPND= 0x0100; // CU suspended
USHORT SCBCUSACTV = 0x0200; // CU active
// receive unit status bits
USHORT SCBRUSMSK = 0x0070; // SCB RUS bit mask
USHORT SCBRUSIDLE = 0x0000; // RU idle
USHORT SCBRUSSUSPND = 0x0010; // RU suspended
USHORT SCBRUSNORESRC = 0x0020; // RU no resource
USHORT SCBRUSREADY = 0x0040; // RU ready
// bits used to acknowledge an interrupt from 586
USHORT SCBACKMSK = 0xf000; // SCB ACK bit mask
USHORT SCBACKCX = 0x8000; // ACKCX, acknowledge a completed cmd
USHORT SCBACKFR = 0x4000; // ACKFR, acknowledge a frame reception
USHORT SCBACKCNA = 0x2000; // ACKCNA, acknowledge CU not active
USHORT SCBACKRNR = 0x1000; // ACKRNR, acknowledge RU not ready
// 586 CU commands
USHORT SCBCUCMSK = 0x0700; // SCB CUC bit mask
USHORT SCBCUCSTRT = 0x0100; // start CU
USHORT SCBCUCRSUM = 0x0200; // resume CU
USHORT SCBCUCSUSPND= 0x0300; // suspend CU
USHORT SCBCUCABRT = 0x0400; // abort CU
// 586 RU commands
USHORT SCBRUCMSK = 0x0070; // SCB RUC bit mask
USHORT SCBRUCSTRT = 0x0010; // start RU
USHORT SCBRUCRSUM = 0x0020; // resume RU
USHORT SCBRUCSUSPND = 0x0030; // suspend RU
USHORT SCBRUCABRT = 0x0040; // abort RU
USHORT SCBRESET = 0x0080; // software reset of 586
// USHORT's for the command and descriptor blocks
USHORT CSCMPLT = 0x8000; // C bit, completed
USHORT CSBUSY = 0x4000; // B bit, Busy
USHORT CSOK = 0x2000; // OK bit, error free
USHORT CSABORT = 0x1000; // A bit, abort
USHORT CSEL = 0x8000; // EL bit, end of list
USHORT CSSUSPND = 0x4000; // S bit, suspend
USHORT CSINT = 0x2000; // I bit, interrupt
USHORT CSSTATMSK = 0x3fff; // Command status mask
USHORT CSEOL = 0xffff; // set for fdrbdofst on unattached FDs
USHORT CSEOF = 0x8000; // EOF (End Of Frame) in the TBD and RBD
USHORT CSRBDCNTMSK = 0x3fff; // actual count mask in RBD
// second level commands
USHORT CSCMDMSK = 0x07; // command bits mask
USHORT CSCMDNOP = 0x00; // NOP
USHORT CSCMDIASET = 0x01; // Individual Address Set up
USHORT CSCMDCONF = 0x02; // Configure
USHORT CSCMDMCSET = 0x03; // Multi-Cast Setup
USHORT CSCMDXMIT = 0x04; // transmit
USHORT CSCMDTDR = 0x05; // Time Domain Reflectomete
USHORT CSCMDDUMP = 0x06; // dump
USHORT CSCMDDGNS = 0x07; // diagnose
|