Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Sep 2013 19:25:37 +0000 (UTC)
From:      Joerg Wunsch <joerg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r255262 - stable/9/sys/dev/fdc
Message-ID:  <201309051925.r85JPblK048524@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: joerg
Date: Thu Sep  5 19:25:36 2013
New Revision: 255262
URL: http://svnweb.freebsd.org/changeset/base/255262

Log:
  Merge r254809 and r254937 from head:
  
  . Fix the "2step" feature (i.e. 360 KiB floppies in 1200 MiB drives)
  . Fix the FDOPT_NOERROR option

Modified:
  stable/9/sys/dev/fdc/fdc.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/dev/fdc/fdc.c
==============================================================================
--- stable/9/sys/dev/fdc/fdc.c	Thu Sep  5 19:02:03 2013	(r255261)
+++ stable/9/sys/dev/fdc/fdc.c	Thu Sep  5 19:25:36 2013	(r255262)
@@ -528,7 +528,8 @@ fdc_reset(struct fdc_data *fdc)
 		if (fdc_cmd(fdc, 4,
 		    I8207X_CONFIG,
 		    0,
-		    0x40 |			/* Enable Implied Seek */
+		    /* 0x40 | */		/* Enable Implied Seek -
+						 * breaks 2step! */
 		    0x10 |			/* Polling disabled */
 		    (fifo_threshold - 1),	/* Fifo threshold */
 		    0x00,			/* Precomp track */
@@ -760,10 +761,13 @@ fdc_worker(struct fdc_data *fdc)
 	int i, nsect;
 	int st0, st3, cyl, mfm, steptrac, cylinder, descyl, sec;
 	int head;
+	int override_error;
 	static int need_recal;
 	struct fdc_readid *idp;
 	struct fd_formb *finfo;
 
+	override_error = 0;
+
 	/* Have we exhausted our retries ? */
 	bp = fdc->bp;
 	fd = fdc->fd;
@@ -922,14 +926,8 @@ fdc_worker(struct fdc_data *fdc)
 
 	/*
 	 * SEEK to where we want to be
-	 *
-	 * Enhanced controllers do implied seeks for read&write as long as
-	 * we do not need multiple steps per track.
 	 */
-	if (cylinder != fd->track && (
-	    fdc->fdct != FDC_ENHANCED ||
-	    descyl != cylinder ||
-	    (bp->bio_cmd & (BIO_RDID|BIO_FMT)))) {
+	if (cylinder != fd->track) {
 		retry_line = __LINE__;
 		if (fdc_cmd(fdc, 3, NE7CMD_SEEK, fd->fdsu, descyl, 0))
 			return (1);
@@ -1095,7 +1093,10 @@ fdc_worker(struct fdc_data *fdc)
 			    fdc->status[3], fdc->status[4], fdc->status[5]);
 		}
 		retry_line = __LINE__;
-		return (1);
+		if (fd->options & FDOPT_NOERROR)
+			override_error = 1;
+		else
+			return (1);
 	}
 	/* All OK */
 	switch(bp->bio_cmd) {
@@ -1116,10 +1117,16 @@ fdc_worker(struct fdc_data *fdc)
 		bp->bio_resid -= fd->fd_iosize;
 		bp->bio_completed += fd->fd_iosize;
 		fd->fd_ioptr += fd->fd_iosize;
-		/* Since we managed to get something done, reset the retry */
-		fdc->retry = 0;
-		if (bp->bio_resid > 0)
-			return (0);
+		if (override_error) {
+			if ((debugflags & 4))
+				printf("FDOPT_NOERROR: returning bad data\n");
+		} else {
+			/* Since we managed to get something done,
+			 * reset the retry */
+			fdc->retry = 0;
+			if (bp->bio_resid > 0)
+				return (0);
+		}
 		break;
 	case BIO_FMT:
 		break;
@@ -1411,6 +1418,7 @@ fd_access(struct g_provider *pp, int r, 
 	ae = e + pp->ace;
 
 	if (ar == 0 && aw == 0 && ae == 0) {
+		fd->options &= ~(FDOPT_NORETRY | FDOPT_NOERRLOG | FDOPT_NOERROR);
 		device_unbusy(fd->dev);
 		return (0);
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309051925.r85JPblK048524>