patch-2.1.66 linux/drivers/char/ftape/kernel-interface.c
Next file: linux/drivers/char/ftape/kernel-interface.h
Previous file: linux/drivers/char/ftape/ftape-write.h
Back to the patch index
Back to the overall index
- Lines: 359
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.1.65/linux/drivers/char/ftape/kernel-interface.c
- Orig date:
Tue May 13 22:41:07 1997
diff -u --recursive --new-file v2.1.65/linux/drivers/char/ftape/kernel-interface.c linux/drivers/char/ftape/kernel-interface.c
@@ -1,358 +0,0 @@
-/*
- * Copyright (C) 1993-1995 Bas Laarhoven.
-
- 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.
-
- *
- * This file contains the code that interfaces the kernel
- * for the QIC-40/80 floppy-tape driver for Linux.
- */
-
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/errno.h>
-#include <linux/fs.h>
-#include <asm/uaccess.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/major.h>
-#include <linux/malloc.h>
-#include <linux/init.h>
-#include <linux/ftape.h>
-#include <asm/dma.h>
-
-#include "tracing.h"
-#include "kernel-interface.h"
-#include "ftape-read.h"
-#include "ftape-write.h"
-#include "ftape-io.h"
-#include "ftape-ctl.h"
-#include "ftape-rw.h"
-#include "fdc-io.h"
-
-
-/* Global vars.
- */
-
-/* Allocating a 96Kb DMAable buffer in one chunk won't work due to
- * memory fragmentation. To avoid this, it is broken up into
- * NR_BUFFERS chunks of 32Kbyte. --khp
- */
-
-byte *tape_buffer[NR_BUFFERS] = {NULL};
-
-/* Local vars.
- */
-static int busy_flag = 0;
-static int old_sigmask;
-
-static int ftape_open(struct inode *ino, struct file *filep);
-static int ftape_close(struct inode *ino, struct file *filep);
-static int ftape_ioctl(struct inode *ino, struct file *filep,
- unsigned int command, unsigned long arg);
-static long ftape_read(struct inode *ino, struct file *fp,
- char *buff, unsigned long req_len);
-static long ftape_write(struct inode *ino, struct file *fp,
- const char *buff, unsigned long req_len);
-
-static struct file_operations ftape_cdev =
-{
- NULL, /* lseek */
- ftape_read, /* read */
- ftape_write, /* write */
- NULL, /* readdir */
- NULL, /* poll */
- ftape_ioctl, /* ioctl */
- NULL, /* mmap */
- ftape_open, /* open */
- ftape_close, /* release */
- NULL, /* fsync */
-};
-
-/*
- * DMA'able memory allocation stuff.
- */
-
-/* Pure 2^n version of get_order */
-static inline int __get_order(unsigned long size)
-{
- int order;
-
- size = (size-1) >> (PAGE_SHIFT-1);
- order = -1;
- do {
- size >>= 1;
- order++;
- } while (size);
- return order;
-}
-
-static inline
-void *dmaalloc(int order)
-{
- return (void *) __get_dma_pages(GFP_KERNEL, order);
-}
-
-static inline
-void dmafree(void *addr, int order)
-{
- free_pages((unsigned long) addr, order);
-}
-
-/*
- * Called by modules package when installing the driver
- * or by kernel during the initialization phase
- */
-
-#ifdef MODULE
-EXPORT_NO_SYMBOLS;
-#define ftape_init init_module
-#endif
-
-__initfunc(int ftape_init(void))
-{
- int n;
- int order;
- TRACE_FUN(5, "ftape_init");
-#ifdef MODULE
- printk(KERN_INFO "ftape-2.08 960314\n"
- KERN_INFO " (c) 1993-1995 Bas Laarhoven (bas@vimec.nl)\n"
- KERN_INFO " (c) 1995-1996 Kai Harrekilde-Petersen (khp@dolphinics.no)\n"
- KERN_INFO " QIC-117 driver for QIC-40/80/3010/3020 tape drives\n"
- KERN_INFO " Compiled for kernel version " UTS_RELEASE
-#ifdef MODVERSIONS
- " with versioned symbols"
-#endif
- "\n");
-#else /* !MODULE */
- /* print a short no-nonsense boot message */
- printk("ftape-2.08 960314 for Linux 1.3.70\n");
-#endif /* MODULE */
- TRACE(3, "installing QIC-117 ftape driver...");
- if (register_chrdev(QIC117_TAPE_MAJOR, "ft", &ftape_cdev)) {
- TRACE(1, "register_chrdev failed");
- TRACE_EXIT;
- return -EIO;
- }
- TRACEx1(3, "ftape_init @ 0x%p", ftape_init);
- /*
- * Allocate the DMA buffers. They are deallocated at cleanup() time.
- */
- order = __get_order(BUFF_SIZE);
- for (n = 0; n < NR_BUFFERS; n++) {
- tape_buffer[n] = (byte *) dmaalloc(order);
- if (!tape_buffer[n]) {
- TRACE(1, "dmaalloc() failed");
- for (n = 0; n < NR_BUFFERS; n++) {
- if (tape_buffer[n]) {
- dmafree(tape_buffer[n], order);
- tape_buffer[n] = NULL;
- }
- }
- current->blocked = old_sigmask; /* restore mask */
- if (unregister_chrdev(QIC117_TAPE_MAJOR, "ft") != 0) {
- TRACE(3, "unregister_chrdev failed");
- }
- TRACE_EXIT;
- return -ENOMEM;
- } else {
- TRACEx2(3, "dma-buffer #%d @ %p", n, tape_buffer[n]);
- }
- }
- busy_flag = 0;
- ftape_unit = -1;
- ftape_failure = 1; /* inhibit any operation but open */
- udelay_calibrate(); /* must be before fdc_wait_calibrate ! */
- fdc_wait_calibrate();
- TRACE_EXIT;
-
- return 0;
-}
-
-
-#ifdef MODULE
-/* Called by modules package when removing the driver
- */
-void cleanup_module(void)
-{
- int n;
- int order;
- TRACE_FUN(5, "cleanup_module");
-
- if (unregister_chrdev(QIC117_TAPE_MAJOR, "ft") != 0) {
- TRACE(3, "failed");
- } else {
- TRACE(3, "successful");
- }
- order = __get_order(BUFF_SIZE);
- for (n = 0; n < NR_BUFFERS; n++) {
- if (tape_buffer[n]) {
- dmafree(tape_buffer[n], order);
- tape_buffer[n] = NULL;
- TRACEx1(3, "removed dma-buffer #%d", n);
- } else {
- TRACEx1(1, "dma-buffer #%d == NULL (bug?)", n);
- }
- }
- TRACE_EXIT;
-}
-#endif /* MODULE */
-
-/* Open ftape device
- */
-static int ftape_open(struct inode *ino, struct file *filep)
-{
- TRACE_FUN(4, "ftape_open");
- int result;
- MOD_INC_USE_COUNT; /* lock module in memory */
-
- TRACEi(5, "called for minor", MINOR(ino->i_rdev));
- if (busy_flag) {
- TRACE(1, "failed: already busy");
- MOD_DEC_USE_COUNT; /* unlock module in memory */
- TRACE_EXIT;
- return -EBUSY;
- }
- if ((MINOR(ino->i_rdev) & ~FTAPE_NO_REWIND) > 3) {
- TRACE(1, "failed: illegal unit nr");
- MOD_DEC_USE_COUNT; /* unlock module in memory */
- TRACE_EXIT;
- return -ENXIO;
- }
- if (ftape_unit == -1 || FTAPE_UNIT != (MINOR(ino->i_rdev) & 3)) {
- /* Other selection than last time
- */
- ftape_init_driver();
- }
- ftape_unit = MINOR(ino->i_rdev);
- ftape_failure = 0; /* allow tape operations */
- old_sigmask = current->blocked;
- current->blocked = _BLOCK_ALL;
- fdc_save_drive_specs(); /* save Drive Specification regs on i82078-1's */
- result = _ftape_open();
- if (result < 0) {
- TRACE(1, "_ftape_open failed");
- current->blocked = old_sigmask; /* restore mask */
- MOD_DEC_USE_COUNT; /* unlock module in memory */
- TRACE_EXIT;
- return result;
- } else {
- busy_flag = 1;
- /* Mask signals that will disturb proper operation of the
- * program that is calling.
- */
- current->blocked = old_sigmask | _DO_BLOCK;
- TRACE_EXIT;
- return 0;
- }
-}
-
-/* Close ftape device
- */
-static int ftape_close(struct inode *ino, struct file *filep)
-{
- TRACE_FUN(4, "ftape_close");
- int result;
-
- if (!busy_flag || MINOR(ino->i_rdev) != ftape_unit) {
- TRACE(1, "failed: not busy or wrong unit");
- TRACE_EXIT;
- return 0; /* keep busy_flag !(?) */
- }
- current->blocked = _BLOCK_ALL;
- result = _ftape_close();
- if (result < 0) {
- TRACE(1, "_ftape_close failed");
- }
- fdc_restore_drive_specs(); /* restore original values */
- ftape_failure = 1; /* inhibit any operation but open */
- busy_flag = 0;
- current->blocked = old_sigmask; /* restore before open state */
- TRACE_EXIT;
- MOD_DEC_USE_COUNT; /* unlock module in memory */
- return 0;
-}
-
-/* Ioctl for ftape device
- */
-static int ftape_ioctl(struct inode *ino, struct file *filep,
- unsigned int command, unsigned long arg)
-{
- TRACE_FUN(4, "ftape_ioctl");
- int result = -EIO;
- int old_sigmask;
-
- if (!busy_flag || MINOR(ino->i_rdev) != ftape_unit || ftape_failure) {
- TRACE(1, "failed: not busy, failure or wrong unit");
- TRACE_EXIT;
- return -EIO;
- }
- old_sigmask = current->blocked; /* save mask */
- current->blocked = _BLOCK_ALL;
- /* This will work as long as sizeof( void*) == sizeof( long)
- */
- result = _ftape_ioctl(command, (void *) arg);
- current->blocked = old_sigmask; /* restore mask */
- TRACE_EXIT;
- return result;
-}
-
-/* Read from tape device
- */
-static long ftape_read(struct inode *ino, struct file *fp,
- char *buff, unsigned long req_len)
-{
- TRACE_FUN(5, "ftape_read");
- int result = -EIO;
- int old_sigmask;
-
- TRACEi(5, "called with count:", (int) req_len);
- if (!busy_flag || MINOR(ino->i_rdev) != ftape_unit || ftape_failure) {
- TRACE(1, "failed: not busy, failure or wrong unit");
- TRACE_EXIT;
- return -EIO;
- }
- old_sigmask = current->blocked; /* save mask */
- current->blocked = _BLOCK_ALL;
- result = _ftape_read(buff, req_len);
- TRACEi(7, "return with count:", result);
- current->blocked = old_sigmask; /* restore mask */
- TRACE_EXIT;
- return result;
-}
-
-/* Write to tape device
- */
-static long ftape_write(struct inode *ino, struct file *fp,
- const char *buff, unsigned long req_len)
-{
- TRACE_FUN(8, "ftape_write");
- int result = -EIO;
- int old_sigmask;
-
- TRACEi(5, "called with count:", (int) req_len);
- if (!busy_flag || MINOR(ino->i_rdev) != ftape_unit || ftape_failure) {
- TRACE(1, "failed: not busy, failure or wrong unit");
- TRACE_EXIT;
- return -EIO;
- }
- old_sigmask = current->blocked; /* save mask */
- current->blocked = _BLOCK_ALL;
- result = _ftape_write(buff, req_len);
- TRACEi(7, "return with count:", result);
- current->blocked = old_sigmask; /* restore mask */
- TRACE_EXIT;
- return result;
-}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov