Commit 3776541d authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley

[SCSI] qla2xxx: Fix for 32-bit platforms with 64-bit resources.

The driver stores the contents of PCI resources into unsigned
long's before ioremapping. This breaks on 32-bit platforms which
support 64-bit MMIO resources.

Correct code by removing the temporary variables used during MMIO
PIO mapping and using resource_size_t where applicable.  Also
correct a small typo in a printk() where the wrong region number
was displayed.
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 43ef0580
...@@ -2271,8 +2271,7 @@ typedef struct scsi_qla_host { ...@@ -2271,8 +2271,7 @@ typedef struct scsi_qla_host {
int bars; int bars;
device_reg_t __iomem *iobase; /* Base I/O address */ device_reg_t __iomem *iobase; /* Base I/O address */
unsigned long pio_address; resource_size_t pio_address;
unsigned long pio_length;
#define MIN_IOBASE_LEN 0x100 #define MIN_IOBASE_LEN 0x100
/* ISP ring lock, rings, and indexes */ /* ISP ring lock, rings, and indexes */
......
...@@ -1479,8 +1479,7 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha) ...@@ -1479,8 +1479,7 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha)
static int static int
qla2x00_iospace_config(scsi_qla_host_t *ha) qla2x00_iospace_config(scsi_qla_host_t *ha)
{ {
unsigned long pio, pio_len, pio_flags; resource_size_t pio;
unsigned long mmio, mmio_len, mmio_flags;
if (pci_request_selected_regions(ha->pdev, ha->bars, if (pci_request_selected_regions(ha->pdev, ha->bars,
QLA2XXX_DRIVER_NAME)) { QLA2XXX_DRIVER_NAME)) {
...@@ -1495,10 +1494,8 @@ qla2x00_iospace_config(scsi_qla_host_t *ha) ...@@ -1495,10 +1494,8 @@ qla2x00_iospace_config(scsi_qla_host_t *ha)
/* We only need PIO for Flash operations on ISP2312 v2 chips. */ /* We only need PIO for Flash operations on ISP2312 v2 chips. */
pio = pci_resource_start(ha->pdev, 0); pio = pci_resource_start(ha->pdev, 0);
pio_len = pci_resource_len(ha->pdev, 0); if (pci_resource_flags(ha->pdev, 0) & IORESOURCE_IO) {
pio_flags = pci_resource_flags(ha->pdev, 0); if (pci_resource_len(ha->pdev, 0) < MIN_IOBASE_LEN) {
if (pio_flags & IORESOURCE_IO) {
if (pio_len < MIN_IOBASE_LEN) {
qla_printk(KERN_WARNING, ha, qla_printk(KERN_WARNING, ha,
"Invalid PCI I/O region size (%s)...\n", "Invalid PCI I/O region size (%s)...\n",
pci_name(ha->pdev)); pci_name(ha->pdev));
...@@ -1511,28 +1508,23 @@ qla2x00_iospace_config(scsi_qla_host_t *ha) ...@@ -1511,28 +1508,23 @@ qla2x00_iospace_config(scsi_qla_host_t *ha)
pio = 0; pio = 0;
} }
ha->pio_address = pio; ha->pio_address = pio;
ha->pio_length = pio_len;
skip_pio: skip_pio:
/* Use MMIO operations for all accesses. */ /* Use MMIO operations for all accesses. */
mmio = pci_resource_start(ha->pdev, 1); if (!(pci_resource_flags(ha->pdev, 1) & IORESOURCE_MEM)) {
mmio_len = pci_resource_len(ha->pdev, 1);
mmio_flags = pci_resource_flags(ha->pdev, 1);
if (!(mmio_flags & IORESOURCE_MEM)) {
qla_printk(KERN_ERR, ha, qla_printk(KERN_ERR, ha,
"region #0 not an MMIO resource (%s), aborting\n", "region #1 not an MMIO resource (%s), aborting\n",
pci_name(ha->pdev)); pci_name(ha->pdev));
goto iospace_error_exit; goto iospace_error_exit;
} }
if (mmio_len < MIN_IOBASE_LEN) { if (pci_resource_len(ha->pdev, 1) < MIN_IOBASE_LEN) {
qla_printk(KERN_ERR, ha, qla_printk(KERN_ERR, ha,
"Invalid PCI mem region size (%s), aborting\n", "Invalid PCI mem region size (%s), aborting\n",
pci_name(ha->pdev)); pci_name(ha->pdev));
goto iospace_error_exit; goto iospace_error_exit;
} }
ha->iobase = ioremap(mmio, MIN_IOBASE_LEN); ha->iobase = ioremap(pci_resource_start(ha->pdev, 1), MIN_IOBASE_LEN);
if (!ha->iobase) { if (!ha->iobase) {
qla_printk(KERN_ERR, ha, qla_printk(KERN_ERR, ha,
"cannot remap MMIO (%s), aborting\n", pci_name(ha->pdev)); "cannot remap MMIO (%s), aborting\n", pci_name(ha->pdev));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment