141488Smckusick /* 241488Smckusick * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. 341488Smckusick * All rights reserved. 441488Smckusick * 541488Smckusick * %sccs.include.redist.c% 641488Smckusick * 7*45790Sbostic * @(#)saio.h 7.4 (Berkeley) 12/16/90 841488Smckusick */ 941488Smckusick 1041488Smckusick /* 1141488Smckusick * Header file for standalone package 1241488Smckusick */ 1341488Smckusick 1444824Skarels #include <sys/param.h> 15*45790Sbostic #include "ufs/dinode.h" 16*45790Sbostic #include "ufs/fs.h" 1741488Smckusick 1841488Smckusick /* 1941488Smckusick * Io block: includes a 2041488Smckusick * dinode, cells for the use of seek, etc, 2141488Smckusick * and a buffer. 2241488Smckusick */ 2341488Smckusick struct iob { 2441488Smckusick int i_flgs; /* see F_ below */ 2541488Smckusick struct dinode i_ino; /* dinode, if file */ 2641488Smckusick int i_unit; /* pseudo device unit */ 2741488Smckusick daddr_t i_boff; /* block offset on device */ 2841488Smckusick daddr_t i_cyloff; /* cylinder offset on device */ 2941488Smckusick off_t i_offset; /* seek offset in file */ 3044824Skarels dev_t i_dev; /* associated device */ 3141488Smckusick daddr_t i_bn; /* 1st block # of next read */ 3241488Smckusick char *i_ma; /* memory address of i/o buffer */ 3341488Smckusick int i_cc; /* character count of transfer */ 3441488Smckusick int i_error; /* error # return */ 3541488Smckusick int i_errcnt; /* error count for driver retries */ 3641488Smckusick int i_errblk; /* block # in error for error reporting */ 3741488Smckusick char i_buf[MAXBSIZE];/* i/o buffer */ 3841488Smckusick union { 3941488Smckusick struct fs ui_fs; /* file system super block info */ 4041488Smckusick char dummy[SBSIZE]; 4141488Smckusick } i_un; 4241488Smckusick }; 4341488Smckusick #define i_fs i_un.ui_fs 4441488Smckusick #define NULL 0 4541488Smckusick 4641488Smckusick #define F_READ 0x1 /* file opened for reading */ 4741488Smckusick #define F_WRITE 0x2 /* file opened for writing */ 4841488Smckusick #define F_ALLOC 0x4 /* buffer allocated */ 4941488Smckusick #define F_FILE 0x8 /* file instead of device */ 5041488Smckusick #define F_NBSF 0x10 /* no bad sector forwarding */ 5141488Smckusick #define F_SSI 0x40 /* set skip sector inhibit */ 5241488Smckusick /* io types */ 5341488Smckusick #define F_RDDATA 0x0100 /* read data */ 5441488Smckusick #define F_WRDATA 0x0200 /* write data */ 5541488Smckusick #define F_HDR 0x0400 /* include header on next i/o */ 5641488Smckusick #define F_CHECK 0x0800 /* perform check of data read/write */ 5741488Smckusick #define F_HCHECK 0x1000 /* perform check of header and data */ 5841488Smckusick 5941488Smckusick #define F_TYPEMASK 0xff00 6041488Smckusick 6141488Smckusick /* 6241488Smckusick * Device switch. 6341488Smckusick */ 6441488Smckusick struct devsw { 6541488Smckusick char *dv_name; 6641488Smckusick int (*dv_strategy)(); 6741488Smckusick int (*dv_open)(); 6841488Smckusick int (*dv_close)(); 6941488Smckusick int (*dv_ioctl)(); 7041488Smckusick }; 7141488Smckusick 7241488Smckusick struct devsw devsw[]; 7341488Smckusick 7441488Smckusick /* 7541488Smckusick * Drive description table. 7641488Smckusick * Returned from SAIODEVDATA call. 7741488Smckusick */ 7841488Smckusick struct st { 7941488Smckusick short nsect; /* # sectors/track */ 8041488Smckusick short ntrak; /* # tracks/surfaces/heads */ 8141488Smckusick short nspc; /* # sectors/cylinder */ 8241488Smckusick short ncyl; /* # cylinders */ 8341488Smckusick short *off; /* partition offset table (cylinders) */ 8441488Smckusick }; 8541488Smckusick 8641488Smckusick /* 8741488Smckusick * Request codes. Must be the same a F_XXX above 8841488Smckusick */ 8941488Smckusick #define READ 1 9041488Smckusick #define WRITE 2 9141488Smckusick 9241488Smckusick #define NBUFS 4 9341488Smckusick 9441488Smckusick char b[NBUFS][MAXBSIZE]; 9541488Smckusick daddr_t blknos[NBUFS]; 9641488Smckusick 9741488Smckusick #define NFILES 4 9841488Smckusick struct iob iob[NFILES]; 9941488Smckusick 10041488Smckusick extern int errno; /* just like unix */ 10141488Smckusick 10241488Smckusick /* error codes */ 10341488Smckusick #define EBADF 1 /* bad file descriptor */ 10441488Smckusick #define EOFFSET 2 /* relative seek not supported */ 10541488Smckusick #define EDEV 3 /* improper device specification on open */ 10641488Smckusick #define ENXIO 4 /* unknown device specified */ 10741488Smckusick #define EUNIT 5 /* improper unit specification */ 10841488Smckusick #define ESRCH 6 /* directory search for file failed */ 10941488Smckusick #define EIO 7 /* generic error */ 11041488Smckusick #define ECMD 10 /* undefined driver command */ 11141488Smckusick #define EBSE 11 /* bad sector error */ 11241488Smckusick #define EWCK 12 /* write check error */ 11341488Smckusick #define EECC 13 /* uncorrectable ecc error */ 11441488Smckusick #define EHER 14 /* hard error */ 11541488Smckusick 11641488Smckusick /* ioctl's -- for disks just now */ 11741488Smckusick #define SAIOHDR (('d'<<8)|1) /* next i/o includes header */ 11841488Smckusick #define SAIOCHECK (('d'<<8)|2) /* next i/o checks data */ 11941488Smckusick #define SAIOHCHECK (('d'<<8)|3) /* next i/o checks header & data */ 12041488Smckusick #define SAIONOBAD (('d'<<8)|4) /* inhibit bad sector forwarding */ 12141488Smckusick #define SAIODOBAD (('d'<<8)|5) /* enable bad sector forwarding */ 12241488Smckusick #define SAIOECCLIM (('d'<<8)|6) /* set limit to ecc correction, bits */ 12341488Smckusick #define SAIORETRIES (('d'<<8)|7) /* set retry count for unit */ 12441488Smckusick #define SAIODEVDATA (('d'<<8)|8) /* get device data */ 12541488Smckusick #define SAIOSSI (('d'<<8)|9) /* set skip sector inhibit */ 12641488Smckusick #define SAIONOSSI (('d'<<8)|10) /* inhibit skip sector handling */ 12741488Smckusick #define SAIOSSDEV (('d'<<8)|11) /* is device skip sector type? */ 12841488Smckusick #define SAIODEBUG (('d'<<8)|12) /* enable/disable debugging */ 12941488Smckusick #define SAIOGBADINFO (('d'<<8)|13) /* get bad-sector table */ 130