Commit 8c6f803f authored by Finn Thain's avatar Finn Thain Committed by Martin K. Petersen

scsi: esp_scsi: Optimize PIO loops

Avoid function calls in the inner PIO loops. On a Centris 660av this
improves throughput for sequential read transfers by about 40% and
sequential write by about 10%.

Unfortunately it is not possible to have methods like .esp_write8 placed
inline so this is always going to be slow, even with LTO.
Tested-by: default avatarStan Johnson <userm57@yahoo.com>
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 53dce332
...@@ -2794,7 +2794,7 @@ static inline unsigned int esp_wait_for_fifo(struct esp *esp) ...@@ -2794,7 +2794,7 @@ static inline unsigned int esp_wait_for_fifo(struct esp *esp)
if (fbytes) if (fbytes)
return fbytes; return fbytes;
udelay(2); udelay(1);
} while (--i); } while (--i);
shost_printk(KERN_ERR, esp->host, "FIFO is empty. sreg [%02x]\n", shost_printk(KERN_ERR, esp->host, "FIFO is empty. sreg [%02x]\n",
...@@ -2811,7 +2811,7 @@ static inline int esp_wait_for_intr(struct esp *esp) ...@@ -2811,7 +2811,7 @@ static inline int esp_wait_for_intr(struct esp *esp)
if (esp->sreg & ESP_STAT_INTR) if (esp->sreg & ESP_STAT_INTR)
return 0; return 0;
udelay(2); udelay(1);
} while (--i); } while (--i);
shost_printk(KERN_ERR, esp->host, "IRQ timeout. sreg [%02x]\n", shost_printk(KERN_ERR, esp->host, "IRQ timeout. sreg [%02x]\n",
...@@ -2839,7 +2839,7 @@ void esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count, ...@@ -2839,7 +2839,7 @@ void esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count,
if (!esp_wait_for_fifo(esp)) if (!esp_wait_for_fifo(esp))
break; break;
*dst++ = esp_read8(ESP_FDATA); *dst++ = readb(esp->fifo_reg);
--esp_count; --esp_count;
if (!esp_count) if (!esp_count)
...@@ -2860,9 +2860,9 @@ void esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count, ...@@ -2860,9 +2860,9 @@ void esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count,
} }
if (phase == ESP_MIP) if (phase == ESP_MIP)
scsi_esp_cmd(esp, ESP_CMD_MOK); esp_write8(ESP_CMD_MOK, ESP_CMD);
scsi_esp_cmd(esp, ESP_CMD_TI); esp_write8(ESP_CMD_TI, ESP_CMD);
} }
} else { } else {
unsigned int n = ESP_FIFO_SIZE; unsigned int n = ESP_FIFO_SIZE;
...@@ -2902,7 +2902,7 @@ void esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count, ...@@ -2902,7 +2902,7 @@ void esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count,
src += n; src += n;
esp_count -= n; esp_count -= n;
scsi_esp_cmd(esp, ESP_CMD_TI); esp_write8(ESP_CMD_TI, ESP_CMD);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment