1139825Simp/*- 276588Sjoerg * Copyright (C) 1992-1994,2001 by Joerg Wunsch, Dresden 31019Sache * All rights reserved. 4877Sache * 51019Sache * Redistribution and use in source and binary forms, with or without 61019Sache * modification, are permitted provided that the following conditions 71019Sache * are met: 81019Sache * 1. Redistributions of source code must retain the above copyright 91019Sache * notice, this list of conditions and the following disclaimer. 101019Sache * 2. Redistributions in binary form must reproduce the above copyright 111019Sache * notice, this list of conditions and the following disclaimer in the 121019Sache * documentation and/or other materials provided with the distribution. 13877Sache * 142838Sdg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY 152838Sdg * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 162838Sdg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 172838Sdg * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE 182838Sdg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 192838Sdg * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 202838Sdg * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 212838Sdg * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 222838Sdg * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 232838Sdg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 242838Sdg * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 252838Sdg * DAMAGE. 261817Sdg * 2750477Speter * $FreeBSD$ 28877Sache */ 29877Sache 3018444Sbde#ifndef _MACHINE_IOCTL_FD_H_ 3118444Sbde#define _MACHINE_IOCTL_FD_H_ 32877Sache 3355205Speter#ifndef _KERNEL 34877Sache#include <sys/types.h> 3518444Sbde#endif 3618444Sbde#include <sys/ioccom.h> 37877Sache 38877Sache#define FD_FORMAT_VERSION 110 /* used to validate before formatting */ 39877Sache#define FD_MAX_NSEC 36 /* highest known number of spt - allow for */ 40877Sache /* 2.88 MB drives */ 41877Sache 42877Sachestruct fd_formb { 43877Sache int format_version; /* == FD_FORMAT_VERSION */ 44877Sache int cyl, head; 4587992Sjoerg int transfer_rate; /* FDC_???KBPS */ 46877Sache 47134081Sphk struct fd_form_data { 48134081Sphk /* 49134081Sphk * DO NOT CHANGE THE LAYOUT OF THIS STRUCTS 50134081Sphk * it is hardware-dependent since it exactly 51134081Sphk * matches the byte sequence to write to FDC 52134081Sphk * during its `format track' operation 53134081Sphk */ 54134081Sphk u_char secshift; /* 0 -> 128, ...; usually 2 -> 512 */ 55134081Sphk u_char nsecs; /* must be <= FD_MAX_NSEC */ 56134081Sphk u_char gaplen; /* GAP 3 length; usually 84 */ 57134081Sphk u_char fillbyte; /* usually 0xf6 */ 58134081Sphk struct fd_idfield_data { 59877Sache /* 60134081Sphk * data to write into id fields; 61134081Sphk * for obscure formats, they mustn't match 62134081Sphk * the real values (but mostly do) 63877Sache */ 64134081Sphk u_char cylno; /* 0 thru 79 (or 39) */ 65134081Sphk u_char headno; /* 0, or 1 */ 66134081Sphk u_char secno; /* starting at 1! */ 67134081Sphk u_char secsize; /* usually 2 */ 68134081Sphk } idfields[FD_MAX_NSEC]; /* 0 <= idx < nsecs used */ 69877Sache } format_info; 70877Sache}; 71877Sache 72877Sache/* make life easier */ 73134081Sphk# define fd_formb_secshift format_info.secshift 74134081Sphk# define fd_formb_nsecs format_info.nsecs 75134081Sphk# define fd_formb_gaplen format_info.gaplen 76134081Sphk# define fd_formb_fillbyte format_info.fillbyte 77877Sache/* these data must be filled in for(i = 0; i < fd_formb_nsecs; i++) */ 78134081Sphk# define fd_formb_cylno(i) format_info.idfields[i].cylno 79134081Sphk# define fd_formb_headno(i) format_info.idfields[i].headno 80134081Sphk# define fd_formb_secno(i) format_info.idfields[i].secno 81134081Sphk# define fd_formb_secsize(i) format_info.idfields[i].secsize 82877Sache 83877Sachestruct fd_type { 84877Sache int sectrac; /* sectors per track */ 85877Sache int secsize; /* size code for sectors */ 86877Sache int datalen; /* data len when secsize = 0 */ 87877Sache int gap; /* gap len between sectors */ 8887992Sjoerg int tracks; /* total number of cylinders */ 89877Sache int size; /* size of disk in sectors */ 90877Sache int trans; /* transfer speed code */ 91877Sache int heads; /* number of heads */ 92891Sache int f_gap; /* format gap len */ 93891Sache int f_inter; /* format interleave factor */ 9487992Sjoerg int offset_side2; /* offset of sectors on side2 */ 9587992Sjoerg int flags; /* misc. features */ 9687992Sjoerg#define FL_MFM 0x0001 /* MFM recording */ 9787992Sjoerg#define FL_2STEP 0x0002 /* 2 steps between cylinders */ 9887992Sjoerg#define FL_PERPND 0x0004 /* perpendicular recording */ 99134081Sphk#define FL_AUTO 0x0008 /* autodetect format */ 100877Sache}; 101877Sache 10276588Sjoergstruct fdc_status { 10376588Sjoerg u_int status[7]; 10476588Sjoerg}; 10576588Sjoerg 10678856Sjoerg/* 10778856Sjoerg * cyl and head are being passed into ioctl(FD_READID) 10878856Sjoerg * all four fields are being returned 10978856Sjoerg */ 11078856Sjoergstruct fdc_readid { 11178856Sjoerg u_char cyl; /* C - 0...79 */ 11278856Sjoerg u_char head; /* H - 0...1 */ 11378856Sjoerg u_char sec; /* R - 1...n */ 11478856Sjoerg u_char secshift; /* N - log2(secsize / 128) */ 11578856Sjoerg}; 11678856Sjoerg 11787992Sjoerg/* 11887992Sjoerg * Diskette drive type, basically the same as stored in RTC on ISA 11987992Sjoerg * machines (see /sys/isa/rtc.h), but right-shifted by four bits. 12087992Sjoerg */ 12187992Sjoergenum fd_drivetype { 12287992Sjoerg FDT_NONE, FDT_360K, FDT_12M, FDT_720K, FDT_144M, FDT_288M_1, 12387992Sjoerg FDT_288M 12487992Sjoerg}; 12587992Sjoerg 12687992Sjoerg 127877Sache#define FD_FORM _IOW('F', 61, struct fd_formb) /* format a track */ 128877Sache#define FD_GTYPE _IOR('F', 62, struct fd_type) /* get drive type */ 1292838Sdg#define FD_STYPE _IOW('F', 63, struct fd_type) /* set drive type */ 130877Sache 1312838Sdg#define FD_GOPTS _IOR('F', 64, int) /* drive options, see below */ 1322838Sdg#define FD_SOPTS _IOW('F', 65, int) 133134207Snyan 134134207Snyan#ifdef PC98 135134207Snyan#define FD_DEBUG _IOW('F', 66, int) 136134207Snyan#endif 1372838Sdg 13876588Sjoerg#define FD_CLRERR _IO('F', 67) /* clear error counter */ 1392838Sdg 14078856Sjoerg#define FD_READID _IOWR('F', 68, struct fdc_readid) /* read ID field */ 14178856Sjoerg 1423095Sjoerg/* 14376588Sjoerg * Obtain NE765 status registers. Only successful if there is 14476588Sjoerg * a valid status stored in fdc->status[]. 14576588Sjoerg */ 14687992Sjoerg#define FD_GSTAT _IOR('F', 69, struct fdc_status) 14776588Sjoerg 14887992Sjoerg#define FD_GDTYPE _IOR('F', 70, enum fd_drivetype) /* obtain drive type */ 14987992Sjoerg 15076588Sjoerg/* Options for FD_GOPTS/FD_SOPTS, cleared on device close */ 15176588Sjoerg#define FDOPT_NORETRY 0x0001 /* no retries on failure */ 15276588Sjoerg#define FDOPT_NOERRLOG 0x002 /* no "hard error" kernel log messages */ 15376588Sjoerg#define FDOPT_NOERROR 0x0004 /* do not indicate errors, caller will use 15476588Sjoerg FD_GSTAT in order to obtain status */ 155134081Sphk#ifdef PC98 15687992Sjoerg#define FDOPT_AUTOSEL 0x8000 /* read/only option: device performs media 15787992Sjoerg * autoselection */ 158134081Sphk#endif 15976588Sjoerg 16076588Sjoerg/* 16187992Sjoerg * Transfer rate definitions. Used in the structures above. They 16287992Sjoerg * represent the hardware encoding of bits 0 and 1 of the FDC control 16387992Sjoerg * register when writing to the register. 16487992Sjoerg * Transfer rates for FM encoding are half the values listed here 16587992Sjoerg * (but we currently don't support FM encoding). 1663095Sjoerg */ 1673095Sjoerg#define FDC_500KBPS 0x00 /* 500KBPS MFM drive transfer rate */ 1683095Sjoerg#define FDC_300KBPS 0x01 /* 300KBPS MFM drive transfer rate */ 1693095Sjoerg#define FDC_250KBPS 0x02 /* 250KBPS MFM drive transfer rate */ 17087992Sjoerg#define FDC_1MBPS 0x03 /* 1MPBS MFM drive transfer rate */ 1713095Sjoerg 172134081Sphk/* 173134081Sphk * Parameters for common formats 174134081Sphk * 175134081Sphk * See struct fd_type for layout. 176134081Sphk * XXX: Field 'size' must be calculated. 177134081Sphk * XXX: Fields 'f_inter' and 'offset_side2' are unused by kernel. 178134081Sphk * 179134081Sphk * XXX: These should really go in a /etc/floppycap colon separated file 180134081Sphk * XXX: but the kernel needs some of them for proper defaults and it would 181134081Sphk * XXX: should have been done 20 years ago to make sense. 182134081Sphk */ 183137459Snyan#ifdef PC98 184137459Snyan#define FDF_3_1722 21,2,0xFF,0x04,82,0,2,2,0x0C,2,0,FL_MFM 185137459Snyan#define FDF_3_1476 18,2,0xFF,0x1B,82,0,2,2,0x54,1,0,FL_MFM 186137459Snyan#define FDF_3_1440 18,2,0xFF,0x1B,80,0,2,2,0x54,1,0,FL_MFM 187137459Snyan#define FDF_3_1200 15,2,0xFF,0x1B,80,0,0,2,0x54,1,0,FL_MFM 188137459Snyan#define FDF_3_820 10,2,0xFF,0x10,82,0,1,2,0x30,1,0,FL_MFM 189137459Snyan#define FDF_3_800 10,2,0xFF,0x10,80,0,1,2,0x30,1,0,FL_MFM 190137459Snyan#define FDF_3_720 9,2,0xFF,0x20,80,0,1,2,0x50,1,0,FL_MFM 191137459Snyan#define FDF_3_360 9,2,0xFF,0x20,40,0,1,2,0x50,1,0,FL_MFM|FL_2STEP 192137459Snyan#define FDF_3_640 8,2,0xFF,0x2A,80,0,1,2,0x50,1,0,FL_MFM 193137459Snyan#define FDF_3_1230 8,3,0xFF,0x35,77,0,0,2,0x74,1,0,FL_MFM 194137459Snyan#define FDF_3_1280 8,3,0xFF,0x35,80,0,0,2,0x74,1,0,FL_MFM 195137459Snyan#define FDF_3_1480 9,3,0xFF,0x35,82,0,0,2,0x47,1,0,FL_MFM 196137459Snyan#define FDF_3_1640 10,3,0xFF,0x1B,82,0,2,2,0x54,1,0,FL_MFM 197137459Snyan#define FDF_5_1200 15,2,0xFF,0x1B,80,0,0,2,0x54,1,0,FL_MFM 198137459Snyan#define FDF_5_820 10,2,0xFF,0x10,82,0,1,2,0x30,1,0,FL_MFM 199137459Snyan#define FDF_5_800 10,2,0xFF,0x10,80,0,1,2,0x30,1,0,FL_MFM 200137459Snyan#define FDF_5_720 9,2,0xFF,0x20,80,0,1,2,0x50,1,0,FL_MFM 201137459Snyan#define FDF_5_360 9,2,0xFF,0x20,40,0,1,2,0x50,1,0,FL_MFM|FL_2STEP 202137459Snyan#define FDF_5_640 8,2,0xFF,0x2A,80,0,1,2,0x50,1,0,FL_MFM 203137459Snyan#define FDF_5_1230 8,3,0xFF,0x35,77,0,0,2,0x74,1,0,FL_MFM 204137459Snyan#define FDF_5_1280 8,3,0xFF,0x35,80,0,0,2,0x74,1,0,FL_MFM 205137459Snyan#else /* PC98 */ 206134081Sphk#define FDF_3_2880 36,2,0xFF,0x1B,80,0,FDC_1MBPS,002,0x4C,1,1,FL_MFM|FL_PERPND 207134081Sphk#define FDF_3_1722 21,2,0xFF,0x04,82,0,FDC_500KBPS,2,0x0C,2,0,FL_MFM 208134081Sphk#define FDF_3_1476 18,2,0xFF,0x1B,82,0,FDC_500KBPS,2,0x6C,1,0,FL_MFM 209134081Sphk#define FDF_3_1440 18,2,0xFF,0x1B,80,0,FDC_500KBPS,2,0x6C,1,0,FL_MFM 210134081Sphk#define FDF_3_1200 15,2,0xFF,0x1B,80,0,FDC_500KBPS,2,0x54,1,0,FL_MFM 211134081Sphk#define FDF_3_820 10,2,0xFF,0x10,82,0,FDC_250KBPS,2,0x2e,1,0,FL_MFM 212134081Sphk#define FDF_3_800 10,2,0xFF,0x10,80,0,FDC_250KBPS,2,0x2e,1,0,FL_MFM 213134081Sphk#define FDF_3_720 9,2,0xFF,0x20,80,0,FDC_250KBPS,2,0x50,1,0,FL_MFM 214134081Sphk#define FDF_5_1480 18,2,0xFF,0x02,82,0,FDC_500KBPS,2,0x02,2,0,FL_MFM 215134081Sphk#define FDF_5_1440 18,2,0xFF,0x02,80,0,FDC_500KBPS,2,0x02,2,0,FL_MFM 216134081Sphk#define FDF_5_1230 8,3,0xFF,0x35,77,0,FDC_500KBPS,2,0x74,1,0,FL_MFM 217134081Sphk#define FDF_5_1200 15,2,0xFF,0x1B,80,0,FDC_500KBPS,2,0x54,1,0,FL_MFM 218134081Sphk#define FDF_5_820 10,2,0xFF,0x10,82,0,FDC_300KBPS,2,0x2e,1,0,FL_MFM 219134081Sphk#define FDF_5_800 10,2,0xFF,0x10,80,0,FDC_300KBPS,2,0x2e,1,0,FL_MFM 220134081Sphk#define FDF_5_720 9,2,0xFF,0x20,80,0,FDC_300KBPS,2,0x50,1,0,FL_MFM 221134081Sphk#define FDF_5_640 8,2,0xFF,0x2A,80,0,FDC_300KBPS,2,0x50,1,0,FL_MFM 222134081Sphk#define FDF_5_360 9,2,0xFF,0x23,40,0,FDC_300KBPS,2,0x50,1,0,FL_MFM 223134081Sphk/* XXX: 0x2a ? */ 224137459Snyan#endif 225134081Sphk 22618444Sbde#endif /* !_MACHINE_IOCTL_FD_H_ */ 227