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
2a310a3b
Commit
2a310a3b
authored
Jun 08, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-mtd.bkbits.net/sbc8260-2.6
into evo.osdl.org:/home/torvalds/v2.6/linux
parents
03a449ea
056d7d3a
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
137 additions
and
53 deletions
+137
-53
drivers/net/3c527.c
drivers/net/3c527.c
+1
-0
drivers/net/at1700.c
drivers/net/at1700.c
+9
-4
drivers/net/e1000/e1000_main.c
drivers/net/e1000/e1000_main.c
+2
-1
drivers/net/epic100.c
drivers/net/epic100.c
+28
-2
drivers/net/tulip/interrupt.c
drivers/net/tulip/interrupt.c
+4
-0
include/linux/ethtool.h
include/linux/ethtool.h
+2
-0
lib/rwsem.c
lib/rwsem.c
+20
-15
net/core/ethtool.c
net/core/ethtool.c
+71
-31
No files found.
drivers/net/3c527.c
View file @
2a310a3b
...
...
@@ -287,6 +287,7 @@ struct net_device *__init mc32_probe(int unit)
}
}
free_netdev
(
dev
);
return
ERR_PTR
(
-
ENODEV
);
}
...
...
drivers/net/at1700.c
View file @
2a310a3b
...
...
@@ -242,7 +242,7 @@ static void cleanup_card(struct net_device *dev)
{
#ifdef CONFIG_MCA
struct
net_local
*
lp
=
netdev_priv
(
dev
);
if
(
lp
->
mca_slot
)
if
(
lp
->
mca_slot
>=
0
)
mca_mark_as_unused
(
lp
->
mca_slot
);
#endif
free_irq
(
dev
->
irq
,
NULL
);
...
...
@@ -444,11 +444,11 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
break
;
}
if
(
i
==
8
)
{
goto
err_
out
;
goto
err_
mca
;
}
}
else
{
if
(
fmv18x_probe_list
[
inb
(
ioaddr
+
IOCONFIG
)
&
0x07
]
!=
ioaddr
)
goto
err_
out
;
goto
err_
mca
;
irq
=
fmv_irqmap
[(
inb
(
ioaddr
+
IOCONFIG
)
>>
6
)
&
0x03
];
}
}
...
...
@@ -546,11 +546,16 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
if
(
ret
)
{
printk
(
" AT1700 at %#3x is unusable due to a conflict on"
"IRQ %d.
\n
"
,
ioaddr
,
irq
);
goto
err_
out
;
goto
err_
mca
;
}
return
0
;
err_mca:
#ifdef CONFIG_MCA
if
(
slot
>=
0
)
mca_mark_as_unused
(
slot
);
#endif
err_out:
#ifndef CONFIG_X86_PC9800
release_region
(
ioaddr
,
AT1700_IO_EXTENT
);
...
...
drivers/net/e1000/e1000_main.c
View file @
2a310a3b
...
...
@@ -52,7 +52,7 @@
char
e1000_driver_name
[]
=
"e1000"
;
char
e1000_driver_string
[]
=
"Intel(R) PRO/1000 Network Driver"
;
char
e1000_driver_version
[]
=
"5.2.52-k
2
"
;
char
e1000_driver_version
[]
=
"5.2.52-k
4
"
;
char
e1000_copyright
[]
=
"Copyright (c) 1999-2004 Intel Corporation."
;
/* e1000_pci_tbl - PCI Device ID Table
...
...
@@ -2143,6 +2143,7 @@ e1000_clean(struct net_device *netdev, int *budget)
if
(
work_done
<
work_to_do
||
!
netif_running
(
netdev
))
{
netif_rx_complete
(
netdev
);
e1000_irq_enable
(
adapter
);
return
0
;
}
return
(
work_done
>=
work_to_do
);
...
...
drivers/net/epic100.c
View file @
2a310a3b
...
...
@@ -66,12 +66,15 @@
LK1.1.14 (Kryzsztof Halasa):
* fix spurious bad initializations
* pound phy a la SMSC's app note on the subject
AC1.1.14ac
* fix power up/down for ethtool that broke in 1.11
*/
#define DRV_NAME "epic100"
#define DRV_VERSION "1.11+LK1.1.14"
#define DRV_RELDATE "
Aug 4, 2002
"
#define DRV_VERSION "1.11+LK1.1.14
+AC1.1.14
"
#define DRV_RELDATE "
June 2, 2004
"
/* The user-configurable values.
These may be modified when a driver module is loaded.*/
...
...
@@ -1424,6 +1427,27 @@ static void netdev_set_msglevel(struct net_device *dev, u32 value)
debug
=
value
;
}
static
int
ethtool_begin
(
struct
net_device
*
dev
)
{
unsigned
long
ioaddr
=
dev
->
base_addr
;
/* power-up, if interface is down */
if
(
!
netif_running
(
dev
))
{
outl
(
0x0200
,
ioaddr
+
GENCTL
);
outl
((
inl
(
ioaddr
+
NVCTL
)
&
~
0x003C
)
|
0x4800
,
ioaddr
+
NVCTL
);
}
return
0
;
}
static
void
ethtool_complete
(
struct
net_device
*
dev
)
{
unsigned
long
ioaddr
=
dev
->
base_addr
;
/* power-down, if interface is down */
if
(
!
netif_running
(
dev
))
{
outl
(
0x0008
,
ioaddr
+
GENCTL
);
outl
((
inl
(
ioaddr
+
NVCTL
)
&
~
0x483C
)
|
0x0000
,
ioaddr
+
NVCTL
);
}
}
static
struct
ethtool_ops
netdev_ethtool_ops
=
{
.
get_drvinfo
=
netdev_get_drvinfo
,
.
get_settings
=
netdev_get_settings
,
...
...
@@ -1434,6 +1458,8 @@ static struct ethtool_ops netdev_ethtool_ops = {
.
set_msglevel
=
netdev_set_msglevel
,
.
get_sg
=
ethtool_op_get_sg
,
.
get_tx_csum
=
ethtool_op_get_tx_csum
,
.
begin
=
ethtool_begin
,
.
complete
=
ethtool_complete
};
static
int
netdev_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
)
...
...
drivers/net/tulip/interrupt.c
View file @
2a310a3b
...
...
@@ -133,6 +133,10 @@ int tulip_poll(struct net_device *dev, int *budget)
tp
->
rx_ring
[
entry
].
status
);
do
{
if
(
inl
(
dev
->
base_addr
+
CSR5
)
==
0xffffffff
)
{
printk
(
KERN_DEBUG
" In tulip_poll(), hardware disappeared.
\n
"
);
break
;
}
/* Acknowledge current RX interrupt sources. */
outl
((
RxIntr
|
RxNoBuf
),
dev
->
base_addr
+
CSR5
);
...
...
include/linux/ethtool.h
View file @
2a310a3b
...
...
@@ -351,6 +351,8 @@ struct ethtool_ops {
int
(
*
phys_id
)(
struct
net_device
*
,
u32
);
int
(
*
get_stats_count
)(
struct
net_device
*
);
void
(
*
get_ethtool_stats
)(
struct
net_device
*
,
struct
ethtool_stats
*
,
u64
*
);
int
(
*
begin
)(
struct
net_device
*
);
void
(
*
complete
)(
struct
net_device
*
);
};
/* CMDs currently supported */
...
...
lib/rwsem.c
View file @
2a310a3b
...
...
@@ -29,15 +29,15 @@ void rwsemtrace(struct rw_semaphore *sem, const char *str)
/*
* handle the lock being released whilst there are processes blocked on it that can now run
* - if we come here, then:
* - the 'active part' of the count (&0x0000ffff)
reached zero but has been re-incremented
* - if we come here
from up_xxxx()
, then:
* - the 'active part' of the count (&0x0000ffff)
had reached zero (but may have changed)
* - the 'waiting part' of the count (&0xffff0000) is negative (and will still be so)
* - there must be someone on the queue
* - the spinlock must be held by the caller
* - woken process blocks are discarded from the list after having task zeroed
* - writers are only woken if
wakewrite is non-zero
* - writers are only woken if
downgrading is false
*/
static
inline
struct
rw_semaphore
*
__rwsem_do_wake
(
struct
rw_semaphore
*
sem
,
int
wakewrite
)
static
inline
struct
rw_semaphore
*
__rwsem_do_wake
(
struct
rw_semaphore
*
sem
,
int
downgrading
)
{
struct
rwsem_waiter
*
waiter
;
struct
task_struct
*
tsk
;
...
...
@@ -46,10 +46,12 @@ static inline struct rw_semaphore *__rwsem_do_wake(struct rw_semaphore *sem, int
rwsemtrace
(
sem
,
"Entering __rwsem_do_wake"
);
if
(
!
wakewrite
)
if
(
downgrading
)
goto
dont_wake_writers
;
/* only wake someone up if we can transition the active part of the count from 0 -> 1 */
/* if we came through an up_xxxx() call, we only only wake someone up
* if we can transition the active part of the count from 0 -> 1
*/
try_again:
oldcount
=
rwsem_atomic_update
(
RWSEM_ACTIVE_BIAS
,
sem
)
-
RWSEM_ACTIVE_BIAS
;
if
(
oldcount
&
RWSEM_ACTIVE_MASK
)
...
...
@@ -78,9 +80,10 @@ static inline struct rw_semaphore *__rwsem_do_wake(struct rw_semaphore *sem, int
if
(
waiter
->
flags
&
RWSEM_WAITING_FOR_WRITE
)
goto
out
;
/* grant an infinite number of read locks to the readers at the front of the queue
* - note we increment the 'active part' of the count by the number of readers (less one
* for the activity decrement we've already done) before waking any processes up
/* grant an infinite number of read locks to the readers at the front
* of the queue
* - note we increment the 'active part' of the count by the number of
* readers before waking any processes up
*/
readers_only:
woken
=
0
;
...
...
@@ -95,8 +98,10 @@ static inline struct rw_semaphore *__rwsem_do_wake(struct rw_semaphore *sem, int
}
while
(
waiter
->
flags
&
RWSEM_WAITING_FOR_READ
);
loop
=
woken
;
woken
*=
RWSEM_ACTIVE_BIAS
-
RWSEM_WAITING_BIAS
;
woken
-=
RWSEM_ACTIVE_BIAS
;
woken
*=
RWSEM_ACTIVE_BIAS
-
RWSEM_WAITING_BIAS
;
if
(
!
downgrading
)
woken
-=
RWSEM_ACTIVE_BIAS
;
/* we'd already done one increment
* earlier */
rwsem_atomic_add
(
woken
,
sem
);
next
=
sem
->
wait_list
.
next
;
...
...
@@ -150,7 +155,7 @@ static inline struct rw_semaphore *rwsem_down_failed_common(struct rw_semaphore
* - it might even be this process, since the waker takes a more active part
*/
if
(
!
(
count
&
RWSEM_ACTIVE_MASK
))
sem
=
__rwsem_do_wake
(
sem
,
1
);
sem
=
__rwsem_do_wake
(
sem
,
0
);
spin_unlock
(
&
sem
->
wait_lock
);
...
...
@@ -201,7 +206,7 @@ struct rw_semaphore fastcall __sched *rwsem_down_write_failed(struct rw_semaphor
/*
* handle waking up a waiter on the semaphore
* - up_read has decremented the active part of the count if we come here
* - up_read
/up_write
has decremented the active part of the count if we come here
*/
struct
rw_semaphore
fastcall
*
rwsem_wake
(
struct
rw_semaphore
*
sem
)
{
...
...
@@ -211,7 +216,7 @@ struct rw_semaphore fastcall *rwsem_wake(struct rw_semaphore *sem)
/* do nothing if list empty */
if
(
!
list_empty
(
&
sem
->
wait_list
))
sem
=
__rwsem_do_wake
(
sem
,
1
);
sem
=
__rwsem_do_wake
(
sem
,
0
);
spin_unlock
(
&
sem
->
wait_lock
);
...
...
@@ -233,7 +238,7 @@ struct rw_semaphore fastcall *rwsem_downgrade_wake(struct rw_semaphore *sem)
/* do nothing if list empty */
if
(
!
list_empty
(
&
sem
->
wait_list
))
sem
=
__rwsem_do_wake
(
sem
,
0
);
sem
=
__rwsem_do_wake
(
sem
,
1
);
spin_unlock
(
&
sem
->
wait_lock
);
...
...
net/core/ethtool.c
View file @
2a310a3b
...
...
@@ -652,6 +652,7 @@ int dev_ethtool(struct ifreq *ifr)
struct
net_device
*
dev
=
__dev_get_by_name
(
ifr
->
ifr_name
);
void
__user
*
useraddr
=
ifr
->
ifr_data
;
u32
ethcmd
;
int
rc
;
/*
* XXX: This can be pushed down into the ethtool_* handlers that
...
...
@@ -669,70 +670,109 @@ int dev_ethtool(struct ifreq *ifr)
if
(
copy_from_user
(
&
ethcmd
,
useraddr
,
sizeof
(
ethcmd
)))
return
-
EFAULT
;
if
(
dev
->
ethtool_ops
->
begin
)
if
((
rc
=
dev
->
ethtool_ops
->
begin
(
dev
))
<
0
)
return
rc
;
switch
(
ethcmd
)
{
case
ETHTOOL_GSET
:
return
ethtool_get_settings
(
dev
,
useraddr
);
rc
=
ethtool_get_settings
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SSET
:
return
ethtool_set_settings
(
dev
,
useraddr
);
rc
=
ethtool_set_settings
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GDRVINFO
:
return
ethtool_get_drvinfo
(
dev
,
useraddr
);
rc
=
ethtool_get_drvinfo
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GREGS
:
return
ethtool_get_regs
(
dev
,
useraddr
);
rc
=
ethtool_get_regs
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GWOL
:
return
ethtool_get_wol
(
dev
,
useraddr
);
rc
=
ethtool_get_wol
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SWOL
:
return
ethtool_set_wol
(
dev
,
useraddr
);
rc
=
ethtool_set_wol
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GMSGLVL
:
return
ethtool_get_msglevel
(
dev
,
useraddr
);
rc
=
ethtool_get_msglevel
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SMSGLVL
:
return
ethtool_set_msglevel
(
dev
,
useraddr
);
rc
=
ethtool_set_msglevel
(
dev
,
useraddr
);
break
;
case
ETHTOOL_NWAY_RST
:
return
ethtool_nway_reset
(
dev
);
rc
=
ethtool_nway_reset
(
dev
);
break
;
case
ETHTOOL_GLINK
:
return
ethtool_get_link
(
dev
,
useraddr
);
rc
=
ethtool_get_link
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GEEPROM
:
return
ethtool_get_eeprom
(
dev
,
useraddr
);
rc
=
ethtool_get_eeprom
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SEEPROM
:
return
ethtool_set_eeprom
(
dev
,
useraddr
);
rc
=
ethtool_set_eeprom
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GCOALESCE
:
return
ethtool_get_coalesce
(
dev
,
useraddr
);
rc
=
ethtool_get_coalesce
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SCOALESCE
:
return
ethtool_set_coalesce
(
dev
,
useraddr
);
rc
=
ethtool_set_coalesce
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GRINGPARAM
:
return
ethtool_get_ringparam
(
dev
,
useraddr
);
rc
=
ethtool_get_ringparam
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SRINGPARAM
:
return
ethtool_set_ringparam
(
dev
,
useraddr
);
rc
=
ethtool_set_ringparam
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GPAUSEPARAM
:
return
ethtool_get_pauseparam
(
dev
,
useraddr
);
rc
=
ethtool_get_pauseparam
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SPAUSEPARAM
:
return
ethtool_set_pauseparam
(
dev
,
useraddr
);
rc
=
ethtool_set_pauseparam
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GRXCSUM
:
return
ethtool_get_rx_csum
(
dev
,
useraddr
);
rc
=
ethtool_get_rx_csum
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SRXCSUM
:
return
ethtool_set_rx_csum
(
dev
,
useraddr
);
rc
=
ethtool_set_rx_csum
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GTXCSUM
:
return
ethtool_get_tx_csum
(
dev
,
useraddr
);
rc
=
ethtool_get_tx_csum
(
dev
,
useraddr
);
break
;
case
ETHTOOL_STXCSUM
:
return
ethtool_set_tx_csum
(
dev
,
useraddr
);
rc
=
ethtool_set_tx_csum
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GSG
:
return
ethtool_get_sg
(
dev
,
useraddr
);
rc
=
ethtool_get_sg
(
dev
,
useraddr
);
break
;
case
ETHTOOL_SSG
:
return
ethtool_set_sg
(
dev
,
useraddr
);
rc
=
ethtool_set_sg
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GTSO
:
return
ethtool_get_tso
(
dev
,
useraddr
);
rc
=
ethtool_get_tso
(
dev
,
useraddr
);
break
;
case
ETHTOOL_STSO
:
return
ethtool_set_tso
(
dev
,
useraddr
);
rc
=
ethtool_set_tso
(
dev
,
useraddr
);
break
;
case
ETHTOOL_TEST
:
return
ethtool_self_test
(
dev
,
useraddr
);
rc
=
ethtool_self_test
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GSTRINGS
:
return
ethtool_get_strings
(
dev
,
useraddr
);
rc
=
ethtool_get_strings
(
dev
,
useraddr
);
break
;
case
ETHTOOL_PHYS_ID
:
return
ethtool_phys_id
(
dev
,
useraddr
);
rc
=
ethtool_phys_id
(
dev
,
useraddr
);
break
;
case
ETHTOOL_GSTATS
:
return
ethtool_get_stats
(
dev
,
useraddr
);
rc
=
ethtool_get_stats
(
dev
,
useraddr
);
break
;
default:
r
eturn
-
EOPNOTSUPP
;
r
c
=
-
EOPNOTSUPP
;
}
if
(
dev
->
ethtool_ops
->
complete
)
dev
->
ethtool_ops
->
complete
(
dev
);
return
rc
;
ioctl:
if
(
dev
->
do_ioctl
)
...
...
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