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();
}
/*
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 */
/* 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;
}
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);
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;
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)