aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/am53c974.c
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2014-11-24 09:37:29 -0500
committerChristoph Hellwig <hch@lst.de>2014-11-24 10:13:17 -0500
commite858d930fe6c0baaad60bceb0aa1f44611eaf302 (patch)
treef9034d300a4c9f4435ddba047837611a7bfd6bdd /drivers/scsi/am53c974.c
parent8a9aeb45d0f16932f5dc78a48c09f5fc3ab13832 (diff)
esp_scsi: enable CONFIG2_FENAB for am53c974
CONFIG2_FENAB ('feature enable') changed definition between chip revisions, from 'Latch SCSI Phase' to 'Latch SCSI Phase, display chip ID upon reset, and enable 24 bit addresses'. So only enable it for am53c974 where we know what it's doing. Acked-by: David S. Miller <davem@davemloft.net> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi/am53c974.c')
-rw-r--r--drivers/scsi/am53c974.c40
1 files changed, 40 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);