| /* $Id: eicon_pci.c,v 1.1.4.1 2001/11/20 14:19:35 kai Exp $ |
| * |
| * ISDN low-level module for Eicon active ISDN-Cards. |
| * Hardware-specific code for PCI cards. |
| * |
| * Copyright 1998-2000 by Armin Schindler (mac@melware.de) |
| * Copyright 1999,2000 Cytronics & Melware (info@melware.de) |
| * |
| * This software may be used and distributed according to the terms |
| * of the GNU General Public License, incorporated herein by reference. |
| * |
| * Thanks to Eicon Networks for |
| * documents, informations and hardware. |
| * |
| */ |
| |
| #include <linux/config.h> |
| #include <linux/pci.h> |
| |
| #include "eicon.h" |
| #include "eicon_pci.h" |
| |
| #undef N_DATA |
| #include "adapter.h" |
| #include "uxio.h" |
| |
| char *eicon_pci_revision = "$Revision: 1.1.4.1 $"; |
| |
| #if CONFIG_PCI /* intire stuff is only for PCI */ |
| #ifdef CONFIG_ISDN_DRV_EICON_PCI |
| |
| int eicon_pci_find_card(char *ID) |
| { |
| int pci_cards = 0; |
| int card_id = 0; |
| int had_q = 0; |
| int ctype = 0; |
| char did[20]; |
| card_t *pCard; |
| word wCardIndex; |
| |
| pCard = DivasCards; |
| for (wCardIndex = 0; wCardIndex < MAX_CARDS; wCardIndex++) |
| { |
| if ((pCard->hw) && (pCard->hw->in_use)) |
| { |
| switch(pCard->hw->card_type) { |
| case DIA_CARD_TYPE_DIVA_SERVER: |
| ctype = EICON_CTYPE_MAESTRAP; |
| card_id++; |
| had_q = 0; |
| break; |
| case DIA_CARD_TYPE_DIVA_SERVER_B: |
| ctype = EICON_CTYPE_MAESTRA; |
| card_id++; |
| had_q = 0; |
| break; |
| case DIA_CARD_TYPE_DIVA_SERVER_Q: |
| ctype = EICON_CTYPE_MAESTRAQ; |
| if (!had_q) |
| card_id++; |
| if (++had_q >=4) |
| had_q = 0; |
| break; |
| default: |
| printk(KERN_ERR "eicon_pci: unknown card type %d !\n", |
| pCard->hw->card_type); |
| goto err; |
| } |
| sprintf(did, "%s%d", (strlen(ID) < 1) ? "eicon":ID, pci_cards); |
| if ((!ctype) || (!(eicon_addcard(ctype, 0, pCard->hw->irq, did, card_id)))) { |
| printk(KERN_ERR "eicon_pci: Card could not be added !\n"); |
| } else { |
| pci_cards++; |
| printk(KERN_INFO "%s: DriverID='%s' CardID=%d\n", |
| eicon_ctype_name[ctype], did, card_id); |
| } |
| err:; |
| } |
| pCard++; |
| } |
| return pci_cards; |
| } |
| |
| void |
| eicon_pci_init_conf(eicon_card *card) |
| { |
| int j; |
| |
| /* initializing some variables */ |
| card->ReadyInt = 0; |
| |
| for(j = 0; j < 256; j++) |
| card->IdTable[j] = NULL; |
| |
| for(j = 0; j < (card->d->channels + 1); j++) { |
| card->bch[j].e.busy = 0; |
| card->bch[j].e.D3Id = 0; |
| card->bch[j].e.B2Id = 0; |
| card->bch[j].e.ref = 0; |
| card->bch[j].e.Req = 0; |
| card->bch[j].e.complete = 1; |
| card->bch[j].fsm_state = EICON_STATE_NULL; |
| } |
| } |
| |
| #endif |
| #endif /* CONFIG_PCI */ |
| |