[PATCH] [SCSI] mpt fusion: Fix 32 bit platforms with 64 bit resources.
Josh Boyer
jwboyer at linux.vnet.ibm.com
Fri Nov 6 00:43:30 EST 2009
On Tue, Sep 15, 2009 at 03:25:55PM -0700, pbathija at amcc.com wrote:
>From: Pravin Bathija <pbathija at amcc.com>
>
>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 at amcc.com>
>Acked-by: Feng Kan <fkan at amcc.com>
>Acked-by: Prodyut Hazarika <phazarika at amcc.com>
>Acked-by: Loc Ho <lho at amcc.com>
>Acked-by: Tirumala Reddy Marri <tmarri at amcc.com>
>Acked-by: Victor Gallardo <vgallardo at amcc.com>
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 at lists.ozlabs.org
>https://lists.ozlabs.org/listinfo/linuxppc-dev
More information about the Linuxppc-dev
mailing list