Commit e19d7734 authored by Linus Torvalds's avatar Linus Torvalds

Import 2.1.112pre2

parent 17c19e02
......@@ -5983,18 +5983,6 @@ CONFIG_ISP16_CDI
The module will be called isp16.o. If you want to compile it as a
module, say M here and read Documentation/modules.txt.
Preload dcache
CONFIG_DCACHE_PRELOAD
Preloading will create dcache entries when a directory is scanned
(e.g. because the ls command was used) for the *first* time. This
should speed up successive lookups of information about files in
that directory, but can also consume large amounts of memory.
Please report speedups (or slowdowns due to the memory usage if they
occur) to schoebel@informatik.uni-stuttgart.de .
If unsure, say N.
Quota support
CONFIG_QUOTA
If you say Y here, you will be able to set per user limits for disk
......@@ -6005,173 +5993,6 @@ CONFIG_QUOTA
ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/mini. Probably the quota
support is only useful for multi user systems. If unsure, say N.
Online mirror support
CONFIG_OMIRR
omirr is a package for _symmetric_ mirroring of files over the
Internet. In contrast to rdist, the online mirror daemon (omirrd) is
running all the time and transfers any changes on the file system as
soon as possible to all other servers. Symmetric means that all
servers have equal rights in changing a file: the last changer of a
file will win. This is the same behaviour as multiple processes
operating on a global file system. In effect, omirr can do the same
as NFS mounts, but will have better performance since the data is
stored on local disks. In contrast to a cache filesystem which has a
dedicated master copy, broken connections and/or servers are no
problem for continuing work on the remaining ones, because there is
no master copy. Every computer that wants to participate in the
mirroring needs to run the daemon omirrd, contained in the omirr
package which is available via FTP (user: anonymous) from
ftp://ftp.isa.de/pub/home/luik. You must say Y if you want to use
in.omirrd, but you should (but need not) say N if you don't (for
performance reasons).
Note that this is experimental code; use at your own risk.
Filename translation support
CONFIG_TRANS_NAMES
This is a useful feature if you have a pool of diskless Linux
clients which mount their root filesystems from a central
server. Depending on their hostnames, the clients can then see
different versions of certain files, which keeps maintenance at a
minimum when used for configuration files. The kernel running on the
clients should have this option enabled. If you don't administer a
pool of Linux clients, say N here, otherwise read on:
When you say Y here, filenames, directory names etc become
context-sensitive. If you have a file named
"/etc/config#host=banana#", it will appear (by default) as
hardlinked to "/etc/config" on host "banana", while on host "mango"
another file "/etc/config#host=mango#" will appear as having been
hardlinked to "/etc/config".
This default behaviour can be changed by setting the _first_
environment variable NAMETRANS to a colon-separated list of suffixes
which are tried in the specified order. For example, in
'env - NAMETRANS=#host=mango#:#ktype=diskless# "`env`" command ...'
the command will see the same files as if it had been executed on
host "mango" with a diskless kernel.
Using NAMETRANS supersedes _all_ default translations. Thus
translations can be completely switched off with an empty list,
e.g.
'env - NAMETRANS= "`env`" command ...'
Note that some system utilities like tar, dump, restore should be
used with translation switched off, in order to avoid doubled space
in archive files and when extracting from them. Also, make sure that
nfsd, mountd (and similar ones like samba daemons) run without
translation, in order to avoid doubled (or even wrong) translation
at the server and at the client.
You can automatically force the creation of context-dependent
filenames if there exists a template filename like
"/etc/mtab#host=CREATE#". As soon as a process running on "mango"
tries to create a file "/etc/mtab", the version
"/etc/mtab#host=mango#" is created instead (which appears in turn as
hardlinked to "/etc/mtab"). Note that if you want to make
"/etc/fstab" context-dependent, you should execute "touch
/etc/mtab#host=CREATE#" and "touch /etc/mtab.tmp#host=CREATE#",
because mount, umount and others running on different hosts would
otherwise try to create one shared /etc/mtab which would result in a
clash. Also one should execute "touch /etc/nologin#host=CREATE#" to
prevent global side effects from shutdown resp. runlevel.
Please read Documentation/transname.txt if you intend to say Y here.
Restrict translation to gid
CONFIG_TRANS_RESTRICT
If you say Y here, default filename translations are carried out
only if the parent directory of the context-sensitive file belongs
to a specific group id (gid). Trying to translate names everywhere
will decrease performance of file openings. Normally translations
are used only in system configuration files but not in ordinary user
file space. So you should change the gid of directories containing
context-dependent files to some special group like "adm" (group id
4) and enable this option. As a result, users will not notice any
performance degradation resulting from filename translation.
Note that translations resulting from the first environment variable
"NAMETRANS=..." are always carried out regardless of the gid of
directories.
Beware: before turning on this option make sure that all directories
containing context-dependent files belong to the special group, or
system initialization may fail. If unsure, select N.
Group id (gid) for translation restriction
CONFIG_TRANS_GID
Default name translations will be carried out only inside directories
belonging to the group id (gid) that you specify here.
Default is 4 (group "adm").
Nodename (hostname) translation
CONFIG_TR_NODENAME
Enables translation of name suffixes like in
"/etc/config#host=banana#". The syntax is
<filename>#host=<hostname>#. The hostname can be queried with the
command "uname -n". Normally this option is used heavily when
translation is enabled. If unsure, say Y.
Kernelname translation
CONFIG_TR_KERNNAME
Enables translation of name suffixes like in
"/etc/config#kname=default#". The string is hard compiled into the
kernel by the following option. Useful if your kernel does not know
the hostname at boot time, and there is no way to tell the hostname
by lilo or bootp. Please avoid using this option and prefer
"Nodename (hostname) translation" (CONFIG_TR_NODENAME) wherever
possible. When mounting the root over NFS, the own hostname must be
known at boot time anyway; this option is just for special use.
Note that the default translations are tried in the order as
occurring in the configuration, that is 1) host 2) kname 3) ktype 4)
machine 5) system. If unsure, say Y.
String for kernelname translation
CONFIG_KERNNAME
Enter the string you want to compile into the kernel. The string
will be used as context in context-dependent files like
"/etc/config#kname=<string>#".
Kerneltype translation
CONFIG_TR_KERNTYPE
Enables translation of name suffixes like in
"/etc/config#ktype=default#". The syntax is
<filename>#ktype=<string>#. The string is hard compiled in the
kernel by the following option. Use if you want to create different
kernels with different behaviour. For example, use the string
"default" on your server, and use "diskless" on all your diskless
clients (and perhaps "dataless" on dataless clients). This way you
can avoid dozens of "config#host=<something># with same contents and
you have no effort when new machines are added. If unsure, say Y.
String for kerneltype translation
CONFIG_KERNTYPE
Enter the string you want to compile into the kernel. The string
will be used as context in context-dependent files like
"/etc/config#ktype=default#". If your kernel is to be used on a
server, you probably can use "default" here. If your kernel is
intended for a diskless client, you probably should enter "diskless"
here.
Machine type translation
CONFIG_TR_MACHINE
Enables translation of name suffixes like in
"/etc/config#machine=i486#". The syntax is
<filename>#machine=<id>#. The machine types can be queried with the
command "uname -m". Normally used only on multi-architecture
installations. If unsure, say Y.
System name translation
CONFIG_TR_SYSNAME
Enables translation of name suffixes like in
"/etc/config#system=Linux#". The syntax is
<filename>#system=<id>#. The system name can be queried with the
command "uname -s". Currently only supported by Linux, but hopefully
other operating systems will pick up the idea of context-dependent
translations. If unsure, say Y.
Minix fs support
CONFIG_MINIX_FS
Minix is a simple operating system used in many classes about
......
......@@ -310,6 +310,12 @@ M: Paul.Russell@rustcorp.com.au
W: http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html
S: Maintained
IP FIREWALL
P: Paul Russell
M: Paul.Russell@rustcorp.com.au
W: http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html
S: Maintained
IPX/SPX NETWORK LAYER
P: Jay Schulist
M: Jay Schulist <Jay.Schulist@spacs.k12.wi.us>
......@@ -325,6 +331,7 @@ S: Maintained
JOYSTICK DRIVER
P: Vojtech Pavlik
M: vojtech@atrey.karlin.mff.cuni.cz
W: http://atrey.karlin.mff.cuni.cz/~vojtech/joystick/
L: linux-joystick@atrey.karlin.mff.cuni.cz
S: Maintained
......@@ -563,6 +570,12 @@ M: Jay.Schulist@spacs.k12.wi.us
L: linux-net@vger.rutgers.edu
S: Supported
SPX NETWORK LAYER
P: Jay Schulist
M: Jay.Schulist@spacs.k12.wi.us
L: linux-net@vger.rutgers.edu
S: Supported
STALLION TECHNOLOGIES MULTIPORT SERIAL BOARDS
P: Greg Ungerer
M: support@stallion.oz.au
......
......@@ -340,7 +340,8 @@ clean: archclean
rm -f core `find . -name '.*.flags' -print`
rm -f vmlinux System.map
rm -f .tmp*
rm -f drivers/char/consolemap_deftbl.c drivers/char/conmakehash
rm -f drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c
rm -f drivers/char/conmakehash
rm -f drivers/sound/bin2hex drivers/sound/hex2hex
if [ -d modules ]; then \
rm -f core `find modules/ -type f -print`; \
......
......@@ -966,21 +966,6 @@ static void disable_level_ioapic_irq(unsigned int irq)
mask_IO_APIC_irq(irq);
}
/*
* Enter and exit the irq handler context..
*/
static inline void enter_ioapic_irq(int cpu)
{
hardirq_enter(cpu);
while (test_bit(0,&global_irq_lock)) barrier();
}
static inline void exit_ioapic_irq(int cpu)
{
hardirq_exit(cpu);
release_irqlock(cpu);
}
static void do_edge_ioapic_IRQ(unsigned int irq, int cpu, struct pt_regs * regs)
{
irq_desc_t *desc = irq_desc + irq;
......@@ -1014,7 +999,7 @@ static void do_edge_ioapic_IRQ(unsigned int irq, int cpu, struct pt_regs * regs)
if (!action)
return;
enter_ioapic_irq(cpu);
irq_enter(cpu, irq);
/*
* Edge triggered interrupts need to remember
......@@ -1035,7 +1020,7 @@ static void do_edge_ioapic_IRQ(unsigned int irq, int cpu, struct pt_regs * regs)
desc->status &= IRQ_DISABLED;
spin_unlock(&irq_controller_lock);
exit_ioapic_irq(cpu);
irq_exit(cpu, irq);
}
static void do_level_ioapic_IRQ (unsigned int irq, int cpu,
......@@ -1074,7 +1059,7 @@ static void do_level_ioapic_IRQ (unsigned int irq, int cpu,
if (!action)
return;
enter_ioapic_irq(cpu);
irq_enter(cpu, irq);
handle_IRQ_event(irq, regs);
......@@ -1084,7 +1069,7 @@ static void do_level_ioapic_IRQ (unsigned int irq, int cpu,
unmask_IO_APIC_irq(irq);
spin_unlock(&irq_controller_lock);
exit_ioapic_irq(cpu);
irq_exit(cpu, irq);
}
/*
......
......@@ -90,13 +90,34 @@ void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flag
void * addr;
struct vm_struct * area;
if (phys_addr < virt_to_phys(high_memory))
/*
* Don't remap the low PCI/ISA area, it's always mapped..
*/
if (phys_addr >= 0xA0000 && (phys_addr+size) <= 0x100000)
return phys_to_virt(phys_addr);
/*
* Don't allow anybody to remap normal RAM that we're using..
*/
if (phys_addr < virt_to_phys(high_memory))
return NULL;
/*
* Mappings have to be page-aligned
*/
if (phys_addr & ~PAGE_MASK)
return NULL;
size = PAGE_ALIGN(size);
/*
* Don't allow mappings that wrap..
*/
if (!size || size > phys_addr + size)
return NULL;
/*
* Ok, go for it..
*/
area = get_vm_area(size);
if (!area)
return NULL;
......
......@@ -188,7 +188,7 @@ static inline unsigned short *screenpos(int currcons, int offset, int viewed)
return p;
}
static inline void scrolldelta(int lines)
static void scrolldelta(int lines)
{
int currcons = fg_console;
......@@ -314,6 +314,8 @@ static u8 build_attr(int currcons, u8 _color, u8 _intensity, u8 _blink, u8 _unde
a ^= 0x80;
if (_intensity == 2)
a ^= 0x08;
if (hi_font_mask == 0x100)
a <<= 1;
return a;
}
#else
......@@ -339,17 +341,23 @@ void invert_screen(int currcons, int offset, int count, int viewed)
sw->con_invert_region(vc_cons[currcons].d, p, count);
#ifndef VT_BUF_VRAM_ONLY
else {
int col = can_do_color;
u16 *q = p;
int cnt = count;
while (cnt--) {
u16 a = *q;
if (col)
if (!can_do_color) {
while (cnt--) *q++ ^= 0x0800;
} else if (hi_font_mask == 0x100) {
while (cnt--) {
u16 a = *q;
a = ((a) & 0x11ff) | (((a) & 0xe000) >> 4) | (((a) & 0x0e00) << 4);
*q++ = a;
}
} else {
while (cnt--) {
u16 a = *q;
a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4);
else
a ^= 0x0800;
*q++ = a;
*q++ = a;
}
}
}
#endif
......@@ -436,9 +444,9 @@ static void add_softcursor(int currcons)
int i = scr_readw((u16 *) pos);
u32 type = cursor_type;
if (! (type & 0x10)) return;
if (softcursor_original != -1) return;
softcursor_original = i;
if (! (type & 0x10)) return;
i |= ((type >> 8) & 0xff00 );
i ^= ((type) & 0xff00 );
if ((type & 0x20) && ((softcursor_original & 0x7000) == (i & 0x7000))) i ^= 0x7000;
......@@ -450,6 +458,8 @@ static void add_softcursor(int currcons)
static void hide_cursor(int currcons)
{
if (currcons == sel_cons)
clear_selection();
if (softcursor_original != -1) {
scr_writew(softcursor_original,(u16 *) pos);
if (DO_UPDATE)
......@@ -464,6 +474,8 @@ void set_cursor(int currcons)
if (!IS_FG || console_blanked || vcmode == KD_GRAPHICS)
return;
if (deccm) {
if (currcons == sel_cons)
clear_selection();
add_softcursor(currcons);
if ((cursor_type & 0x0f) != 1)
sw->con_cursor(vc_cons[currcons].d,CM_DRAW);
......@@ -510,8 +522,6 @@ void update_screen(int new_console)
}
lock = 1;
clear_selection();
hide_cursor(currcons);
if (fg_console != new_console) {
display = vc_cons[new_console].d->vc_display_fg;
......@@ -552,6 +562,8 @@ void visual_init(int currcons)
sw = conswitchp;
cons_num = currcons;
display_fg = &master_display_fg;
vc_cons[currcons].d->vc_uni_pagedir_loc = &vc_cons[currcons].d->vc_uni_pagedir;
vc_cons[currcons].d->vc_uni_pagedir = 0;
hi_font_mask = 0;
complement_mask = 0;
sw->con_init(vc_cons[currcons].d, 1);
......@@ -591,6 +603,7 @@ int vc_allocate(unsigned int currcons, int init) /* return 0 on success */
vt_cons[currcons] = NULL;
return -ENOMEM;
}
con_set_default_unimap(currcons);
screenbuf = (unsigned short *) q;
kmalloced = 1;
screenbuf_size = video_screen_size;
......@@ -1667,14 +1680,10 @@ static void do_con_trol(struct tty_struct *tty, unsigned int currcons, int c)
/* DEC screen alignment test. kludge :-) */
video_erase_char =
(video_erase_char & 0xff00) | 'E';
/* Arno:
* Doesn't work, because csi_J(c,2)
* calls con_clear and doesn't print
* the erase char.. FIXME
*/
csi_J(currcons, 2);
video_erase_char =
(video_erase_char & 0xff00) | ' ';
do_update_region(currcons, origin, screenbuf_size/2);
}
return;
case ESsetG0:
......@@ -1755,10 +1764,6 @@ static int do_con_write(struct tty_struct * tty, int from_user,
if (IS_FG)
hide_cursor(currcons);
/* clear the selection */
if (currcons == sel_cons)
clear_selection();
disable_bh(CONSOLE_BH);
while (!tty->stopped && count) {
enable_bh(CONSOLE_BH);
......@@ -1825,11 +1830,11 @@ static int do_con_write(struct tty_struct * tty, int from_user,
if (vc_state == ESnormal && ok) {
/* Now try to find out how to display it */
tc = conv_uni_to_pc(tc);
tc = conv_uni_to_pc(vc_cons[currcons].d, tc);
if ( tc == -4 ) {
/* If we got -4 (not found) then see if we have
defined a replacement character (U+FFFD) */
tc = conv_uni_to_pc(0xfffd);
tc = conv_uni_to_pc(vc_cons[currcons].d, 0xfffd);
/* One reason for the -4 can be that we just
did a clear_unimap();
......@@ -1889,8 +1894,7 @@ static int do_con_write(struct tty_struct * tty, int from_user,
static void console_bh(void)
{
if (want_console >= 0) {
if (want_console != fg_console) {
clear_selection();
if (want_console != fg_console && vc_cons_allocated(want_console)) {
hide_cursor(fg_console);
save_screen();
change_console(want_console);
......@@ -2401,8 +2405,8 @@ void do_blank_screen(int nopowersave)
/* entering graphics mode? */
if (nopowersave) {
save_screen();
hide_cursor(currcons);
save_screen();
sw->con_blank(vc_cons[currcons].d, -1);
console_blanked = fg_console + 1;
set_origin(currcons);
......@@ -2460,6 +2464,9 @@ void do_unblank_screen(void)
currcons = fg_console;
console_blanked = 0;
#ifdef CONFIG_APM
apm_display_unblank();
#endif
if (sw->con_blank(vc_cons[currcons].d, 0))
/* Low-level driver cannot restore -> do it ourselves */
update_screen(fg_console);
......@@ -2567,24 +2574,31 @@ void reset_palette (int currcons)
* /Jes
*/
#define max_font_size 32768
#define max_font_size 65536
int con_font_op(int currcons, struct console_font_op *op)
{
int rc = -EINVAL;
int size, set;
u8 *temp;
int size = max_font_size, set;
u8 *temp = NULL;
struct console_font_op old_op;
if (vt_cons[currcons]->vc_mode != KD_TEXT)
goto quit;
memcpy(&old_op, &op, sizeof(op));
memcpy(&old_op, op, sizeof(old_op));
if (op->op == KD_FONT_OP_SET) {
if (!op->data)
return -EINVAL;
if (op->charcount > 512)
goto quit;
if (!op->height) { /* Need to guess font height [compat] */
int h, i;
u8 *charmap = op->data, tmp;
/* If from KDFONTOP ioctl, don't allow things which can be done in userland,
so that we can get rid of this soon */
if (op->flags & KD_FONT_FLAG_NEW)
goto quit;
rc = -EFAULT;
for (h = 32; h > 0; h--)
for (i = 0; i < op->charcount; i++) {
......@@ -2605,32 +2619,44 @@ int con_font_op(int currcons, struct console_font_op *op)
if (size > max_font_size)
return -ENOSPC;
set = 1;
} else if (op->op == KD_FONT_OP_GET) {
size = max_font_size;
} else if (op->op == KD_FONT_OP_GET)
set = 0;
} else
else
return sw->con_font_op(vc_cons[currcons].d, op);
temp = kmalloc(size, GFP_KERNEL);
if (!temp)
return -ENOMEM;
if (set && copy_from_user(temp, op->data, size)) {
rc = -EFAULT;
goto quit2;
if (op->data) {
temp = kmalloc(size, GFP_KERNEL);
if (!temp)
return -ENOMEM;
if (set && copy_from_user(temp, op->data, size)) {
rc = -EFAULT;
goto quit;
}
op->data = temp;
}
op->data = temp;
rc = sw->con_font_op(vc_cons[currcons].d, op);
op->data = old_op.data;
if (!rc && !set) {
int c = (op->width+7)/8 * 32 * op->charcount;
if (op->width > old_op.width ||
op->height > old_op.height ||
op->charcount > old_op.charcount)
if (op->data && op->charcount > old_op.charcount)
rc = -ENOSPC;
else if (copy_to_user(old_op.data, op->data, c))
if (op->flags & KD_FONT_FLAG_NEW) {
if (op->width > old_op.width ||
op->height > old_op.height)
rc = -ENOSPC;
} else {
if (op->width != 8)
rc = -EIO;
else if ((old_op.height && op->height > old_op.height) ||
op->height > 32)
rc = -ENOSPC;
}
if (!rc && op->data && copy_to_user(op->data, temp, c))
rc = -EFAULT;
}
quit2: kfree_s(temp, size);
quit: return rc;
quit: if (temp)
kfree_s(temp, size);
return rc;
}
/*
......@@ -2666,6 +2692,22 @@ void putconsxy(int currcons, char *p)
set_cursor(currcons);
}
u16 vcs_scr_readw(int currcons, u16 *org)
{
if (org == pos && softcursor_original != -1)
return softcursor_original;
return scr_readw(org);
}
void vcs_scr_writew(int currcons, u16 val, u16 *org)
{
scr_writew(val, org);
if (org == pos) {
softcursor_original = -1;
add_softcursor(currcons);
}
}
/*
* Visible symbols for modules
......
This diff is collapsed.
......@@ -420,6 +420,9 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
#elif defined(__sparc__)
/* Should never get here, all fb drivers should have their own
mmap routines */
#elif defined(__i386__)
if (boot_cpu_data.x86 > 3)
pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
#else
#warning What do we have to do here??
#endif
......@@ -497,7 +500,7 @@ register_framebuffer(struct fb_info *fb_info)
if (first) {
first = 0;
take_over_console(&fb_con, 0, MAX_NR_CONSOLES-1, 1);
take_over_console(&fb_con, 12, MAX_NR_CONSOLES-1, 1);
}
return 0;
......
......@@ -60,7 +60,7 @@ highlight_pointer(const int where) {
static unsigned char
sel_pos(int n)
{
return inverse_translate(screen_glyph(sel_cons, n));
return inverse_translate(vc_cons[sel_cons].d, screen_glyph(sel_cons, n));
}
/* remove the current selection highlight, if any,
......
......@@ -7,7 +7,8 @@
* [minor: N]
*
* /dev/vcsaN: idem, but including attributes, and prefixed with
* the 4 bytes lines,columns,x,y (as screendump used to give)
* the 4 bytes lines,columns,x,y (as screendump used to give).
* Attribute/character pair is in native endianity.
* [minor: N+128]
*
* This replaces screendump and part of selection, so that the system
......@@ -20,6 +21,8 @@
* - making it shorter - scr_readw are macros which expand in PRETTY long code
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/errno.h>
......@@ -39,18 +42,6 @@
#undef addr
#define HEADER_SIZE 4
static unsigned short
func_scr_readw(unsigned short *org)
{
return scr_readw( org );
}
static void
func_scr_writew(unsigned short val, unsigned short *org)
{
scr_writew( val, org );
}
static int
vcs_size(struct inode *inode)
{
......@@ -91,7 +82,7 @@ static long long vcs_lseek(struct file *file, long long offset, int orig)
return file->f_pos;
}
#define RETURN( x ) { enable_bh( CONSOLE_BH ); return x; }
#define RETURN(x) { enable_bh(CONSOLE_BH); return x; }
static ssize_t
vcs_read(struct file *file, char *buf, size_t count, loff_t *ppos)
{
......@@ -104,7 +95,7 @@ vcs_read(struct file *file, char *buf, size_t count, loff_t *ppos)
attr = (currcons & 128);
currcons = (currcons & 127);
disable_bh( CONSOLE_BH );
disable_bh(CONSOLE_BH);
if (currcons == 0) {
currcons = fg_console;
viewed = 1;
......@@ -125,7 +116,7 @@ vcs_read(struct file *file, char *buf, size_t count, loff_t *ppos)
if (!attr) {
org = screen_pos(currcons, p, viewed);
while (count-- > 0)
put_user(func_scr_readw(org++) & 0xff, buf++);
put_user(vcs_scr_readw(currcons, org++) & 0xff, buf++);
} else {
if (p < HEADER_SIZE) {
char header[HEADER_SIZE];
......@@ -140,21 +131,21 @@ vcs_read(struct file *file, char *buf, size_t count, loff_t *ppos)
org = screen_pos(currcons, p/2, viewed);
if ((p & 1) && count > 0)
#ifdef __BIG_ENDIAN
{ count--; put_user(func_scr_readw(org++) & 0xff, buf++); }
{ count--; put_user(vcs_scr_readw(currcons, org++) & 0xff, buf++); }
#else
{ count--; put_user(func_scr_readw(org++) >> 8, buf++); }
{ count--; put_user(vcs_scr_readw(currcons, org++) >> 8, buf++); }
#endif
}
while (count > 1) {
put_user(func_scr_readw(org++), (unsigned short *) buf);
put_user(vcs_scr_readw(currcons, org++), (unsigned short *) buf);
buf += 2;
count -= 2;
}
if (count > 0)
#ifdef __BIG_ENDIAN
put_user(func_scr_readw(org) >> 8, buf++);
put_user(vcs_scr_readw(currcons, org) >> 8, buf++);
#else
put_user(func_scr_readw(org) & 0xff, buf++);
put_user(vcs_scr_readw(currcons, org) & 0xff, buf++);
#endif
}
read = buf - buf0;
......@@ -174,7 +165,7 @@ vcs_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
attr = (currcons & 128);
currcons = (currcons & 127);
disable_bh( CONSOLE_BH );
disable_bh(CONSOLE_BH);
if (currcons == 0) {
currcons = fg_console;
viewed = 1;
......@@ -198,7 +189,7 @@ vcs_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
unsigned char c;
count--;
get_user(c, (const unsigned char*)buf++);
func_scr_writew((func_scr_readw(org) & 0xff00) | c, org);
vcs_scr_writew(currcons, (vcs_scr_readw(currcons, org) & 0xff00) | c, org);
org++;
}
} else {
......@@ -218,11 +209,11 @@ vcs_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
count--;
get_user(c,buf++);
#ifdef __BIG_ENDIAN
func_scr_writew(c |
(func_scr_readw(org) & 0xff00), org);
vcs_scr_writew(currcons, c |
(vcs_scr_readw(currcons, org) & 0xff00), org);
#else
func_scr_writew((c << 8) |
(func_scr_readw(org) & 0xff), org);
vcs_scr_writew(currcons, (c << 8) |
(vcs_scr_readw(currcons, org) & 0xff), org);
#endif
org++;
}
......@@ -230,7 +221,7 @@ vcs_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
while (count > 1) {
unsigned short w;
get_user(w, (const unsigned short *) buf);
func_scr_writew(w, org++);
vcs_scr_writew(currcons, w, org++);
buf += 2;
count -= 2;
}
......@@ -238,9 +229,9 @@ vcs_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
unsigned char c;
get_user(c, (const unsigned char*)buf++);
#ifdef __BIG_ENDIAN
func_scr_writew((func_scr_readw(org) & 0xff) | (c << 8), org);
vcs_scr_writew(currcons, (vcs_scr_readw(currcons, org) & 0xff) | (c << 8), org);
#else
func_scr_writew((func_scr_readw(org) & 0xff00) | c, org);
vcs_scr_writew(currcons, (vcs_scr_readw(currcons, org) & 0xff00) | c, org);
#endif
}
}
......
......@@ -113,21 +113,18 @@ kd_size_changed(int row, int col)
}
/*
* Generates sound of some count for some number of clock ticks
* [count = 1193180 / frequency]
* Generates sound of some frequency for some number of clock ticks
*
* If freq is 0, will turn off sound, else will turn it on for that time.
* If msec is 0, will return immediately, else will sleep for msec time, then
* turn sound off.
*
* We use the BEEP_TIMER vector since we're using the same method to
* generate sound, and we'll overwrite any beep in progress. That may
* be something to fix later, if we like.
*
* We also return immediately, which is what was implied within the X
* comments - KDMKTONE doesn't put the process to sleep.
*/
/* FIXME: This should go to arch-dependent code */
#if defined(__i386__) || defined(__alpha__) || defined(__powerpc__) || defined(__mips__)
static void
kd_nosound(unsigned long ignored)
{
......@@ -168,6 +165,15 @@ _kd_mksound(unsigned int hz, unsigned int ticks)
return;
}
#else
void
_kd_mksound(unsigned int hz, unsigned int ticks)
{
}
#endif
void (*kd_mksound)(unsigned int hz, unsigned int ticks) = _kd_mksound;
......@@ -394,8 +400,6 @@ do_fontx_ioctl(int cmd, struct consolefontdesc *user_cfd, int perm)
op.data = cfdarg.chardata;
return con_font_op(fg_console, &op);
case GIO_FONTX: {
if (!cfdarg.chardata)
return 0;
op.op = KD_FONT_OP_GET;
op.flags = 0;
op.width = 8;
......@@ -432,9 +436,9 @@ do_unimap_ioctl(int cmd, struct unimapdesc *user_ud,int perm)
case PIO_UNIMAP:
if (!perm)
return -EPERM;
return con_set_unimap(tmp.entry_ct, tmp.entries);
return con_set_unimap(fg_console, tmp.entry_ct, tmp.entries);
case GIO_UNIMAP:
return con_get_unimap(tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
}
return 0;
}
......@@ -994,11 +998,11 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
#else
{
struct console_font_op op;
op.op = KD_FONT_SET_DEFAULT;
op.op = KD_FONT_OP_SET_DEFAULT;
op.data = NULL;
i = con_font_op(fg_console, &op);
if (i) return i;
con_set_default_unimap();
con_set_default_unimap(fg_console);
return 0;
}
#endif
......@@ -1010,6 +1014,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return -EFAULT;
if (!perm && op.op != KD_FONT_OP_GET)
return -EPERM;
op.flags |= KD_FONT_FLAG_NEW;
i = con_font_op(console, &op);
if (i) return i;
if (copy_to_user((void *) arg, &op, sizeof(op)))
......@@ -1039,7 +1044,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
return -EPERM;
i = copy_from_user(&ui, (void *)arg, sizeof(struct unimapinit));
if (i) return -EFAULT;
con_clear_unimap(&ui);
con_clear_unimap(fg_console, &ui);
return 0;
}
......@@ -1189,10 +1194,6 @@ void complete_change_console(unsigned int new_console)
{
unsigned char old_vc_mode;
if ((new_console == fg_console) || (vt_dont_switch))
return;
if (!vc_cons_allocated(new_console))
return;
last_console = fg_console;
/*
......
......@@ -182,6 +182,8 @@ static int autoprobe_read_proc (char *page, char **start, off_t off,
int len = 0;
const char *str;
page[0] = '\0';
if ((str = pp->probe_info.class_name) != NULL)
len += sprintf (page+len, "CLASS:%s;\n", str);
......@@ -199,7 +201,7 @@ static int autoprobe_read_proc (char *page, char **start, off_t off,
*start = 0;
*eof = 1;
return strlen (page);
return len;
}
static inline void destroy_proc_entry(struct proc_dir_entry *root,
......
......@@ -451,6 +451,8 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
dev->tbusy = 0;
}
lp->stats.tx_bytes += skb->len;
if (el3_debug > 4) {
printk("%s: el3_start_xmit(length = %u) called, status %4.4x.\n",
dev->name, skb->len, inw(ioaddr + EL3_STATUS));
......@@ -667,6 +669,7 @@ el3_rx(struct device *dev)
struct sk_buff *skb;
skb = dev_alloc_skb(pkt_len+5);
lp->stats.rx_bytes += pkt_len;
if (el3_debug > 4)
printk("Receiving packet size %d status %4.4x.\n",
pkt_len, rx_status);
......
......@@ -31,8 +31,14 @@ if [ "$CONFIG_NET_ETHERNET" = "y" ]; then
source drivers/acorn/net/Config.in
fi
fi
if [ "$CONFIG_PMAC" = "y" ]; then
bool 'MACE (Power Mac Ethernet) support' CONFIG_MACE
if [ "$CONFIG_PPC" = "y" ]; then
bool 'MACE (Power Mac ethernet) support' CONFIG_MACE
bool 'BMAC (G3 ethernet) support' CONFIG_BMAC
fi
if [ "$CONFIG_APUS" = "y" ]; then
tristate 'Ariadne support' CONFIG_ARIADNE
tristate 'A2065 support' CONFIG_A2065
tristate 'Hydra support' CONFIG_HYDRA
fi
if [ "$CONFIG_MIPS_JAZZ" = "y" ]; then
bool 'MIPS JAZZ onboard SONIC Ethernet support' CONFIG_MIPS_JAZZ_SONIC
......
......@@ -151,6 +151,14 @@ else
endif
endif
ifeq ($(CONFIG_ETHERH),y)
CONFIG_8390_BUILTIN = y
else
ifeq ($(CONFIG_ETHERH),m)
CONFIG_8390_MODULE = y
endif
endif
ifeq ($(CONFIG_NE2K_PCI),y)
L_OBJS += ne2k-pci.o
CONFIG_8390_BUILTIN = y
......@@ -853,6 +861,10 @@ ifeq ($(CONFIG_MACE),y)
L_OBJS += mace.o
endif
ifeq ($(CONFIG_BMAC),y)
L_OBJS += bmac.o
endif
ifeq ($(CONFIG_VENDOR_SANGOMA),y)
LX_OBJS += sdladrv.o
L_OBJS += sdlamain.o
......
......@@ -95,6 +95,7 @@ extern int bionet_probe(struct device *);
extern int pamsnet_probe(struct device *);
extern int tlan_probe(struct device *);
extern int mace_probe(struct device *);
extern int bmac_probe(struct device *);
extern int cs89x0_probe(struct device *dev);
extern int ethertap_probe(struct device *dev);
extern int ether1_probe (struct device *dev);
......@@ -380,6 +381,9 @@ struct devprobe m68k_probes[] __initdata = {
struct devprobe ppc_probes[] __initdata = {
#ifdef CONFIG_MACE
{mace_probe, 0},
#endif
#ifdef CONFIG_BMAC
{bmac_probe, 0},
#endif
{NULL, 0},
};
......
This diff is collapsed.
/*
* mace.h - definitions for the registers in the "Big Mac"
* Ethernet controller found in PowerMac G3 models.
*
* Copyright (C) 1998 Randy Gobbel.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
/* The "Big MAC" appears to have some parts in common with the Sun "Happy Meal"
* (HME) controller. See sunhme.h
*/
/* register offsets */
/* global status and control */
#define XIFC 0x000 /* low-level interface control */
# define TxOutputEnable 0x0001 /* output driver enable */
# define XIFLoopback 0x0002 /* Loopback-mode XIF enable */
# define MIILoopback 0x0004 /* Loopback-mode MII enable */
# define MIILoopbackBits 0x0006
# define MIIBuffDisable 0x0008 /* MII receive buffer disable */
# define SQETestEnable 0x0010 /* SQE test enable */
# define SQETimeWindow 0x03e0 /* SQE time window */
# define XIFLanceMode 0x0010 /* Lance mode enable */
# define XIFLanceIPG0 0x03e0 /* Lance mode IPG0 */
#define TXFIFOCSR 0x100 /* transmit FIFO control */
# define TxFIFOEnable 0x0001
#define TXTH 0x110 /* transmit threshold */
# define TxThreshold 0x0004
#define RXFIFOCSR 0x120 /* receive FIFO control */
# define RxFIFOEnable 0x0001
#define MEMADD 0x130 /* memory address, unknown function */
#define MEMDATAHI 0x140 /* memory data high, presently unused in driver */
#define MEMDATALO 0x150 /* memory data low, presently unused in driver */
#define XCVRIF 0x160 /* transceiver interface control */
# define COLActiveLow 0x0002
# define SerialMode 0x0004
# define ClkBit 0x0008
# define LinkStatus 0x0100
#define CHIPID 0x170 /* chip ID */
#define MIFCSR 0x180 /* ??? */
#define SROMCSR 0x190 /* SROM control */
# define ChipSelect 0x0001
# define Clk 0x0002
#define TXPNTR 0x1a0 /* transmit pointer */
#define RXPNTR 0x1b0 /* receive pointer */
#define STATUS 0x200 /* status--reading this clears it */
#define INTDISABLE 0x210 /* interrupt enable/disable control */
/* bits below are the same in both STATUS and INTDISABLE registers */
# define FrameReceived 0x00000001 /* Received a frame */
# define RxFrameCntExp 0x00000002 /* Receive frame counter expired */
# define RxAlignCntExp 0x00000004 /* Align-error counter expired */
# define RxCRCCntExp 0x00000008 /* CRC-error counter expired */
# define RxLenCntExp 0x00000010 /* Length-error counter expired */
# define RxOverFlow 0x00000020 /* Receive FIFO overflow */
# define RxCodeViolation 0x00000040 /* Code-violation counter expired */
# define SQETestError 0x00000080 /* Test error in XIF for SQE */
# define FrameSent 0x00000100 /* Transmitted a frame */
# define TxUnderrun 0x00000200 /* Transmit FIFO underrun */
# define TxMaxSizeError 0x00000400 /* Max-packet size error */
# define TxNormalCollExp 0x00000800 /* Normal-collision counter expired */
# define TxExcessCollExp 0x00001000 /* Excess-collision counter expired */
# define TxLateCollExp 0x00002000 /* Late-collision counter expired */
# define TxNetworkCollExp 0x00004000 /* First-collision counter expired */
# define TxDeferTimerExp 0x00008000 /* Defer-timer expired */
# define RxFIFOToHost 0x00010000 /* Data moved from FIFO to host */
# define RxNoDescriptors 0x00020000 /* No more receive descriptors */
# define RxDMAError 0x00040000 /* Error during receive DMA */
# define RxDMALateErr 0x00080000 /* Receive DMA, data late */
# define RxParityErr 0x00100000 /* Parity error during receive DMA */
# define RxTagError 0x00200000 /* Tag error during receive DMA */
# define TxEOPError 0x00400000 /* Tx descriptor did not have EOP set */
# define MIFIntrEvent 0x00800000 /* MIF is signaling an interrupt */
# define TxHostToFIFO 0x01000000 /* Data moved from host to FIFO */
# define TxFIFOAllSent 0x02000000 /* Transmitted all packets in FIFO */
# define TxDMAError 0x04000000 /* Error during transmit DMA */
# define TxDMALateError 0x08000000 /* Late error during transmit DMA */
# define TxParityError 0x10000000 /* Parity error during transmit DMA */
# define TxTagError 0x20000000 /* Tag error during transmit DMA */
# define PIOError 0x40000000 /* PIO access got an error */
# define PIOParityError 0x80000000 /* PIO access got a parity error */
# define DisableAll 0xffffffff
# define EnableAll 0x00000000
/* # define NormalIntEvents ~(FrameReceived | FrameSent | TxUnderrun) */
# define EnableNormal ~(FrameReceived | FrameSent)
# define EnableErrors (FrameReceived | FrameSent)
# define RxErrorMask (RxFrameCntExp | RxAlignCntExp | RxCRCCntExp | \
RxLenCntExp | RxOverFlow | RxCodeViolation)
# define TxErrorMask (TxUnderrun | TxMaxSizeError | TxExcessCollExp | \
TxLateCollExp | TxNetworkCollExp | TxDeferTimerExp)
/* transmit control */
#define TXRST 0x420 /* transmit reset */
# define TxResetBit 0x0001
#define TXCFG 0x430 /* transmit configuration control*/
# define TxMACEnable 0x0001 /* output driver enable */
# define TxSlowMode 0x0020 /* enable slow mode */
# define TxIgnoreColl 0x0040 /* ignore transmit collisions */
# define TxNoFCS 0x0080 /* do not emit FCS */
# define TxNoBackoff 0x0100 /* no backoff in case of collisions */
# define TxFullDuplex 0x0200 /* enable full-duplex */
# define TxNeverGiveUp 0x0400 /* don't give up on transmits */
#define IPG1 0x440 /* Inter-packet gap 1 */
#define IPG2 0x450 /* Inter-packet gap 2 */
#define ALIMIT 0x460 /* Transmit attempt limit */
#define SLOT 0x470 /* Transmit slot time */
#define PALEN 0x480 /* Size of transmit preamble */
#define PAPAT 0x490 /* Pattern for transmit preamble */
#define TXSFD 0x4a0 /* Transmit frame delimiter */
#define JAM 0x4b0 /* Jam size */
#define TXMAX 0x4c0 /* Transmit max pkt size */
#define TXMIN 0x4d0 /* Transmit min pkt size */
#define PAREG 0x4e0 /* Count of transmit peak attempts */
#define DCNT 0x4f0 /* Transmit defer timer */
#define NCCNT 0x500 /* Transmit normal-collision counter */
#define NTCNT 0x510 /* Transmit first-collision counter */
#define EXCNT 0x520 /* Transmit excess-collision counter */
#define LTCNT 0x530 /* Transmit late-collision counter */
#define RSEED 0x540 /* Transmit random number seed */
#define TXSM 0x550 /* Transmit state machine */
/* receive control */
#define RXRST 0x620 /* receive reset */
# define RxResetValue 0x0000
#define RXCFG 0x630 /* receive configuration control */
# define RxMACEnable 0x0001 /* receiver overall enable */
# define RxCFGReserved 0x0004
# define RxPadStripEnab 0x0020 /* enable pad byte stripping */
# define RxPromiscEnable 0x0040 /* turn on promiscuous mode */
# define RxNoErrCheck 0x0080 /* disable receive error checking */
# define RxCRCNoStrip 0x0100 /* disable auto-CRC-stripping */
# define RxRejectOwnPackets 0x0200 /* don't receive our own packets */
# define RxGrpPromisck 0x0400 /* enable group promiscuous mode */
# define RxHashFilterEnable 0x0800 /* enable hash filter */
# define RxAddrFilterEnable 0x1000 /* enable address filter */
#define RXMAX 0x640 /* Max receive packet size */
#define RXMIN 0x650 /* Min receive packet size */
#define MADD2 0x660 /* our enet address, high part */
#define MADD1 0x670 /* our enet address, middle part */
#define MADD0 0x680 /* our enet address, low part */
#define FRCNT 0x690 /* receive frame counter */
#define LECNT 0x6a0 /* Receive excess length error counter */
#define AECNT 0x6b0 /* Receive misaligned error counter */
#define FECNT 0x6c0 /* Receive CRC error counter */
#define RXSM 0x6d0 /* Receive state machine */
#define RXCV 0x6e0 /* Receive code violation */
#define BHASH3 0x700 /* multicast hash register */
#define BHASH2 0x710 /* multicast hash register */
#define BHASH1 0x720 /* multicast hash register */
#define BHASH0 0x730 /* multicast hash register */
#define AFR2 0x740 /* address filtering setup? */
#define AFR1 0x750 /* address filtering setup? */
#define AFR0 0x760 /* address filtering setup? */
#define AFCR 0x770 /* address filter compare register? */
# define EnableAllCompares 0x0fff
/* bits in XIFC */
This diff is collapsed.
......@@ -1106,6 +1106,8 @@ hardware_send_packet(struct device *dev, void *buf, short length)
dev->tbusy = 0;
}
lp->stats.tx_bytes += length;
if (net_debug > 5)
printk("eepro: exiting hardware_send_packet routine.\n");
return;
......@@ -1164,6 +1166,7 @@ eepro_rx(struct device *dev)
skb->protocol = eth_type_trans(skb,dev);
netif_rx(skb);
lp->stats.rx_packets++;
lp->stats.rx_bytes += rcv_size;
}
else { /* Not sure will ever reach here,
I set the 595 to discard bad received frames */
......
......@@ -59,9 +59,10 @@
* Changes by Christopher Turcksin <wabbit@rtfc.demon.co.uk>
* + Now compiles ok as a module again.
*
* Changes by Paul Norton (pnorton@cts.com) :
* Changes by Paul Norton (p.norton@computer.org) :
* + moved the header manipulation code in tr_tx and tr_rx to
* net/802/tr.c. (July 12 1997)
* + add retry and timeout on open if cable disconnected. (May 5 1998)
* + lifted 2000 byte mtu limit. now depends on shared-RAM size.
* May 25 1998)
*/
......@@ -929,9 +930,12 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
DPRINTK("No signal detected for Auto Speed Detection.\n");
else if (open_error_code==0x11)
{
ti->open_status=FAILURE;
DPRINTK("Ring broken/disconnected.\n");
wake_up(&ti->wait_for_reset);
if (ti->retry_count--)
DPRINTK("Ring broken/disconnected, retrying...\n");
else {
DPRINTK("Ring broken/disconnected, open failed.\n");
ti->open_status = FAILURE;
}
}
else DPRINTK("Unrecoverable error: error code = %04x.\n",
open_error_code);
......
......@@ -7,6 +7,7 @@
#define TR_RESET_INTERVAL (HZ/20) /* 5 on PC = 50 ms */
#define TR_BUSY_INTERVAL (HZ/5) /* 5 on PC = 200 ms */
#define TR_SPIN_INTERVAL (3*HZ) /* 3 seconds before init timeout */
#define TR_RETRIES 6 /* number of open retries */
#define TR_ISA 1
#define TR_MCA 2
......@@ -215,6 +216,7 @@ struct tok_info {
struct timer_list tr_timer;
unsigned char ring_speed;
__u32 func_addr;
unsigned int retry_count;
};
/* token ring adapter commands */
......
......@@ -326,8 +326,7 @@ __initfunc(int lance_init(void))
struct pci_dev *pdev = NULL;
if (lance_debug > 1)
printk("lance.c: PCI is present, checking for devices...\n");
while (pdev = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, pdev)) {
unsigned char pci_bus, pci_device_fn;
while ((pdev = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, pdev))) {
unsigned int pci_ioaddr;
unsigned short pci_command;
......
......@@ -573,6 +573,7 @@ static void mace_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if ((fs & XMTSV) == 0) {
printk(KERN_ERR "mace: xmtfs not valid! (fs=%x xc=%d ds=%x)\n",
fs, xcount, dstat);
return;
}
cp = mp->tx_cmds + NCMDS_TX * i;
stat = ld_le16(&cp->xfer_status);
......@@ -765,7 +766,14 @@ static void mace_rxdma_intr(int irq, void *dev_id, struct pt_regs *regs)
if (frame_status & RS_FCSERR)
++mp->stats.rx_crc_errors;
} else {
nb -= 8;
/* Mace feature AUTO_STRIP_RCV is on by default, dropping the
* FCS on frames with 802.3 headers. This means that Ethernet
* frames have 8 extra octets at the end, while 802.3 frames
* have only 4. We need to correctly account for this. */
if (*(unsigned short *)(data+12) < 1536) /* 802.3 header */
nb -= 4;
else /* Ethernet header; mace includes FCS */
nb -= 8;
skb_put(skb, nb);
skb->dev = dev;
skb->protocol = eth_type_trans(skb, dev);
......
......@@ -1044,27 +1044,11 @@ static inline int myri_ether_init(struct device *dev, struct linux_sbus_device *
dev->hard_start_xmit = &myri_start_xmit;
dev->get_stats = &myri_get_stats;
dev->set_multicast_list = &myri_set_multicast;
dev->irq = sdev->irqs[0].pri;
dev->irq = sdev->irqs[0];
dev->dma = 0;
/* Register interrupt handler now. */
DET(("Requesting MYRIcom IRQ line.\n"));
#ifdef __sparc_v9__
if(sparc_cpu_model == sun4u) {
struct devid_cookie dcookie;
dcookie.real_dev_id = dev;
dcookie.imap = dcookie.iclr = 0;
dcookie.pil = -1;
dcookie.bus_cookie = sdev->my_bus;
if(request_irq(dev->irq, &myri_interrupt,
(SA_SHIRQ | SA_SBUS | SA_DCOOKIE),
"MyriCOM Ethernet", &dcookie)) {
printk("MyriCOM: Cannot register interrupt handler.\n");
return ENODEV;
}
} else
#endif
if(request_irq(dev->irq, &myri_interrupt,
SA_SHIRQ, "MyriCOM Ethernet", (void *) dev)) {
printk("MyriCOM: Cannot register interrupt handler.\n");
......
......@@ -574,6 +574,7 @@ plip_receive_packet(struct device *dev, struct net_local *nl,
/* Inform the upper layer for the arrival of a packet. */
rcv->skb->protocol=eth_type_trans(rcv->skb, dev);
netif_rx(rcv->skb);
nl->enet_stats.rx_bytes += rcv->length.h;
nl->enet_stats.rx_packets++;
rcv->skb = NULL;
if (net_debug > 2)
......@@ -741,6 +742,7 @@ plip_send_packet(struct device *dev, struct net_local *nl,
&snd->nibble, snd->checksum))
return TIMEOUT;
nl->enet_stats.tx_bytes += snd->skb->len;
dev_kfree_skb(snd->skb);
nl->enet_stats.tx_packets++;
snd->state = PLIP_PK_DONE;
......
......@@ -372,6 +372,7 @@ static int
seeq8005_send_packet(struct sk_buff *skb, struct device *dev)
{
int ioaddr = dev->base_addr;
struct net_local *lp = (struct net_local *)dev->priv;
if (dev->tbusy) {
/* If we get here, some higher level has decided we are broken.
......@@ -397,6 +398,7 @@ seeq8005_send_packet(struct sk_buff *skb, struct device *dev)
hardware_send_packet(dev, buf, length);
dev->trans_start = jiffies;
lp->stats.tx_bytes += length;
}
dev_kfree_skb (skb);
......@@ -547,6 +549,7 @@ seeq8005_rx(struct device *dev)
skb->protocol=eth_type_trans(skb,dev);
netif_rx(skb);
lp->stats.rx_packets++;
lp->stats.rx_bytes += pkt_len;
}
} while ((--boguscount) && (pkt_hdr & SEEQPKTH_CHAIN));
......
......@@ -1250,6 +1250,8 @@ static int SK_send_packet(struct sk_buff *skb, struct device *dev)
*/
dev->tbusy = 0;
}
p->stats.tx_bytes += skb->len;
}
dev_kfree_skb(skb);
return 0;
......@@ -1585,6 +1587,7 @@ static void SK_rxintr(struct device *dev)
writeb(RX_OWN, rmdp->u.s.status);
p->stats.rx_packets++;
p->stats.rx_bytes += len;
p->rmdnum++;
......
......@@ -430,6 +430,7 @@ static int sonic_send_packet(struct sk_buff *skb, struct device *dev)
lp->tda[(lp->cur_tx-1) % SONIC_TDS_MASK].link &= ~SONIC_END_OF_LINKS;
lp->cur_tx++;
lp->stats.tx_bytes += length;
if (sonic_debug > 2)
printk("sonic_send_packet: issueing Tx command\n");
......@@ -610,6 +611,7 @@ sonic_rx(struct device *dev)
skb->protocol=eth_type_trans(skb,dev);
netif_rx(skb); /* pass the packet to upper layers */
lp->stats.rx_packets++;
lp->stats.rx_bytes += pkt_len;
} else {
/* This should only happen, if we enable accepting broken packets. */
......
......@@ -2098,6 +2098,7 @@ static void pci_happy_meal_interrupt(int irq, void *dev_id, struct pt_regs *regs
}
#endif
#ifndef __sparc_v9__
static void sun4c_happy_meal_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct device *dev = (struct device *) dev_id;
......@@ -2141,6 +2142,7 @@ static void sun4c_happy_meal_interrupt(int irq, void *dev_id, struct pt_regs *re
dev->interrupt = 0;
HMD(("done\n"));
}
#endif
static int happy_meal_open(struct device *dev)
{
......@@ -2148,6 +2150,7 @@ static int happy_meal_open(struct device *dev)
int res;
HMD(("happy_meal_open: "));
#ifndef __sparc_v9__
if(sparc_cpu_model == sun4c) {
if(request_irq(dev->irq, &sun4c_happy_meal_interrupt,
SA_SHIRQ, "HAPPY MEAL", (void *) dev)) {
......@@ -2155,47 +2158,26 @@ static int happy_meal_open(struct device *dev)
printk("happy meal: Can't order irq %d to go.\n", dev->irq);
return -EAGAIN;
}
}
#ifdef __sparc_v9__
else if(sparc_cpu_model == sun4u) {
struct devid_cookie dcookie;
} else
#else
#ifdef CONFIG_PCI
if(hp->happy_flags & HFLAG_PCI) {
if(request_irq(dev->irq, &pci_happy_meal_interrupt,
SA_SHIRQ, "HAPPY MEAL (PCI)", dev)) {
HMD(("EAGAIN\n"));
printk("happy_meal(PCI: Can't order irq %d to go.\n",
dev->irq);
return -EAGAIN;
}
goto v9_done;
}
#endif
dcookie.real_dev_id = dev;
dcookie.imap = dcookie.iclr = 0;
dcookie.pil = -1;
dcookie.bus_cookie = hp->happy_sbus_dev->my_bus;
if(request_irq(dev->irq, &happy_meal_interrupt,
(SA_SHIRQ | SA_SBUS | SA_DCOOKIE),
"HAPPY MEAL", &dcookie)) {
HMD(("EAGAIN\n"));
printk("happy_meal(SBUS): Can't order irq %d to go.\n",
dev->irq);
if(hp->happy_flags & HFLAG_PCI) {
if(request_irq(dev->irq, &pci_happy_meal_interrupt,
SA_SHIRQ, "HAPPY MEAL (PCI)", dev)) {
HMD(("EAGAIN\n"));
printk("happy_meal(PCI: Can't order irq %s to go.\n",
__irq_itoa(dev->irq));
return -EAGAIN;
}
#ifdef CONFIG_PCI
v9_done:
} else
#endif
}
#endif
else {
if(request_irq(dev->irq, &happy_meal_interrupt,
SA_SHIRQ, "HAPPY MEAL", (void *) dev)) {
HMD(("EAGAIN\n"));
printk("happy meal: Can't order irq %d to go.\n", dev->irq);
return -EAGAIN;
}
if(request_irq(dev->irq, &happy_meal_interrupt,
SA_SHIRQ, "HAPPY MEAL", (void *)dev)) {
HMD(("EAGAIN\n"));
printk("happy_meal(SBUS): Can't order irq %s to go.\n",
__irq_itoa(dev->irq));
return -EAGAIN;
}
HMD(("Init happy timer\n"));
init_timer(&hp->happy_timer);
......@@ -2594,7 +2576,7 @@ static inline int happy_meal_ether_init(struct device *dev, struct linux_sbus_de
dev->get_stats = &happy_meal_get_stats;
dev->set_multicast_list = &happy_meal_set_multicast;
dev->irq = sdev->irqs[0].pri;
dev->irq = sdev->irqs[0];
dev->dma = 0;
ether_setup(dev);
#ifdef MODULE
......
/* $Id: sunlance.c,v 1.75 1998/04/24 12:29:50 davem Exp $
/* $Id: sunlance.c,v 1.79 1998/06/04 09:54:58 jj Exp $
* lance.c: Linux/Sparc/Lance driver
*
* Written 1995, 1996 by Miguel de Icaza
......@@ -672,39 +672,11 @@ static int lance_open (struct device *dev)
last_dev = dev;
#ifdef __sparc_v9__
if (sparc_cpu_model == sun4u) {
struct devid_cookie dcookie;
dcookie.real_dev_id = dev;
dcookie.imap = dcookie.iclr = 0;
dcookie.pil = -1;
dcookie.bus_cookie = lp->sbus;
if(request_irq(dev->irq, &lance_interrupt,
(SA_SHIRQ | SA_SBUS | SA_DCOOKIE),
lancestr, &dcookie)) {
printk ("Lance: Can't get irq %d\n", dev->irq);
return -EAGAIN;
}
}
#else
if (sparc_cpu_model == sun4d) {
struct devid_cookie dcookie;
dcookie.real_dev_id = dev;
dcookie.bus_cookie = (void *)dev->base_addr;
if(request_irq(dev->irq, &lance_interrupt,
(SA_SHIRQ | SA_DCOOKIE),
lancestr, &dcookie)) {
printk ("Lance: Can't get irq %d\n", dev->irq);
return -EAGAIN;
}
} else if (request_irq (dev->irq, &lance_interrupt, SA_SHIRQ,
if (request_irq (dev->irq, &lance_interrupt, SA_SHIRQ,
lancestr, (void *) dev)) {
printk ("Lance: Can't get irq %d\n", dev->irq);
printk ("Lance: Can't get irq %s\n", __irq_itoa(dev->irq));
return -EAGAIN;
}
#endif
/* Stop the Lance */
ll->rap = LE_CSR0;
......@@ -1124,7 +1096,7 @@ sparc_lance_init (struct device *dev, struct linux_sbus_device *sdev,
dev->get_stats = &lance_get_stats;
dev->set_multicast_list = &lance_set_multicast;
dev->irq = (unsigned char) sdev->irqs [0].pri;
dev->irq = sdev->irqs[0];
dev->dma = 0;
ether_setup (dev);
......@@ -1166,7 +1138,7 @@ __initfunc(int sparc_lance_probe (struct device *dev))
if (idprom->id_machtype == (SM_SUN4|SM_4_330)) {
memset (&sdev, 0, sizeof(sdev));
sdev.reg_addrs[0].phys_addr = SUN4_300_ETH_PHYSADDR;
sdev.irqs[0].pri = 6;
sdev.irqs[0] = 6;
return sparc_lance_init(dev, &sdev, 0, 0);
}
return ENODEV;
......
......@@ -1103,7 +1103,7 @@ static inline int qec_ether_init(struct device *dev, struct linux_sbus_device *s
qe_devs[i]->hard_start_xmit = qe_start_xmit;
qe_devs[i]->get_stats = qe_get_stats;
qe_devs[i]->set_multicast_list = qe_set_multicast;
qe_devs[i]->irq = (unsigned char) sdev->irqs[0].pri;
qe_devs[i]->irq = sdev->irqs[0];
qe_devs[i]->dma = 0;
ether_setup(qe_devs[i]);
}
......@@ -1114,32 +1114,14 @@ static inline int qec_ether_init(struct device *dev, struct linux_sbus_device *s
* for it now.
*/
if(sparc_cpu_model == sun4c) {
if(request_irq(sdev->irqs[0].pri, &sun4c_qec_interrupt,
if(request_irq(sdev->irqs[0], &sun4c_qec_interrupt,
SA_SHIRQ, "QuadEther", (void *) qecp)) {
printk("QuadEther: Can't register QEC master irq handler.\n");
res = EAGAIN;
goto qec_free_devs;
}
}
#ifdef __sparc_v9__
else if(sparc_cpu_model == sun4u) {
struct devid_cookie dcookie;
dcookie.real_dev_id = qecp;
dcookie.imap = dcookie.iclr = 0;
dcookie.pil = -1;
dcookie.bus_cookie = sdev->my_bus;
if(request_irq(sdev->irqs[0].pri, &qec_interrupt,
(SA_SHIRQ | SA_SBUS | SA_DCOOKIE),
"QuadEther", &dcookie)) {
printk("QuadEther: Can't register QEC master irq handler.\n");
res = EAGAIN;
goto qec_free_devs;
}
}
#endif
else {
if(request_irq(sdev->irqs[0].pri, &qec_interrupt,
} else {
if(request_irq(sdev->irqs[0], &qec_interrupt,
SA_SHIRQ, "QuadEther", (void *) qecp)) {
printk("QuadEther: Can't register QEC master irq handler.\n");
res = EAGAIN;
......@@ -1241,7 +1223,7 @@ cleanup_module(void)
unregister_netdev(root_qec_dev->qes[i]->dev);
kfree(root_qec_dev->qes[i]);
}
free_irq(root_qec_dev->qec_sbus_dev->irqs[0].pri, (void *)root_qec_dev);
free_irq(root_qec_dev->qec_sbus_dev->irqs[0], (void *)root_qec_dev);
kfree(root_qec_dev);
root_qec_dev = next_qec;
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
* eata.c - Low-level driver for EATA/DMA SCSI host adapters.
*
* 26 Jul 1998 Rev. 4.33 for linux 2.0.35 and 2.1.111
* + Added command line option (rs:[y|n]) to reverse the scan order
* of PCI boards. The default is rs:y, which reverses the BIOS order
* while registering PCI boards. The default value rs:y generates
* the same order of all previous revisions of this driver.
* Pls. note that "BIOS order" might have been reversed itself
* after the 2.1.9x PCI modifications in the linux kernel.
* The rs value is ignored when the explicit list of addresses
* is used by the "eata=port0,port1,..." command line option.
* + Added command line option (et:[y|n]) to force use of extended
* translation (255 heads, 63 sectors) as disk geometry.
* The default is et:n, which uses the disk geometry returned
* by scsicam_bios_param. The default value et:n is compatible with
* all previous revisions of this driver.
*
* 28 May 1998 Rev. 4.32 for linux 2.0.33 and 2.1.104
* Increased busy timeout from 10 msec. to 200 msec. while
* processing interrupts.
......@@ -193,6 +208,10 @@
* PM3222 - SmartRAID Adapter for EISA (PM3222W is 16-bit wide SCSI)
* PM3224 - SmartRAID Adapter for PCI (PM3224W is 16-bit wide SCSI)
*
* The above list is just an indication: as a matter of fact all DPT
* boards using the EATA/DMA protocol are supported by this driver,
* since they use exactely the same programming interface.
*
* The DPT PM2001 provides only the EATA/PIO interface and hence is not
* supported by this driver.
*
......@@ -255,6 +274,10 @@
*
* eh:y use new scsi code (linux 2.2 only);
* eh:n use old scsi code;
* et:y force use of extended translation (255 heads, 63 sectors);
* et:n use disk geometry detected by scsicam_bios_param;
* rs:y reverse scan order while detecting PCI boards;
* rs:n use BIOS order while detecting PCI boards;
* lc:y enables linked commands;
* lc:n disables linked commands;
* tc:y enables tagged commands;
......@@ -265,15 +288,16 @@
* tm:3 use only ordered queue tags;
* mq:xx set the max queue depth to the value xx (2 <= xx <= 32).
*
* The default value is: "eata=lc:n,tc:n,mq:16,tm:0". An example using
* the list of detection probes could be:
* "eata=0x7410,0x230,lc:y,tc:n,mq:4,eh:n".
* The default value is: "eata=lc:n,tc:n,mq:16,tm:0,et:n,rs:n".
* An example using the list of detection probes could be:
* "eata=0x7410,0x230,lc:y,tc:n,mq:4,eh:n,et:n".
*
* When loading as a module, parameters can be specified as well.
* The above example would be (use 1 in place of y and 0 in place of n):
*
* modprobe eata io_port=0x7410,0x230 linked_comm=1 tagged_comm=0 \
* max_queue_depth=4 tag_mode=0 use_new_eh_code=0
* max_queue_depth=4 tag_mode=0 use_new_eh_code=0 \
* ext_tran=0 rev_scan=1
*
* ----------------------------------------------------------------------------
* In this implementation, linked commands are designed to work with any DISK
......@@ -307,6 +331,19 @@
* When the driver detects a batch including overlapping requests
* (a really rare event) strict serial (pid) order is enforced.
* ----------------------------------------------------------------------------
* The extended translation option (et:y) is useful when using large physical
* disks/arrays. It could also be useful when switching between Adaptec boards
* and DPT boards without reformatting the disk.
* When a boot disk is partitioned with extended translation, in order to
* be able to boot it with a DPT board is could be necessary to add to
* lilo.conf additional commands as in the following example:
*
* fix-table
* disk=/dev/sda bios=0x80 sectors=63 heads=128 cylindres=546
*
* where the above geometry should be replaced with the one reported at
* power up by the DPT controller.
* ----------------------------------------------------------------------------
*
* The boards are named EATA0, EATA1,... according to the detection order.
*
......@@ -330,6 +367,8 @@ MODULE_PARM(link_statistics, "i");
MODULE_PARM(max_queue_depth, "i");
MODULE_PARM(tag_mode, "i");
MODULE_PARM(use_new_eh_code, "i");
MODULE_PARM(ext_tran, "i");
MODULE_PARM(rev_scan, "i");
MODULE_AUTHOR("Dario Ballabio");
#endif
......@@ -413,6 +452,7 @@ struct proc_dir_entry proc_scsi_eata2x = {
#undef DEBUG_RESET
#undef DEBUG_GENERATE_ERRORS
#undef DEBUG_GENERATE_ABORTS
#undef DEBUG_GEOMETRY
#define MAX_ISA 4
#define MAX_VESA 0
......@@ -663,6 +703,8 @@ static int do_trace = FALSE;
static int setup_done = FALSE;
static int link_statistics = 0;
static int tag_mode = TAG_MIXED;
static int ext_tran = FALSE;
static int rev_scan = TRUE;
#if defined(CONFIG_SCSI_EATA_TAGGED_QUEUE)
static int tagged_comm = TRUE;
......@@ -1067,9 +1109,9 @@ __initfunc (static inline int port_detect \
if (j == 0) {
printk("EATA/DMA 2.0x: Copyright (C) 1994-1998 Dario Ballabio.\n");
printk("%s config options -> tc:%c, lc:%c, mq:%d, eh:%c.\n",
driver_name, tag_type, YESNO(linked_comm),
max_queue_depth, YESNO(use_new_eh_code));
printk("%s config options -> tc:%c, lc:%c, mq:%d, eh:%c, rs:%c, et:%c.\n",
driver_name, tag_type, YESNO(linked_comm), max_queue_depth,
YESNO(use_new_eh_code), YESNO(rev_scan), YESNO(ext_tran));
}
printk("%s: 2.0%c, %s 0x%03lx, IRQ %u, %s, SG %d, MB %d.\n",
......@@ -1132,6 +1174,8 @@ __initfunc (void eata2x_setup(char *str, int *ints)) {
else if (!strncmp(cur, "mq:", 3)) max_queue_depth = val;
else if (!strncmp(cur, "ls:", 3)) link_statistics = val;
else if (!strncmp(cur, "eh:", 3)) use_new_eh_code = val;
else if (!strncmp(cur, "et:", 3)) ext_tran = val;
else if (!strncmp(cur, "rs:", 3)) rev_scan = val;
if ((cur = strchr(cur, ','))) ++cur;
}
......@@ -1165,8 +1209,8 @@ __initfunc (static void add_pci_ports(void)) {
if ((addr & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_IO)
continue;
/* Reverse the returned address order */
io_port[MAX_INT_PARAM + MAX_PCI - k] =
/* Order addresses according to rev_scan value */
io_port[MAX_INT_PARAM + (rev_scan ? (MAX_PCI - k) : (1 + k))] =
(addr & PCI_BASE_ADDRESS_IO_MASK) + PCI_BASE_ADDRESS_0;
}
......@@ -1193,8 +1237,8 @@ __initfunc (static void add_pci_ports(void)) {
if ((addr & PCI_BASE_ADDRESS_SPACE) != PCI_BASE_ADDRESS_SPACE_IO)
continue;
/* Reverse the returned address order */
io_port[MAX_INT_PARAM + MAX_PCI - k] =
/* Order addresses according to rev_scan value */
io_port[MAX_INT_PARAM + (rev_scan ? (MAX_PCI - k) : (1 + k))] =
(addr & PCI_BASE_ADDRESS_IO_MASK) + PCI_BASE_ADDRESS_0;
}
......@@ -1846,6 +1890,23 @@ int eata2x_reset(Scsi_Cmnd *SCarg) {
#endif /* new_eh_code */
int eata2x_biosparam(Disk *disk, kdev_t dev, int *dkinfo) {
int size = disk->capacity;
if (ext_tran || (scsicam_bios_param(disk, dev, dkinfo) < 0)) {
dkinfo[0] = 255;
dkinfo[1] = 63;
dkinfo[2] = size / (dkinfo[0] * dkinfo[1]);
}
#if defined (DEBUG_GEOMETRY)
printk ("%s: biosparam, head=%d, sec=%d, cyl=%d.\n", driver_name,
dkinfo[0], dkinfo[1], dkinfo[2]);
#endif
return FALSE;
}
static void sort(unsigned long sk[], unsigned int da[], unsigned int n,
unsigned int rev) {
unsigned int i, j, k, y;
......
......@@ -14,8 +14,9 @@ int eata2x_abort(Scsi_Cmnd *);
int eata2x_old_abort(Scsi_Cmnd *);
int eata2x_reset(Scsi_Cmnd *);
int eata2x_old_reset(Scsi_Cmnd *, unsigned int);
int eata2x_biosparam(Disk *, kdev_t, int *);
#define EATA_VERSION "4.32.00"
#define EATA_VERSION "4.33.00"
#define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
......@@ -32,7 +33,7 @@ int eata2x_old_reset(Scsi_Cmnd *, unsigned int);
eh_device_reset_handler: NULL, \
eh_bus_reset_handler: NULL, \
eh_host_reset_handler: eata2x_reset, \
bios_param: scsicam_bios_param, \
bios_param: eata2x_biosparam, \
this_id: 7, \
unchecked_isa_dma: 1, \
use_clustering: ENABLE_CLUSTERING, \
......@@ -48,7 +49,7 @@ int eata2x_old_reset(Scsi_Cmnd *, unsigned int);
queuecommand: eata2x_queuecommand, \
abort: eata2x_old_abort, \
reset: eata2x_old_reset, \
bios_param: scsicam_bios_param, \
bios_param: eata2x_biosparam, \
this_id: 7, \
unchecked_isa_dma: 1, \
use_clustering: ENABLE_CLUSTERING \
......
This diff is collapsed.
......@@ -4,6 +4,7 @@
#ifndef _U14_34F_H
#define _U14_34F_H
#include <scsi/scsicam.h>
#include <linux/version.h>
int u14_34f_detect(Scsi_Host_Template *);
......@@ -15,7 +16,7 @@ int u14_34f_reset(Scsi_Cmnd *);
int u14_34f_old_reset(Scsi_Cmnd *, unsigned int);
int u14_34f_biosparam(Disk *, kdev_t, int *);
#define U14_34F_VERSION "4.32.00"
#define U14_34F_VERSION "4.33.00"
#define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
......
This diff is collapsed.
This diff is collapsed.
......@@ -47,6 +47,7 @@
#define ATAFB_EXT
#define ATAFB_FALCON
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
......
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.
......@@ -21,6 +21,7 @@
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
......
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.
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