| #ifndef _FTAPE_RW_H |
| #define _FTAPE_RW_H |
| |
| /* |
| * Copyright (C) 1993-1996 Bas Laarhoven, |
| * (C) 1996-1997 Claus-Justus Heine. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; see the file COPYING. If not, write to |
| the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
| |
| * |
| * $Source: /homes/cvs/ftape-stacked/ftape/lowlevel/ftape-rw.h,v $ |
| * $Revision: 1.2 $ |
| * $Date: 1997/10/05 19:18:25 $ |
| * |
| * This file contains the definitions for the read and write |
| * functions for the QIC-117 floppy-tape driver for Linux. |
| * |
| * Claus-Justus Heine (1996/09/20): Add definition of format code 6 |
| * Claus-Justus Heine (1996/10/04): Changed GET/PUT macros to cast to (__u8 *) |
| * |
| */ |
| |
| #include "../lowlevel/fdc-io.h" |
| #include "../lowlevel/ftape-init.h" |
| #include "../lowlevel/ftape-bsm.h" |
| |
| #include <asm/unaligned.h> |
| |
| #define GET2(address, offset) get_unaligned((__u16*)((__u8 *)address + offset)) |
| #define GET4(address, offset) get_unaligned((__u32*)((__u8 *)address + offset)) |
| #define GET8(address, offset) get_unaligned((__u64*)((__u8 *)address + offset)) |
| #define PUT2(address, offset , value) put_unaligned((value), (__u16*)((__u8 *)address + offset)) |
| #define PUT4(address, offset , value) put_unaligned((value), (__u32*)((__u8 *)address + offset)) |
| #define PUT8(address, offset , value) put_unaligned((value), (__u64*)((__u8 *)address + offset)) |
| |
| enum runner_status_enum { |
| idle = 0, |
| running, |
| do_abort, |
| aborting, |
| logical_eot, |
| end_of_tape, |
| }; |
| |
| typedef enum ft_buffer_queue { |
| ft_queue_head = 0, |
| ft_queue_tail = 1 |
| } ft_buffer_queue_t; |
| |
| |
| typedef struct { |
| int track; /* tape head position */ |
| volatile int segment; /* current segment */ |
| volatile int sector; /* sector offset within current segment */ |
| volatile unsigned int bot; /* logical begin of track */ |
| volatile unsigned int eot; /* logical end of track */ |
| volatile unsigned int known; /* validates bot, segment, sector */ |
| } location_record; |
| |
| /* Count nr of 1's in pattern. |
| */ |
| static inline int count_ones(unsigned long mask) |
| { |
| int bits; |
| |
| for (bits = 0; mask != 0; mask >>= 1) { |
| if (mask & 1) { |
| ++bits; |
| } |
| } |
| return bits; |
| } |
| |
| #define FT_MAX_NR_BUFFERS 16 /* arbitrary value */ |
| /* ftape-rw.c defined global vars. |
| */ |
| extern buffer_struct *ft_buffer[FT_MAX_NR_BUFFERS]; |
| extern int ft_nr_buffers; |
| extern location_record ft_location; |
| extern volatile int ftape_tape_running; |
| |
| /* ftape-rw.c defined global functions. |
| */ |
| extern int ftape_setup_new_segment(buffer_struct * buff, |
| int segment_id, |
| int offset); |
| extern int ftape_calc_next_cluster(buffer_struct * buff); |
| extern buffer_struct *ftape_next_buffer (ft_buffer_queue_t pos); |
| extern buffer_struct *ftape_get_buffer (ft_buffer_queue_t pos); |
| extern int ftape_buffer_id (ft_buffer_queue_t pos); |
| extern void ftape_reset_buffer(void); |
| extern void ftape_tape_parameters(__u8 drive_configuration); |
| extern int ftape_wait_segment(buffer_state_enum state); |
| extern int ftape_dumb_stop(void); |
| extern int ftape_start_tape(int segment_id, int offset); |
| extern int ftape_stop_tape(int *pstatus); |
| extern int ftape_handle_logical_eot(void); |
| extern buffer_state_enum ftape_set_state(buffer_state_enum new_state); |
| #endif /* _FTAPE_RW_H */ |