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
e70d3326
Commit
e70d3326
authored
Oct 11, 2002
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge mandrakesoft.com:/home/jgarzik/repo/linus-2.5
into mandrakesoft.com:/home/jgarzik/repo/net-drivers-2.5
parents
9959faa8
9b425022
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
519 additions
and
111 deletions
+519
-111
Documentation/networking/ewrk3.txt
Documentation/networking/ewrk3.txt
+1
-0
drivers/net/3c509.c
drivers/net/3c509.c
+171
-11
drivers/net/bonding.c
drivers/net/bonding.c
+43
-39
drivers/net/e1000/e1000_main.c
drivers/net/e1000/e1000_main.c
+13
-9
drivers/net/ewrk3.c
drivers/net/ewrk3.c
+61
-25
drivers/net/mii.c
drivers/net/mii.c
+1
-1
drivers/net/pcmcia/smc91c92_cs.c
drivers/net/pcmcia/smc91c92_cs.c
+228
-25
drivers/net/tokenring/tmspci.c
drivers/net/tokenring/tmspci.c
+1
-1
No files found.
Documentation/networking/ewrk3.txt
View file @
e70d3326
...
...
@@ -24,6 +24,7 @@ sequences). To utilise this ability, you have to do 8 things:
kernel with the ewrk3 configuration turned off and reboot.
5) insmod ewrk3.o
[Alan Cox: Changed this so you can insmod ewrk3.o irq=x io=y]
[Adam Kropelin: Multiple cards now supported by irq=x1,x2 io=y1,y2]
6) run the net startup bits for your new eth?? interface manually
(usually /etc/rc.inet[12] at boot time).
7) enjoy!
...
...
drivers/net/3c509.c
View file @
e70d3326
...
...
@@ -49,11 +49,13 @@
- Power Management support
v1.18c 1Mar2002 David Ruggiero <jdr@farfalle.com>
- Full duplex support
v1.19 16Oct2002 Zwane Mwaikambo <zwane@linuxpower.ca>
- Additional ethtool features
*/
#define DRV_NAME "3c509"
#define DRV_VERSION "1.1
8c
"
#define DRV_RELDATE "1
Mar
2002"
#define DRV_VERSION "1.1
9
"
#define DRV_RELDATE "1
6Oct
2002"
/* A few values that may be tweaked. */
...
...
@@ -140,6 +142,8 @@ enum RxFilter {
#define TX_STATUS 0x0B
#define TX_FREE 0x0C
/* Remaining free bytes in Tx buffer. */
#define WN0_CONF_CTRL 0x04
/* Window 0: Configuration control register */
#define WN0_ADDR_CONF 0x06
/* Window 0: Address configuration register */
#define WN0_IRQ 0x08
/* Window 0: Set IRQ line in bits 12-15. */
#define WN4_MEDIA 0x0A
/* Window 4: Various transcvr/media bits. */
#define MEDIA_TP 0x00C0
/* Enable link beat and jabber for 10baseT. */
...
...
@@ -981,6 +985,119 @@ el3_close(struct net_device *dev)
return
0
;
}
static
int
el3_link_ok
(
struct
net_device
*
dev
)
{
int
ioaddr
=
dev
->
base_addr
;
u16
tmp
;
EL3WINDOW
(
4
);
tmp
=
inw
(
ioaddr
+
WN4_MEDIA
);
EL3WINDOW
(
1
);
return
tmp
&
(
1
<<
11
);
}
static
int
el3_netdev_get_ecmd
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
ecmd
)
{
u16
tmp
;
int
ioaddr
=
dev
->
base_addr
;
EL3WINDOW
(
0
);
/* obtain current tranceiver via WN4_MEDIA? */
tmp
=
inw
(
ioaddr
+
WN0_ADDR_CONF
);
ecmd
->
transceiver
=
XCVR_INTERNAL
;
switch
(
tmp
>>
14
)
{
case
0
:
ecmd
->
port
=
PORT_TP
;
break
;
case
1
:
ecmd
->
port
=
PORT_AUI
;
ecmd
->
transceiver
=
XCVR_EXTERNAL
;
break
;
case
3
:
ecmd
->
port
=
PORT_BNC
;
default:
break
;
}
ecmd
->
duplex
=
DUPLEX_HALF
;
ecmd
->
supported
=
0
;
tmp
=
inw
(
ioaddr
+
WN0_CONF_CTRL
);
if
(
tmp
&
(
1
<<
13
))
ecmd
->
supported
|=
SUPPORTED_AUI
;
if
(
tmp
&
(
1
<<
12
))
ecmd
->
supported
|=
SUPPORTED_BNC
;
if
(
tmp
&
(
1
<<
9
))
{
ecmd
->
supported
|=
SUPPORTED_TP
|
SUPPORTED_10baseT_Half
|
SUPPORTED_10baseT_Full
;
/* hmm... */
EL3WINDOW
(
4
);
tmp
=
inw
(
ioaddr
+
WN4_NETDIAG
);
if
(
tmp
&
FD_ENABLE
)
ecmd
->
duplex
=
DUPLEX_FULL
;
}
ecmd
->
speed
=
SPEED_10
;
EL3WINDOW
(
1
);
return
0
;
}
static
int
el3_netdev_set_ecmd
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
ecmd
)
{
u16
tmp
;
int
ioaddr
=
dev
->
base_addr
;
if
(
ecmd
->
speed
!=
SPEED_10
)
return
-
EINVAL
;
if
((
ecmd
->
duplex
!=
DUPLEX_HALF
)
&&
(
ecmd
->
duplex
!=
DUPLEX_FULL
))
return
-
EINVAL
;
if
((
ecmd
->
transceiver
!=
XCVR_INTERNAL
)
&&
(
ecmd
->
transceiver
!=
XCVR_EXTERNAL
))
return
-
EINVAL
;
/* change XCVR type */
EL3WINDOW
(
0
);
tmp
=
inw
(
ioaddr
+
WN0_ADDR_CONF
);
switch
(
ecmd
->
port
)
{
case
PORT_TP
:
tmp
&=
~
(
3
<<
14
);
dev
->
if_port
=
0
;
break
;
case
PORT_AUI
:
tmp
|=
(
1
<<
14
);
dev
->
if_port
=
1
;
break
;
case
PORT_BNC
:
tmp
|=
(
3
<<
14
);
dev
->
if_port
=
3
;
break
;
default:
return
-
EINVAL
;
}
outw
(
tmp
,
ioaddr
+
WN0_ADDR_CONF
);
if
(
dev
->
if_port
==
3
)
{
/* fire up the DC-DC convertor if BNC gets enabled */
tmp
=
inw
(
ioaddr
+
WN0_ADDR_CONF
);
if
(
tmp
&
(
3
<<
14
))
{
outw
(
StartCoax
,
ioaddr
+
EL3_CMD
);
udelay
(
800
);
}
else
return
-
EIO
;
}
EL3WINDOW
(
4
);
tmp
=
inw
(
ioaddr
+
WN4_NETDIAG
);
if
(
ecmd
->
duplex
==
DUPLEX_FULL
)
tmp
|=
FD_ENABLE
;
else
tmp
&=
~
FD_ENABLE
;
outw
(
tmp
,
ioaddr
+
WN4_NETDIAG
);
EL3WINDOW
(
1
);
return
0
;
}
/**
* netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls
* @dev: network interface on which out-of-band action is to be performed
...
...
@@ -989,9 +1106,11 @@ el3_close(struct net_device *dev)
* Process the various commands of the SIOCETHTOOL interface.
*/
static
int
netdev_ethtool_ioctl
(
struct
net_device
*
dev
,
void
*
useraddr
)
static
int
netdev_ethtool_ioctl
(
struct
net_device
*
dev
,
void
*
useraddr
)
{
u32
ethcmd
;
struct
el3_private
*
lp
=
dev
->
priv
;
/* dev_ioctl() in ../../net/core/dev.c has already checked
capable(CAP_NET_ADMIN), so don't bother with that here. */
...
...
@@ -1010,6 +1129,41 @@ static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr)
return
0
;
}
/* get settings */
case
ETHTOOL_GSET
:
{
int
ret
;
struct
ethtool_cmd
ecmd
=
{
ETHTOOL_GSET
};
spin_lock_irq
(
&
lp
->
lock
);
ret
=
el3_netdev_get_ecmd
(
dev
,
&
ecmd
);
spin_unlock_irq
(
&
lp
->
lock
);
if
(
copy_to_user
(
useraddr
,
&
ecmd
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
return
ret
;
}
/* set settings */
case
ETHTOOL_SSET
:
{
int
ret
;
struct
ethtool_cmd
ecmd
;
if
(
copy_from_user
(
&
ecmd
,
useraddr
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
spin_lock_irq
(
&
lp
->
lock
);
ret
=
el3_netdev_set_ecmd
(
dev
,
&
ecmd
);
spin_unlock_irq
(
&
lp
->
lock
);
return
ret
;
}
/* get link status */
case
ETHTOOL_GLINK
:
{
struct
ethtool_value
edata
=
{
ETHTOOL_GLINK
};
spin_lock_irq
(
&
lp
->
lock
);
edata
.
data
=
el3_link_ok
(
dev
);
spin_unlock_irq
(
&
lp
->
lock
);
if
(
copy_to_user
(
useraddr
,
&
edata
,
sizeof
(
edata
)))
return
-
EFAULT
;
return
0
;
}
/* get message-level */
case
ETHTOOL_GMSGLVL
:
{
struct
ethtool_value
edata
=
{
ETHTOOL_GMSGLVL
};
...
...
@@ -1043,7 +1197,8 @@ static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr)
* Process the various out-of-band ioctls passed to this driver.
*/
static
int
netdev_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
)
static
int
netdev_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
)
{
int
rc
=
0
;
...
...
@@ -1060,7 +1215,8 @@ static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
return
rc
;
}
static
void
el3_down
(
struct
net_device
*
dev
)
static
void
el3_down
(
struct
net_device
*
dev
)
{
int
ioaddr
=
dev
->
base_addr
;
...
...
@@ -1077,7 +1233,7 @@ static void el3_down(struct net_device *dev)
/* Turn off thinnet power. Green! */
outw
(
StopCoax
,
ioaddr
+
EL3_CMD
);
else
if
(
dev
->
if_port
==
0
)
{
/* Disable link beat and jabber, if_port may change ere next open(). */
/* Disable link beat and jabber, if_port may change
h
ere next open(). */
EL3WINDOW
(
4
);
outw
(
inw
(
ioaddr
+
WN4_MEDIA
)
&
~
MEDIA_TP
,
ioaddr
+
WN4_MEDIA
);
}
...
...
@@ -1087,7 +1243,8 @@ static void el3_down(struct net_device *dev)
update_stats
(
dev
);
}
static
void
el3_up
(
struct
net_device
*
dev
)
static
void
el3_up
(
struct
net_device
*
dev
)
{
int
i
,
sw_info
,
net_diag
;
int
ioaddr
=
dev
->
base_addr
;
...
...
@@ -1176,7 +1333,8 @@ static void el3_up(struct net_device *dev)
/* Power Management support functions */
#ifdef CONFIG_PM
static
int
el3_suspend
(
struct
pm_dev
*
pdev
)
static
int
el3_suspend
(
struct
pm_dev
*
pdev
)
{
unsigned
long
flags
;
struct
net_device
*
dev
;
...
...
@@ -1202,7 +1360,8 @@ static int el3_suspend(struct pm_dev *pdev)
return
0
;
}
static
int
el3_resume
(
struct
pm_dev
*
pdev
)
static
int
el3_resume
(
struct
pm_dev
*
pdev
)
{
unsigned
long
flags
;
struct
net_device
*
dev
;
...
...
@@ -1228,7 +1387,8 @@ static int el3_resume(struct pm_dev *pdev)
return
0
;
}
static
int
el3_pm_callback
(
struct
pm_dev
*
pdev
,
pm_request_t
rqst
,
void
*
data
)
static
int
el3_pm_callback
(
struct
pm_dev
*
pdev
,
pm_request_t
rqst
,
void
*
data
)
{
switch
(
rqst
)
{
case
PM_SUSPEND
:
...
...
drivers/net/bonding.c
View file @
e70d3326
...
...
@@ -186,6 +186,11 @@
* also added text to distinguish type of load balancing (rr or xor)
* - change arp_ip_target module param from "1-12s" (array of 12 ptrs)
* to "s" (a single ptr)
*
* 2002/09/18 - Jay Vosburgh <fubar at us dot ibm dot com>
* - Fixed up bond_check_dev_link() (and callers): removed some magic
* numbers, banished local MII_ defines, wrapped ioctl calls to
* prevent EFAULT errors
*/
#include <linux/config.h>
...
...
@@ -228,15 +233,6 @@
#define BOND_LINK_MON_INTERV 0
#endif
#undef MII_LINK_UP
#define MII_LINK_UP 0x04
#undef MII_ENDOF_NWAY
#define MII_ENDOF_NWAY 0x20
#undef MII_LINK_READY
#define MII_LINK_READY (MII_LINK_UP)
#ifndef BOND_LINK_ARP_INTERV
#define BOND_LINK_ARP_INTERV 0
#endif
...
...
@@ -387,12 +383,24 @@ static slave_t *bond_detach_slave(bonding_t *bond, slave_t *slave)
}
/*
* if <dev> supports MII link status reporting, check its link
* and report it as a bit field in a short int :
* - 0x04 means link is up,
* - 0x20 means end of autonegociation
* If the device doesn't support MII, then we only report 0x24,
* meaning that the link is up and running since we can't check it.
* Less bad way to call ioctl from within the kernel; this needs to be
* done some other way to get the call out of interrupt context.
* Needs "ioctl" variable to be supplied by calling context.
*/
#define IOCTL(dev, arg, cmd) ({ \
int ret; \
mm_segment_t fs = get_fs(); \
set_fs(get_ds()); \
ret = ioctl(dev, arg, cmd); \
set_fs(fs); \
ret; })
/*
* if <dev> supports MII link status reporting, check its link status.
*
* Return either BMSR_LSTATUS, meaning that the link is up (or we
* can't tell and just pretend it is), or 0, meaning that the link is
* down.
*/
static
u16
bond_check_dev_link
(
struct
net_device
*
dev
)
{
...
...
@@ -401,7 +409,8 @@ static u16 bond_check_dev_link(struct net_device *dev)
struct
mii_ioctl_data
*
mii
;
struct
ethtool_value
etool
;
if
((
ioctl
=
dev
->
do_ioctl
)
!=
NULL
)
{
/* ioctl to access MII */
ioctl
=
dev
->
do_ioctl
;
if
(
ioctl
)
{
/* TODO: set pointer to correct ioctl on a per team member */
/* bases to make this more efficient. that is, once */
/* we determine the correct ioctl, we will always */
...
...
@@ -415,9 +424,9 @@ static u16 bond_check_dev_link(struct net_device *dev)
/* effect... */
etool
.
cmd
=
ETHTOOL_GLINK
;
ifr
.
ifr_data
=
(
char
*
)
&
etool
;
if
(
ioctl
(
dev
,
&
ifr
,
SIOCETHTOOL
)
==
0
)
{
if
(
IOCTL
(
dev
,
&
ifr
,
SIOCETHTOOL
)
==
0
)
{
if
(
etool
.
data
==
1
)
{
return
(
MII_LINK_READY
)
;
return
BMSR_LSTATUS
;
}
else
{
return
(
0
);
...
...
@@ -431,21 +440,17 @@ static u16 bond_check_dev_link(struct net_device *dev)
/* Yes, the mii is overlaid on the ifreq.ifr_ifru */
mii
=
(
struct
mii_ioctl_data
*
)
&
ifr
.
ifr_data
;
if
(
ioctl
(
dev
,
&
ifr
,
SIOCGMIIPHY
)
!=
0
)
{
return
MII_LINK_READY
;
/* can't tell */
if
(
IOCTL
(
dev
,
&
ifr
,
SIOCGMIIPHY
)
!=
0
)
{
return
BMSR_LSTATUS
;
/* can't tell */
}
mii
->
reg_num
=
1
;
if
(
ioctl
(
dev
,
&
ifr
,
SIOCGMIIREG
)
==
0
)
{
/*
* mii->val_out contains MII reg 1, BMSR
* 0x0004 means link established
*/
return
mii
->
val_out
;
mii
->
reg_num
=
MII_BMSR
;
if
(
IOCTL
(
dev
,
&
ifr
,
SIOCGMIIREG
)
==
0
)
{
return
mii
->
val_out
&
BMSR_LSTATUS
;
}
}
return
MII_LINK_READY
;
/* spoof link up ( we can't check it) */
return
BMSR_LSTATUS
;
/* spoof link up ( we can't check it) */
}
static
u16
bond_check_mii_link
(
bonding_t
*
bond
)
...
...
@@ -459,7 +464,7 @@ static u16 bond_check_mii_link(bonding_t *bond)
read_unlock
(
&
bond
->
ptrlock
);
read_unlock_irqrestore
(
&
bond
->
lock
,
flags
);
return
(
has_active_interface
?
MII_LINK_READY
:
0
);
return
(
has_active_interface
?
BMSR_LSTATUS
:
0
);
}
static
int
bond_open
(
struct
net_device
*
dev
)
...
...
@@ -797,8 +802,8 @@ static int bond_enslave(struct net_device *master_dev,
new_slave
->
link_failure_count
=
0
;
/* check for initial state */
if
((
miimon
<=
0
)
||
((
bond_check_dev_link
(
slave_dev
)
&
MII_LINK_READY
)
==
MII_LINK_READY
))
{
if
((
miimon
<=
0
)
||
(
bond_check_dev_link
(
slave_dev
)
==
BMSR_LSTATUS
))
{
#ifdef BONDING_DEBUG
printk
(
KERN_CRIT
"Initial state of slave_dev is BOND_LINK_UP
\n
"
);
#endif
...
...
@@ -1220,7 +1225,7 @@ static void bond_mii_monitor(struct net_device *master)
switch
(
slave
->
link
)
{
case
BOND_LINK_UP
:
/* the link was up */
if
(
(
link_state
&
MII_LINK_UP
)
==
MII_LINK_UP
)
{
if
(
link_state
==
BMSR_LSTATUS
)
{
/* link stays up, tell that this one
is immediately available */
if
(
IS_UP
(
dev
)
&&
(
mindelay
>
-
2
))
{
...
...
@@ -1256,7 +1261,7 @@ static void bond_mii_monitor(struct net_device *master)
ensure proper action to be taken
*/
case
BOND_LINK_FAIL
:
/* the link has just gone down */
if
(
(
link_state
&
MII_LINK_UP
)
==
0
)
{
if
(
link_state
!=
BMSR_LSTATUS
)
{
/* link stays down */
if
(
slave
->
delay
<=
0
)
{
/* link down for too long time */
...
...
@@ -1285,7 +1290,7 @@ static void bond_mii_monitor(struct net_device *master)
}
else
{
slave
->
delay
--
;
}
}
else
if
((
link_state
&
MII_LINK_READY
)
==
MII_LINK_READY
)
{
}
else
{
/* link up again */
slave
->
link
=
BOND_LINK_UP
;
printk
(
KERN_INFO
...
...
@@ -1304,7 +1309,7 @@ static void bond_mii_monitor(struct net_device *master)
}
break
;
case
BOND_LINK_DOWN
:
/* the link was down */
if
(
(
link_state
&
MII_LINK_READY
)
!=
MII_LINK_READY
)
{
if
(
link_state
!=
BMSR_LSTATUS
)
{
/* the link stays down, nothing more to do */
break
;
}
else
{
/* link going up */
...
...
@@ -1326,7 +1331,7 @@ static void bond_mii_monitor(struct net_device *master)
case there's something to do.
*/
case
BOND_LINK_BACK
:
/* the link has just come back */
if
(
(
link_state
&
MII_LINK_UP
)
==
0
)
{
if
(
link_state
!=
BMSR_LSTATUS
)
{
/* link down again */
slave
->
link
=
BOND_LINK_DOWN
;
printk
(
KERN_INFO
...
...
@@ -1335,8 +1340,7 @@ static void bond_mii_monitor(struct net_device *master)
master
->
name
,
(
updelay
-
slave
->
delay
)
*
miimon
,
dev
->
name
);
}
else
if
((
link_state
&
MII_LINK_READY
)
==
MII_LINK_READY
)
{
}
else
{
/* link stays up */
if
(
slave
->
delay
==
0
)
{
/* now the link has been up for long time enough */
...
...
@@ -2110,7 +2114,7 @@ static int bond_get_info(char *buf, char **start, off_t offset, int length)
len
+=
sprintf
(
buf
+
len
,
"MII Status: "
);
len
+=
sprintf
(
buf
+
len
,
link
==
MII_LINK_READY
?
"up
\n
"
:
"down
\n
"
);
link
==
BMSR_LSTATUS
?
"up
\n
"
:
"down
\n
"
);
len
+=
sprintf
(
buf
+
len
,
"MII Polling Interval (ms): %d
\n
"
,
miimon
);
len
+=
sprintf
(
buf
+
len
,
"Up Delay (ms): %d
\n
"
,
updelay
);
...
...
drivers/net/e1000/e1000_main.c
View file @
e70d3326
...
...
@@ -135,7 +135,7 @@ static int e1000_init_module(void);
static
void
e1000_exit_module
(
void
);
static
int
e1000_probe
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
);
static
void
e1000_remove
(
struct
pci_dev
*
pdev
);
static
void
e1000_sw_init
(
struct
e1000_adapter
*
adapter
);
static
int
e1000_sw_init
(
struct
e1000_adapter
*
adapter
);
static
int
e1000_open
(
struct
net_device
*
netdev
);
static
int
e1000_close
(
struct
net_device
*
netdev
);
static
int
e1000_setup_tx_resources
(
struct
e1000_adapter
*
adapter
);
...
...
@@ -415,7 +415,8 @@ e1000_probe(struct pci_dev *pdev,
/* setup the private structure */
e1000_sw_init
(
adapter
);
if
(
e1000_sw_init
(
adapter
))
goto
err_sw_init
;
if
(
adapter
->
hw
.
mac_type
>=
e1000_82543
)
{
netdev
->
features
=
NETIF_F_SG
|
...
...
@@ -500,6 +501,7 @@ e1000_probe(struct pci_dev *pdev,
cards_found
++
;
return
0
;
err_sw_init:
err_eeprom:
iounmap
(
adapter
->
hw
.
hw_addr
);
err_ioremap:
...
...
@@ -555,7 +557,7 @@ e1000_remove(struct pci_dev *pdev)
* OS network device settings (MTU size).
**/
static
void
__devinit
static
int
__devinit
e1000_sw_init
(
struct
e1000_adapter
*
adapter
)
{
struct
e1000_hw
*
hw
=
&
adapter
->
hw
;
...
...
@@ -564,11 +566,11 @@ e1000_sw_init(struct e1000_adapter *adapter)
/* PCI config space info */
pci_read_config_word
(
pdev
,
PCI_VENDOR_ID
,
&
hw
->
vendor_id
)
;
pci_read_config_word
(
pdev
,
PCI_DEVICE_ID
,
&
hw
->
device_id
)
;
pci_read_config_word
(
pdev
,
PCI_SUBSYSTEM_VENDOR_ID
,
&
hw
->
subsystem_vendor_id
)
;
pci_read_config_word
(
pdev
,
PCI_SUBSYSTEM_ID
,
&
hw
->
subsystem_id
);
hw
->
vendor_id
=
pdev
->
vendor
;
hw
->
device_id
=
pdev
->
device
;
hw
->
subsystem_vendor_id
=
pdev
->
subsystem_vendor
;
hw
->
subsystem_id
=
pdev
->
subsystem_device
;
pci_read_config_byte
(
pdev
,
PCI_REVISION_ID
,
&
hw
->
revision_id
);
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
hw
->
pci_cmd_word
);
...
...
@@ -581,7 +583,7 @@ e1000_sw_init(struct e1000_adapter *adapter)
if
(
e1000_set_mac_type
(
hw
))
{
E1000_ERR
(
"Unknown MAC Type
\n
"
);
BUG
()
;
return
-
1
;
}
/* flow control settings */
...
...
@@ -622,6 +624,8 @@ e1000_sw_init(struct e1000_adapter *adapter)
atomic_set
(
&
adapter
->
irq_sem
,
1
);
spin_lock_init
(
&
adapter
->
stats_lock
);
return
0
;
}
/**
...
...
drivers/net/ewrk3.c
View file @
e70d3326
...
...
@@ -76,6 +76,7 @@
kernel with the ewrk3 configuration turned off and reboot.
5) insmod ewrk3.o
[Alan Cox: Changed this so you can insmod ewrk3.o irq=x io=y]
[Adam Kropelin: now accepts irq=x1,x2 io=y1,y2 for multiple cards]
6) run the net startup bits for your new eth?? interface manually
(usually /etc/rc.inet[12] at boot time).
7) enjoy!
...
...
@@ -134,6 +135,8 @@
0.43 16-Aug-96 Update alloc_device() to conform to de4x5.c
0.44 08-Nov-01 use library crc32 functions <Matt_Domsch@dell.com>
0.45 19-Jul-02 fix unaligned access on alpha <martin@bruli.net>
0.46 10-Oct-02 cli/sti removal <VDA@port.imtp.ilyichevsk.odessa.ua>
Multiple NIC support when module <akropel1@rochester.rr.com>
=========================================================================
*/
...
...
@@ -167,7 +170,7 @@
#include "ewrk3.h"
static
char
version
[]
__initdata
=
"ewrk3.c:v0.4
3a 2001/02/04
davies@maniac.ultranet.com
\n
"
;
"ewrk3.c:v0.4
6 2002/10/09
davies@maniac.ultranet.com
\n
"
;
#ifdef EWRK3_DEBUG
static
int
ewrk3_debug
=
EWRK3_DEBUG
;
...
...
@@ -196,6 +199,7 @@ static int ewrk3_debug = 1;
#define EWRK3_IOP_INC 0x20
/* I/O address increment */
#define EWRK3_TOTAL_SIZE 0x20
/* required I/O address length */
/* If you change this, remember to also change MODULE_PARM array limits */
#ifndef MAX_NUM_EWRK3S
#define MAX_NUM_EWRK3S 21
#endif
...
...
@@ -1716,6 +1720,11 @@ static int ewrk3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break
;
case
EWRK3_SET_MCA
:
/* Set a multicast address */
if
(
capable
(
CAP_NET_ADMIN
))
{
if
(
ioc
->
len
>
1024
)
{
status
=
-
EINVAL
;
break
;
}
if
(
copy_from_user
(
tmp
->
addr
,
ioc
->
data
,
ETH_ALEN
*
ioc
->
len
))
{
status
=
-
EFAULT
;
break
;
...
...
@@ -1843,35 +1852,62 @@ static int ewrk3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
}
#ifdef MODULE
static
struct
net_device
thisEthwrk
;
static
int
io
=
0x300
;
/* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */
static
int
irq
=
5
;
/* or use the insmod io= irq= options */
static
struct
net_device
*
ewrk3_devs
[
MAX_NUM_EWRK3S
];
static
int
ndevs
;
static
int
io
[
MAX_NUM_EWRK3S
+
1
]
=
{
0x300
,
0
,
};
/* <--- EDIT THESE LINES FOR YOUR CONFIGURATION */
static
int
irq
[
MAX_NUM_EWRK3S
+
1
]
=
{
5
,
0
,
};
/* or use the insmod io= irq= options */
MODULE_PARM
(
io
,
"i"
);
MODULE_PARM
(
irq
,
"i"
);
MODULE_PARM_DESC
(
io
,
"EtherWORKS 3 I/O base address"
);
MODULE_PARM_DESC
(
irq
,
"EtherWORKS 3 IRQ number"
);
/* '21' below should really be 'MAX_NUM_EWRK3S' */
MODULE_PARM
(
io
,
"0-21i"
);
MODULE_PARM
(
irq
,
"0-21i"
);
MODULE_PARM_DESC
(
io
,
"EtherWORKS 3 I/O base address(es)"
);
MODULE_PARM_DESC
(
irq
,
"EtherWORKS 3 IRQ number(s)"
);
int
init_module
(
void
)
{
thisEthwrk
.
base_addr
=
io
;
thisEthwrk
.
irq
=
irq
;
thisEthwrk
.
init
=
ewrk3_probe
;
if
(
register_netdev
(
&
thisEthwrk
)
!=
0
)
return
-
EIO
;
return
0
;
int
i
=
0
;
while
(
io
[
i
]
&&
irq
[
i
]
)
{
ewrk3_devs
[
ndevs
]
=
kmalloc
(
sizeof
(
struct
net_device
),
GFP_KERNEL
);
if
(
!
ewrk3_devs
[
ndevs
])
goto
error
;
memset
(
ewrk3_devs
[
ndevs
],
0
,
sizeof
(
struct
net_device
));
ewrk3_devs
[
ndevs
]
->
base_addr
=
io
[
i
];
ewrk3_devs
[
ndevs
]
->
irq
=
irq
[
i
];
ewrk3_devs
[
ndevs
]
->
init
=
ewrk3_probe
;
if
(
register_netdev
(
ewrk3_devs
[
ndevs
])
==
0
)
ndevs
++
;
else
kfree
(
ewrk3_devs
[
ndevs
]);
i
++
;
}
return
ndevs
?
0
:
-
EIO
;
error:
cleanup_module
();
return
-
ENOMEM
;
}
void
cleanup_module
(
void
)
{
unregister_netdev
(
&
thisEthwrk
);
if
(
thisEthwrk
.
priv
)
{
kfree
(
thisEthwrk
.
priv
);
thisEthwrk
.
priv
=
NULL
;
int
i
;
for
(
i
=
0
;
i
<
ndevs
;
i
++
)
{
unregister_netdev
(
ewrk3_devs
[
i
]);
if
(
ewrk3_devs
[
i
]
->
priv
)
{
kfree
(
ewrk3_devs
[
i
]
->
priv
);
ewrk3_devs
[
i
]
->
priv
=
NULL
;
}
thisEthwrk
.
irq
=
0
;
ewrk3_devs
[
i
]
->
irq
=
0
;
release_region
(
thisEthwrk
.
base_addr
,
EWRK3_TOTAL_SIZE
);
release_region
(
ewrk3_devs
[
i
]
->
base_addr
,
EWRK3_TOTAL_SIZE
);
kfree
(
ewrk3_devs
[
i
]);
ewrk3_devs
[
i
]
=
NULL
;
}
}
#endif
/* MODULE */
MODULE_LICENSE
(
"GPL"
);
...
...
drivers/net/mii.c
View file @
e70d3326
...
...
@@ -243,7 +243,7 @@ unsigned int mii_check_media (struct mii_if_info *mii,
/* figure out media and duplex from advertise and LPA values */
media
=
mii_nway_result
(
lpa
&
advertise
);
duplex
=
(
media
&
(
ADVERTISE_100FULL
|
ADVERTISE_10FULL
)
)
?
1
:
0
;
duplex
=
(
media
&
ADVERTISE_FULL
)
?
1
:
0
;
if
(
ok_to_print
)
printk
(
KERN_INFO
"%s: link up, %sMbps, %s-duplex, lpa 0x%04X
\n
"
,
...
...
drivers/net/pcmcia/smc91c92_cs.c
View file @
e70d3326
...
...
@@ -8,7 +8,7 @@
Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
smc91c92_cs.c 1.
113 2001/10/13 00:08:53
smc91c92_cs.c 1.
2 2002/09/28 15:00:00
This driver contains code written by Donald Becker
(becker@scyld.com), Rowan Hughes (x-csrdh@jcu.edu.au),
...
...
@@ -37,12 +37,15 @@
#include <linux/crc32.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/if_arp.h>
#include <linux/ioport.h>
#include <linux/ethtool.h>
#include <linux/mii.h>
#include <pcmcia/version.h>
#include <pcmcia/cs_types.h>
...
...
@@ -88,6 +91,9 @@ static const char *version =
#define DEBUG(n, args...)
#endif
#define DRV_NAME "smc91c92_cs"
#define DRV_VERSION "1.2"
/*====================================================================*/
/* Operational parameter that usually are not changed. */
...
...
@@ -109,6 +115,7 @@ static dev_link_t *dev_list;
struct
smc_private
{
dev_link_t
link
;
struct
net_device
dev
;
spinlock_t
lock
;
u_short
manfid
;
u_short
cardid
;
struct
net_device_stats
stats
;
...
...
@@ -122,7 +129,7 @@ struct smc_private {
u_short
media_status
;
u_short
fast_poll
;
u_short
link_status
;
int
phy_id
;
struct
mii_if_info
mii_if
;
};
/* Special definitions for Megahertz multifunction cards */
...
...
@@ -292,9 +299,11 @@ static int s9k_config(struct net_device *dev, struct ifmap *map);
static
void
smc_set_xcvr
(
struct
net_device
*
dev
,
int
if_port
);
static
void
smc_reset
(
struct
net_device
*
dev
);
static
void
media_check
(
u_long
arg
);
static
void
mdio_sync
(
ioaddr_t
addr
);
static
int
mdio_read
(
ioaddr_t
addr
,
int
phy_id
,
int
loc
);
static
void
mdio_write
(
ioaddr_t
addr
,
int
phy_id
,
int
loc
,
int
value
);
static
void
smc_mdio_sync
(
ioaddr_t
addr
);
static
int
smc_mdio_read
(
struct
net_device
*
dev
,
int
phy_id
,
int
loc
);
static
void
smc_mdio_write
(
struct
net_device
*
dev
,
int
phy_id
,
int
loc
,
int
value
);
static
int
smc_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
);
static
int
smc_link_ok
(
struct
net_device
*
dev
);
/*======================================================================
...
...
@@ -346,7 +355,7 @@ static dev_link_t *smc91c92_attach(void)
if
(
!
smc
)
return
NULL
;
memset
(
smc
,
0
,
sizeof
(
struct
smc_private
));
link
=
&
smc
->
link
;
dev
=
&
smc
->
dev
;
spin_lock_init
(
&
smc
->
lock
);
link
->
release
.
function
=
&
smc91c92_release
;
link
->
release
.
data
=
(
u_long
)
link
;
link
->
io
.
NumPorts1
=
16
;
...
...
@@ -369,6 +378,7 @@ static dev_link_t *smc91c92_attach(void)
dev
->
get_stats
=
&
smc91c92_get_stats
;
dev
->
set_config
=
&
s9k_config
;
dev
->
set_multicast_list
=
&
set_rx_mode
;
dev
->
do_ioctl
=
&
smc_ioctl
;
ether_setup
(
dev
);
dev
->
open
=
&
smc91c92_open
;
dev
->
stop
=
&
smc91c92_close
;
...
...
@@ -378,6 +388,12 @@ static dev_link_t *smc91c92_attach(void)
#endif
dev
->
priv
=
link
->
priv
=
link
->
irq
.
Instance
=
smc
;
smc
->
mii_if
.
dev
=
dev
;
smc
->
mii_if
.
mdio_read
=
smc_mdio_read
;
smc
->
mii_if
.
mdio_write
=
smc_mdio_write
;
smc
->
mii_if
.
phy_id_mask
=
0x1f
;
smc
->
mii_if
.
reg_num_mask
=
0x1f
;
/* Register with Card Services */
link
->
next
=
dev_list
;
dev_list
=
link
;
...
...
@@ -1044,10 +1060,10 @@ static void smc91c92_config(dev_link_t *link)
SMC_SELECT_BANK
(
3
);
for
(
i
=
0
;
i
<
32
;
i
++
)
{
j
=
mdio_read
(
dev
->
base_addr
+
MGMT
,
i
,
1
);
j
=
smc_mdio_read
(
dev
,
i
,
1
);
if
((
j
!=
0
)
&&
(
j
!=
0xffff
))
break
;
}
smc
->
phy_id
=
(
i
<
32
)
?
i
:
-
1
;
smc
->
mii_if
.
phy_id
=
(
i
<
32
)
?
i
:
-
1
;
if
(
i
<
32
)
{
DEBUG
(
0
,
" MII transceiver at index %d, status %x.
\n
"
,
i
,
j
);
}
else
{
...
...
@@ -1190,7 +1206,7 @@ static int smc91c92_event(event_t event, int priority,
#define MDIO_DATA_WRITE1 (MDIO_DIR_WRITE | MDIO_DATA_OUT)
#define MDIO_DATA_READ 0x02
static
void
mdio_sync
(
ioaddr_t
addr
)
static
void
smc_
mdio_sync
(
ioaddr_t
addr
)
{
int
bits
;
for
(
bits
=
0
;
bits
<
32
;
bits
++
)
{
...
...
@@ -1199,12 +1215,13 @@ static void mdio_sync(ioaddr_t addr)
}
}
static
int
mdio_read
(
ioaddr_t
addr
,
int
phy_id
,
int
loc
)
static
int
smc_mdio_read
(
struct
net_device
*
dev
,
int
phy_id
,
int
loc
)
{
ioaddr_t
addr
=
dev
->
base_addr
+
MGMT
;
u_int
cmd
=
(
0x06
<<
10
)
|
(
phy_id
<<
5
)
|
loc
;
int
i
,
retval
=
0
;
mdio_sync
(
addr
);
smc_
mdio_sync
(
addr
);
for
(
i
=
13
;
i
>=
0
;
i
--
)
{
int
dat
=
(
cmd
&
(
1
<<
i
))
?
MDIO_DATA_WRITE1
:
MDIO_DATA_WRITE0
;
outb
(
dat
,
addr
);
...
...
@@ -1218,12 +1235,13 @@ static int mdio_read(ioaddr_t addr, int phy_id, int loc)
return
(
retval
>>
1
)
&
0xffff
;
}
static
void
mdio_write
(
ioaddr_t
addr
,
int
phy_id
,
int
loc
,
int
value
)
static
void
smc_mdio_write
(
struct
net_device
*
dev
,
int
phy_id
,
int
loc
,
int
value
)
{
ioaddr_t
addr
=
dev
->
base_addr
+
MGMT
;
u_int
cmd
=
(
0x05
<<
28
)
|
(
phy_id
<<
23
)
|
(
loc
<<
18
)
|
(
1
<<
17
)
|
value
;
int
i
;
mdio_sync
(
addr
);
smc_
mdio_sync
(
addr
);
for
(
i
=
31
;
i
>=
0
;
i
--
)
{
int
dat
=
(
cmd
&
(
1
<<
i
))
?
MDIO_DATA_WRITE1
:
MDIO_DATA_WRITE0
;
outb
(
dat
,
addr
);
...
...
@@ -1777,6 +1795,7 @@ static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
static
void
set_rx_mode
(
struct
net_device
*
dev
)
{
ioaddr_t
ioaddr
=
dev
->
base_addr
;
struct
smc_private
*
smc
=
dev
->
priv
;
u_int
multicast_table
[
2
]
=
{
0
,
};
unsigned
long
flags
;
u_short
rx_cfg_setting
;
...
...
@@ -1795,15 +1814,14 @@ static void set_rx_mode(struct net_device *dev)
}
/* Load MC table and Rx setting into the chip without interrupts. */
save_flags
(
flags
);
cli
();
spin_lock_irqsave
(
&
smc
->
lock
,
flags
);
SMC_SELECT_BANK
(
3
);
outl
(
multicast_table
[
0
],
ioaddr
+
MULTICAST0
);
outl
(
multicast_table
[
1
],
ioaddr
+
MULTICAST4
);
SMC_SELECT_BANK
(
0
);
outw
(
rx_cfg_setting
,
ioaddr
+
RCR
);
SMC_SELECT_BANK
(
2
);
restore_flags
(
flags
);
spin_unlock_irqrestore
(
&
smc
->
lock
,
flags
);
return
;
}
...
...
@@ -1917,11 +1935,11 @@ static void smc_reset(struct net_device *dev)
SMC_SELECT_BANK
(
3
);
/* Reset MII */
mdio_write
(
ioaddr
+
MGMT
,
smc
->
phy_id
,
0
,
0x8000
);
smc_mdio_write
(
dev
,
smc
->
mii_if
.
phy_id
,
0
,
0x8000
);
/* Restart MII autonegotiation */
mdio_write
(
ioaddr
+
MGMT
,
smc
->
phy_id
,
0
,
0x0000
);
mdio_write
(
ioaddr
+
MGMT
,
smc
->
phy_id
,
0
,
0x1200
);
smc_mdio_write
(
dev
,
smc
->
mii_if
.
phy_id
,
0
,
0x0000
);
smc_mdio_write
(
dev
,
smc
->
mii_if
.
phy_id
,
0
,
0x1200
);
}
/* Enable interrupts. */
...
...
@@ -1942,7 +1960,6 @@ static void media_check(u_long arg)
struct
net_device
*
dev
=
&
smc
->
dev
;
ioaddr_t
ioaddr
=
dev
->
base_addr
;
u_short
i
,
media
,
saved_bank
;
ioaddr_t
mii_addr
=
dev
->
base_addr
+
MGMT
;
u_short
link
;
saved_bank
=
inw
(
ioaddr
+
BANK_SELECT
);
...
...
@@ -1974,20 +1991,20 @@ static void media_check(u_long arg)
}
if
(
smc
->
cfg
&
CFG_MII_SELECT
)
{
if
(
smc
->
phy_id
<
0
)
if
(
smc
->
mii_if
.
phy_id
<
0
)
goto
reschedule
;
SMC_SELECT_BANK
(
3
);
link
=
mdio_read
(
mii_addr
,
smc
->
phy_id
,
1
);
link
=
smc_mdio_read
(
dev
,
smc
->
mii_if
.
phy_id
,
1
);
if
(
!
link
||
(
link
==
0xffff
))
{
printk
(
KERN_INFO
"%s: MII is missing!
\n
"
,
dev
->
name
);
smc
->
phy_id
=
-
1
;
smc
->
mii_if
.
phy_id
=
-
1
;
goto
reschedule
;
}
link
&=
0x0004
;
if
(
link
!=
smc
->
link_status
)
{
u_short
p
=
mdio_read
(
mii_addr
,
smc
->
phy_id
,
5
);
u_short
p
=
smc_mdio_read
(
dev
,
smc
->
mii_if
.
phy_id
,
5
);
printk
(
KERN_INFO
"%s: %s link beat
\n
"
,
dev
->
name
,
(
link
)
?
"found"
:
"lost"
);
if
(
link
)
{
...
...
@@ -2043,6 +2060,191 @@ static void media_check(u_long arg)
SMC_SELECT_BANK
(
saved_bank
);
}
static
int
smc_link_ok
(
struct
net_device
*
dev
)
{
ioaddr_t
ioaddr
=
dev
->
base_addr
;
struct
smc_private
*
smc
=
dev
->
priv
;
if
(
smc
->
cfg
&
CFG_MII_SELECT
)
{
return
mii_link_ok
(
&
smc
->
mii_if
);
}
else
{
SMC_SELECT_BANK
(
0
);
return
inw
(
ioaddr
+
EPH
)
&
EPH_LINK_OK
;
}
}
static
int
smc_netdev_get_ecmd
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
ecmd
)
{
u16
tmp
;
ioaddr_t
ioaddr
=
dev
->
base_addr
;
ecmd
->
supported
=
(
SUPPORTED_TP
|
SUPPORTED_AUI
|
SUPPORTED_10baseT_Half
|
SUPPORTED_10baseT_Full
);
SMC_SELECT_BANK
(
1
);
tmp
=
inw
(
ioaddr
+
CONFIG
);
ecmd
->
port
=
(
tmp
&
CFG_AUI_SELECT
)
?
PORT_AUI
:
PORT_TP
;
ecmd
->
transceiver
=
XCVR_INTERNAL
;
ecmd
->
speed
=
SPEED_10
;
ecmd
->
phy_address
=
ioaddr
+
MGMT
;
SMC_SELECT_BANK
(
0
);
tmp
=
inw
(
ioaddr
+
TCR
);
ecmd
->
duplex
=
(
tmp
&
TCR_FDUPLX
)
?
DUPLEX_FULL
:
DUPLEX_HALF
;
return
0
;
}
static
int
smc_netdev_set_ecmd
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
ecmd
)
{
u16
tmp
;
ioaddr_t
ioaddr
=
dev
->
base_addr
;
if
(
ecmd
->
speed
!=
SPEED_10
)
return
-
EINVAL
;
if
(
ecmd
->
duplex
!=
DUPLEX_HALF
&&
ecmd
->
duplex
!=
DUPLEX_FULL
)
return
-
EINVAL
;
if
(
ecmd
->
port
!=
PORT_TP
&&
ecmd
->
port
!=
PORT_AUI
)
return
-
EINVAL
;
if
(
ecmd
->
transceiver
!=
XCVR_INTERNAL
)
return
-
EINVAL
;
if
(
ecmd
->
port
==
PORT_AUI
)
smc_set_xcvr
(
dev
,
1
);
else
smc_set_xcvr
(
dev
,
0
);
SMC_SELECT_BANK
(
0
);
tmp
=
inw
(
ioaddr
+
TCR
);
if
(
ecmd
->
duplex
==
DUPLEX_FULL
)
tmp
|=
TCR_FDUPLX
;
else
tmp
&=
~
TCR_FDUPLX
;
outw
(
ioaddr
+
TCR
,
tmp
);
return
0
;
}
static
int
smc_ethtool_ioctl
(
struct
net_device
*
dev
,
void
*
useraddr
)
{
u32
ethcmd
;
struct
smc_private
*
smc
=
dev
->
priv
;
if
(
get_user
(
ethcmd
,
(
u32
*
)
useraddr
))
return
-
EFAULT
;
switch
(
ethcmd
)
{
case
ETHTOOL_GDRVINFO
:
{
struct
ethtool_drvinfo
info
=
{
ETHTOOL_GDRVINFO
};
strcpy
(
info
.
driver
,
DRV_NAME
);
strcpy
(
info
.
version
,
DRV_VERSION
);
if
(
copy_to_user
(
useraddr
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
/* get settings */
case
ETHTOOL_GSET
:
{
int
ret
;
struct
ethtool_cmd
ecmd
=
{
ETHTOOL_GSET
};
spin_lock_irq
(
&
smc
->
lock
);
if
(
smc
->
cfg
&
CFG_MII_SELECT
)
ret
=
mii_ethtool_gset
(
&
smc
->
mii_if
,
&
ecmd
);
else
ret
=
smc_netdev_get_ecmd
(
dev
,
&
ecmd
);
spin_unlock_irq
(
&
smc
->
lock
);
if
(
copy_to_user
(
useraddr
,
&
ecmd
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
return
ret
;
}
/* set settings */
case
ETHTOOL_SSET
:
{
int
ret
;
struct
ethtool_cmd
ecmd
;
if
(
copy_from_user
(
&
ecmd
,
useraddr
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
spin_lock_irq
(
&
smc
->
lock
);
if
(
smc
->
cfg
&
CFG_MII_SELECT
)
ret
=
mii_ethtool_sset
(
&
smc
->
mii_if
,
&
ecmd
);
else
ret
=
smc_netdev_set_ecmd
(
dev
,
&
ecmd
);
spin_unlock_irq
(
&
smc
->
lock
);
return
ret
;
}
/* get link status */
case
ETHTOOL_GLINK
:
{
struct
ethtool_value
edata
=
{
ETHTOOL_GLINK
};
spin_lock_irq
(
&
smc
->
lock
);
edata
.
data
=
smc_link_ok
(
dev
);
spin_unlock_irq
(
&
smc
->
lock
);
if
(
copy_to_user
(
useraddr
,
&
edata
,
sizeof
(
edata
)))
return
-
EFAULT
;
return
0
;
}
#ifdef PCMCIA_DEBUG
/* get message-level */
case
ETHTOOL_GMSGLVL
:
{
struct
ethtool_value
edata
=
{
ETHTOOL_GMSGLVL
};
edata
.
data
=
pc_debug
;
if
(
copy_to_user
(
useraddr
,
&
edata
,
sizeof
(
edata
)))
return
-
EFAULT
;
return
0
;
}
/* set message-level */
case
ETHTOOL_SMSGLVL
:
{
struct
ethtool_value
edata
;
if
(
copy_from_user
(
&
edata
,
useraddr
,
sizeof
(
edata
)))
return
-
EFAULT
;
pc_debug
=
edata
.
data
;
return
0
;
}
#endif
/* restart autonegotiation */
case
ETHTOOL_NWAY_RST
:
{
if
(
smc
->
cfg
&
CFG_MII_SELECT
)
return
mii_nway_restart
(
&
smc
->
mii_if
);
else
return
-
EOPNOTSUPP
;
}
default:
break
;
}
return
-
EOPNOTSUPP
;
}
static
int
smc_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
)
{
struct
smc_private
*
smc
=
dev
->
priv
;
struct
mii_ioctl_data
*
mii
;
int
rc
=
0
;
mii
=
(
struct
mii_ioctl_data
*
)
&
rq
->
ifr_data
;
if
(
!
netif_running
(
dev
))
return
-
EINVAL
;
switch
(
cmd
)
{
case
SIOCETHTOOL
:
rc
=
smc_ethtool_ioctl
(
dev
,
(
void
*
)
rq
->
ifr_data
);
break
;
default:
spin_lock_irq
(
&
smc
->
lock
);
rc
=
generic_mii_ioctl
(
&
smc
->
mii_if
,
mii
,
cmd
,
NULL
);
spin_unlock_irq
(
&
smc
->
lock
);
break
;
}
return
rc
;
}
/*====================================================================*/
static
int
__init
init_smc91c92_cs
(
void
)
...
...
@@ -2069,3 +2271,4 @@ static void __exit exit_smc91c92_cs(void)
module_init
(
init_smc91c92_cs
);
module_exit
(
exit_smc91c92_cs
);
drivers/net/tokenring/tmspci.c
View file @
e70d3326
...
...
@@ -253,7 +253,7 @@ static int __init tms_pci_init (void)
return
0
;
}
static
void
__
dev
exit
tms_pci_rmmod
(
void
)
static
void
__exit
tms_pci_rmmod
(
void
)
{
pci_unregister_driver
(
&
tms_pci_driver
);
}
...
...
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