diff options
-rw-r--r-- | drivers/scsi/am53c974.c | 40 | ||||
-rw-r--r-- | drivers/scsi/esp_scsi.c | 2 |
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/scsi/am53c974.c b/drivers/scsi/am53c974.c index 6e88e38bd2a4..25f06196643e 100644 --- a/drivers/scsi/am53c974.c +++ b/drivers/scsi/am53c974.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #define DRV_MODULE_VERSION "1.00" | 18 | #define DRV_MODULE_VERSION "1.00" |
19 | 19 | ||
20 | static bool am53c974_debug; | 20 | static bool am53c974_debug; |
21 | static bool am53c974_fenab = true; | ||
21 | 22 | ||
22 | #define esp_dma_log(f, a...) \ | 23 | #define esp_dma_log(f, a...) \ |
23 | do { \ | 24 | do { \ |
@@ -256,6 +257,8 @@ static void pci_esp_send_dma_cmd(struct esp *esp, u32 addr, u32 esp_count, | |||
256 | 257 | ||
257 | pci_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); | 258 | pci_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW); |
258 | pci_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); | 259 | pci_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED); |
260 | if (esp->config2 & ESP_CONFIG2_FENAB) | ||
261 | pci_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI); | ||
259 | 262 | ||
260 | pci_esp_write32(esp, esp_count, ESP_DMA_STC); | 263 | pci_esp_write32(esp, esp_count, ESP_DMA_STC); |
261 | pci_esp_write32(esp, addr, ESP_DMA_SPA); | 264 | pci_esp_write32(esp, addr, ESP_DMA_SPA); |
@@ -268,6 +271,33 @@ static void pci_esp_send_dma_cmd(struct esp *esp, u32 addr, u32 esp_count, | |||
268 | pci_esp_write8(esp, ESP_DMA_CMD_START | val, ESP_DMA_CMD); | 271 | pci_esp_write8(esp, ESP_DMA_CMD_START | val, ESP_DMA_CMD); |
269 | } | 272 | } |
270 | 273 | ||
274 | static u32 pci_esp_dma_length_limit(struct esp *esp, u32 dma_addr, u32 dma_len) | ||
275 | { | ||
276 | int dma_limit = 16; | ||
277 | u32 base, end; | ||
278 | |||
279 | /* | ||
280 | * If CONFIG2_FENAB is set we can | ||
281 | * handle up to 24 bit addresses | ||
282 | */ | ||
283 | if (esp->config2 & ESP_CONFIG2_FENAB) | ||
284 | dma_limit = 24; | ||
285 | |||
286 | if (dma_len > (1U << dma_limit)) | ||
287 | dma_len = (1U << dma_limit); | ||
288 | |||
289 | /* | ||
290 | * Prevent crossing a 24-bit address boundary. | ||
291 | */ | ||
292 | base = dma_addr & ((1U << 24) - 1U); | ||
293 | end = base + dma_len; | ||
294 | if (end > (1U << 24)) | ||
295 | end = (1U <<24); | ||
296 | dma_len = end - base; | ||
297 | |||
298 | return dma_len; | ||
299 | } | ||
300 | |||
271 | static const struct esp_driver_ops pci_esp_ops = { | 301 | static const struct esp_driver_ops pci_esp_ops = { |
272 | .esp_write8 = pci_esp_write8, | 302 | .esp_write8 = pci_esp_write8, |
273 | .esp_read8 = pci_esp_read8, | 303 | .esp_read8 = pci_esp_read8, |
@@ -281,6 +311,7 @@ static const struct esp_driver_ops pci_esp_ops = { | |||
281 | .dma_invalidate = pci_esp_dma_invalidate, | 311 | .dma_invalidate = pci_esp_dma_invalidate, |
282 | .send_dma_cmd = pci_esp_send_dma_cmd, | 312 | .send_dma_cmd = pci_esp_send_dma_cmd, |
283 | .dma_error = pci_esp_dma_error, | 313 | .dma_error = pci_esp_dma_error, |
314 | .dma_length_limit = pci_esp_dma_length_limit, | ||
284 | }; | 315 | }; |
285 | 316 | ||
286 | /* | 317 | /* |
@@ -418,6 +449,12 @@ static int pci_esp_probe_one(struct pci_dev *pdev, | |||
418 | * DMA for command submission. | 449 | * DMA for command submission. |
419 | */ | 450 | */ |
420 | esp->flags |= ESP_FLAG_USE_FIFO; | 451 | esp->flags |= ESP_FLAG_USE_FIFO; |
452 | /* | ||
453 | * Enable CONFIG2_FENAB to allow for large DMA transfers | ||
454 | */ | ||
455 | if (am53c974_fenab) | ||
456 | esp->config2 |= ESP_CONFIG2_FENAB; | ||
457 | |||
421 | pep->esp = esp; | 458 | pep->esp = esp; |
422 | 459 | ||
423 | if (pci_request_regions(pdev, DRV_MODULE_NAME)) { | 460 | if (pci_request_regions(pdev, DRV_MODULE_NAME)) { |
@@ -541,5 +578,8 @@ MODULE_VERSION(DRV_MODULE_VERSION); | |||
541 | module_param(am53c974_debug, bool, 0644); | 578 | module_param(am53c974_debug, bool, 0644); |
542 | MODULE_PARM_DESC(am53c974_debug, "Enable debugging"); | 579 | MODULE_PARM_DESC(am53c974_debug, "Enable debugging"); |
543 | 580 | ||
581 | module_param(am53c974_fenab, bool, 0444); | ||
582 | MODULE_PARM_DESC(am53c974_fenab, "Enable 24-bit DMA transfer sizes"); | ||
583 | |||
544 | module_init(am53c974_module_init); | 584 | module_init(am53c974_module_init); |
545 | module_exit(am53c974_module_exit); | 585 | module_exit(am53c974_module_exit); |
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c index 8ea03af435ba..ce5bd52fe692 100644 --- a/drivers/scsi/esp_scsi.c +++ b/drivers/scsi/esp_scsi.c | |||
@@ -1343,6 +1343,8 @@ static int esp_data_bytes_sent(struct esp *esp, struct esp_cmd_entry *ent, | |||
1343 | (((unsigned int)esp_read8(ESP_TCMED)) << 8)); | 1343 | (((unsigned int)esp_read8(ESP_TCMED)) << 8)); |
1344 | if (esp->rev == FASHME) | 1344 | if (esp->rev == FASHME) |
1345 | ecount |= ((unsigned int)esp_read8(FAS_RLO)) << 16; | 1345 | ecount |= ((unsigned int)esp_read8(FAS_RLO)) << 16; |
1346 | if (esp->rev == PCSCSI && (esp->config2 & ESP_CONFIG2_FENAB)) | ||
1347 | ecount |= ((unsigned int)esp_read8(ESP_TCHI)) << 16; | ||
1346 | } | 1348 | } |
1347 | 1349 | ||
1348 | bytes_sent = esp->data_dma_len; | 1350 | bytes_sent = esp->data_dma_len; |