[PATCH 11/12] esp: enable CONFIG2_FENAB for am53c974

2014-11-24 Thread Hannes Reinecke
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.

Acked-by: David S. Miller da...@davemloft.net
Reviewed-by: Paolo Bonzini pbonz...@redhat.com
Signed-off-by: Hannes Reinecke h...@suse.de
---
 drivers/scsi/am53c974.c | 40 
 drivers/scsi/esp_scsi.c |  2 ++
 2 files changed, 42 insertions(+)

diff --git a/drivers/scsi/am53c974.c b/drivers/scsi/am53c974.c
index 6e88e38..25f0619 100644
--- a/drivers/scsi/am53c974.c
+++ b/drivers/scsi/am53c974.c
@@ -18,6 +18,7 @@
 #define DRV_MODULE_VERSION 1.00
 
 static bool am53c974_debug;
+static bool am53c974_fenab = true;
 
 #define esp_dma_log(f, a...)   \
do {\
@@ -256,6 +257,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);
@@ -268,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,
@@ -281,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,
 };
 
 /*
@@ -418,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)) {
@@ -541,5 +578,8 @@ MODULE_VERSION(DRV_MODULE_VERSION);
 module_param(am53c974_debug, bool, 0644);
 MODULE_PARM_DESC(am53c974_debug, Enable debugging);
 
+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 cfbae52..dc120f9 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;
-- 
1.8.5.2

--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 11/12] esp: enable CONFIG2_FENAB for am53c974

2014-11-21 Thread Hannes Reinecke
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 h...@suse.de
---
 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 h...@suse.de);
 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;
-- 
1.8.5.2

--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html