On Tue, Sep 15, 2009 at 03:25:55PM -0700, pbathija@xxxxxxxx wrote: >From: Pravin Bathija <pbathija@xxxxxxxx> > >Powerpc 44x uses 36 bit real address while the real address defined >in MPT Fusion driver is of type 32 bit. This causes ioremap to fail and driver >fails to initialize. This fix changes the data types representing the real >address from unsigned long 32-bit types to "phys_addr_t" which is 64-bit. The >driver has been tested, the disks get discovered correctly and can do IO. Also, >replaced phys_addr_t with resource_size_t as suggested by Ben. > >Signed-off-by: Pravin Bathija <pbathija@xxxxxxxx> >Acked-by: Feng Kan <fkan@xxxxxxxx> >Acked-by: Prodyut Hazarika <phazarika@xxxxxxxx> >Acked-by: Loc Ho <lho@xxxxxxxx> >Acked-by: Tirumala Reddy Marri <tmarri@xxxxxxxx> >Acked-by: Victor Gallardo <vgallardo@xxxxxxxx> Is this patch included in the scsi tree at all? I can't seem to find it in linux-next and I know it's not in the powerpc tree. Are there further changes needed, or has it simply been missed? josh > >--- > drivers/message/fusion/mptbase.c | 34 +++++++++++++++++++++++++--------- > drivers/message/fusion/mptbase.h | 5 +++-- > 2 files changed, 28 insertions(+), 11 deletions(-) > >diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c >index 5d496a9..e296f2e 100644 >--- a/drivers/message/fusion/mptbase.c >+++ b/drivers/message/fusion/mptbase.c >@@ -1510,11 +1510,12 @@ static int > mpt_mapresources(MPT_ADAPTER *ioc) > { > u8 __iomem *mem; >+ u8 __iomem *port; > int ii; >- unsigned long mem_phys; >- unsigned long port; >- u32 msize; >- u32 psize; >+ resource_size_t mem_phys; >+ resource_size_t port_phys; >+ resource_size_t msize; >+ resource_size_t psize; > u8 revision; > int r = -ENODEV; > struct pci_dev *pdev; >@@ -1552,13 +1553,13 @@ mpt_mapresources(MPT_ADAPTER *ioc) > } > > mem_phys = msize = 0; >- port = psize = 0; >+ port_phys = psize = 0; > for (ii = 0; ii < DEVICE_COUNT_RESOURCE; ii++) { > if (pci_resource_flags(pdev, ii) & PCI_BASE_ADDRESS_SPACE_IO) { > if (psize) > continue; > /* Get I/O space! */ >- port = pci_resource_start(pdev, ii); >+ port_phys = pci_resource_start(pdev, ii); > psize = pci_resource_len(pdev, ii); > } else { > if (msize) >@@ -1580,14 +1581,23 @@ mpt_mapresources(MPT_ADAPTER *ioc) > return -EINVAL; > } > ioc->memmap = mem; >- dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %lx\n", >- ioc->name, mem, mem_phys)); >+ dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "mem = %p, mem_phys = %llx\n", >+ ioc->name, mem, (u64)mem_phys)); > > ioc->mem_phys = mem_phys; > ioc->chip = (SYSIF_REGS __iomem *)mem; > > /* Save Port IO values in case we need to do downloadboot */ >- ioc->pio_mem_phys = port; >+ port = ioremap(port_phys, psize); >+ if (port == NULL) { >+ printk(MYIOC_s_ERR_FMT " : ERROR - Unable to map adapter" >+ " port !\n", ioc->name); >+ return -EINVAL; >+ } >+ ioc->portmap = port; >+ dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "port=%p, port_phys=%llx\n", >+ ioc->name, port, (u64)port_phys)); >+ ioc->pio_mem_phys = port_phys; > ioc->pio_chip = (SYSIF_REGS __iomem *)port; > > return 0; >@@ -1822,6 +1832,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) > if (ioc->alt_ioc) > ioc->alt_ioc->alt_ioc = NULL; > iounmap(ioc->memmap); >+ iounmap(ioc->portmap); > if (r != -5) > pci_release_selected_regions(pdev, ioc->bars); > >@@ -2583,6 +2594,11 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc) > ioc->memmap = NULL; > } > >+ if (ioc->portmap != NULL) { >+ iounmap(ioc->portmap); >+ ioc->portmap = NULL; >+ } >+ > pci_disable_device(ioc->pcidev); > pci_release_selected_regions(ioc->pcidev, ioc->bars); > >diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h >index b3e981d..7091f13 100644 >--- a/drivers/message/fusion/mptbase.h >+++ b/drivers/message/fusion/mptbase.h >@@ -584,8 +584,8 @@ typedef struct _MPT_ADAPTER > SYSIF_REGS __iomem *chip; /* == c8817000 (mmap) */ > SYSIF_REGS __iomem *pio_chip; /* Programmed IO (downloadboot) */ > u8 bus_type; >- u32 mem_phys; /* == f4020000 (mmap) */ >- u32 pio_mem_phys; /* Programmed IO (downloadboot) */ >+ resource_size_t mem_phys; /* == f4020000 (mmap) */ >+ resource_size_t pio_mem_phys; /* Programmed IO (downloadboot) */ > int mem_size; /* mmap memory size */ > int number_of_buses; > int devices_per_bus; >@@ -635,6 +635,7 @@ typedef struct _MPT_ADAPTER > int bars; /* bitmask of BAR's that must be configured */ > int msi_enable; > u8 __iomem *memmap; /* mmap address */ >+ u8 __iomem *portmap; /* mmap port address */ > struct Scsi_Host *sh; /* Scsi Host pointer */ > SpiCfgData spi_data; /* Scsi config. data */ > RaidCfgData raid_data; /* Raid config. data */ >-- >1.5.5 > >_______________________________________________ >Linuxppc-dev mailing list >Linuxppc-dev@xxxxxxxxxxxxxxxx >https://lists.ozlabs.org/listinfo/linuxppc-dev -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html