summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/NCR5380.c
diff options
context:
space:
mode:
authorFinn Thain <fthain@telegraphics.com.au>2016-01-03 00:05:08 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2016-01-06 21:42:52 -0500
commitb6488f97d3b5b602a066956e58a1ba282456d79b (patch)
tree1ca8032c303d20869e0955f962c3747fbb297322 /drivers/scsi/NCR5380.c
parentb01ec34895720348dab7eae6bfb28a5799130bce (diff)
ncr5380: Split NCR5380_init() into two functions
This patch splits the NCR5380_init() function into two parts, similar to the scheme used with atari_NCR5380.c. This avoids two problems. Firstly, NCR5380_init() may perform a bus reset, which would cause the chip to assert IRQ. The chip is unable to mask its bus reset interrupt. Drivers can't call request_irq() before calling NCR5380_init(), because initialization must happen before the interrupt handler executes. If driver initialization causes an interrupt it may be problematic on some platforms. To avoid that, first move the bus reset code into NCR5380_maybe_reset_bus(). Secondly, NCR5380_init() contains some board-specific interrupt setup code for the NCR53C400 that does not belong in the core driver. In moving this code, better not re-order interrupt initialization and bus reset. Again, the solution is to move the bus reset code into NCR5380_maybe_reset_bus(). Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Reviewed-by: Hannes Reinecke <hare@suse.com> Tested-by: Ondrej Zary <linux@rainbow-software.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/NCR5380.c')
-rw-r--r--drivers/scsi/NCR5380.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index 78d7858c4404..1f9028a0e7ea 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -777,8 +777,7 @@ static void lprint_opcode(int opcode, struct seq_file *m)
777 777
778static int NCR5380_init(struct Scsi_Host *instance, int flags) 778static int NCR5380_init(struct Scsi_Host *instance, int flags)
779{ 779{
780 int i, pass; 780 int i;
781 unsigned long timeout;
782 struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; 781 struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
783 782
784 if(in_interrupt()) 783 if(in_interrupt())
@@ -831,18 +830,26 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
831 NCR5380_write(C400_CONTROL_STATUS_REG, CSR_BASE); 830 NCR5380_write(C400_CONTROL_STATUS_REG, CSR_BASE);
832 } 831 }
833#endif 832#endif
833 return 0;
834}
834 835
835 /* 836/**
836 * Detect and correct bus wedge problems. 837 * NCR5380_maybe_reset_bus - Detect and correct bus wedge problems.
837 * 838 * @instance: adapter to check
838 * If the system crashed, it may have crashed in a state 839 *
839 * where a SCSI command was still executing, and the 840 * If the system crashed, it may have crashed with a connected target and
840 * SCSI bus is not in a BUS FREE STATE. 841 * the SCSI bus busy. Check for BUS FREE phase. If not, try to abort the
841 * 842 * currently established nexus, which we know nothing about. Failing that
842 * If this is the case, we'll try to abort the currently 843 * do a bus reset.
843 * established nexus which we know nothing about, and that 844 *
844 * failing, do a hard reset of the SCSI bus 845 * Note that a bus reset will cause the chip to assert IRQ.
845 */ 846 *
847 * Returns 0 if successful, otherwise -ENXIO.
848 */
849
850static int NCR5380_maybe_reset_bus(struct Scsi_Host *instance)
851{
852 int pass;
846 853
847 for (pass = 1; (NCR5380_read(STATUS_REG) & SR_BSY) && pass <= 6; ++pass) { 854 for (pass = 1; (NCR5380_read(STATUS_REG) & SR_BSY) && pass <= 6; ++pass) {
848 switch (pass) { 855 switch (pass) {
@@ -850,7 +857,6 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
850 case 3: 857 case 3:
851 case 5: 858 case 5:
852 printk(KERN_INFO "scsi%d: SCSI bus busy, waiting up to five seconds\n", instance->host_no); 859 printk(KERN_INFO "scsi%d: SCSI bus busy, waiting up to five seconds\n", instance->host_no);
853 timeout = jiffies + 5 * HZ;
854 NCR5380_poll_politely(instance, STATUS_REG, SR_BSY, 0, 5*HZ); 860 NCR5380_poll_politely(instance, STATUS_REG, SR_BSY, 0, 5*HZ);
855 break; 861 break;
856 case 2: 862 case 2: