Commit d24028e9 authored by Linus Torvalds's avatar Linus Torvalds

Import 2.3.42pre1

parent 6fb70b47
......@@ -287,6 +287,13 @@ N: Erik Inge Bols
E: knan@mo.himolde.no
D: Misc kernel hacks
N: Andreas E. Bombe
E: andreas.bombe@munich.netsurf.de
W: http://home.pages.de/~andreas.bombe/
P: 1024/04880A44 72E5 7031 4414 2EB6 F6B4 4CBD 1181 7032 0488 0A44
D: IEEE 1394 subsystem rewrite and maintainer
D: Texas Instruments PCILynx IEEE 1394 driver
N: Zoltn Bszrmnyi
E: zboszor@mail.externet.hu
D: MTRR emulation with Cyrix style ARR registers, Athlon MTRR support
......@@ -1306,6 +1313,14 @@ S: Post Office Box 371
S: North Little Rock, Arkansas 72115
S: USA
N: Stephan Linz
E: linz@mazet.de
E: Stephan.Linz@gmx.de
W: http://www.crosswinds.net/~tuxer
D: PCILynx patch to work with 1394a PHY and without local RAM
S: (ask for current address)
S: Germany
N: Siegfried "Frieder" Loeffler (dg1sek)
E: floeff@tunix.mathematik.uni-stuttgart.de, fl@LF.net
W: http://www.mathematik.uni-stuttgart.de/~floeff
......@@ -1702,6 +1717,13 @@ S: Demonstratsii 8-382
S: Tula 300000
S: Russia
N: Gordon Peters
E: GordPeters@smarttech.com
D: Isochronous receive for IEEE 1394 driver (OHCI module).
D: Bugfixes for the aforementioned.
S: Calgary, Alberta
S: Canada
N: Johnnie Peters
E: jpeters@phx.mcd.mot.com
D: Motorola PowerPC changes for PReP
......@@ -1736,6 +1758,12 @@ S: M"ullerstr. 69
S: 13349 Berlin
S: Germany
N: Emanuel Pirker
E: epirker@edu.uni-klu.ac.at
D: AIC5800 IEEE 1394, RAW I/O on 1394
D: Starter of Linux1394 effort
S: ask per mail for current address
N: Ken Pizzini
E: ken@halcyon.com
D: CDROM driver "sonycd535" (Sony CDU-535/531)
......@@ -1852,6 +1880,13 @@ S: 21 Rue Carnot
S: 95170 Deuil La Barre
S: France
N: Sebastien Rougeaux
E: Sebastien.Rougeaux@syseng.anu.edu.au
D: IEEE 1394 OHCI module
S: Research School of Information Science and Engineering
S: The Australian National University, ACT 0200
S: Australia
N: Alessandro Rubini
E: rubini@ipvvis.unipv.it
D: the gpm mouse server and kernel support for it
......
This diff is collapsed.
......@@ -456,6 +456,41 @@ M: Gadi Oxman <gadio@netvision.net.il>
L: linux-kernel@vger.rutgers.edu
S: Maintained
IEEE 1394 SUBSYSTEM
P: Andreas Bombe
M: andreas.bombe@munich.netsurf.de
L: linux1394-devel@eclipt.uni-klu.ac.at
W: http://eclipt.uni-klu.ac.at/ieee1394
S: Maintained
IEEE 1394 AIC5800 DRIVER
P: Emanuel Pirker
M: epirker@edu.uni-klu.ac.at
L: linux1394-devel@eclipt.uni-klu.ac.at
W: http://eclipt.uni-klu.ac.at/ieee1394
S: Maintained
IEEE 1394 OHCI DRIVER
P: Sebastien Rougeaux
M: sebastien.rougeaux@anu.edu.au
L: linux1394-devel@eclipt.uni-klu.ac.at
W: http://eclipt.uni-klu.ac.at/ieee1394
S: Maintained
IEEE 1394 PCILYNX DRIVER
P: Andreas Bombe
M: andreas.bombe@munich.netsurf.de
L: linux1394-devel@eclipt.uni-klu.ac.at
W: http://eclipt.uni-klu.ac.at/ieee1394
S: Maintained
IEEE 1394 RAW I/O DRIVER
P: Andreas Bombe
M: andreas.bombe@munich.netsurf.de
L: linux1394-devel@eclipt.uni-klu.ac.at
W: http://eclipt.uni-klu.ac.at/ieee1394
S: Maintained
INTEL APIC/IOAPIC, LOWLEVEL X86 SMP SUPPORT
P: Ingo Molnar
M: mingo@redhat.com
......@@ -936,6 +971,12 @@ L: linux-net@vger.rutgers.edu
L: linux-tr@linuxtr.net
S: Maintained
TRIDENT 4DWAVE/SIS 7018 PCI AUDIO CORE
P: Ollie Lho
M: ollie@sis.com.tw
L: linux-kernel@vger.rutgers.edu
S: Supported
TMS380 TOKEN-RING NETWORK DRIVER
P: Adam Fritzler
M: mid@auk.cx
......
VERSION = 2
PATCHLEVEL = 3
SUBLEVEL = 41
SUBLEVEL = 42
EXTRAVERSION =
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
......
......@@ -22,7 +22,7 @@ choice 'Processor family' \
586/K5/5x86/6x86 CONFIG_M586 \
Pentium/TSC CONFIG_M586TSC \
PPro/6x86MX CONFIG_M686 \
K6/II/II CONFIG_MK6 \
K6/II/III CONFIG_MK6 \
Athlon CONFIG_MK7" PPro
#
# Define implied options from the CPU selection here
......
......@@ -364,7 +364,7 @@ void amiga_do_irq_list(int irq, struct pt_regs *fp, struct irq_server *server)
intena = ami_intena_vals[irq];
custom.intreq = intena;
/* serve first fast handlers - there can only be one of these */
/* serve fast handler if present - there can only be one of these */
node = ami_irq_list[irq];
/*
......@@ -392,7 +392,11 @@ void amiga_do_irq_list(int irq, struct pt_regs *fp, struct irq_server *server)
*/
custom.intena = intena;
save_flags(flags);
#if 0 /* def CPU_M68060_ONLY */
sti();
#else
restore_flags((flags & ~0x0700) | (fp->sr & 0x0700));
#endif
slow_nodes = node;
for (;;) {
......
......@@ -311,10 +311,6 @@ void atari_init_midi_port( int cflag )
void __init atari_debug_init(void)
{
#ifdef CONFIG_KGDB
/* the m68k_debug_device is used by the GDB stub, do nothing here */
return;
#endif
if (!strcmp( m68k_debug_device, "ser" )) {
/* defaults to ser2 for a Falcon and ser1 otherwise */
strcpy( m68k_debug_device, MACH_IS_FALCON ? "ser2" : "ser1" );
......
......@@ -132,6 +132,7 @@ void __init config_bvme6000(void)
bvme6000_set_vectors();
#endif
mach_max_dma_address = 0xffffffff;
mach_sched_init = bvme6000_sched_init;
mach_keyb_init = bvme6000_keyb_init;
mach_kbdrate = bvme6000_kbdrate;
......
......@@ -37,6 +37,7 @@
#include <linux/ptrace.h>
#include <linux/unistd.h>
#include <linux/stddef.h>
#include <linux/highuid.h>
#include <asm/setup.h>
#include <asm/uaccess.h>
......@@ -1048,6 +1049,7 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
info.si_code = SI_USER;
info.si_pid = current->p_pptr->pid;
info.si_uid = current->p_pptr->uid;
info.si_uid16 = high2lowuid(current->p_pptr->uid);
}
/* If the (new) signal is now blocked, requeue it. */
......
......@@ -37,9 +37,6 @@
#include <asm/pgtable.h>
#include <asm/machdep.h>
#include <asm/siginfo.h>
#ifdef CONFIG_KGDB
#include <asm/kgdb.h>
#endif
/* assembler routines */
asmlinkage void system_call(void);
......@@ -766,11 +763,6 @@ int kstack_depth_to_print = 48;
static void dump_stack(struct frame *fp)
{
#ifdef CONFIG_KGDB
/* This will never return to here, if kgdb has been initialized. And if
* it returns from there, then to where the error happened... */
enter_kgdb( &fp->ptregs );
#else
unsigned long *stack, *endstack, addr, module_start, module_end;
extern char _start, _etext;
int i;
......@@ -868,15 +860,10 @@ static void dump_stack(struct frame *fp)
for (i = 0; i < 10; i++)
printk("%04x ", 0xffff & ((short *) fp->ptregs.pc)[i]);
printk ("\n");
#endif
}
void bad_super_trap (struct frame *fp)
{
#ifdef CONFIG_KGDB
/* Save the register dump if we'll enter kgdb anyways */
if (!kgdb_initialized) {
#endif
console_verbose();
if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0]))
printk ("*** %s *** FORMAT=%X\n",
......@@ -906,9 +893,6 @@ void bad_super_trap (struct frame *fp)
fp->ptregs.pc);
}
printk ("Current process id is %d\n", current->pid);
#ifdef CONFIG_KGDB
}
#endif
die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0);
}
......@@ -1037,10 +1021,6 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr)
if (!(fp->sr & PS_S))
return;
#ifdef CONFIG_KGDB
/* Save the register dump if we'll enter kgdb anyways */
if (!kgdb_initialized) {
#endif
console_verbose();
printk("%s: %08x\n",str,nr);
printk("PC: [<%08lx>]\nSR: %04x SP: %p a2: %08lx\n",
......@@ -1052,9 +1032,6 @@ void die_if_kernel (char *str, struct pt_regs *fp, int nr)
printk("Process %s (pid: %d, stackpage=%08lx)\n",
current->comm, current->pid, PAGE_SIZE+(unsigned long)current);
#ifdef CONFIG_KGDB
}
#endif
dump_stack((struct frame *)fp);
do_exit(SIGSEGV);
}
......
......@@ -397,10 +397,6 @@ void mac_init_sccb_port( int cflag )
void __init mac_debug_init(void)
{
#ifdef CONFIG_KGDB
/* the m68k_debug_device is used by the GDB stub, do nothing here */
return;
#endif
#ifdef DEBUG_SERIAL
if ( !strcmp( m68k_debug_device, "ser" )
|| !strcmp( m68k_debug_device, "ser1" )) {
......
......@@ -101,6 +101,7 @@ static int mvme147_get_hardware_list(char *buffer)
void __init config_mvme147(void)
{
mach_max_dma_address = 0x01000000;
mach_sched_init = mvme147_sched_init;
mach_keyb_init = mvme147_keyb_init;
mach_kbdrate = mvme147_kbdrate;
......
......@@ -145,6 +145,7 @@ void __init config_mvme16x(void)
p_bdid p = &mvme_bdid;
char id[40];
mach_max_dma_address = 0xffffffff;
mach_sched_init = mvme16x_sched_init;
mach_keyb_init = mvme16x_keyb_init;
mach_kbdrate = mvme16x_kbdrate;
......
......@@ -241,10 +241,6 @@ static int floppy_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long param);
static int floppy_open(struct inode *inode, struct file *filp);
static int floppy_release(struct inode *inode, struct file *filp);
static ssize_t floppy_read(struct file *filp, char *buf,
size_t count, loff_t *ppos);
static ssize_t floppy_write(struct file *filp, const char *buf,
size_t count, loff_t *ppos);
static int floppy_check_change(kdev_t dev);
static int floppy_revalidate(kdev_t dev);
static int swim3_add_device(struct device_node *swims);
......@@ -988,42 +984,6 @@ static int floppy_revalidate(kdev_t dev)
return ret;
}
static ssize_t floppy_read(struct file *filp, char *buf,
size_t count, loff_t *ppos)
{
struct inode *inode = filp->f_dentry->d_inode;
struct floppy_state *fs;
int devnum = MINOR(inode->i_rdev);
if (devnum >= floppy_count)
return -ENODEV;
fs = &floppy_states[devnum];
if (fs->ejected)
return -ENXIO;
return block_read(filp, buf, count, ppos);
}
static ssize_t floppy_write(struct file * filp, const char * buf,
size_t count, loff_t *ppos)
{
struct inode * inode = filp->f_dentry->d_inode;
struct floppy_state *fs;
int devnum = MINOR(inode->i_rdev);
if (devnum >= floppy_count)
return -ENODEV;
check_disk_change(inode->i_rdev);
fs = &floppy_states[devnum];
if (fs->ejected)
return -ENXIO;
if (fs->write_prot < 0)
fs->write_prot = swim3_readbit(fs, WRITE_PROT);
if (fs->write_prot)
return -EROFS;
return block_write(filp, buf, count, ppos);
}
static void floppy_off(unsigned int nr)
{
}
......
......@@ -102,10 +102,6 @@ static void swimiop_receive(struct iop_msg *, struct pt_regs *);
static void swimiop_status_update(int, struct swim_drvstatus *);
static int swimiop_eject(struct floppy_state *fs);
static ssize_t floppy_read(struct file *filp, char *buf,
size_t count, loff_t *ppos);
static ssize_t floppy_write(struct file *filp, const char *buf,
size_t count, loff_t *ppos);
static int floppy_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long param);
static int floppy_open(struct inode *inode, struct file *filp);
......@@ -338,40 +334,6 @@ static int swimiop_eject(struct floppy_state *fs)
return cmd->error;
}
static ssize_t floppy_read(struct file *filp, char *buf,
size_t count, loff_t *ppos)
{
struct inode *inode = filp->f_dentry->d_inode;
struct floppy_state *fs;
int devnum = MINOR(inode->i_rdev);
if (devnum >= floppy_count)
return -ENODEV;
fs = &floppy_states[devnum];
if (fs->ejected)
return -ENXIO;
return block_read(filp, buf, count, ppos);
}
static ssize_t floppy_write(struct file * filp, const char * buf,
size_t count, loff_t *ppos)
{
struct inode * inode = filp->f_dentry->d_inode;
struct floppy_state *fs;
int devnum = MINOR(inode->i_rdev);
if (devnum >= floppy_count)
return -ENODEV;
check_disk_change(inode->i_rdev);
fs = &floppy_states[devnum];
if (fs->ejected)
return -ENXIO;
if (fs->write_prot)
return -EROFS;
return block_write(filp, buf, count, ppos);
}
static struct floppy_struct floppy_type =
{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /* 7 1.44MB 3.5" */
......
......@@ -232,7 +232,6 @@ void agp_free_memory(agp_memory * curr)
}
if (curr->type != 0) {
agp_bridge.free_by_type(curr);
MOD_DEC_USE_COUNT;
return;
}
if (curr->page_count != 0) {
......@@ -260,15 +259,23 @@ agp_memory *agp_allocate_memory(size_t page_count, u32 type)
agp_bridge.max_memory_agp) {
return NULL;
}
if (type != 0) {
new = agp_bridge.alloc_by_type(page_count, type);
return new;
}
/* We always increase the module count, since free auto-decrements
* it
*/
MOD_INC_USE_COUNT;
scratch_pages = (page_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE;
new = agp_create_memory(scratch_pages);
if (new == NULL) {
MOD_DEC_USE_COUNT;
return NULL;
}
for (i = 0; i < page_count; i++) {
......@@ -286,7 +293,6 @@ agp_memory *agp_allocate_memory(size_t page_count, u32 type)
new->page_count++;
}
MOD_INC_USE_COUNT;
return new;
}
......@@ -781,11 +787,13 @@ static aper_size_info_fixed intel_i810_sizes[] =
};
#define AGP_DCACHE_MEMORY 1
#define AGP_PHYS_MEMORY 2
static gatt_mask intel_i810_masks[] =
{
{I810_PTE_VALID, 0},
{(I810_PTE_VALID | I810_PTE_LOCAL), AGP_DCACHE_MEMORY}
{(I810_PTE_VALID | I810_PTE_LOCAL), AGP_DCACHE_MEMORY},
{I810_PTE_VALID, 0}
};
static struct _intel_i810_private {
......@@ -896,7 +904,7 @@ static int intel_i810_insert_entries(agp_memory * mem, off_t pg_start,
if ((type == AGP_DCACHE_MEMORY) &&
(mem->type == AGP_DCACHE_MEMORY)) {
/* special insert */
CACHE_FLUSH();
for (i = pg_start;
i < (pg_start + mem->page_count); i++) {
OUTREG32(intel_i810_private.registers,
......@@ -904,20 +912,24 @@ static int intel_i810_insert_entries(agp_memory * mem, off_t pg_start,
(i * 4096) | I810_PTE_LOCAL |
I810_PTE_VALID);
}
CACHE_FLUSH();
agp_bridge.tlb_flush(mem);
return 0;
}
if((type == AGP_PHYS_MEMORY) &&
(mem->type == AGP_PHYS_MEMORY)) {
goto insert;
}
return -EINVAL;
}
if (mem->is_flushed == FALSE) {
CACHE_FLUSH();
mem->is_flushed = TRUE;
}
insert:
CACHE_FLUSH();
for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
OUTREG32(intel_i810_private.registers,
I810_PTE_BASE + (j * 4), mem->memory[i]);
}
CACHE_FLUSH();
agp_bridge.tlb_flush(mem);
return 0;
......@@ -955,15 +967,55 @@ static agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
new->page_count = pg_count;
new->num_scratch_pages = 0;
vfree(new->memory);
MOD_INC_USE_COUNT;
return new;
}
if(type == AGP_PHYS_MEMORY) {
/* The I810 requires a physical address to program
* it's mouse pointer into hardware. However the
* Xserver still writes to it through the agp
* aperture
*/
if (pg_count != 1) {
return NULL;
}
new = agp_create_memory(1);
if (new == NULL) {
return NULL;
}
MOD_INC_USE_COUNT;
new->memory[0] = agp_alloc_page();
if (new->memory[0] == 0) {
/* Free this structure */
agp_free_memory(new);
return NULL;
}
new->memory[0] =
agp_bridge.mask_memory(
virt_to_phys((void *) new->memory[0]),
type);
new->page_count = 1;
new->num_scratch_pages = 1;
new->type = AGP_PHYS_MEMORY;
new->physical = virt_to_phys((void *) new->memory[0]);
return new;
}
return NULL;
}
static void intel_i810_free_by_type(agp_memory * curr)
{
agp_free_key(curr->key);
if(curr->type == AGP_PHYS_MEMORY) {
agp_destroy_page((unsigned long)
phys_to_virt(curr->memory[0]));
vfree(curr->memory);
}
kfree(curr);
MOD_DEC_USE_COUNT;
}
static unsigned long intel_i810_mask_memory(unsigned long addr, int type)
......@@ -1916,7 +1968,7 @@ static struct agp_max_table maxes_table[9] =
static int agp_find_max(void)
{
long memory, t, index, result;
long memory, index, result;
memory = virt_to_phys(high_memory) >> 20;
index = 1;
......@@ -1926,16 +1978,15 @@ static int agp_find_max(void)
index++;
}
t = (memory - maxes_table[index - 1].mem) /
(maxes_table[index].mem - maxes_table[index - 1].mem);
result = maxes_table[index - 1].agp +
(t * (maxes_table[index].agp - maxes_table[index - 1].agp));
( (memory - maxes_table[index - 1].mem) *
(maxes_table[index].agp - maxes_table[index - 1].agp)) /
(maxes_table[index].mem - maxes_table[index - 1].mem);
printk(KERN_INFO "agpgart: Maximum main memory to use "
"for agp memory: %ldM\n", result);
result = result << (20 - PAGE_SHIFT);
return result;
return result;
}
#define AGPGART_VERSION_MAJOR 0
......
......@@ -298,7 +298,7 @@ static agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type)
agp_memory *memory;
memory = agp_allocate_memory(pg_count, type);
printk("memory : %p\n", memory);
if (memory == NULL) {
return NULL;
}
......@@ -911,6 +911,7 @@ static int agpioc_allocate_wrap(agp_file_private * priv, unsigned long arg)
return -ENOMEM;
}
alloc.key = memory->key;
alloc.physical = memory->physical;
if (copy_to_user((void *) arg, &alloc, sizeof(agp_allocate))) {
agp_free_memory_wrap(memory);
......
......@@ -103,10 +103,6 @@ static inline int copy_from_user(void *to,const void *from, int c)
#include "generic_serial.h"
#ifndef MODULE
extern void my_hd (unsigned char *ptr, int n);
#endif
static char * tmp_buf;
static DECLARE_MUTEX(tmp_buf_sem);
......@@ -119,8 +115,8 @@ int gs_debug = 0;
#define gs_dprintk(f, str...) /* nothing */
#endif
#define func_enter() gs_dprintk (SX_DEBUG_FLOW, "gs: enter " __FUNCTION__ "\n")
#define func_exit() gs_dprintk (SX_DEBUG_FLOW, "gs: exit " __FUNCTION__ "\n")
#define func_enter() gs_dprintk (GS_DEBUG_FLOW, "gs: enter " __FUNCTION__ "\n")
#define func_exit() gs_dprintk (GS_DEBUG_FLOW, "gs: exit " __FUNCTION__ "\n")
......@@ -856,7 +852,6 @@ void gs_set_termios (struct tty_struct * tty,
if (gs_debug & GS_DEBUG_TERMIOS) {
gs_dprintk (GS_DEBUG_TERMIOS, "termios structure (%p):\n", tiosp);
my_hd ((unsigned char *)tiosp, sizeof (struct termios));
}
#if 0
......
......@@ -12,6 +12,8 @@
#ifndef GENERIC_SERIAL_H
#define GENERIC_SERIAL_H
#define RS_EVENT_WRITE_WAKEUP 0
struct real_driver {
void (*disable_tx_interrupts) (void *);
void (*enable_tx_interrupts) (void *);
......@@ -75,6 +77,7 @@ struct gs_port {
#define GS_DEBUG_TERMIOS 0x00000004
#define GS_DEBUG_STUFF 0x00000008
#define GS_DEBUG_CLOSE 0x00000010
#define GS_DEBUG_FLOW 0x00000020
void gs_put_char(struct tty_struct *tty, unsigned char ch);
......
This diff is collapsed.
......@@ -43,6 +43,7 @@
#include <linux/tty.h>
#include <linux/interrupt.h>
#include <linux/serial.h>
#include <linux/serialP.h>
#include <linux/string.h>
#include <linux/fcntl.h>
#include <linux/ptrace.h>
......@@ -57,6 +58,8 @@
#include <asm/segment.h>
#include <asm/bitops.h>
#include <asm/mvme16xhw.h>
#include <asm/bootinfo.h>
#include <asm/setup.h>
#include <linux/types.h>
#include <linux/kernel.h>
......@@ -144,7 +147,7 @@ static struct termios *serial_termios_locked[NR_PORTS];
* memory if large numbers of serial ports are open.
*/
static unsigned char *tmp_buf = 0;
static struct semaphore tmp_buf_sem = MUTEX;
DECLARE_MUTEX(tmp_buf_sem);
/*
* This is used to look up the divisor speeds and the timeouts
......@@ -2501,8 +2504,8 @@ scrn[1] = '\0';
info->tqueue.data = info;
info->callout_termios =cy_callout_driver.init_termios;
info->normal_termios = cy_serial_driver.init_termios;
info->open_wait = 0;
info->close_wait = 0;
init_waitqueue_head(&info->open_wait);
init_waitqueue_head(&info->close_wait);
/* info->session */
/* info->pgrp */
/*** !!!!!!!! this may expose new bugs !!!!!!!!! *********/
......@@ -2728,7 +2731,7 @@ void console_setup(char *str, int *ints)
* that serial167_init() doesn't leave the chip non-functional.
*/
void serial167_write(struct console *co, const char *str, unsigned count)
void serial167_console_write(struct console *co, const char *str, unsigned count)
{
volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
unsigned long flags;
......@@ -2788,6 +2791,95 @@ void serial167_write(struct console *co, const char *str, unsigned count)
restore_flags(flags);
}
/* This is a hack; if there are multiple chars waiting in the chip we
* discard all but the last one, and return that. The cd2401 is not really
* designed to be driven in polled mode.
*/
int serial167_console_wait_key(struct console *co)
{
volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
unsigned long flags;
volatile u_char sink;
u_char ier;
int port;
int keypress = 0;
save_flags(flags); cli();
/* Ensure receiver is enabled! */
port = 0;
base_addr[CyCAR] = (u_char)port;
while (base_addr[CyCCR])
;
base_addr[CyCCR] = CyENB_RCVR;
ier = base_addr[CyIER];
base_addr[CyIER] = CyRxData;
while (!keypress) {
if (pcc2chip[PccSCCRICR] & 0x20)
{
/* We have an Rx int. Acknowledge it */
sink = pcc2chip[PccRPIACKR];
if ((base_addr[CyLICR] >> 2) == port) {
int cnt = base_addr[CyRFOC];
while (cnt-- > 0)
{
keypress = base_addr[CyRDR];
}
base_addr[CyREOIR] = 0;
}
else
base_addr[CyREOIR] = CyNOTRANS;
}
}
base_addr[CyIER] = ier;
restore_flags(flags);
return keypress;
}
static kdev_t serial167_console_device(struct console *c)
{
return MKDEV(TTY_MAJOR, 64 + c->index);
}
static int __init serial167_console_setup(struct console *co, char *options)
{
return 0;
}
static struct console sercons = {
"ttyS",
serial167_console_write,
NULL,
serial167_console_device,
serial167_console_wait_key,
NULL,
serial167_console_setup,
CON_PRINTBUFFER,
-1,
0,
NULL
};
void __init serial167_console_init(void)
{
if (vme_brdtype == VME_TYPE_MVME166 ||
vme_brdtype == VME_TYPE_MVME167 ||
vme_brdtype == VME_TYPE_MVME177) {
mvme167_serial_console_setup(0);
register_console(&sercons);
}
}
#ifdef CONFIG_REMOTE_DEBUG
void putDebugChar (int c)
{
......
......@@ -128,6 +128,14 @@ static int tty_fasync(int fd, struct file * filp, int on);
#ifdef CONFIG_SX
extern int sx_init (void);
#endif
#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
extern int vme_scc_init (void);
extern long vme_scc_console_init(void);
#endif
#ifdef CONFIG_SERIAL167
extern int serial167_init(void);
extern long serial167_console_init(void);
#endif
#ifdef CONFIG_8xx
extern console_8xx_init(void);
extern int rs_8xx_init(void);
......@@ -2090,9 +2098,15 @@ void __init console_init(void)
#ifdef CONFIG_SERIAL_CONSOLE
#ifdef CONFIG_8xx
console_8xx_init();
#else
#elif defined(CONFIG_SERIAL)
serial_console_init();
#endif /* CONFIG_8xx */
#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
vme_scc_console_init();
#endif
#if defined(CONFIG_SERIAL167)
serial167_console_init();
#endif
#endif
}
......@@ -2176,6 +2190,9 @@ void __init tty_init(void)
#ifdef CONFIG_SERIAL
rs_init();
#endif
#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
vme_scc_init();
#endif
#ifdef CONFIG_COMPUTONE
ip2_init();
#endif
......@@ -2185,7 +2202,7 @@ void __init tty_init(void)
#ifdef CONFIG_ROCKETPORT
rp_init();
#endif
#ifdef CONFIG_MVME16x
#ifdef CONFIG_SERIAL167
serial167_init();
#endif
#ifdef CONFIG_CYCLADES
......
This diff is collapsed.
......@@ -8,22 +8,22 @@ tristate 'I2C support' CONFIG_I2C
if [ "$CONFIG_I2C" != "n" ]; then
dep_tristate 'I2C bit-banging interfaces' CONFIG_I2C_ALGOBIT $CONFIG_I2C
if [ "$CONFIG_I2C_ALGOBIT" != "n" ]; then
dep_tristate ' Philips style parallel port adapter' CONFIG_I2C_PHILIPSPAR $CONFIG_I2C_ALGOBIT
dep_tristate ' ELV adapter' CONFIG_I2C_ELV $CONFIG_I2C_ALGOBIT
dep_tristate ' Velleman K9000 adapter' CONFIG_I2C_VELLEMAN $CONFIG_I2C_ALGOBIT
fi
dep_tristate 'I2C bit-banging interfaces' CONFIG_I2C_ALGOBIT $CONFIG_I2C
if [ "$CONFIG_I2C_ALGOBIT" != "n" ]; then
dep_tristate ' Philips style parallel port adapter' CONFIG_I2C_PHILIPSPAR $CONFIG_I2C_ALGOBIT
dep_tristate ' ELV adapter' CONFIG_I2C_ELV $CONFIG_I2C_ALGOBIT
dep_tristate ' Velleman K9000 adapter' CONFIG_I2C_VELLEMAN $CONFIG_I2C_ALGOBIT
fi
dep_tristate 'I2C PCF 8584 interfaces' CONFIG_I2C_ALGOPCF $CONFIG_I2C
if [ "$CONFIG_I2C_ALGOPCF" != "n" ]; then
dep_tristate ' Elektor ISA card' CONFIG_I2C_ELEKTOR $CONFIG_I2C_ALGOPCF
fi
dep_tristate 'I2C PCF 8584 interfaces' CONFIG_I2C_ALGOPCF $CONFIG_I2C
if [ "$CONFIG_I2C_ALGOPCF" != "n" ]; then
dep_tristate ' Elektor ISA card' CONFIG_I2C_ELEKTOR $CONFIG_I2C_ALGOPCF
fi
# This is needed for automatic patch generation: sensors code starts here
# This is needed for automatic patch generation: sensors code ends here
dep_tristate 'I2C device interface' CONFIG_I2C_CHARDEV $CONFIG_I2C
dep_tristate 'I2C device interface' CONFIG_I2C_CHARDEV $CONFIG_I2C
fi
endmenu
This diff is collapsed.
This diff is collapsed.
......@@ -22,7 +22,7 @@
/* With some changes from Kysti Mlkki <kmalkki@cc.hut.fi> and even
Frodo Looijaard <frodol@dds.nl> */
/* $Id: i2c-elektor.c,v 1.13 1999/12/21 23:45:58 frodo Exp $ */
/* $Id: i2c-elektor.c,v 1.16 2000/01/24 02:06:33 mds Exp $ */
#include <linux/kernel.h>
#include <linux/ioport.h>
......@@ -30,24 +30,10 @@
#include <linux/delay.h>
#include <linux/malloc.h>
#include <linux/version.h>
#if LINUX_VERSION_CODE >= 0x020135
#include <linux/init.h>
#else
#define __init
#endif
#include <asm/irq.h>
#include <asm/io.h>
/* 2.0.0 kernel compatibility */
#if LINUX_VERSION_CODE < 0x020100
#define MODULE_AUTHOR(noone)
#define MODULE_DESCRIPTION(none)
#define MODULE_PARM(no,param)
#define MODULE_PARM_DESC(no,description)
#define EXPORT_SYMBOL(noexport)
#define EXPORT_NO_SYMBOLS
#endif
#include <linux/i2c.h>
#include <linux/i2c-algo-pcf.h>
#include <linux/i2c-elektor.h>
......@@ -87,56 +73,48 @@ static int pcf_pending;
static void pcf_isa_setbyte(void *data, int ctl, int val)
{
if (ctl) {
if (gpi.pi_irq > 0) {
DEB3(printk("i2c-elektor.o: Write control 0x%x\n", val|I2C_PCF_ENI));
outb(val | I2C_PCF_ENI, CTRL);
} else {
DEB3(printk("i2c-elektor.o: Write control 0x%x\n", val));
outb(val, CTRL);
}
} else {
DEB3(printk("i2c-elektor.o: Write data 0x%x\n", val));
outb(val, DATA);
}
if (ctl) {
if (gpi.pi_irq > 0) {
DEB3(printk("i2c-elektor.o: Write control 0x%x\n",
val|I2C_PCF_ENI));
outb(val | I2C_PCF_ENI, CTRL);
} else {
DEB3(printk("i2c-elektor.o: Write control 0x%x\n", val));
outb(val, CTRL);
}
} else {
DEB3(printk("i2c-elektor.o: Write data 0x%x\n", val));
outb(val, DATA);
}
}
static int pcf_isa_getbyte(void *data, int ctl)
{
int val;
if (ctl) {
val = inb(CTRL);
DEB3(printk("i2c-elektor.o: Read control 0x%x\n", val));
} else {
val = inb(DATA);
DEB3(printk("i2c-elektor.o: Read data 0x%x\n", val));
}
return (val);
int val;
if (ctl) {
val = inb(CTRL);
DEB3(printk("i2c-elektor.o: Read control 0x%x\n", val));
} else {
val = inb(DATA);
DEB3(printk("i2c-elektor.o: Read data 0x%x\n", val));
}
return (val);
}
static int pcf_isa_getown(void *data)
{
return (gpi.pi_own);
return (gpi.pi_own);
}
static int pcf_isa_getclock(void *data)
{
return (gpi.pi_clock);
return (gpi.pi_clock);
}
#if LINUX_VERSION_CODE < 0x02017f
static void schedule_timeout(int j)
{
current->state = TASK_INTERRUPTIBLE;
current->timeout = jiffies + j;
schedule();
}
#endif
#if 0
static void pcf_isa_sleep(unsigned long timeout)
{
......@@ -147,64 +125,53 @@ static void pcf_isa_sleep(unsigned long timeout)
static void pcf_isa_waitforpin(void) {
int timeout = 2;
if (gpi.pi_irq > 0) {
cli();
if (pcf_pending == 0) {
#if LINUX_VERSION_CODE < 0x02017f
current->timeout = jiffies + timeout * HZ;
interruptible_sleep_on(&pcf_wait);
#else
interruptible_sleep_on_timeout(&pcf_wait, timeout*HZ );
#endif
}
else
pcf_pending = 0;
sti();
#if LINUX_VERSION_CODE < 0x02017f
current->timeout = 0;
#endif
}
else {
udelay(100);
}
int timeout = 2;
if (gpi.pi_irq > 0) {
cli();
if (pcf_pending == 0) {
interruptible_sleep_on_timeout(&pcf_wait, timeout*HZ );
} else
pcf_pending = 0;
sti();
} else {
udelay(100);
}
}
static void pcf_isa_handler(int this_irq, void *dev_id, struct pt_regs *regs) {
pcf_pending = 1;
wake_up_interruptible(&pcf_wait);
pcf_pending = 1;
wake_up_interruptible(&pcf_wait);
}
static int pcf_isa_init(void)
{
if (check_region(gpi.pi_base, 2) < 0 ) {
return -ENODEV;
} else {
request_region(gpi.pi_base, 2, "i2c (isa bus adapter)");
}
if (gpi.pi_irq > 0) {
if (request_irq(gpi.pi_irq, pcf_isa_handler, 0, "PCF8584", 0) < 0) {
printk("i2c-elektor.o: Request irq%d failed\n", gpi.pi_irq);
gpi.pi_irq = 0;
}
else
enable_irq(gpi.pi_irq);
}
return 0;
if (check_region(gpi.pi_base, 2) < 0 ) {
return -ENODEV;
} else {
request_region(gpi.pi_base, 2, "i2c (isa bus adapter)");
}
if (gpi.pi_irq > 0) {
if (request_irq(gpi.pi_irq, pcf_isa_handler, 0, "PCF8584", 0)
< 0) {
printk("i2c-elektor.o: Request irq%d failed\n", gpi.pi_irq);
gpi.pi_irq = 0;
} else
enable_irq(gpi.pi_irq);
}
return 0;
}
static void pcf_isa_exit(void)
{
if (gpi.pi_irq > 0) {
disable_irq(gpi.pi_irq);
free_irq(gpi.pi_irq, 0);
}
release_region(gpi.pi_base , 2);
if (gpi.pi_irq > 0) {
disable_irq(gpi.pi_irq);
free_irq(gpi.pi_irq, 0);
}
release_region(gpi.pi_base , 2);
}
......@@ -222,14 +189,14 @@ static int pcf_isa_unreg(struct i2c_client *client)
static void pcf_isa_inc_use(struct i2c_adapter *adap)
{
#ifdef MODULE
MOD_INC_USE_COUNT;
MOD_INC_USE_COUNT;
#endif
}
static void pcf_isa_dec_use(struct i2c_adapter *adap)
{
#ifdef MODULE
MOD_DEC_USE_COUNT;
MOD_DEC_USE_COUNT;
#endif
}
......@@ -262,41 +229,41 @@ static struct i2c_adapter pcf_isa_ops = {
int __init i2c_pcfisa_init(void)
{
struct i2c_pcf_isa *pisa = &gpi;
struct i2c_pcf_isa *pisa = &gpi;
printk("i2c-elektor.o: i2c pcf8584-isa adapter module\n");
if (base == 0)
pisa->pi_base = DEFAULT_BASE;
else
pisa->pi_base = base;
printk("i2c-elektor.o: i2c pcf8584-isa adapter module\n");
if (base == 0)
pisa->pi_base = DEFAULT_BASE;
else
pisa->pi_base = base;
if (irq == 0)
pisa->pi_irq = DEFAULT_IRQ;
else
pisa->pi_irq = irq;
if (irq == 0)
pisa->pi_irq = DEFAULT_IRQ;
else
pisa->pi_irq = irq;
if (clock == 0)
pisa->pi_clock = DEFAULT_CLOCK;
else
pisa->pi_clock = clock;
if (clock == 0)
pisa->pi_clock = DEFAULT_CLOCK;
else
pisa->pi_clock = clock;
if (own == 0)
pisa->pi_own = DEFAULT_OWN;
else
pisa->pi_own = own;
if (own == 0)
pisa->pi_own = DEFAULT_OWN;
else
pisa->pi_own = own;
pcf_isa_data.data = (void *)pisa;
pcf_isa_data.data = (void *)pisa;
#if (LINUX_VERSION_CODE >= 0x020301)
init_waitqueue_head(&pcf_wait);
init_waitqueue_head(&pcf_wait);
#endif
if (pcf_isa_init() == 0) {
if (i2c_pcf_add_bus(&pcf_isa_ops) < 0)
return -ENODEV;
} else {
return -ENODEV;
}
printk("i2c-elektor.o: found device at %#x.\n", pisa->pi_base);
return 0;
if (pcf_isa_init() == 0) {
if (i2c_pcf_add_bus(&pcf_isa_ops) < 0)
return -ENODEV;
} else {
return -ENODEV;
}
printk("i2c-elektor.o: found device at %#x.\n", pisa->pi_base);
return 0;
}
......@@ -313,7 +280,7 @@ MODULE_PARM(own, "i");
int init_module(void)
{
return i2c_pcfisa_init();
return i2c_pcfisa_init();
}
void cleanup_module(void)
......
......@@ -21,20 +21,20 @@
/* With some changes from Frodo Looijaard <frodol@dds.nl> */
/* $Id: i2c-pcf8584.h,v 1.2 1999/12/21 23:45:58 frodo Exp $ */
/* $Id: i2c-pcf8584.h,v 1.3 2000/01/18 23:54:07 frodo Exp $ */
#ifndef I2C_PCF8584_H
#define I2C_PCF8584_H 1
/* ----- Control register bits ---------------------------------------- */
#define I2C_PCF_PIN 0x80
#define I2C_PCF_ESO 0x40
#define I2C_PCF_ES1 0x20
#define I2C_PCF_ES2 0x10
#define I2C_PCF_ENI 0x08
#define I2C_PCF_STA 0x04
#define I2C_PCF_STO 0x02
#define I2C_PCF_ACK 0x01
#define I2C_PCF_PIN 0x80
#define I2C_PCF_ESO 0x40
#define I2C_PCF_ES1 0x20
#define I2C_PCF_ES2 0x10
#define I2C_PCF_ENI 0x08
#define I2C_PCF_STA 0x04
#define I2C_PCF_STO 0x02
#define I2C_PCF_ACK 0x01
#define I2C_PCF_START (I2C_PCF_PIN | I2C_PCF_ESO | I2C_PCF_STA | I2C_PCF_ACK)
#define I2C_PCF_STOP (I2C_PCF_PIN | I2C_PCF_ESO | I2C_PCF_STO | I2C_PCF_ACK)
......@@ -45,7 +45,7 @@
/*#define I2C_PCF_PIN 0x80 as above*/
#define I2C_PCF_INI 0x40 /* 1 if not initialized */
#define I2C_PCF_STS 0x20
#define I2C_PCF_STS 0x20
#define I2C_PCF_BER 0x10
#define I2C_PCF_AD0 0x08
#define I2C_PCF_LRB 0x08
......@@ -54,17 +54,17 @@
#define I2C_PCF_BB 0x01
/* ----- Chip clock frequencies --------------------------------------- */
#define I2C_PCF_CLK3 0x00
#define I2C_PCF_CLK443 0x10
#define I2C_PCF_CLK6 0x14
#define I2C_PCF_CLK8 0x18
#define I2C_PCF_CLK12 0x1c
#define I2C_PCF_CLK3 0x00
#define I2C_PCF_CLK443 0x10
#define I2C_PCF_CLK6 0x14
#define I2C_PCF_CLK 0x18
#define I2C_PCF_CLK12 0x1c
/* ----- transmission frequencies ------------------------------------- */
#define I2C_PCF_TRNS90 0x00 /* 90 kHz */
#define I2C_PCF_TRNS45 0x01 /* 45 kHz */
#define I2C_PCF_TRNS11 0x02 /* 11 kHz */
#define I2C_PCF_TRNS15 0x03 /* 1.5 kHz */
#define I2C_PCF_TRNS90 0x00 /* 90 kHz */
#define I2C_PCF_TRNS45 0x01 /* 45 kHz */
#define I2C_PCF_TRNS11 0x02 /* 11 kHz */
#define I2C_PCF_TRNS15 0x03 /* 1.5 kHz */
/* ----- Access to internal registers according to ES1,ES2 ------------ */
......
......@@ -39,6 +39,7 @@ EXPORT_SYMBOL(hpsb_make_readqpacket);
EXPORT_SYMBOL(hpsb_make_readbpacket);
EXPORT_SYMBOL(hpsb_make_writeqpacket);
EXPORT_SYMBOL(hpsb_make_writebpacket);
EXPORT_SYMBOL(hpsb_make_lockpacket);
EXPORT_SYMBOL(hpsb_read);
EXPORT_SYMBOL(hpsb_write);
EXPORT_SYMBOL(hpsb_lock);
......
......@@ -329,6 +329,30 @@ struct hpsb_packet *hpsb_make_writebpacket(struct hpsb_host *host,
return p;
}
struct hpsb_packet *hpsb_make_lockpacket(struct hpsb_host *host, nodeid_t node,
u64 addr, int extcode)
{
struct hpsb_packet *p;
p = alloc_hpsb_packet(8);
if (!p) return NULL;
p->host = host;
p->tlabel = get_tlabel(host, node, 1);
p->node_id = node;
switch (extcode) {
case EXTCODE_FETCH_ADD:
case EXTCODE_LITTLE_ADD:
fill_async_lock(p, addr, extcode, 4);
break;
default:
fill_async_lock(p, addr, extcode, 8);
break;
}
return p;
}
/*
* FIXME - these functions should probably read from / write to user space to
......
......@@ -39,6 +39,9 @@ struct hpsb_packet *hpsb_make_writeqpacket(struct hpsb_host *host,
struct hpsb_packet *hpsb_make_writebpacket(struct hpsb_host *host,
nodeid_t node, u64 addr,
size_t length);
struct hpsb_packet *hpsb_make_lockpacket(struct hpsb_host *host, nodeid_t node,
u64 addr, int extcode);
/*
* hpsb_packet_success - Make sense of the ack and reply codes and
......
This diff is collapsed.
......@@ -20,9 +20,15 @@
#define MAX_OHCI1394_CARDS 4
#define AR_RESP_BUF_SIZE 4096
#define AR_RESP_PRG_SIZE 256
#define AT_REQ_PRG_SIZE 256
#define OHCI1394_MAX_AT_REQ_RETRIES 1
#define OHCI1394_MAX_AT_RESP_RETRIES 1
#define OHCI1394_MAX_PHYS_RESP_RETRIES 4
#define AR_RESP_NUM_DESC 4 /* number of AR resp descriptors */
#define AR_RESP_BUF_SIZE 4096 /* size of AR resp buffers */
#define AR_RESP_SPLIT_PACKET_BUF_SIZE 256 /* split packet buffer */
#define AR_RESP_TOTAL_BUF_SIZE (AR_RESP_BUF_SIZE * AR_RESP_NUM_DESC)
#define AT_REQ_PRG_SIZE 256
#define IR_RECV_BUF_SIZE 4096 /* 4096 bytes/buffer */
#define IR_SPLIT_PACKET_BUF_SIZE 8192 /* size of buffer for split packets */
......@@ -49,8 +55,18 @@ struct ti_ohci {
quadlet_t *csr_config_rom; /* buffer for csr config rom */
/* asynchronous receive */
struct dma_cmd *AR_resp_prg;
quadlet_t *AR_resp_buf;
struct dma_cmd **AR_resp_prg;
quadlet_t **AR_resp_buf;
unsigned int AR_resp_buf_bh_ind;
unsigned int AR_resp_buf_bh_offset;
unsigned int AR_resp_buf_th_ind;
unsigned int AR_resp_buf_th_offset;
int AR_resp_bytes_left;
quadlet_t *AR_resp_spb;
spinlock_t AR_resp_lock;
/* async receive task */
struct tq_struct AR_resp_pdl_task;
/* asynchronous transmit */
struct dma_cmd *AT_req_prg;
......
......@@ -495,8 +495,8 @@ static int handle_local_request(struct file_info *fi,
if (req->req.length == 8) {
req->req.error = highlevel_lock(fi->host, req->data,
addr, req->data[0],
req->data[1],
addr, req->data[1],
req->data[0],
req->req.misc);
req->req.length = 4;
} else {
......@@ -567,6 +567,32 @@ static int handle_remote_request(struct file_info *fi,
break;
case RAW1394_REQ_LOCK:
if ((req->req.misc != EXTCODE_FETCH_ADD)
&& (req->req.misc != EXTCODE_LITTLE_ADD)) {
if (req->req.length != 4) {
req->req.error = RAW1394_ERROR_INVALID_ARG;
break;
}
} else {
if (req->req.length != 8) {
req->req.error = RAW1394_ERROR_INVALID_ARG;
break;
}
}
packet = hpsb_make_lockpacket(fi->host, node, addr,
req->req.misc);
if (!packet) return -ENOMEM;
if (copy_from_user(packet->data, req->req.sendb,
req->req.length)) {
req->req.error = RAW1394_ERROR_MEMFAULT;
break;
}
req->req.length = 4;
break;
case RAW1394_REQ_LOCK64:
default:
req->req.error = RAW1394_ERROR_STATE_ORDER;
......
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.
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