Date: Tue, 18 Jun 96 09:47:00 PDT From: Duncan Barclay <Duncan.Barclay@pa-consulting.com> To: send-pr <FreeBSD-gnats-submit@freebsd.org> Subject: i386/1331: changes and bug in ft driver Message-ID: <31C6E014@SMTPGATE.PA-CONSULTING.COM> Resent-Message-ID: <199606180900.CAA11456@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 1331 >Category: i386 >Synopsis: changes and bug in ft driver >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Jun 18 02:00:02 PDT 1996 >Last-Modified: >Originator: Duncan Barclay & >Organization: PA-Consulting >Release: FreeBSD 2.1-STABLE i386 >Environment: 486DX33, 8MB RAM UMC motherboard. Connor TapeStor 800AT 800MB (Compressed) Travan Tapedrive >Description: From: Duncan Barclay To: Poul-Henning Kamp Subject: ft driver Date: 11 June 1996 08:46 Hi Poul I posted the below for -hackers a while back. You requested the diffs but I forgot to send them to you. I remembered! I have discovered some problems in the ft (floppy tape) driver code when using my Connor Tapestore800 drive. I am running 2.0.5-R (but am backing up prior to installing 2.1-R) 1) The list of recognised tape formats is limited. ft doesnt like Travan cartridges. I have added the right numbers to the table but am not posting them as they changed when I reformatted my cart using Connor's DOS software. I dont want to start confusing people! Someone who has the right specs should update the entries. 2) One I fixed the above, all things were going okay using the travan cart and cpio. After a while the machine appeared to hang (I was in single user mode at the time, however later tests shows the process to be waiting on bdone). As I had hacked /sbin/ft to print the segment number I continued to play a little seeking the tape to that segment and kept getting the hangs. Eventually I discovered that the drive took a little longer than the code waits for to respond when it moves the head a few tracks. >How-To-Repeat: in sys/i386/isa/ft.c Specifics: ACMD_BLOCKIO (or similar) calls ACMD_READID to find out where the head is. ACMD_READID issues read id commands to the drive. If the first read id command returns garbage then ACMD_READID then calls ACMD_SEEKSTS to stop the tape moving. ACMD_SEEKSTS waits for the tape to stop and to become ready, timing out after 10seconds. If this timeout occurs then control goes back to ACMD_READID and ACMD_READID should do a further 4 retries. It does not. It hangs. ***Important this is the bug*** My fix for _my_ tape drive is to up the timeout specified by ACMD_READID in the call to ACMD_SEEKSTS to 90seconds. In fact by drive takes about 12seconds to become ready. THIS IS NOT A REAL FIX. I think that the retry stuff in ACMD_READID is broken (a comment in the header of ft.c seems to indicate that hangs did occur and may have been fixed but not tested). I am willing to have ago at fixing this, but: I have never written a device driver. I have no time for 6months. I have no idea how QIC tapes work at the s/w level. The state machine in ft.c is big and it would take a long time to trace out what I need to know. I seem to remember someone saying they were going to maintain this code a while back. >Fix: The code is the same in 2.0.5R and 2.1R so these are diffs between my fixes and the 2.1R live filesystem CDROM (keep the Live Filesystem, it is excellent) *** ft.c Thu Apr 4 16:34:51 1996 --- /cdrom/usr/src/sys/i386/isa/ft.c Mon May 29 18:01:41 1995 *************** *** 91,97 **** /* Enable or disable debugging messages. */ #define FTDBGALL 0 /* 1 if you want everything */ ! /*#define DPRT(a) printf a */ #define DPRT(a) /* Constants private to the driver */ --- 91,97 ---- /* Enable or disable debugging messages. */ #define FTDBGALL 0 /* 1 if you want everything */ ! /*#define DPRT(a) printf a */ #define DPRT(a) /* Constants private to the driver */ *************** *** 161,168 **** { 3, 2, "QIC-500", "307.5/550", 0, 0, 0, 0, 0 }, /* ??? */ { 3, 3, "QIC-500", "295/900", 0, 0, 0, 0, 0 }, /* ??? */ { 3, 4, "QIC-500", "1100/550", 0, 0, 0, 0, 0 }, /* ??? */ ! { 3, 5, "QIC-500", "1100/900", 0, 0, 0, 0, 0 }, /* ??? */ ! { 2,11, "TR-1", "750/550", 36, 369, 11808, 128, 32640 } /* dmlb */ }; #define NGEOM (sizeof(ftgtbl) / sizeof(QIC_Geom)) --- 161,167 ---- { 3, 2, "QIC-500", "307.5/550", 0, 0, 0, 0, 0 }, /* ??? */ { 3, 3, "QIC-500", "295/900", 0, 0, 0, 0, 0 }, /* ??? */ { 3, 4, "QIC-500", "1100/550", 0, 0, 0, 0, 0 }, /* ??? */ ! { 3, 5, "QIC-500", "1100/900", 0, 0, 0, 0, 0 } /* ??? */ }; #define NGEOM (sizeof(ftgtbl) / sizeof(QIC_Geom)) *************** *** 766,772 **** CALL_ACMD(2, ACMD_STATUS, QC_STATUS, 8, 0); case 2: if ((async_ret & async_arg1) != 0) goto complete; - DPRT (("seeksts retry, %d left\n", async_retries-1)); if (--async_retries == 0) { DPRT(("ft%d: acmd_seeksts retries exceeded\n", ftu)); goto complete; --- 765,770 ---- *************** *** 807,813 **** * 4 microstep head back to 0 * 5 fail */ - DPRT (("readid retry number %d\n", errcnt+1)); if (++errcnt >= 5) { DPRT(("ft%d: acmd_readid errcnt exceeded\n", fdcu)); async_ret = -2; --- 805,810 ---- *************** *** 816,825 **** } if (errcnt == 1) { ft->moving = 0; ! CALL_ACMD(4, ACMD_SEEKSTS, QC_STOP, QS_READY, 90); } else { ft->moving = 0; ! CALL_ACMD(4, ACMD_SEEKSTS, QC_STPAUSE, QS_READY, 90); } DPRT(("readid retry %d...\n", errcnt)); async_state = 0; --- 813,822 ---- } if (errcnt == 1) { ft->moving = 0; ! CALL_ACMD(4, ACMD_SEEKSTS, QC_STOP, QS_READY, 0); } else { ft->moving = 0; ! CALL_ACMD(4, ACMD_SEEKSTS, QC_STPAUSE, QS_READY, 0); } DPRT(("readid retry %d...\n", errcnt)); async_state = 0; *************** *** 842,848 **** async_ret = retpos+1; goto complete; case 4: - DPRT (("readid state 4\n")); CALL_ACMD(5, ACMD_SEEK, QC_FORWARD, 0, 0); case 5: ft->moving = 1; --- 839,844 ---- *************** *** 1835,1844 **** * XXX - This doesn't seem to work on my Colorado Jumbo 250... * if it works on your drive, I'd sure like to hear about it. */ ! /* ! * dmlb - But it does work on my Connor Tapestore 800. ! */ ! #if 1 /* Report drive status */ for (sts = -1, tries = 0; sts < 0 && tries < 3; tries++) sts = qic_status(ftu, QC_TSTATUS, 8); --- 1831,1837 ---- * XXX - This doesn't seem to work on my Colorado Jumbo 250... * if it works on your drive, I'd sure like to hear about it. */ ! #if 0 /* Report drive status */ for (sts = -1, tries = 0; sts < 0 && tries < 3; tries++) sts = qic_status(ftu, QC_TSTATUS, 8); *** ftape.h Tue Apr 2 18:11:23 1996 --- /cdrom/usr/src/sys/sys/ftape.h Sat Aug 13 11:52:48 1994 *************** *** 39,45 **** #define QCV_ECCSIZE 3072 /* Bytes ecc eats */ #define QCV_ECCBLKS 3 /* Blocks ecc eats */ #define QCV_NFMT 3 /* Number of tape formats */ ! #define QCV_NLEN 11 /* Number of tape lengths */ #define QCV_HDRMAGIC 0xaa55aa55 /* Magic for header segment */ #define QCV_FSMAGIC 0x33cc33cc /* Magic for fileset */ --- 39,45 ---- #define QCV_ECCSIZE 3072 /* Bytes ecc eats */ #define QCV_ECCBLKS 3 /* Blocks ecc eats */ #define QCV_NFMT 3 /* Number of tape formats */ ! #define QCV_NLEN 5 /* Number of tape lengths */ #define QCV_HDRMAGIC 0xaa55aa55 /* Magic for header segment */ #define QCV_FSMAGIC 0x33cc33cc /* Magic for fileset */ >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?31C6E014>