Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -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 */
+7 −15
Original line number Original line Diff line number Diff line
@@ -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)


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