aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/am53c974.c40
-rw-r--r--drivers/scsi/esp_scsi.c2
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
20static bool am53c974_debug; 20static bool am53c974_debug;
21static 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
274static 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
271static const struct esp_driver_ops pci_esp_ops = { 301static 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);
541module_param(am53c974_debug, bool, 0644); 578module_param(am53c974_debug, bool, 0644);
542MODULE_PARM_DESC(am53c974_debug, "Enable debugging"); 579MODULE_PARM_DESC(am53c974_debug, "Enable debugging");
543 580
581module_param(am53c974_fenab, bool, 0444);
582MODULE_PARM_DESC(am53c974_fenab, "Enable 24-bit DMA transfer sizes");
583
544module_init(am53c974_module_init); 584module_init(am53c974_module_init);
545module_exit(am53c974_module_exit); 585module_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;