2.9BSD ts tape driver fixes
Jeremy Maris
jeremym at unx1.UUCP
Sat Nov 1 10:21:01 AEST 1986
I'm posting this in response to recent articles in net.bugs.2bsd.
There are indeed bugs in the original 2.9bsd distribution ts11
driver. I list below the ones we know about and the fixes we've applied
to make it work.
1) Most serious.
The buffer address was not loaded into the command packet. The driver would
never have worked like this. Kevin Twiddle at Imperial College fixed this
one.
from tsstart()
* If the data transfer command is in the correct place,
* set up all registers and do the transfer.
*/
if ((blkno = sc->sc_blkno) == dbtofsb(bp->b_blkno)) {
tc->c_size = bp->b_bcount;
if ((bp->b_flags & B_READ) == 0)
cmd = TS_WCOM;
else
cmd = TS_RCOM;
if (tstab.b_errcnt)
cmd |= TS_RETRY;
tstab.b_active = SIO;
| /* KPT start - Put buffer address in to command packet */
| tc->c_loba = bp->b_un.b_addr;
| tc->c_hiba = bp->b_xmem;
|
| /* KPT end */
2) The field sc_cmd must be aligned on a four byte bondary. The
driver might work, depending upon where it gets loaded when you link the kernel.
This code by Steve Isard at Sussex.
in global declarations
struct ts_softc {
char sc_openf;
char sc_lastiow;
short sc_resid;
daddr_t sc_blkno;
daddr_t sc_nxrec;
struct ts_cmd sc_cmd;
struct ts_char sc_char;
| int align; /* structure must be multiple of 4 bytes
| * long to make sc_cmd come out on 4 byte
| * boundary every time */
} *ts_softc;
| /* We want space for an array of NTS ts_softc structures, where the sc_cmd
| * field of each is long-aligned(i.e., core address is a multiple of 4 bytes).
| * The compiler can only guarantee that the address will be even. Therefore we
| * want to reserve an extra 2 bytes so that we can slide the array down by 2
| * if the compiler gets it wrong. ts_softc gets located within softspace in
| * tsattach.
| */
| char softspace[sizeof(struct ts_softc)*NTS+2];
replacement tsattach()
tsattach(addr, unit)
struct tsdevice *addr;
{
/*
* This driver supports only one controller.
*/
if (unit == 0) {
| /* Make ts_softc start on a 4 byte boundary */
| (u_short)ts_softc = (((u_short)softspace)&03 ?
| ((u_short)softspace)+2 : (u_short)softspace);
TSADDR = addr;
return(1);
}
return(0);
}
3) Space record and file commands don't work ( ie FSF FSR BSR and BSF).
This bug led us to suppose that our tape drive or controller wouldn't support
space record operations. After much hunting and running of diagnostics, and
fixing the obvious bugs below, I resorted to doing a diff on the ts driver
supplied with the Seismo distribution from Keith Bostic that eventually
came our way. It turned out that a - got changed to a + and vice versa
somewhere else. This bug manifests itself in that the tar r and tar u
operations result in a tape IO error, and mt will not manipulate the
tape correctly. Otherwise, all seems OK.
in tsclose()
if ((minor(dev) & T_NOREWIND) == 0 )
/*
* 0 count means don't hang waiting for rewind complete.
* Rather ctsbuf stays busy until the operation completes
* preventing further opens from completing by
* preventing a TS_SENSE from completing.
*/
| tscommand(dev, TS_REW, 0); /* KPT REV -> REW */
in tscommand()
splx(s);
bp->b_dev = dev;
| bp->b_repcnt = count; /* AJM changed from -count */
bp->b_command = com;
in tsseteof()
else
{
/* spacing forward */
| sc->sc_blkno = dbtofsb(bp->b_blkno)
| + sc->sc_sts.s_rbpcr; /* AJM changed from - to + */
/* OLD LINE
static tsops[] = {TS_WEOF,TS_SFORW,TS_SREV,TS_SFORW,TS_SREV,
TS_REW,TS_OFFL,TS_SENSE};
*/
| static tsops[] = {TS_WEOF,TS_SFORWF,TS_SREVF,TS_SFORW,TS_SREV,TS_REW,
| TS_OFFL,TS_SENSE};
As we run an 11/73, I can't vouch for its performance on a Unibus machine.
We haven't tried the driver supplied with the Seismo distribution, but
the code looks OK.
However, sc_cmd needs to be aligned on a 4 byte boundary, so try the fix
above.
I'll mail this driver if anyone wants it.
---------------------------------------------------------------------------
Jeremy Maris, Experimental Psychology, Sussex University, Falmer, Brighton
E. Sussex BN1 9QY, England.
uucp : ...mcvax!ukc!warwick!cvaxa!unx1!jeremym
Janet : scfa5 at uk.ac.sussex.vax2
Arpa : jeremym%unx1.uucp%cvaxa at uk.ac.ucl-cs
---------------------------------------------------------------------------
More information about the Comp.unix.wizards
mailing list