fdc.c (ecd87fe6c3203970dc0c7bedf93eec6ac73a669e) fdc.c (215197545522be3630d5829fd05defce0596599a)
1/*
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Don Ahn.
7 *
8 * Copyright (c) 1993, 1994 by

--- 29 unchanged lines hidden (view full) ---

38 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 * SUCH DAMAGE.
44 *
45 * from: @(#)fd.c 7.4 (Berkeley) 5/25/91
1/*
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Don Ahn.
7 *
8 * Copyright (c) 1993, 1994 by

--- 29 unchanged lines hidden (view full) ---

38 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 * SUCH DAMAGE.
44 *
45 * from: @(#)fd.c 7.4 (Berkeley) 5/25/91
46 * $Id: fd.c,v 1.83 1996/03/31 18:04:51 joerg Exp $
46 * $Id: fd.c,v 1.84 1996/04/02 04:51:04 scrappy Exp $
47 *
48 */
49
50#include "ft.h"
51#if NFT < 1
52#undef NFDC
53#endif
54#include "fd.h"

--- 186 unchanged lines hidden (view full) ---

241#define FD_MOTOR 0x04 /* motor should be on */
242#define FD_MOTOR_WAIT 0x08 /* motor coming up */
243 int skip;
244 int hddrv;
245#define FD_NO_TRACK -2
246 int track; /* where we think the head is */
247 int options; /* user configurable options, see ioctl_fd.h */
248 int dkunit; /* disk stats unit number */
47 *
48 */
49
50#include "ft.h"
51#if NFT < 1
52#undef NFDC
53#endif
54#include "fd.h"

--- 186 unchanged lines hidden (view full) ---

241#define FD_MOTOR 0x04 /* motor should be on */
242#define FD_MOTOR_WAIT 0x08 /* motor coming up */
243 int skip;
244 int hddrv;
245#define FD_NO_TRACK -2
246 int track; /* where we think the head is */
247 int options; /* user configurable options, see ioctl_fd.h */
248 int dkunit; /* disk stats unit number */
249#ifdef DEVFS
250 void *bdev;
251 void *cdev;
249#ifdef DEVFS
250 void *bdevs[1 + NUMDENS + MAXPARTITIONS];
251 void *cdevs[1 + NUMDENS + MAXPARTITIONS];
252#endif
253} fd_data[NFD];
254
255/***********************************************************************\
256* Throughout this file the following conventions will be used: *
257* fd is a pointer to the fd_data struct for the drive in question *
258* fdc is a pointer to the fdc_data struct for the controller *
259* fdu is the floppy drive unit number *

--- 302 unchanged lines hidden (view full) ---

562 unsigned fdt;
563 fdu_t fdu;
564 fdcu_t fdcu = dev->id_unit;
565 fdc_p fdc = fdc_data + fdcu;
566 fd_p fd;
567 int fdsu, st0, st3, i, unithasfd;
568 struct isa_device *fdup;
569 int ic_type = 0;
252#endif
253} fd_data[NFD];
254
255/***********************************************************************\
256* Throughout this file the following conventions will be used: *
257* fd is a pointer to the fd_data struct for the drive in question *
258* fdc is a pointer to the fdc_data struct for the controller *
259* fdu is the floppy drive unit number *

--- 302 unchanged lines hidden (view full) ---

562 unsigned fdt;
563 fdu_t fdu;
564 fdcu_t fdcu = dev->id_unit;
565 fdc_p fdc = fdc_data + fdcu;
566 fd_p fd;
567 int fdsu, st0, st3, i, unithasfd;
568 struct isa_device *fdup;
569 int ic_type = 0;
570#ifdef DEVFS
570#ifdef DEVFS
571 int mynor;
571 int mynor;
572 char name[64];
573#endif /* DEVFS */
572 int typemynor;
573 int typesize;
574#endif
574
575 fdc->fdcu = fdcu;
576 fdc->flags |= FDC_ATTACHED;
577 fdc->dmachan = dev->id_drq;
578 isa_dmainit(fdc->dmachan, 128 << 3 /* XXX max secsize */);
579 fdc->state = DEVIDLE;
580 /* reset controller, turn motor off, clear fdout mirror reg */
581 outb(fdc->baseport + FDOUT, ((fdc->fdout = 0)));

--- 128 unchanged lines hidden (view full) ---

710
711 fd_registerdev(fdcu, fdu);
712 switch (fdt) {
713 case RTCFDT_12M:
714 printf("1.2MB 5.25in\n");
715 fd->type = FD_1200;
716 kdc_fd[fdu].kdc_description =
717 "1.2MB (1200K) 5.25in floppy disk drive";
575
576 fdc->fdcu = fdcu;
577 fdc->flags |= FDC_ATTACHED;
578 fdc->dmachan = dev->id_drq;
579 isa_dmainit(fdc->dmachan, 128 << 3 /* XXX max secsize */);
580 fdc->state = DEVIDLE;
581 /* reset controller, turn motor off, clear fdout mirror reg */
582 outb(fdc->baseport + FDOUT, ((fdc->fdout = 0)));

--- 128 unchanged lines hidden (view full) ---

711
712 fd_registerdev(fdcu, fdu);
713 switch (fdt) {
714 case RTCFDT_12M:
715 printf("1.2MB 5.25in\n");
716 fd->type = FD_1200;
717 kdc_fd[fdu].kdc_description =
718 "1.2MB (1200K) 5.25in floppy disk drive";
718#ifdef DEVFS
719 sprintf(name,"rfd%d.1200",fdu);
720#endif /* DEVFS */
721 break;
722 case RTCFDT_144M:
723 printf("1.44MB 3.5in\n");
724 fd->type = FD_1440;
725 kdc_fd[fdu].kdc_description =
726 "1.44MB (1440K) 3.5in floppy disk drive";
719 break;
720 case RTCFDT_144M:
721 printf("1.44MB 3.5in\n");
722 fd->type = FD_1440;
723 kdc_fd[fdu].kdc_description =
724 "1.44MB (1440K) 3.5in floppy disk drive";
727#ifdef DEVFS
728 sprintf(name,"rfd%d.1440",fdu);
729#endif /* DEVFS */
730 break;
731 case RTCFDT_288M:
732 case RTCFDT_288M_1:
733 printf("2.88MB 3.5in - 1.44MB mode\n");
734 fd->type = FD_1440;
735 kdc_fd[fdu].kdc_description =
736 "2.88MB (2880K) 3.5in floppy disk drive in 1.44 mode";
725 break;
726 case RTCFDT_288M:
727 case RTCFDT_288M_1:
728 printf("2.88MB 3.5in - 1.44MB mode\n");
729 fd->type = FD_1440;
730 kdc_fd[fdu].kdc_description =
731 "2.88MB (2880K) 3.5in floppy disk drive in 1.44 mode";
737#ifdef DEVFS
738 sprintf(name,"rfd%d.1440",fdu);
739#endif /* DEVFS */
740 break;
741 case RTCFDT_360K:
742 printf("360KB 5.25in\n");
743 fd->type = FD_360;
744 kdc_fd[fdu].kdc_description =
745 "360KB 5.25in floppy disk drive";
732 break;
733 case RTCFDT_360K:
734 printf("360KB 5.25in\n");
735 fd->type = FD_360;
736 kdc_fd[fdu].kdc_description =
737 "360KB 5.25in floppy disk drive";
746#ifdef DEVFS
747 sprintf(name,"rfd%d.360",fdu);
748#endif /* DEVFS */
749 break;
750 case RTCFDT_720K:
751 printf("720KB 3.5in\n");
752 fd->type = FD_720;
753 kdc_fd[fdu].kdc_description =
754 "720KB 3.5in floppy disk drive";
738 break;
739 case RTCFDT_720K:
740 printf("720KB 3.5in\n");
741 fd->type = FD_720;
742 kdc_fd[fdu].kdc_description =
743 "720KB 3.5in floppy disk drive";
755#ifdef DEVFS
756 sprintf(name,"rfd%d.720",fdu);
757#endif /* DEVFS */
758 break;
759 default:
760 printf("unknown\n");
761 fd->type = NO_TYPE;
744 break;
745 default:
746 printf("unknown\n");
747 fd->type = NO_TYPE;
762#ifdef DEVFS
763 sprintf(name,"rfd%d.xxxx",fdu);
764#endif /* DEVFS */
765 break;
748 dev_detach(&kdc_fd[fdu]);
749 continue;
766 }
767 kdc_fd[fdu].kdc_state = DC_IDLE;
768#ifdef DEVFS
750 }
751 kdc_fd[fdu].kdc_state = DC_IDLE;
752#ifdef DEVFS
769 mynor = 8 * fdu;
770 fd->bdev = devfs_add_devswf(&fd_bdevsw, mynor, DV_BLK,
771 UID_ROOT, GID_OPERATOR, 0640,
772 "%s", name + 1);
773 fd->cdev = devfs_add_devswf(&fd_cdevsw, mynor, DV_CHR,
774 UID_ROOT, GID_OPERATOR, 0640,
775 "%s", name);
776 devfs_link(fd->bdev, "fd%d", fdu);
777 devfs_link(fd->cdev, "rfd%d", fdu);
753 mynor = fdu << 6;
754 fd->bdevs[0] = devfs_add_devswf(&fd_bdevsw, mynor, DV_BLK,
755 UID_ROOT, GID_OPERATOR, 0640,
756 "fd%d", fdu);
757 fd->cdevs[0] = devfs_add_devswf(&fd_cdevsw, mynor, DV_CHR,
758 UID_ROOT, GID_OPERATOR, 0640,
759 "rfd%d", fdu);
760 for (i = 1; i < 1 + NUMDENS; i++) {
761 /*
762 * XXX this and the lookup in Fdopen() should be
763 * data driven.
764 */
765 switch (fd->type) {
766 case FD_360:
767 if (i != FD_360)
768 continue;
769 break;
770 case FD_720:
771 if (i != FD_720 && i != FD_800 && i != FD_820)
772 continue;
773 break;
774 case FD_1200:
775 if (i != FD_360 && i != FD_720 && i != FD_800
776 && i != FD_820 && i != FD_1200
777 && i != FD_1440 && i != FD_1480)
778 continue;
779 break;
780 case FD_1440:
781 if (i != FD_720 && i != FD_800 && i != FD_820
782 && i != FD_1200 && i != FD_1440
783 && i != FD_1480 && i != FD_1720)
784 continue;
785 break;
786 }
787 typemynor = mynor | i;
788 typesize = fd_types[i - 1].size / 2;
789 /*
790 * XXX all these conversions give bloated code and
791 * confusing names.
792 */
793 if (typesize == 1476)
794 typesize = 1480;
795 if (typesize == 1722)
796 typesize = 1720;
797 fd->bdevs[i] =
798 devfs_add_devswf(&fd_bdevsw, typemynor, DV_BLK,
799 UID_ROOT, GID_OPERATOR, 0640,
800 "fd%d.%d", fdu, typesize);
801 fd->cdevs[i] =
802 devfs_add_devswf(&fd_cdevsw, typemynor, DV_CHR,
803 UID_ROOT, GID_OPERATOR, 0640,
804 "rfd%d.%d", fdu, typesize);
805 }
806 for (i = 0; i < MAXPARTITIONS; i++) {
807 fd->bdevs[1 + NUMDENS + i] =
808 devfs_link(fd->bdevs[0],
809 "fd%d%c", fdu, 'a' + i);
810 fd->cdevs[1 + NUMDENS + i] =
811 devfs_link(fd->cdevs[0],
812 "rfd%d%c", fdu, 'a' + i);
813 }
778#endif /* DEVFS */
779 if (dk_ndrive < DK_NDRIVE) {
780 sprintf(dk_names[dk_ndrive], "fd%d", fdu);
781 fd->dkunit = dk_ndrive++;
782 /*
783 * XXX assume rate is FDC_500KBPS.
784 */
785 dk_wpms[dk_ndrive] = 500000 / 8 / 2;

--- 1183 unchanged lines hidden ---
814#endif /* DEVFS */
815 if (dk_ndrive < DK_NDRIVE) {
816 sprintf(dk_names[dk_ndrive], "fd%d", fdu);
817 fd->dkunit = dk_ndrive++;
818 /*
819 * XXX assume rate is FDC_500KBPS.
820 */
821 dk_wpms[dk_ndrive] = 500000 / 8 / 2;

--- 1183 unchanged lines hidden ---