From: "Adam Kropelin" <akropel1@xxxxxxxxxxxxxxxx> Date: Sun, 15 Apr 2007 12:03:26 -0400 > ESP: data done csr[a6400310] flgs[1] sent[73728] > ESP: start data addr[c004c000] len[0] write(1) > esp: esp0: DMA error, csr=a440031e I know what this bug is, it should be fixed by the following patch, please give it a try. I'll also add an assertion on zero transfer length when we start a data transfer, that should never happen and is specifically what led to the DMA error in this case. commit 539d62c1f2b2b9ad2ace13ce2c7fc0aa47db87c3 Author: David S. Miller <davem@xxxxxxxxxxxxxxxxxxxx> Date: Sat Apr 14 20:03:25 2007 -0700 [SCSI] SUNESP: Fix partial transfer length calculations. If we limited the DMA transfer length due to chip limitations we might calculate a partial transfer length incorrectly in esp_data_bytes_sent(). Fix this by remembering the DMA length we actually used for the data phase transfer in esp->data_dma_len. Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx> diff --git a/drivers/scsi/esp.c b/drivers/scsi/esp.c index dc25b1e..7882fc7 100644 --- a/drivers/scsi/esp.c +++ b/drivers/scsi/esp.c @@ -1567,7 +1567,7 @@ static int esp_data_bytes_sent(struct esp *esp, struct esp_cmd_entry *ent, ecount |= ((unsigned int)esp_read8(FAS_RLO)) << 16; } - bytes_sent = esp_cur_dma_len(cmd); + bytes_sent = esp->data_dma_len; bytes_sent -= ecount; if (!(ent->flags & ESP_CMD_FLAG_WRITE)) @@ -1956,6 +1956,7 @@ again: ent->flags &= ~ESP_CMD_FLAG_WRITE; dma_len = esp_dma_length_limit(esp, dma_addr, dma_len); + esp->data_dma_len = dma_len; esp_log_datastart("ESP: start data addr[%08x] len[%u] " "write(%d)\n", diff --git a/drivers/scsi/esp.h b/drivers/scsi/esp.h index 2b3d969..bd3237d 100644 --- a/drivers/scsi/esp.h +++ b/drivers/scsi/esp.h @@ -364,6 +364,8 @@ struct esp { u8 *command_block; dma_addr_t command_block_dma; + unsigned int data_dma_len; + /* The following are used to determine the cause of an IRQ. Upon every * IRQ entry we synchronize these with the hardware registers. */ - To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html