devscsi: introduce a deselect
authorAlan Cox <alan@linux.intel.com>
Sat, 10 Oct 2015 20:48:52 +0000 (21:48 +0100)
committerAlan Cox <alan@linux.intel.com>
Sat, 10 Oct 2015 20:48:52 +0000 (21:48 +0100)
Needed for things like MPI or bank switched cartridges containing MMIO
controllers (MSX as well I suspect)

Kernel/dev/devscsi.c
Kernel/dev/devscsi.h
Kernel/dev/devscsi_discard.c

index 0d394a6..11e59b6 100644 (file)
@@ -93,10 +93,11 @@ int si_docmd(uint8_t *data)
                        err = si_read(data);
                else
                        err = si_write(data);
-               if (err)
-                       return err;
        }
-       return si_cmdend();
+       if (err == 0)
+               err = si_cmdend();
+       si_clear();             /* Clears any data on scsi bus */
+       si_deselect();
 }
 
 /*
@@ -135,8 +136,6 @@ uint8_t si_cmd(void)
 
                if(!(err = si_docmd(blk_op.addr)))
                  break;
-               si_clear();             /* Clears any data on scsi bus */
-               /*      si_restore(); Needed ?? - eg for SASI ? */
        }
 
        /* If any errors print error message */
@@ -145,6 +144,8 @@ uint8_t si_cmd(void)
                /* If fatal error */
                if(count == 10){
                        si_err("Fatal error\007 10 retries", err);
+                        /* Ugly - si_reset is odd and has to do its own
+                           select/deselect of the controller if needed */
                        si_reset();
                        return 0;
                }
index 728b132..31b0903 100644 (file)
@@ -157,5 +157,8 @@ extern uint8_t si_writecmd(uint8_t len);
 extern uint8_t si_select(void);
 /* Clear anything stuck on the bus, or wrong directions */
 extern void si_clear(void);
-/* Reset the bus if possible */
+/* Reset the bus if possible: Oddity - this one fn has to select the controller
+   itself then deselect (don't select a drive!) */
 extern void si_reset(void);
+/* Deselect the scsi controller */
+extern void si_deselect(void);
index c71e8bc..ebb39cb 100644 (file)
@@ -33,10 +33,8 @@ void scsi_dev_init(uint8_t drive)
   si_dcb.device = drive;
   si_dcb.lun = 0;
   si_dcb.bus = 0;
-  kputchar('S');
   if (si_select())             /* Can't select it - probably not present */
     return;
-  kputchar('I');
   /* FIXME: check if this would be better as a memcpy of fixed struct */
   si_dcb.cb.cb0.opcode = SIINQUIRY;
   si_dcb.cb.cb0.hiblock = 0;
@@ -47,9 +45,11 @@ void scsi_dev_init(uint8_t drive)
   si_dcb.length = 36;
   si_dcb.direction = SIDIR_READ;
   si_user = 0;
+  
+  si_deselect();       /* As selects don't necessarily stack */
+  
   if (si_docmd(identify))
     return;
-  kputchar(':');
 
   p = identify + 8;
   while (p < identify + 27)