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>
This commit is contained in:
parent
c79cd9a24e
commit
fdc32fb38d
1 changed files with 14 additions and 35 deletions
|
@ -266,6 +266,7 @@ int esas2r_init_adapter(struct Scsi_Host *host, struct pci_dev *pcid,
|
||||||
int i;
|
int i;
|
||||||
void *next_uncached;
|
void *next_uncached;
|
||||||
struct esas2r_request *first_request, *last_request;
|
struct esas2r_request *first_request, *last_request;
|
||||||
|
bool dma64 = false;
|
||||||
|
|
||||||
if (index >= MAX_ADAPTERS) {
|
if (index >= MAX_ADAPTERS) {
|
||||||
esas2r_log(ESAS2R_LOG_CRIT,
|
esas2r_log(ESAS2R_LOG_CRIT,
|
||||||
|
@ -286,42 +287,20 @@ int esas2r_init_adapter(struct Scsi_Host *host, struct pci_dev *pcid,
|
||||||
a->pcid = pcid;
|
a->pcid = pcid;
|
||||||
a->host = host;
|
a->host = host;
|
||||||
|
|
||||||
if (sizeof(dma_addr_t) > 4) {
|
if (sizeof(dma_addr_t) > 4 &&
|
||||||
const uint64_t required_mask = dma_get_required_mask
|
dma_get_required_mask(&pcid->dev) > DMA_BIT_MASK(32) &&
|
||||||
(&pcid->dev);
|
!dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(64)))
|
||||||
if (required_mask > DMA_BIT_MASK(32)
|
dma64 = true;
|
||||||
&& !pci_set_dma_mask(pcid, DMA_BIT_MASK(64))
|
|
||||||
&& !pci_set_consistent_dma_mask(pcid,
|
if (!dma64 && dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(32))) {
|
||||||
DMA_BIT_MASK(64))) {
|
esas2r_log(ESAS2R_LOG_CRIT, "failed to set DMA mask");
|
||||||
esas2r_log_dev(ESAS2R_LOG_INFO,
|
|
||||||
&(a->pcid->dev),
|
|
||||||
"64-bit PCI addressing enabled\n");
|
|
||||||
} else if (!pci_set_dma_mask(pcid, DMA_BIT_MASK(32))
|
|
||||||
&& !pci_set_consistent_dma_mask(pcid,
|
|
||||||
DMA_BIT_MASK(32))) {
|
|
||||||
esas2r_log_dev(ESAS2R_LOG_INFO,
|
|
||||||
&(a->pcid->dev),
|
|
||||||
"32-bit PCI addressing enabled\n");
|
|
||||||
} else {
|
|
||||||
esas2r_log(ESAS2R_LOG_CRIT,
|
|
||||||
"failed to set DMA mask");
|
|
||||||
esas2r_kill_adapter(index);
|
esas2r_kill_adapter(index);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (!pci_set_dma_mask(pcid, DMA_BIT_MASK(32))
|
esas2r_log_dev(ESAS2R_LOG_INFO, &pcid->dev,
|
||||||
&& !pci_set_consistent_dma_mask(pcid,
|
"%s-bit PCI addressing enabled\n", dma64 ? "64" : "32");
|
||||||
DMA_BIT_MASK(32))) {
|
|
||||||
esas2r_log_dev(ESAS2R_LOG_INFO,
|
|
||||||
&(a->pcid->dev),
|
|
||||||
"32-bit PCI addressing enabled\n");
|
|
||||||
} else {
|
|
||||||
esas2r_log(ESAS2R_LOG_CRIT,
|
|
||||||
"failed to set DMA mask");
|
|
||||||
esas2r_kill_adapter(index);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
esas2r_adapters[index] = a;
|
esas2r_adapters[index] = a;
|
||||||
sprintf(a->name, ESAS2R_DRVR_NAME "_%02d", index);
|
sprintf(a->name, ESAS2R_DRVR_NAME "_%02d", index);
|
||||||
esas2r_debug("new adapter %p, name %s", a, a->name);
|
esas2r_debug("new adapter %p, name %s", a, a->name);
|
||||||
|
|
Loading…
Add table
Reference in a new issue