From: Alan Cox Date: Sat, 10 Oct 2015 20:48:52 +0000 (+0100) Subject: devscsi: introduce a deselect X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=f249fbf978481c70c3eca82cc70c1298133475a7;p=FUZIX.git devscsi: introduce a deselect Needed for things like MPI or bank switched cartridges containing MMIO controllers (MSX as well I suspect) --- diff --git a/Kernel/dev/devscsi.c b/Kernel/dev/devscsi.c index 0d394a62..11e59b6d 100644 --- a/Kernel/dev/devscsi.c +++ b/Kernel/dev/devscsi.c @@ -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; } diff --git a/Kernel/dev/devscsi.h b/Kernel/dev/devscsi.h index 728b1320..31b09032 100644 --- a/Kernel/dev/devscsi.h +++ b/Kernel/dev/devscsi.h @@ -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); diff --git a/Kernel/dev/devscsi_discard.c b/Kernel/dev/devscsi_discard.c index c71e8bce..ebb39cb9 100644 --- a/Kernel/dev/devscsi_discard.c +++ b/Kernel/dev/devscsi_discard.c @@ -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)