Commit a862b5c8 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
  [SCSI] JAZZ ESP and SUN ESP need SPI_ATTRS
  [SCSI] atari_NCR5380: update_timeout removal
  [SCSI] aacraid: fix shutdown handler to also disable interrupts.
  [SCSI] qla2xxx: fix timeout in qla2x00_down_timeout
  [SCSI] fix CONFIG_SCSI_WAIT_SCAN=m
parents 0b662c64 3a243070
...@@ -1532,6 +1532,7 @@ source "drivers/scsi/arm/Kconfig" ...@@ -1532,6 +1532,7 @@ source "drivers/scsi/arm/Kconfig"
config JAZZ_ESP config JAZZ_ESP
bool "MIPS JAZZ FAS216 SCSI support" bool "MIPS JAZZ FAS216 SCSI support"
depends on MACH_JAZZ && SCSI depends on MACH_JAZZ && SCSI
select SCSI_SPI_ATTRS
help help
This is the driver for the onboard SCSI host adapter of MIPS Magnum This is the driver for the onboard SCSI host adapter of MIPS Magnum
4000, Acer PICA, Olivetti M700-10 and a few other identical OEM 4000, Acer PICA, Olivetti M700-10 and a few other identical OEM
...@@ -1756,6 +1757,7 @@ config SUN3X_ESP ...@@ -1756,6 +1757,7 @@ config SUN3X_ESP
config SCSI_SUNESP config SCSI_SUNESP
tristate "Sparc ESP Scsi Driver" tristate "Sparc ESP Scsi Driver"
depends on SBUS && SCSI depends on SBUS && SCSI
select SCSI_SPI_ATTRS
help help
This is the driver for the Sun ESP SCSI host adapter. The ESP This is the driver for the Sun ESP SCSI host adapter. The ESP
chipset is present in most SPARC SBUS-based computers. chipset is present in most SPARC SBUS-based computers.
......
...@@ -863,6 +863,14 @@ static struct scsi_host_template aac_driver_template = { ...@@ -863,6 +863,14 @@ static struct scsi_host_template aac_driver_template = {
.emulated = 1, .emulated = 1,
}; };
static void __aac_shutdown(struct aac_dev * aac)
{
kthread_stop(aac->thread);
aac_send_shutdown(aac);
aac_adapter_disable_int(aac);
free_irq(aac->pdev->irq, aac);
}
static int __devinit aac_probe_one(struct pci_dev *pdev, static int __devinit aac_probe_one(struct pci_dev *pdev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
...@@ -1015,10 +1023,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, ...@@ -1015,10 +1023,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
return 0; return 0;
out_deinit: out_deinit:
kthread_stop(aac->thread); __aac_shutdown(aac);
aac_send_shutdown(aac);
aac_adapter_disable_int(aac);
free_irq(pdev->irq, aac);
out_unmap: out_unmap:
aac_fib_map_free(aac); aac_fib_map_free(aac);
pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys); pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys);
...@@ -1038,7 +1043,8 @@ static void aac_shutdown(struct pci_dev *dev) ...@@ -1038,7 +1043,8 @@ static void aac_shutdown(struct pci_dev *dev)
{ {
struct Scsi_Host *shost = pci_get_drvdata(dev); struct Scsi_Host *shost = pci_get_drvdata(dev);
struct aac_dev *aac = (struct aac_dev *)shost->hostdata; struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
aac_send_shutdown(aac); scsi_block_requests(shost);
__aac_shutdown(aac);
} }
static void __devexit aac_remove_one(struct pci_dev *pdev) static void __devexit aac_remove_one(struct pci_dev *pdev)
...@@ -1048,16 +1054,12 @@ static void __devexit aac_remove_one(struct pci_dev *pdev) ...@@ -1048,16 +1054,12 @@ static void __devexit aac_remove_one(struct pci_dev *pdev)
scsi_remove_host(shost); scsi_remove_host(shost);
kthread_stop(aac->thread); __aac_shutdown(aac);
aac_send_shutdown(aac);
aac_adapter_disable_int(aac);
aac_fib_map_free(aac); aac_fib_map_free(aac);
pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
aac->comm_phys); aac->comm_phys);
kfree(aac->queues); kfree(aac->queues);
free_irq(pdev->irq, aac);
aac_adapter_ioremap(aac, 0); aac_adapter_ioremap(aac, 0);
kfree(aac->fibs); kfree(aac->fibs);
......
...@@ -893,45 +893,6 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags) ...@@ -893,45 +893,6 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
return 0; return 0;
} }
/*
* our own old-style timeout update
*/
/*
* The strategy is to cause the timer code to call scsi_times_out()
* when the soonest timeout is pending.
* The arguments are used when we are queueing a new command, because
* we do not want to subtract the time used from this time, but when we
* set the timer, we want to take this value into account.
*/
int atari_scsi_update_timeout(Scsi_Cmnd * SCset, int timeout)
{
int rtn;
/*
* We are using the new error handling code to actually register/deregister
* timers for timeout.
*/
if (!timer_pending(&SCset->eh_timeout))
rtn = 0;
else
rtn = SCset->eh_timeout.expires - jiffies;
if (timeout == 0) {
del_timer(&SCset->eh_timeout);
SCset->eh_timeout.data = (unsigned long)NULL;
SCset->eh_timeout.expires = 0;
} else {
if (SCset->eh_timeout.data != (unsigned long)NULL)
del_timer(&SCset->eh_timeout);
SCset->eh_timeout.data = (unsigned long)SCset;
SCset->eh_timeout.expires = jiffies + timeout;
add_timer(&SCset->eh_timeout);
}
return rtn;
}
/* /*
* Function : int NCR5380_queue_command (Scsi_Cmnd *cmd, * Function : int NCR5380_queue_command (Scsi_Cmnd *cmd,
* void (*done)(Scsi_Cmnd *)) * void (*done)(Scsi_Cmnd *))
...@@ -956,7 +917,6 @@ static int NCR5380_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) ...@@ -956,7 +917,6 @@ static int NCR5380_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
Scsi_Cmnd *tmp; Scsi_Cmnd *tmp;
int oldto; int oldto;
unsigned long flags; unsigned long flags;
// extern int update_timeout(Scsi_Cmnd * SCset, int timeout);
#if (NDEBUG & NDEBUG_NO_WRITE) #if (NDEBUG & NDEBUG_NO_WRITE)
switch (cmd->cmnd[0]) { switch (cmd->cmnd[0]) {
...@@ -1029,9 +989,9 @@ static int NCR5380_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) ...@@ -1029,9 +989,9 @@ static int NCR5380_queue_command(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
* alter queues and touch the lock. * alter queues and touch the lock.
*/ */
if (!IS_A_TT()) { if (!IS_A_TT()) {
oldto = atari_scsi_update_timeout(cmd, 0); /* perhaps stop command timer here */
falcon_get_lock(); falcon_get_lock();
atari_scsi_update_timeout(cmd, oldto); /* perhaps restart command timer here */
} }
if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) { if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
LIST(cmd, hostdata->issue_queue); LIST(cmd, hostdata->issue_queue);
......
...@@ -2590,7 +2590,7 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) ...@@ -2590,7 +2590,7 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout)
return 0; return 0;
if (msleep_interruptible(step)) if (msleep_interruptible(step))
break; break;
} while (--iterations >= 0); } while (--iterations > 0);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
......
...@@ -184,6 +184,15 @@ int scsi_complete_async_scans(void) ...@@ -184,6 +184,15 @@ int scsi_complete_async_scans(void)
/* Only exported for the benefit of scsi_wait_scan */ /* Only exported for the benefit of scsi_wait_scan */
EXPORT_SYMBOL_GPL(scsi_complete_async_scans); EXPORT_SYMBOL_GPL(scsi_complete_async_scans);
#ifndef MODULE
/*
* For async scanning we need to wait for all the scans to complete before
* trying to mount the root fs. Otherwise non-modular drivers may not be ready
* yet.
*/
late_initcall(scsi_complete_async_scans);
#endif
/** /**
* scsi_unlock_floptical - unlock device via a special MODE SENSE command * scsi_unlock_floptical - unlock device via a special MODE SENSE command
* @sdev: scsi device to send command to * @sdev: scsi device to send command to
......
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