static int arlan_hw_test_memory(struct net_device *dev) { u_char *ptr; int i; int memlen = sizeof(struct arlan_shmem) - 0xF; /* avoid control register */ volatile char *arlan_mem = (char *) (dev->mem_start); volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; char pattern; ptr = NULL; /* hold card in reset state */ setHardwareReset(dev); /* test memory */ pattern = 0; for (i = 0; i < memlen; i++) WRITESHM(arlan_mem[i], ((u_char) pattern++), u_char); pattern = 0; for (i = 0; i < memlen; i++) { char res; READSHM(res, arlan_mem[i], char); if (res != pattern++) { printk(KERN_ERR "Arlan driver memory test 1 failed \n"); return -1; } } pattern = 0; for (i = 0; i < memlen; i++) WRITESHM(arlan_mem[i], ~(pattern++), char); pattern = 0; for (i = 0; i < memlen; i++) { char res; READSHM(res, arlan_mem[i], char); if (res != ~(pattern++)) { printk(KERN_ERR "Arlan driver memory test 2 failed \n"); return -1; } } /* zero memory */ for (i = 0; i < memlen; i++) WRITESHM(arlan_mem[i], 0x00, char); IFDEBUG(1) printk(KERN_INFO "Arlan: memory tests ok\n"); /* set reset flag and then release reset */ WRITESHM(arlan->resetFlag, 0xff, u_char); clearChannelAttention(dev); clearHardwareReset(dev); /* wait for reset flag to become zero, we'll wait for two seconds */ if (arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW)) { printk(KERN_ERR "%s arlan: failed to come back from memory test\n", dev->name); return -1; } return 0; }
static int arlan_setup_card_by_book(struct net_device *dev) { u_char irqLevel, configuredStatusFlag; volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card; // ARLAN_DEBUG_ENTRY("arlan_setup_card"); READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); IFDEBUG(10) if (configuredStatusFlag != 0) IFDEBUG(10) printk("arlan: CARD IS CONFIGURED\n"); else IFDEBUG(10) printk("arlan: card is NOT configured\n"); if (testMemory || (READSHMB(arlan->diagnosticInfo) != 0xff)) if (arlan_hw_test_memory(dev)) return -1; DEBUGSHM(4, "arlan configuredStatus = %d \n", arlan->configuredStatusFlag, u_char); DEBUGSHM(4, "arlan driver diagnostic: 0x%2x\n", arlan->diagnosticInfo, u_char); /* issue nop command - no interrupt */ arlan_command(dev, ARLAN_COMMAND_NOOP); if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) return -1; IFDEBUG(50) printk("1st Noop successfully executed !!\n"); /* try to turn on the arlan interrupts */ clearClearInterrupt(dev); setClearInterrupt(dev); setInterruptEnable(dev); /* issue nop command - with interrupt */ arlan_command(dev, ARLAN_COMMAND_NOOPINT); if (arlan_command(dev, ARLAN_COMMAND_WAIT_NOW) != 0) return -1; IFDEBUG(50) printk("2nd Noop successfully executed !!\n"); READSHM(irqLevel, arlan->irqLevel, u_char) if (irqLevel != dev->irq) { IFDEBUG(1) printk(KERN_WARNING "arlan dip switches set irq to %d\n", irqLevel); printk(KERN_WARNING "device driver irq set to %d - does not match\n", dev->irq); dev->irq = irqLevel; } else IFDEBUG(2) printk("irq level is OK\n"); IFDEBUG(3) arlan_print_diagnostic_info(dev); arlan_command(dev, ARLAN_COMMAND_CONF); READSHM(configuredStatusFlag, arlan->configuredStatusFlag, u_char); if (configuredStatusFlag == 0) { printk(KERN_WARNING "arlan configure failed\n"); return -1; } arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); arlan_command(dev, ARLAN_COMMAND_RX); arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW); printk(KERN_NOTICE "%s: arlan driver version %s loaded\n", dev->name, arlan_version); // ARLAN_DEBUG_EXIT("arlan_setup_card"); return 0; /* no errors */ }
static int arlan_hw_test_memory(struct net_device *dev) { u_char *ptr; int i; int memlen = sizeof(struct arlan_shmem) - 0xF; volatile char *arlan_mem = (char *) (dev->mem_start); struct arlan_private *priv = netdev_priv(dev); volatile struct arlan_shmem __iomem *arlan = priv->card; char pattern; ptr = NULL; setHardwareReset(dev); pattern = 0; for (i = 0; i < memlen; i++) WRITESHM(arlan_mem[i], ((u_char) pattern++), u_char); pattern = 0; for (i = 0; i < memlen; i++) { char res; READSHM(res, arlan_mem[i], char); if (res != pattern++) { printk(KERN_ERR "Arlan driver memory test 1 failed \n"); return -1; } } pattern = 0; for (i = 0; i < memlen; i++) WRITESHM(arlan_mem[i], ~(pattern++), char); pattern = 0; for (i = 0; i < memlen; i++) { char res; READSHM(res, arlan_mem[i], char); if (res != ~(pattern++)) { printk(KERN_ERR "Arlan driver memory test 2 failed \n"); return -1; } } for (i = 0; i < memlen; i++) WRITESHM(arlan_mem[i], 0x00, char); IFDEBUG(1) printk(KERN_INFO "Arlan: memory tests ok\n"); WRITESHM(arlan->resetFlag, 0xff, u_char); clearChannelAttention(dev); clearHardwareReset(dev); if (arlan_command(dev, ARLAN_COMMAND_LONG_WAIT_NOW)) { printk(KERN_ERR "%s arlan: failed to come back from memory test\n", dev->name); return -1; } return 0; }