Commit 47c1864c authored by Linus Torvalds's avatar Linus Torvalds

Import 2.1.82

parent f0e2d949
......@@ -479,6 +479,17 @@ CONFIG_PARIDE_PF
MicroSolutions backpack PD/CD drive and the Imation Superdisk
LS-120 drive.
Parallel port ATAPI tapes
CONFIG_PARIDE_PT
This option enable the high-level driver for ATAPI tape devices
connected through a parallel port. If you chose to build PARIDE
support into your kernel, you may answer Y here to build in the
parallel port ATAPI disk driver, otherwise you should answer M
to build it as a loadable module. The module will be called pt.o.
You must also have at least one parallel port protocol driver in
your system. Among the devices supported by this driver is the
parallel port version of the HP 5GB drive.
ATEN EH-100 protocol
CONFIG_PARIDE_ATEN
This option enables support for the ATEN EH-100 parallel port IDE
......@@ -1182,6 +1193,12 @@ CONFIG_PARPORT_AX
Ultra/AX machines. This code is also available as a module (say M),
called parport_ax.o. If in doubt, saying N is the safe plan.
Foreign parallel hardware
CONFIG_PARPORT_OTHER
Say Y here if you want to be able to load driver modules to support
other types of parallel port. This causes a performance loss, so most
people say N.
Compile the kernel into the ELF object format
CONFIG_ELF_KERNEL
ELF (Executable and Linkable Format) is a format for libraries and
......
IDE-CD driver documentation
19 May 1996
scott snyder <snyder@fnald0.fnal.gov>
Originally by scott snyder <snyder@fnald0.fnal.gov> (19 May 1996)
Carrying on the torch is: Erik Andersen <andersee@debian.org>
1. Introduction
---------------
The ide-cd driver should work with all ATAPI 1.2 compliant cdrom
drives which attach to an IDE interface. Note that some cdrom vendors
The ide-cd driver should work with all ATAPI ver 1.2 to ATAPI 2.6 compliant
cdrom drives which attach to an IDE interface. Note that some cdrom vendors
(including Mitsumi, Sony, Creative, Aztech, and Goldstar) have made
both ATAPI-compliant drives and drives which use a proprietary
interface. If your drive uses one of those proprietary interfaces,
......@@ -28,9 +28,7 @@ This driver provides the following features:
- On drives which support it, reading digital audio data directly
from audio tracks. The program cdda2wav can be used for this.
Note, however, that only a few drives actually support this
function; the only ones which i've heard of successes with are Sony
and Toshiba drives.
Note, however, that only some drives actually support this.
- There is now support for cdrom changers which comply with the
ATAPI 2.6 draft standard (such as the NEC CDR-251). This additional
......@@ -50,10 +48,13 @@ This driver provides the following features:
driver.
1. Make sure that the ide and ide-cd drivers are compiled into the
kernel you're using. When configuring the kernel, say `yes' to the
options
kernel you're using. When configuring the kernel, in the section
entitled "Floppy, IDE, and other block devices", say either `Y'
(which will compile the support directly into the kernel) or `M'
(to compile support as a module which can be loaded and unloaded)
to the options:
Enhanced IDE/MFM/RLL disk/cdrom/tape support
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
Include IDE/ATAPI CDROM support
and `no' to
......@@ -74,8 +75,8 @@ This driver provides the following features:
address and an IRQ number, the standard assignments being
0x170 and 14 for the primary interface and 0x1f0 and 15 for the
secondary interface. Each interface can control up to two devices,
where each device can be either a hard drive, a cdrom drive, or a
tape drive. The two devices on an interface are called `master'
where each device can be a hard drive, a cdrom drive, a floppy drive,
or a tape drive. The two devices on an interface are called `master'
and `slave'; this is usually selectable via a jumper on the drive.
Linux names these devices as follows. The master and slave devices
......@@ -223,7 +224,9 @@ a. Drive is not detected during booting.
- If the autoprobing is not finding your drive, you can tell the
driver to assume that one exists by using a lilo option of the
form `hdX=cdrom', where X is the drive letter corresponding to
where your drive is installed (see section 2). Note that if you
where your drive is installed (see section 2). This is required
for CDROM drives such as the Pioneer DR-A24X, which do not properly
identify themselves as ATAPI CDROM drives. Note that if you
do this and you see a boot message like
hdX: ATAPI cdrom (?)
......
......@@ -55,7 +55,7 @@ high-level drivers for each of the different type of supported device:
pd IDE disk
pcd ATAPI CD-ROM
pf ATAPI disk
pt ATAPI tape (not yet available)
pt ATAPI tape
(Support for ATAPI CD-R and CD-RW drives is not yet in development,
but this may change.)
......
VERSION = 2
PATCHLEVEL = 1
SUBLEVEL = 81
SUBLEVEL = 82
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/)
......@@ -211,21 +211,29 @@ symlinks:
oldconfig: symlinks scripts/split-include
$(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.in
scripts/split-include include/linux/autoconf.h include/config
if [ -r include/linux/autoconf.h ]; then \
scripts/split-include include/linux/autoconf.h include/config; \
fi
xconfig: symlinks scripts/split-include
$(MAKE) -C scripts kconfig.tk
wish -f scripts/kconfig.tk
scripts/split-include include/linux/autoconf.h include/config
if [ -r include/linux/autoconf.h ]; then \
scripts/split-include include/linux/autoconf.h include/config; \
fi
menuconfig: include/linux/version.h symlinks scripts/split-include
$(MAKE) -C scripts/lxdialog all
$(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in
scripts/split-include include/linux/autoconf.h include/config
if [ -r include/linux/autoconf.h ]; then \
scripts/split-include include/linux/autoconf.h include/config; \
fi
config: symlinks scripts/split-include
$(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in
scripts/split-include include/linux/autoconf.h include/config
if [ -r include/linux/autoconf.h ]; then \
scripts/split-include include/linux/autoconf.h include/config; \
fi
linuxsubdirs: dummy
set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i; done
......
......@@ -141,6 +141,7 @@ if [ "$CONFIG_PCI" = "y" ]; then
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool 'PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
fi
bool 'Backward-compatible /proc/pci' CONFIG_PCI_OLD_PROC
fi
bool 'Networking support' CONFIG_NET
bool 'System V IPC' CONFIG_SYSVIPC
......@@ -155,6 +156,9 @@ tristate 'Kernel support for Linux/Intel ELF binaries' CONFIG_BINFMT_EM86
tristate 'Parallel port support' CONFIG_PARPORT
if [ "$CONFIG_PARPORT" != "n" ]; then
dep_tristate ' PC-style hardware' CONFIG_PARPORT_PC $CONFIG_PARPORT
if [ "$CONFIG_PARPORT_PC" != "n" ]; then
bool ' Support foreign hardware' CONFIG_PARPORT_OTHER
fi
fi
endmenu
......
......@@ -33,6 +33,7 @@ CONFIG_NATIVE=y
CONFIG_ALPHA_ALCOR=y
# CONFIG_ALPHA_P2K is not set
CONFIG_PCI=y
CONFIG_PCI_OLD_PROC=y
CONFIG_ALPHA_EV5=y
CONFIG_ALPHA_CIA=y
CONFIG_ALPHA_SRM=y
......
......@@ -18,6 +18,10 @@
#include <asm/hwrpb.h>
#include <asm/ptrace.h>
/* NOTE: Herein are back-to-back mb insns. They are magic.
A plausible explanation is that the i/o controler does not properly
handle the system transaction. Another involves timing. Ho hum. */
extern struct hwrpb_struct *hwrpb;
extern asmlinkage void wrmces(unsigned long mces);
extern int alpha_sys_type;
......@@ -162,6 +166,7 @@ static unsigned int conf_read(unsigned long addr, unsigned char type1)
/* access configuration space: */
value = *(vuip)addr;
mb();
mb(); /* magic */
if (apecs_mcheck_taken) {
apecs_mcheck_taken = 0;
value = 0xffffffffU;
......@@ -242,6 +247,7 @@ static void conf_write(unsigned long addr, unsigned int value, unsigned char typ
/* access configuration space: */
*(vuip)addr = value;
mb();
mb(); /* magic */
apecs_mcheck_expected = 0;
mb();
......@@ -539,7 +545,7 @@ void apecs_machine_check(unsigned long vector, unsigned long la_ptr,
apecs_mcheck_expected = 0;
apecs_mcheck_taken = 1;
mb();
mb();
mb(); /* magic */
apecs_pci_clr_err();
wrmces(0x7);
mb();
......
......@@ -17,6 +17,10 @@
#include <asm/ptrace.h>
#include <asm/mmu_context.h>
/* NOTE: Herein are back-to-back mb insns. They are magic.
A plausible explanation is that the i/o controler does not properly
handle the system transaction. Another involves timing. Ho hum. */
extern struct hwrpb_struct *hwrpb;
extern asmlinkage void wrmces(unsigned long mces);
extern int alpha_sys_type;
......@@ -170,6 +174,7 @@ static unsigned int conf_read(unsigned long addr, unsigned char type1)
/* access configuration space: */
value = *(vuip)addr;
mb();
mb(); /* magic */
if (CIA_mcheck_taken) {
CIA_mcheck_taken = 0;
value = 0xffffffffU;
......@@ -244,6 +249,7 @@ static void conf_write(unsigned long addr, unsigned int value,
/* access configuration space: */
*(vuip)addr = value;
mb();
mb(); /* magic */
CIA_mcheck_expected = 0;
mb();
......@@ -555,12 +561,13 @@ void cia_machine_check(unsigned long vector, unsigned long la_ptr,
* ignore the machine check.
*/
mb();
mb(); /* magic */
if (CIA_mcheck_expected) {
DBGM(("CIA machine check expected\n"));
CIA_mcheck_expected = 0;
CIA_mcheck_taken = 1;
mb();
mb();
mb(); /* magic */
draina();
cia_pci_clr_err();
wrmces(0x7);
......
......@@ -950,7 +950,7 @@ sys_call_table:
.quad sys_semget /* 205 */
.quad sys_semop
.quad osf_utsname
.quad alpha_ni_syscall
.quad sys_lchown
.quad osf_shmat
.quad sys_shmctl /* 210 */
.quad sys_shmdt
......
......@@ -373,7 +373,7 @@ int get_irq_list(char *buf)
if (!action)
continue;
len += sprintf(buf+len, "%2d: %10u %c %s",
i, kstat.interrupts[0][i],
i, kstat.irqs[0][i],
(action->flags & SA_INTERRUPT) ? '+' : ' ',
action->name);
for (action=action->next; action; action = action->next) {
......@@ -567,7 +567,7 @@ static inline void handle_irq(int irq, struct pt_regs * regs)
int cpu = smp_processor_id();
irq_enter(cpu, irq);
kstat.interrupts[0][irq] += 1;
kstat.irqs[0][irq] += 1;
if (!action) {
unexpected_irq(irq, regs);
} else {
......@@ -590,7 +590,7 @@ static inline void device_interrupt(int irq, int ack, struct pt_regs * regs)
}
irq_enter(cpu, irq);
kstat.interrupts[0][irq] += 1;
kstat.irqs[0][irq] += 1;
action = irq_action[irq];
/*
* For normal interrupts, we mask it out, and then ACK it.
......
......@@ -246,7 +246,7 @@ asmlinkage unsigned long osf_mmap(unsigned long addr, unsigned long len,
unsigned long ret = -EBADF;
lock_kernel();
if (flags & (MAP_HASSEMAPHORE | MAP_INHERIT | MAP_UNALIGNED))
if (flags & (_MAP_HASSEMAPHORE | _MAP_INHERIT | _MAP_UNALIGNED))
printk("%s: unimplemented OSF mmap flags %04lx\n", current->comm, flags);
if (!(flags & MAP_ANONYMOUS)) {
if (fd >= NR_OPEN || !(file = current->files->fd[fd]))
......
......@@ -16,6 +16,10 @@
#include <asm/ptrace.h>
#include <asm/mmu_context.h>
/* NOTE: Herein are back-to-back mb insns. They are magic.
A plausible explanation is that the i/o controler does not properly
handle the system transaction. Another involves timing. Ho hum. */
extern struct hwrpb_struct *hwrpb;
extern asmlinkage void wrmces(unsigned long mces);
extern int alpha_sys_type;
......@@ -153,6 +157,7 @@ static unsigned int conf_read(unsigned long addr, unsigned char type1)
/* access configuration space: */
value = *(vuip)addr;
mb();
mb(); /* magic */
if (PYXIS_mcheck_taken) {
PYXIS_mcheck_taken = 0;
value = 0xffffffffU;
......@@ -228,6 +233,7 @@ static void conf_write(unsigned long addr, unsigned int value,
/* access configuration space: */
*(vuip)addr = value;
mb();
mb(); /* magic */
PYXIS_mcheck_expected = 0;
mb();
......@@ -473,11 +479,13 @@ void pyxis_machine_check(unsigned long vector, unsigned long la_ptr,
* ignore the machine check.
*/
mb();
mb(); /* magic */
if (PYXIS_mcheck_expected/* && (mchk_sysdata->epic_dcsr && 0x0c00UL)*/) {
DBG(("PYXIS machine check expected\n"));
PYXIS_mcheck_expected = 0;
PYXIS_mcheck_taken = 1;
mb();
mb(); /* magic */
draina();
pyxis_pci_clr_err();
wrmces(0x7);
......@@ -494,6 +502,7 @@ void pyxis_machine_check(unsigned long vector, unsigned long la_ptr,
PYXIS_mcheck_expected = 0;
PYXIS_mcheck_taken = 1;
mb();
mb(); /* magic */
draina();
pyxis_pci_clr_err();
wrmces(0x7);
......
......@@ -116,7 +116,7 @@ osf_sigaction(int sig, const struct osf_sigaction *act,
asmlinkage int
sys_rt_sigaction(int sig, const struct sigaction *act, struct sigaction *oact,
void *restorer, size_t sigsetsize)
size_t sigsetsize, void *restorer)
{
struct k_sigaction new_ka, old_ka;
int ret;
......
......@@ -20,6 +20,10 @@
#include <asm/ptrace.h>
#include <asm/mmu_context.h>
/* NOTE: Herein are back-to-back mb insns. They are magic.
A plausable explanation is that the i/o controler does not properly
handle the system transaction. Another involves timing. Ho hum. */
extern struct hwrpb_struct *hwrpb;
extern asmlinkage void wrmces(unsigned long mces);
extern asmlinkage unsigned long whami(void);
......@@ -173,6 +177,7 @@ static unsigned int conf_read(unsigned long addr, unsigned char type1)
/* access configuration space: */
value = *(vuip)addr;
mb();
mb(); /* magic */
if (T2_mcheck_taken) {
T2_mcheck_taken = 0;
value = 0xffffffffU;
......@@ -226,6 +231,7 @@ static void conf_write(unsigned long addr, unsigned int value,
/* access configuration space: */
*(vuip)addr = value;
mb();
mb(); /* magic */
T2_mcheck_expected = 0;
mb();
......@@ -480,6 +486,7 @@ int t2_clear_errors(void)
*(vulp)T2_PERR1 |= *(vulp)T2_PERR1;
mb();
mb(); /* magic */
return 0;
}
......@@ -530,12 +537,14 @@ void t2_machine_check(unsigned long vector, unsigned long la_ptr,
* ignore the machine check.
*/
mb();
mb(); /* magic */
if (T2_mcheck_expected/* && (mchk_sysdata->epic_dcsr && 0x0c00UL)*/) {
DBGMC(("T2 machine check expected\n"));
T2_mcheck_taken = 1;
t2_clear_errors();
T2_mcheck_expected = 0;
mb();
mb(); /* magic */
wrmces(rdmces()|1);/* ??? */
draina();
return;
......
......@@ -39,6 +39,7 @@ if [ "$CONFIG_PCI" = "y" ]; then
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool ' PCI bridge optimization (experimental)' CONFIG_PCI_OPTIMIZE
fi
bool ' Backward-compatible /proc/pci' CONFIG_PCI_OLD_PROC
fi
bool 'MCA support' CONFIG_MCA
bool 'System V IPC' CONFIG_SYSVIPC
......@@ -56,6 +57,9 @@ bool 'Video mode selection support' CONFIG_VIDEO_SELECT
tristate 'Parallel port support' CONFIG_PARPORT
if [ "$CONFIG_PARPORT" != "n" ]; then
dep_tristate ' PC-style hardware' CONFIG_PARPORT_PC $CONFIG_PARPORT
if [ "$CONFIG_PARPORT_PC" != "n" ]; then
bool ' Support foreign hardware' CONFIG_PARPORT_OTHER
fi
fi
endmenu
......
......@@ -30,6 +30,8 @@ CONFIG_NET=y
CONFIG_PCI=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
# CONFIG_PCI_OPTIMIZE is not set
CONFIG_PCI_OLD_PROC=y
# CONFIG_MCA is not set
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
......
......@@ -35,11 +35,11 @@ EXPORT_SYMBOL(dump_thread);
EXPORT_SYMBOL(dump_fpu);
EXPORT_SYMBOL(__ioremap);
EXPORT_SYMBOL(iounmap);
EXPORT_SYMBOL(local_bh_count);
EXPORT_SYMBOL(local_irq_count);
EXPORT_SYMBOL_NOVERS(__down_failed);
EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
EXPORT_SYMBOL_NOVERS(__up_wakeup);
EXPORT_SYMBOL(global_bh_lock);
/* Networking helper routines. */
EXPORT_SYMBOL(csum_partial_copy);
/* Delay loops */
......@@ -73,6 +73,8 @@ EXPORT_SYMBOL(lk_lockmsg);
/* Global SMP irq stuff */
EXPORT_SYMBOL(synchronize_irq);
EXPORT_SYMBOL(synchronize_bh);
EXPORT_SYMBOL(global_bh_lock);
EXPORT_SYMBOL(global_irq_holder);
EXPORT_SYMBOL(__global_cli);
EXPORT_SYMBOL(__global_sti);
......
......@@ -639,6 +639,7 @@ static void do_8259A_IRQ(int irq, int cpu, struct pt_regs * regs)
irq_exit(cpu, irq);
}
#ifdef __SMP__
/*
* FIXME! This is completely broken.
*/
......@@ -679,6 +680,7 @@ static void do_ioapic_IRQ(int irq, int cpu, struct pt_regs * regs)
enable_IO_APIC_irq(irq);
}
#endif
/*
* do_IRQ handles all normal device IRQ's (the special
......@@ -714,8 +716,10 @@ asmlinkage void do_IRQ(struct pt_regs regs)
kstat.irqs[cpu][irq]++;
do_lowlevel_IRQ = do_8259A_IRQ;
#ifdef __SMP__
if (IO_APIC_IRQ(irq))
do_lowlevel_IRQ = do_ioapic_IRQ;
#endif
do_lowlevel_IRQ(irq, cpu, &regs);
......
......@@ -65,7 +65,7 @@ static struct MCA_info* mca_info = 0;
static long mca_do_proc_init( long memory_start, long memory_end );
static int mca_default_procfn( char* buf, int slot );
static long proc_mca_read( struct inode*, struct file*, char* buf, unsigned long count );
static ssize_t proc_mca_read( struct file*, char*, size_t, loff_t *);
static struct file_operations proc_mca_operations = {
NULL, proc_mca_read,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
......@@ -527,7 +527,7 @@ static int mca_not_implemented( char* buf )
*/
static int mca_fill( char* page, int pid, int type, char** start,
off_t offset, int length)
loff_t *offset, int length)
{
int len = 0;
int slot = 0;
......@@ -571,8 +571,8 @@ static int mca_fill( char* page, int pid, int type, char** start,
#define PROC_BLOCK_SIZE (3*1024)
long proc_mca_read( struct inode* inode, struct file* file,
char* buf, unsigned long count)
static ssize_t proc_mca_read( struct file* file,
char* buf, size_t count, loff_t *ppos)
{
unsigned long page;
char *start;
......@@ -580,6 +580,7 @@ long proc_mca_read( struct inode* inode, struct file* file,
int end;
unsigned int type, pid;
struct proc_dir_entry *dp;
struct inode *inode = file->f_dentry->d_inode;
if (count < 0)
return -EINVAL;
......@@ -593,7 +594,7 @@ long proc_mca_read( struct inode* inode, struct file* file,
start = 0;
dp = (struct proc_dir_entry *) inode->u.generic_ip;
length = mca_fill((char *) page, pid, type,
&start, file->f_pos, count);
&start, ppos, count);
if (length < 0) {
free_page(page);
return length;
......@@ -601,19 +602,19 @@ long proc_mca_read( struct inode* inode, struct file* file,
if (start != 0) {
/* We have had block-adjusting processing! */
copy_to_user(buf, start, length);
file->f_pos += length;
*ppos += length;
count = length;
} else {
/* Static 4kB (or whatever) block capacity */
if (file->f_pos >= length) {
if (*ppos >= length) {
free_page(page);
return 0;
}
if (count + file->f_pos > length)
count = length - file->f_pos;
end = count + file->f_pos;
copy_to_user(buf, (char *) page + file->f_pos, count);
file->f_pos = end;
if (count + *ppos > length)
count = length - *ppos;
end = count + *ppos;
copy_to_user(buf, (char *) page + *ppos, count);
*ppos = end;
}
free_page(page);
return count;
......
......@@ -248,6 +248,7 @@ static unsigned long do_slow_gettimeoffset(void)
return count;
}
#ifndef CONFIG_APM
/*
* this is only used if we have fast gettimeoffset:
*/
......@@ -255,6 +256,7 @@ static void do_x86_get_fast_time(struct timeval * tv)
{
do_gettimeofday(tv);
}
#endif
static unsigned long (*do_gettimeoffset)(void) = do_slow_gettimeoffset;
......
......@@ -728,11 +728,11 @@ struct _fpstate * save_i387_soft(void *s387, struct _fpstate * buf)
FPU_verify_area(VERIFY_WRITE, d, 7*4 + 8*10);
#ifdef PECULIAR_486
S387->cwd &= ~0xe080;
/* An 80486 sets all the reserved bits to 1. */
S387->cwd |= 0xffff0000;
/* An 80486 sets nearly all of the reserved bits to 1. */
S387->cwd |= 0xffff0040;
S387->swd = sstatus_word() | 0xffff0000;
S387->twd |= 0xffff0000;
S387->fcs |= 0xf8000000;
S387->fcs &= ~0xf8000000;
S387->fos |= 0xffff0000;
#endif PECULIAR_486
__copy_to_user(d, &S387->cwd, 7*4);
......
......@@ -134,8 +134,8 @@ static int sib(int mod, unsigned long *fpu_eip)
static unsigned long vm86_segment(u_char segment,
unsigned short *selector)
{
struct address *addr)
{
segment--;
#ifdef PARANOID
if ( segment > PREFIX_SS_ )
......@@ -144,14 +144,14 @@ static unsigned long vm86_segment(u_char segment,
math_abort(FPU_info,SIGSEGV);
}
#endif PARANOID
*selector = VM86_REG_(segment);
addr->selector = VM86_REG_(segment);
return (unsigned long)VM86_REG_(segment) << 4;
}
/* This should work for 16 and 32 bit protected mode. */
static long pm_address(u_char FPU_modrm, u_char segment,
unsigned short *selector, long offset)
struct address *addr, long offset)
{
struct desc_struct descriptor;
unsigned long base_address, limit, address, seg_top;
......@@ -172,13 +172,17 @@ static long pm_address(u_char FPU_modrm, u_char segment,
/* fs and gs aren't used by the kernel, so they still have their
user-space values. */
case PREFIX_FS_-1:
__asm__("mov %%fs,%0":"=r" (*selector));
/* The cast is needed here to get gcc 2.8.0 to use a 16 bit register
in the assembler statement. */
__asm__("mov %%fs,%0":"=r" ((unsigned short)addr->selector));
break;
case PREFIX_GS_-1:
__asm__("mov %%gs,%0":"=r" (*selector));
/* The cast is needed here to get gcc 2.8.0 to use a 16 bit register
in the assembler statement. */
__asm__("mov %%gs,%0":"=r" ((unsigned short)addr->selector));
break;
default:
*selector = PM_REG_(segment);
addr->selector = PM_REG_(segment);
}
descriptor = LDT_DESCRIPTOR(PM_REG_(segment));
......@@ -312,13 +316,12 @@ void *FPU_get_address(u_char FPU_modrm, unsigned long *fpu_eip,
case 0:
break;
case VM86:
address += vm86_segment(addr_modes.override.segment,
(unsigned short *)&(addr->selector));
address += vm86_segment(addr_modes.override.segment, addr);
break;
case PM16:
case SEG32:
address = pm_address(FPU_modrm, addr_modes.override.segment,
(unsigned short *)&(addr->selector), address);
addr, address);
break;
default:
EXCEPTION(EX_INTERNAL|0x133);
......@@ -427,13 +430,12 @@ void *FPU_get_address_16(u_char FPU_modrm, unsigned long *fpu_eip,
case 0:
break;
case VM86:
address += vm86_segment(addr_modes.override.segment,
(unsigned short *)&(addr->selector));
address += vm86_segment(addr_modes.override.segment, addr);
break;
case PM16:
case SEG32:
address = pm_address(FPU_modrm, addr_modes.override.segment,
(unsigned short *)&(addr->selector), address);
addr, address);
break;
default:
EXCEPTION(EX_INTERNAL|0x131);
......
......@@ -1329,11 +1329,11 @@ u_char *fstenv(fpu_addr_modes addr_modes, u_char *d)
FPU_verify_area(VERIFY_WRITE, d, 7*4);
#ifdef PECULIAR_486
control_word &= ~0xe080;
/* An 80486 sets all the reserved bits to 1. */
control_word |= 0xffff0000;
/* An 80486 sets nearly all of the reserved bits to 1. */
control_word |= 0xffff0040;
partial_status = status_word() | 0xffff0000;
fpu_tag_word |= 0xffff0000;
I387.soft.fcs |= 0xf8000000;
I387.soft.fcs &= ~0xf8000000;
I387.soft.fos |= 0xffff0000;
#endif PECULIAR_486
__copy_to_user(d, &control_word, 7*4);
......
......@@ -71,13 +71,17 @@ if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
fi
tristate 'XT harddisk support' CONFIG_BLK_DEV_XD
# PARIDE doesn't need PARPORT, but if PARPORT is configured as a module,
# PARIDE must also be a module. The bogus CONFIG_PARIDE_PARPORT option
# controls the choices given to the user ...
if [ "$CONFIG_PARPORT" = "y" -o "$CONFIG_PARPORT" = "n" ] ; then
define_bool CONFIG_PARIDE_PARPORT y
else
define_bool CONFIG_PARIDE_PARPORT m
fi
dep_tristate 'Parallel port IDE device support' CONFIG_PARIDE $CONFIG_PARIDE_PARPORT
if [ "$CONFIG_PARIDE" != "n" ]; then
if [ "$CONFIG_PARIDE" = "y" -o "$CONFIG_PARIDE" = "m" ]; then
source drivers/block/paride/Config.in
fi
......
......@@ -3,13 +3,14 @@
* linux/drivers/block/ide-cd.c
* Copyright (C) 1994, 1995, 1996 scott snyder <snyder@fnald0.fnal.gov>
* Copyright (C) 1996-1998 Erik Andersen <andersee@debian.org>
*
* May be copied or modified under the terms of the GNU General Public
* License. See linux/COPYING for more information.
*
* ATAPI CD-ROM driver. To be used with ide.c.
* See Documentation/cdrom/ide-cd for usage information.
*
* Suggestions are welcome. Patches that work are more welcome though.
* Suggestions are welcome. Patches that work are more welcome though. ;-)
* For those wishing to work on this driver, please be sure you download
* and comply with the latest ATAPI standard. This document can be
* obtained by anonymous ftp from fission.dt.wdc.com in directory:
......@@ -182,10 +183,16 @@
* -- fix speed display for ACER 24X, 18X
* 4.09 Jan 04, 1998 -- fix handling of the last block so we return
* an end of file instead of an I/O error (Gadi)
* 4.10 Jan 24, 1998 -- fixed a bug so now changers can change to a new
* slot when there is no disc in the current slot.
* -- Fixed a memory leak where info->changer_info was
* malloc'ed but never free'd when closing the device.
* -- Cleaned up the global namespace a bit by making more
* functions static that should already have been.
*
*************************************************************************/
#define IDECD_VERSION "4.09"
#define IDECD_VERSION "4.10"
#include <linux/config.h>
#include <linux/module.h>
......@@ -1309,7 +1316,7 @@ int cdrom_queue_packet_command (ide_drive_t *drive, struct packet_command *pc)
/****************************************************************************
* cdrom driver request routine.
*/
static
void ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block)
{
if (rq -> cmd == PACKET_COMMAND || rq -> cmd == REQUEST_SENSE_COMMAND)
......@@ -2467,10 +2474,6 @@ int ide_cdrom_select_disc (struct cdrom_device_info *cdi, int slot)
if (drive->usage > 1)
return -EBUSY;
stat = cdrom_check_status (drive, &my_reqbuf);
if (stat && my_reqbuf.sense_key == NOT_READY)
return -ENOENT;
if (slot == CDSL_NONE) {
(void) cdrom_load_unload (drive, -1, NULL);
cdrom_saw_media_change (drive);
......@@ -2765,8 +2768,7 @@ int ide_cdrom_probe_capabilities (ide_drive_t *drive)
printk (" changer w/%d slots", nslots);
else
printk (" drive");
printk (" %s/%dkB Cache\n",
(CDROM_CONFIG_FLAGS (drive)->is_changer)? "&" : "w",
printk (", %dkB Cache\n",
ntohs(buf.cap.buffer_size) );
return nslots;
......@@ -2900,7 +2902,7 @@ int ide_cdrom_setup (ide_drive_t *drive)
}
/* Forwarding functions to generic routines. */
static
int ide_cdrom_ioctl (ide_drive_t *drive,
struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
......@@ -2908,6 +2910,7 @@ int ide_cdrom_ioctl (ide_drive_t *drive,
return cdrom_fops.ioctl (inode, file, cmd, arg);
}
static
int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive)
{
int rc;
......@@ -2921,6 +2924,7 @@ int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive)
return rc;
}
static
void ide_cdrom_release (struct inode *inode, struct file *file,
ide_drive_t *drive)
{
......@@ -2928,6 +2932,7 @@ void ide_cdrom_release (struct inode *inode, struct file *file,
MOD_DEC_USE_COUNT;
}
static
int ide_cdrom_check_media_change (ide_drive_t *drive)
{
return cdrom_fops.check_media_change
......@@ -2936,6 +2941,7 @@ int ide_cdrom_check_media_change (ide_drive_t *drive)
}
static
int ide_cdrom_cleanup(ide_drive_t *drive)
{
struct cdrom_info *info = drive->driver_data;
......@@ -2947,6 +2953,8 @@ int ide_cdrom_cleanup(ide_drive_t *drive)
kfree (info->sector_buffer);
if (info->toc != NULL)
kfree (info->toc);
if (info->changer_info != NULL)
kfree (info->changer_info);
if (devinfo->handle == drive && unregister_cdrom (devinfo))
printk ("%s: ide_cdrom_cleanup failed to unregister device from the cdrom driver.\n", drive->name);
kfree (info);
......
......@@ -274,11 +274,8 @@ static int proc_ide_read_imodel
{
ide_hwif_t *hwif = (ide_hwif_t *) data;
int len;
const char *vids, *dids;
vids = pci_strvendor(hwif->pci_devid.vid);
dids = pci_strdev(hwif->pci_devid.vid, hwif->pci_devid.did);
len = sprintf(page,"%s: %s\n", vids ? vids : "(none)", dids ? dids : "(none)");
len = sprintf(page,"%04x: %04x\n", hwif->pci_devid.vid, hwif->pci_devid.did);
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
#endif /* CONFIG_PCI */
......
......@@ -5,6 +5,7 @@ comment 'Parallel IDE high-level drivers'
dep_tristate ' Parallel port IDE disks' CONFIG_PARIDE_PD $CONFIG_PARIDE
dep_tristate ' Parallel port ATAPI CD-ROMs' CONFIG_PARIDE_PCD $CONFIG_PARIDE
dep_tristate ' Parallel port ATAPI disks' CONFIG_PARIDE_PF $CONFIG_PARIDE
dep_tristate ' Parallel port ATAPI tapes' CONFIG_PARIDE_PT $CONFIG_PARIDE
comment 'Parallel IDE protocol modules'
dep_tristate ' ATEN EH-100 protocol' CONFIG_PARIDE_ATEN $CONFIG_PARIDE
dep_tristate ' MicroSolutions backpack protocol' CONFIG_PARIDE_BPCK $CONFIG_PARIDE
......
......@@ -50,6 +50,14 @@ else
endif
endif
ifeq ($(CONFIG_PARIDE_PT),y)
LX_OBJS += pt.o
else
ifeq ($(CONFIG_PARIDE_PT),m)
MX_OBJS += pt.o
endif
endif
ifeq ($(CONFIG_PARIDE_ATEN),y)
LX_OBJS += aten.o
else
......
......@@ -473,6 +473,11 @@ void paride_init( void )
pf_init();
};
#endif
#ifdef CONFIG_PARIDE_PT
{ extern int pt_init(void);
pt_init();
};
#endif
}
#endif
......
......@@ -83,7 +83,13 @@
*/
#define PCD_VERSION "1.0"
/* Changes:
1.01 GRG 1997.01.24 Added test unit ready support
*/
#define PCD_VERSION "1.01"
#define PCD_MAJOR 46
#define PCD_NAME "pcd"
#define PCD_UNITS 4
......@@ -173,6 +179,7 @@ MODULE_PARM(drive3,"1-6i");
#define PCD_RETRIES 5
#define PCD_TMO 800 /* timeout in jiffies */
#define PCD_DELAY 50 /* spin delay in uS */
#define PCD_READY_TMO 20
#define PCD_SPIN (10000/PCD_DELAY)*PCD_TMO
......@@ -207,6 +214,7 @@ struct pcd_unit {
struct pi_adapter pia; /* interface to paride layer */
struct pi_adapter *pi;
int drive; /* master/slave */
int last_sense; /* result of last request sense */
int access; /* count of active opens */
int present; /* does this unit exist ? */
char name[PCD_NAMELEN]; /* pcd0, pcd1, etc */
......@@ -264,6 +272,7 @@ static void pcd_init_units( void )
PCD.pi = & PCD.pia;
PCD.access = 0;
PCD.present = 0;
PCD.last_sense = 0;
j = 0;
while ((j < PCD_NAMELEN-2) && (PCD.name[j]=name[j])) j++;
PCD.name[j++] = '0' + unit;
......@@ -509,9 +518,13 @@ static void pcd_req_sense( int unit, int quiet )
udelay(1000);
if (!r) pcd_completion(unit,buf,"Request sense");
if ((!r)&&(!quiet))
printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
PCD.name,buf[2]&0xf,buf[12],buf[13]);
PCD.last_sense = -1;
if (!r) {
if (!quiet) printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",
PCD.name,buf[2]&0xf,buf[12],buf[13]);
PCD.last_sense = (buf[2]&0xf) | ((buf[12]&0xff)<<8)
| ((buf[13]&0xff)<<16) ;
}
}
static int pcd_atapi( int unit, char * cmd, int dlen, char * buf, char * fun )
......@@ -607,13 +620,30 @@ static int pcd_reset( int unit )
return flg-1;
}
static int pcd_ready_wait( int unit, int tmo )
{ char tr_cmd[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
int k, p;
k = 0;
while (k < tmo) {
PCD.last_sense = 0;
pcd_atapi(unit,tr_cmd,0,NULL,DBMSG("test unit ready"));
p = PCD.last_sense;
if (!p) return 0;
if (!((p == 0x010402)||((p & 0xff) == 6))) return p;
k++;
pcd_sleep(100);
}
return 0x000020; /* timeout */
}
static int pcd_check_media( int unit )
{ char rc_cmd[12] = { 0x25,0,0,0,0,0,0,0,0,0,0,0};
pcd_atapi(unit,rc_cmd,8,pcd_scratch,DBMSG("cm1"));
pcd_atapi(unit,rc_cmd,8,pcd_scratch,DBMSG("cm2"));
return (pcd_atapi(unit,rc_cmd,8,pcd_scratch,DBMSG("cm3")));
pcd_ready_wait(unit,PCD_READY_TMO);
return (pcd_atapi(unit,rc_cmd,8,pcd_scratch,DBMSG("check media")));
}
static int pcd_identify( int unit, char * id )
......
......@@ -96,7 +96,14 @@
*/
#define PD_VERSION "1.0"
/* Changes:
1.01 GRG 1997.01.24 Restored pd_reset()
Added eject ioctl
*/
#define PD_VERSION "1.01"
#define PD_MAJOR 45
#define PD_NAME "pd"
#define PD_UNITS 4
......@@ -141,6 +148,7 @@ static int pd_drive_count;
#include <linux/delay.h>
#include <linux/genhd.h>
#include <linux/hdreg.h>
#include <linux/cdrom.h> /* for the eject ioctl */
#include <asm/uaccess.h>
......@@ -234,6 +242,7 @@ MODULE_PARM(drive3,"1-7i");
#define IDE_DOORLOCK 0xde
#define IDE_DOORUNLOCK 0xdf
#define IDE_IDENTIFY 0xec
#define IDE_EJECT 0xed
int pd_init(void);
void pd_setup(char * str, int * ints);
......@@ -257,6 +266,7 @@ static int pd_identify (int unit);
static void pd_media_check(int unit);
static void pd_doorlock(int unit, int func);
static int pd_check_media(kdev_t dev);
static void pd_eject( int unit);
static struct hd_struct pd_hd[PD_DEVS];
static int pd_sizes[PD_DEVS];
......@@ -435,6 +445,9 @@ static int pd_ioctl(struct inode *inode,struct file *file,
if (!PD.present) return -ENODEV;
switch (cmd) {
case CDROMEJECT:
if (PD.access == 1) pd_eject(unit);
return 0;
case HDIO_GETGEO:
if (!geo) return -EINVAL;
err = verify_area(VERIFY_WRITE,geo,sizeof(*geo));
......@@ -642,7 +655,6 @@ static void pd_print_error( int unit, char * msg, int status )
printk("\n");
}
/*
static void pd_reset( int unit )
{ pi_connect(PI);
......@@ -650,8 +662,8 @@ static void pd_reset( int unit )
udelay(50);
WR(1,6,0);
pi_disconnect(PI);
udelay(250);
}
*/
#define DBMSG(msg) NULL
......@@ -730,6 +742,18 @@ static void pd_doorlock( int unit, int func )
pi_disconnect(PI);
}
static void pd_eject( int unit )
{ pi_connect(PI);
pd_wait_for(unit,0,DBMSG("before unlock on eject"));
pd_send_command(unit,1,0,0,0,0,IDE_DOORUNLOCK);
pd_wait_for(unit,0,DBMSG("after unlock on eject"));
pd_wait_for(unit,0,DBMSG("before eject"));
pd_send_command(unit,0,0,0,0,0,IDE_EJECT);
pd_wait_for(unit,0,DBMSG("after eject"));
pi_disconnect(PI);
}
static void pd_media_check( int unit )
{ int r;
......@@ -767,6 +791,8 @@ static int pd_identify( int unit )
{ int j;
char id[PD_ID_LEN+1];
pd_reset(unit);
pi_connect(PI);
WR(0,6,0xa0);
pd_wait_for(unit,0,DBMSG("before IDENT"));
......
This diff is collapsed.
/* linux/drivers/cdrom/cdrom.c.
Copyright (c) 1996, 1997 David A. van Leeuwen.
Copyright (c) 1997, 1998 Erik Andersen (andersee@debian.org)
Copyright (c) 1997, 1998 Erik Andersen <andersee@debian.org>
May be copied or modified under the terms of the GNU General Public
License. See linux/COPYING for more information.
......@@ -10,46 +10,71 @@
The routines in the file provide a uniform interface between the
software that uses CD-ROMs and the various low-level drivers that
actually talk to actual hardware devices. Suggestions are welcome.
actually talk to the hardware. Suggestions are welcome.
Patches that work are more welcome though. ;-)
To Do List:
----------------------------------
Recent Changes:
----------------------------------
-- Modify sysctl/proc interface. I plan on having one directory per
drive, with entries for outputing general drive information, and sysctl
based tunable parameters such as whether the tray should auto-close for
that drive. Suggestions (or patches) for this welcome!
New maintainer! As David A. van Leeuwen has been too busy to activly
-- Change the CDROMREADMODE1, CDROMREADMODE2, CDROMREADAUDIO, and
CDROMREADRAW ioctls so they go through the Uniform CD-ROM driver.
Revision History
----------------------------------
1.00 Date Unknown -- David van Leeuwen <david@tm.tno.nl>
-- Initial version by David A. van Leeuwen. I don't have a detailed
changelog for the 1.x series, David?
2.00 Dec 2, 1997 -- Erik Andersen <andersee@debian.org>
-- New maintainer! As David A. van Leeuwen has been too busy to activly
maintain and improve this driver, I am now carrying on the torch. If
you have a problem with this driver, please feel free to contact me.
Added (rudimentary) sysctl interface. I realize this is really weak
right now, and is _very_ badly implemented. It will be improved... I
plan on having one directory per drive, with entries for outputing
general drive information, and sysctl based tunable parameters such
as whether the tray should auto-close for that drive. Suggestions (or
patches) for improvements are very welcome.
-- Added (rudimentary) sysctl interface. I realize this is really weak
right now, and is _very_ badly implemented. It will be improved...
Modified CDROM_DISC_STATUS so that it is now incorporated into
-- Modified CDROM_DISC_STATUS so that it is now incorporated into
the Uniform CD-ROM driver via the cdrom_count_tracks function.
The cdrom_count_tracks function helps resolve some of the false
assumptions of the CDROM_DISC_STATUS ioctl, and is also used to check
for the correct media type when mounting or playing audio from a CD.
Remove the calls to verify_area and only use the copy_from_user and
-- Remove the calls to verify_area and only use the copy_from_user and
copy_to_user stuff, since these calls now provide their own memory
checking with the 2.1.x kernels.
Major update to return codes so that errors from low-level drivers
-- Major update to return codes so that errors from low-level drivers
are passed on through (thanks to Gerd Knorr for pointing out this
problem).
Made it so if a function isn't implemented in a low-level driver,
-- Made it so if a function isn't implemented in a low-level driver,
ENOSYS is now returned instead of EINVAL.
Simplified some complex logic so that the source code is easier to read.
-- Simplified some complex logic so that the source code is easier to read.
Other stuff I probably forgot to mention (lots of changes).
-- Other stuff I probably forgot to mention (lots of changes).
*/
2.01 to 2.11 Dec 1997-Jan 1998
-- TO-DO! Write changelogs for 2.01 to 2.12.
2.12 Jan 24, 1998 -- Erik Andersen <andersee@debian.org>
-- Fixed a bug in the IOCTL_IN and IOCTL_OUT macros. It turns out that
copy_*_user does not return EFAULT on error, but instead return the number
of bytes not copied. I was returning whatever non-zero stuff came back from
the copy_*_user functions directly, which would result in strange errors.
-------------------------------------------------------------------------*/
#define REVISION "Revision: 2.12"
#define VERSION "Id: cdrom.c 2.12 1998/01/24 22:15:45 erik Exp"
#include <linux/config.h>
......@@ -68,10 +93,6 @@
#include <asm/uaccess.h>
#define VERSION "$Id: cdrom.c,v 2.11 1998/01/04 01:11:18 erik Exp $"
#define REVISION "Revision: 2.11"
#define FM_WRITE 0x2 /* file mode write bit */
/* I use an error-log mask to give fine grain control over the type of
error messages dumped to the system logs. The available masks include: */
#define CD_WARNING 0x1
......@@ -96,15 +117,17 @@
#define cdinfo(type, fmt, args...)
#endif
/* These are used to simplify getting data in from and back to user land */
#define IOCTL_IN(arg, type, in) { \
int ret=copy_from_user(&in, (type *) arg, sizeof in); \
if (ret) return ret; }
if ( copy_from_user(&in, (type *) arg, sizeof in) ) \
return -EFAULT; }
#define IOCTL_OUT(arg, type, out) { \
int ret=copy_to_user((type *) arg, &out, sizeof out); \
if (ret) return ret; }
if ( copy_to_user((type *) arg, &out, sizeof out) ) \
return -EFAULT; }
#define FM_WRITE 0x2 /* file mode write bit */
/* Not-exported routines. */
static int cdrom_open(struct inode *ip, struct file *fp);
......
......@@ -186,6 +186,10 @@
* Heiko Eissfeldt <heiko@colossus.escape.de> with additional
* changes by Erik Andersen <andersee@debian.org>
*
* 24 January 1998 -- Removed the scd_disc_status() function, which was now
* just dead code left over from the port.
* Erik Andersen <andersee@debian.org>
*
*/
#include <linux/major.h>
......@@ -1242,35 +1246,6 @@ size_to_buf(unsigned int size,
buf[2] = size % 256;
}
#if 0
/* Uniform cdrom interface function.
Return the status of the current disc:
If it is recognized as CD-I -> return XA Mode 2 Form 2
If it is recognized as XA -> return XA Mode 2 Form 1
If there is at least one data track return Mode 1
else return type AUDIO
*/
static int scd_disc_status(struct cdrom_device_info *cdi)
{
if (sony_spun_up)
{
int i;
sony_get_toc();
/* look into the TOC */
if (sony_toc.disk_type == 0x10) /* this is a CD-I disc */
return CDS_XA_2_2;
if (sony_toc.disk_type == 0x20) /* this is a XA disc */
return CDS_XA_2_1;
for (i = 0; i < sony_toc.track_entries; i++)
if (sony_toc.tracks[i].control & CDROM_DATA_TRACK)
return CDS_DATA_1;
return CDS_AUDIO;
} else
return CDS_NO_INFO;
}
#endif
/* Starts a read operation. Returns 0 on success and 1 on failure.
The read operation used here allows multiple sequential sectors
to be read and status returned for each sector. The driver will
......
......@@ -149,6 +149,8 @@
21 dec 1997 1.4 Upgrade to Linux 2.1.72.
24 jan 1998 Removed the cm206_disc_status() function, as it was now dead
code. The Uniform CDROM driver now provides this functionality.
*
* Parts of the code are based upon lmscd.c written by Kai Petzke,
* sbpcd.c written by Eberhard Moenkeberg, and mcd.c by Martin
......@@ -1140,24 +1142,6 @@ int cm206_drive_status(struct cdrom_device_info * cdi, int slot_nr)
return CDS_DISC_OK;
}
/* gives current state of disc in drive */
int cm206_disc_status(struct cdrom_device_info * cdi)
{
uch xa;
get_drive_status();
if ((cd->dsb & dsb_not_useful) | !(cd->dsb & dsb_disc_present))
return CDS_NO_DISC;
get_disc_status();
if (DISC_STATUS & cds_all_audio) return CDS_AUDIO;
xa = DISC_STATUS >> 4;
switch (xa) {
case 0: return CDS_DATA_1; /* can we detect CDS_DATA_2? */
case 1: return CDS_XA_2_1; /* untested */
case 2: return CDS_XA_2_2;
}
return 0;
}
/* locks or unlocks door lock==1: lock; return 0 upon success */
int cm206_lock_door(struct cdrom_device_info * cdi, int lock)
{
......@@ -1274,9 +1258,9 @@ static struct cdrom_device_info cm206_info = {
"cm206" /* name of the device type */
};
/* This routine gets called during initialization if thing go wrong,
/* This routine gets called during initialization if things go wrong,
* can be used in cleanup_module as well. */
void cleanup(int level)
static void cleanup(int level)
{
switch (level) {
case 4:
......
......@@ -1126,9 +1126,9 @@ static void mcd_release(struct cdrom_device_info * cdi)
/* This routine gets called during initialization if thing go wrong,
/* This routine gets called during initialization if things go wrong,
* and is used in cleanup_module as well. */
void cleanup(int level)
static void cleanup(int level)
{
switch (level) {
case 3:
......
......@@ -304,6 +304,9 @@
* Heiko Eissfeldt <heiko@colossus.escape.de> with additional
* changes by Erik Andersen <andersee@debian.org>
*
* 4.62 Fix a bug where playing audio left the drive in an unusable state.
* Heiko Eissfeldt <heiko@colossus.escape.de>
*
*
* TODO
* implement "read all subchannel data" (96 bytes per frame)
......@@ -1046,7 +1049,7 @@ static int CDi_stat_loop(void)
sbp_sleep(1);
i = 1;
}
msg(DBG_LCS,"CDi_stat_loop failed\n");
msg(DBG_LCS,"CDi_stat_loop failed in line %d\n", __LINE__);
return (-1);
}
/*==========================================================================*/
......@@ -4295,7 +4298,7 @@ static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd,
}
if (status_tries == 0)
{
msg(DBG_AUD,"read_audio: sbp_status: failed after 3 tries.\n");
msg(DBG_AUD,"read_audio: sbp_status: failed after 3 tries in line %d.\n", __LINE__);
continue;
}
msg(DBG_AUD,"read_audio: sbp_status: ok.\n");
......@@ -4467,7 +4470,7 @@ static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd,
#endif OLD_BUSY
if (data_tries == 0)
{
msg(DBG_AUD,"read_audio: failed after 5 tries.\n");
msg(DBG_AUD,"read_audio: failed after 5 tries in line %d.\n", __LINE__);
RETURN_UP(-EIO);
}
msg(DBG_AUD,"read_audio: successful return.\n");
......@@ -4651,6 +4654,7 @@ static int sbpcd_audio_ioctl(struct cdrom_device_info *cdi, u_int cmd,
#endif SAFE_MIXED
i=cc_Pause_Resume(1);
D_S[d].audio_state=0;
cc_DriveReset();
RETURN_UP(i);
case CDROMSTART: /* Spin up the drive */
......@@ -4886,7 +4890,7 @@ static void DO_SBPCD_REQUEST(void)
}
if (status_tries == 0)
{
msg(DBG_INF,"sbp_status: failed after 3 tries\n");
msg(DBG_INF,"sbp_status: failed after 3 tries in line %d\n", __LINE__);
break;
}
......
......@@ -109,7 +109,7 @@ if [ "$CONFIG_ALPHA_BOOK1" = "y" ]; then
bool 'Tadpole ANA H8 Support' CONFIG_H8
fi
tristate 'Video For Linux' CONFIG_VIDEO_DEV
if [ "$CONFIG_VIDEO_DEV" != n ]; then
if [ "$CONFIG_VIDEO_DEV" != "n" ]; then
dep_tristate 'BT848 Video For Linux' CONFIG_VIDEO_BT848 $CONFIG_VIDEO_DEV
if [ "$CONFIG_PARPORT" != "n" ]; then
dep_tristate 'Quickcam BW Video For Linux' CONFIG_VIDEO_BWQCAM $CONFIG_VIDEO_DEV
......
......@@ -403,10 +403,10 @@ int fdc_interrupt_wait(unsigned int time)
current->state = TASK_INTERRUPTIBLE;
spin_lock_irq(&current->sigmask_lock);
old_sigmask = current->blocked;
siginitset(&current->blocked, _BLOCK_ALL);
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
old_sigmask = current->blocked;
sigfillset(&current->blocked);
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
add_wait_queue(&ftape_wait_intr, &wait);
while (!ft_interrupt_seen && current->state != TASK_RUNNING) {
......@@ -414,9 +414,9 @@ int fdc_interrupt_wait(unsigned int time)
}
spin_lock_irq(&current->sigmask_lock);
current->blocked = old_sigmask;
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
current->blocked = old_sigmask;
recalc_sigpending(current);
spin_unlock_irq(&current->sigmask_lock);
remove_wait_queue(&ftape_wait_intr, &wait);
/* the following IS necessary. True: as well
......
......@@ -80,7 +80,6 @@ int keyboard_wait_for_keypress(struct console *co)
/* shift state counters.. */
static unsigned char k_down[NR_SHIFT] = {0, };
/* keyboard key bitmap */
#define BITS_PER_LONG (8*sizeof(unsigned long))
static unsigned long key_down[256/BITS_PER_LONG] = { 0, };
static int dead_key_next = 0;
......
This diff is collapsed.
......@@ -52,10 +52,11 @@ static char *revision = "$Revision: 1.4 $";
/* ------------------------------------------------------------- */
int portbase = 0x150;
int irq = 15;
int showcapimsgs = 0; /* used in lli.c */
int loaddebug = 0;
static int portbase = 0x150;
#ifdef MODULE
static int irq = 15;
#ifdef HAS_NEW_SYMTAB
MODULE_AUTHOR("Carsten Paeth <calle@calle.in-berlin.de>");
......@@ -64,6 +65,7 @@ MODULE_PARM(irq, "2-15i");
MODULE_PARM(showcapimsgs, "0-3i");
MODULE_PARM(loaddebug, "0-1i");
#endif
#endif
/* ------------------------------------------------------------- */
......
......@@ -179,23 +179,23 @@ static char HiSaxID[96] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" \
char *HiSax_id = HiSaxID;
#ifdef MODULE
/* Variables for insmod */
int type[] =
static int type[] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int protocol[] =
static int protocol[] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int io[] =
static int io[] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
#ifdef CONFIG_HISAX_16_3 /* For Creatix/Teles PnP */
int io0[] =
static int io0[] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int io1[] =
static int io1[] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
#endif
int irq[] =
static int irq[] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int mem[] =
static int mem[] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char *id = HiSaxID;
static char *id = HiSaxID;
#if (LINUX_VERSION_CODE > 0x020111)
MODULE_AUTHOR("Karsten Keil");
......
......@@ -22,10 +22,10 @@
#include <linux/isdnif.h>
#include "pcbit.h"
int mem[MAX_PCBIT_CARDS] = {0, };
int irq[MAX_PCBIT_CARDS] = {0, };
static int mem[MAX_PCBIT_CARDS] = {0, };
static int irq[MAX_PCBIT_CARDS] = {0, };
int num_boards;
static int num_boards;
struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS] = {0, 0, 0, 0};
int init_module(void);
......
......@@ -16,11 +16,6 @@
this, you must also change the number
of elements in io, irq, and ram to
match. Initialized in init.c */
/*
extern unsigned int io[];
extern unsigned char irq[];
extern unsigned long ram[];
*/
#define SIGNATURE 0x87654321 /* Board reset signature */
#define SIG_OFFSET 0x1004 /* Where to find signature in shared RAM */
......
#include <linux/module.h>
#include <linux/version.h>
#include <stdio.h>
#include <linux/errno.h>
#include <asm/segment.h>
#include <asm/io.h>
......
......@@ -11,10 +11,10 @@ const char version[] = "2.0b1";
const char *boardname[] = { "DataCommute/BRI", "DataCommute/PRI", "TeleCommute/BRI" };
/* insmod set parameters */
unsigned int io[] = {0,0,0,0};
unsigned char irq[] = {0,0,0,0};
unsigned long ram[] = {0,0,0,0};
int do_reset = 0;
static unsigned int io[] = {0,0,0,0};
static unsigned char irq[] = {0,0,0,0};
static unsigned long ram[] = {0,0,0,0};
static int do_reset = 0;
static int sup_irq[] = { 11, 10, 9, 5, 12, 14, 7, 3, 4, 6 };
#define MAX_IRQS 10
......
Currently known (or at least suspected) bugs in parport:
o IEEE1284 code does not do the terminating handshake after transfers, which
seems to upset some devices.
o lp doesn't allow you to read status while printing is in progress.
......@@ -48,10 +48,10 @@ else
M_OBJS += parport.o
endif
ifeq ($(CONFIG_PARPORT_PC),m)
MX_OBJS += parport_pc.o
M_OBJS += parport_pc.o
endif
ifeq ($(CONFIG_PARPORT_AX),m)
MX_OBJS += parport_ax.o
M_OBJS += parport_ax.o
endif
endif
......
......@@ -4,7 +4,7 @@ Things to be done.
1. Proper documentation.
2. Overhaul lp.c:
2. A better lp.c:
a) It's a _mess_
......@@ -18,4 +18,8 @@ Things to be done.
bits when they have something to say. We should read out and deal
with (maybe just log) whatever the printer wants to tell the world.
3. Assimilate more drivers.
3. Support more hardware (eg m68k, Sun bpp).
4. A better PLIP (make use of bidirectional/ECP/EPP ports).
/* Parallel-port routines for ARC onboard hardware.
/* Low-level parallel port routines for Archimedes onboard hardware
*
* Author: Phil Blundell <Philip.Blundell@pobox.com>
*/
#include <linux/tasks.h>
#include <asm/ptrace.h>
#include <asm/io.h>
#include <asm/dma.h>
/* This driver is for the parallel port hardware found on Acorn's old
* range of Archimedes machines. The A5000 and newer systems have PC-style
* I/O hardware and should use the parport_pc driver instead.
*
* The Acorn printer port hardware is very simple. There is a single 8-bit
* write-only latch for the data port and control/status bits are handled
* with various auxilliary input and output lines. The port is not
* bidirectional, does not support any modes other than SPP, and has only
* a subset of the standard printer control lines connected.
*/
#include <linux/tasks.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/malloc.h>
#include <linux/parport.h>
#include <linux/arch/oldlatches.h>
#include <asm/ptrace.h>
#include <asm/io.h>
#include <asm/arch/oldlatches.h>
#include <asm/arch/irqs.h>
#define DATA_LATCH 0x3350010
......@@ -50,7 +58,7 @@ static void arc_dec_use_count(void)
#endif
}
static struct parport_operations arc_ops =
static struct parport_operations parport_arc_ops =
{
arc_write_data,
arc_read_data,
......@@ -90,3 +98,31 @@ static struct parport_operations arc_ops =
arc_inc_use_count,
arc_dec_use_count
};
/* --- Initialisation code -------------------------------- */
int parport_arc_init(void)
{
/* Archimedes hardware provides only one port, at a fixed address */
struct parport *p;
if (check_region(DATA_LATCH, 4))
return 0;
if (!(p = parport_register_port(base, IRQ_PRINTERACK,
PARPORT_DMA_NONE, &parport_arc_ops)))
return 0;
p->modes = PARPORT_MODE_ARCSPP;
p->size = 4;
printk(KERN_INFO "%s: Archimedes on-board port, using irq %d\n",
p->irq);
parport_proc_register(p);
p->flags |= PARPORT_FLAG_COMA;
if (parport_probe_hook)
(*parport_probe_hook)(p);
return 1;
}
This diff is collapsed.
/* Parallel-port initialisation code.
*
* Authors: David Campbell <campbell@tirian.che.curtin.edu.au>
* Authors: David Campbell <campbell@torque.net>
* Tim Waugh <tim@cyberelk.demon.co.uk>
* Jose Renau <renau@acm.org>
*
......@@ -57,7 +57,7 @@ __initfunc(void parport_setup(char *str, int *ints))
#ifdef MODULE
int init_module(void)
{
parport_proc_init();
(void)parport_proc_init(); /* We can go on without it. */
return 0;
}
......@@ -88,6 +88,7 @@ __initfunc(int parport_init(void))
/* Exported symbols for modules. */
EXPORT_SYMBOL(parport_claim);
EXPORT_SYMBOL(parport_claim_or_block);
EXPORT_SYMBOL(parport_release);
EXPORT_SYMBOL(parport_register_port);
EXPORT_SYMBOL(parport_unregister_port);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -369,11 +369,13 @@
Fix bug in pci_probe() for 64 bit systems reported
by <belliott@accessone.com>.
0.533 9-Jan-98 Fix more 64 bit bugs reported by <jal@cs.brown.edu>.
0.534 24-Jan-98 Fix last (?) endian bug from
<Geert.Uytterhoeven@cs.kuleuven.ac.be>
=========================================================================
*/
static const char *version = "de4x5.c:V0.533 1998/1/9 davies@maniac.ultranet.com\n";
static const char *version = "de4x5.c:V0.534 1998/1/24 davies@maniac.ultranet.com\n";
#include <linux/module.h>
......@@ -2079,7 +2081,7 @@ eisa_probe(struct device *dev, u_long ioaddr))
__initfunc(static void
pci_probe(struct device *dev, u_long ioaddr))
{
u_char pb, pbus, dev_num, dnum, dev_fn, timer;
u_char pb, pbus, dev_num, dnum, dev_fn, timer, tirq;
u_short dev_id, vendor, index, status;
u_int tmp, irq = 0, device, class = DE4X5_CLASS_CODE;
u_long iobase = 0; /* Clear upper 32 bits in Alphas */
......@@ -2151,8 +2153,8 @@ pci_probe(struct device *dev, u_long ioaddr))
/* Fetch the IRQ to be used */
#ifndef __sparc_v9__
pcibios_read_config_byte(pb, PCI_DEVICE, PCI_INTERRUPT_LINE,
(char *)&irq);
pcibios_read_config_byte(pb, PCI_DEVICE, PCI_INTERRUPT_LINE, &tirq);
irq = tirq;
#else
irq = pdev->irq;
#endif
......@@ -2176,7 +2178,7 @@ pci_probe(struct device *dev, u_long ioaddr))
}
if (!(status & PCI_COMMAND_MASTER)) continue;
/* Check the latency timer for values > 0x60 */
/* Check the latency timer for values >= 0x60 */
pcibios_read_config_byte(pb, PCI_DEVICE, PCI_LATENCY_TIMER, &timer);
if (timer < 0x60) {
pcibios_write_config_byte(pb, PCI_DEVICE, PCI_LATENCY_TIMER, 0x60);
......
......@@ -1358,6 +1358,8 @@ dgrs_found_device(
/*
* Scan for all boards
*/
static int is2iv[8] __initdata = { 0, 3, 5, 7, 10, 11, 12, 15 };
__initfunc(static int
dgrs_scan(struct device *dev))
{
......@@ -1463,8 +1465,6 @@ dgrs_scan(struct device *dev))
*/
if (EISA_bus)
{
static int is2iv[8] __initdata = { 0, 3, 5, 7, 10, 11, 12, 15 };
for (io = 0x1000; io < 0x9000; io += 0x1000)
{
if (inb(io+ES4H_MANUFmsb) != 0x10
......
......@@ -200,7 +200,9 @@ static void gentbl_fsk9600(FILE *f)
? "\n\t" : "");
}
}
#ifdef VERBOSE
fprintf(stderr, "fsk9600: txfilt4: min = %f; max = %f\n", min, max);
#endif
fprintf(f, "\n};\n\n");
min = max = 0;
memset(c, 0, sizeof(c));
......@@ -233,7 +235,9 @@ static void gentbl_fsk9600(FILE *f)
? "\n\t" : "");
}
}
#ifdef VERBOSE
fprintf(stderr, "fsk9600: txfilt5: min = %f; max = %f\n", min, max);
#endif
fprintf(f, "\n};\n\n");
}
......@@ -466,7 +470,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfilt8: min = %f; max = %f\n", min, max);
#endif
fprintf(f, "\n};\n\n");
min = max = 0;
memset(c, 0, sizeof(c));
......@@ -493,7 +499,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfilt10: min = %f; max = %f\n", min, max);
#endif
fprintf(f, "\n};\n\n");
/*
* secondly generate tables for the PM transmitter modulator
......@@ -524,7 +532,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfiltpm8: min = %f; max = %f\n", min, max);
#endif
fprintf(f, "\n};\n\n");
min = max = 0;
memset(c, 0, sizeof(c));
......@@ -552,7 +562,9 @@ static void gentbl_hapn4800(FILE *f)
? "\n\t" : "");
}
}
#ifdef VERBOSE
fprintf(stderr, "hapn4800: txfiltpm10: min = %f; max = %f\n", min, max);
#endif
fprintf(f, "\n};\n\n");
}
......
......@@ -72,14 +72,14 @@ static unsigned int netcard_portlist[] __initdata =
#ifdef CONFIG_PCI
/* Ack! People are making PCI ne2000 clones! Oh the horror, the horror... */
static struct { unsigned short vendor, dev_id;}
static struct { unsigned short vendor, dev_id; char *name; }
pci_clone_list[] __initdata = {
{PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8029},
{PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940},
{PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_RL2000},
{PCI_VENDOR_ID_KTI, PCI_DEVICE_ID_KTI_ET32P2},
{PCI_VENDOR_ID_NETVIN, PCI_DEVICE_ID_NETVIN_NV5000SC},
{PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C926},
{PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8029, "Realtek 8029" },
{PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940, "Winbond 89C940" },
{PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_RL2000, "Compex ReadyLink 2000" },
{PCI_VENDOR_ID_KTI, PCI_DEVICE_ID_KTI_ET32P2, "KTI ET32P2" },
{PCI_VENDOR_ID_NETVIN, PCI_DEVICE_ID_NETVIN_NV5000SC, "NetVin NV5000" },
{PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C926, "VIA 82C926 Amazon" },
{0,}
};
#endif
......@@ -228,9 +228,8 @@ __initfunc(static int ne_probe_pci(struct device *dev))
break; /* Beauty -- got a valid card. */
}
if (pci_irq_line == 0) continue; /* Try next PCI ID */
printk("ne.c: PCI BIOS reports %s %s at i/o %#x, irq %d.\n",
pci_strvendor(pci_clone_list[i].vendor),
pci_strdev(pci_clone_list[i].vendor, pci_clone_list[i].dev_id),
printk("ne.c: PCI BIOS reports %s at i/o %#x, irq %d.\n",
pci_clone_list[i].name,
pci_ioaddr, pci_irq_line);
if (ne_probe1(dev, pci_ioaddr) != 0) { /* Shouldn't happen. */
printk(KERN_ERR "ne.c: Probe of PCI card at %#x failed.\n", pci_ioaddr);
......
This diff is collapsed.
......@@ -188,20 +188,20 @@ z_comp_alloc(options, opt_len)
struct ppp_deflate_state *state;
int w_size;
MOD_INC_USE_COUNT;
if (opt_len != CILEN_DEFLATE || options[0] != CI_DEFLATE
|| options[1] != CILEN_DEFLATE
|| DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL
|| options[3] != DEFLATE_CHK_SEQUENCE)
return NULL;
goto out_fail;
w_size = DEFLATE_SIZE(options[2]);
if (w_size < DEFLATE_MIN_SIZE || w_size > DEFLATE_MAX_SIZE)
return NULL;
goto out_fail;
state = (struct ppp_deflate_state *) kmalloc(sizeof(*state), GFP_KERNEL);
if (state == NULL)
return NULL;
goto out_fail;
MOD_INC_USE_COUNT;
memset (state, 0, sizeof (struct ppp_deflate_state));
state->strm.next_in = NULL;
state->strm.zalloc = zalloc_init;
......@@ -210,13 +210,16 @@ z_comp_alloc(options, opt_len)
if (deflateInit2(&state->strm, Z_DEFAULT_COMPRESSION,
DEFLATE_METHOD_VAL, -w_size, 8, Z_DEFAULT_STRATEGY)
!= Z_OK) {
z_comp_free(state);
return NULL;
}
!= Z_OK)
goto out_free;
state->strm.zalloc = zalloc;
return (void *) state;
out_free:
z_comp_free(state);
out_fail:
MOD_DEC_USE_COUNT;
return NULL;
}
static int
......@@ -369,33 +372,35 @@ z_decomp_alloc(options, opt_len)
struct ppp_deflate_state *state;
int w_size;
MOD_INC_USE_COUNT;
if (opt_len != CILEN_DEFLATE || options[0] != CI_DEFLATE
|| options[1] != CILEN_DEFLATE
|| DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL
|| options[3] != DEFLATE_CHK_SEQUENCE)
return NULL;
goto out_fail;
w_size = DEFLATE_SIZE(options[2]);
if (w_size < DEFLATE_MIN_SIZE || w_size > DEFLATE_MAX_SIZE)
return NULL;
goto out_fail;
state = (struct ppp_deflate_state *) kmalloc(sizeof(*state), GFP_KERNEL);
if (state == NULL)
return NULL;
MOD_INC_USE_COUNT;
goto out_fail;
memset (state, 0, sizeof (struct ppp_deflate_state));
state->w_size = w_size;
state->strm.next_out = NULL;
state->strm.zalloc = zalloc_init;
state->strm.zfree = zfree;
if (inflateInit2(&state->strm, -w_size) != Z_OK) {
z_decomp_free(state);
return NULL;
}
if (inflateInit2(&state->strm, -w_size) != Z_OK)
goto out_free;
state->strm.zalloc = zalloc;
return (void *) state;
out_free:
z_decomp_free(state);
out_fail:
MOD_DEC_USE_COUNT;
return NULL;
}
static int
......
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.
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.
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.
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.
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.
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