diff options
author | Christoph Hellwig <hch@lst.de> | 2018-10-18 09:10:16 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-11-15 14:27:08 -0500 |
commit | fdc32fb38d76f95fa98bc8efa6c3a91e68bab64c (patch) | |
tree | a783b88acff15fcc25350e7548b1414fbc067450 | |
parent | c79cd9a24ef71c5d9b9185a20b387391abaa6cc7 (diff) |
scsi: esas2r: use dma_set_mask_and_coherent
The driver currently uses pci_set_dma_mask despite otherwise using the
generic DMA API. Also move the dma_get_required_mask check before actually
setting the dma mask so that we don't end up with inconsistent settings in
corner cases.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/esas2r/esas2r_init.c | 49 |
1 files changed, 14 insertions, 35 deletions
diff --git a/drivers/scsi/esas2r/esas2r_init.c b/drivers/scsi/esas2r/esas2r_init.c index bbe77db8938d..46b2c83ba21f 100644 --- a/drivers/scsi/esas2r/esas2r_init.c +++ b/drivers/scsi/esas2r/esas2r_init.c | |||
@@ -266,6 +266,7 @@ int esas2r_init_adapter(struct Scsi_Host *host, struct pci_dev *pcid, | |||
266 | int i; | 266 | int i; |
267 | void *next_uncached; | 267 | void *next_uncached; |
268 | struct esas2r_request *first_request, *last_request; | 268 | struct esas2r_request *first_request, *last_request; |
269 | bool dma64 = false; | ||
269 | 270 | ||
270 | if (index >= MAX_ADAPTERS) { | 271 | if (index >= MAX_ADAPTERS) { |
271 | esas2r_log(ESAS2R_LOG_CRIT, | 272 | esas2r_log(ESAS2R_LOG_CRIT, |
@@ -286,42 +287,20 @@ int esas2r_init_adapter(struct Scsi_Host *host, struct pci_dev *pcid, | |||
286 | a->pcid = pcid; | 287 | a->pcid = pcid; |
287 | a->host = host; | 288 | a->host = host; |
288 | 289 | ||
289 | if (sizeof(dma_addr_t) > 4) { | 290 | if (sizeof(dma_addr_t) > 4 && |
290 | const uint64_t required_mask = dma_get_required_mask | 291 | dma_get_required_mask(&pcid->dev) > DMA_BIT_MASK(32) && |
291 | (&pcid->dev); | 292 | !dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(64))) |
292 | if (required_mask > DMA_BIT_MASK(32) | 293 | dma64 = true; |
293 | && !pci_set_dma_mask(pcid, DMA_BIT_MASK(64)) | 294 | |
294 | && !pci_set_consistent_dma_mask(pcid, | 295 | if (!dma64 && dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(32))) { |
295 | DMA_BIT_MASK(64))) { | 296 | esas2r_log(ESAS2R_LOG_CRIT, "failed to set DMA mask"); |
296 | esas2r_log_dev(ESAS2R_LOG_INFO, | 297 | esas2r_kill_adapter(index); |
297 | &(a->pcid->dev), | 298 | return 0; |
298 | "64-bit PCI addressing enabled\n"); | ||
299 | } else if (!pci_set_dma_mask(pcid, DMA_BIT_MASK(32)) | ||
300 | && !pci_set_consistent_dma_mask(pcid, | ||
301 | DMA_BIT_MASK(32))) { | ||
302 | esas2r_log_dev(ESAS2R_LOG_INFO, | ||
303 | &(a->pcid->dev), | ||
304 | "32-bit PCI addressing enabled\n"); | ||
305 | } else { | ||
306 | esas2r_log(ESAS2R_LOG_CRIT, | ||
307 | "failed to set DMA mask"); | ||
308 | esas2r_kill_adapter(index); | ||
309 | return 0; | ||
310 | } | ||
311 | } else { | ||
312 | if (!pci_set_dma_mask(pcid, DMA_BIT_MASK(32)) | ||
313 | && !pci_set_consistent_dma_mask(pcid, | ||
314 | DMA_BIT_MASK(32))) { | ||
315 | esas2r_log_dev(ESAS2R_LOG_INFO, | ||
316 | &(a->pcid->dev), | ||
317 | "32-bit PCI addressing enabled\n"); | ||
318 | } else { | ||
319 | esas2r_log(ESAS2R_LOG_CRIT, | ||
320 | "failed to set DMA mask"); | ||
321 | esas2r_kill_adapter(index); | ||
322 | return 0; | ||
323 | } | ||
324 | } | 299 | } |
300 | |||
301 | esas2r_log_dev(ESAS2R_LOG_INFO, &pcid->dev, | ||
302 | "%s-bit PCI addressing enabled\n", dma64 ? "64" : "32"); | ||
303 | |||
325 | esas2r_adapters[index] = a; | 304 | esas2r_adapters[index] = a; |
326 | sprintf(a->name, ESAS2R_DRVR_NAME "_%02d", index); | 305 | sprintf(a->name, ESAS2R_DRVR_NAME "_%02d", index); |
327 | esas2r_debug("new adapter %p, name %s", a, a->name); | 306 | esas2r_debug("new adapter %p, name %s", a, a->name); |