]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i4b/layer1/isic/i4b_isic_pnp.c
This commit was generated by cvs2svn to compensate for changes in r127175,
[FreeBSD/FreeBSD.git] / sys / i4b / layer1 / isic / i4b_isic_pnp.c
1 /*
2  *   Copyright (c) 1998 Eivind Eklund. All rights reserved.
3  *
4  *   Copyright (c) 1998, 1999 German Tischler. All rights reserved.
5  *
6  *   Copyright (c) 1998, 2001 Hellmuth Michaelis. All rights reserved. 
7  *
8  *   Redistribution and use in source and binary forms, with or without
9  *   modification, are permitted provided that the following conditions
10  *   are met:
11  *
12  *   1. Redistributions of source code must retain the above copyright
13  *      notice, this list of conditions and the following disclaimer.
14  *   2. Redistributions in binary form must reproduce the above copyright
15  *      notice, this list of conditions and the following disclaimer in the
16  *      documentation and/or other materials provided with the distribution.
17  *   3. Neither the name of the author nor the names of any co-contributors
18  *      may be used to endorse or promote products derived from this software
19  *      without specific prior written permission.
20  *   4. Altered versions must be plainly marked as such, and must not be
21  *      misrepresented as being the original software and/or documentation.
22  *   
23  *   THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24  *   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  *   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  *   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
27  *   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  *   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  *   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  *   SUCH DAMAGE.
34  *
35  *---------------------------------------------------------------------------
36  *
37  *      i4b_isic_pnp.c - i4b pnp support
38  *      --------------------------------
39  *      last edit-date: [Fri Jan 26 14:01:04 2001]
40  *
41  *---------------------------------------------------------------------------*/
42
43 #include <sys/cdefs.h>
44 __FBSDID("$FreeBSD$");
45
46 #include "opt_i4b.h"
47
48 #include <sys/param.h>
49 #include <sys/systm.h>
50 #include <sys/kernel.h>
51 #include <sys/socket.h>
52 #include <net/if.h>
53
54 #include <machine/i4b_ioctl.h>
55 #include <i4b/layer1/isic/i4b_isic.h>
56
57 #include <isa/isavar.h>
58
59 #define VID_TEL163PNP           0x10212750      /* Teles 16.3 PnP       */
60 #define VID_CREATIXPP           0x0000980e      /* Creatix S0/16 P+P    */
61 #define VID_DYNALINK            0x88167506      /* Dynalink             */
62 #define VID_SEDLBAUER           0x0100274c      /* Sedlbauer WinSpeed   */
63 #define VID_NICCYGO             0x5001814c      /* Neuhaus Niccy GO@    */
64 #define VID_ELSAQS1P            0x33019315      /* ELSA Quickstep1000pro*/
65 #define VID_ITK0025             0x25008b26      /* ITK Ix1 Micro V3     */
66 #define VID_AVMPNP              0x0009cd06      /* AVM Fritz! PnP       */
67 #define VID_SIESURF2            0x2000254d      /* Siemens I-Surf 2.0 PnP*/
68 #define VID_ASUSCOM_IPAC        0x90167506      /* Asuscom (with IPAC)  */      
69 #define VID_EICON_DIVA_20       0x7100891c      /* Eicon DIVA 2.0 ISAC/HSCX */
70 #define VID_EICON_DIVA_202      0xa100891c      /* Eicon DIVA 2.02 IPAC */
71 #define VID_COMPAQ_M610         0x0210110e      /* Compaq Microcom 610  */
72
73 static struct isic_pnp_ids {
74         u_long vend_id;
75         char *id_str;
76 } isic_pnp_ids[] = {
77 #if defined(TEL_S0_16_3_P) || defined(CRTX_S0_P) || defined(COMPAQ_M610)
78         { VID_TEL163PNP,        "Teles S0/16.3 PnP"             },
79         { VID_CREATIXPP,        "Creatix S0/16 PnP"             },
80         { VID_COMPAQ_M610,      "Compaq Microcom 610"           },
81 #endif
82 #ifdef DYNALINK
83         { VID_DYNALINK,         "Dynalink IS64PH"               },
84 #endif
85 #ifdef SEDLBAUER
86         { VID_SEDLBAUER,        "Sedlbauer WinSpeed"            },
87 #endif
88 #ifdef DRN_NGO
89         { VID_NICCYGO,          "Dr.Neuhaus Niccy Go@"          },
90 #endif
91 #ifdef ELSA_QS1ISA
92         { VID_ELSAQS1P,         "ELSA QuickStep 1000pro"        },      
93 #endif
94 #ifdef ITKIX1
95         { VID_ITK0025,          "ITK ix1 Micro V3.0"            },
96 #endif
97 #ifdef AVM_PNP
98         { VID_AVMPNP,           "AVM Fritz!Card PnP"            },      
99 #endif
100 #ifdef SIEMENS_ISURF2
101         { VID_SIESURF2,         "Siemens I-Surf 2.0 PnP"        },
102 #endif
103 #ifdef ASUSCOM_IPAC
104         { VID_ASUSCOM_IPAC,     "Asuscom ISDNLink 128 PnP"      },
105 #endif
106 #ifdef EICON_DIVA
107         { VID_EICON_DIVA_20,    "Eicon.Diehl DIVA 2.0 ISA PnP"  },
108         { VID_EICON_DIVA_202,   "Eicon.Diehl DIVA 2.02 ISA PnP" },
109 #endif
110         { 0, 0 }
111 };
112
113 static int isic_pnp_probe(device_t dev);
114 static int isic_pnp_attach(device_t dev);
115
116 static device_method_t isic_pnp_methods[] = {
117         DEVMETHOD(device_probe,         isic_pnp_probe),
118         DEVMETHOD(device_attach,        isic_pnp_attach),
119         { 0, 0 }
120 };
121                                 
122 static driver_t isic_pnp_driver = {
123         "isic",
124         isic_pnp_methods,
125         0,
126 };
127
128 static devclass_t isic_devclass;
129
130 DRIVER_MODULE(isicpnp, isa, isic_pnp_driver, isic_devclass, 0, 0);
131
132 /*---------------------------------------------------------------------------*
133  *      probe for ISA PnP cards
134  *---------------------------------------------------------------------------*/
135 static int
136 isic_pnp_probe(device_t dev)
137 {
138         struct isic_pnp_ids *ids;                       /* pnp id's */
139         char *string = NULL;                            /* the name */
140         u_int32_t vend_id = isa_get_vendorid(dev);      /* vendor id */
141
142         /* search table of knowd id's */
143         
144         for(ids = isic_pnp_ids; ids->vend_id != 0; ids++)
145         {
146                 if(vend_id == ids->vend_id)
147                 {
148                         string = ids->id_str;
149                         break;
150                 }
151         }
152         
153         if(string)              /* set name if we have one */
154         {
155                 device_set_desc(dev, string);   /* set description */
156                 return 0;
157         }
158         else
159         {
160                 return ENXIO;
161         }
162 }
163
164 /*---------------------------------------------------------------------------*
165  *      attach for ISA PnP cards
166  *---------------------------------------------------------------------------*/
167 static int
168 isic_pnp_attach(device_t dev)
169 {
170         u_int32_t vend_id = isa_get_vendorid(dev);      /* vendor id */
171         unsigned int unit = device_get_unit(dev);       /* get unit */
172         const char *name = device_get_desc(dev);        /* get description */
173         struct l1_softc *sc = 0;                        /* softc */
174         void *ih = 0;                                   /* a dummy */
175         int ret;
176  
177         /* see if we are out of bounds */
178         
179         if(unit >= ISIC_MAXUNIT)
180         {
181                 printf("isic%d: Error, unit %d >= ISIC_MAXUNIT for %s\n", unit, unit, name);
182                 return ENXIO;
183         }
184
185         /* get information structure for this unit */
186
187         sc = &l1_sc[unit];
188
189         /* get io_base */
190         if(!(sc->sc_resources.io_base[0] =
191                         bus_alloc_resource_any(dev, SYS_RES_IOPORT,
192                                                &sc->sc_resources.io_rid[0],
193                                                RF_ACTIVE ) ))
194         {
195                 printf("isic_pnp_attach: Couldn't get my io_base.\n");
196                 return ENXIO;                                       
197         }
198         
199         /* will not be used for pnp devices */
200
201         sc->sc_port = rman_get_start(sc->sc_resources.io_base[0]);
202
203         /* get irq, release io_base if we don't get it */
204
205         if(!(sc->sc_resources.irq =
206                         bus_alloc_resource_any(dev, SYS_RES_IRQ,
207                                                &sc->sc_resources.irq_rid,
208                                                RF_ACTIVE)))
209         {
210                 printf("isic%d: Could not get irq.\n",unit);
211                 isic_detach_common(dev);
212                 return ENXIO;                                       
213         }
214         
215         /* not needed */
216         sc->sc_irq = rman_get_start(sc->sc_resources.irq);
217
218
219         /* set flag so we know what this card is */
220
221         ret = ENXIO;
222         
223         switch(vend_id)
224         {
225 #if defined(TEL_S0_16_3_P) || defined(CRTX_S0_P) || defined(COMPAQ_M610)
226                 case VID_TEL163PNP:
227                         sc->sc_cardtyp = CARD_TYPEP_163P;
228                         ret = isic_attach_Cs0P(dev);
229                         break;
230
231                 case VID_CREATIXPP:
232                         sc->sc_cardtyp = CARD_TYPEP_CS0P;
233                         ret = isic_attach_Cs0P(dev);
234                         break;
235
236                 case VID_COMPAQ_M610:
237                         sc->sc_cardtyp = CARD_TYPEP_COMPAQ_M610;
238                         ret = isic_attach_Cs0P(dev);
239                         break;
240 #endif
241 #ifdef DYNALINK
242                 case VID_DYNALINK:
243                         sc->sc_cardtyp = CARD_TYPEP_DYNALINK;
244                         ret = isic_attach_Dyn(dev);
245                         break;
246 #endif
247 #ifdef SEDLBAUER
248                 case VID_SEDLBAUER:
249                         sc->sc_cardtyp = CARD_TYPEP_SWS;
250                         ret = isic_attach_sws(dev);
251                         break;
252 #endif
253 #ifdef DRN_NGO
254                 case VID_NICCYGO:
255                         sc->sc_cardtyp = CARD_TYPEP_DRNNGO;
256                         ret = isic_attach_drnngo(dev);
257                         break;
258 #endif
259 #ifdef ELSA_QS1ISA
260                 case VID_ELSAQS1P:
261                         sc->sc_cardtyp = CARD_TYPEP_ELSAQS1ISA;
262                         ret = isic_attach_Eqs1pi(dev);
263                         break;
264 #endif
265 #ifdef ITKIX1
266                 case VID_ITK0025:
267                         sc->sc_cardtyp = CARD_TYPEP_ITKIX1;
268                         ret = isic_attach_itkix1(dev);
269                         break;
270 #endif                  
271 #ifdef SIEMENS_ISURF2
272                 case VID_SIESURF2:
273                         sc->sc_cardtyp = CARD_TYPEP_SIE_ISURF2;
274                         ret = isic_attach_siemens_isurf(dev);
275                         break;
276 #endif
277 #ifdef ASUSCOM_IPAC
278                 case VID_ASUSCOM_IPAC:
279                         sc->sc_cardtyp = CARD_TYPEP_ASUSCOMIPAC;
280                         ret = isic_attach_asi(dev);
281                         break;
282 #endif
283 #ifdef EICON_DIVA
284                 case VID_EICON_DIVA_20:
285                         sc->sc_cardtyp = CARD_TYPEP_DIVA_ISA;
286                         ret = isic_attach_diva(dev);
287                         break;
288                 
289                 case VID_EICON_DIVA_202:
290                         sc->sc_cardtyp = CARD_TYPEP_DIVA_ISA;
291                         ret = isic_attach_diva_ipac(dev);
292                         break;
293 #endif
294                 default:
295                         printf("isic%d: Error, no driver for %s\n", unit, name);
296                         ret = ENXIO;
297                         break;          
298         }
299
300         if(ret)
301         {
302                 isic_detach_common(dev);
303                 return ENXIO;                                       
304         }               
305                 
306         if(isic_attach_common(dev))
307         {
308                 /* unset flag */
309                 sc->sc_cardtyp = CARD_TYPEP_UNK;
310
311                 /* free irq here, it hasn't been attached yet */
312                 bus_release_resource(dev,SYS_RES_IRQ,sc->sc_resources.irq_rid,
313                                         sc->sc_resources.irq);
314                 sc->sc_resources.irq = 0;
315                 isic_detach_common(dev);
316                 return ENXIO;
317         }
318         else
319         {
320                 /* setup intr routine */
321                 bus_setup_intr(dev,sc->sc_resources.irq,INTR_TYPE_NET,
322                                 (void(*)(void*))isicintr,
323                                 sc,&ih);
324                 return 0;
325         }
326 }