static void prism2_pci_remove(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct hostap_interface *iface = dev->priv; unsigned long mem_start; /* Reset the hardware, and ensure interrupts are disabled. */ prism2_pci_cor_sreset(iface->local); hfa384x_disable_interrupts(dev); if (dev->irq) free_irq(dev->irq, dev); mem_start = dev->mem_start; prism2_free_local_data(dev); iounmap((void *) mem_start); release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4)) pci_disable_device(pdev); #endif }
static void prism2_pci_remove(struct pci_dev *pdev) { struct net_device *dev; struct hostap_interface *iface; void __iomem *mem_start; struct hostap_pci_priv *hw_priv; dev = pci_get_drvdata(pdev); iface = netdev_priv(dev); hw_priv = iface->local->hw_priv; prism2_pci_cor_sreset(iface->local); hfa384x_disable_interrupts(dev); if (dev->irq) free_irq(dev->irq, dev); mem_start = hw_priv->mem_start; prism2_free_local_data(dev); kfree(hw_priv); iounmap(mem_start); release_mem_region(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); pci_disable_device(pdev); }
static void prism2_plx_remove(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct hostap_interface *iface = dev->priv; /* Reset the hardware, and ensure interrupts are disabled. */ prism2_plx_cor_sreset(iface->local); hfa384x_disable_interrupts(dev); if (iface->local->attr_mem) iounmap((void *) iface->local->attr_mem); if (dev->irq) free_irq(dev->irq, dev); prism2_free_local_data(dev); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4)) pci_disable_device(pdev); #endif }
static void prism2_plx_remove(struct pci_dev *pdev) { struct net_device *dev; struct hostap_interface *iface; struct hostap_plx_priv *hw_priv; dev = pci_get_drvdata(pdev); iface = netdev_priv(dev); hw_priv = iface->local->hw_priv; /* Reset the hardware, and ensure interrupts are disabled. */ prism2_plx_cor_sreset(iface->local); hfa384x_disable_interrupts(dev); if (hw_priv->attr_mem) iounmap(hw_priv->attr_mem); if (dev->irq) free_irq(dev->irq, dev); prism2_free_local_data(dev); kfree(hw_priv); pci_disable_device(pdev); }
static int prism2_download_nonvolatile(local_info_t *local, struct prism2_download_data *dl) { struct net_device *dev = local->dev; int ret = 0, i; struct { __le16 page; __le16 offset; __le16 len; } dlbuffer; u32 bufaddr; if (local->hw_downloading) { printk(KERN_WARNING "%s: Already downloading - aborting new " "request\n", dev->name); return -1; } ret = local->func->get_rid(dev, HFA384X_RID_DOWNLOADBUFFER, &dlbuffer, 6, 0); if (ret < 0) { printk(KERN_WARNING "%s: Could not read download buffer " "parameters\n", dev->name); goto out; } printk(KERN_DEBUG "Download buffer: %d bytes at 0x%04x:0x%04x\n", le16_to_cpu(dlbuffer.len), le16_to_cpu(dlbuffer.page), le16_to_cpu(dlbuffer.offset)); bufaddr = (le16_to_cpu(dlbuffer.page) << 7) + le16_to_cpu(dlbuffer.offset); local->hw_downloading = 1; if (!local->pri_only) { prism2_hw_shutdown(dev, 0); if (prism2_hw_init(dev, 0)) { printk(KERN_WARNING "%s: Could not initialize card for" " download\n", dev->name); ret = -1; goto out; } } hfa384x_disable_interrupts(dev); if (prism2_enable_aux_port(dev, 1)) { printk(KERN_WARNING "%s: Could not enable AUX port\n", dev->name); ret = -1; goto out; } printk(KERN_DEBUG "%s: starting flash download\n", dev->name); for (i = 0; i < dl->num_areas; i++) { int rest_len = dl->data[i].len; int data_off = 0; while (rest_len > 0) { int block_len; block_len = prism2_download_block( dev, dl->data[i].addr + data_off, dl->data[i].data + data_off, bufaddr, rest_len); if (block_len < 0) { ret = -1; goto out; } rest_len -= block_len; data_off += block_len; } } HFA384X_OUTW(0, HFA384X_PARAM1_OFF); HFA384X_OUTW(0, HFA384X_PARAM2_OFF); if (hfa384x_cmd_wait(dev, HFA384X_CMDCODE_DOWNLOAD | (HFA384X_PROGMODE_DISABLE << 8), 0)) { printk(KERN_WARNING "%s: Download command execution failed\n", dev->name); ret = -1; goto out; } if (prism2_enable_aux_port(dev, 0)) { printk(KERN_DEBUG "%s: Disabling AUX port failed\n", dev->name); /* continue anyway.. restart should have taken care of this */ } mdelay(5); local->func->hw_reset(dev); local->hw_downloading = 0; if (prism2_hw_config(dev, 2)) { printk(KERN_WARNING "%s: Card configuration after flash " "download failed\n", dev->name); ret = -1; } else { printk(KERN_INFO "%s: Card initialized successfully after " "flash download\n", dev->name); } out: local->hw_downloading = 0; return ret; }
static int prism2_download_genesis(local_info_t *local, struct prism2_download_data *param) { struct net_device *dev = local->dev; int ram16 = 0, i; int ret = 0; if (local->hw_downloading) { printk(KERN_WARNING "%s: Already downloading - aborting new " "request\n", dev->name); return -EBUSY; } if (!local->func->genesis_reset || !local->func->cor_sreset) { printk(KERN_INFO "%s: Genesis mode downloading not supported " "with this hwmodel\n", dev->name); return -EOPNOTSUPP; } local->hw_downloading = 1; if (prism2_enable_aux_port(dev, 1)) { printk(KERN_DEBUG "%s: failed to enable AUX port\n", dev->name); ret = -EIO; goto out; } if (local->sram_type == -1) { /* 0x1F for x8 SRAM or 0x0F for x16 SRAM */ if (prism2_enable_genesis(local, 0x1f) == 0) { ram16 = 0; PDEBUG(DEBUG_EXTRA2, "%s: Genesis mode OK using x8 " "SRAM\n", dev->name); } else if (prism2_enable_genesis(local, 0x0f) == 0) { ram16 = 1; PDEBUG(DEBUG_EXTRA2, "%s: Genesis mode OK using x16 " "SRAM\n", dev->name); } else { printk(KERN_DEBUG "%s: Could not initiate genesis " "mode\n", dev->name); ret = -EIO; goto out; } } else { if (prism2_enable_genesis(local, local->sram_type == 8 ? 0x1f : 0x0f)) { printk(KERN_DEBUG "%s: Failed to set Genesis " "mode (sram_type=%d)\n", dev->name, local->sram_type); ret = -EIO; goto out; } ram16 = local->sram_type != 8; } for (i = 0; i < param->num_areas; i++) { PDEBUG(DEBUG_EXTRA2, "%s: Writing %d bytes at 0x%08x\n", dev->name, param->data[i].len, param->data[i].addr); if (hfa384x_to_aux(dev, param->data[i].addr, param->data[i].len, param->data[i].data)) { printk(KERN_WARNING "%s: RAM download at 0x%08x " "(len=%d) failed\n", dev->name, param->data[i].addr, param->data[i].len); ret = -EIO; goto out; } } PDEBUG(DEBUG_EXTRA2, "Disable genesis mode\n"); local->func->genesis_reset(local, ram16 ? 0x07 : 0x17); if (prism2_enable_aux_port(dev, 0)) { printk(KERN_DEBUG "%s: Failed to disable AUX port\n", dev->name); } mdelay(5); local->hw_downloading = 0; PDEBUG(DEBUG_EXTRA2, "Trying to initialize card\n"); /* * Make sure the INIT command does not generate a command completion * event by disabling interrupts. */ hfa384x_disable_interrupts(dev); if (prism2_hw_init(dev, 1)) { printk(KERN_DEBUG "%s: Initialization after genesis mode " "download failed\n", dev->name); ret = -EIO; goto out; } PDEBUG(DEBUG_EXTRA2, "Card initialized - running PRI only\n"); if (prism2_hw_init2(dev, 1)) { printk(KERN_DEBUG "%s: Initialization(2) after genesis mode " "download failed\n", dev->name); ret = -EIO; goto out; } out: local->hw_downloading = 0; return ret; }
static int prism2_download_volatile(local_info_t *local, struct prism2_download_data *param) { struct net_device *dev = local->dev; int ret = 0, i; u16 param0, param1; if (local->hw_downloading) { printk(KERN_WARNING "%s: Already downloading - aborting new " "request\n", dev->name); return -1; } local->hw_downloading = 1; if (local->pri_only) { hfa384x_disable_interrupts(dev); } else { prism2_hw_shutdown(dev, 0); if (prism2_hw_init(dev, 0)) { printk(KERN_WARNING "%s: Could not initialize card for" " download\n", dev->name); ret = -1; goto out; } } if (prism2_enable_aux_port(dev, 1)) { printk(KERN_WARNING "%s: Could not enable AUX port\n", dev->name); ret = -1; goto out; } param0 = param->start_addr & 0xffff; param1 = param->start_addr >> 16; HFA384X_OUTW(0, HFA384X_PARAM2_OFF); HFA384X_OUTW(param1, HFA384X_PARAM1_OFF); if (hfa384x_cmd_wait(dev, HFA384X_CMDCODE_DOWNLOAD | (HFA384X_PROGMODE_ENABLE_VOLATILE << 8), param0)) { printk(KERN_WARNING "%s: Download command execution failed\n", dev->name); ret = -1; goto out; } for (i = 0; i < param->num_areas; i++) { PDEBUG(DEBUG_EXTRA2, "%s: Writing %d bytes at 0x%08x\n", dev->name, param->data[i].len, param->data[i].addr); if (hfa384x_to_aux(dev, param->data[i].addr, param->data[i].len, param->data[i].data)) { printk(KERN_WARNING "%s: RAM download at 0x%08x " "(len=%d) failed\n", dev->name, param->data[i].addr, param->data[i].len); ret = -1; goto out; } } HFA384X_OUTW(param1, HFA384X_PARAM1_OFF); HFA384X_OUTW(0, HFA384X_PARAM2_OFF); if (hfa384x_cmd_no_wait(dev, HFA384X_CMDCODE_DOWNLOAD | (HFA384X_PROGMODE_DISABLE << 8), param0)) { printk(KERN_WARNING "%s: Download command execution failed\n", dev->name); ret = -1; goto out; } /* ProgMode disable causes the hardware to restart itself from the * given starting address. Give hw some time and ACK command just in * case restart did not happen. */ mdelay(5); HFA384X_OUTW(HFA384X_EV_CMD, HFA384X_EVACK_OFF); if (prism2_enable_aux_port(dev, 0)) { printk(KERN_DEBUG "%s: Disabling AUX port failed\n", dev->name); /* continue anyway.. restart should have taken care of this */ } mdelay(5); local->hw_downloading = 0; if (prism2_hw_config(dev, 2)) { printk(KERN_WARNING "%s: Card configuration after RAM " "download failed\n", dev->name); ret = -1; goto out; } out: local->hw_downloading = 0; return ret; }