On 21/11/2014 13:41, Hannes Reinecke wrote:
> 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.
>
> Signed-off-by: Hannes Reinecke <[email protected]>
> ---
> drivers/scsi/am53c974.c | 41 +++++++++++++++++++++++++++++++++++++++++
> drivers/scsi/esp_scsi.c | 2 ++
> 2 files changed, 43 insertions(+)
>
> diff --git a/drivers/scsi/am53c974.c b/drivers/scsi/am53c974.c
> index 340cb2f..55622eb 100644
> --- a/drivers/scsi/am53c974.c
> +++ b/drivers/scsi/am53c974.c
> @@ -17,6 +17,8 @@
> #define DRV_MODULE_NAME "am53c974"
> #define DRV_MODULE_VERSION "1.00"
>
> +static bool am53c974_fenab = true;
> +
> // #define ESP_DMA_DEBUG
>
> #define ESP_DMA_CMD 0x10
> @@ -254,6 +256,8 @@ static void pci_esp_send_dma_cmd(struct esp *esp, u32
> addr, u32 esp_count,
>
> pci_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
> pci_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
> + if (esp->config2 & ESP_CONFIG2_FENAB)
> + pci_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
>
> pci_esp_write32(esp, esp_count, ESP_DMA_STC);
> pci_esp_write32(esp, addr, ESP_DMA_SPA);
> @@ -267,6 +271,33 @@ static void pci_esp_send_dma_cmd(struct esp *esp, u32
> addr, u32 esp_count,
> pci_esp_write8(esp, ESP_DMA_CMD_START | val, ESP_DMA_CMD);
> }
>
> +static u32 pci_esp_dma_length_limit(struct esp *esp, u32 dma_addr, u32
> dma_len)
> +{
> + int dma_limit = 16;
> + u32 base, end;
> +
> + /*
> + * If CONFIG2_FENAB is set we can
> + * handle up to 24 bit addresses
> + */
> + if (esp->config2 & ESP_CONFIG2_FENAB)
> + dma_limit = 24;
> +
> + if (dma_len > (1U << dma_limit))
> + dma_len = (1U << dma_limit);
> +
> + /*
> + * Prevent crossing a 24-bit address boundary.
> + */
> + base = dma_addr & ((1U << 24) - 1U);
> + end = base + dma_len;
> + if (end > (1U << 24))
> + end = (1U <<24);
> + dma_len = end - base;
> +
> + return dma_len;
> +}
> +
> static const struct esp_driver_ops pci_esp_ops = {
> .esp_write8 = pci_esp_write8,
> .esp_read8 = pci_esp_read8,
> @@ -280,6 +311,7 @@ static const struct esp_driver_ops pci_esp_ops = {
> .dma_invalidate = pci_esp_dma_invalidate,
> .send_dma_cmd = pci_esp_send_dma_cmd,
> .dma_error = pci_esp_dma_error,
> + .dma_length_limit = pci_esp_dma_length_limit,
> };
>
> /*
> @@ -417,6 +449,12 @@ static int pci_esp_probe_one(struct pci_dev *pdev,
> * DMA for command submission.
> */
> esp->flags |= ESP_FLAG_USE_FIFO;
> + /*
> + * Enable CONFIG2_FENAB to allow for large DMA transfers
> + */
> + if (am53c974_fenab)
> + esp->config2 |= ESP_CONFIG2_FENAB;
> +
> pep->esp = esp;
>
> if (pci_request_regions(pdev, DRV_MODULE_NAME)) {
> @@ -535,5 +573,8 @@ MODULE_AUTHOR("Hannes Reinecke <[email protected]>");
> MODULE_LICENSE("GPL");
> MODULE_VERSION(DRV_MODULE_VERSION);
>
> +module_param(am53c974_fenab, bool, 0444);
> +MODULE_PARM_DESC(am53c974_fenab, "Enable 24-bit DMA transfer sizes");
> +
> module_init(am53c974_module_init);
> module_exit(am53c974_module_exit);
> diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c
> index bd17516..56f361e 100644
> --- a/drivers/scsi/esp_scsi.c
> +++ b/drivers/scsi/esp_scsi.c
> @@ -1343,6 +1343,8 @@ static int esp_data_bytes_sent(struct esp *esp, struct
> esp_cmd_entry *ent,
> (((unsigned int)esp_read8(ESP_TCMED)) << 8));
> if (esp->rev == FASHME)
> ecount |= ((unsigned int)esp_read8(FAS_RLO)) << 16;
> + if (esp->rev == PCSCSI && (esp->config2 & ESP_CONFIG2_FENAB))
> + ecount |= ((unsigned int)esp_read8(ESP_TCHI)) << 16;
> }
>
> bytes_sent = esp->data_dma_len;
>
Reviewed-by: Paolo Bonzini <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html