diff options
author | Hannes Reinecke <hare@suse.de> | 2007-02-07 03:47:44 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-02-10 13:58:06 -0500 |
commit | 19966769f9fc1968dcf5bffec2e53f7f40100872 (patch) | |
tree | c3ad06b0e898a9faa9a8ae61b50d29d99e043fc7 /drivers/scsi/aic7xxx/aic79xx_osm_pci.c | |
parent | 55048021177eee956af88333ec4565919c8567e4 (diff) |
[SCSI] aic79xx: use dma_get_required_mask()
As originally noted by Frederic Temporelli, the aic79xx supports 64
bit addressing, but the initialization code of the driver is wrong: it
tests the available memory size instead of testing the maximum
available memory address.
This patch uses the correct dma_get_required_mask() macros to
determine the correct addressing method.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Cc: Xavier Bru <xavier.bru@bull.net>
CC: Frederic Temporelli <frederic.temporelli@bull.net>
cosmetic fixes
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/aic7xxx/aic79xx_osm_pci.c')
-rw-r--r-- | drivers/scsi/aic7xxx/aic79xx_osm_pci.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c index 1a3ab6aa856b..c62ce41f2793 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c | |||
@@ -132,6 +132,7 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
132 | struct ahd_pci_identity *entry; | 132 | struct ahd_pci_identity *entry; |
133 | char *name; | 133 | char *name; |
134 | int error; | 134 | int error; |
135 | struct device *dev = &pdev->dev; | ||
135 | 136 | ||
136 | pci = pdev; | 137 | pci = pdev; |
137 | entry = ahd_find_pci_device(pci); | 138 | entry = ahd_find_pci_device(pci); |
@@ -161,20 +162,18 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
161 | pci_set_master(pdev); | 162 | pci_set_master(pdev); |
162 | 163 | ||
163 | if (sizeof(dma_addr_t) > 4) { | 164 | if (sizeof(dma_addr_t) > 4) { |
164 | uint64_t memsize; | 165 | const u64 required_mask = dma_get_required_mask(dev); |
165 | const uint64_t mask_39bit = 0x7FFFFFFFFFULL; | ||
166 | 166 | ||
167 | memsize = ahd_linux_get_memsize(); | 167 | if (required_mask > DMA_39BIT_MASK && |
168 | 168 | dma_set_mask(dev, DMA_64BIT_MASK) == 0) | |
169 | if (memsize >= 0x8000000000ULL | ||
170 | && pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) { | ||
171 | ahd->flags |= AHD_64BIT_ADDRESSING; | 169 | ahd->flags |= AHD_64BIT_ADDRESSING; |
172 | } else if (memsize > 0x80000000 | 170 | else if (required_mask > DMA_32BIT_MASK && |
173 | && pci_set_dma_mask(pdev, mask_39bit) == 0) { | 171 | dma_set_mask(dev, DMA_39BIT_MASK) == 0) |
174 | ahd->flags |= AHD_39BIT_ADDRESSING; | 172 | ahd->flags |= AHD_39BIT_ADDRESSING; |
175 | } | 173 | else |
174 | dma_set_mask(dev, DMA_32BIT_MASK); | ||
176 | } else { | 175 | } else { |
177 | pci_set_dma_mask(pdev, DMA_32BIT_MASK); | 176 | dma_set_mask(dev, DMA_32BIT_MASK); |
178 | } | 177 | } |
179 | ahd->dev_softc = pci; | 178 | ahd->dev_softc = pci; |
180 | error = ahd_pci_config(ahd, entry); | 179 | error = ahd_pci_config(ahd, entry); |