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:
Родитель
c79cd9a24e
Коммит
fdc32fb38d
|
@ -266,6 +266,7 @@ int esas2r_init_adapter(struct Scsi_Host *host, struct pci_dev *pcid,
|
|||
int i;
|
||||
void *next_uncached;
|
||||
struct esas2r_request *first_request, *last_request;
|
||||
bool dma64 = false;
|
||||
|
||||
if (index >= MAX_ADAPTERS) {
|
||||
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->host = host;
|
||||
|
||||
if (sizeof(dma_addr_t) > 4) {
|
||||
const uint64_t required_mask = dma_get_required_mask
|
||||
(&pcid->dev);
|
||||
if (required_mask > DMA_BIT_MASK(32)
|
||||
&& !pci_set_dma_mask(pcid, DMA_BIT_MASK(64))
|
||||
&& !pci_set_consistent_dma_mask(pcid,
|
||||
DMA_BIT_MASK(64))) {
|
||||
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);
|
||||
return 0;
|
||||
}
|
||||
} 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);
|
||||
return 0;
|
||||
}
|
||||
if (sizeof(dma_addr_t) > 4 &&
|
||||
dma_get_required_mask(&pcid->dev) > DMA_BIT_MASK(32) &&
|
||||
!dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(64)))
|
||||
dma64 = true;
|
||||
|
||||
if (!dma64 && dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(32))) {
|
||||
esas2r_log(ESAS2R_LOG_CRIT, "failed to set DMA mask");
|
||||
esas2r_kill_adapter(index);
|
||||
return 0;
|
||||
}
|
||||
|
||||
esas2r_log_dev(ESAS2R_LOG_INFO, &pcid->dev,
|
||||
"%s-bit PCI addressing enabled\n", dma64 ? "64" : "32");
|
||||
|
||||
esas2r_adapters[index] = a;
|
||||
sprintf(a->name, ESAS2R_DRVR_NAME "_%02d", index);
|
||||
esas2r_debug("new adapter %p, name %s", a, a->name);
|
||||
|
|
Загрузка…
Ссылка в новой задаче