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
|
/*
* Product specific probe and attach routines for:
* Buslogic BT946 and BT956 SCSI controllers
*
* Copyright (c) 1995 Justin T. Gibbs
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice immediately at the beginning of the file, without modification,
* this list of conditions, and the following disclaimer.
* 2. 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.
* 3. Absolutely no warranty of function or purpose is made by the author
* Justin T. Gibbs.
* 4. Modifications may be freely made to this file if the above conditions
* are met.
*
* $Id: bt9xx.c,v 1.2 1995/12/14 09:53:56 phk Exp $
*/
#include <pci.h>
#if NPCI > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <scsi/scsi_all.h>
#include <scsi/scsiconf.h>
#include <pci/pcireg.h>
#include <pci/pcivar.h>
#include <i386/scsi/btreg.h>
/* XXX Need more device IDs */
#define PCI_BASEADR0 PCI_MAP_REG_START
#define PCI_DEVICE_ID_BUSLOGIC_946 0x104B1040ul
static char* bt_pci_probe __P((pcici_t tag, pcidi_t type));
static void bt_pci_attach __P((pcici_t config_id, int unit));
static int bt_pci_intr __P((void *arg));
static struct pci_device bt_pci_driver = {
"bt",
bt_pci_probe,
bt_pci_attach,
&bt_unit,
NULL
};
DATA_SET (pcidevice_set, bt_pci_driver);
static char*
bt_pci_probe (pcici_t tag, pcidi_t type)
{
switch(type) {
case PCI_DEVICE_ID_BUSLOGIC_946:
return ("Buslogic 946 SCSI host adapter");
break;
default:
break;
}
return (0);
}
static void
bt_pci_attach(config_id, unit)
pcici_t config_id;
int unit;
{
u_long io_port;
unsigned opri = 0;
struct bt_data *bt;
if(!(io_port = pci_conf_read(config_id, PCI_BASEADR0)))
return;
/*
* The first bit of PCI_BASEADR0 is always
* set hence we mask it off.
*/
io_port &= 0xfffffffe;
if(!(bt = bt_alloc(unit, io_port)))
return; /* XXX PCI code should take return status */
if(!(pci_map_int(config_id, bt_pci_intr, (void *)bt, &bio_imask))) {
bt_free(bt);
return;
}
/*
* Protect ourself from spurrious interrupts during
* intialization and attach. We should really rely
* on interrupts during attach, but we don't have
* access to our interrupts during ISA probes, so until
* that changes, we mask our interrupts during attach
* too.
*/
opri = splbio();
if(bt_init(bt)){
bt_free(bt);
splx(opri);
return; /* XXX PCI code should take return status */
}
bt_attach(bt);
splx(opri);
return;
}
/*
* Handle an PCI interrupt.
* XXX should go away as soon as PCI interrupt handlers
* return void.
*/
static int
bt_pci_intr(arg)
void *arg;
{
bt_intr(arg);
return (1); /*
* XXX: Always say we handle the interrupt.
* won't work with edge-triggered ints.
*/
}
#endif /* NPCI > 0 */
|