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
038403f6
Commit
038403f6
authored
Jul 13, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/davem/BK/net-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
1fcab22d
282d9b16
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
275 additions
and
596 deletions
+275
-596
drivers/net/bonding.c
drivers/net/bonding.c
+107
-18
drivers/net/sunhme.c
drivers/net/sunhme.c
+1
-1
drivers/net/tg3.c
drivers/net/tg3.c
+111
-506
drivers/net/tg3.h
drivers/net/tg3.h
+1
-42
include/linux/if_vlan.h
include/linux/if_vlan.h
+18
-4
include/linux/netlink.h
include/linux/netlink.h
+8
-0
include/linux/notifier.h
include/linux/notifier.h
+2
-0
include/net/dsfield.h
include/net/dsfield.h
+0
-25
net/core/dst.c
net/core/dst.c
+6
-0
net/netlink/af_netlink.c
net/netlink/af_netlink.c
+19
-0
net/netsyms.c
net/netsyms.c
+2
-0
No files found.
drivers/net/bonding.c
View file @
038403f6
...
...
@@ -176,6 +176,16 @@
* Steve Mead <steve.mead at comdev dot cc>
* - Port Gleb Natapov's multicast support patchs from 2.4.12
* to 2.4.18 adding support for multicast.
*
* 2002/06/17 - Tony Cureington <tony.cureington * hp_com>
* - corrected uninitialized pointer (ifr.ifr_data) in bond_check_dev_link;
* actually changed function to use ETHTOOL, then MIIPHY, and finally
* MIIREG to determine the link status
* - fixed bad ifr_data pointer assignments in bond_ioctl
* - corrected mode 1 being reported as active-backup in bond_get_info;
* 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)
*/
#include <linux/config.h>
...
...
@@ -210,6 +220,9 @@
#include <linux/smp.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
#include <linux/mii.h>
#include <linux/ethtool.h>
/* monitor all links that often (in milliseconds). <=0 disables monitoring */
#ifndef BOND_LINK_MON_INTERV
...
...
@@ -253,7 +266,7 @@ MODULE_PARM_DESC(miimon, "Link check interval in milliseconds");
MODULE_PARM
(
mode
,
"i"
);
MODULE_PARM
(
arp_interval
,
"i"
);
MODULE_PARM_DESC
(
arp_interval
,
"arp interval in milliseconds"
);
MODULE_PARM
(
arp_ip_target
,
"
1-12
s"
);
MODULE_PARM
(
arp_ip_target
,
"s"
);
MODULE_PARM_DESC
(
arp_ip_target
,
"arp target in n.n.n.n form"
);
MODULE_PARM_DESC
(
mode
,
"Mode of operation : 0 for round robin, 1 for active-backup, 2 for xor"
);
MODULE_PARM
(
updelay
,
"i"
);
...
...
@@ -386,21 +399,51 @@ static u16 bond_check_dev_link(struct net_device *dev)
{
static
int
(
*
ioctl
)(
struct
net_device
*
,
struct
ifreq
*
,
int
);
struct
ifreq
ifr
;
u16
*
data
=
(
u16
*
)
&
ifr
.
ifr_data
;
/* data[0] automagically filled by the ioctl */
data
[
1
]
=
1
;
/* MII location 1 reports Link Status */
if
(((
ioctl
=
dev
->
do_ioctl
)
!=
NULL
)
&&
/* ioctl to access MII */
(
ioctl
(
dev
,
&
ifr
,
SIOCGMIIPHY
)
==
0
))
{
/* now, data[3] contains info about link status :
- data[3] & 0x04 means link up
- data[3] & 0x20 means end of auto-negociation
*/
return
data
[
3
];
}
else
{
return
MII_LINK_READY
;
/* spoof link up ( we can't check it) */
struct
mii_ioctl_data
mii
;
struct
ethtool_value
etool
;
if
((
ioctl
=
dev
->
do_ioctl
)
!=
NULL
)
{
/* ioctl to access MII */
/* 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 */
/* call it and not the others for that team */
/* member. */
/* try SOICETHTOOL ioctl, some drivers cache ETHTOOL_GLINK */
/* for a period of time; we need to encourage link status */
/* be reported by network drivers in real time; if the */
/* value is cached, the mmimon module parm may have no */
/* effect... */
etool
.
cmd
=
ETHTOOL_GLINK
;
ifr
.
ifr_data
=
(
char
*
)
&
etool
;
if
(
ioctl
(
dev
,
&
ifr
,
SIOCETHTOOL
)
==
0
)
{
if
(
etool
.
data
==
1
)
{
return
(
MII_LINK_READY
);
}
else
{
return
(
0
);
}
}
ifr
.
ifr_data
=
(
char
*
)
&
mii
;
/* try MIIPHY first then, if that doesn't work, try MIIREG */
if
(
ioctl
(
dev
,
&
ifr
,
SIOCGMIIPHY
)
==
0
)
{
/* now, mii.phy_id contains info about link status :
- mii.phy_id & 0x04 means link up
- mii.phy_id & 0x20 means end of auto-negociation
*/
return
mii
.
phy_id
;
}
mii
.
reg_num
=
1
;
/* the MII register we want to read */
if
(
ioctl
(
dev
,
&
ifr
,
SIOCGMIIREG
)
==
0
)
{
/* mii.val_out contians the same link info as phy_id */
/* above */
return
mii
.
val_out
;
}
}
return
MII_LINK_READY
;
/* spoof link up ( we can't check it) */
}
static
u16
bond_check_mii_link
(
bonding_t
*
bond
)
...
...
@@ -1707,7 +1750,7 @@ static int bond_ioctl(struct net_device *master_dev, struct ifreq *ifr, int cmd)
switch
(
cmd
)
{
case
SIOCGMIIPHY
:
data
=
(
u16
*
)
&
ifr
->
ifr_data
;
data
=
(
u16
*
)
ifr
->
ifr_data
;
if
(
data
==
NULL
)
{
return
-
EINVAL
;
}
...
...
@@ -1718,7 +1761,7 @@ static int bond_ioctl(struct net_device *master_dev, struct ifreq *ifr, int cmd)
* We do this again just in case we were called by SIOCGMIIREG
* instead of SIOCGMIIPHY.
*/
data
=
(
u16
*
)
&
ifr
->
ifr_data
;
data
=
(
u16
*
)
ifr
->
ifr_data
;
if
(
data
==
NULL
)
{
return
-
EINVAL
;
}
...
...
@@ -2035,7 +2078,28 @@ static int bond_get_info(char *buf, char **start, off_t offset, int length)
link
=
bond_check_mii_link
(
bond
);
len
+=
sprintf
(
buf
+
len
,
"Bonding Mode: "
);
len
+=
sprintf
(
buf
+
len
,
"%s
\n
"
,
mode
?
"active-backup"
:
"load balancing"
);
switch
(
mode
)
{
case
BOND_MODE_ACTIVEBACKUP
:
len
+=
sprintf
(
buf
+
len
,
"%s
\n
"
,
"active-backup"
);
break
;
case
BOND_MODE_ROUNDROBIN
:
len
+=
sprintf
(
buf
+
len
,
"%s
\n
"
,
"load balancing (round-robin)"
);
break
;
case
BOND_MODE_XOR
:
len
+=
sprintf
(
buf
+
len
,
"%s
\n
"
,
"load balancing (xor)"
);
break
;
default:
len
+=
sprintf
(
buf
+
len
,
"%s
\n
"
,
"unknown"
);
break
;
}
if
(
mode
==
BOND_MODE_ACTIVEBACKUP
)
{
read_lock_irqsave
(
&
bond
->
lock
,
flags
);
...
...
@@ -2282,7 +2346,32 @@ static int __init bonding_init(void)
}
memset
(
dev_bonds
,
0
,
max_bonds
*
sizeof
(
struct
net_device
));
if
(
updelay
<
0
)
{
printk
(
KERN_WARNING
"bonding_init(): updelay module parameter (%d), "
"not in range 0-%d, so it was reset to 0
\n
"
,
updelay
,
INT_MAX
);
updelay
=
0
;
}
if
(
downdelay
<
0
)
{
printk
(
KERN_WARNING
"bonding_init(): downdelay module parameter (%d), "
"not in range 0-%d, so it was reset to 0
\n
"
,
downdelay
,
INT_MAX
);
downdelay
=
0
;
}
if
(
arp_interval
<
0
)
{
printk
(
KERN_WARNING
"bonding_init(): arp_interval module parameter (%d), "
"not in range 0-%d, so it was reset to %d
\n
"
,
arp_interval
,
INT_MAX
,
BOND_LINK_ARP_INTERV
);
arp_interval
=
BOND_LINK_ARP_INTERV
;
}
if
(
arp_ip_target
)
{
/* TODO: check and log bad ip address */
if
(
my_inet_aton
(
arp_ip_target
,
&
arp_target
)
==
0
)
{
arp_interval
=
0
;
}
...
...
drivers/net/sunhme.c
View file @
038403f6
...
...
@@ -2201,7 +2201,7 @@ static int happy_meal_open(struct net_device *dev)
*/
if
((
hp
->
happy_flags
&
(
HFLAG_QUATTRO
|
HFLAG_PCI
))
!=
HFLAG_QUATTRO
)
{
if
(
request_irq
(
dev
->
irq
,
&
happy_meal_interrupt
,
SA_SHIRQ
,
"HAPPY MEAL"
,
(
void
*
)
dev
))
{
SA_SHIRQ
,
dev
->
name
,
(
void
*
)
dev
))
{
HMD
((
"EAGAIN
\n
"
));
#ifdef __sparc__
printk
(
KERN_ERR
"happy_meal(SBUS): Can't order irq %s to go.
\n
"
,
...
...
drivers/net/tg3.c
View file @
038403f6
...
...
@@ -52,8 +52,8 @@
#define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "0.99"
#define DRV_MODULE_RELDATE "Jun
11
, 2002"
#define DRV_MODULE_VERSION "0.99
-NAPI
"
#define DRV_MODULE_RELDATE "Jun
20
, 2002"
#define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0
...
...
@@ -404,7 +404,8 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
break
;
default:
printk
(
KERN_WARNING
"%s: Invalid power state (%d) requested.
\n
"
,
printk
(
KERN_WARNING
PFX
"%s: Invalid power state (%d) "
"requested.
\n
"
,
tp
->
dev
->
name
,
state
);
return
-
EINVAL
;
};
...
...
@@ -490,9 +491,9 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
static
void
tg3_link_report
(
struct
tg3
*
tp
)
{
if
(
!
netif_carrier_ok
(
tp
->
dev
))
{
printk
(
"%s: Link is down.
\n
"
,
tp
->
dev
->
name
);
printk
(
KERN_INFO
PFX
"%s: Link is down.
\n
"
,
tp
->
dev
->
name
);
}
else
{
printk
(
"%s: Link is up at %d Mbps, %s duplex.
\n
"
,
printk
(
KERN_INFO
PFX
"%s: Link is up at %d Mbps, %s duplex.
\n
"
,
tp
->
dev
->
name
,
(
tp
->
link_config
.
active_speed
==
SPEED_1000
?
1000
:
...
...
@@ -501,7 +502,8 @@ static void tg3_link_report(struct tg3 *tp)
(
tp
->
link_config
.
active_duplex
==
DUPLEX_FULL
?
"full"
:
"half"
));
printk
(
"%s: Flow control is %s for TX and %s for RX.
\n
"
,
printk
(
KERN_INFO
PFX
"%s: Flow control is %s for TX and "
"%s for RX.
\n
"
,
tp
->
dev
->
name
,
(
tp
->
tg3_flags
&
TG3_FLAG_TX_PAUSE
)
?
"on"
:
"off"
,
(
tp
->
tg3_flags
&
TG3_FLAG_RX_PAUSE
)
?
"on"
:
"off"
);
...
...
@@ -1725,7 +1727,7 @@ static void tg3_recycle_rx(struct tg3 *tp, u32 opaque_key,
#if TG3_VLAN_TAG_USED
static
int
tg3_vlan_rx
(
struct
tg3
*
tp
,
struct
sk_buff
*
skb
,
u16
vlan_tag
)
{
return
vlan_hwaccel_r
x
(
skb
,
tp
->
vlgrp
,
vlan_tag
);
return
vlan_hwaccel_r
eceive_skb
(
skb
,
tp
->
vlgrp
,
vlan_tag
);
}
#endif
...
...
@@ -1753,16 +1755,18 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
* If both the host and chip were to write into the same ring, cache line
* eviction could occur since both entities want it in an exclusive state.
*/
static
void
tg3_rx
(
struct
tg3
*
tp
)
static
int
tg3_rx
(
struct
tg3
*
tp
,
int
budget
)
{
u32
work_mask
;
u32
rx_rcb_ptr
=
tp
->
rx_rcb_ptr
;
u16
hw_idx
,
sw_idx
;
int
received
;
hw_idx
=
tp
->
hw_status
->
idx
[
0
].
rx_producer
;
sw_idx
=
rx_rcb_ptr
%
TG3_RX_RCB_RING_SIZE
;
work_mask
=
0
;
while
(
sw_idx
!=
hw_idx
)
{
received
=
0
;
while
(
sw_idx
!=
hw_idx
&&
budget
>
0
)
{
struct
tg3_rx_buffer_desc
*
desc
=
&
tp
->
rx_rcb
[
sw_idx
];
unsigned
int
len
;
struct
sk_buff
*
skb
;
...
...
@@ -1860,9 +1864,11 @@ static void tg3_rx(struct tg3 *tp)
desc
->
err_vlan
&
RXD_VLAN_MASK
);
}
else
#endif
netif_r
x
(
skb
);
netif_r
eceive_skb
(
skb
);
tp
->
dev
->
last_rx
=
jiffies
;
received
++
;
budget
--
;
next_pkt:
(
*
post_ptr
)
++
;
...
...
@@ -1894,110 +1900,17 @@ static void tg3_rx(struct tg3 *tp)
sw_idx
);
}
#endif
}
#define PKT_RATE_LOW 22000
#define PKT_RATE_HIGH 61000
static
void
tg3_rate_sample
(
struct
tg3
*
tp
,
unsigned
long
ticks
)
{
u32
delta
,
rx_now
,
tx_now
;
int
new_vals
,
do_tx
,
do_rx
;
rx_now
=
tp
->
hw_stats
->
rx_ucast_packets
.
low
;
tx_now
=
tp
->
hw_stats
->
COS_out_packets
[
0
].
low
;
delta
=
(
rx_now
-
tp
->
last_rx_count
);
delta
+=
(
tx_now
-
tp
->
last_tx_count
);
delta
/=
(
ticks
/
tp
->
coalesce_config
.
rate_sample_jiffies
);
tp
->
last_rx_count
=
rx_now
;
tp
->
last_tx_count
=
tx_now
;
new_vals
=
0
;
do_tx
=
(
tp
->
tg3_flags
&
TG3_FLAG_ADAPTIVE_TX
)
!=
0
;
do_rx
=
(
tp
->
tg3_flags
&
TG3_FLAG_ADAPTIVE_RX
)
!=
0
;
if
(
delta
<
tp
->
coalesce_config
.
pkt_rate_low
)
{
if
(
do_rx
&&
tp
->
coalesce_config
.
rx_max_coalesced_frames
!=
tp
->
coalesce_config
.
rx_max_coalesced_frames_low
)
{
tp
->
coalesce_config
.
rx_max_coalesced_frames
=
LOW_RXMAX_FRAMES
;
tp
->
coalesce_config
.
rx_coalesce_ticks
=
LOW_RXCOL_TICKS
;
new_vals
=
1
;
}
if
(
do_tx
&&
tp
->
coalesce_config
.
tx_max_coalesced_frames
!=
tp
->
coalesce_config
.
tx_max_coalesced_frames_low
)
{
tp
->
coalesce_config
.
tx_max_coalesced_frames
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_low
;
tp
->
coalesce_config
.
tx_coalesce_ticks
=
tp
->
coalesce_config
.
tx_coalesce_ticks_low
;
new_vals
=
1
;
}
}
else
if
(
delta
<
tp
->
coalesce_config
.
pkt_rate_high
)
{
if
(
do_rx
&&
tp
->
coalesce_config
.
rx_max_coalesced_frames
!=
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
)
{
tp
->
coalesce_config
.
rx_max_coalesced_frames
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
;
tp
->
coalesce_config
.
rx_coalesce_ticks
=
tp
->
coalesce_config
.
rx_coalesce_ticks_def
;
new_vals
=
1
;
}
if
(
do_tx
&&
tp
->
coalesce_config
.
tx_max_coalesced_frames
!=
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
)
{
tp
->
coalesce_config
.
tx_max_coalesced_frames
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
;
tp
->
coalesce_config
.
tx_coalesce_ticks
=
tp
->
coalesce_config
.
tx_coalesce_ticks_def
;
new_vals
=
1
;
}
}
else
{
if
(
do_rx
&&
tp
->
coalesce_config
.
rx_max_coalesced_frames
!=
tp
->
coalesce_config
.
rx_max_coalesced_frames_high
)
{
tp
->
coalesce_config
.
rx_max_coalesced_frames
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_high
;
tp
->
coalesce_config
.
rx_coalesce_ticks
=
tp
->
coalesce_config
.
rx_coalesce_ticks_high
;
new_vals
=
1
;
}
if
(
do_tx
&&
tp
->
coalesce_config
.
tx_max_coalesced_frames
!=
tp
->
coalesce_config
.
tx_max_coalesced_frames_high
)
{
tp
->
coalesce_config
.
tx_max_coalesced_frames
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_high
;
tp
->
coalesce_config
.
tx_coalesce_ticks
=
tp
->
coalesce_config
.
tx_coalesce_ticks_high
;
new_vals
=
1
;
}
}
if
(
new_vals
)
{
if
(
do_rx
)
{
tw32
(
HOSTCC_RXCOL_TICKS
,
tp
->
coalesce_config
.
rx_coalesce_ticks
);
tw32
(
HOSTCC_RXMAX_FRAMES
,
tp
->
coalesce_config
.
rx_max_coalesced_frames
);
}
if
(
do_tx
)
{
tw32
(
HOSTCC_TXCOL_TICKS
,
tp
->
coalesce_config
.
tx_coalesce_ticks
);
tw32
(
HOSTCC_TXMAX_FRAMES
,
tp
->
coalesce_config
.
tx_max_coalesced_frames
);
}
}
tp
->
last_rate_sample
=
jiffies
;
return
received
;
}
static
void
tg3_interrupt_main_work
(
struct
tg3
*
tp
)
static
int
tg3_poll
(
struct
net_device
*
netdev
,
int
*
budget
)
{
struct
tg3
*
tp
=
netdev
->
priv
;
struct
tg3_hw_status
*
sblk
=
tp
->
hw_status
;
int
did_pkts
;
int
done
;
spin_lock_irq
(
&
tp
->
lock
);
if
(
!
(
tp
->
tg3_flags
&
(
TG3_FLAG_USE_LINKCHG_REG
|
...
...
@@ -2009,50 +1922,65 @@ static void tg3_interrupt_main_work(struct tg3 *tp)
}
}
did_pkts
=
0
;
if
(
sblk
->
idx
[
0
].
tx_consumer
!=
tp
->
tx_cons
)
tg3_tx
(
tp
);
done
=
1
;
if
(
sblk
->
idx
[
0
].
rx_producer
!=
tp
->
rx_rcb_ptr
)
{
tg3_rx
(
tp
);
did_pkts
=
1
;
int
orig_budget
=
*
budget
;
int
work_done
;
if
(
orig_budget
>
netdev
->
quota
)
orig_budget
=
netdev
->
quota
;
work_done
=
tg3_rx
(
tp
,
orig_budget
);
*
budget
-=
work_done
;
netdev
->
quota
-=
work_done
;
if
(
work_done
>=
orig_budget
)
done
=
0
;
}
if
(
sblk
->
idx
[
0
].
tx_consumer
!=
tp
->
tx_cons
)
{
tg3_tx
(
tp
);
did_pkts
=
1
;
if
(
done
)
{
netif_rx_complete
(
netdev
);
tg3_enable_ints
(
tp
)
;
}
if
(
did_pkts
&&
(
tp
->
tg3_flags
&
(
TG3_FLAG_ADAPTIVE_RX
|
TG3_FLAG_ADAPTIVE_TX
)))
{
unsigned
long
ticks
=
jiffies
-
tp
->
last_rate_sample
;
spin_unlock_irq
(
&
tp
->
lock
);
if
(
ticks
>=
tp
->
coalesce_config
.
rate_sample_jiffies
)
tg3_rate_sample
(
tp
,
ticks
);
}
return
(
done
?
0
:
1
);
}
static
void
tg3_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
static
__inline__
void
tg3_interrupt_main_work
(
struct
net_device
*
dev
,
struct
tg3
*
tp
)
{
struct
net_device
*
dev
=
dev_id
;
struct
tg3
*
tp
=
dev
->
priv
;
struct
tg3_hw_status
*
sblk
=
tp
->
hw_status
;
int
work_exists
=
0
;
spin_lock
(
&
tp
->
lock
);
while
(
sblk
->
status
&
SD_STATUS_UPDATED
)
{
tw32_mailbox
(
MAILBOX_INTERRUPT_0
+
TG3_64BIT_REG_LOW
,
0x00000001
);
sblk
->
status
&=
~
SD_STATUS_UPDATED
;
if
(
!
(
tp
->
tg3_flags
&
(
TG3_FLAG_USE_LINKCHG_REG
|
TG3_FLAG_POLL_SERDES
)))
{
if
(
sblk
->
status
&
SD_STATUS_LINK_CHG
)
work_exists
=
1
;
}
if
(
sblk
->
idx
[
0
].
tx_consumer
!=
tp
->
tx_cons
||
sblk
->
idx
[
0
].
rx_producer
!=
tp
->
rx_rcb_ptr
)
work_exists
=
1
;
tg3_interrupt_main_work
(
tp
);
if
(
!
work_exists
)
return
;
tw32_mailbox
(
MAILBOX_INTERRUPT_0
+
TG3_64BIT_REG_LOW
,
0x00000000
);
tr32
(
MAILBOX_INTERRUPT_0
+
TG3_64BIT_REG_LOW
);
if
(
netif_rx_schedule_prep
(
dev
))
{
tw32
(
TG3PCI_MISC_HOST_CTRL
,
(
tp
->
misc_host_ctrl
|
MISC_HOST_CTRL_MASK_PCI_INT
));
__netif_rx_schedule
(
dev
);
}
else
{
printk
(
KERN_ERR
PFX
"%s: Error, poll already scheduled
\n
"
,
dev
->
name
);
}
spin_unlock
(
&
tp
->
lock
);
}
static
void
tg3_interrupt
_tagged
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
static
void
tg3_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
struct
net_device
*
dev
=
dev_id
;
struct
tg3
*
tp
=
dev
->
priv
;
...
...
@@ -2061,29 +1989,15 @@ static void tg3_interrupt_tagged(int irq, void *dev_id, struct pt_regs *regs)
spin_lock
(
&
tp
->
lock
);
if
(
sblk
->
status
&
SD_STATUS_UPDATED
)
{
u32
oldtag
;
tw32_mailbox
(
MAILBOX_INTERRUPT_0
+
TG3_64BIT_REG_LOW
,
0x00000001
);
oldtag
=
sblk
->
status_tag
;
while
(
1
)
{
u32
newtag
;
sblk
->
status
&=
~
SD_STATUS_UPDATED
;
barrier
();
sblk
->
status
&=
~
SD_STATUS_UPDATED
;
tg3_interrupt_main_work
(
tp
);
tg3_interrupt_main_work
(
dev
,
tp
);
newtag
=
sblk
->
status_tag
;
if
(
newtag
==
oldtag
)
{
tw32_mailbox
(
MAILBOX_INTERRUPT_0
+
TG3_64BIT_REG_LOW
,
newtag
<<
24
);
break
;
}
oldtag
=
newtag
;
}
tw32_mailbox
(
MAILBOX_INTERRUPT_0
+
TG3_64BIT_REG_LOW
,
0x00000000
);
tr32
(
MAILBOX_INTERRUPT_0
+
TG3_64BIT_REG_LOW
);
}
spin_unlock
(
&
tp
->
lock
);
...
...
@@ -2096,7 +2010,7 @@ static void tg3_tx_timeout(struct net_device *dev)
{
struct
tg3
*
tp
=
dev
->
priv
;
printk
(
KERN_ERR
"%s: transmit timed out, resetting
\n
"
,
printk
(
KERN_ERR
PFX
"%s: transmit timed out, resetting
\n
"
,
dev
->
name
);
spin_lock_irq
(
&
tp
->
lock
);
...
...
@@ -3638,24 +3552,16 @@ static int tg3_reset_hw(struct tg3 *tp)
udelay
(
10
);
}
tw32
(
HOSTCC_RXCOL_TICKS
,
tp
->
coalesce_config
.
rx_coalesce_ticks
);
tw32
(
HOSTCC_RXMAX_FRAMES
,
tp
->
coalesce_config
.
rx_max_coalesced_frames
);
tw32
(
HOSTCC_RXCOAL_TICK_INT
,
tp
->
coalesce_config
.
rx_coalesce_ticks_during_int
);
tw32
(
HOSTCC_RXCOAL_MAXF_INT
,
tp
->
coalesce_config
.
rx_max_coalesced_frames_during_int
);
tw32
(
HOSTCC_TXCOL_TICKS
,
tp
->
coalesce_config
.
tx_coalesce_ticks
);
tw32
(
HOSTCC_TXMAX_FRAMES
,
tp
->
coalesce_config
.
tx_max_coalesced_frames
);
tw32
(
HOSTCC_TXCOAL_TICK_INT
,
tp
->
coalesce_config
.
tx_coalesce_ticks_during_int
);
tw32
(
HOSTCC_TXCOAL_MAXF_INT
,
tp
->
coalesce_config
.
tx_max_coalesced_frames_during_int
);
tw32
(
HOSTCC_RXCOL_TICKS
,
0
);
tw32
(
HOSTCC_RXMAX_FRAMES
,
1
);
tw32
(
HOSTCC_RXCOAL_TICK_INT
,
0
);
tw32
(
HOSTCC_RXCOAL_MAXF_INT
,
1
);
tw32
(
HOSTCC_TXCOL_TICKS
,
LOW_TXCOL_TICKS
);
tw32
(
HOSTCC_TXMAX_FRAMES
,
LOW_RXMAX_FRAMES
);
tw32
(
HOSTCC_TXCOAL_TICK_INT
,
0
);
tw32
(
HOSTCC_TXCOAL_MAXF_INT
,
0
);
tw32
(
HOSTCC_STAT_COAL_TICKS
,
tp
->
coalesce_config
.
stats_coalesce_ticks
);
DEFAULT_STAT_COAL_TICKS
);
/* Status/statistics block address. */
tw32
(
HOSTCC_STATS_BLK_HOST_ADDR
+
TG3_64BIT_REG_HIGH
,
...
...
@@ -3806,24 +3712,22 @@ static void tg3_timer(unsigned long __opaque)
spin_lock_irq
(
&
tp
->
lock
);
if
(
!
(
tp
->
tg3_flags
&
TG3_FLAG_TAGGED_IRQ_STATUS
))
{
/* All of this garbage is because on the 5700 the
* mailbox/status_block protocol the chip uses with
* the cpu is race prone.
*/
if
(
tp
->
hw_status
->
status
&
SD_STATUS_UPDATED
)
{
tw32
(
GRC_LOCAL_CTRL
,
tp
->
grc_local_ctrl
|
GRC_LCLCTRL_SETINT
);
}
else
{
tw32
(
HOSTCC_MODE
,
(
HOSTCC_MODE_ENABLE
|
HOSTCC_MODE_NOW
));
}
/* All of this garbage is because when using non-tagged
* IRQ status the mailbox/status_block protocol the chip
* uses with the cpu is race prone.
*/
if
(
tp
->
hw_status
->
status
&
SD_STATUS_UPDATED
)
{
tw32
(
GRC_LOCAL_CTRL
,
tp
->
grc_local_ctrl
|
GRC_LCLCTRL_SETINT
);
}
else
{
tw32
(
HOSTCC_MODE
,
(
HOSTCC_MODE_ENABLE
|
HOSTCC_MODE_NOW
));
}
if
(
!
(
tr32
(
WDMAC_MODE
)
&
WDMAC_MODE_ENABLE
))
{
tg3_halt
(
tp
);
tg3_init_rings
(
tp
);
tg3_init_hw
(
tp
);
}
if
(
!
(
tr32
(
WDMAC_MODE
)
&
WDMAC_MODE_ENABLE
))
{
tg3_halt
(
tp
);
tg3_init_rings
(
tp
);
tg3_init_hw
(
tp
);
}
/* This part only runs once per second. */
...
...
@@ -3893,12 +3797,8 @@ static int tg3_open(struct net_device *dev)
if
(
err
)
return
err
;
if
(
tp
->
tg3_flags
&
TG3_FLAG_TAGGED_IRQ_STATUS
)
err
=
request_irq
(
dev
->
irq
,
tg3_interrupt_tagged
,
SA_SHIRQ
,
dev
->
name
,
dev
);
else
err
=
request_irq
(
dev
->
irq
,
tg3_interrupt
,
SA_SHIRQ
,
dev
->
name
,
dev
);
err
=
request_irq
(
dev
->
irq
,
tg3_interrupt
,
SA_SHIRQ
,
dev
->
name
,
dev
);
if
(
err
)
{
tg3_free_consistent
(
tp
);
...
...
@@ -3914,13 +3814,8 @@ static int tg3_open(struct net_device *dev)
tg3_halt
(
tp
);
tg3_free_rings
(
tp
);
}
else
{
if
(
tp
->
tg3_flags
&
TG3_FLAG_TAGGED_IRQ_STATUS
)
{
tp
->
timer_offset
=
HZ
;
tp
->
timer_counter
=
tp
->
timer_multiplier
=
1
;
}
else
{
tp
->
timer_offset
=
HZ
/
10
;
tp
->
timer_counter
=
tp
->
timer_multiplier
=
10
;
}
tp
->
timer_offset
=
HZ
/
10
;
tp
->
timer_counter
=
tp
->
timer_multiplier
=
10
;
init_timer
(
&
tp
->
timer
);
tp
->
timer
.
expires
=
jiffies
+
tp
->
timer_offset
;
...
...
@@ -4240,10 +4135,7 @@ static inline unsigned long get_stat64(tg3_stat64_t *val)
unsigned
long
ret
;
#if (BITS_PER_LONG == 32)
if
(
val
->
high
!=
0
)
ret
=
~
0UL
;
else
ret
=
val
->
low
;
ret
=
val
->
low
;
#else
ret
=
((
u64
)
val
->
high
<<
32
)
|
((
u64
)
val
->
low
);
#endif
...
...
@@ -4486,177 +4378,6 @@ do { p = orig_p + (reg); \
return
orig_p
;
}
static
void
tg3_to_ethtool_coal
(
struct
tg3
*
tp
,
struct
ethtool_coalesce
*
ecoal
)
{
ecoal
->
rx_coalesce_usecs
=
tp
->
coalesce_config
.
rx_coalesce_ticks_def
;
ecoal
->
rx_max_coalesced_frames
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
;
ecoal
->
rx_coalesce_usecs_irq
=
tp
->
coalesce_config
.
rx_coalesce_ticks_during_int_def
;
ecoal
->
rx_max_coalesced_frames_irq
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_during_int_def
;
ecoal
->
tx_coalesce_usecs
=
tp
->
coalesce_config
.
tx_coalesce_ticks_def
;
ecoal
->
tx_max_coalesced_frames
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
;
ecoal
->
tx_coalesce_usecs_irq
=
tp
->
coalesce_config
.
tx_coalesce_ticks_during_int_def
;
ecoal
->
tx_max_coalesced_frames_irq
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_during_int_def
;
ecoal
->
stats_block_coalesce_usecs
=
tp
->
coalesce_config
.
stats_coalesce_ticks_def
;
ecoal
->
use_adaptive_rx_coalesce
=
(
tp
->
tg3_flags
&
TG3_FLAG_ADAPTIVE_RX
)
!=
0
;
ecoal
->
use_adaptive_tx_coalesce
=
(
tp
->
tg3_flags
&
TG3_FLAG_ADAPTIVE_TX
)
!=
0
;
ecoal
->
pkt_rate_low
=
tp
->
coalesce_config
.
pkt_rate_low
;
ecoal
->
rx_coalesce_usecs_low
=
tp
->
coalesce_config
.
rx_coalesce_ticks_low
;
ecoal
->
rx_max_coalesced_frames_low
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_low
;
ecoal
->
tx_coalesce_usecs_low
=
tp
->
coalesce_config
.
tx_coalesce_ticks_low
;
ecoal
->
tx_max_coalesced_frames_low
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_low
;
ecoal
->
pkt_rate_high
=
tp
->
coalesce_config
.
pkt_rate_high
;
ecoal
->
rx_coalesce_usecs_high
=
tp
->
coalesce_config
.
rx_coalesce_ticks_high
;
ecoal
->
rx_max_coalesced_frames_high
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_high
;
ecoal
->
tx_coalesce_usecs_high
=
tp
->
coalesce_config
.
tx_coalesce_ticks_high
;
ecoal
->
tx_max_coalesced_frames_high
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_high
;
ecoal
->
rate_sample_interval
=
tp
->
coalesce_config
.
rate_sample_jiffies
/
HZ
;
}
static
int
tg3_from_ethtool_coal
(
struct
tg3
*
tp
,
struct
ethtool_coalesce
*
ecoal
)
{
/* Make sure we are not getting garbage. */
if
((
ecoal
->
rx_coalesce_usecs
==
0
&&
ecoal
->
rx_max_coalesced_frames
==
0
)
||
(
ecoal
->
tx_coalesce_usecs
==
0
&&
ecoal
->
tx_max_coalesced_frames
==
0
)
||
ecoal
->
stats_block_coalesce_usecs
==
0
)
return
-
EINVAL
;
if
(
ecoal
->
use_adaptive_rx_coalesce
||
ecoal
->
use_adaptive_tx_coalesce
)
{
if
(
ecoal
->
pkt_rate_low
>
ecoal
->
pkt_rate_high
)
return
-
EINVAL
;
if
(
ecoal
->
rate_sample_interval
==
0
)
return
-
EINVAL
;
if
(
ecoal
->
use_adaptive_rx_coalesce
&&
((
ecoal
->
rx_coalesce_usecs_low
==
0
&&
ecoal
->
rx_max_coalesced_frames_low
==
0
)
||
(
ecoal
->
rx_coalesce_usecs_high
==
0
&&
ecoal
->
rx_max_coalesced_frames_high
==
0
)))
return
-
EINVAL
;
if
(
ecoal
->
use_adaptive_tx_coalesce
&&
((
ecoal
->
tx_coalesce_usecs_low
==
0
&&
ecoal
->
tx_max_coalesced_frames_low
==
0
)
||
(
ecoal
->
tx_coalesce_usecs_high
==
0
&&
ecoal
->
tx_max_coalesced_frames_high
==
0
)))
return
-
EINVAL
;
}
/* Looks good, let it rip. */
spin_lock_irq
(
&
tp
->
lock
);
tp
->
coalesce_config
.
rx_coalesce_ticks
=
tp
->
coalesce_config
.
rx_coalesce_ticks_def
=
ecoal
->
rx_coalesce_usecs
;
tp
->
coalesce_config
.
rx_max_coalesced_frames
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
=
ecoal
->
rx_max_coalesced_frames
;
tp
->
coalesce_config
.
rx_coalesce_ticks_during_int
=
tp
->
coalesce_config
.
rx_coalesce_ticks_during_int_def
=
ecoal
->
rx_coalesce_usecs_irq
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_during_int
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_during_int_def
=
ecoal
->
rx_max_coalesced_frames_irq
;
tp
->
coalesce_config
.
tx_coalesce_ticks
=
tp
->
coalesce_config
.
tx_coalesce_ticks_def
=
ecoal
->
tx_coalesce_usecs
;
tp
->
coalesce_config
.
tx_max_coalesced_frames
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
=
ecoal
->
tx_max_coalesced_frames
;
tp
->
coalesce_config
.
tx_coalesce_ticks_during_int
=
tp
->
coalesce_config
.
tx_coalesce_ticks_during_int_def
=
ecoal
->
tx_coalesce_usecs_irq
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_during_int
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_during_int_def
=
ecoal
->
tx_max_coalesced_frames_irq
;
tp
->
coalesce_config
.
stats_coalesce_ticks
=
tp
->
coalesce_config
.
stats_coalesce_ticks_def
=
ecoal
->
stats_block_coalesce_usecs
;
if
(
ecoal
->
use_adaptive_rx_coalesce
)
tp
->
tg3_flags
|=
TG3_FLAG_ADAPTIVE_RX
;
else
tp
->
tg3_flags
&=
~
TG3_FLAG_ADAPTIVE_RX
;
if
(
ecoal
->
use_adaptive_tx_coalesce
)
tp
->
tg3_flags
|=
TG3_FLAG_ADAPTIVE_TX
;
else
tp
->
tg3_flags
&=
~
TG3_FLAG_ADAPTIVE_TX
;
tp
->
coalesce_config
.
pkt_rate_low
=
ecoal
->
pkt_rate_low
;
tp
->
coalesce_config
.
pkt_rate_high
=
ecoal
->
pkt_rate_high
;
tp
->
coalesce_config
.
rate_sample_jiffies
=
ecoal
->
rate_sample_interval
*
HZ
;
tp
->
coalesce_config
.
rx_coalesce_ticks_low
=
ecoal
->
rx_coalesce_usecs_low
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_low
=
ecoal
->
rx_max_coalesced_frames_low
;
tp
->
coalesce_config
.
tx_coalesce_ticks_low
=
ecoal
->
tx_coalesce_usecs_low
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_low
=
ecoal
->
tx_max_coalesced_frames_low
;
tp
->
coalesce_config
.
rx_coalesce_ticks_high
=
ecoal
->
rx_coalesce_usecs_high
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_high
=
ecoal
->
rx_max_coalesced_frames_high
;
tp
->
coalesce_config
.
tx_coalesce_ticks_high
=
ecoal
->
tx_coalesce_usecs_high
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_high
=
ecoal
->
tx_max_coalesced_frames_high
;
tw32
(
HOSTCC_RXCOL_TICKS
,
tp
->
coalesce_config
.
rx_coalesce_ticks_def
);
tw32
(
HOSTCC_RXMAX_FRAMES
,
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
);
tw32
(
HOSTCC_RXCOAL_TICK_INT
,
tp
->
coalesce_config
.
rx_coalesce_ticks_during_int_def
);
tw32
(
HOSTCC_RXCOAL_MAXF_INT
,
tp
->
coalesce_config
.
rx_max_coalesced_frames_during_int_def
);
tw32
(
HOSTCC_TXCOL_TICKS
,
tp
->
coalesce_config
.
tx_coalesce_ticks_def
);
tw32
(
HOSTCC_TXMAX_FRAMES
,
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
);
tw32
(
HOSTCC_TXCOAL_TICK_INT
,
tp
->
coalesce_config
.
tx_coalesce_ticks_during_int_def
);
tw32
(
HOSTCC_TXCOAL_MAXF_INT
,
tp
->
coalesce_config
.
tx_max_coalesced_frames_during_int_def
);
tw32
(
HOSTCC_STAT_COAL_TICKS
,
tp
->
coalesce_config
.
stats_coalesce_ticks_def
);
spin_unlock_irq
(
&
tp
->
lock
);
return
0
;
}
static
int
tg3_ethtool_ioctl
(
struct
net_device
*
dev
,
void
*
useraddr
)
{
struct
tg3
*
tp
=
dev
->
priv
;
...
...
@@ -4708,8 +4429,8 @@ static int tg3_ethtool_ioctl (struct net_device *dev, void *useraddr)
cmd
.
phy_address
=
PHY_ADDR
;
cmd
.
transceiver
=
0
;
cmd
.
autoneg
=
tp
->
link_config
.
autoneg
;
cmd
.
maxtxpkt
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
;
cmd
.
maxrxpkt
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
;
cmd
.
maxtxpkt
=
0
;
cmd
.
maxrxpkt
=
0
;
if
(
copy_to_user
(
useraddr
,
&
cmd
,
sizeof
(
cmd
)))
return
-
EFAULT
;
return
0
;
...
...
@@ -4761,22 +4482,6 @@ static int tg3_ethtool_ioctl (struct net_device *dev, void *useraddr)
tp
->
link_config
.
duplex
=
cmd
.
duplex
;
}
if
(
cmd
.
maxtxpkt
||
cmd
.
maxrxpkt
)
{
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
=
tp
->
coalesce_config
.
tx_max_coalesced_frames
=
cmd
.
maxtxpkt
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
=
tp
->
coalesce_config
.
rx_max_coalesced_frames
=
cmd
.
maxrxpkt
;
/* Coalescing config bits can be updated without
* a full chip reset.
*/
tw32
(
HOSTCC_TXMAX_FRAMES
,
tp
->
coalesce_config
.
tx_max_coalesced_frames
);
tw32
(
HOSTCC_RXMAX_FRAMES
,
tp
->
coalesce_config
.
rx_max_coalesced_frames
);
}
tg3_setup_phy
(
tp
);
spin_unlock_irq
(
&
tp
->
lock
);
...
...
@@ -4873,22 +4578,6 @@ static int tg3_ethtool_ioctl (struct net_device *dev, void *useraddr)
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_GCOALESCE
:
{
struct
ethtool_coalesce
ecoal
=
{
ETHTOOL_GCOALESCE
};
tg3_to_ethtool_coal
(
tp
,
&
ecoal
);
if
(
copy_to_user
(
useraddr
,
&
ecoal
,
sizeof
(
ecoal
)))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_SCOALESCE
:
{
struct
ethtool_coalesce
ecoal
;
if
(
copy_from_user
(
&
ecoal
,
useraddr
,
sizeof
(
ecoal
)))
return
-
EINVAL
;
return
tg3_from_ethtool_coal
(
tp
,
&
ecoal
);
}
case
ETHTOOL_GRINGPARAM
:
{
struct
ethtool_ringparam
ering
=
{
ETHTOOL_GRINGPARAM
};
...
...
@@ -5641,42 +5330,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
tp
->
tg3_flags
|=
TG3_FLAG_WOL_SPEED_100MB
;
}
/* Only 5701 and later support tagged irq status mode. */
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
!=
ASIC_REV_5700
)
{
tp
->
tg3_flags
|=
TG3_FLAG_TAGGED_IRQ_STATUS
;
tp
->
misc_host_ctrl
|=
MISC_HOST_CTRL_TAGGED_STATUS
;
/* ??? Due to a glitch Broadcom's driver ALWAYS sets
* ??? these bits in coalesce_mode. Because MM_GetConfig
* ??? always sets pDevice->UseTaggedStatus correctly
* ??? the following test at tigon3.c:LM_GetAdapterInfo()
* ???
* ??? pDevice->UseTaggedStatus &&
* ??? (pDevice->ChipRevId == T3_CHIP_ID_5700_C0 ||
* ??? T3_CHIP_REV(pDevice->ChipRevId) == T3_CHIP_REV_5700_AX ||
* ??? T3_CHIP_REV(pDevice->ChipRevId) == T3_CHIP_REV_5700_BX)
* ???
* ??? will never pass and thus pDevice->CoalesceMode will never
* ??? get set to zero. For now I'll mirror what I believe is
* ??? the intention of their driver.
* ???
* ??? Update: This is fixed in Broadcom's 2.2.3 and later
* ??? drivers. All the current 2.0.x drivers still
* ??? have the bug.
*/
tp
->
coalesce_mode
=
(
HOSTCC_MODE_CLRTICK_RXBD
|
HOSTCC_MODE_CLRTICK_TXBD
);
}
else
{
tp
->
coalesce_mode
=
0
;
/* If not using tagged status, set the *_during_int
* coalesce default config values to zero.
*/
tp
->
coalesce_config
.
rx_coalesce_ticks_during_int_def
=
0
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_during_int_def
=
0
;
tp
->
coalesce_config
.
tx_coalesce_ticks_during_int_def
=
0
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_during_int_def
=
0
;
}
/* Only 5701 and later support tagged irq status mode.
*
* However, since we are using NAPI avoid tagged irq status
* because the interrupt condition is more difficult to
* fully clear in that mode.
*/
tp
->
coalesce_mode
=
0
;
if
(
GET_CHIP_REV
(
tp
->
pci_chip_rev_id
)
!=
CHIPREV_5700_AX
&&
GET_CHIP_REV
(
tp
->
pci_chip_rev_id
)
!=
CHIPREV_5700_BX
)
...
...
@@ -6121,61 +5781,6 @@ static void __devinit tg3_init_link_config(struct tg3 *tp)
tp
->
link_config
.
orig_autoneg
=
AUTONEG_INVALID
;
}
static
void
__devinit
tg3_init_coalesce_config
(
struct
tg3
*
tp
)
{
tp
->
coalesce_config
.
rx_coalesce_ticks_def
=
DEFAULT_RXCOL_TICKS
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
=
DEFAULT_RXMAX_FRAMES
;
tp
->
coalesce_config
.
rx_coalesce_ticks_during_int_def
=
DEFAULT_RXCOAL_TICK_INT
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_during_int_def
=
DEFAULT_RXCOAL_MAXF_INT
;
tp
->
coalesce_config
.
tx_coalesce_ticks_def
=
DEFAULT_TXCOL_TICKS
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
=
DEFAULT_TXMAX_FRAMES
;
tp
->
coalesce_config
.
tx_coalesce_ticks_during_int_def
=
DEFAULT_TXCOAL_TICK_INT
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_during_int_def
=
DEFAULT_TXCOAL_MAXF_INT
;
tp
->
coalesce_config
.
stats_coalesce_ticks_def
=
DEFAULT_STAT_COAL_TICKS
;
tp
->
coalesce_config
.
rx_coalesce_ticks_low
=
LOW_RXCOL_TICKS
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_low
=
LOW_RXMAX_FRAMES
;
tp
->
coalesce_config
.
tx_coalesce_ticks_low
=
LOW_TXCOL_TICKS
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_low
=
LOW_TXMAX_FRAMES
;
tp
->
coalesce_config
.
rx_coalesce_ticks_high
=
HIGH_RXCOL_TICKS
;
tp
->
coalesce_config
.
rx_max_coalesced_frames_high
=
HIGH_RXMAX_FRAMES
;
tp
->
coalesce_config
.
tx_coalesce_ticks_high
=
HIGH_TXCOL_TICKS
;
tp
->
coalesce_config
.
tx_max_coalesced_frames_high
=
HIGH_TXMAX_FRAMES
;
/* Active == default */
tp
->
coalesce_config
.
rx_coalesce_ticks
=
tp
->
coalesce_config
.
rx_coalesce_ticks_def
;
tp
->
coalesce_config
.
rx_max_coalesced_frames
=
tp
->
coalesce_config
.
rx_max_coalesced_frames_def
;
tp
->
coalesce_config
.
tx_coalesce_ticks
=
tp
->
coalesce_config
.
tx_coalesce_ticks_def
;
tp
->
coalesce_config
.
tx_max_coalesced_frames
=
tp
->
coalesce_config
.
tx_max_coalesced_frames_def
;
tp
->
coalesce_config
.
stats_coalesce_ticks
=
tp
->
coalesce_config
.
stats_coalesce_ticks_def
;
tp
->
coalesce_config
.
rate_sample_jiffies
=
(
1
*
HZ
);
tp
->
coalesce_config
.
pkt_rate_low
=
22000
;
tp
->
coalesce_config
.
pkt_rate_high
=
61000
;
tp
->
tg3_flags
|=
TG3_FLAG_ADAPTIVE_RX
;
tp
->
tg3_flags
&=
~
(
TG3_FLAG_ADAPTIVE_TX
);
}
static
void
__devinit
tg3_init_bufmgr_config
(
struct
tg3
*
tp
)
{
tp
->
bufmgr_config
.
mbuf_read_dma_low_water
=
...
...
@@ -6333,8 +5938,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
tg3_init_link_config
(
tp
);
tg3_init_coalesce_config
(
tp
);
tg3_init_bufmgr_config
(
tp
);
tp
->
rx_pending
=
TG3_DEF_RX_RING_PENDING
;
...
...
@@ -6351,6 +5954,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
dev
->
set_mac_address
=
tg3_set_mac_addr
;
dev
->
do_ioctl
=
tg3_ioctl
;
dev
->
tx_timeout
=
tg3_tx_timeout
;
dev
->
poll
=
tg3_poll
;
dev
->
weight
=
64
;
dev
->
watchdog_timeo
=
TG3_TX_TIMEOUT
;
dev
->
change_mtu
=
tg3_change_mtu
;
dev
->
irq
=
pdev
->
irq
;
...
...
drivers/net/tg3.h
View file @
038403f6
...
...
@@ -1687,45 +1687,6 @@ struct tg3_link_config {
u8
orig_autoneg
;
};
struct
tg3_coalesce_config
{
/* Current settings. */
u32
rx_coalesce_ticks
;
u32
rx_max_coalesced_frames
;
u32
rx_coalesce_ticks_during_int
;
u32
rx_max_coalesced_frames_during_int
;
u32
tx_coalesce_ticks
;
u32
tx_max_coalesced_frames
;
u32
tx_coalesce_ticks_during_int
;
u32
tx_max_coalesced_frames_during_int
;
u32
stats_coalesce_ticks
;
/* Default settings. */
u32
rx_coalesce_ticks_def
;
u32
rx_max_coalesced_frames_def
;
u32
rx_coalesce_ticks_during_int_def
;
u32
rx_max_coalesced_frames_during_int_def
;
u32
tx_coalesce_ticks_def
;
u32
tx_max_coalesced_frames_def
;
u32
tx_coalesce_ticks_during_int_def
;
u32
tx_max_coalesced_frames_during_int_def
;
u32
stats_coalesce_ticks_def
;
/* Adaptive RX/TX coalescing parameters. */
u32
rate_sample_jiffies
;
u32
pkt_rate_low
;
u32
pkt_rate_high
;
u32
rx_coalesce_ticks_low
;
u32
rx_max_coalesced_frames_low
;
u32
tx_coalesce_ticks_low
;
u32
tx_max_coalesced_frames_low
;
u32
rx_coalesce_ticks_high
;
u32
rx_max_coalesced_frames_high
;
u32
tx_coalesce_ticks_high
;
u32
tx_max_coalesced_frames_high
;
};
struct
tg3_bufmgr_config
{
u32
mbuf_read_dma_low_water
;
u32
mbuf_mac_rx_low_water
;
...
...
@@ -1772,8 +1733,7 @@ struct tg3 {
#define TG3_FLAG_POLL_SERDES 0x00000080
#define TG3_FLAG_PHY_RESET_ON_INIT 0x00000100
#define TG3_FLAG_PCIX_TARGET_HWBUG 0x00000200
#define TG3_FLAG_TAGGED_IRQ_STATUS 0x00000400
#define TG3_FLAG_WOL_SPEED_100MB 0x00000800
#define TG3_FLAG_WOL_SPEED_100MB 0x00000400
#define TG3_FLAG_WOL_ENABLE 0x00001000
#define TG3_FLAG_NVRAM 0x00002000
#define TG3_FLAG_NVRAM_BUFFERED 0x00004000
...
...
@@ -1802,7 +1762,6 @@ struct tg3 {
u32
timer_offset
;
struct
tg3_link_config
link_config
;
struct
tg3_coalesce_config
coalesce_config
;
struct
tg3_bufmgr_config
bufmgr_config
;
u32
rx_pending
;
...
...
include/linux/if_vlan.h
View file @
038403f6
...
...
@@ -141,9 +141,10 @@ struct vlan_skb_tx_cookie {
(VLAN_TX_SKB_CB(__skb)->magic == VLAN_TX_COOKIE_MAGIC)
#define vlan_tx_tag_get(__skb) (VLAN_TX_SKB_CB(__skb)->vlan_tag)
/* VLAN rx hw acceleration helper. This acts like netif_rx(). */
static
inline
int
vlan_hwaccel_rx
(
struct
sk_buff
*
skb
,
struct
vlan_group
*
grp
,
unsigned
short
vlan_tag
)
/* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
static
inline
int
__vlan_hwaccel_rx
(
struct
sk_buff
*
skb
,
struct
vlan_group
*
grp
,
unsigned
short
vlan_tag
,
int
polling
)
{
struct
net_device_stats
*
stats
;
...
...
@@ -182,9 +183,22 @@ static inline int vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
break
;
};
return
netif_rx
(
skb
);
return
(
polling
?
netif_receive_skb
(
skb
)
:
netif_rx
(
skb
)
);
}
static
inline
int
vlan_hwaccel_rx
(
struct
sk_buff
*
skb
,
struct
vlan_group
*
grp
,
unsigned
short
vlan_tag
)
{
return
__vlan_hwaccel_rx
(
skb
,
grp
,
vlan_tag
,
0
);
}
static
inline
int
vlan_hwaccel_receive_skb
(
struct
sk_buff
*
skb
,
struct
vlan_group
*
grp
,
unsigned
short
vlan_tag
)
{
return
__vlan_hwaccel_rx
(
skb
,
grp
,
vlan_tag
,
1
);
}
#endif
/* __KERNEL__ */
/* VLAN IOCTLs are found in sockios.h */
...
...
include/linux/netlink.h
View file @
038403f6
...
...
@@ -110,6 +110,8 @@ extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int
extern
void
netlink_broadcast
(
struct
sock
*
ssk
,
struct
sk_buff
*
skb
,
__u32
pid
,
__u32
group
,
int
allocation
);
extern
void
netlink_set_err
(
struct
sock
*
ssk
,
__u32
pid
,
__u32
group
,
int
code
);
extern
int
netlink_register_notifier
(
struct
notifier_block
*
nb
);
extern
int
netlink_unregister_notifier
(
struct
notifier_block
*
nb
);
/*
* skb should fit one page. This choice is good for headerless malloc.
...
...
@@ -129,6 +131,12 @@ struct netlink_callback
long
args
[
4
];
};
struct
netlink_notify
{
int
pid
;
int
protocol
;
};
static
__inline__
struct
nlmsghdr
*
__nlmsg_put
(
struct
sk_buff
*
skb
,
u32
pid
,
u32
seq
,
int
type
,
int
len
)
{
...
...
include/linux/notifier.h
View file @
038403f6
...
...
@@ -58,5 +58,7 @@ extern int notifier_call_chain(struct notifier_block **n, unsigned long val, voi
#define SYS_HALT 0x0002
/* Notify of system halt */
#define SYS_POWER_OFF 0x0003
/* Notify of system power off */
#define NETLINK_URELEASE 0x0001
/* Unicast netlink socket released */
#endif
/* __KERNEL__ */
#endif
/* _LINUX_NOTIFIER_H */
include/net/dsfield.h
View file @
038403f6
...
...
@@ -51,29 +51,4 @@ static inline void ipv6_change_dsfield(struct ipv6hdr *ipv6h,__u8 mask,
}
#if 0 /* put this later into asm-i386 or such ... */
static inline void ip_change_dsfield(struct iphdr *iph,__u16 dsfield)
{
__u16 check;
__asm__ __volatile__("
movw 10(%1),%0
xchg %b0,%h0
addb 1(%1),%b0
adcb $0,%h0
adcw $1,%0
cmc
sbbw %2,%0
sbbw $0,%0
movb %b2,1(%1)
xchg %b0,%h0
movw %0,10(%1)"
: "=&r" (check)
: "r" (iph), "r" (dsfield)
: "cc");
}
#endif
#endif
net/core/dst.c
View file @
038403f6
...
...
@@ -29,7 +29,9 @@
* 4) All operations modify state, so a spinlock is used.
*/
static
struct
dst_entry
*
dst_garbage_list
;
#if RT_CACHE_DEBUG >= 2
static
atomic_t
dst_total
=
ATOMIC_INIT
(
0
);
#endif
static
spinlock_t
dst_lock
=
SPIN_LOCK_UNLOCKED
;
static
unsigned
long
dst_gc_timer_expires
;
...
...
@@ -108,7 +110,9 @@ void * dst_alloc(struct dst_ops * ops)
dst
->
lastuse
=
jiffies
;
dst
->
input
=
dst_discard
;
dst
->
output
=
dst_blackhole
;
#if RT_CACHE_DEBUG >= 2
atomic_inc
(
&
dst_total
);
#endif
atomic_inc
(
&
ops
->
entries
);
return
dst
;
}
...
...
@@ -158,7 +162,9 @@ void dst_destroy(struct dst_entry * dst)
dst
->
ops
->
destroy
(
dst
);
if
(
dst
->
dev
)
dev_put
(
dst
->
dev
);
#if RT_CACHE_DEBUG >= 2
atomic_dec
(
&
dst_total
);
#endif
kmem_cache_free
(
dst
->
ops
->
kmem_cachep
,
dst
);
}
...
...
net/netlink/af_netlink.c
View file @
038403f6
...
...
@@ -41,6 +41,7 @@
#include <linux/rtnetlink.h>
#include <linux/proc_fs.h>
#include <linux/smp_lock.h>
#include <linux/notifier.h>
#include <net/sock.h>
#include <net/scm.h>
...
...
@@ -81,6 +82,8 @@ atomic_t netlink_sock_nr;
static
rwlock_t
nl_table_lock
=
RW_LOCK_UNLOCKED
;
static
atomic_t
nl_table_users
=
ATOMIC_INIT
(
0
);
static
struct
notifier_block
*
netlink_chain
;
static
void
netlink_sock_destruct
(
struct
sock
*
sk
)
{
skb_queue_purge
(
&
sk
->
receive_queue
);
...
...
@@ -276,6 +279,12 @@ static int netlink_release(struct socket *sock)
skb_queue_purge
(
&
sk
->
write_queue
);
if
(
nlk
->
pid
&&
!
nlk
->
groups
)
{
struct
netlink_notify
n
=
{
protocol
:
sk
->
protocol
,
pid:
nlk
->
pid
};
notifier_call_chain
(
&
netlink_chain
,
NETLINK_URELEASE
,
&
n
);
}
sock_put
(
sk
);
return
0
;
}
...
...
@@ -967,6 +976,16 @@ static int netlink_read_proc(char *buffer, char **start, off_t offset,
}
#endif
int
netlink_register_notifier
(
struct
notifier_block
*
nb
)
{
return
notifier_chain_register
(
&
netlink_chain
,
nb
);
}
int
netlink_unregister_notifier
(
struct
notifier_block
*
nb
)
{
return
notifier_chain_unregister
(
&
netlink_chain
,
nb
);
}
struct
proto_ops
netlink_ops
=
{
family:
PF_NETLINK
,
...
...
net/netsyms.c
View file @
038403f6
...
...
@@ -402,6 +402,8 @@ EXPORT_SYMBOL(netlink_unicast);
EXPORT_SYMBOL
(
netlink_kernel_create
);
EXPORT_SYMBOL
(
netlink_dump_start
);
EXPORT_SYMBOL
(
netlink_ack
);
EXPORT_SYMBOL
(
netlink_register_notifier
);
EXPORT_SYMBOL
(
netlink_unregister_notifier
);
#if defined(CONFIG_NETLINK_DEV) || defined(CONFIG_NETLINK_DEV_MODULE)
EXPORT_SYMBOL
(
netlink_attach
);
EXPORT_SYMBOL
(
netlink_detach
);
...
...
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