Patchwork [SCSI] mpt fusion: Fix 32 bit platforms with 64 bit resources.

login
register
mail settings
Submitter pbathija@amcc.com
Date Sept. 15, 2009, 10:25 p.m.
Message ID <1253053555-25097-1-git-send-email-pbathija@amcc.com>
Download mbox | patch
Permalink /patch/33678/
State Not Applicable
Headers show

Comments

pbathija@amcc.com - Sept. 15, 2009, 10:25 p.m.
From: Pravin Bathija <pbathija@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@amcc.com>
Acked-by: Feng Kan <fkan@amcc.com>
Acked-by: Prodyut Hazarika <phazarika@amcc.com>
Acked-by: Loc Ho <lho@amcc.com>
Acked-by: Tirumala Reddy Marri <tmarri@amcc.com>
Acked-by: Victor Gallardo <vgallardo@amcc.com>

---
 drivers/message/fusion/mptbase.c |   34 +++++++++++++++++++++++++---------
 drivers/message/fusion/mptbase.h |    5 +++--
 2 files changed, 28 insertions(+), 11 deletions(-)
Josh Boyer - Nov. 5, 2009, 1:43 p.m.
On Tue, Sep 15, 2009 at 03:25:55PM -0700, pbathija@amcc.com wrote:
>From: Pravin Bathija <pbathija@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@amcc.com>
>Acked-by: Feng Kan <fkan@amcc.com>
>Acked-by: Prodyut Hazarika <phazarika@amcc.com>
>Acked-by: Loc Ho <lho@amcc.com>
>Acked-by: Tirumala Reddy Marri <tmarri@amcc.com>
>Acked-by: Victor Gallardo <vgallardo@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@lists.ozlabs.org
>https://lists.ozlabs.org/listinfo/linuxppc-dev
James Bottomley - Nov. 5, 2009, 4:07 p.m.
On Thu, 2009-11-05 at 08:43 -0500, Josh Boyer wrote:
> On Tue, Sep 15, 2009 at 03:25:55PM -0700, pbathija@amcc.com wrote:
> >From: Pravin Bathija <pbathija@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@amcc.com>
> >Acked-by: Feng Kan <fkan@amcc.com>
> >Acked-by: Prodyut Hazarika <phazarika@amcc.com>
> >Acked-by: Loc Ho <lho@amcc.com>
> >Acked-by: Tirumala Reddy Marri <tmarri@amcc.com>
> >Acked-by: Victor Gallardo <vgallardo@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?

What was the feedback from LSI ... I haven't seen any here?

> 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;

So this looks problematic on a few platforms ... what happens to
platforms that have no IO space?  They automatically fail here and it
looks like the adapter never attaches.

James
Josh Boyer - Nov. 5, 2009, 4:25 p.m.
On Thu, Nov 05, 2009 at 10:07:06AM -0600, James Bottomley wrote:
>On Thu, 2009-11-05 at 08:43 -0500, Josh Boyer wrote:
>> On Tue, Sep 15, 2009 at 03:25:55PM -0700, pbathija@amcc.com wrote:
>> >From: Pravin Bathija <pbathija@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@amcc.com>
>> >Acked-by: Feng Kan <fkan@amcc.com>
>> >Acked-by: Prodyut Hazarika <phazarika@amcc.com>
>> >Acked-by: Loc Ho <lho@amcc.com>
>> >Acked-by: Tirumala Reddy Marri <tmarri@amcc.com>
>> >Acked-by: Victor Gallardo <vgallardo@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?
>
>What was the feedback from LSI ... I haven't seen any here?

I've seen no feedback on it anywhere.  The original patch used both
phys_addr_t and resource_size_t and Ben suggested they just use resource_size_t
everywhere.  Pravin reposted (which is this current patch) and it has sat here
since then.

josh
Benjamin Herrenschmidt - Nov. 5, 2009, 8 p.m.
On Thu, 2009-11-05 at 10:07 -0600, James Bottomley wrote:

> > > 	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;
> 
> So this looks problematic on a few platforms ... what happens to
> platforms that have no IO space?  They automatically fail here and it
> looks like the adapter never attaches.

Yup, that part of the patch looks wrong.

However, a mechanical replacement of unsigned long's with
resource_size_t to hold physical addresses should be fine despite the
lack of feedback from LSI.

Pravin, that ioremap definitely seems like it has nothing to do there,
port IO is already remapped for you by the core PCI code and should work
"as is". Please respin without that change.

Cheers,
Ben.
Desai, Kashyap - Nov. 6, 2009, 4:59 a.m.
-----Original Message-----
From: linux-scsi-owner@vger.kernel.org [mailto:linux-scsi-owner@vger.kernel.org] On Behalf Of Benjamin Herrenschmidt
Sent: Friday, November 06, 2009 1:30 AM
To: James Bottomley
Cc: Josh Boyer; Moore, Eric; pbathija@amcc.com; linux-scsi@vger.kernel.org; linuxppc-dev@ozlabs.org
Subject: Re: [PATCH] [SCSI] mpt fusion: Fix 32 bit platforms with 64 bit resources.

On Thu, 2009-11-05 at 10:07 -0600, James Bottomley wrote:

> > > 	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;
> 
> So this looks problematic on a few platforms ... what happens to
> platforms that have no IO space?  They automatically fail here and it
> looks like the adapter never attaches.

Yup, that part of the patch looks wrong.

However, a mechanical replacement of unsigned long's with
resource_size_t to hold physical addresses should be fine despite the
lack of feedback from LSI.

--> I was thinking this was actual fix for the issue. Use of resource_size_t is understood. Why submitter has added extra ioremap code in this patch? Because of ioremap code only this patch was on hold before going for ACK.
Pravin, Any specific reason to add above code?

Pravin, that ioremap definitely seems like it has nothing to do there,
port IO is already remapped for you by the core PCI code and should work
"as is". Please respin without that change.

Cheers,
Ben.


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
pbathija@amcc.com - Nov. 6, 2009, 5:49 a.m.
-----Original Message-----
From: Benjamin Herrenschmidt [mailto:benh@kernel.crashing.org]
Sent: Thu 11/5/2009 12:00 PM
To: James Bottomley
Cc: Josh Boyer; Eric.Moore@lsi.com; Pravin Bathija; linux-scsi@vger.kernel.org; linuxppc-dev@ozlabs.org
Subject: Re: [PATCH] [SCSI] mpt fusion: Fix 32 bit platforms with 64 bit resources.
 
On Thu, 2009-11-05 at 10:07 -0600, James Bottomley wrote:

> > > 	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;
> 
> So this looks problematic on a few platforms ... what happens to
> platforms that have no IO space?  They automatically fail here and it
> looks like the adapter never attaches.

> Yup, that part of the patch looks wrong.

> However, a mechanical replacement of unsigned long's with
> resource_size_t to hold physical addresses should be fine despite the
> lack of feedback from LSI.

> Pravin, that ioremap definitely seems like it has nothing to do there,
> port IO is already remapped for you by the core PCI code and should work
> "as is". Please respin without that change.

> Cheers,
>Ben.

Thanks for the input. Will make the suggested changes and re-submit the patch.

Regards,
Pravin
pbathija@amcc.com - Nov. 6, 2009, 5:57 a.m.
> -----Original Message-----
> From: Benjamin Herrenschmidt [mailto:benh@kernel.crashing.org]
> Sent: Thursday, November 05, 2009 12:00 PM
> To: James Bottomley
> Cc: Josh Boyer; Eric.Moore@lsi.com; Pravin Bathija; linux-
> scsi@vger.kernel.org; linuxppc-dev@ozlabs.org
> Subject: Re: [PATCH] [SCSI] mpt fusion: Fix 32 bit platforms with 64
> bit resources.
> 
> On Thu, 2009-11-05 at 10:07 -0600, James Bottomley wrote:
> 
> > > > 	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;
> >
> > So this looks problematic on a few platforms ... what happens to
> > platforms that have no IO space?  They automatically fail here and it
> > looks like the adapter never attaches.
> 
> Yup, that part of the patch looks wrong.
> 
> However, a mechanical replacement of unsigned long's with
> resource_size_t to hold physical addresses should be fine despite the
> lack of feedback from LSI.
> 
> Pravin, that ioremap definitely seems like it has nothing to do there,
> port IO is already remapped for you by the core PCI code and should
> work
> "as is". Please respin without that change.
> 
> Cheers,
> Ben.
> 

Thanks for the input. Will make the suggested changes and re-submit patch.
Regards,
Pravin

Patch

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 */