Re: [TESTERS NEEDED]: Rewritten ESP driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux