diff options
author | Finn Thain <fthain@telegraphics.com.au> | 2016-03-23 06:10:18 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-04-11 16:57:09 -0400 |
commit | 438af51c642926f1c1844846bee1c3fb568dcd64 (patch) | |
tree | d499b808b5aff4ba0c5bf151d06ffcd20d563da8 /drivers | |
parent | 6c4b88ca59ba1a68f707f19dba1744ed19e89fce (diff) |
ncr5380: Adopt uniform DMA setup convention
Standardize the DMA setup hooks so that the DMA implementation in
atari_NCR5380.c can be reconciled with pseudo DMA implementation in
NCR5380.c.
Calls to NCR5380_dma_recv_setup() and NCR5380_dma_send_setup() return
a negative value on failure, zero on PDMA transfer success and a positive
byte count for DMA setup success.
This convention is not entirely new, but is now applied consistently.
Also remove a pointless Status Register access: the *phase assignment is
redundant because after NCR5380_transfer_dma() returns control to
NCR5380_information_transfer(), that routine then returns control
to NCR5380_main(), which means *phase is dead.
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Tested-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/NCR5380.c | 21 | ||||
-rw-r--r-- | drivers/scsi/arm/cumana_1.c | 10 | ||||
-rw-r--r-- | drivers/scsi/arm/oak.c | 4 | ||||
-rw-r--r-- | drivers/scsi/atari_scsi.c | 3 |
4 files changed, 20 insertions, 18 deletions
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index b3e5b6b57d83..e05cf505f0d4 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c | |||
@@ -1431,7 +1431,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance, | |||
1431 | register unsigned char p = *phase; | 1431 | register unsigned char p = *phase; |
1432 | register unsigned char *d = *data; | 1432 | register unsigned char *d = *data; |
1433 | unsigned char tmp; | 1433 | unsigned char tmp; |
1434 | int foo; | 1434 | int result; |
1435 | 1435 | ||
1436 | if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) { | 1436 | if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) { |
1437 | *phase = tmp; | 1437 | *phase = tmp; |
@@ -1505,9 +1505,9 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance, | |||
1505 | */ | 1505 | */ |
1506 | 1506 | ||
1507 | if (p & SR_IO) { | 1507 | if (p & SR_IO) { |
1508 | foo = NCR5380_dma_recv_setup(instance, d, | 1508 | result = NCR5380_dma_recv_setup(instance, d, |
1509 | hostdata->flags & FLAG_DMA_FIXUP ? c - 1 : c); | 1509 | hostdata->flags & FLAG_DMA_FIXUP ? c - 1 : c); |
1510 | if (!foo && (hostdata->flags & FLAG_DMA_FIXUP)) { | 1510 | if (!result && (hostdata->flags & FLAG_DMA_FIXUP)) { |
1511 | /* | 1511 | /* |
1512 | * The workaround was to transfer fewer bytes than we | 1512 | * The workaround was to transfer fewer bytes than we |
1513 | * intended to with the pseudo-DMA read function, wait for | 1513 | * intended to with the pseudo-DMA read function, wait for |
@@ -1525,19 +1525,19 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance, | |||
1525 | 1525 | ||
1526 | if (NCR5380_poll_politely(instance, BUS_AND_STATUS_REG, | 1526 | if (NCR5380_poll_politely(instance, BUS_AND_STATUS_REG, |
1527 | BASR_DRQ, BASR_DRQ, HZ) < 0) { | 1527 | BASR_DRQ, BASR_DRQ, HZ) < 0) { |
1528 | foo = -1; | 1528 | result = -1; |
1529 | shost_printk(KERN_ERR, instance, "PDMA read: DRQ timeout\n"); | 1529 | shost_printk(KERN_ERR, instance, "PDMA read: DRQ timeout\n"); |
1530 | } | 1530 | } |
1531 | if (NCR5380_poll_politely(instance, STATUS_REG, | 1531 | if (NCR5380_poll_politely(instance, STATUS_REG, |
1532 | SR_REQ, 0, HZ) < 0) { | 1532 | SR_REQ, 0, HZ) < 0) { |
1533 | foo = -1; | 1533 | result = -1; |
1534 | shost_printk(KERN_ERR, instance, "PDMA read: !REQ timeout\n"); | 1534 | shost_printk(KERN_ERR, instance, "PDMA read: !REQ timeout\n"); |
1535 | } | 1535 | } |
1536 | d[c - 1] = NCR5380_read(INPUT_DATA_REG); | 1536 | d[c - 1] = NCR5380_read(INPUT_DATA_REG); |
1537 | } | 1537 | } |
1538 | } else { | 1538 | } else { |
1539 | foo = NCR5380_dma_send_setup(instance, d, c); | 1539 | result = NCR5380_dma_send_setup(instance, d, c); |
1540 | if (!foo && (hostdata->flags & FLAG_DMA_FIXUP)) { | 1540 | if (!result && (hostdata->flags & FLAG_DMA_FIXUP)) { |
1541 | /* | 1541 | /* |
1542 | * Wait for the last byte to be sent. If REQ is being asserted for | 1542 | * Wait for the last byte to be sent. If REQ is being asserted for |
1543 | * the byte we're interested, we'll ACK it and it will go false. | 1543 | * the byte we're interested, we'll ACK it and it will go false. |
@@ -1545,7 +1545,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance, | |||
1545 | if (NCR5380_poll_politely2(instance, | 1545 | if (NCR5380_poll_politely2(instance, |
1546 | BUS_AND_STATUS_REG, BASR_DRQ, BASR_DRQ, | 1546 | BUS_AND_STATUS_REG, BASR_DRQ, BASR_DRQ, |
1547 | BUS_AND_STATUS_REG, BASR_PHASE_MATCH, 0, HZ) < 0) { | 1547 | BUS_AND_STATUS_REG, BASR_PHASE_MATCH, 0, HZ) < 0) { |
1548 | foo = -1; | 1548 | result = -1; |
1549 | shost_printk(KERN_ERR, instance, "PDMA write: DRQ and phase timeout\n"); | 1549 | shost_printk(KERN_ERR, instance, "PDMA write: DRQ and phase timeout\n"); |
1550 | } | 1550 | } |
1551 | } | 1551 | } |
@@ -1555,8 +1555,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance, | |||
1555 | NCR5380_read(RESET_PARITY_INTERRUPT_REG); | 1555 | NCR5380_read(RESET_PARITY_INTERRUPT_REG); |
1556 | *data = d + c; | 1556 | *data = d + c; |
1557 | *count = 0; | 1557 | *count = 0; |
1558 | *phase = NCR5380_read(STATUS_REG) & PHASE_MASK; | 1558 | return result; |
1559 | return foo; | ||
1560 | } | 1559 | } |
1561 | 1560 | ||
1562 | /* | 1561 | /* |
@@ -1652,7 +1651,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) | |||
1652 | if (!cmd->device->borken) | 1651 | if (!cmd->device->borken) |
1653 | transfersize = NCR5380_dma_xfer_len(instance, cmd, phase); | 1652 | transfersize = NCR5380_dma_xfer_len(instance, cmd, phase); |
1654 | 1653 | ||
1655 | if (transfersize) { | 1654 | if (transfersize > 0) { |
1656 | len = transfersize; | 1655 | len = transfersize; |
1657 | if (NCR5380_transfer_dma(instance, &phase, | 1656 | if (NCR5380_transfer_dma(instance, &phase, |
1658 | &len, (unsigned char **)&cmd->SCp.ptr)) { | 1657 | &len, (unsigned char **)&cmd->SCp.ptr)) { |
diff --git a/drivers/scsi/arm/cumana_1.c b/drivers/scsi/arm/cumana_1.c index 7bcb66893059..402d984aa088 100644 --- a/drivers/scsi/arm/cumana_1.c +++ b/drivers/scsi/arm/cumana_1.c | |||
@@ -101,7 +101,10 @@ static inline int cumanascsi_pwrite(struct Scsi_Host *host, | |||
101 | } | 101 | } |
102 | end: | 102 | end: |
103 | writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL); | 103 | writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL); |
104 | return len; | 104 | |
105 | if (len) | ||
106 | return -1; | ||
107 | return 0; | ||
105 | } | 108 | } |
106 | 109 | ||
107 | static inline int cumanascsi_pread(struct Scsi_Host *host, | 110 | static inline int cumanascsi_pread(struct Scsi_Host *host, |
@@ -163,7 +166,10 @@ static inline int cumanascsi_pread(struct Scsi_Host *host, | |||
163 | } | 166 | } |
164 | end: | 167 | end: |
165 | writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL); | 168 | writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL); |
166 | return len; | 169 | |
170 | if (len) | ||
171 | return -1; | ||
172 | return 0; | ||
167 | } | 173 | } |
168 | 174 | ||
169 | static unsigned char cumanascsi_read(struct Scsi_Host *host, unsigned int reg) | 175 | static unsigned char cumanascsi_read(struct Scsi_Host *host, unsigned int reg) |
diff --git a/drivers/scsi/arm/oak.c b/drivers/scsi/arm/oak.c index 5d6e0e590638..05cf874fc739 100644 --- a/drivers/scsi/arm/oak.c +++ b/drivers/scsi/arm/oak.c | |||
@@ -47,13 +47,13 @@ static inline int oakscsi_pwrite(struct Scsi_Host *instance, | |||
47 | void __iomem *base = priv(instance)->base; | 47 | void __iomem *base = priv(instance)->base; |
48 | 48 | ||
49 | printk("writing %p len %d\n",addr, len); | 49 | printk("writing %p len %d\n",addr, len); |
50 | if(!len) return -1; | ||
51 | 50 | ||
52 | while(1) | 51 | while(1) |
53 | { | 52 | { |
54 | int status; | 53 | int status; |
55 | while (((status = readw(base + STAT)) & 0x100)==0); | 54 | while (((status = readw(base + STAT)) & 0x100)==0); |
56 | } | 55 | } |
56 | return 0; | ||
57 | } | 57 | } |
58 | 58 | ||
59 | static inline int oakscsi_pread(struct Scsi_Host *instance, | 59 | static inline int oakscsi_pread(struct Scsi_Host *instance, |
@@ -74,7 +74,7 @@ printk("reading %p len %d\n", addr, len); | |||
74 | if(status & 0x200 || !timeout) | 74 | if(status & 0x200 || !timeout) |
75 | { | 75 | { |
76 | printk("status = %08X\n", status); | 76 | printk("status = %08X\n", status); |
77 | return 1; | 77 | return -1; |
78 | } | 78 | } |
79 | } | 79 | } |
80 | 80 | ||
diff --git a/drivers/scsi/atari_scsi.c b/drivers/scsi/atari_scsi.c index 41ddd95cebe6..5a81cec79a59 100644 --- a/drivers/scsi/atari_scsi.c +++ b/drivers/scsi/atari_scsi.c | |||
@@ -527,9 +527,6 @@ static unsigned long atari_scsi_dma_setup(struct Scsi_Host *instance, | |||
527 | */ | 527 | */ |
528 | dma_cache_maintenance(addr, count, dir); | 528 | dma_cache_maintenance(addr, count, dir); |
529 | 529 | ||
530 | if (count == 0) | ||
531 | printk(KERN_NOTICE "SCSI warning: DMA programmed for 0 bytes !\n"); | ||
532 | |||
533 | if (IS_A_TT()) { | 530 | if (IS_A_TT()) { |
534 | tt_scsi_dma.dma_ctrl = dir; | 531 | tt_scsi_dma.dma_ctrl = dir; |
535 | SCSI_DMA_WRITE_P(dma_addr, addr); | 532 | SCSI_DMA_WRITE_P(dma_addr, addr); |