{
u_long page_base = ((u_long) base) & PAGE_MASK;
u_long page_offs = ((u_long) base) - page_base;
- u_long page_remapped = (u_long) ioremap(page_base, page_offs+size);
+ u_long page_remapped;
+
+ spin_unlock_irq(&io_request_lock);
+ page_remapped = (u_long) ioremap(page_base, page_offs+size);
+ spin_lock_irq(&io_request_lock);
return page_remapped? (page_remapped + page_offs) : 0UL;
}
-static void __init pci_unmap_mem(u_long vaddr, u_long size)
+static void pci_unmap_mem(u_long vaddr,
+ u_long size,
+ int holding_io_request_lock)
{
- if (vaddr)
+ if (vaddr) {
+ if (holding_io_request_lock)
+ spin_unlock_irq(&io_request_lock);
iounmap((void *) (vaddr & PAGE_MASK));
+ if (holding_io_request_lock)
+ spin_lock_irq(&io_request_lock);
+ }
}
#endif
/*
* Free controller resources.
*/
-static void sym_free_resources(hcb_p np)
+static void sym_free_resources(hcb_p np, int holding_io_request_lock)
{
/*
* Free O/S specific resources.
release_region(np->s.io_port, np->s.io_ws);
#ifndef SYM_OPT_NO_BUS_MEMORY_MAPPING
if (np->s.mmio_va)
- pci_unmap_mem(np->s.mmio_va, np->s.io_ws);
+ pci_unmap_mem(np->s.mmio_va,
+ np->s.io_ws,
+ holding_io_request_lock);
if (np->s.ram_va)
- pci_unmap_mem(np->s.ram_va, np->ram_ws);
+ pci_unmap_mem(np->s.ram_va,
+ np->ram_ws,
+ holding_io_request_lock);
#endif
/*
* Free O/S independant resources.
if (!instance) return -1;
printf_info("%s: giving up ...\n", sym_name(np));
if (np)
- sym_free_resources(np);
+ sym_free_resources(np, 1);
scsi_unregister(instance);
return -1;
#ifdef SYM_CONF_IOMAPPED
release_region(devp->s.io_port, 128);
#else
- pci_unmap_mem((u_long) devp->s.mmio_va, 128ul);
+ pci_unmap_mem((u_long) devp->s.mmio_va, 128ul, 1);
#endif
}
#endif /* SYM_CONF_NVRAM_SUPPORT */
ram_ptr = pci_map_mem(base_2_c, ram_size);
if (ram_ptr) {
ram_val = readl_raw(ram_ptr + ram_size - 16);
- pci_unmap_mem(ram_ptr, ram_size);
+ pci_unmap_mem(ram_ptr, ram_size, 1);
if (ram_val == 0x52414944) {
printf_info("%s: not initializing, "
"driven by RAID controller.\n",
/*
* Free host resources
*/
- sym_free_resources(np);
+ sym_free_resources(np, 0);
return 1;
}