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 --- |