diff options
Diffstat (limited to 'drivers/staging/cxt1e1/hwprobe.c')
-rw-r--r-- | drivers/staging/cxt1e1/hwprobe.c | 382 |
1 files changed, 0 insertions, 382 deletions
diff --git a/drivers/staging/cxt1e1/hwprobe.c b/drivers/staging/cxt1e1/hwprobe.c deleted file mode 100644 index 4fa27c8931b1..000000000000 --- a/drivers/staging/cxt1e1/hwprobe.c +++ /dev/null @@ -1,382 +0,0 @@ -/* Copyright (C) 2007 One Stop Systems - * Copyright (C) 2003-2005 SBE, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/netdevice.h> -#include <linux/hdlc.h> -#include <linux/if_arp.h> -#include <asm/uaccess.h> -#include <linux/rtnetlink.h> -#include <linux/pci.h> -#include "pmcc4_sysdep.h" -#include "sbecom_inline_linux.h" -#include "libsbew.h" -#include "pmcc4_private.h" -#include "pmcc4.h" -#include "pmcc4_ioctls.h" -#include "pmc93x6_eeprom.h" -#ifdef CONFIG_PROC_FS -#include "sbeproc.h" -#endif - -extern int error_flag; -extern int drvr_state; - -/* forward references */ -void c4_stopwd(ci_t *); -struct net_device * __init c4_add_dev(hdw_info_t *, int, unsigned long, - unsigned long, int, int); - - -struct s_hdw_info hdw_info[MAX_BOARDS]; - - -void __init -show_two(hdw_info_t *hi, int brdno) -{ - ci_t *ci; - struct pci_dev *pdev; - char *bid; - char banner[80]; - char sn[6] = {0,}; - - ci = (ci_t *)(netdev_priv(hi->ndev)); - bid = sbeid_get_bdname(ci); - switch (hi->promfmt) { - case PROM_FORMAT_TYPE1: - memcpy(sn, hi->mfg_info.pft1.Serial, 6); - break; - case PROM_FORMAT_TYPE2: - memcpy(sn, hi->mfg_info.pft2.Serial, 6); - break; - } - - sprintf(banner, "%s: %s S/N %06X, MUSYCC Rev %02X", - hi->devname, bid, - ((sn[3] << 16) & 0xff0000) | - ((sn[4] << 8) & 0x00ff00) | - (sn[5] & 0x0000ff), - (u_int8_t) hi->revid[0]); - - pr_info("%s\n", banner); - - pdev = hi->pdev[0]; - pr_info("%s: %s at v/p=%lx/%lx (%02x:%02x.%x) irq %d\n", - hi->devname, "MUSYCC", - (unsigned long) hi->addr_mapped[0], hi->addr[0], - hi->pci_busno, (u_int8_t) PCI_SLOT(pdev->devfn), - (u_int8_t) PCI_FUNC(pdev->devfn), pdev->irq); - - pdev = hi->pdev[1]; - pr_info("%s: %s at v/p=%lx/%lx (%02x:%02x.%x) irq %d\n", - hi->devname, "EBUS ", - (unsigned long) hi->addr_mapped[1], hi->addr[1], - hi->pci_busno, (u_int8_t) PCI_SLOT(pdev->devfn), - (u_int8_t) PCI_FUNC(pdev->devfn), pdev->irq); -} - - -void __init -hdw_sn_get(hdw_info_t *hi, int brdno) -{ - /* obtain hardware EEPROM information */ - long addr; - - addr = (long) hi->addr_mapped[1] + EEPROM_OFFSET; - - /* read EEPROM with largest known format size... */ - pmc_eeprom_read_buffer(addr, 0, (char *)hi->mfg_info.data, - sizeof(FLD_TYPE2)); - -#if 0 - { - unsigned char *ucp = (unsigned char *) &hi->mfg_info.data; - - pr_info("eeprom[00]: %02x %02x %02x %02x %02x %02x %02x %02x\n", - *(ucp + 0), *(ucp + 1), *(ucp + 2), *(ucp + 3), - *(ucp + 4), *(ucp + 5), *(ucp + 6), *(ucp + 7)); - pr_info("eeprom[08]: %02x %02x %02x %02x %02x %02x %02x %02x\n", - *(ucp + 8), *(ucp + 9), *(ucp + 10), *(ucp + 11), - *(ucp + 12), *(ucp + 13), *(ucp + 14), *(ucp + 15)); - pr_info("eeprom[16]: %02x %02x %02x %02x %02x %02x %02x %02x\n", - *(ucp + 16), *(ucp + 17), *(ucp + 18), *(ucp + 19), - *(ucp + 20), *(ucp + 21), *(ucp + 22), *(ucp + 23)); - pr_info("eeprom[24]: %02x %02x %02x %02x %02x %02x %02x %02x\n", - *(ucp + 24), *(ucp + 25), *(ucp + 26), *(ucp + 27), - *(ucp + 28), *(ucp + 29), *(ucp + 30), *(ucp + 31)); - pr_info("eeprom[32]: %02x %02x %02x %02x %02x %02x %02x %02x\n", - *(ucp + 32), *(ucp + 33), *(ucp + 34), *(ucp + 35), - *(ucp + 36), *(ucp + 37), *(ucp + 38), *(ucp + 39)); - pr_info("eeprom[40]: %02x %02x %02x %02x %02x %02x %02x %02x\n", - *(ucp + 40), *(ucp + 41), *(ucp + 42), *(ucp + 43), - *(ucp + 44), *(ucp + 45), *(ucp + 46), *(ucp + 47)); - } -#endif -#if 0 - pr_info("sn: %x %x %x %x %x %x\n", - hi->mfg_info.Serial[0], - hi->mfg_info.Serial[1], - hi->mfg_info.Serial[2], - hi->mfg_info.Serial[3], - hi->mfg_info.Serial[4], - hi->mfg_info.Serial[5]); -#endif - - hi->promfmt = pmc_verify_cksum(&hi->mfg_info.data); - if (hi->promfmt == PROM_FORMAT_Unk) { - /* bad crc, data is suspect */ - if (cxt1e1_log_level >= LOG_WARN) - pr_info("%s: EEPROM cksum error\n", hi->devname); - hi->mfg_info_sts = EEPROM_CRCERR; - } else - hi->mfg_info_sts = EEPROM_OK; -} - - - void __init -prep_hdw_info(void) -{ - hdw_info_t *hi; - int i; - - for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { - hi->pci_busno = 0xff; - hi->pci_slot = 0xff; - hi->pci_pin[0] = 0; - hi->pci_pin[1] = 0; - hi->ndev = NULL; - hi->addr[0] = 0L; - hi->addr[1] = 0L; - hi->addr_mapped[0] = NULL; - hi->addr_mapped[1] = NULL; - } -} - -void -cleanup_ioremap(void) -{ - hdw_info_t *hi; - int i; - - for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { - if (hi->pci_slot == 0xff) - break; - if (hi->addr_mapped[0]) { - iounmap(hi->addr_mapped[0]); - release_mem_region((long) hi->addr[0], hi->len[0]); - hi->addr_mapped[0] = NULL; - } - if (hi->addr_mapped[1]) { - iounmap(hi->addr_mapped[1]); - release_mem_region((long) hi->addr[1], hi->len[1]); - hi->addr_mapped[1] = NULL; - } - } -} - - -void -cleanup_devs(void) -{ - hdw_info_t *hi; - int i; - - for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { - if (hi->pci_slot == 0xff || !hi->ndev) - break; - c4_stopwd(netdev_priv(hi->ndev)); -#ifdef CONFIG_PROC_FS - sbecom_proc_brd_cleanup(netdev_priv(hi->ndev)); -#endif - unregister_netdev(hi->ndev); - free_irq(hi->pdev[0]->irq, hi->ndev); -#ifdef CONFIG_SBE_PMCC4_NCOMM - free_irq(hi->pdev[1]->irq, hi->ndev); -#endif - kfree(hi->ndev); - } -} - - -static int __init -c4_hdw_init(struct pci_dev *pdev, int found) -{ - hdw_info_t *hi; - int i; - int fun, slot; - unsigned char busno = 0xff; - - /* our MUSYCC chip supports two functions, 0 & 1 */ - fun = PCI_FUNC(pdev->devfn); - if (fun > 1) { - pr_warning("unexpected devfun: 0x%x\n", pdev->devfn); - return 0; - } - - /* obtain bus number */ - if (pdev->bus) - busno = pdev->bus->number; - else - busno = 0; /* default for system PCI inconsistency */ - slot = pdev->devfn & ~0x07; - - /* - * Functions 0 & 1 for a given board (identified by same bus(busno) and - * slot(slot)) are placed into the same 'hardware' structure. The first - * part of the board's functionality will be placed into an unpopulated - * element, identified by "slot==(0xff)". The second part of a board's - * functionality will match the previously loaded slot/busno. - */ - for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { - /* - * match with board's first found interface, otherwise this is - * fisrt found - */ - if ((hi->pci_slot == 0xff) || /* new board */ - ((hi->pci_slot == slot) && (hi->bus == pdev->bus))) - break; /* found for-loop exit */ - } - - /* no match in above loop means MAX exceeded */ - if (i == MAX_BOARDS) { - pr_warning("exceeded number of allowed devices (>%d)?\n", - MAX_BOARDS); - return 0; - } - - if (pdev->bus) - hi->pci_busno = pdev->bus->number; - else - hi->pci_busno = 0; /* default for system PCI inconsistency */ - - hi->pci_slot = slot; - pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &hi->pci_pin[fun]); - pci_read_config_byte(pdev, PCI_REVISION_ID, &hi->revid[fun]); - hi->bus = pdev->bus; - hi->addr[fun] = pci_resource_start(pdev, 0); - hi->len[fun] = pci_resource_end(pdev, 0) - hi->addr[fun] + 1; - hi->pdev[fun] = pdev; - - { - /* - * create device name from module name, plus add the appropriate - * board number - */ - char *cp = hi->devname; - - strcpy(cp, KBUILD_MODNAME); - cp += strlen(cp); /* reposition */ - *cp++ = '-'; - *cp++ = '0' + (found / 2); /* there are two found interfaces per - * board */ - *cp = 0; /* termination */ - } - - return 1; -} - -status_t __init -c4hw_attach_all(void) -{ - hdw_info_t *hi; - struct pci_dev *pdev = NULL; - int found = 0, i, j; - - error_flag = 0; - prep_hdw_info(); - /*** scan PCI bus for all possible boards */ - while ((pdev = pci_get_device(PCI_VENDOR_ID_CONEXANT, - PCI_DEVICE_ID_CN8474, - pdev))) { - if (c4_hdw_init(pdev, found)) - found++; - } - - if (!found) { - pr_warning("No boards found\n"); - return -ENODEV; - } - - /* sanity check for consistent hardware found */ - for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { - if (hi->pci_slot != 0xff && (!hi->addr[0] || !hi->addr[1])) { - pr_warning("%s: something very wrong with pci_get_device\n", - hi->devname); - return -EIO; - } - } - /* bring board's memory regions on/line */ - for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { - if (hi->pci_slot == 0xff) - break; - for (j = 0; j < 2; j++) { - if (!request_mem_region(hi->addr[j], hi->len[j], hi->devname)) { - pr_warning("%s: memory in use, addr=0x%lx, len=0x%lx ?\n", - hi->devname, hi->addr[j], hi->len[j]); - cleanup_ioremap(); - return -ENOMEM; - } - - hi->addr_mapped[j] = ioremap(hi->addr[j], hi->len[j]); - if (!hi->addr_mapped[j]) { - pr_warning("%s: ioremap fails, addr=0x%lx, len=0x%lx ?\n", - hi->devname, hi->addr[j], hi->len[j]); - cleanup_ioremap(); - return -ENOMEM; - } -#ifdef SBE_MAP_DEBUG - pr_warning("%s: io remapped from phys %x to virt %x\n", - hi->devname, (u_int32_t) hi->addr[j], - (u_int32_t) hi->addr_mapped[j]); -#endif - } - } - - drvr_state = SBE_DRVR_AVAILABLE; - - /* Have now memory mapped all boards. Now allow board's access to system */ - for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++) { - if (hi->pci_slot == 0xff) - break; - if (pci_enable_device(hi->pdev[0]) || - pci_enable_device(hi->pdev[1])) { - drvr_state = SBE_DRVR_DOWN; - pr_warning("%s: failed to enable card %d slot %d\n", - hi->devname, i, hi->pci_slot); - cleanup_devs(); - cleanup_ioremap(); - return -EIO; - } - pci_set_master(hi->pdev[0]); - pci_set_master(hi->pdev[1]); - hi->ndev = c4_add_dev(hi, i, (long) hi->addr_mapped[0], - (long) hi->addr_mapped[1], - hi->pdev[0]->irq, - hi->pdev[1]->irq); - if (!hi->ndev) { - drvr_state = SBE_DRVR_DOWN; - cleanup_ioremap(); - /* NOTE: c4_add_dev() does its own device cleanup */ -#if 0 - cleanup_devs(); -#endif - return error_flag; /* error_flag set w/in add_dev() */ - } - show_two(hi, i); /* displays found information */ - } - return 0; -} - -/*** End-of-File ***/ |