Hi Wolfgang, > -----Original Message----- > From: Wolfgang Denk [mailto:wd@xxxxxxx] > Sent: Thursday, December 03, 2009 12:56 AM > To: Pravin Bathija; Benjamin Herrenschmidt; Desai, Kashyap > Cc: linux-scsi@xxxxxxxxxxxxxxx; linuxppc-dev@xxxxxxxxxx; > Eric.Moore@xxxxxxx > Subject: Re: [PATCH] [SCSI] mpt fusion: Fix 32 bit platforms with 64 > bit resources. > > Dear Pravin Bathija, > > In message <1259805106-23636-1-git-send-email-pbathija@xxxxxxxx> you > wrote: > > 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 resource_size_t which > is 64-bit. The > > driver has been tested, the disks get discovered correctly and > can do IO. > ... > > --- a/drivers/message/fusion/mptbase.c > > +++ b/drivers/message/fusion/mptbase.c > > @@ -1511,7 +1511,7 @@ mpt_mapresources(MPT_ADAPTER *ioc) > > { > > u8 __iomem *mem; > > int ii; > > - unsigned long mem_phys; > > + resource_size_t mem_phys; > > unsigned long port; > > u32 msize; > > u32 psize; > > I'm not sure if this one-liner really covers all the related issues. > We submitted a similar (but apparently more complete) patch more than > a year ago. Dunno why it has never been picked up. See > http://thread.gmane.org/gmane.linux.scsi/46082 for reference. > I submitted a patch on similar lines several weeks ago and it wasn't accepted on grounds that it was too tied to the powerpc platform. Below is a link http://article.gmane.org/gmane.linux.scsi/55794 > > > From: Yuri Tikhonov <yur@xxxxxxxxxxx> > To: linux-scsi@xxxxxxxxxxxxxxx > Subject: [PATCH] mptbase: use resource_size_t instead of unsigned long > and u32 > Date: Thu, 13 Nov 2008 11:33:16 +0300 > > Hello, > > The following patch adds using resource_size_t for the > pci_resource_start()/pci_resource_len() return values. This > makes mptbase driver work correctly on 32 bit systems with > 64 bit resources (e.g. PPC440SPe). > > Do some minor cleanups in mpt_mapresources() as well. > > Signed-off-by: Yuri Tikhonov <yur@xxxxxxxxxxx> > Signed-off-by: Ilya Yanok <yanok@xxxxxxxxxxx> > --- > drivers/message/fusion/mptbase.c | 38 ++++++++++++++++++++++++++---- > -------- > drivers/message/fusion/mptbase.h | 5 +++-- > 2 files changed, 29 insertions(+), 14 deletions(-) > > diff --git a/drivers/message/fusion/mptbase.c > b/drivers/message/fusion/mptbase.c > index d6a0074..9daf844 100644 > --- a/drivers/message/fusion/mptbase.c > +++ b/drivers/message/fusion/mptbase.c > @@ -1488,11 +1488,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; > @@ -1530,13 +1531,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) > @@ -1546,11 +1547,8 @@ mpt_mapresources(MPT_ADAPTER *ioc) > msize = pci_resource_len(pdev, ii); > } > } > - ioc->mem_size = msize; > > - mem = NULL; > /* Get logical ptr for PciMem0 space */ > - /*mem = ioremap(mem_phys, msize);*/ > mem = ioremap(mem_phys, msize); > if (mem == NULL) { > printk(MYIOC_s_ERR_FMT ": ERROR - Unable to map adapter" > @@ -1558,14 +1556,24 @@ 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; > @@ -1790,6 +1798,7 @@ mpt_attach(struct pci_dev *pdev, const struct > pci_device_id *id) > list_del(&ioc->list); > if (ioc->alt_ioc) > ioc->alt_ioc->alt_ioc = NULL; > + iounmap(ioc->portmap); > iounmap(ioc->memmap); > if (r != -5) > pci_release_selected_regions(pdev, ioc->bars); > @@ -2547,6 +2556,11 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc) > ioc->pci_irq = -1; > } > > + if (ioc->portmap != NULL) { > + iounmap(ioc->portmap); > + ioc->portmap = NULL; > + } > + > if (ioc->memmap != NULL) { > iounmap(ioc->memmap); > ioc->memmap = NULL; > diff --git a/drivers/message/fusion/mptbase.h > b/drivers/message/fusion/mptbase.h > index dff048c..17826b3 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 address */ > struct Scsi_Host *sh; /* Scsi Host pointer */ > SpiCfgData spi_data; /* Scsi config. data */ > RaidCfgData raid_data; /* Raid config. data */ > -- > 1.5.6.1 > > > -- > Yuri Tikhonov, Senior Software Engineer > Emcraft Systems, www.emcraft.com > > > > > > > Best regards, > > Wolfgang Denk > > -- > DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany > Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@xxxxxxx > "I haven't lost my mind - it's backed up on tape somewhere." -- 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