static void prism2_pci_cor_sreset(local_info_t *local) { struct net_device *dev = local->dev; u16 reg; reg = HFA384X_INB(HFA384X_PCICOR_OFF); printk(KERN_DEBUG "%s: Original COR value: 0x%0x\n", dev->name, reg); /* linux-wlan-ng uses extremely long hold and settle times for * COR sreset. A comment in the driver code mentions that the long * delays appear to be necessary. However, at least IBM 22P6901 seems * to work fine with shorter delays. * * Longer delays can be configured by uncommenting following line: */ /* #define PRISM2_PCI_USE_LONG_DELAYS */ #ifdef PRISM2_PCI_USE_LONG_DELAYS int i; HFA384X_OUTW(reg | 0x0080, HFA384X_PCICOR_OFF); mdelay(250); HFA384X_OUTW(reg & ~0x0080, HFA384X_PCICOR_OFF); mdelay(500); /* Wait for f/w to complete initialization (CMD:BUSY == 0) */ i = 2000000 / 10; while ((HFA384X_INW(HFA384X_CMD_OFF) & HFA384X_CMD_BUSY) && --i) udelay(10); #else /* PRISM2_PCI_USE_LONG_DELAYS */ HFA384X_OUTW(reg | 0x0080, HFA384X_PCICOR_OFF); mdelay(2); HFA384X_OUTW(reg & ~0x0080, HFA384X_PCICOR_OFF); mdelay(2); #endif /* PRISM2_PCI_USE_LONG_DELAYS */ if (HFA384X_INW(HFA384X_CMD_OFF) & HFA384X_CMD_BUSY) { printk(KERN_DEBUG "%s: COR sreset timeout\n", dev->name); } }
static void prism2_pci_cor_sreset(local_info_t *local) { struct net_device *dev = local->dev; u16 reg; reg = HFA384X_INB(HFA384X_PCICOR_OFF); printk(KERN_DEBUG "%s: Original COR value: 0x%0x\n", dev->name, reg); #ifdef PRISM2_PCI_USE_LONG_DELAYS int i; HFA384X_OUTW(reg | 0x0080, HFA384X_PCICOR_OFF); mdelay(250); HFA384X_OUTW(reg & ~0x0080, HFA384X_PCICOR_OFF); mdelay(500); i = 2000000 / 10; while ((HFA384X_INW(HFA384X_CMD_OFF) & HFA384X_CMD_BUSY) && --i) udelay(10); #else HFA384X_OUTW(reg | 0x0080, HFA384X_PCICOR_OFF); mdelay(2); HFA384X_OUTW(reg & ~0x0080, HFA384X_PCICOR_OFF); mdelay(2); #endif if (HFA384X_INW(HFA384X_CMD_OFF) & HFA384X_CMD_BUSY) { printk(KERN_DEBUG "%s: COR sreset timeout\n", dev->name); } }
static int prism2_enable_aux_port(struct net_device *dev, int enable) { u16 val, reg; int i, tries; unsigned long flags; struct hostap_interface *iface; local_info_t *local; iface = netdev_priv(dev); local = iface->local; if (local->no_pri) { if (enable) { PDEBUG(DEBUG_EXTRA2, "%s: no PRI f/w - assuming Aux " "port is already enabled\n", dev->name); } return 0; } spin_lock_irqsave(&local->cmdlock, flags); /* wait until busy bit is clear */ tries = HFA384X_CMD_BUSY_TIMEOUT; while (HFA384X_INW(HFA384X_CMD_OFF) & HFA384X_CMD_BUSY && tries > 0) { tries--; udelay(1); } if (tries == 0) { reg = HFA384X_INW(HFA384X_CMD_OFF); spin_unlock_irqrestore(&local->cmdlock, flags); printk("%s: prism2_enable_aux_port - timeout - reg=0x%04x\n", dev->name, reg); return -ETIMEDOUT; } val = HFA384X_INW(HFA384X_CONTROL_OFF); if (enable) { HFA384X_OUTW(HFA384X_AUX_MAGIC0, HFA384X_PARAM0_OFF); HFA384X_OUTW(HFA384X_AUX_MAGIC1, HFA384X_PARAM1_OFF); HFA384X_OUTW(HFA384X_AUX_MAGIC2, HFA384X_PARAM2_OFF); if ((val & HFA384X_AUX_PORT_MASK) != HFA384X_AUX_PORT_DISABLED) printk("prism2_enable_aux_port: was not disabled!?\n"); val &= ~HFA384X_AUX_PORT_MASK; val |= HFA384X_AUX_PORT_ENABLE; } else { HFA384X_OUTW(0, HFA384X_PARAM0_OFF); HFA384X_OUTW(0, HFA384X_PARAM1_OFF); HFA384X_OUTW(0, HFA384X_PARAM2_OFF); if ((val & HFA384X_AUX_PORT_MASK) != HFA384X_AUX_PORT_ENABLED) printk("prism2_enable_aux_port: was not enabled!?\n"); val &= ~HFA384X_AUX_PORT_MASK; val |= HFA384X_AUX_PORT_DISABLE; } HFA384X_OUTW(val, HFA384X_CONTROL_OFF); udelay(5); i = 10000; while (i > 0) { val = HFA384X_INW(HFA384X_CONTROL_OFF); val &= HFA384X_AUX_PORT_MASK; if ((enable && val == HFA384X_AUX_PORT_ENABLED) || (!enable && val == HFA384X_AUX_PORT_DISABLED)) break; udelay(10); i--; } spin_unlock_irqrestore(&local->cmdlock, flags); if (i == 0) { printk("prism2_enable_aux_port(%d) timed out\n", enable); return -ETIMEDOUT; } return 0; }