1*f80ad8b4SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-1.0+ WITH Linux-syscall-note */ 2*f80ad8b4SAndroid Build Coastguard Worker /* pg.h (c) 1998 Grant R. Guenther <[email protected]> 3*f80ad8b4SAndroid Build Coastguard Worker Under the terms of the GNU General Public License 4*f80ad8b4SAndroid Build Coastguard Worker 5*f80ad8b4SAndroid Build Coastguard Worker 6*f80ad8b4SAndroid Build Coastguard Worker pg.h defines the user interface to the generic ATAPI packet 7*f80ad8b4SAndroid Build Coastguard Worker command driver for parallel port ATAPI devices (pg). The 8*f80ad8b4SAndroid Build Coastguard Worker driver is loosely modelled after the generic SCSI driver, sg, 9*f80ad8b4SAndroid Build Coastguard Worker although the actual interface is different. 10*f80ad8b4SAndroid Build Coastguard Worker 11*f80ad8b4SAndroid Build Coastguard Worker The pg driver provides a simple character device interface for 12*f80ad8b4SAndroid Build Coastguard Worker sending ATAPI commands to a device. With the exception of the 13*f80ad8b4SAndroid Build Coastguard Worker ATAPI reset operation, all operations are performed by a pair 14*f80ad8b4SAndroid Build Coastguard Worker of read and write operations to the appropriate /dev/pgN device. 15*f80ad8b4SAndroid Build Coastguard Worker A write operation delivers a command and any outbound data in 16*f80ad8b4SAndroid Build Coastguard Worker a single buffer. Normally, the write will succeed unless the 17*f80ad8b4SAndroid Build Coastguard Worker device is offline or malfunctioning, or there is already another 18*f80ad8b4SAndroid Build Coastguard Worker command pending. If the write succeeds, it should be followed 19*f80ad8b4SAndroid Build Coastguard Worker immediately by a read operation, to obtain any returned data and 20*f80ad8b4SAndroid Build Coastguard Worker status information. A read will fail if there is no operation 21*f80ad8b4SAndroid Build Coastguard Worker in progress. 22*f80ad8b4SAndroid Build Coastguard Worker 23*f80ad8b4SAndroid Build Coastguard Worker As a special case, the device can be reset with a write operation, 24*f80ad8b4SAndroid Build Coastguard Worker and in this case, no following read is expected, or permitted. 25*f80ad8b4SAndroid Build Coastguard Worker 26*f80ad8b4SAndroid Build Coastguard Worker There are no ioctl() operations. Any single operation 27*f80ad8b4SAndroid Build Coastguard Worker may transfer at most PG_MAX_DATA bytes. Note that the driver must 28*f80ad8b4SAndroid Build Coastguard Worker copy the data through an internal buffer. In keeping with all 29*f80ad8b4SAndroid Build Coastguard Worker current ATAPI devices, command packets are assumed to be exactly 30*f80ad8b4SAndroid Build Coastguard Worker 12 bytes in length. 31*f80ad8b4SAndroid Build Coastguard Worker 32*f80ad8b4SAndroid Build Coastguard Worker To permit future changes to this interface, the headers in the 33*f80ad8b4SAndroid Build Coastguard Worker read and write buffers contain a single character "magic" flag. 34*f80ad8b4SAndroid Build Coastguard Worker Currently this flag must be the character "P". 35*f80ad8b4SAndroid Build Coastguard Worker 36*f80ad8b4SAndroid Build Coastguard Worker */ 37*f80ad8b4SAndroid Build Coastguard Worker 38*f80ad8b4SAndroid Build Coastguard Worker #ifndef _UAPI_LINUX_PG_H 39*f80ad8b4SAndroid Build Coastguard Worker #define _UAPI_LINUX_PG_H 40*f80ad8b4SAndroid Build Coastguard Worker 41*f80ad8b4SAndroid Build Coastguard Worker #define PG_MAGIC 'P' 42*f80ad8b4SAndroid Build Coastguard Worker #define PG_RESET 'Z' 43*f80ad8b4SAndroid Build Coastguard Worker #define PG_COMMAND 'C' 44*f80ad8b4SAndroid Build Coastguard Worker 45*f80ad8b4SAndroid Build Coastguard Worker #define PG_MAX_DATA 32768 46*f80ad8b4SAndroid Build Coastguard Worker 47*f80ad8b4SAndroid Build Coastguard Worker struct pg_write_hdr { 48*f80ad8b4SAndroid Build Coastguard Worker 49*f80ad8b4SAndroid Build Coastguard Worker char magic; /* == PG_MAGIC */ 50*f80ad8b4SAndroid Build Coastguard Worker char func; /* PG_RESET or PG_COMMAND */ 51*f80ad8b4SAndroid Build Coastguard Worker int dlen; /* number of bytes expected to transfer */ 52*f80ad8b4SAndroid Build Coastguard Worker int timeout; /* number of seconds before timeout */ 53*f80ad8b4SAndroid Build Coastguard Worker char packet[12]; /* packet command */ 54*f80ad8b4SAndroid Build Coastguard Worker 55*f80ad8b4SAndroid Build Coastguard Worker }; 56*f80ad8b4SAndroid Build Coastguard Worker 57*f80ad8b4SAndroid Build Coastguard Worker struct pg_read_hdr { 58*f80ad8b4SAndroid Build Coastguard Worker 59*f80ad8b4SAndroid Build Coastguard Worker char magic; /* == PG_MAGIC */ 60*f80ad8b4SAndroid Build Coastguard Worker char scsi; /* "scsi" status == sense key */ 61*f80ad8b4SAndroid Build Coastguard Worker int dlen; /* size of device transfer request */ 62*f80ad8b4SAndroid Build Coastguard Worker int duration; /* time in seconds command took */ 63*f80ad8b4SAndroid Build Coastguard Worker char pad[12]; /* not used */ 64*f80ad8b4SAndroid Build Coastguard Worker 65*f80ad8b4SAndroid Build Coastguard Worker }; 66*f80ad8b4SAndroid Build Coastguard Worker 67*f80ad8b4SAndroid Build Coastguard Worker #endif /* _UAPI_LINUX_PG_H */ 68