Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
d43cc577
Commit
d43cc577
authored
Nov 23, 2007
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import 1.2.7
parent
f1bf8612
Changes
22
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
269 additions
and
123 deletions
+269
-123
Makefile
Makefile
+1
-1
arch/alpha/config.in
arch/alpha/config.in
+5
-5
arch/i386/config.in
arch/i386/config.in
+5
-5
arch/i386/kernel/signal.c
arch/i386/kernel/signal.c
+2
-2
arch/mips/config.in
arch/mips/config.in
+5
-5
arch/sparc/config.in
arch/sparc/config.in
+5
-5
drivers/block/ide-cd.c
drivers/block/ide-cd.c
+37
-5
drivers/char/ChangeLog
drivers/char/ChangeLog
+13
-0
drivers/char/serial.c
drivers/char/serial.c
+1
-0
drivers/char/tty_io.c
drivers/char/tty_io.c
+16
-17
drivers/net/3c503.c
drivers/net/3c503.c
+1
-0
drivers/net/8390.c
drivers/net/8390.c
+59
-37
drivers/net/8390.h
drivers/net/8390.h
+7
-2
drivers/net/Makefile
drivers/net/Makefile
+2
-2
drivers/net/ne.c
drivers/net/ne.c
+84
-22
drivers/net/wd.c
drivers/net/wd.c
+1
-0
drivers/scsi/53c7,8xx.c
drivers/scsi/53c7,8xx.c
+8
-8
drivers/scsi/53c7,8xx.h
drivers/scsi/53c7,8xx.h
+1
-1
drivers/scsi/ChangeLog
drivers/scsi/ChangeLog
+5
-5
fs/buffer.c
fs/buffer.c
+1
-1
include/asm-alpha/byteorder.h
include/asm-alpha/byteorder.h
+5
-0
include/asm-i386/byteorder.h
include/asm-i386/byteorder.h
+5
-0
No files found.
Makefile
View file @
d43cc577
VERSION
=
1
PATCHLEVEL
=
2
SUBLEVEL
=
6
SUBLEVEL
=
7
ARCH
=
i386
...
...
arch/alpha/config.in
View file @
d43cc577
...
...
@@ -43,10 +43,10 @@ else
comment 'SCSI support type (disk, tape, CDrom)'
bool 'S
csi
disk support' CONFIG_BLK_DEV_SD y
bool 'S
csi
tape support' CONFIG_CHR_DEV_ST n
bool 'S
csi
CDROM support' CONFIG_BLK_DEV_SR n
bool 'S
csi
generic support' CONFIG_CHR_DEV_SG n
bool 'S
CSI
disk support' CONFIG_BLK_DEV_SD y
bool 'S
CSI
tape support' CONFIG_CHR_DEV_ST n
bool 'S
CSI
CDROM support' CONFIG_BLK_DEV_SR n
bool 'S
CSI
generic support' CONFIG_CHR_DEV_SG n
comment 'SCSI low-level drivers'
...
...
@@ -233,5 +233,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
fi
if [ "$CONFIG_SCSI" = "y" ]; then
bool 'Verbose
scsi
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
bool 'Verbose
SCSI
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
fi
arch/i386/config.in
View file @
d43cc577
...
...
@@ -69,10 +69,10 @@ else
comment 'SCSI support type (disk, tape, CDrom)'
bool 'S
csi
disk support' CONFIG_BLK_DEV_SD y
bool 'S
csi
tape support' CONFIG_CHR_DEV_ST n
bool 'S
csi
CDROM support' CONFIG_BLK_DEV_SR n
bool 'S
csi
generic support' CONFIG_CHR_DEV_SG n
bool 'S
CSI
disk support' CONFIG_BLK_DEV_SD y
bool 'S
CSI
tape support' CONFIG_CHR_DEV_ST n
bool 'S
CSI
CDROM support' CONFIG_BLK_DEV_SR n
bool 'S
CSI
generic support' CONFIG_CHR_DEV_SG n
comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
...
...
@@ -267,5 +267,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
fi
if [ "$CONFIG_SCSI" = "y" ]; then
bool 'Verbose
scsi
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
bool 'Verbose
SCSI
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
fi
arch/i386/kernel/signal.c
View file @
d43cc577
...
...
@@ -151,10 +151,10 @@ asmlinkage int do_signal(unsigned long oldmask, struct pt_regs * regs)
struct
sigaction
*
sa
;
while
((
signr
=
current
->
signal
&
mask
))
{
__asm__
(
"bsf %
2
,%1
\n\t
"
__asm__
(
"bsf %
3
,%1
\n\t
"
"btrl %1,%0"
:
"=m"
(
current
->
signal
),
"=r"
(
signr
)
:
"1"
(
signr
));
:
"
0"
(
current
->
signal
),
"
1"
(
signr
));
sa
=
current
->
sigaction
+
signr
;
signr
++
;
if
((
current
->
flags
&
PF_PTRACED
)
&&
signr
!=
SIGKILL
)
{
...
...
arch/mips/config.in
View file @
d43cc577
...
...
@@ -63,10 +63,10 @@ else
comment 'SCSI support type (disk, tape, CDrom)'
bool 'S
csi
disk support' CONFIG_BLK_DEV_SD y
bool 'S
csi
tape support' CONFIG_CHR_DEV_ST y
bool 'S
csi
CDROM support' CONFIG_BLK_DEV_SR y
bool 'S
csi
generic support' CONFIG_CHR_DEV_SG y
bool 'S
CSI
disk support' CONFIG_BLK_DEV_SD y
bool 'S
CSI
tape support' CONFIG_CHR_DEV_ST y
bool 'S
CSI
CDROM support' CONFIG_BLK_DEV_SR y
bool 'S
CSI
generic support' CONFIG_CHR_DEV_SG y
comment 'SCSI low-level drivers'
...
...
@@ -252,5 +252,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
fi
if [ "$CONFIG_SCSI" = "y" ]; then
bool 'Verbose
scsi
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
bool 'Verbose
SCSI
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
fi
arch/sparc/config.in
View file @
d43cc577
...
...
@@ -50,10 +50,10 @@ else
comment 'SCSI support type (disk, tape, CDrom)'
bool 'S
csi
disk support' CONFIG_BLK_DEV_SD y
bool 'S
csi
tape support' CONFIG_CHR_DEV_ST n
bool 'S
csi
CDROM support' CONFIG_BLK_DEV_SR n
bool 'S
csi
generic support' CONFIG_CHR_DEV_SG n
bool 'S
CSI
disk support' CONFIG_BLK_DEV_SD y
bool 'S
CSI
tape support' CONFIG_CHR_DEV_ST n
bool 'S
CSI
CDROM support' CONFIG_BLK_DEV_SR n
bool 'S
CSI
generic support' CONFIG_CHR_DEV_SG n
comment 'SCSI low-level drivers'
...
...
@@ -242,5 +242,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
fi
if [ "$CONFIG_SCSI" = "y" ]; then
bool 'Verbose
scsi
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
bool 'Verbose
SCSI
error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
fi
drivers/block/ide-cd.c
View file @
d43cc577
/*
* linux/drivers/block/ide-cd.c
(BETA)
* linux/drivers/block/ide-cd.c
*
* 1.00 Oct 31, 1994 -- Initial version.
* 1.01 Nov 2, 1994 -- Fixed problem with starting request in
...
...
@@ -20,10 +20,17 @@
* 2.03 Jan 10, 1995 -- Rewrite block read routines to handle block sizes
* other than 2k and to move multiple sectors in a
* single transaction.
* 2.04 Apr 21, 1995 -- Add work-around for Creative Labs CD220E drives.
* Thanks to Nick Saw <cwsaw@pts7.pts.mot.com> for
* help in figuring this out. Ditto for Acer and
* Aztech drives, which seem to have the same problem.
*
*
* ATAPI cd-rom driver. To be used with ide.c.
*
* Copyright (C) 1994, 1995 scott snyder <snyder@fnald0.fnal.gov>
* May be copied or modified under the terms of the GNU General Public License
* (../../COPYING).
*/
#include <linux/cdrom.h>
...
...
@@ -88,7 +95,8 @@ struct ide_cd_flags {
unsigned
media_changed
:
1
;
/* Driver has noticed a media change. */
unsigned
toc_valid
:
1
;
/* Saved TOC information is current. */
unsigned
reserved
:
4
;
unsigned
no_lba_toc
:
1
;
/* Drive cannot return TOC info in LBA format */
unsigned
reserved
:
3
;
};
#define CDROM_FLAGS(dev) ((struct ide_cd_flags *)&((dev)->bios_sect))
...
...
@@ -1094,6 +1102,7 @@ cdrom_read_tocentry (ide_dev_t *dev, int trackno, int msf_flag,
static
int
cdrom_read_toc
(
ide_dev_t
*
dev
)
{
int
msf_flag
;
int
stat
,
ntracks
,
i
;
struct
atapi_toc
*
toc
=
cdrom_info
[
dev
->
hwif
][
dev
->
select
.
b
.
drive
].
toc
;
...
...
@@ -1118,8 +1127,11 @@ cdrom_read_toc (ide_dev_t *dev)
if
(
CDROM_FLAGS
(
dev
)
->
toc_valid
)
return
0
;
/* Some drives can't return TOC data in LBA format. */
msf_flag
=
(
CDROM_FLAGS
(
dev
)
->
no_lba_toc
);
/* First read just the header, so we know how long the TOC is. */
stat
=
cdrom_read_tocentry
(
dev
,
0
,
0
,
(
char
*
)
toc
,
stat
=
cdrom_read_tocentry
(
dev
,
0
,
msf_flag
,
(
char
*
)
toc
,
sizeof
(
struct
atapi_toc_header
)
+
sizeof
(
struct
atapi_toc_entry
));
if
(
stat
)
return
stat
;
...
...
@@ -1129,13 +1141,21 @@ cdrom_read_toc (ide_dev_t *dev)
if
(
ntracks
>
MAX_TRACKS
)
ntracks
=
MAX_TRACKS
;
/* Now read the whole schmeer. */
stat
=
cdrom_read_tocentry
(
dev
,
0
,
0
,
(
char
*
)
toc
,
stat
=
cdrom_read_tocentry
(
dev
,
0
,
msf_flag
,
(
char
*
)
toc
,
sizeof
(
struct
atapi_toc_header
)
+
(
ntracks
+
1
)
*
sizeof
(
struct
atapi_toc_entry
));
if
(
stat
)
return
stat
;
byte_swap_word
(
&
toc
->
hdr
.
toc_length
);
for
(
i
=
0
;
i
<=
ntracks
;
i
++
)
{
if
(
msf_flag
)
{
byte
*
adr
=
(
byte
*
)
&
(
toc
->
ent
[
i
].
lba
);
toc
->
ent
[
i
].
lba
=
msf_to_lba
(
adr
[
1
],
adr
[
2
],
adr
[
3
]);
}
else
byte_swap_long
(
&
toc
->
ent
[
i
].
lba
);
}
/* Remember that we've read this stuff. */
CDROM_FLAGS
(
dev
)
->
toc_valid
=
1
;
...
...
@@ -1618,8 +1638,20 @@ static void cdrom_setup (ide_dev_t *dev)
CDROM_FLAGS
(
dev
)
->
toc_valid
=
0
;
CDROM_FLAGS
(
dev
)
->
no_playaudio12
=
0
;
CDROM_FLAGS
(
dev
)
->
no_lba_toc
=
0
;
CDROM_FLAGS
(
dev
)
->
drq_interrupt
=
((
dev
->
id
->
config
&
0x0060
)
==
0x20
);
/* Accommodate some broken drives... */
if
(
strcmp
(
dev
->
id
->
model
,
"CD220E"
)
==
0
)
/* Creative Labs */
CDROM_FLAGS
(
dev
)
->
no_lba_toc
=
1
;
else
if
(
strcmp
(
dev
->
id
->
model
,
"TO-ICSLYAL"
)
==
0
||
/* Acer CD525E */
strcmp
(
dev
->
id
->
model
,
"OTI-SCYLLA"
)
==
0
)
CDROM_FLAGS
(
dev
)
->
no_lba_toc
=
1
;
else
if
(
strcmp
(
dev
->
id
->
model
,
"CDA26803I SE"
)
==
0
)
/* Aztech */
CDROM_FLAGS
(
dev
)
->
no_lba_toc
=
1
;
cdrom_info
[
dev
->
hwif
][
dev
->
select
.
b
.
drive
].
toc
=
NULL
;
cdrom_info
[
dev
->
hwif
][
dev
->
select
.
b
.
drive
].
sector_buffer
=
NULL
;
cdrom_info
[
dev
->
hwif
][
dev
->
select
.
b
.
drive
].
sector_buffered
=
0
;
...
...
drivers/char/ChangeLog
View file @
d43cc577
Wed Apr 26 10:23:44 1995 Theodore Y. Ts'o <tytso@localhost>
* tty_io.c (release_dev): Try to shutdown the line discpline
*before* decrementing the tty count variable; this removes
a potential race condition which occurs when the line
discpline close blocks, and another process then tries
open the same serial port.
* serial.c (rs_hangup): When hanging up, flush the output buffer
befure shutting down the UART. Otherwise the line
discpline close blocks waiting for the characters to get
flushed, which never happens until the serial port gets reused.
Wed Apr 12 08:06:16 1995 Theodore Y. Ts'o <tytso@localhost>
* serial.c (do_serial_hangup, do_softint, check_modem_status,
...
...
drivers/char/serial.c
View file @
d43cc577
...
...
@@ -2090,6 +2090,7 @@ void rs_hangup(struct tty_struct *tty)
if
(
serial_paranoia_check
(
info
,
tty
->
device
,
"rs_hangup"
))
return
;
rs_flush_buffer
(
tty
);
shutdown
(
info
);
info
->
event
=
0
;
info
->
count
=
0
;
...
...
drivers/char/tty_io.c
View file @
d43cc577
...
...
@@ -1006,6 +1006,22 @@ static void release_dev(struct file * filp)
tty
->
link
->
count
=
0
;
}
}
if
(
tty
->
count
<=
1
)
{
/*
* Shutdown the current line discipline, and reset it
* to N_TTY.
*/
if
(
tty
->
ldisc
.
close
)
(
tty
->
ldisc
.
close
)(
tty
);
tty
->
ldisc
=
ldiscs
[
N_TTY
];
tty
->
termios
->
c_line
=
N_TTY
;
if
(
o_tty
&&
o_tty
->
count
<=
0
)
{
if
(
o_tty
->
ldisc
.
close
)
(
o_tty
->
ldisc
.
close
)(
o_tty
);
o_tty
->
ldisc
=
ldiscs
[
N_TTY
];
o_tty
->
termios
->
c_line
=
N_TTY
;
}
}
if
(
--
tty
->
count
<
0
)
{
printk
(
"release_dev: bad tty->count (%d) for %s
\n
"
,
tty
->
count
,
tty_name
(
tty
));
...
...
@@ -1039,23 +1055,6 @@ static void release_dev(struct file * filp)
(
*
p
)
->
tty
=
NULL
;
}
/*
* Shutdown the current line discipline, and reset it to
* N_TTY.
*/
if
(
tty
->
ldisc
.
close
)
(
tty
->
ldisc
.
close
)(
tty
);
tty
->
ldisc
=
ldiscs
[
N_TTY
];
tty
->
termios
->
c_line
=
N_TTY
;
if
(
o_tty
)
{
if
(
o_tty
->
ldisc
.
close
)
(
o_tty
->
ldisc
.
close
)(
o_tty
);
o_tty
->
ldisc
=
ldiscs
[
N_TTY
];
#if 0 /* No way! We just released the termios struct! */
o_tty->termios->c_line = N_TTY;
#endif
}
tty
->
driver
.
table
[
idx
]
=
NULL
;
if
(
tty
->
driver
.
flags
&
TTY_DRIVER_RESET_TERMIOS
)
{
tty
->
driver
.
termios
[
idx
]
=
NULL
;
...
...
drivers/net/3c503.c
View file @
d43cc577
...
...
@@ -317,6 +317,7 @@ el2_close(struct device *dev)
outb
(
EGACFR_IRQOFF
,
E33G_GACFR
);
/* disable interrupts. */
NS8390_init
(
dev
,
0
);
dev
->
start
=
0
;
return
0
;
}
...
...
drivers/net/8390.c
View file @
d43cc577
...
...
@@ -15,6 +15,11 @@
This is the chip-specific code for many 8390-based ethernet adaptors.
This is not a complete driver, it must be combined with board-specific
code such as ne.c, wd.c, 3c503.c, etc.
13/04/95 -- Don't blindly swallow ENISR_RDC interrupts for non-shared
memory cards. We need to follow these closely for neX000 cards.
Plus other minor cleanups. -- Paul Gortmaker
*/
static
char
*
version
=
...
...
@@ -83,7 +88,7 @@ int ei_debug = 1;
#endif
/* Max number of packets received at one Intr.
Current this may only be examined by a kernel debugger. */
Current
ly
this may only be examined by a kernel debugger. */
static
int
high_water_mark
=
0
;
/* Index to functions. */
...
...
@@ -124,16 +129,18 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
int
e8390_base
=
dev
->
base_addr
;
struct
ei_device
*
ei_local
=
(
struct
ei_device
*
)
dev
->
priv
;
int
length
,
send_length
;
unsigned
long
flags
;
/* We normally shouldn't be called if dev->tbusy is set, but the
existing code does anyway.
If it has been too long (> 100 or 150ms.) since the last Tx we assume
the board has died and kick it. */
/*
* We normally shouldn't be called if dev->tbusy is set, but the
* existing code does anyway. If it has been too long since the
* last Tx, we assume the board has died and kick it.
*/
if
(
dev
->
tbusy
)
{
/* Do timeouts, just like the 8003 driver. */
int
txsr
=
inb
(
e8390_base
+
EN0_TSR
),
isr
;
int
tickssofar
=
jiffies
-
dev
->
trans_start
;
if
(
tickssofar
<
10
||
(
tickssofar
<
15
&&
!
(
txsr
&
ENTSR_PTX
)))
{
if
(
tickssofar
<
TX_TIMEOUT
||
(
tickssofar
<
(
TX_TIMEOUT
+
5
)
&&
!
(
txsr
&
ENTSR_PTX
)))
{
return
1
;
}
isr
=
inb
(
e8390_base
+
EN0_ISR
);
...
...
@@ -170,15 +177,22 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
if
(
skb
->
len
<=
0
)
return
0
;
save_flags
(
flags
);
cli
();
/* Block a timer-based transmit from overlapping. */
if
(
set_bit
(
0
,
(
void
*
)
&
dev
->
tbusy
)
!=
0
)
{
printk
(
"%s: Transmitter access conflict.
\n
"
,
dev
->
name
);
if
((
set_bit
(
0
,
(
void
*
)
&
dev
->
tbusy
)
!=
0
)
||
ei_local
->
irqlock
)
{
printk
(
"%s: Tx access conflict. irq=%d lock=%d tx1=%d tx2=%d last=%d
\n
"
,
dev
->
name
,
dev
->
interrupt
,
ei_local
->
irqlock
,
ei_local
->
tx1
,
ei_local
->
tx2
,
ei_local
->
lasttx
);
restore_flags
(
flags
);
return
1
;
}
/* Mask interrupts from the ethercard. */
outb
(
0x00
,
e8390_base
+
EN0_IMR
);
ei_local
->
irqlock
=
1
;
restore_flags
(
flags
);
send_length
=
ETH_ZLEN
<
length
?
length
:
ETH_ZLEN
;
...
...
@@ -200,8 +214,9 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
ei_local
->
txing
);
}
else
{
/* We should never get here. */
if
(
ei_debug
)
printk
(
"%s: No packet buffer space for ping-pong use.
\n
"
,
dev
->
name
);
printk
(
"%s: No Tx buffers free. irq=%d tx1=%d tx2=%d last=%d
\n
"
,
dev
->
name
,
dev
->
interrupt
,
ei_local
->
tx1
,
ei_local
->
tx2
,
ei_local
->
lasttx
);
ei_local
->
irqlock
=
0
;
dev
->
tbusy
=
1
;
outb_p
(
ENISR_ALL
,
e8390_base
+
EN0_IMR
);
...
...
@@ -209,19 +224,20 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
}
ei_block_output
(
dev
,
length
,
skb
->
data
,
output_page
);
if
(
!
ei_local
->
txing
)
{
ei_local
->
txing
=
1
;
NS8390_trigger_send
(
dev
,
send_length
,
output_page
);
dev
->
trans_start
=
jiffies
;
if
(
output_page
==
ei_local
->
tx_start_page
)
ei_local
->
tx1
=
-
1
,
ei_local
->
lasttx
=
-
1
;
else
ei_local
->
tx2
=
-
1
,
ei_local
->
lasttx
=
-
2
;
ei_local
->
txing
=
1
;
}
else
ei_local
->
txqueue
++
;
dev
->
tbusy
=
(
ei_local
->
tx1
&&
ei_local
->
tx2
);
}
else
{
/* No pingpong, just a single Tx buffer. */
ei_block_output
(
dev
,
length
,
skb
->
data
,
ei_local
->
tx_start_page
);
ei_local
->
txing
=
1
;
NS8390_trigger_send
(
dev
,
send_length
,
ei_local
->
tx_start_page
);
dev
->
trans_start
=
jiffies
;
dev
->
tbusy
=
1
;
...
...
@@ -242,7 +258,7 @@ void ei_interrupt(int irq, struct pt_regs * regs)
{
struct
device
*
dev
=
(
struct
device
*
)(
irq2dev_map
[
irq
]);
int
e8390_base
;
int
interrupts
,
boguscount
=
0
;
int
interrupts
,
nr_serviced
=
0
;
struct
ei_device
*
ei_local
;
if
(
dev
==
NULL
)
{
...
...
@@ -253,7 +269,6 @@ void ei_interrupt(int irq, struct pt_regs * regs)
ei_local
=
(
struct
ei_device
*
)
dev
->
priv
;
if
(
dev
->
interrupt
||
ei_local
->
irqlock
)
{
/* The "irqlock" check is only for testing. */
sti
();
printk
(
ei_local
->
irqlock
?
"%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.
\n
"
:
"%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.
\n
"
,
...
...
@@ -263,7 +278,6 @@ void ei_interrupt(int irq, struct pt_regs * regs)
}
dev
->
interrupt
=
1
;
sti
();
/* Allow other interrupts. */
/* Change to page 0 and read the intr status reg. */
outb_p
(
E8390_NODMA
+
E8390_PAGE0
,
e8390_base
+
E8390_CMD
);
...
...
@@ -273,16 +287,12 @@ void ei_interrupt(int irq, struct pt_regs * regs)
/* !!Assumption!! -- we stay in page 0. Don't break this. */
while
((
interrupts
=
inb_p
(
e8390_base
+
EN0_ISR
))
!=
0
&&
++
boguscount
<
9
)
{
&&
++
nr_serviced
<
MAX_SERVICE
)
{
if
(
dev
->
start
==
0
)
{
printk
(
"%s: interrupt from stopped card
\n
"
,
dev
->
name
);
interrupts
=
0
;
break
;
}
if
(
interrupts
&
ENISR_RDC
)
{
/* Ack meaningless DMA complete. */
outb_p
(
ENISR_RDC
,
e8390_base
+
EN0_ISR
);
}
if
(
interrupts
&
ENISR_OVER
)
{
ei_rx_overrun
(
dev
);
}
else
if
(
interrupts
&
(
ENISR_RX
+
ENISR_RX_ERR
))
{
...
...
@@ -303,18 +313,26 @@ void ei_interrupt(int irq, struct pt_regs * regs)
if
(
interrupts
&
ENISR_TX_ERR
)
{
outb_p
(
ENISR_TX_ERR
,
e8390_base
+
EN0_ISR
);
/* Ack intr. */
}
if
(
interrupts
&
ENISR_RDC
)
{
if
(
dev
->
mem_start
)
outb_p
(
ENISR_RDC
,
e8390_base
+
EN0_ISR
);
}
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
e8390_base
+
E8390_CMD
);
}
if
(
interrupts
&&
ei_debug
)
{
if
(
boguscount
==
9
)
if
((
interrupts
&
~
ENISR_RDC
)
&&
ei_debug
)
{
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
e8390_base
+
E8390_CMD
);
if
(
nr_serviced
==
MAX_SERVICE
)
{
printk
(
"%s: Too much work at interrupt, status %#2.2x
\n
"
,
dev
->
name
,
interrupts
);
else
outb_p
(
ENISR_ALL
,
e8390_base
+
EN0_ISR
);
/* Ack. most intrs. */
}
else
{
printk
(
"%s: unknown interrupt %#2x
\n
"
,
dev
->
name
,
interrupts
);
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
e8390_base
+
E8390_CMD
);
outb_p
(
0xff
,
e8390_base
+
EN0_ISR
);
/* Ack. all intrs. */
}
}
dev
->
interrupt
=
0
;
return
;
}
...
...
@@ -338,9 +356,9 @@ static void ei_tx_intr(struct device *dev)
ei_local
->
tx1
=
0
;
dev
->
tbusy
=
0
;
if
(
ei_local
->
tx2
>
0
)
{
ei_local
->
txing
=
1
;
NS8390_trigger_send
(
dev
,
ei_local
->
tx2
,
ei_local
->
tx_start_page
+
6
);
dev
->
trans_start
=
jiffies
;
ei_local
->
txing
=
1
;
ei_local
->
tx2
=
-
1
,
ei_local
->
lasttx
=
2
;
}
else
...
...
@@ -352,9 +370,9 @@ static void ei_tx_intr(struct device *dev)
ei_local
->
tx2
=
0
;
dev
->
tbusy
=
0
;
if
(
ei_local
->
tx1
>
0
)
{
ei_local
->
txing
=
1
;
NS8390_trigger_send
(
dev
,
ei_local
->
tx1
,
ei_local
->
tx_start_page
);
dev
->
trans_start
=
jiffies
;
ei_local
->
txing
=
1
;
ei_local
->
tx1
=
-
1
;
ei_local
->
lasttx
=
1
;
}
else
...
...
@@ -402,7 +420,7 @@ static void ei_receive(struct device *dev)
rxing_page
=
inb_p
(
e8390_base
+
EN1_CURPAG
);
outb_p
(
E8390_NODMA
+
E8390_PAGE0
,
e8390_base
+
E8390_CMD
);
/* Remove one frame from the ring. Boundary is alway a page behind. */
/* Remove one frame from the ring. Boundary is alway
s
a page behind. */
this_frame
=
inb_p
(
e8390_base
+
EN0_BOUNDARY
)
+
1
;
if
(
this_frame
>=
ei_local
->
stop_page
)
this_frame
=
ei_local
->
rx_start_page
;
...
...
@@ -475,12 +493,12 @@ static void ei_receive(struct device *dev)
/* This _should_ never happen: it's here for avoiding bad clones. */
if
(
next_frame
>=
ei_local
->
stop_page
)
{
printk
(
"%s: next frame inconsistency, %#2x
..
"
,
dev
->
name
,
printk
(
"%s: next frame inconsistency, %#2x
\n
"
,
dev
->
name
,
next_frame
);
next_frame
=
ei_local
->
rx_start_page
;
}
ei_local
->
current_page
=
next_frame
;
outb
(
next_frame
-
1
,
e8390_base
+
EN0_BOUNDARY
);
outb
_p
(
next_frame
-
1
,
e8390_base
+
EN0_BOUNDARY
);
}
/* If any worth-while packets have been received, dev_rint()
has done a mark_bh(NET_BH) for us and will work on them
...
...
@@ -539,6 +557,9 @@ static struct enet_statistics *get_stats(struct device *dev)
short
ioaddr
=
dev
->
base_addr
;
struct
ei_device
*
ei_local
=
(
struct
ei_device
*
)
dev
->
priv
;
/* If the card is stopped, just return the present stats. */
if
(
dev
->
start
==
0
)
return
&
ei_local
->
stat
;
/* Read the counter registers, assuming we are in page 0. */
ei_local
->
stat
.
rx_frame_errors
+=
inb_p
(
ioaddr
+
EN0_COUNTER0
);
ei_local
->
stat
.
rx_crc_errors
+=
inb_p
(
ioaddr
+
EN0_COUNTER1
);
...
...
@@ -610,6 +631,7 @@ void NS8390_init(struct device *dev, int startp)
struct
ei_device
*
ei_local
=
(
struct
ei_device
*
)
dev
->
priv
;
int
i
;
int
endcfg
=
ei_local
->
word16
?
(
0x48
|
ENDCFG_WTS
)
:
0x48
;
unsigned
long
flags
;
/* Follow National Semi's recommendations for initing the DP83902. */
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_STOP
,
e8390_base
);
/* 0x21 */
...
...
@@ -633,6 +655,7 @@ void NS8390_init(struct device *dev, int startp)
/* Copy the station address into the DS8390 registers,
and set the multicast hash bitmap to receive all multicasts. */
save_flags
(
flags
);
cli
();
outb_p
(
E8390_NODMA
+
E8390_PAGE1
+
E8390_STOP
,
e8390_base
);
/* 0x61 */
for
(
i
=
0
;
i
<
6
;
i
++
)
{
...
...
@@ -645,7 +668,7 @@ void NS8390_init(struct device *dev, int startp)
outb_p
(
ei_local
->
rx_start_page
,
e8390_base
+
EN1_CURPAG
);
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_STOP
,
e8390_base
);
sti
(
);
restore_flags
(
flags
);
dev
->
tbusy
=
0
;
dev
->
interrupt
=
0
;
ei_local
->
tx1
=
ei_local
->
tx2
=
0
;
...
...
@@ -667,7 +690,6 @@ static void NS8390_trigger_send(struct device *dev, unsigned int length,
{
int
e8390_base
=
dev
->
base_addr
;
ei_status
.
txing
=
1
;
outb_p
(
E8390_NODMA
+
E8390_PAGE0
,
e8390_base
);
if
(
inb_p
(
e8390_base
)
&
E8390_TRANS
)
{
...
...
drivers/net/8390.h
View file @
d43cc577
...
...
@@ -44,14 +44,13 @@ struct ei_device {
unsigned
open
:
1
;
unsigned
word16
:
1
;
/* We have the 16-bit (vs 8-bit) version of the card. */
unsigned
txing
:
1
;
/* Transmit Active */
unsigned
dmaing
:
2
;
/* Remote DMA Active */
unsigned
irqlock
:
1
;
/* 8390's intrs disabled when '1'. */
unsigned
pingpong
:
1
;
/* Using the ping-pong driver */
unsigned
char
tx_start_page
,
rx_start_page
,
stop_page
;
unsigned
char
current_page
;
/* Read pointer in buffer */
unsigned
char
interface_num
;
/* Net port (AUI, 10bT.) to use. */
unsigned
char
txqueue
;
/* Tx Packet buffer queue length. */
unsigned
char
in_interrupt
;
unsigned
char
dmaing
;
/* Remote DMA (Tx/Rx/Active) */
short
tx1
,
tx2
;
/* Packet lengths for ping-pong tx. */
short
lasttx
;
/* Alpha version consistency check. */
unsigned
char
reg0
;
/* Register '0' in a WD8013 */
...
...
@@ -61,6 +60,12 @@ struct ei_device {
struct
enet_statistics
stat
;
};
/* The maximum number of 8390 interrupt serivce routines called per IRQ. */
#define MAX_SERVICE 12
/* The maximum number of jiffies waited before assuming a Tx failed. */
#define TX_TIMEOUT 20
#define ei_status (*(struct ei_device *)(dev->priv))
/* Some generic ethernet register configurations. */
...
...
drivers/net/Makefile
View file @
d43cc577
...
...
@@ -11,8 +11,8 @@ include CONFIG
MODULES
:=
NETDRV_OBJS
:=
Space.o auto_irq.o net_init.o loopback.o
CFLAGS
:=
$(CFLAGS)
-I
../../net/inet
CPP
:=
$(CPP)
-I
../../net/inet
override
CFLAGS
:
= $(CFLAGS) -I../../net/inet
override
CPP
:
= $(CPP) -I../../net/inet
.c.o
:
$(CC)
$(CFLAGS)
-c
$<
...
...
drivers/net/ne.c
View file @
d43cc577
#define rw_bugfix
/* ne.c: A general non-shared-memory NS8390 ethernet driver for linux. */
/*
Written 1992-94 by Donald Becker.
...
...
@@ -14,8 +13,16 @@
Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
This driver should work with many programmed-I/O 8390-based ethernet
boards. Currently it support the NE1000, NE2000, many clones,
boards. Currently it support
s
the NE1000, NE2000, many clones,
and some Cabletron products.
13/04/95 -- Change in philosophy. We now monitor ENISR_RDC for
handshaking the Tx PIO xfers. If we don't get a RDC within a
reasonable period of time, we know the 8390 has gone south, and we
kick the board before it locks the system. Also use set_bit() to
create atomic locks on the PIO xfers, and added some defines
that the end user can play with to save memory. -- Paul Gortmaker
*/
/* Routines for the NatSemi-based designs (NE[12]000). */
...
...
@@ -31,6 +38,20 @@ static char *version =
#include <linux/netdevice.h>
#include "8390.h"
/* Some defines that people can play with if so inclined. */
/* Do we support clones that don't adhere to 14,15 of the SAprom ? */
#define CONFIG_NE_BAD_CLONES
/* Do we perform extra sanity checks on stuff ? */
/* #define CONFIG_NE_SANITY */
/* Do we implement the read before write bugfix ? */
/* #define CONFIG_NE_RW_BUGFIX */
/* ---- No user-servicable parts below ---- */
extern
struct
device
*
init_etherdev
(
struct
device
*
dev
,
int
sizeof_private
,
unsigned
long
*
mem_startp
);
...
...
@@ -39,6 +60,7 @@ extern struct device *init_etherdev(struct device *dev, int sizeof_private,
static
unsigned
int
netcard_portlist
[]
=
{
0x300
,
0x280
,
0x320
,
0x340
,
0x360
,
0
};
#ifdef CONFIG_NE_BAD_CLONES
/* A list of bad clones that we none-the-less recognize. */
static
struct
{
char
*
name8
,
*
name16
;
unsigned
char
SAprefix
[
4
];}
bad_clone_list
[]
=
{
...
...
@@ -46,8 +68,12 @@ bad_clone_list[] = {
{
"DE120"
,
"DE220"
,
{
0x00
,
0x80
,
0xc8
,}},
{
"DFI1000"
,
"DFI2000"
,
{
'D'
,
'F'
,
'I'
,}},
/* Original, eh? */
{
"EtherNext UTP8"
,
"EtherNext UTP16"
,
{
0x00
,
0x00
,
0x79
}},
{
"NE1000"
,
"NE2000-invalid"
,
{
0x00
,
0x00
,
0xd8
}},
/* Ancient real NE1000. */
{
"NN1000"
,
"NN2000"
,
{
0x08
,
0x03
,
0x08
}},
/* Outlaw no-name clone. */
{
"4-DIM8"
,
"4-DIM16"
,
{
0x00
,
0x00
,
0x4d
,}},
/* Outlaw 4-Dimension cards. */
{
0
,}
};
#endif
#define NE_BASE (dev->base_addr)
#define NE_CMD 0x00
...
...
@@ -60,6 +86,8 @@ bad_clone_list[] = {
#define NESM_START_PG 0x40
/* First page of TX buffer */
#define NESM_STOP_PG 0x80
/* Last page +1 of RX ring */
#define NE_RDC_TIMEOUT 0x03
/* Max wait in jiffies for Tx RDC */
int
ne_probe
(
struct
device
*
dev
);
static
int
ne_probe1
(
struct
device
*
dev
,
int
ioaddr
);
...
...
@@ -126,9 +154,9 @@ static int ne_probe1(struct device *dev, int ioaddr)
char
*
name
=
NULL
;
int
start_page
,
stop_page
;
int
neX000
,
ctron
;
int
reg0
=
inb
(
ioaddr
);
int
reg0
=
inb
_p
(
ioaddr
);
if
(
reg0
==
0xFF
)
if
(
reg0
==
0xFF
)
return
ENODEV
;
/* Do a preliminary verification that we have a 8390. */
...
...
@@ -140,7 +168,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
inb_p
(
ioaddr
+
EN0_COUNTER0
);
/* Clear the counter by reading. */
if
(
inb_p
(
ioaddr
+
EN0_COUNTER0
)
!=
0
)
{
outb_p
(
reg0
,
ioaddr
);
outb
(
regd
,
ioaddr
+
0x0d
);
/* Restore the old values. */
outb
_p
(
regd
,
ioaddr
+
0x0d
);
/* Restore the old values. */
return
ENODEV
;
}
}
...
...
@@ -169,6 +197,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
};
for
(
i
=
0
;
i
<
sizeof
(
program_seq
)
/
sizeof
(
program_seq
[
0
]);
i
++
)
outb_p
(
program_seq
[
i
].
value
,
ioaddr
+
program_seq
[
i
].
offset
);
}
for
(
i
=
0
;
i
<
32
/*sizeof(SA_prom)*/
;
i
+=
2
)
{
SA_prom
[
i
]
=
inb
(
ioaddr
+
NE_DATAPORT
);
...
...
@@ -208,6 +237,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
start_page
=
0x01
;
stop_page
=
(
wordlength
==
2
)
?
0x40
:
0x20
;
}
else
{
#ifdef CONFIG_NE_BAD_CLONES
/* Ack! Well, there might be a *bad* NE*000 clone there.
Check for total bogus addresses. */
for
(
i
=
0
;
bad_clone_list
[
i
].
name8
;
i
++
)
{
...
...
@@ -227,6 +257,11 @@ static int ne_probe1(struct device *dev, int ioaddr)
SA_prom
[
14
],
SA_prom
[
15
]);
return
ENXIO
;
}
#else
printk
(
" not found.
\n
"
);
return
ENXIO
;
#endif
}
...
...
@@ -242,7 +277,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
outb_p
(
0x00
,
ioaddr
+
EN0_IMR
);
/* Mask it again. */
dev
->
irq
=
autoirq_report
(
0
);
if
(
ei_debug
>
2
)
printk
(
" autoirq is %d"
,
dev
->
irq
);
printk
(
" autoirq is %d
\n
"
,
dev
->
irq
);
}
else
if
(
dev
->
irq
==
2
)
/* Fixup for users that don't know that IRQ 2 is really IRQ 9,
or don't know which one to set. */
...
...
@@ -251,7 +286,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
/* Snarf the interrupt now. There's no point in waiting since we cannot
share and the board will usually be enabled. */
{
int
irqval
=
request_irq
(
dev
->
irq
,
ei_interrupt
,
0
,
"ne
"
);
int
irqval
=
request_irq
(
dev
->
irq
,
ei_interrupt
,
0
,
wordlength
==
2
?
"ne2000"
:
"ne1000
"
);
if
(
irqval
)
{
printk
(
" unable to get IRQ %d (irqval=%d).
\n
"
,
dev
->
irq
,
irqval
);
return
EAGAIN
;
...
...
@@ -260,7 +295,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
dev
->
base_addr
=
ioaddr
;
request_region
(
ioaddr
,
NE_IO_EXTENT
,
"ne2
000"
);
request_region
(
ioaddr
,
NE_IO_EXTENT
,
wordlength
==
2
?
"ne2000"
:
"ne1
000"
);
for
(
i
=
0
;
i
<
ETHER_ADDR_LEN
;
i
++
)
dev
->
dev_addr
[
i
]
=
SA_prom
[
i
];
...
...
@@ -318,10 +353,13 @@ ne_reset_8390(struct device *dev)
static
int
ne_block_input
(
struct
device
*
dev
,
int
count
,
char
*
buf
,
int
ring_offset
)
{
#ifdef CONFIG_NE_SANITY
int
xfer_count
=
count
;
#endif
int
nic_base
=
dev
->
base_addr
;
if
(
ei_status
.
dmaing
)
{
/* This *shouldn't* happen. If it does, it's the last thing you'll see */
if
(
set_bit
(
0
,(
void
*
)
&
ei_status
.
dmaing
))
{
if
(
ei_debug
>
0
)
printk
(
"%s: DMAing conflict in ne_block_input "
"[DMAstat:%d][irqlock:%d][intr:%d].
\n
"
,
...
...
@@ -329,7 +367,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
dev
->
interrupt
);
return
0
;
}
ei_status
.
dmaing
|=
0x0
1
;
ei_status
.
dmaing
|=
0x0
2
;
outb_p
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
nic_base
+
NE_CMD
);
outb_p
(
count
&
0xff
,
nic_base
+
EN0_RCNTLO
);
outb_p
(
count
>>
8
,
nic_base
+
EN0_RCNTHI
);
...
...
@@ -338,14 +376,18 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
outb_p
(
E8390_RREAD
+
E8390_START
,
nic_base
+
NE_CMD
);
if
(
ei_status
.
word16
)
{
insw
(
NE_BASE
+
NE_DATAPORT
,
buf
,
count
>>
1
);
if
(
count
&
0x01
)
buf
[
count
-
1
]
=
inb
(
NE_BASE
+
NE_DATAPORT
),
xfer_count
++
;
if
(
count
&
0x01
)
{
buf
[
count
-
1
]
=
inb
(
NE_BASE
+
NE_DATAPORT
);
#ifdef CONFIG_NE_SANITY
xfer_count
++
;
#endif
}
}
else
{
insb
(
NE_BASE
+
NE_DATAPORT
,
buf
,
count
);
}
/* This was for the ALPHA version only, but enough people have
encountering problems that
it is still here. If you see
been encountering problems so
it is still here. If you see
this message you either 1) have a slightly incompatible clone
or 2) have noise/speed problems with your bus. */
#ifdef CONFIG_NE_SANITY
...
...
@@ -353,7 +395,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
int
addr
,
tries
=
20
;
do
{
/* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
-- it's broken
! Check the "DMA" address instead.
*/
-- it's broken
for Rx on some cards!
*/
int
high
=
inb_p
(
nic_base
+
EN0_RSARHI
);
int
low
=
inb_p
(
nic_base
+
EN0_RSARLO
);
addr
=
(
high
<<
8
)
+
low
;
...
...
@@ -366,7 +408,8 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
dev
->
name
,
ring_offset
+
xfer_count
,
addr
);
}
#endif
ei_status
.
dmaing
&=
~
0x01
;
outb_p
(
ENISR_RDC
,
nic_base
+
EN0_ISR
);
/* Ack intr. */
ei_status
.
dmaing
&=
~
0x03
;
return
ring_offset
+
count
;
}
...
...
@@ -374,15 +417,20 @@ static void
ne_block_output
(
struct
device
*
dev
,
int
count
,
const
unsigned
char
*
buf
,
const
int
start_page
)
{
#ifdef CONFIG_NE_SANITY
int
retries
=
0
;
#endif
int
nic_base
=
NE_BASE
;
unsigned
long
dma_start
;
/* Round the count up for word writes. Do we need to do this?
What effect will an odd byte count have on the 8390?
I should check someday. */
if
(
ei_status
.
word16
&&
(
count
&
0x01
))
count
++
;
if
(
ei_status
.
dmaing
)
{
/* This *shouldn't* happen. If it does, it's the last thing you'll see */
if
(
set_bit
(
0
,(
void
*
)
&
ei_status
.
dmaing
))
{
if
(
ei_debug
>
0
)
printk
(
"%s: DMAing conflict in ne_block_output."
"[DMAstat:%d][irqlock:%d][intr:%d]
\n
"
,
...
...
@@ -390,12 +438,15 @@ ne_block_output(struct device *dev, int count,
dev
->
interrupt
);
return
;
}
ei_status
.
dmaing
|=
0x0
2
;
ei_status
.
dmaing
|=
0x0
4
;
/* We should already be in page 0, but to be safe... */
outb_p
(
E8390_PAGE0
+
E8390_START
+
E8390_NODMA
,
nic_base
+
NE_CMD
);
#ifdef CONFIG_NE_SANITY
retry:
#if defined(rw_bugfix)
#endif
#ifdef CONFIG_NE_RW_BUGFIX
/* Handle the read-before-write bug the same way as the
Crynwr packet driver -- the NatSemi method doesn't work.
Actually this doesn't always work either, but if you have
...
...
@@ -411,6 +462,9 @@ ne_block_output(struct device *dev, int count,
SLOW_DOWN_IO
;
#endif
/* rw_bugfix */
dma_start
=
jiffies
;
outb_p
(
ENISR_RDC
,
nic_base
+
EN0_ISR
);
/* Now the normal output. */
outb_p
(
count
&
0xff
,
nic_base
+
EN0_RCNTLO
);
outb_p
(
count
>>
8
,
nic_base
+
EN0_RCNTHI
);
...
...
@@ -426,12 +480,10 @@ ne_block_output(struct device *dev, int count,
#ifdef CONFIG_NE_SANITY
/* This was for the ALPHA version only, but enough people have
encountering problems that
it is still here. */
been encountering problems so
it is still here. */
if
(
ei_debug
>
1
)
{
/* DMA termination address check... */
int
addr
,
tries
=
20
;
do
{
/* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
-- it's broken! Check the "DMA" address instead. */
int
high
=
inb_p
(
nic_base
+
EN0_RSARHI
);
int
low
=
inb_p
(
nic_base
+
EN0_RSARLO
);
addr
=
(
high
<<
8
)
+
low
;
...
...
@@ -447,7 +499,17 @@ ne_block_output(struct device *dev, int count,
}
}
#endif
ei_status
.
dmaing
&=
~
0x02
;
while
((
inb_p
(
nic_base
+
EN0_ISR
)
&
ENISR_RDC
)
==
0
)
if
(
jiffies
-
dma_start
>
NE_RDC_TIMEOUT
)
{
printk
(
"%s: timeout waiting for Tx RDC.
\n
"
,
dev
->
name
);
ne_reset_8390
(
dev
);
NS8390_init
(
dev
,
1
);
break
;
}
outb_p
(
ENISR_RDC
,
nic_base
+
EN0_ISR
);
/* Ack intr. */
ei_status
.
dmaing
&=
~
0x05
;
return
;
}
...
...
drivers/net/wd.c
View file @
d43cc577
...
...
@@ -368,6 +368,7 @@ wd_close_card(struct device *dev)
if
(
ei_debug
>
1
)
printk
(
"%s: Shutting down ethercard.
\n
"
,
dev
->
name
);
NS8390_init
(
dev
,
0
);
dev
->
start
=
0
;
/* Change from 16-bit to 8-bit shared memory so reboot works. */
outb
(
ei_status
.
reg5
,
wd_cmdreg
+
WD_CMDREG5
);
...
...
drivers/scsi/53c7,8xx.c
View file @
d43cc577
...
...
@@ -740,7 +740,7 @@ static int normal_init (Scsi_Host_Template *tpnt, int board, int chip,
So, we stick it past the end of our hostdata structure.
ASSUMPTION :
Irregardless of how many simultaen
ous SCSI commands we allow,
Regardless of how many simultane
ous SCSI commands we allow,
the probe code only executes a _single_ instruction at a time,
so we only need one here, and don't need to allocate NCR53c7x0_cmd
structures for each target until we are no longer in scan_scsis
...
...
@@ -2304,8 +2304,8 @@ NCR53c8x0_soft_reset (struct Scsi_Host *host) {
/*
* Function static struct NCR53c7x0_cmd *create_cmd (Scsi_Cmnd *cmd)
*
* Purpose : If we have not al
l
ready allocated enough NCR53c7x0_cmd
* structures to satisfy any allowable number of simulta
en
ous
* Purpose : If we have not already allocated enough NCR53c7x0_cmd
* structures to satisfy any allowable number of simulta
ne
ous
* commands for this host; do so (using either scsi_malloc()
* or kmalloc() depending on configuration), and add them to the
* hostdata free list. Take the first structure off the free list,
...
...
@@ -2339,9 +2339,9 @@ create_cmd (Scsi_Cmnd *cmd) {
unsigned
long
flags
;
NCR53c7x0_local_setup
(
cmd
->
host
);
/* FIXME : when we start doing multiple simulta
en
ous commands per LUN,
/* FIXME : when we start doing multiple simulta
ne
ous commands per LUN,
we will need to either
- Do an attach_slave() and detach_slave() the right way (alocate
- Do an attach_slave() and detach_slave() the right way (al
l
ocate
memory in attach_slave() as we do in scsi_register).
- Make sure this code works
with the former being cleaner. At the same time, we can also go with
...
...
@@ -2355,7 +2355,7 @@ create_cmd (Scsi_Cmnd *cmd) {
!
(
hostdata
->
cmd_allocated
[
cmd
->
target
]
&
(
1
<<
cmd
->
lun
)))
{
for
(
i
=
host
->
hostt
->
cmd_per_lun
-
1
;
i
>=
0
--
i
)
{
#ifdef SCSI_MALLOC
/* scsi_malloc must allocate with a 512 byte granularity, but al
l
ways
/* scsi_malloc must allocate with a 512 byte granularity, but always
returns buffers which are aligned on a 512 boundary */
size
=
(
hostdata
->
max_cmd_size
+
511
)
/
512
*
512
;
tmp
=
(
struct
NCR53c7x0_cmd
*
)
scsi_malloc
(
size
);
...
...
@@ -3815,7 +3815,7 @@ NCR53c7xx_reset (Scsi_Cmnd *cmd) {
save_flags
(
flags
);
halt
(
host
);
NCR53c7x0_write8
(
SCNTL1_REG
,
SCNTL1_RST
);
udelay
(
25
);
/* Minimum am
m
ount of time to assert RST */
udelay
(
25
);
/* Minimum amount of time to assert RST */
NCR53c7x0_write8
(
SCNTL1_REG
,
SCNTL1_RST
);
for
(
c
=
(
struct
NCR53c7x0_cmd
*
)
hostdata
->
running_list
,
found
=
0
;
c
;
c
=
(
struct
NCR53c7x0_cmd
*
)
c
->
next
)
{
...
...
@@ -3899,7 +3899,7 @@ shutdown (struct Scsi_Host *host) {
* reset.
*/
NCR53c7x0_write8
(
SCNTL1_REG
,
SCNTL1_RST
);
udelay
(
25
);
/* Minimum am
m
ount of time to assert RST */
udelay
(
25
);
/* Minimum amount of time to assert RST */
NCR53c7x0_write8
(
SCNTL1_REG
,
SCNTL1_RST
);
restore_flags
(
flags
);
return
0
;
...
...
drivers/scsi/53c7,8xx.h
View file @
d43cc577
...
...
@@ -59,7 +59,7 @@ extern int NCR53c7xx_release(struct Scsi_Host *);
#endif
#define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 4)", NCR53c7xx_detect, \
NULL,
/* info */
NULL,
/* command, depr
i
cated */
NULL, \
NULL,
/* info */
NULL,
/* command, depr
e
cated */
NULL, \
NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset, \
NULL
/* slave attach */
, scsicam_bios_param,
/* can queue */
1, \
/* id */
7, 127
/* old SG_ALL */
,
/* cmd per lun */
1 , \
...
...
drivers/scsi/ChangeLog
View file @
d43cc577
...
...
@@ -89,7 +89,7 @@ Mon Feb 20 08:57:17 1995 Eric Youngdale (eric@andante)
* 53c7,8xx.c: crash on AEN fixed, SCSI reset is no longer a NOP,
NULL pointer panic on odd UDCs fixed, two bugs in diagnostic output
fixed, should initialize correctly if left running, now loadable,
new memory allocation, extraneous diagnostic output supressed,
new memory allocation, extraneous diagnostic output sup
p
ressed,
splx() replaced with save/restore flags. [ Drew ]
* hosts.c, hosts.h, scsi_ioctl.c, sd.c, sd_ioctl.c, sg.c, sr.c,
...
...
@@ -111,7 +111,7 @@ Mon Feb 20 08:57:17 1995 Eric Youngdale (eric@andante)
* sr.c: More photo-cd hacks to make sure we get the xa stuff right.
* sr.h, sr.c: Change is_xa to xa_flags field.
* st.c: Diable retries for write operations.
* st.c: Di
s
able retries for write operations.
Wed Feb 15 10:52:56 1995 Eric Youngdale (eric@andante)
...
...
@@ -181,7 +181,7 @@ Wed Feb 1 09:20:45 1995 Eric Youngdale (eric@andante)
* Linux 1.1.89 released.
* Makefile, u14-34f.c: Modulariz
.e
* Makefile, u14-34f.c: Modulariz
e.
* Makefile, eata.c: Modularize. Now version 1.14
...
...
@@ -202,7 +202,7 @@ Wed Feb 1 09:20:45 1995 Eric Youngdale (eric@andante)
* scsi.h: Define QUEUE_FULL condition.
* sd.c: Do not check for non-exist
a
nt partition until after
* sd.c: Do not check for non-exist
e
nt partition until after
new media check.
* sg.c: Undo previous change which was wrong.
...
...
@@ -281,7 +281,7 @@ Wed Jan 18 23:33:09 1995 Eric Youngdale (eric@andante)
* scsi.c: Make RECOVERED_ERROR a SUGGEST_IS_OK.
* sd.c: Fail if we are opening a non-exist
a
nt partition.
* sd.c: Fail if we are opening a non-exist
e
nt partition.
* sr.c: Bump SR_TIMEOUT to 15000.
Do not probe for media size at boot time(hard on changers).
...
...
fs/buffer.c
View file @
d43cc577
...
...
@@ -1849,7 +1849,7 @@ asmlinkage int sys_bdflush(int func, long data)
/* If there are still a lot of dirty buffers around, skip the sleep
and flush some more */
if
(
nr_buffers_type
[
BUF_DIRTY
]
<
(
nr_buffers
-
nr_buffers_type
[
BUF_SHARED
])
*
if
(
nr_buffers_type
[
BUF_DIRTY
]
<
=
(
nr_buffers
-
nr_buffers_type
[
BUF_SHARED
])
*
bdf_prm
.
b_un
.
nfract
/
100
)
{
if
(
current
->
signal
&
(
1
<<
(
SIGKILL
-
1
)))
{
bdflush_running
--
;
...
...
include/asm-alpha/byteorder.h
View file @
d43cc577
...
...
@@ -6,8 +6,13 @@
#undef htonl
#undef htons
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN
#endif
#ifndef LITTLE_ENDIAN_BITFIELD
#define LITTLE_ENDIAN_BITFIELD
#endif
extern
unsigned
long
int
ntohl
(
unsigned
long
int
);
extern
unsigned
short
int
ntohs
(
unsigned
short
int
);
...
...
include/asm-i386/byteorder.h
View file @
d43cc577
...
...
@@ -6,8 +6,13 @@
#undef htonl
#undef htons
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN 1234
#endif
#ifndef LITTLE_ENDIAN_BITFIELD
#define LITTLE_ENDIAN_BITFIELD
#endif
extern
unsigned
long
int
ntohl
(
unsigned
long
int
);
extern
unsigned
short
int
ntohs
(
unsigned
short
int
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment