Skip to content

Commit

Permalink
[SCSI] m68k: mac_esp asm fix
Browse files Browse the repository at this point in the history
Fix asm constraints and arguments so as not to transfer an odd byte when
there may be more words to transfer. The bug would probably also cause
exceptions sometimes by transferring one too many bytes.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
  • Loading branch information
Finn Thain authored and James Bottomley committed Dec 29, 2008
1 parent 749af3d commit 09e13e9
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions drivers/scsi/mac_esp.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ static inline int mac_esp_wait_for_dreq(struct esp *esp)

#define MAC_ESP_PDMA_LOOP(operands) \
asm volatile ( \
" tstw %2 \n" \
" tstw %1 \n" \
" jbeq 20f \n" \
"1: movew " operands " \n" \
"2: movew " operands " \n" \
Expand All @@ -188,14 +188,14 @@ static inline int mac_esp_wait_for_dreq(struct esp *esp)
"14: movew " operands " \n" \
"15: movew " operands " \n" \
"16: movew " operands " \n" \
" subqw #1,%2 \n" \
" subqw #1,%1 \n" \
" jbne 1b \n" \
"20: tstw %3 \n" \
"20: tstw %2 \n" \
" jbeq 30f \n" \
"21: movew " operands " \n" \
" subqw #1,%3 \n" \
" subqw #1,%2 \n" \
" jbne 21b \n" \
"30: tstw %4 \n" \
"30: tstw %3 \n" \
" jbeq 40f \n" \
"31: moveb " operands " \n" \
"32: nop \n" \
Expand Down Expand Up @@ -223,8 +223,8 @@ static inline int mac_esp_wait_for_dreq(struct esp *esp)
" .long 31b,40b \n" \
" .long 32b,40b \n" \
" .previous \n" \
: "+a" (addr) \
: "a" (mep->pdma_io), "r" (count32), "r" (count2), "g" (esp_count))
: "+a" (addr), "+r" (count32), "+r" (count2) \
: "g" (count1), "a" (mep->pdma_io))

static void mac_esp_send_pdma_cmd(struct esp *esp, u32 addr, u32 esp_count,
u32 dma_count, int write, u8 cmd)
Expand All @@ -247,19 +247,20 @@ static void mac_esp_send_pdma_cmd(struct esp *esp, u32 addr, u32 esp_count,
do {
unsigned int count32 = esp_count >> 5;
unsigned int count2 = (esp_count & 0x1F) >> 1;
unsigned int count1 = esp_count & 1;
unsigned int start_addr = addr;

if (mac_esp_wait_for_dreq(esp))
break;

if (write) {
MAC_ESP_PDMA_LOOP("%1@,%0@+");
MAC_ESP_PDMA_LOOP("%4@,%0@+");

esp_count -= addr - start_addr;
} else {
unsigned int n;

MAC_ESP_PDMA_LOOP("%0@+,%1@");
MAC_ESP_PDMA_LOOP("%0@+,%4@");

if (mac_esp_wait_for_empty_fifo(esp))
break;
Expand Down

0 comments on commit 09e13e9

Please sign in to comment.