]>
git.ipfire.org Git - ipfire-2.x.git/blob - src/install+setup/install/pcmcia.c
2 * PCMCIA bridge device probe
4 * This file is part of the IPCop Firewall.
6 * IPCop is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * IPCop is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with IPCop; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * The initial developer of the original code is David A. Hinds
21 * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
22 * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
24 * $Id: pcmcia.c,v 1.6.2.2 2005/01/31 15:49:43 alanh Exp $
39 /*====================================================================*/
42 u_short vendor
, device
;
48 { 0x1013, 0x1100, "i82365", "Cirrus Logic CL 6729" },
49 { 0x1013, 0x1110, "yenta_socket", "Cirrus Logic PD 6832" },
50 { 0x10b3, 0xb106, "yenta_socket", "SMC 34C90" },
51 { 0x1180, 0x0465, "yenta_socket", "Ricoh RL5C465" },
52 { 0x1180, 0x0466, "yenta_socket", "Ricoh RL5C466" },
53 { 0x1180, 0x0475, "yenta_socket", "Ricoh RL5C475" },
54 { 0x1180, 0x0476, "yenta_socket", "Ricoh RL5C476" },
55 { 0x1180, 0x0477, "yenta_socket", "Ricoh RL5C477" },
56 { 0x1180, 0x0478, "yenta_socket", "Ricoh RL5C478" },
57 { 0x104c, 0xac12, "yenta_socket", "Texas Instruments PCI1130" },
58 { 0x104c, 0xac13, "yenta_socket", "Texas Instruments PCI1031" },
59 { 0x104c, 0xac15, "yenta_socket", "Texas Instruments PCI1131" },
60 { 0x104c, 0xac1a, "yenta_socket", "Texas Instruments PCI1210" },
61 { 0x104c, 0xac1e, "yenta_socket", "Texas Instruments PCI1211" },
62 { 0x104c, 0xac17, "yenta_socket", "Texas Instruments PCI1220" },
63 { 0x104c, 0xac19, "yenta_socket", "Texas Instruments PCI1221" },
64 { 0x104c, 0xac1c, "yenta_socket", "Texas Instruments PCI1225" },
65 { 0x104c, 0xac16, "yenta_socket", "Texas Instruments PCI1250" },
66 { 0x104c, 0xac1d, "yenta_socket", "Texas Instruments PCI1251A" },
67 { 0x104c, 0xac1f, "yenta_socket", "Texas Instruments PCI1251B" },
68 { 0x104c, 0xac50, "yenta_socket", "Texas Instruments PCI1410" },
69 { 0x104c, 0xac51, "yenta_socket", "Texas Instruments PCI1420" },
70 { 0x104c, 0xac1b, "yenta_socket", "Texas Instruments PCI1450" },
71 { 0x104c, 0xac52, "yenta_socket", "Texas Instruments PCI1451" },
72 { 0x104c, 0xac56, "yenta_socket", "Texas Instruments PCI1510" },
73 { 0x104c, 0xac55, "yenta_socket", "Texas Instruments PCI1520" },
74 { 0x104c, 0xac54, "yenta_socket", "Texas Instruments PCI1620" },
75 { 0x104c, 0xac41, "yenta_socket", "Texas Instruments PCI4410" },
76 { 0x104c, 0xac40, "yenta_socket", "Texas Instruments PCI4450" },
77 { 0x104c, 0xac42, "yenta_socket", "Texas Instruments PCI4451" },
78 { 0x104c, 0xac44, "yenta_socket", "Texas Instruments PCI4510" },
79 { 0x104c, 0xac46, "yenta_socket", "Texas Instruments PCI4520" },
80 { 0x104c, 0xac49, "yenta_socket", "Texas Instruments PCI7410" },
81 { 0x104c, 0xac47, "yenta_socket", "Texas Instruments PCI7510" },
82 { 0x104c, 0xac48, "yenta_socket", "Texas Instruments PCI7610" },
83 { 0x1217, 0x6729, "i82365", "O2 Micro 6729" },
84 { 0x1217, 0x673a, "i82365", "O2 Micro 6730" },
85 { 0x1217, 0x6832, "yenta_socket", "O2 Micro 6832/6833" },
86 { 0x1217, 0x6836, "yenta_socket", "O2 Micro 6836/6860" },
87 { 0x1217, 0x6872, "yenta_socket", "O2 Micro 6812" },
88 { 0x1217, 0x6925, "yenta_socket", "O2 Micro 6922" },
89 { 0x1217, 0x6933, "yenta_socket", "O2 Micro 6933" },
90 { 0x1217, 0x6972, "yenta_socket", "O2 Micro 6912" },
91 { 0x1179, 0x0603, "i82365", "Toshiba ToPIC95-A" },
92 { 0x1179, 0x060a, "yenta_socket", "Toshiba ToPIC95-B" },
93 { 0x1179, 0x060f, "yenta_socket", "Toshiba ToPIC97" },
94 { 0x1179, 0x0617, "yenta_socket", "Toshiba ToPIC100" },
95 { 0x119b, 0x1221, "i82365", "Omega Micro 82C092G" },
96 { 0x8086, 0x1221, "i82092", "Intel 82092AA_0" },
97 { 0x8086, 0x1222, "i82092", "Intel 82092AA_1" },
98 { 0x1524, 0x1211, "yenta_socket", "ENE 1211" },
99 { 0x1524, 0x1225, "yenta_socket", "ENE 1225" },
100 { 0x1524, 0x1410, "yenta_socket", "ENE 1410" },
101 { 0x1524, 0x1420, "yenta_socket", "ENE 1420" },
103 #define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t))
105 static char * pci_probe()
107 char s
[256], *modname
= NULL
;
108 u_int device
, vendor
, i
;
111 if ((f
= fopen("/proc/bus/pci/devices", "r")) != NULL
) {
112 while (fgets(s
, 256, f
) != NULL
) {
113 u_int n
= strtoul(s
+5, NULL
, 16);
114 vendor
= (n
>> 16); device
= (n
& 0xffff);
115 for (i
= 0; i
< PCI_COUNT
; i
++)
116 if ((vendor
== pci_id
[i
].vendor
) &&
117 (device
== pci_id
[i
].device
)) break;
120 modname
= pci_id
[i
].modname
;
129 /*====================================================================*/
132 typedef u_short ioaddr_t
;
134 static ioaddr_t i365_base
= 0x03e0;
136 static u_char
i365_get(u_short sock
, u_short reg
)
138 u_char val
= I365_REG(sock
, reg
);
139 outb(val
, i365_base
); val
= inb(i365_base
+1);
143 static void i365_set(u_short sock
, u_short reg
, u_char data
)
145 u_char val
= I365_REG(sock
, reg
);
146 outb(val
, i365_base
); outb(data
, i365_base
+1);
149 static void i365_bset(u_short sock
, u_short reg
, u_char mask
)
151 u_char d
= i365_get(sock
, reg
);
153 i365_set(sock
, reg
, d
);
156 static void i365_bclr(u_short sock
, u_short reg
, u_char mask
)
158 u_char d
= i365_get(sock
, reg
);
160 i365_set(sock
, reg
, d
);
165 int val
, slot
, sock
, done
;
166 char *name
= "i82365sl";
168 ioperm(i365_base
, 4, 1);
170 for (slot
= 0; slot
< 2; slot
++) {
171 for (sock
= done
= 0; sock
< 2; sock
++) {
172 val
= i365_get(sock
, I365_IDENT
);
175 name
= "i82365sl A step";
178 name
= "i82365sl B step";
181 name
= "VLSI 82C146";
183 case 0x88: case 0x89: case 0x8a:
186 case 0x8b: case 0x8c:
193 if (done
&& sock
) break;
201 if ((sock
== 2) && (strcmp(name
, "VLSI 82C146") == 0))
202 name
= "i82365sl DF";
204 /* Check for Vadem chips */
205 outb(0x0e, i365_base
);
206 outb(0x37, i365_base
);
207 i365_bset(0, VG468_MISC
, VG468_MISC_VADEMREV
);
208 val
= i365_get(0, I365_IDENT
);
209 if (val
& I365_IDENT_VADEM
) {
211 name
= "Vadem VG-468";
213 name
= "Vadem VG-469";
214 i365_bclr(0, VG468_MISC
, VG468_MISC_VADEMREV
);
217 /* Check for Cirrus CL-PD67xx chips */
218 i365_set(0, PD67_CHIP_INFO
, 0);
219 val
= i365_get(0, PD67_CHIP_INFO
);
220 if ((val
& PD67_INFO_CHIP_ID
) == PD67_INFO_CHIP_ID
) {
221 val
= i365_get(0, PD67_CHIP_INFO
);
222 if ((val
& PD67_INFO_CHIP_ID
) == 0) {
223 if (val
& PD67_INFO_SLOTS
)
224 name
= "Cirrus CL-PD672x";
226 name
= "Cirrus CL-PD6710";
229 i365_set(0, PD67_EXT_INDEX
, 0xe5);
230 if (i365_get(0, PD67_EXT_INDEX
) != 0xe5)
231 name
= "VIA VT83C469";
240 /*====================================================================*/
243 static u_short
tcic_getw(ioaddr_t base
, u_char reg
)
245 u_short val
= inw(base
+reg
);
249 static void tcic_setw(ioaddr_t base
, u_char reg
, u_short data
)
251 outw(data
, base
+reg
);
254 int tcic_probe_at(ioaddr_t base
)
259 /* Anything there?? */
260 for (i
= 0; i
< 0x10; i
+= 2)
261 if (tcic_getw(base
, i
) == 0xffff)
264 /* Try to reset the chip */
265 tcic_setw(base
, TCIC_SCTRL
, TCIC_SCTRL_RESET
);
266 tcic_setw(base
, TCIC_SCTRL
, 0);
268 /* Can we set the addr register? */
269 old
= tcic_getw(base
, TCIC_ADDR
);
270 tcic_setw(base
, TCIC_ADDR
, 0);
271 if (tcic_getw(base
, TCIC_ADDR
) != 0) {
272 tcic_setw(base
, TCIC_ADDR
, old
);
276 tcic_setw(base
, TCIC_ADDR
, 0xc3a5);
277 if (tcic_getw(base
, TCIC_ADDR
) != 0xc3a5)
283 int tcic_probe(ioaddr_t base
)
289 sock
= tcic_probe_at(base
);
300 /*====================================================================*/
302 char * initialize_pcmcia (void)
305 ioaddr_t tcic_base
= TCIC_BASE
;
310 if ((pcmcia
= pci_probe())) {
313 } else if (i365_probe() == 0) {
314 len
= strlen("i82365") + 1;
315 pcmcia
= calloc(1, len
);
316 strncpy(pcmcia
, "i82365", len
);
317 } else if (tcic_probe(tcic_base
) == 0) {
318 len
= strlen("tcic") + 1;
319 pcmcia
= calloc(1, len
);
320 strncpy(pcmcia
, "tcic", len
);
323 /* Detect ISAPNP based i82365 controllers */
325 mysystem("modprobe i82365");
326 if ((f
= fopen("/proc/bus/pccard/00/info", "r"))) {
327 len
= strlen("i82365") + 1;
328 pcmcia
= calloc(1, len
);
329 strncpy(pcmcia
, "i82365", len
);