summaryrefslogtreecommitdiffstats
path: root/private/ntos/miniport/trantor/source/cardt13b.c
blob: 468aa4e11cf6cb2ea0068d16be14cbcadb7f7b9b (plain) (blame)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
//-----------------------------------------------------------------------
//
//  CARDT13B.C 
//
//  T13B Adapter Specific File
//
//  See also cardtxxx.h, cardtxxx.h may redefine some functions with #defines.
//
//  Revisions:
//      09-01-92  KJB   First.
//      01-08-92  KJB   Now use ScsiPortWrite[Read]BufferUshort routines.
//      02-17-93  JAP   Cleaned comments.
//      02-18-93  KJB   Fixed Cleaned comments. 
//      02-24-93  KJB   Restructured file.
//      03-22-93  JAP   Added arrays for port and IRQ values for NetWare support.
//                          These are conditionally built if NOVELL is defined.
//      03-22-93  KJB   Reorged for functional library interface.
//      03-26-93  JAP   Fixed up typedef and prototype inconsistencies
//      04-22-93  JAP   Added AdapterInterrupts[] and CardGetIRQ().
//      05-05-93  KJB   Added check of T13B_SWITCH register in CheckAdapter.
//                          So we won't interfere with a T160.
//      05-12-93  JAP   Altered CardGetShortName() to return only
//                          the type of card.
//      05-13-93  KJB   Added CardParseCommandString for card specific
//                      standard string parsing across platforms.
//                      Changed CardCheckAdapter to accept an
//                      Initialization info from command line, ie
//                      force bi-directional ports, etc.
//                      All functions that used to take an PBASE_REGISTER
//                      parameter now take PWORKSPACE.  CardCheckAdapter
//                      takes the both the PBASE_REGISTER and the
//                      PWORKSPACE parameters. Auto Request Sense is
//                      now supported.
//      05-14-93  KJB   Removed P3CDoIo, it did not work for scatter gather.
//
//-----------------------------------------------------------------------


#include CARDTXXX_H

//-----------------------------------------------------------------------
// The following table specifies the ports to be checked when searching for
// an adapter.  A zero entry terminates the search.
//-----------------------------------------------------------------------

CONST ULONG AdapterAddresses [] = {0X350, 0X340, 0X250, 0X240, 0};

#ifdef WINNT
//-----------------------------------------------------------------------
//
// The address ranges the card will use.  These are accessed by trantor.c
// to inform NTOS of the resources we are using.
//
//-----------------------------------------------------------------------

CONST CardAddressRange cardAddressRange [] =
{
    {0x00,0x10,FALSE},      // 0x350 - 0x35f
};
#endif


//------------------------------------------------------------------------
// The following table specifies the possible interrupts that
//  can be used by the adapter.  A zero entry terminates the search.
//------------------------------------------------------------------------

CONST USHORT AdapterInterrupts [] =
        {3, 5, 7, 0};


//-----------------------------------------------------------------------
//
//  The following routines are stub routines to provide an entry
//  point for the library.  They reference the correct routines for 
//  the appropriate card. Only these routines may be called from outside
//  the library.  See the rouines they reference for a description of
//  the routines, if the meaning is unclear.
//
//-----------------------------------------------------------------------

//
// The following is used along with the constant structure in card.c
// to define the precise i/o addresses a card will use
//

USHORT CardNumberOfAddressRanges (VOID)
{
    return 1;
}


// the maximum transfer size
// by decreasing this we can get better system performace since
// the data transfer occurs with interrupts disabled, this might be
// decreased for our smaller cards
//  Used only by WINNT

ULONG CardMaxTransferSize (VOID)
{ 
    return (32*1024L);
}


// the following info is for initialization only
// this card is IO mapped

BOOLEAN CardAddressRangeInIoSpace (VOID)
{
    return TRUE;
}


// we use 16 addresses in IO space

USHORT CardAddressRangeLength (VOID)
{
    return 16;
}


// we use interrupts

BOOLEAN CardSupportsInterrupts (VOID)
{
    return TRUE;
}


// default interrupt level

UCHAR CardDefaultInterruptLevel (VOID)
{
    return 5;
}


USHORT CardStartCommandInterrupt (PTSRB t)
{
    return (ScsiStartCommandInterrupt (t));
}


USHORT CardFinishCommandInterrupt (PTSRB t)
{
    return (ScsiFinishCommandInterrupt (t));
}


USHORT CardDoCommand (PTSRB t)
{
    return (ScsiDoCommand (t));
}


//
//  BOOLEAN CardCheckAdapter
//
//  Initializes a workspace for the adapter at this address.
//  Returns TRUE if adapter found.
//
BOOLEAN CardCheckAdapter (PWORKSPACE w, PINIT init)
{
    PADAPTER_INFO g = (PADAPTER_INFO) w;
    UCHAR tmp,tmp0;

    //
    //  Initialize workspace and takes card specific parameter information
    //  Just the BaseIoAddress for the t13b.
    //

    g->BaseIoAddress = init->BaseIoAddress;

    //
    // Do a few sanity check reads to see if there is a possibility an
    // adapter is present at this address.
    //

    N53C400PortGet(g,N5380_CURRENT_DATA,&tmp);
    N53C400PortGet(g,N5380_INITIATOR_COMMAND,&tmp0);

    if (tmp == 0xff && tmp0 == 0xff) {

        // nothing there.
        return FALSE;
    }

    N53C400PortGet(g,N5380_MODE,&tmp);
    N53C400PortGet(g,N5380_TARGET_COMMAND,&tmp0);

    if (((tmp & 0xcf) != 0xcf) || ((tmp0 & 0xcf) != 0xcf)) {

        // mode and command always init as 0xff.  This is not a 13b
        return FALSE;
    }

    // check to see if there is a t160 on this port?
    // try to write to the switch register.

    N53C400PortGet(g,T13B_SWITCH,&tmp0);
    N53C400PortPut(g,T13B_SWITCH,0x5c);
    N53C400PortGet(g,T13B_SWITCH,&tmp);

    // restore original value

    N53C400PortPut(g,T13B_SWITCH,tmp0);

    if (tmp == 0x5c) {
        // we have a t160, return false
        return FALSE;
    }

    return (N53C400CheckAdapter (g));
}

//
//  CardParseCommandString(PINIT p, PCHAR str)
//
//  Parses the command string to get all card specific parameters.
//  Will fill in defaults where no parameters are supplied, or
//  if the str pointer is NULL.
//
//  Returns false if it could not parse the string given.
//
//  Can be used to parse the string piece by piece, by sending
//  the same INIT structure each time.  Send NULL as the string
//  first time to initialize the PINIT structure to the standard defaults.
//
BOOLEAN CardParseCommandString(PINIT init, PCHAR str)
{
    // for now, just fill in some defaults

    init->BaseIoAddress = NULL;

    return TRUE;
}


BOOLEAN CardInterrupt (PADAPTER_INFO g)
{
    return (N5380Interrupt (g));
}


void CardEnableInterrupt (PADAPTER_INFO g)
{
    N53C400EnableInterrupt (g);
}


void CardDisableInterrupt (PADAPTER_INFO g)
{
    N53C400DisableInterrupt (g);
}


void CardResetBus (PADAPTER_INFO g)
{
    N53C400ResetBus (g);
}

PUCHAR CardGetName (VOID)
{
    return "T13B SCSI Host Adapter";
}


PUCHAR CardGetShortName (VOID) 
{
    return "T130B";
}


UCHAR CardGetType (VOID)
{
    return CARDTYPE_T130B;
}


    #ifdef NOVELL
//-----------------------------------------------------------------------
//      NOVELL Port and IRQ Tables
//
//  Novell needs these defined in a specific format:
//  long integer array with the number of entries at head of list.
//-----------------------------------------------------------------------

// The following table specifies the port values Novell will prompt
//  the user with if no port is specified on the LOAD command line.

CONST ULONG possible_port [] = {4, 0X350, 0X340, 0X250, 0X240};

// The following table specifies the IRQ values Novell will prompt
//  the user with if no IRQ is specified on the LOAD command line.

CONST ULONG possible_irq [] = {3, 3, 5, 7};

    #endif  // #ifdef NOVELL