Commit f8c02520 authored by Linus Torvalds's avatar Linus Torvalds

Import 1.1.74

parent f7f228f4
......@@ -721,6 +721,16 @@ S: Kalevankatu 55 B 37
S: 00180 Helsinki
S: Finland
N: Jeff Tranter
E: Jeff_Tranter@Mitel.COM
D: Enhancements to Joystick driver
D: Author of Sound HOWTO and CD-ROM HOWTO
D: Author of several small utilities
D: (bogomips, scope, eject, statserial)
S: 1 Laurie Court
S: Kanata, Ontario
S: CANADA K2L 1S2
N: Theodore Ts'o
E: tytso@mit.edu
D: Random Linux hacker
......
VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 73
SUBLEVEL = 74
ARCH = i386
......@@ -148,7 +148,7 @@ include/linux/version.h: $(CONFIGURE) Makefile
@echo \#define LINUX_COMPILER \"`$(HOSTCC) -v 2>&1 | tail -1`\" >> include/linux/version.h
tools/build: tools/build.c $(CONFIGURE)
$(HOSTCC) $(CFLAGS) -o $@ $<
$(HOSTCC) $(CFLAGS) -o $@ $< -I$(TOPDIR)/include
boot/head.o: $(CONFIGURE) boot/head.s
......
......@@ -74,7 +74,7 @@ bool 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE
bool 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 n
bool 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n
bool '7000FASST SCSI support' CONFIG_SCSI_7000FASST n
bool 'EISA EATA support' CONFIG_SCSI_EATA n
bool 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA n
#bool 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n
fi
......@@ -196,6 +196,7 @@ bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n
comment 'character devices'
bool 'Cyclades async mux support' CONFIG_CYCLADES n
bool 'Parallel printer support' CONFIG_PRINTER n
bool 'Logitech busmouse support' CONFIG_BUSMOUSE n
bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE n
......
/* vac.c: Routines for flushing various amount of the Sparc VAC
(virtual address cache).
Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
*/
#include <asm/vac-ops.h>
/* Flush all VAC entries for the current context */
extern int do_hw_vac_flushes, vac_size, vac_linesize;
extern int vac_entries_per_context, vac_entries_per_segment;
extern int vac_entries_per_page;
void
flush_vac_context()
{
register int entries_left, offset;
register char* address;
entries_left = vac_entries_per_context;
address = (char *) 0;
if(do_hw_vac_flushes)
{
while(entries_left-- >=0)
{
hw_flush_vac_context_entry(address);
address += 4096;
}
}
else
{
offset = vac_linesize;
while(entries_left-- >=0)
{
sw_flush_vac_context_entry(address);
address += offset;
}
}
}
void
flush_vac_segment(register unsigned int segment)
{
register int entries_left, offset;
register char* address;
entries_left = vac_entries_per_segment;
__asm__ __volatile__("sll %0, 18, %1\n\t"
"sra %1, 0x2, %1\n\t"
: "=r" (segment) : "0" (address));
if(do_hw_vac_flushes)
{
while(entries_left-- >=0)
{
hw_flush_vac_segment_entry(address);
address += 4096;
}
}
else
{
offset = vac_linesize;
while(entries_left-- >=0)
{
sw_flush_vac_segment_entry(address);
address += offset;
}
}
}
void
flush_vac_page(register unsigned int addr)
{
register int entries_left, offset;
if(do_hw_vac_flushes)
{
hw_flush_vac_page_entry(addr);
}
else
{
entries_left = vac_entries_per_page;
offset = vac_linesize;
while(entries_left-- >=0)
{
sw_flush_vac_page_entry(addr);
addr += offset;
}
}
}
This README belongs to release 2.8 or newer of the SoundBlaster Pro
(Matsushita, Kotobuki, Panasonic, CreativeLabs) CD-ROM driver for Linux.
This README belongs to release 2.9 or newer of the SoundBlaster Pro
(Matsushita, Kotobuki, Panasonic, CreativeLabs, Longshine and soon TEAC, too)
CD-ROM driver for Linux.
The driver is able to drive the whole family of "traditional" IDE-style (that
has nothing to do with the new "Enhanced IDE" drive standard) Matsushita,
......@@ -7,26 +8,36 @@ Kotobuki, Panasonic drives, sometimes labelled as "CreativeLabs". The
well-known drives are CR-521, CR-522, CR-523, CR-562, CR-563.
The Longshine LCS-7260 is a double-speed drive which uses the "old"
Matsushita command set. It should be fully supported soon, too.
Matsushita command set. It is supported now - with help by Serge Robyns.
There exists an "IBM External ISA CD-ROM Drive" which in fact is a CR-562
There exists an "IBM External ISA CD-ROM Drive" which in fact is a CR-563
with a special controller board. This drive is supported (the interface is
of the "LaserMate" type), and it is possibly the best buy today (cheaper than
an internal drive, and you can use it as an internal, too - f.e. plug it into
a soundcard). If you own such a drive, please mail me the DOS driver (gzipped
and uuencoded) and the specifications (exact name, address range etc.) I still
have to confirm my opinion. ;-)
a soundcard).
The quad-speed TEAC CD-55A drive uses the same interface types, but has a
totally different command and flow control scheme. It is not supported yet,
but I plan to add it.
CreativeLabs has a new drive "CD-200". This drive is not supported yet, but
I plan to add it.
This driver is NOT for Mitsumi or Sony or Aztech or Philips or XXX drives.
The matter that some other brand's drives work with newer sound card
interfaces does NOT make the drives compatible. :-)
For Aztech CDA-268 drives (and for some Wearnes, Okano and Orchid drives),
Werner Zimmermann has done a driver which currently resides at ftp.gwdg.de
under /pub/linux/cdrom/drivers/aztech/.
It will work with the soundcard interfaces (SB Pro, SB 16, Galaxy, SoundFX,
...) and/or with the "no-sound" cards (Panasonic CI-101P, LaserMate,
This driver will work with the soundcard interfaces (SB Pro, SB 16, Galaxy,
SoundFX, ...) and/or with the "no-sound" cards (Panasonic CI-101P, LaserMate,
WDH-7001C, Longshine LCS-6853, older Aztech cards, ...).
It should work too now with the "configurable" interface "Sequoia S-1000",
which is found on the Spea Media FX sound card. I still need feedback about
this.
this, or such a card. Anyways, the procedure "boot DOS and wait until
CONFIG.SYS is done, then use CTL-ALT-DEL to boot Linux" should make it
work.
The interface type has to get configured in /usr/include/linux/sbpcd.h,
because the behavior of some sound card interfaces is different.
......@@ -252,6 +263,70 @@ main(int argc, char *argv[])
}
/*===================== end program ========================================*/
There is a new ioctl CDROMMULTISESSION to obtain with a user program if
the CD is an XA disk and - if it is - where the last session starts. The
following example illustrates how to call it:
/*=================== begin program ========================================*/
/*
* ask for multisession redirection info
*
* (c) 1994 Eberhard Moenkeberg <emoenke@gwdg.de>
* may be used & enhanced freely
*
*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>
static struct cdrom_multisession ms_info;
static int drive;
static int err;
main(int argc, char *argv[])
{
/*
* open /dev/cdrom
*/
drive=open("/dev/cdrom", 0);
if (drive<0)
{
fprintf(stderr, "can't open drive /dev/cdrom.\n");
exit (-1);
}
/*
*
*/
ms_info.addr_format=CDROM_LBA;
err=ioctl(drive, CDROMMULTISESSION, &ms_info);
if (err!=0)
{
fprintf(stderr, "CDROMMULTISESSION(lba) returns error %d.\n", err);
exit (-1);
}
else
if (ms_info.xa_flag)
fprintf(stdout, "lba: %d\n", ms_info.addr.lba);
else
fprintf(stdout, "not an XA disk.\n");
ms_info.addr_format=CDROM_MSF;
err=ioctl(drive, CDROMMULTISESSION, &ms_info);
if (err!=0)
{
fprintf(stderr, "CDROMMULTISESSION(msf) returns error %d.\n", err);
exit (-1);
}
else
if (ms_info.xa_flag)
fprintf(stdout, "msf: %02d:%02d:%02d\n",
ms_info.addr.msf.minute,
ms_info.addr.msf.second,
ms_info.addr.msf.frame);
else
fprintf(stdout, "not an XA disk.\n");
}
/*===================== end program ========================================*/
Auto-probing at boot time:
......
This diff is collapsed.
......@@ -25,6 +25,11 @@ SRCS = tty_io.c n_tty.c console.c keyboard.c serial.c \
defkeymap.c uni_to_437.c
ifdef CONFIG_CYCLADES
OBJS := $(OBJS) cyclades.o
SRCS := $(SRCS) cyclades.c
endif
ifdef CONFIG_ATIXL_BUSMOUSE
M = y
OBJS := $(OBJS) atixlmouse.o
......
This diff is collapsed.
......@@ -82,8 +82,8 @@ unsigned char kbd_read_mask = 0x01; /* modified by psaux.c */
/*
* global state includes the following, and various static variables
* in this module: prev_scancode, shift_state, diacr, npadch,
* dead_key_next, last_console
* in this module: prev_scancode, shift_state, diacr, npadch, dead_key_next.
* (last_console is now a global variable)
*/
/* shift state counters.. */
......@@ -91,8 +91,8 @@ static unsigned char k_down[NR_SHIFT] = {0, };
/* keyboard key bitmap */
static unsigned long key_down[8] = { 0, };
extern int last_console;
static int want_console = -1;
static int last_console = 0; /* last used VC */
static int dead_key_next = 0;
/*
* In order to retrieve the shift_state (for the mouse server), either
......@@ -190,7 +190,7 @@ void to_utf8(ushort c) {
put_queue(0x80 | ((c >> 6) & 0x3f));
put_queue(0x80 | (c & 0x3f));
}
/* utf-8 is defined for words of up to 36 bits,
/* UTF-8 is defined for words of up to 31 bits,
but we need only 16 bits here */
}
......@@ -1131,7 +1131,6 @@ static void kbd_bh(void * unused)
}
if (want_console >= 0) {
if (want_console != fg_console) {
last_console = fg_console;
change_console(want_console);
/* we only changed when the console had already
been allocated - a new console is not created
......
......@@ -1533,8 +1533,13 @@ static int get_modem_info(struct async_struct * info, unsigned int *value)
static int set_modem_info(struct async_struct * info, unsigned int cmd,
unsigned int *value)
{
unsigned int arg = get_fs_long((unsigned long *) value);
int error;
unsigned int arg;
error = verify_area(VERIFY_READ, value, sizeof(int));
if (error)
return error;
arg = get_fs_long((unsigned long *) value);
switch (cmd) {
case TIOCMBIS:
if (arg & TIOCM_RTS) {
......
......@@ -82,10 +82,12 @@ struct tty_ldisc ldiscs[NR_LDISCS]; /* line disc dispatch table */
/*
* fg_console is the current virtual console,
* last_console is the last used one
* redirect is the pseudo-tty that console output
* is redirected to if asked by TIOCCONS.
*/
int fg_console = 0;
int last_console = 0;
struct tty_struct * redirect = NULL;
struct wait_queue * keypress_wait = NULL;
......@@ -364,6 +366,7 @@ void do_tty_hangup(struct tty_struct * tty, struct file_operations *fops)
tty->flags = 0;
tty->session = 0;
tty->pgrp = -1;
tty->ctrl_status = 0;
for_each_task(p) {
if (p->tty == tty)
p->tty = NULL;
......@@ -412,11 +415,11 @@ void disassociate_ctty(int priv)
if (!tty)
return;
if (tty->pgrp > 0) {
kill_pg(tty->pgrp, SIGHUP, priv);
kill_pg(tty->pgrp, SIGCONT, priv);
}
tty->session = 0;
tty->pgrp = -1;
......@@ -470,6 +473,7 @@ void complete_change_console(unsigned int new_console)
return;
if (!vc_cons_allocated(new_console))
return;
last_console = fg_console;
/*
* If we're switching, we could be going from KD_GRAPHICS to
......@@ -1685,6 +1689,9 @@ long tty_init(long kmem_start)
kmem_start = kbd_init(kmem_start);
kmem_start = rs_init(kmem_start);
#ifdef CONFIG_CYCLADES
kmem_start = cy_init(kmem_start);
#endif
kmem_start = pty_init(kmem_start);
return kmem_start;
}
......@@ -190,6 +190,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* doesn't do a whole lot. i'm not sure if it should do any
* restoration of modes or what...
*/
if (!suser())
return -EPERM;
switch (arg) {
case KD_GRAPHICS:
break;
......@@ -230,6 +232,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return -EINVAL;
case KDSKBMODE:
if (!suser())
return -EPERM;
switch(arg) {
case K_RAW:
kbd->kbdmode = VC_RAW;
......@@ -309,6 +313,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
struct kbkeycode * const a = (struct kbkeycode *)arg;
unsigned int sc, kc;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbkeycode));
if (i)
return i;
......@@ -348,6 +354,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
u_char s;
u_short v;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbentry));
if (i)
return i;
......@@ -437,6 +445,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
u_char *p;
char *q;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)a, sizeof(struct kbsentry));
if (i)
return i;
......@@ -520,6 +530,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
struct kbdiacrs *a = (struct kbdiacrs *)arg;
unsigned int ct;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *) a, sizeof(struct kbdiacrs));
if (i)
return i;
......@@ -542,6 +554,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return 0;
case KDSKBLED:
if (!suser())
return -EPERM;
if (arg & ~0x77)
return -EINVAL;
kbd->ledflagstate = (arg & 7);
......@@ -559,6 +573,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return 0;
case KDSETLED:
/* OK, I'll let ordinary users run blinkenlights - zblaxell */
setledstate(kbd, arg);
return 0;
......@@ -567,6 +582,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
struct vt_mode *vtmode = (struct vt_mode *)arg;
char mode;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_WRITE, (void *)vtmode, sizeof(struct vt_mode));
if (i)
return i;
......@@ -642,6 +659,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* to preserve sanity).
*/
case VT_ACTIVATE:
if (!suser())
return -EPERM;
if (arg == 0 || arg > MAX_NR_CONSOLES)
return -ENXIO;
arg--;
......@@ -655,6 +674,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* wait until the specified VT has been activated
*/
case VT_WAITACTIVE:
if (!suser())
return -EPERM;
if (arg == 0 || arg > MAX_NR_CONSOLES)
return -ENXIO;
arg--;
......@@ -676,6 +697,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* 2: completed switch-to OK
*/
case VT_RELDISP:
if (!suser())
return -EPERM;
if (vt_cons[console]->vt_mode.mode != VT_PROCESS)
return -EINVAL;
......@@ -724,6 +747,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* Disallocate memory associated to VT (but leave VT1)
*/
case VT_DISALLOCATE:
if (!suser())
return -EPERM;
if (arg > MAX_NR_CONSOLES)
return -ENXIO;
if (arg == 0) {
......@@ -751,6 +776,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
{
struct vt_sizes *vtsizes = (struct vt_sizes *) arg;
ushort ll,cc;
if (!suser())
return -EPERM;
i = verify_area(VERIFY_READ, (void *)vtsizes, sizeof(struct vt_sizes));
if (i)
return i;
......@@ -760,6 +787,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
}
case PIO_FONT:
if (!suser())
return -EPERM;
return con_set_font((char *)arg);
/* con_set_font() defined in console.c */
......@@ -768,6 +797,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
/* con_get_font() defined in console.c */
case PIO_SCRNMAP:
if (!suser())
return -EPERM;
return con_set_trans((char *)arg);
/* con_set_trans() defined in console.c */
......
......@@ -75,6 +75,7 @@ dummy_init(struct device *dev)
/* Fill in the fields of the device structure with ethernet-generic values. */
ether_setup(dev);
dev->flags |= IFF_NOARP;
return 0;
}
......
......@@ -686,6 +686,8 @@ eexp_get_stats(struct device *dev)
static void
set_multicast_list(struct device *dev, int num_addrs, void *addrs)
{
/* This doesn't work yet */
#if 0
short ioaddr = dev->base_addr;
if (num_addrs < 0) {
/* Not written yet, this requires expanding the init_words config
......@@ -702,6 +704,7 @@ set_multicast_list(struct device *dev, int num_addrs, void *addrs)
cmd. */
outw(99, ioaddr); /* Disable promiscuous mode, use normal mode */
}
#endif
}
/* The horrible routine to read a word from the serial EEPROM. */
......
/* $Id: plip.c,v 1.7 1994/12/16 06:20:02 gniibe Exp $ */
/* plip.c: A parallel port "network" driver for linux. */
/* This driver is for parallel port with 5-bit cable (LapLink (R) cable). */
/*
......@@ -31,7 +32,7 @@ static char *version =
#ifdef MODULE
"MODULAR "
#endif
"PLIP.014 gniibe@mri.co.jp\n";
"PLIP $Revision: 1.7 $ gniibe@mri.co.jp\n";
#include <linux/config.h>
......@@ -110,9 +111,9 @@ static unsigned int net_debug = NET_DEBUG;
/* Nibble time out = PLIP_NIBBLE_WAIT * PLIP_DELAY_UNIT usec */
#define PLIP_NIBBLE_WAIT 5000
#define PAR_DATA(dev) (dev->base_addr+0)
#define PAR_STATUS(dev) (dev->base_addr+1)
#define PAR_CONTROL(dev) (dev->base_addr+2)
#define PAR_DATA(dev) ((dev)->base_addr+0)
#define PAR_STATUS(dev) ((dev)->base_addr+1)
#define PAR_CONTROL(dev) ((dev)->base_addr+2)
/* Index to functions, as function prototypes. */
static int plip_tx_packet(struct sk_buff *skb, struct device *dev);
......@@ -226,6 +227,8 @@ plip_init(struct device *dev)
}
}
snarf_region(PAR_DATA(dev), 3);
/* Fill in the generic fields of the device structure. */
ether_setup(dev);
......@@ -297,6 +300,8 @@ plip_bh(struct device *dev)
case PLIP_CN_RECEIVE:
sti();
disable_irq(dev->irq);
outb(LP_PINITP|LP_PSELECP, PAR_CONTROL(dev));
outb(0x01, PAR_DATA(dev)); /* send ACK */
dev->interrupt = 0;
result = plip_receive_packet(dev);
if (result == 0) { /* success */
......@@ -307,9 +312,11 @@ plip_bh(struct device *dev)
netif_rx(skb);
if (snd->state != PLIP_PK_DONE) {
nl->connection = PLIP_CN_SEND;
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq);
} else {
nl->connection = PLIP_CN_NONE;
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq);
return;
}
......@@ -340,6 +347,7 @@ plip_bh(struct device *dev)
snd->skb = NULL;
nl->connection = PLIP_CN_CLOSING;
queue_task(&nl->deferred, &tq_timer);
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq);
return;
} else
......@@ -359,6 +367,7 @@ plip_bh(struct device *dev)
if (result == 0) {
nl->connection = PLIP_CN_NONE;
dev->tbusy = 0;
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq);
return;
} else {
......@@ -392,6 +401,7 @@ plip_bh(struct device *dev)
dev_kfree_skb(rcv->skb, FREE_WRITE);
}
disable_irq(dev->irq);
outb(LP_PINITP|LP_PSELECP, PAR_CONTROL(dev));
dev->tbusy = 1;
nl->connection = PLIP_CN_ERROR;
outb(0x00, PAR_DATA(dev));
......@@ -542,6 +552,7 @@ plip_device_clear(struct device *dev)
cli();
dev->tbusy = 0;
sti();
outb(LP_PINITP|LP_PSELECP|LP_PINTEN, PAR_CONTROL(dev));
enable_irq(dev->irq);
}
......@@ -702,7 +713,6 @@ plip_interrupt(int reg_ptr)
printk("plip: spurious interrupt\n");
return;
}
outb(0x01, PAR_DATA(dev)); /* send ACK */
dev->interrupt = 1;
if (net_debug > 3)
printk("%s: interrupt.\n", dev->name);
......@@ -809,6 +819,7 @@ plip_send_packet(struct device *dev)
c0 = inb(PAR_STATUS(dev));
if (c0 & 0x08) {
disable_irq(dev->irq);
outb(LP_PINITP|LP_PSELECP, PAR_CONTROL(dev));
if (net_debug > 3)
printk("+");
/* OK, connection established! */
......@@ -952,16 +963,19 @@ cleanup_module(void)
else {
if (dev_plip0.priv) {
unregister_netdev(&dev_plip0);
release_region(PAR_DATA(&dev_plip0), 3);
kfree_s(dev_plip0.priv, sizeof(struct net_local));
dev_plip0.priv = NULL;
}
if (dev_plip1.priv) {
unregister_netdev(&dev_plip1);
release_region(PAR_DATA(&dev_plip1), 3);
kfree_s(dev_plip1.priv, sizeof(struct net_local));
dev_plip1.priv = NULL;
}
if (dev_plip2.priv) {
unregister_netdev(&dev_plip2);
release_region(PAR_DATA(&dev_plip2), 3);
kfree_s(dev_plip2.priv, sizeof(struct net_local));
dev_plip2.priv = NULL;
}
......
......@@ -262,6 +262,13 @@ int wd_probe1(struct device *dev, int ioaddr)
dev->stop = &wd_close_card;
NS8390_init(dev, 0);
#if 1
/* Enable interrupt generation on softconfig cards -- M.U */
/* .. but possibly potentially unsafe - Donald */
if (inb(ioaddr+14) & 0x20)
outb(inb(ioaddr+4)|0x80, ioaddr+4);
#endif
return 0;
}
......
This file contains brief information about the SCSI tape driver.
Last modified: Wed Nov 30 20:34:03 1994 by root@kai.home
Last modified: Sat Dec 17 13:38:43 1994 by root@kai.home
BASICS
......@@ -11,8 +11,9 @@ variable block size (within buffer limits). Both the auto-rewind
device number) are implemented.
By default the driver writes one filemark when the device is closed after
writing. Two filemarks can be optionally written. In both cases end
of data is signified by returning zero bytes for two consecutive reads.
writing and the last operation has been a write. Two filemarks can be
optionally written. In both cases end of data is signified by
returning zero bytes for two consecutive reads.
BUFFERING
......@@ -129,7 +130,8 @@ MTIOCGET Returns some status information.
mt_dsreg (shifts for the subfields are MT_ST_BLKSIZE_SHIFT and
MT_ST_DENSITY_SHIFT).
The GMT_xxx status bits reflect the drive status. GMT_DR_OPEN
is set if there is no tape in the drive.
is set if there is no tape in the drive. GMT_EOD means either
end of recorded data or end of tape. GMT_EOT means end of tape.
MISCELLANEOUS COMPILE OPTIONS
......
This diff is collapsed.
/*
* eata.h - used by low-level scsi driver for EISA EATA controllers.
* eata.h - used by the low-level driver for EATA/DMA SCSI host adapters.
*
*/
#ifndef _EISA_EATA_H
#define _EISA_EATA_H
#ifndef _EATA_H
#define _EATA_H
#define EATA_VERSION "1.09.01"
#include <linux/scsicam.h>
#define EATA_VERSION "1.11.00"
int eata_detect(Scsi_Host_Template *);
int eata_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int eata_abort(Scsi_Cmnd *);
int eata_reset(Scsi_Cmnd *);
int eata_bios_param(Disk *, int, int*);
#define EATA { NULL, /* Ptr for modules */ \
NULL, /* usage count for modules */ \
"EISA EATA 2.0A rev. " EATA_VERSION " by " \
"EATA/DMA 2.0A rev. " EATA_VERSION " by " \
"Dario_Ballabio@milano.europe.dg.com.", \
eata_detect, \
NULL, /* Release */ \
......@@ -25,13 +26,13 @@ int eata_bios_param(Disk *, int, int*);
eata_abort, \
eata_reset, \
NULL, \
eata_bios_param, \
scsicam_bios_param, \
0, /* can_queue, reset by detect */ \
7, /* this_id, reset by detect */ \
0, /* sg_tablesize, reset by detect */ \
0, /* cmd_per_lun, reset by detect */ \
0, /* number of boards present */ \
0, /* unchecked isa dma */ \
0, /* unchecked isa dma, reset by detect */ \
ENABLE_CLUSTERING \
}
#endif
......@@ -313,6 +313,30 @@ unsigned int scsi_init()
}
printk ("scsi : %d hosts.\n", count);
{
int block_count = 0, index;
struct Scsi_Host * sh[128], * shpnt;
for(shpnt=scsi_hostlist; shpnt; shpnt = shpnt->next)
if (shpnt->block) sh[block_count++] = shpnt;
if (block_count == 1) sh[0]->block = NULL;
else if (block_count > 1) {
for(index = 0; index < block_count - 1; index++) {
sh[index]->block = sh[index + 1];
printk("scsi%d : added to blocked host list.\n",
sh[index]->host_no);
}
sh[block_count - 1]->block = sh[0];
printk("scsi%d : added to blocked host list.\n",
sh[index]->host_no);
}
}
/* Now attach the high level drivers */
#ifdef CONFIG_BLK_DEV_SD
scsi_register_device(&sd_template);
......
......@@ -228,8 +228,6 @@ typedef struct SHT
be two Scsi_Host entries, but only 1 Scsi_Host_Template entries.
*/
#define SCSI_HOST_BLOCK 0x80
struct Scsi_Host
{
struct Scsi_Host * next;
......
This diff is collapsed.
......@@ -234,8 +234,10 @@ extern const unsigned char scsi_command_size[8];
#define TYPE_DISK 0x00
#define TYPE_TAPE 0x01
#define TYPE_PROCESSOR 0x03 /* HP scanners use this */
#define TYPE_WORM 0x04 /* Treated as ROM by our system */
#define TYPE_ROM 0x05
#define TYPE_SCANNER 0x06
#define TYPE_MOD 0x07 /* Magneto-optical disk - treated as TYPE_DISK */
#define TYPE_NO_LUN 0x7f
......
......@@ -13,7 +13,7 @@
#include "scsi_ioctl.h"
#define MAX_RETRIES 5
#define MAX_TIMEOUT 200
#define MAX_TIMEOUT 900
#define MAX_BUF 4096
#define max(a,b) (((a) > (b)) ? (a) : (b))
......
This diff is collapsed.
This diff is collapsed.
/*
* u14-34f.h - used by low-level scsi driver for UltraStor 14F/34F
* u14-34f.h - used by the low-level driver for UltraStor 14F/34F
*/
#ifndef _U14_34F_H
#define _U14_34F_H
......@@ -10,7 +10,7 @@ int u14_34f_abort(Scsi_Cmnd *);
int u14_34f_reset(Scsi_Cmnd *);
int u14_34f_biosparam(Disk *, int, int *);
#define U14_34F_VERSION "1.11.01"
#define U14_34F_VERSION "1.12.04"
#define ULTRASTOR_14_34F { \
NULL, \
......
......@@ -777,12 +777,7 @@ void brelse(struct buffer_head * buf)
{
if (!buf)
return;
/*
* Hmm.. Leaving this in for now, as I'm a bit nervous about it..
*/
#if 0
wait_on_buffer(buf);
#endif
/* If dirty, mark the time this buffer should be written back */
set_writetime(buf, 0);
......
......@@ -17,6 +17,11 @@
#include <linux/malloc.h>
#include <linux/errno.h>
#define MULTISESSION /* emoenke@gwdg.de */
#ifdef MULTISESSION
#include <linux/cdrom.h>
#endif MULTISESSION
#include <asm/system.h>
#include <asm/segment.h>
......@@ -145,6 +150,14 @@ struct super_block *isofs_read_super(struct super_block *s,void *data,
unsigned int blocksize_bits;
int high_sierra;
int dev=s->s_dev;
#ifdef MULTISESSION
int i;
unsigned int vol_desc_start;
unsigned int *p_vol_desc_start=&vol_desc_start;
struct inode inode_fake;
struct file file_fake;
extern struct file_operations * get_blkfops(unsigned int);
#endif MULTISESSION
struct iso_volume_descriptor *vdp;
struct hs_volume_descriptor *hdp;
......@@ -184,7 +197,27 @@ struct super_block *isofs_read_super(struct super_block *s,void *data,
s->u.isofs_sb.s_high_sierra = high_sierra = 0; /* default is iso9660 */
#ifdef MULTISESSION
/*
* look if the driver can tell the multi session redirection
* value; this allows to do the redirection if we are looking
* for the volume descriptor, and to avoid it during "raw" access.
*/
vol_desc_start=0;
inode_fake.i_rdev=dev;
i=get_blkfops(MAJOR(dev))->ioctl(&inode_fake,
&file_fake,
CDROMMULTISESSION_SYS,
(unsigned long) p_vol_desc_start);
if (i!=0) vol_desc_start=0;
#if 0
printk("isofs.inode: CDROMMULTISESSION_SYS rc=%d\n",i);
printk("isofs.inode: vol_desc_start = %d\n", vol_desc_start);
#endif
for (iso_blknum = vol_desc_start+16; iso_blknum < vol_desc_start+100; iso_blknum++) {
#else
for (iso_blknum = 16; iso_blknum < 100; iso_blknum++) {
#endif MULTISESSION
if (!(bh = bread(dev, iso_blknum << (ISOFS_BLOCK_BITS-blocksize_bits), opt.blocksize))) {
s->s_dev=0;
printk("isofs_read_super: bread failed, dev 0x%x iso_blknum %d\n",
......
......@@ -147,6 +147,11 @@ asmlinkage int sys_utime(char * filename, struct utimbuf * times)
}
/* Don't worry, the checks are done in inode_change_ok() */
if (times) {
error = verify_area(VERIFY_READ, times, sizeof(*times));
if (error) {
iput(inode);
return error;
}
actime = get_fs_long((unsigned long *) &times->actime);
modtime = get_fs_long((unsigned long *) &times->modtime);
newattrs.ia_ctime = CURRENT_TIME;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment