git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
loop: add ioctl to resize a loop device
[safe/jmp/linux-2.6]
/
drivers
/
scsi
/
esp_scsi.c
diff --git
a/drivers/scsi/esp_scsi.c
b/drivers/scsi/esp_scsi.c
index
77b06a9
..
a680e18
100644
(file)
--- a/
drivers/scsi/esp_scsi.c
+++ b/
drivers/scsi/esp_scsi.c
@@
-219,19
+219,10
@@
static void esp_reset_esp(struct esp *esp)
/* Now reset the ESP chip */
scsi_esp_cmd(esp, ESP_CMD_RC);
scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
/* Now reset the ESP chip */
scsi_esp_cmd(esp, ESP_CMD_RC);
scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
+ if (esp->rev == FAST)
+ esp_write8(ESP_CONFIG2_FENAB, ESP_CFG2);
scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
scsi_esp_cmd(esp, ESP_CMD_NULL | ESP_CMD_DMA);
- /* Reload the configuration registers */
- esp_write8(esp->cfact, ESP_CFACT);
-
- esp->prev_stp = 0;
- esp_write8(esp->prev_stp, ESP_STP);
-
- esp->prev_soff = 0;
- esp_write8(esp->prev_soff, ESP_SOFF);
-
- esp_write8(esp->neg_defp, ESP_TIMEO);
-
/* This is the only point at which it is reliable to read
* the ID-code for a fast ESP chip variants.
*/
/* This is the only point at which it is reliable to read
* the ID-code for a fast ESP chip variants.
*/
@@
-316,6
+307,17
@@
static void esp_reset_esp(struct esp *esp)
break;
}
break;
}
+ /* Reload the configuration registers */
+ esp_write8(esp->cfact, ESP_CFACT);
+
+ esp->prev_stp = 0;
+ esp_write8(esp->prev_stp, ESP_STP);
+
+ esp->prev_soff = 0;
+ esp_write8(esp->prev_soff, ESP_SOFF);
+
+ esp_write8(esp->neg_defp, ESP_TIMEO);
+
/* Eat any bitrot in the chip */
esp_read8(ESP_INTRPT);
udelay(100);
/* Eat any bitrot in the chip */
esp_read8(ESP_INTRPT);
udelay(100);
@@
-978,7
+980,7
@@
static int esp_check_spur_intr(struct esp *esp)
*/
if (!esp->ops->dma_error(esp)) {
printk(KERN_ERR PFX "esp%d: Spurious irq, "
*/
if (!esp->ops->dma_error(esp)) {
printk(KERN_ERR PFX "esp%d: Spurious irq, "
- "sreg=%x.\n",
+ "sreg=%
02
x.\n",
esp->host->unique_id, esp->sreg);
return -1;
}
esp->host->unique_id, esp->sreg);
return -1;
}
@@
-1447,8
+1449,11
@@
static void esp_msgin_sdtr(struct esp *esp, struct esp_target_data *tp)
if (offset > 15)
goto do_reject;
if (offset > 15)
goto do_reject;
+ if (esp->flags & ESP_FLAG_DISABLE_SYNC)
+ offset = 0;
+
if (offset) {
if (offset) {
- int
rounded_up,
one_clock;
+ int one_clock;
if (period > esp->max_period) {
period = offset = 0;
if (period > esp->max_period) {
period = offset = 0;
@@
-1458,9
+1463,7
@@
static void esp_msgin_sdtr(struct esp *esp, struct esp_target_data *tp)
goto do_reject;
one_clock = esp->ccycle / 1000;
goto do_reject;
one_clock = esp->ccycle / 1000;
- rounded_up = (period << 2);
- rounded_up = (rounded_up + one_clock - 1) / one_clock;
- stp = rounded_up;
+ stp = DIV_ROUND_UP(period << 2, one_clock);
if (stp && esp->rev >= FAS236) {
if (stp >= 50)
stp--;
if (stp && esp->rev >= FAS236) {
if (stp >= 50)
stp--;
@@
-1697,7
+1700,12
@@
again:
else
ent->flags &= ~ESP_CMD_FLAG_WRITE;
else
ent->flags &= ~ESP_CMD_FLAG_WRITE;
- dma_len = esp_dma_length_limit(esp, dma_addr, dma_len);
+ if (esp->ops->dma_length_limit)
+ dma_len = esp->ops->dma_length_limit(esp, dma_addr,
+ dma_len);
+ else
+ dma_len = esp_dma_length_limit(esp, dma_addr, dma_len);
+
esp->data_dma_len = dma_len;
if (!dma_len) {
esp->data_dma_len = dma_len;
if (!dma_len) {
@@
-1761,7
+1769,6
@@
again:
esp_advance_dma(esp, ent, cmd, bytes_sent);
esp_event(esp, ESP_EVENT_CHECK_PHASE);
goto again;
esp_advance_dma(esp, ent, cmd, bytes_sent);
esp_event(esp, ESP_EVENT_CHECK_PHASE);
goto again;
- break;
}
case ESP_EVENT_STATUS: {
}
case ESP_EVENT_STATUS: {
@@
-2026,8
+2033,8
@@
static void esp_reset_cleanup(struct esp *esp)
tp->flags |= ESP_TGT_CHECK_NEGO;
if (tp->starget)
tp->flags |= ESP_TGT_CHECK_NEGO;
if (tp->starget)
- starget_for_each_device(tp->starget, NULL,
- esp_clear_hold);
+
__
starget_for_each_device(tp->starget, NULL,
+
esp_clear_hold);
}
esp->flags &= ~ESP_FLAG_RESETTING;
}
}
esp->flags &= ~ESP_FLAG_RESETTING;
}
@@
-2138,7
+2145,7
@@
irqreturn_t scsi_esp_intr(int irq, void *dev_id)
}
EXPORT_SYMBOL(scsi_esp_intr);
}
EXPORT_SYMBOL(scsi_esp_intr);
-static void
__devinit
esp_get_revision(struct esp *esp)
+static void esp_get_revision(struct esp *esp)
{
u8 val;
{
u8 val;
@@
-2187,7
+2194,7
@@
static void __devinit esp_get_revision(struct esp *esp)
}
}
}
}
-static void
__devinit
esp_init_swstate(struct esp *esp)
+static void esp_init_swstate(struct esp *esp)
{
int i;
{
int i;
@@
-2233,9
+2240,9
@@
static void esp_bootup_reset(struct esp *esp)
esp_read8(ESP_INTRPT);
}
esp_read8(ESP_INTRPT);
}
-static void
__devinit
esp_set_clock_params(struct esp *esp)
+static void esp_set_clock_params(struct esp *esp)
{
{
- int f
m
hz;
+ int fhz;
u8 ccf;
/* This is getting messy but it has to be done correctly or else
u8 ccf;
/* This is getting messy but it has to be done correctly or else
@@
-2270,9
+2277,9
@@
static void __devinit esp_set_clock_params(struct esp *esp)
* This entails the smallest and largest sync period we could ever
* handle on this ESP.
*/
* This entails the smallest and largest sync period we could ever
* handle on this ESP.
*/
- f
m
hz = esp->cfreq;
+ fhz = esp->cfreq;
- ccf = ((f
m
hz / 1000000) + 4) / 5;
+ ccf = ((fhz / 1000000) + 4) / 5;
if (ccf == 1)
ccf = 2;
if (ccf == 1)
ccf = 2;
@@
-2281,16
+2288,16
@@
static void __devinit esp_set_clock_params(struct esp *esp)
* been unable to find the clock-frequency PROM property. All
* other machines provide useful values it seems.
*/
* been unable to find the clock-frequency PROM property. All
* other machines provide useful values it seems.
*/
- if (f
m
hz <= 5000000 || ccf < 1 || ccf > 8) {
- f
m
hz = 20000000;
+ if (fhz <= 5000000 || ccf < 1 || ccf > 8) {
+ fhz = 20000000;
ccf = 4;
}
esp->cfact = (ccf == 8 ? 0 : ccf);
ccf = 4;
}
esp->cfact = (ccf == 8 ? 0 : ccf);
- esp->cfreq = f
m
hz;
- esp->ccycle = ESP_
MHZ_TO_CYCLE(fm
hz);
+ esp->cfreq = fhz;
+ esp->ccycle = ESP_
HZ_TO_CYCLE(f
hz);
esp->ctick = ESP_TICK(ccf, esp->ccycle);
esp->ctick = ESP_TICK(ccf, esp->ccycle);
- esp->neg_defp = ESP_NEG_DEFP(f
m
hz, ccf);
+ esp->neg_defp = ESP_NEG_DEFP(fhz, ccf);
esp->sync_defp = SYNC_DEFP_SLOW;
}
esp->sync_defp = SYNC_DEFP_SLOW;
}
@@
-2306,7
+2313,7
@@
static const char *esp_chip_names[] = {
static struct scsi_transport_template *esp_transport_template;
static struct scsi_transport_template *esp_transport_template;
-int
__devinit
scsi_esp_register(struct esp *esp, struct device *dev)
+int scsi_esp_register(struct esp *esp, struct device *dev)
{
static int instance;
int err;
{
static int instance;
int err;
@@
-2314,6
+2321,7
@@
int __devinit scsi_esp_register(struct esp *esp, struct device *dev)
esp->host->transportt = esp_transport_template;
esp->host->max_lun = ESP_MAX_LUN;
esp->host->cmd_per_lun = 2;
esp->host->transportt = esp_transport_template;
esp->host->max_lun = ESP_MAX_LUN;
esp->host->cmd_per_lun = 2;
+ esp->host->unique_id = instance;
esp_set_clock_params(esp);
esp_set_clock_params(esp);
@@
-2337,7
+2345,7
@@
int __devinit scsi_esp_register(struct esp *esp, struct device *dev)
if (err)
return err;
if (err)
return err;
-
esp->host->unique_id =
instance++;
+ instance++;
scsi_scan_host(esp->host);
scsi_scan_host(esp->host);
@@
-2345,12
+2353,30
@@
int __devinit scsi_esp_register(struct esp *esp, struct device *dev)
}
EXPORT_SYMBOL(scsi_esp_register);
}
EXPORT_SYMBOL(scsi_esp_register);
-void
__devexit
scsi_esp_unregister(struct esp *esp)
+void scsi_esp_unregister(struct esp *esp)
{
scsi_remove_host(esp->host);
}
EXPORT_SYMBOL(scsi_esp_unregister);
{
scsi_remove_host(esp->host);
}
EXPORT_SYMBOL(scsi_esp_unregister);
+static int esp_target_alloc(struct scsi_target *starget)
+{
+ struct esp *esp = shost_priv(dev_to_shost(&starget->dev));
+ struct esp_target_data *tp = &esp->target[starget->id];
+
+ tp->starget = starget;
+
+ return 0;
+}
+
+static void esp_target_destroy(struct scsi_target *starget)
+{
+ struct esp *esp = shost_priv(dev_to_shost(&starget->dev));
+ struct esp_target_data *tp = &esp->target[starget->id];
+
+ tp->starget = NULL;
+}
+
static int esp_slave_alloc(struct scsi_device *dev)
{
struct esp *esp = shost_priv(dev->host);
static int esp_slave_alloc(struct scsi_device *dev)
{
struct esp *esp = shost_priv(dev->host);
@@
-2362,8
+2388,6
@@
static int esp_slave_alloc(struct scsi_device *dev)
return -ENOMEM;
dev->hostdata = lp;
return -ENOMEM;
dev->hostdata = lp;
- tp->starget = dev->sdev_target;
-
spi_min_period(tp->starget) = esp->min_period;
spi_max_offset(tp->starget) = 15;
spi_min_period(tp->starget) = esp->min_period;
spi_max_offset(tp->starget) = 15;
@@
-2381,6
+2405,12
@@
static int esp_slave_configure(struct scsi_device *dev)
struct esp_target_data *tp = &esp->target[dev->id];
int goal_tags, queue_depth;
struct esp_target_data *tp = &esp->target[dev->id];
int goal_tags, queue_depth;
+ if (esp->flags & ESP_FLAG_DISABLE_SYNC) {
+ /* Bypass async domain validation */
+ dev->ppr = 0;
+ dev->sdtr = 0;
+ }
+
goal_tags = 0;
if (dev->tagged_supported) {
goal_tags = 0;
if (dev->tagged_supported) {
@@
-2594,6
+2624,8
@@
struct scsi_host_template scsi_esp_template = {
.name = "esp",
.info = esp_info,
.queuecommand = esp_queuecommand,
.name = "esp",
.info = esp_info,
.queuecommand = esp_queuecommand,
+ .target_alloc = esp_target_alloc,
+ .target_destroy = esp_target_destroy,
.slave_alloc = esp_slave_alloc,
.slave_configure = esp_slave_configure,
.slave_destroy = esp_slave_destroy,
.slave_alloc = esp_slave_alloc,
.slave_configure = esp_slave_configure,
.slave_destroy = esp_slave_destroy,