Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
d1138cf0
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
d1138cf0
编写于
1月 17, 2006
作者:
L
Linus Torvalds
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
上级
15578eeb
77783a78
变更
40
展开全部
显示空白变更内容
内联
并排
Showing
40 changed file
with
1936 addition
and
1580 deletion
+1936
-1580
MAINTAINERS
MAINTAINERS
+5
-3
drivers/net/b44.c
drivers/net/b44.c
+1
-1
drivers/net/e100.c
drivers/net/e100.c
+96
-46
drivers/net/e1000/e1000.h
drivers/net/e1000/e1000.h
+39
-12
drivers/net/e1000/e1000_ethtool.c
drivers/net/e1000/e1000_ethtool.c
+119
-48
drivers/net/e1000/e1000_hw.c
drivers/net/e1000/e1000_hw.c
+42
-11
drivers/net/e1000/e1000_hw.h
drivers/net/e1000/e1000_hw.h
+24
-1
drivers/net/e1000/e1000_main.c
drivers/net/e1000/e1000_main.c
+534
-280
drivers/net/e1000/e1000_param.c
drivers/net/e1000/e1000_param.c
+10
-4
drivers/net/mv643xx_eth.c
drivers/net/mv643xx_eth.c
+424
-256
drivers/net/skge.c
drivers/net/skge.c
+15
-5
drivers/net/sky2.c
drivers/net/sky2.c
+136
-83
drivers/net/spider_net.c
drivers/net/spider_net.c
+265
-247
drivers/net/spider_net.h
drivers/net/spider_net.h
+42
-33
drivers/net/spider_net_ethtool.c
drivers/net/spider_net_ethtool.c
+19
-0
drivers/net/wireless/airo.c
drivers/net/wireless/airo.c
+10
-11
drivers/net/wireless/atmel.c
drivers/net/wireless/atmel.c
+2
-2
drivers/net/wireless/hostap/Kconfig
drivers/net/wireless/hostap/Kconfig
+18
-4
drivers/net/wireless/hostap/Makefile
drivers/net/wireless/hostap/Makefile
+2
-1
drivers/net/wireless/hostap/hostap.h
drivers/net/wireless/hostap/hostap.h
+37
-0
drivers/net/wireless/hostap/hostap_80211.h
drivers/net/wireless/hostap/hostap_80211.h
+3
-0
drivers/net/wireless/hostap/hostap_80211_rx.c
drivers/net/wireless/hostap/hostap_80211_rx.c
+11
-0
drivers/net/wireless/hostap/hostap_80211_tx.c
drivers/net/wireless/hostap/hostap_80211_tx.c
+15
-0
drivers/net/wireless/hostap/hostap_ap.c
drivers/net/wireless/hostap/hostap_ap.c
+20
-16
drivers/net/wireless/hostap/hostap_ap.h
drivers/net/wireless/hostap/hostap_ap.h
+2
-0
drivers/net/wireless/hostap/hostap_common.h
drivers/net/wireless/hostap/hostap_common.h
+3
-0
drivers/net/wireless/hostap/hostap_config.h
drivers/net/wireless/hostap/hostap_config.h
+4
-9
drivers/net/wireless/hostap/hostap_info.c
drivers/net/wireless/hostap/hostap_info.c
+3
-0
drivers/net/wireless/hostap/hostap_ioctl.c
drivers/net/wireless/hostap/hostap_ioctl.c
+7
-5
drivers/net/wireless/hostap/hostap_main.c
drivers/net/wireless/hostap/hostap_main.c
+5
-55
drivers/net/wireless/hostap/hostap_proc.c
drivers/net/wireless/hostap/hostap_proc.c
+7
-0
drivers/net/wireless/hostap/hostap_wlan.h
drivers/net/wireless/hostap/hostap_wlan.h
+4
-0
drivers/net/wireless/ipw2100.c
drivers/net/wireless/ipw2100.c
+0
-434
drivers/net/wireless/ipw2200.c
drivers/net/wireless/ipw2200.c
+6
-8
drivers/net/wireless/prism54/isl_ioctl.c
drivers/net/wireless/prism54/isl_ioctl.c
+1
-1
drivers/net/wireless/prism54/islpci_eth.c
drivers/net/wireless/prism54/islpci_eth.c
+1
-1
drivers/net/wireless/ray_cs.c
drivers/net/wireless/ray_cs.c
+1
-1
drivers/net/wireless/wavelan_cs.c
drivers/net/wireless/wavelan_cs.c
+1
-1
include/net/ieee80211_crypt.h
include/net/ieee80211_crypt.h
+1
-0
include/net/iw_handler.h
include/net/iw_handler.h
+1
-1
未找到文件。
MAINTAINERS
浏览文件 @
d1138cf0
...
...
@@ -1696,11 +1696,13 @@ M: mtk-manpages@gmx.net
W: ftp://ftp.kernel.org/pub/linux/docs/manpages
S: Maintained
MARVELL MV64340 ETHERNET DRIVER
MARVELL MV643XX ETHERNET DRIVER
P: Dale Farnsworth
M: dale@farnsworth.org
P: Manish Lachwani
L: linux-mips@linux-mips.org
M: mlachwani@mvista.com
L: netdev@vger.kernel.org
S:
Supported
S:
Odd Fixes for 2.4; Maintained for 2.6.
MATROX FRAMEBUFFER DRIVER
P: Petr Vandrovec
...
...
drivers/net/b44.c
浏览文件 @
d1138cf0
...
...
@@ -2136,7 +2136,7 @@ static int __init b44_init(void)
/* Setup paramaters for syncing RX/TX DMA descriptors */
dma_desc_align_mask
=
~
(
dma_desc_align_size
-
1
);
dma_desc_sync_size
=
max
(
dma_desc_align_size
,
sizeof
(
struct
dma_desc
));
dma_desc_sync_size
=
max
_t
(
unsigned
int
,
dma_desc_align_size
,
sizeof
(
struct
dma_desc
));
return
pci_module_init
(
&
b44_driver
);
}
...
...
drivers/net/e100.c
浏览文件 @
d1138cf0
...
...
@@ -160,7 +160,7 @@
#define DRV_NAME "e100"
#define DRV_EXT "-NAPI"
#define DRV_VERSION "3.
4.14-k4
"DRV_EXT
#define DRV_VERSION "3.
5.10-k2
"DRV_EXT
#define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver"
#define DRV_COPYRIGHT "Copyright(c) 1999-2005 Intel Corporation"
#define PFX DRV_NAME ": "
...
...
@@ -1170,7 +1170,7 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)
0x00000000, 0x00000000, 0x00000000, 0x00000000, \
}
static
void
e100_
load
_ucode
(
struct
nic
*
nic
,
struct
cb
*
cb
,
struct
sk_buff
*
skb
)
static
void
e100_
setup
_ucode
(
struct
nic
*
nic
,
struct
cb
*
cb
,
struct
sk_buff
*
skb
)
{
/* *INDENT-OFF* */
static
struct
{
...
...
@@ -1284,12 +1284,46 @@ static void e100_load_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb)
for
(
i
=
0
;
i
<
UCODE_SIZE
;
i
++
)
cb
->
u
.
ucode
[
i
]
=
cpu_to_le32
(
ucode
[
i
]);
cb
->
command
=
cpu_to_le16
(
cb_ucode
);
cb
->
command
=
cpu_to_le16
(
cb_ucode
|
cb_el
);
return
;
}
noloaducode:
cb
->
command
=
cpu_to_le16
(
cb_nop
);
cb
->
command
=
cpu_to_le16
(
cb_nop
|
cb_el
);
}
static
inline
int
e100_exec_cb_wait
(
struct
nic
*
nic
,
struct
sk_buff
*
skb
,
void
(
*
cb_prepare
)(
struct
nic
*
,
struct
cb
*
,
struct
sk_buff
*
))
{
int
err
=
0
,
counter
=
50
;
struct
cb
*
cb
=
nic
->
cb_to_clean
;
if
((
err
=
e100_exec_cb
(
nic
,
NULL
,
e100_setup_ucode
)))
DPRINTK
(
PROBE
,
ERR
,
"ucode cmd failed with error %d
\n
"
,
err
);
/* must restart cuc */
nic
->
cuc_cmd
=
cuc_start
;
/* wait for completion */
e100_write_flush
(
nic
);
udelay
(
10
);
/* wait for possibly (ouch) 500ms */
while
(
!
(
cb
->
status
&
cpu_to_le16
(
cb_complete
)))
{
msleep
(
10
);
if
(
!--
counter
)
break
;
}
/* ack any interupts, something could have been set */
writeb
(
~
0
,
&
nic
->
csr
->
scb
.
stat_ack
);
/* if the command failed, or is not OK, notify and return */
if
(
!
counter
||
!
(
cb
->
status
&
cpu_to_le16
(
cb_ok
)))
{
DPRINTK
(
PROBE
,
ERR
,
"ucode load failed
\n
"
);
err
=
-
EPERM
;
}
return
err
;
}
static
void
e100_setup_iaaddr
(
struct
nic
*
nic
,
struct
cb
*
cb
,
...
...
@@ -1388,7 +1422,7 @@ static int e100_hw_init(struct nic *nic)
return
err
;
if
((
err
=
e100_exec_cmd
(
nic
,
ruc_load_base
,
0
)))
return
err
;
if
((
err
=
e100_exec_cb
(
nic
,
NULL
,
e100_load
_ucode
)))
if
((
err
=
e100_exec_cb_wait
(
nic
,
NULL
,
e100_setup
_ucode
)))
return
err
;
if
((
err
=
e100_exec_cb
(
nic
,
NULL
,
e100_configure
)))
return
err
;
...
...
@@ -2631,7 +2665,9 @@ static int __devinit e100_probe(struct pci_dev *pdev,
nic
->
flags
|=
wol_magic
;
/* ack any pending wake events, disable PME */
pci_enable_wake
(
pdev
,
0
,
0
);
err
=
pci_enable_wake
(
pdev
,
0
,
0
);
if
(
err
)
DPRINTK
(
PROBE
,
ERR
,
"Error clearing wake event
\n
"
);
strcpy
(
netdev
->
name
,
"eth%d"
);
if
((
err
=
register_netdev
(
netdev
)))
{
...
...
@@ -2682,6 +2718,7 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
{
struct
net_device
*
netdev
=
pci_get_drvdata
(
pdev
);
struct
nic
*
nic
=
netdev_priv
(
netdev
);
int
retval
;
if
(
netif_running
(
netdev
))
e100_down
(
nic
);
...
...
@@ -2689,9 +2726,14 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state)
netif_device_detach
(
netdev
);
pci_save_state
(
pdev
);
pci_enable_wake
(
pdev
,
pci_choose_state
(
pdev
,
state
),
nic
->
flags
&
(
wol_magic
|
e100_asf
(
nic
)));
retval
=
pci_enable_wake
(
pdev
,
pci_choose_state
(
pdev
,
state
),
nic
->
flags
&
(
wol_magic
|
e100_asf
(
nic
)));
if
(
retval
)
DPRINTK
(
PROBE
,
ERR
,
"Error enabling wake
\n
"
);
pci_disable_device
(
pdev
);
pci_set_power_state
(
pdev
,
pci_choose_state
(
pdev
,
state
));
retval
=
pci_set_power_state
(
pdev
,
pci_choose_state
(
pdev
,
state
));
if
(
retval
)
DPRINTK
(
PROBE
,
ERR
,
"Error %d setting power state
\n
"
,
retval
);
return
0
;
}
...
...
@@ -2700,11 +2742,16 @@ static int e100_resume(struct pci_dev *pdev)
{
struct
net_device
*
netdev
=
pci_get_drvdata
(
pdev
);
struct
nic
*
nic
=
netdev_priv
(
netdev
);
int
retval
;
pci_set_power_state
(
pdev
,
PCI_D0
);
retval
=
pci_set_power_state
(
pdev
,
PCI_D0
);
if
(
retval
)
DPRINTK
(
PROBE
,
ERR
,
"Error waking adapter
\n
"
);
pci_restore_state
(
pdev
);
/* ack any pending wake events, disable PME */
pci_enable_wake
(
pdev
,
0
,
0
);
retval
=
pci_enable_wake
(
pdev
,
0
,
0
);
if
(
retval
)
DPRINTK
(
PROBE
,
ERR
,
"Error clearing wake events
\n
"
);
if
(
e100_hw_init
(
nic
))
DPRINTK
(
HW
,
ERR
,
"e100_hw_init failed
\n
"
);
...
...
@@ -2721,12 +2768,15 @@ static void e100_shutdown(struct pci_dev *pdev)
{
struct
net_device
*
netdev
=
pci_get_drvdata
(
pdev
);
struct
nic
*
nic
=
netdev_priv
(
netdev
);
int
retval
;
#ifdef CONFIG_PM
pci_enable_wake
(
pdev
,
0
,
nic
->
flags
&
(
wol_magic
|
e100_asf
(
nic
)));
retval
=
pci_enable_wake
(
pdev
,
0
,
nic
->
flags
&
(
wol_magic
|
e100_asf
(
nic
)));
#else
pci_enable_wake
(
pdev
,
0
,
nic
->
flags
&
(
wol_magic
));
retval
=
pci_enable_wake
(
pdev
,
0
,
nic
->
flags
&
(
wol_magic
));
#endif
if
(
retval
)
DPRINTK
(
PROBE
,
ERR
,
"Error enabling wake
\n
"
);
}
...
...
drivers/net/e1000/e1000.h
浏览文件 @
d1138cf0
...
...
@@ -72,10 +72,6 @@
#include <linux/mii.h>
#include <linux/ethtool.h>
#include <linux/if_vlan.h>
#ifdef CONFIG_E1000_MQ
#include <linux/cpu.h>
#include <linux/smp.h>
#endif
#define BAR_0 0
#define BAR_1 1
...
...
@@ -87,6 +83,10 @@
struct
e1000_adapter
;
#include "e1000_hw.h"
#ifdef CONFIG_E1000_MQ
#include <linux/cpu.h>
#include <linux/smp.h>
#endif
#ifdef DBG
#define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args)
...
...
@@ -169,6 +169,13 @@ struct e1000_buffer {
uint16_t
next_to_watch
;
};
#ifdef CONFIG_E1000_MQ
struct
e1000_queue_stats
{
uint64_t
packets
;
uint64_t
bytes
;
};
#endif
struct
e1000_ps_page
{
struct
page
*
ps_page
[
PS_PAGE_BUFFERS
];
};
struct
e1000_ps_page_dma
{
uint64_t
ps_page_dma
[
PS_PAGE_BUFFERS
];
};
...
...
@@ -191,10 +198,12 @@ struct e1000_tx_ring {
spinlock_t
tx_lock
;
uint16_t
tdh
;
uint16_t
tdt
;
uint64_t
pkt
;
boolean_t
last_tx_tso
;
#ifdef CONFIG_E1000_MQ
struct
e1000_queue_stats
tx_stats
;
#endif
};
struct
e1000_rx_ring
{
...
...
@@ -216,9 +225,17 @@ struct e1000_rx_ring {
struct
e1000_ps_page
*
ps_page
;
struct
e1000_ps_page_dma
*
ps_page_dma
;
struct
sk_buff
*
rx_skb_top
;
struct
sk_buff
*
rx_skb_prev
;
/* cpu for rx queue */
int
cpu
;
uint16_t
rdh
;
uint16_t
rdt
;
uint64_t
pkt
;
#ifdef CONFIG_E1000_MQ
struct
e1000_queue_stats
rx_stats
;
#endif
};
#define E1000_DESC_UNUSED(R) \
...
...
@@ -251,6 +268,9 @@ struct e1000_adapter {
uint16_t
link_speed
;
uint16_t
link_duplex
;
spinlock_t
stats_lock
;
#ifdef CONFIG_E1000_NAPI
spinlock_t
tx_queue_lock
;
#endif
atomic_t
irq_sem
;
struct
work_struct
tx_timeout_task
;
struct
work_struct
watchdog_task
;
...
...
@@ -264,6 +284,7 @@ struct e1000_adapter {
#ifdef CONFIG_E1000_MQ
struct
e1000_tx_ring
**
cpu_tx_ring
;
/* per-cpu */
#endif
unsigned
long
tx_queue_len
;
uint32_t
txd_cmd
;
uint32_t
tx_int_delay
;
uint32_t
tx_abs_int_delay
;
...
...
@@ -271,9 +292,11 @@ struct e1000_adapter {
uint64_t
gotcl_old
;
uint64_t
tpt_old
;
uint64_t
colc_old
;
uint32_t
tx_timeout_count
;
uint32_t
tx_fifo_head
;
uint32_t
tx_head_addr
;
uint32_t
tx_fifo_size
;
uint8_t
tx_timeout_factor
;
atomic_t
tx_fifo_stall
;
boolean_t
pcix_82544
;
boolean_t
detect_tx_hung
;
...
...
@@ -288,7 +311,8 @@ struct e1000_adapter {
struct
e1000_rx_ring
*
rx_ring
);
#endif
void
(
*
alloc_rx_buf
)
(
struct
e1000_adapter
*
adapter
,
struct
e1000_rx_ring
*
rx_ring
);
struct
e1000_rx_ring
*
rx_ring
,
int
cleaned_count
);
struct
e1000_rx_ring
*
rx_ring
;
/* One per active queue */
#ifdef CONFIG_E1000_NAPI
struct
net_device
*
polling_netdev
;
/* One per active queue */
...
...
@@ -296,13 +320,15 @@ struct e1000_adapter {
#ifdef CONFIG_E1000_MQ
struct
net_device
**
cpu_netdev
;
/* per-cpu */
struct
call_async_data_struct
rx_sched_call_data
;
int
cpu_for_queue
[
4
]
;
cpumask_t
cpumask
;
#endif
int
num_queues
;
int
num_tx_queues
;
int
num_rx_queues
;
uint64_t
hw_csum_err
;
uint64_t
hw_csum_good
;
uint64_t
rx_hdr_split
;
uint32_t
alloc_rx_buff_failed
;
uint32_t
rx_int_delay
;
uint32_t
rx_abs_int_delay
;
boolean_t
rx_csum
;
...
...
@@ -330,6 +356,7 @@ struct e1000_adapter {
struct
e1000_rx_ring
test_rx_ring
;
u32
*
config_space
;
int
msg_enable
;
#ifdef CONFIG_PCI_MSI
boolean_t
have_msi
;
...
...
drivers/net/e1000/e1000_ethtool.c
浏览文件 @
d1138cf0
...
...
@@ -80,6 +80,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{
"tx_deferred_ok"
,
E1000_STAT
(
stats
.
dc
)
},
{
"tx_single_coll_ok"
,
E1000_STAT
(
stats
.
scc
)
},
{
"tx_multi_coll_ok"
,
E1000_STAT
(
stats
.
mcc
)
},
{
"tx_timeout_count"
,
E1000_STAT
(
tx_timeout_count
)
},
{
"rx_long_length_errors"
,
E1000_STAT
(
stats
.
roc
)
},
{
"rx_short_length_errors"
,
E1000_STAT
(
stats
.
ruc
)
},
{
"rx_align_errors"
,
E1000_STAT
(
stats
.
algnerrc
)
},
...
...
@@ -93,9 +94,20 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{
"rx_csum_offload_good"
,
E1000_STAT
(
hw_csum_good
)
},
{
"rx_csum_offload_errors"
,
E1000_STAT
(
hw_csum_err
)
},
{
"rx_header_split"
,
E1000_STAT
(
rx_hdr_split
)
},
{
"alloc_rx_buff_failed"
,
E1000_STAT
(
alloc_rx_buff_failed
)
},
};
#define E1000_STATS_LEN \
#ifdef CONFIG_E1000_MQ
#define E1000_QUEUE_STATS_LEN \
(((struct e1000_adapter *)netdev->priv)->num_tx_queues + \
((struct e1000_adapter *)netdev->priv)->num_rx_queues) \
* (sizeof(struct e1000_queue_stats) / sizeof(uint64_t))
#else
#define E1000_QUEUE_STATS_LEN 0
#endif
#define E1000_GLOBAL_STATS_LEN \
sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats)
#define E1000_STATS_LEN (E1000_GLOBAL_STATS_LEN + E1000_QUEUE_STATS_LEN)
static
const
char
e1000_gstrings_test
[][
ETH_GSTRING_LEN
]
=
{
"Register test (offline)"
,
"Eeprom test (offline)"
,
"Interrupt test (offline)"
,
"Loopback test (offline)"
,
...
...
@@ -183,7 +195,15 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
struct
e1000_hw
*
hw
=
&
adapter
->
hw
;
if
(
ecmd
->
autoneg
==
AUTONEG_ENABLE
)
{
/* When SoL/IDER sessions are active, autoneg/speed/duplex
* cannot be changed */
if
(
e1000_check_phy_reset_block
(
hw
))
{
DPRINTK
(
DRV
,
ERR
,
"Cannot change link characteristics "
"when SoL/IDER is active.
\n
"
);
return
-
EINVAL
;
}
if
(
ecmd
->
autoneg
==
AUTONEG_ENABLE
)
{
hw
->
autoneg
=
1
;
if
(
hw
->
media_type
==
e1000_media_type_fiber
)
hw
->
autoneg_advertised
=
ADVERTISED_1000baseT_Full
|
...
...
@@ -568,7 +588,7 @@ e1000_get_drvinfo(struct net_device *netdev,
strncpy
(
drvinfo
->
driver
,
e1000_driver_name
,
32
);
strncpy
(
drvinfo
->
version
,
e1000_driver_version
,
32
);
/* EEPROM image version # is reported as firware version # for
/* EEPROM image version # is reported as fir
m
ware version # for
* 8257{1|2|3} controllers */
e1000_read_eeprom
(
&
adapter
->
hw
,
5
,
1
,
&
eeprom_data
);
switch
(
adapter
->
hw
.
mac_type
)
{
...
...
@@ -581,7 +601,7 @@ e1000_get_drvinfo(struct net_device *netdev,
eeprom_data
&
0x000F
);
break
;
default:
sprintf
(
firmware_version
,
"
n/a
"
);
sprintf
(
firmware_version
,
"
N/A
"
);
}
strncpy
(
drvinfo
->
fw_version
,
firmware_version
,
32
);
...
...
@@ -623,8 +643,8 @@ e1000_set_ringparam(struct net_device *netdev,
struct
e1000_rx_ring
*
rxdr
,
*
rx_old
,
*
rx_new
;
int
i
,
err
,
tx_ring_size
,
rx_ring_size
;
tx_ring_size
=
sizeof
(
struct
e1000_tx_ring
)
*
adapter
->
num_queues
;
rx_ring_size
=
sizeof
(
struct
e1000_rx_ring
)
*
adapter
->
num_queues
;
tx_ring_size
=
sizeof
(
struct
e1000_tx_ring
)
*
adapter
->
num_
tx_
queues
;
rx_ring_size
=
sizeof
(
struct
e1000_rx_ring
)
*
adapter
->
num_
rx_
queues
;
if
(
netif_running
(
adapter
->
netdev
))
e1000_down
(
adapter
);
...
...
@@ -663,10 +683,10 @@ e1000_set_ringparam(struct net_device *netdev,
E1000_MAX_TXD
:
E1000_MAX_82544_TXD
));
E1000_ROUNDUP
(
txdr
->
count
,
REQ_TX_DESCRIPTOR_MULTIPLE
);
for
(
i
=
0
;
i
<
adapter
->
num_
queues
;
i
++
)
{
for
(
i
=
0
;
i
<
adapter
->
num_
tx_queues
;
i
++
)
txdr
[
i
].
count
=
txdr
->
count
;
for
(
i
=
0
;
i
<
adapter
->
num_rx_queues
;
i
++
)
rxdr
[
i
].
count
=
rxdr
->
count
;
}
if
(
netif_running
(
adapter
->
netdev
))
{
/* Try to get new resources before deleting old */
...
...
@@ -979,18 +999,17 @@ e1000_free_desc_rings(struct e1000_adapter *adapter)
}
}
if
(
txdr
->
desc
)
{
if
(
txdr
->
desc
)
{
pci_free_consistent
(
pdev
,
txdr
->
size
,
txdr
->
desc
,
txdr
->
dma
);
txdr
->
desc
=
NULL
;
}
if
(
rxdr
->
desc
)
{
if
(
rxdr
->
desc
)
{
pci_free_consistent
(
pdev
,
rxdr
->
size
,
rxdr
->
desc
,
rxdr
->
dma
);
rxdr
->
desc
=
NULL
;
}
kfree
(
txdr
->
buffer_info
);
txdr
->
buffer_info
=
NULL
;
kfree
(
rxdr
->
buffer_info
);
rxdr
->
buffer_info
=
NULL
;
...
...
@@ -1327,8 +1346,8 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
static
int
e1000_setup_loopback_test
(
struct
e1000_adapter
*
adapter
)
{
uint32_t
rctl
;
struct
e1000_hw
*
hw
=
&
adapter
->
hw
;
uint32_t
rctl
;
if
(
hw
->
media_type
==
e1000_media_type_fiber
||
hw
->
media_type
==
e1000_media_type_internal_serdes
)
{
...
...
@@ -1362,25 +1381,25 @@ e1000_setup_loopback_test(struct e1000_adapter *adapter)
static
void
e1000_loopback_cleanup
(
struct
e1000_adapter
*
adapter
)
{
struct
e1000_hw
*
hw
=
&
adapter
->
hw
;
uint32_t
rctl
;
uint16_t
phy_reg
;
struct
e1000_hw
*
hw
=
&
adapter
->
hw
;
rctl
=
E1000_READ_REG
(
&
adapter
->
hw
,
RCTL
);
rctl
=
E1000_READ_REG
(
hw
,
RCTL
);
rctl
&=
~
(
E1000_RCTL_LBM_TCVR
|
E1000_RCTL_LBM_MAC
);
E1000_WRITE_REG
(
&
adapter
->
hw
,
RCTL
,
rctl
);
E1000_WRITE_REG
(
hw
,
RCTL
,
rctl
);
switch
(
hw
->
mac_type
)
{
case
e1000_82571
:
case
e1000_82572
:
if
(
hw
->
media_type
==
e1000_media_type_fiber
||
hw
->
media_type
==
e1000_media_type_internal_serdes
)
{
hw
->
media_type
==
e1000_media_type_internal_serdes
)
{
#define E1000_SERDES_LB_OFF 0x400
E1000_WRITE_REG
(
hw
,
SCTL
,
E1000_SERDES_LB_OFF
);
msec_delay
(
10
);
break
;
}
/*
fall thru for Cu adapters
*/
/*
Fall Through
*/
case
e1000_82545
:
case
e1000_82546
:
case
e1000_82545_rev_3
:
...
...
@@ -1401,7 +1420,7 @@ static void
e1000_create_lbtest_frame
(
struct
sk_buff
*
skb
,
unsigned
int
frame_size
)
{
memset
(
skb
->
data
,
0xFF
,
frame_size
);
frame_size
=
(
frame_size
%
2
)
?
(
frame_size
-
1
)
:
frame_size
;
frame_size
&=
~
1
;
memset
(
&
skb
->
data
[
frame_size
/
2
],
0xAA
,
frame_size
/
2
-
1
);
memset
(
&
skb
->
data
[
frame_size
/
2
+
10
],
0xBE
,
1
);
memset
(
&
skb
->
data
[
frame_size
/
2
+
12
],
0xAF
,
1
);
...
...
@@ -1410,7 +1429,7 @@ e1000_create_lbtest_frame(struct sk_buff *skb, unsigned int frame_size)
static
int
e1000_check_lbtest_frame
(
struct
sk_buff
*
skb
,
unsigned
int
frame_size
)
{
frame_size
=
(
frame_size
%
2
)
?
(
frame_size
-
1
)
:
frame_size
;
frame_size
&=
~
1
;
if
(
*
(
skb
->
data
+
3
)
==
0xFF
)
{
if
((
*
(
skb
->
data
+
frame_size
/
2
+
10
)
==
0xBE
)
&&
(
*
(
skb
->
data
+
frame_size
/
2
+
12
)
==
0xAF
))
{
...
...
@@ -1488,14 +1507,25 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
static
int
e1000_loopback_test
(
struct
e1000_adapter
*
adapter
,
uint64_t
*
data
)
{
if
((
*
data
=
e1000_setup_desc_rings
(
adapter
)))
goto
err_loopback
;
if
((
*
data
=
e1000_setup_loopback_test
(
adapter
)))
goto
err_loopback_setup
;
/* PHY loopback cannot be performed if SoL/IDER
* sessions are active */
if
(
e1000_check_phy_reset_block
(
&
adapter
->
hw
))
{
DPRINTK
(
DRV
,
ERR
,
"Cannot do PHY loopback test "
"when SoL/IDER is active.
\n
"
);
*
data
=
0
;
goto
out
;
}
if
((
*
data
=
e1000_setup_desc_rings
(
adapter
)))
goto
out
;
if
((
*
data
=
e1000_setup_loopback_test
(
adapter
)))
goto
err_loopback
;
*
data
=
e1000_run_loopback_test
(
adapter
);
e1000_loopback_cleanup
(
adapter
);
err_loopback_setup:
e1000_free_desc_rings
(
adapter
);
err_loopback:
e1000_free_desc_rings
(
adapter
);
out:
return
*
data
;
}
...
...
@@ -1617,6 +1647,7 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
case
E1000_DEV_ID_82546EB_FIBER
:
case
E1000_DEV_ID_82546GB_FIBER
:
case
E1000_DEV_ID_82571EB_FIBER
:
/* Wake events only supported on port A for dual fiber */
if
(
E1000_READ_REG
(
hw
,
STATUS
)
&
E1000_STATUS_FUNC_1
)
{
wol
->
supported
=
0
;
...
...
@@ -1660,6 +1691,7 @@ e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
case
E1000_DEV_ID_82546EB_FIBER
:
case
E1000_DEV_ID_82546GB_FIBER
:
case
E1000_DEV_ID_82571EB_FIBER
:
/* Wake events only supported on port A for dual fiber */
if
(
E1000_READ_REG
(
hw
,
STATUS
)
&
E1000_STATUS_FUNC_1
)
return
wol
->
wolopts
?
-
EOPNOTSUPP
:
0
;
...
...
@@ -1721,17 +1753,17 @@ e1000_phys_id(struct net_device *netdev, uint32_t data)
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
);
msleep_interruptible
(
data
*
1000
);
del_timer_sync
(
&
adapter
->
blink_timer
);
}
else
if
(
adapter
->
hw
.
mac_type
<
e1000_82573
)
{
E1000_WRITE_REG
(
&
adapter
->
hw
,
LEDCTL
,
(
E1000_LEDCTL_LED2_BLINK_RATE
|
}
else
if
(
adapter
->
hw
.
mac_type
<
e1000_82573
)
{
E1000_WRITE_REG
(
&
adapter
->
hw
,
LEDCTL
,
(
E1000_LEDCTL_LED2_BLINK_RATE
|
E1000_LEDCTL_LED0_BLINK
|
E1000_LEDCTL_LED2_BLINK
|
(
E1000_LEDCTL_MODE_LED_ON
<<
E1000_LEDCTL_LED2_MODE_SHIFT
)
|
(
E1000_LEDCTL_MODE_LINK_ACTIVITY
<<
E1000_LEDCTL_LED0_MODE_SHIFT
)
|
(
E1000_LEDCTL_MODE_LED_OFF
<<
E1000_LEDCTL_LED1_MODE_SHIFT
)));
msleep_interruptible
(
data
*
1000
);
}
else
{
E1000_WRITE_REG
(
&
adapter
->
hw
,
LEDCTL
,
(
E1000_LEDCTL_LED2_BLINK_RATE
|
}
else
{
E1000_WRITE_REG
(
&
adapter
->
hw
,
LEDCTL
,
(
E1000_LEDCTL_LED2_BLINK_RATE
|
E1000_LEDCTL_LED1_BLINK
|
E1000_LEDCTL_LED2_BLINK
|
(
E1000_LEDCTL_MODE_LED_ON
<<
E1000_LEDCTL_LED2_MODE_SHIFT
)
|
(
E1000_LEDCTL_MODE_LINK_ACTIVITY
<<
E1000_LEDCTL_LED1_MODE_SHIFT
)
|
...
...
@@ -1768,19 +1800,43 @@ e1000_get_ethtool_stats(struct net_device *netdev,
struct
ethtool_stats
*
stats
,
uint64_t
*
data
)
{
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
#ifdef CONFIG_E1000_MQ
uint64_t
*
queue_stat
;
int
stat_count
=
sizeof
(
struct
e1000_queue_stats
)
/
sizeof
(
uint64_t
);
int
j
,
k
;
#endif
int
i
;
e1000_update_stats
(
adapter
);
for
(
i
=
0
;
i
<
E1000
_STATS_LEN
;
i
++
)
{
for
(
i
=
0
;
i
<
E1000_GLOBAL
_STATS_LEN
;
i
++
)
{
char
*
p
=
(
char
*
)
adapter
+
e1000_gstrings_stats
[
i
].
stat_offset
;
data
[
i
]
=
(
e1000_gstrings_stats
[
i
].
sizeof_stat
==
sizeof
(
uint64_t
))
?
*
(
uint64_t
*
)
p
:
*
(
uint32_t
*
)
p
;
}
#ifdef CONFIG_E1000_MQ
for
(
j
=
0
;
j
<
adapter
->
num_tx_queues
;
j
++
)
{
queue_stat
=
(
uint64_t
*
)
&
adapter
->
tx_ring
[
j
].
tx_stats
;
for
(
k
=
0
;
k
<
stat_count
;
k
++
)
data
[
i
+
k
]
=
queue_stat
[
k
];
i
+=
k
;
}
for
(
j
=
0
;
j
<
adapter
->
num_rx_queues
;
j
++
)
{
queue_stat
=
(
uint64_t
*
)
&
adapter
->
rx_ring
[
j
].
rx_stats
;
for
(
k
=
0
;
k
<
stat_count
;
k
++
)
data
[
i
+
k
]
=
queue_stat
[
k
];
i
+=
k
;
}
#endif
/* BUG_ON(i != E1000_STATS_LEN); */
}
static
void
e1000_get_strings
(
struct
net_device
*
netdev
,
uint32_t
stringset
,
uint8_t
*
data
)
{
#ifdef CONFIG_E1000_MQ
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
#endif
uint8_t
*
p
=
data
;
int
i
;
switch
(
stringset
)
{
...
...
@@ -1789,11 +1845,26 @@ e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
E1000_TEST_LEN
*
ETH_GSTRING_LEN
);
break
;
case
ETH_SS_STATS
:
for
(
i
=
0
;
i
<
E1000_STATS_LEN
;
i
++
)
{
memcpy
(
data
+
i
*
ETH_GSTRING_LEN
,
e1000_gstrings_stats
[
i
].
stat_string
,
for
(
i
=
0
;
i
<
E1000_GLOBAL_STATS_LEN
;
i
++
)
{
memcpy
(
p
,
e1000_gstrings_stats
[
i
].
stat_string
,
ETH_GSTRING_LEN
);
p
+=
ETH_GSTRING_LEN
;
}
#ifdef CONFIG_E1000_MQ
for
(
i
=
0
;
i
<
adapter
->
num_tx_queues
;
i
++
)
{
sprintf
(
p
,
"tx_queue_%u_packets"
,
i
);
p
+=
ETH_GSTRING_LEN
;
sprintf
(
p
,
"tx_queue_%u_bytes"
,
i
);
p
+=
ETH_GSTRING_LEN
;
}
for
(
i
=
0
;
i
<
adapter
->
num_rx_queues
;
i
++
)
{
sprintf
(
p
,
"rx_queue_%u_packets"
,
i
);
p
+=
ETH_GSTRING_LEN
;
sprintf
(
p
,
"rx_queue_%u_bytes"
,
i
);
p
+=
ETH_GSTRING_LEN
;
}
#endif
/* BUG_ON(p - data != E1000_STATS_LEN * ETH_GSTRING_LEN); */
break
;
}
}
...
...
drivers/net/e1000/e1000_hw.c
浏览文件 @
d1138cf0
...
...
@@ -318,6 +318,8 @@ e1000_set_mac_type(struct e1000_hw *hw)
case
E1000_DEV_ID_82546GB_FIBER
:
case
E1000_DEV_ID_82546GB_SERDES
:
case
E1000_DEV_ID_82546GB_PCIE
:
case
E1000_DEV_ID_82546GB_QUAD_COPPER
:
case
E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3
:
hw
->
mac_type
=
e1000_82546_rev_3
;
break
;
case
E1000_DEV_ID_82541EI
:
...
...
@@ -639,6 +641,7 @@ e1000_init_hw(struct e1000_hw *hw)
uint16_t
cmd_mmrbc
;
uint16_t
stat_mmrbc
;
uint32_t
mta_size
;
uint32_t
ctrl_ext
;
DEBUGFUNC
(
"e1000_init_hw"
);
...
...
@@ -735,7 +738,6 @@ e1000_init_hw(struct e1000_hw *hw)
break
;
case
e1000_82571
:
case
e1000_82572
:
ctrl
|=
(
1
<<
22
);
case
e1000_82573
:
ctrl
|=
E1000_TXDCTL_COUNT_DESC
;
break
;
...
...
@@ -775,6 +777,15 @@ e1000_init_hw(struct e1000_hw *hw)
*/
e1000_clear_hw_cntrs
(
hw
);
if
(
hw
->
device_id
==
E1000_DEV_ID_82546GB_QUAD_COPPER
||
hw
->
device_id
==
E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3
)
{
ctrl_ext
=
E1000_READ_REG
(
hw
,
CTRL_EXT
);
/* Relaxed ordering must be disabled to avoid a parity
* error crash in a PCI slot. */
ctrl_ext
|=
E1000_CTRL_EXT_RO_DIS
;
E1000_WRITE_REG
(
hw
,
CTRL_EXT
,
ctrl_ext
);
}
return
ret_val
;
}
...
...
@@ -838,6 +849,11 @@ e1000_setup_link(struct e1000_hw *hw)
DEBUGFUNC
(
"e1000_setup_link"
);
/* In the case of the phy reset being blocked, we already have a link.
* We do not have to set it up again. */
if
(
e1000_check_phy_reset_block
(
hw
))
return
E1000_SUCCESS
;
/* Read and store word 0x0F of the EEPROM. This word contains bits
* that determine the hardware's default PAUSE (flow control) mode,
* a bit that determines whether the HW defaults to enabling or
...
...
@@ -1929,14 +1945,19 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
void
e1000_config_collision_dist
(
struct
e1000_hw
*
hw
)
{
uint32_t
tctl
;
uint32_t
tctl
,
coll_dist
;
DEBUGFUNC
(
"e1000_config_collision_dist"
);
if
(
hw
->
mac_type
<
e1000_82543
)
coll_dist
=
E1000_COLLISION_DISTANCE_82542
;
else
coll_dist
=
E1000_COLLISION_DISTANCE
;
tctl
=
E1000_READ_REG
(
hw
,
TCTL
);
tctl
&=
~
E1000_TCTL_COLD
;
tctl
|=
E1000_COLLISION_DISTANCE
<<
E1000_COLD_SHIFT
;
tctl
|=
coll_dist
<<
E1000_COLD_SHIFT
;
E1000_WRITE_REG
(
hw
,
TCTL
,
tctl
);
E1000_WRITE_FLUSH
(
hw
);
...
...
@@ -2982,6 +3003,8 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
if
(
hw
->
mac_type
<
e1000_82571
)
msec_delay
(
10
);
else
udelay
(
100
);
E1000_WRITE_REG
(
hw
,
CTRL
,
ctrl
);
E1000_WRITE_FLUSH
(
hw
);
...
...
@@ -3881,14 +3904,16 @@ e1000_read_eeprom(struct e1000_hw *hw,
return
-
E1000_ERR_EEPROM
;
}
/* FLASH reads without acquiring the semaphore are safe
in 82573-based
* controllers.
*/
if
((
e1000_is_onboard_nvm_eeprom
(
hw
)
==
TRUE
)
||
(
hw
->
mac_type
!=
e1000_82573
))
{
/* FLASH reads without acquiring the semaphore are safe
*/
if
(
e1000_is_onboard_nvm_eeprom
(
hw
)
==
TRUE
&&
hw
->
eeprom
.
use_eerd
==
FALSE
)
{
switch
(
hw
->
mac_type
)
{
default:
/* Prepare the EEPROM for reading */
if
(
e1000_acquire_eeprom
(
hw
)
!=
E1000_SUCCESS
)
if
(
e1000_acquire_eeprom
(
hw
)
!=
E1000_SUCCESS
)
return
-
E1000_ERR_EEPROM
;
break
;
}
}
if
(
eeprom
->
use_eerd
==
TRUE
)
{
...
...
@@ -6720,6 +6745,12 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw)
break
;
}
/* PHY configuration from NVM just starts after EECD_AUTO_RD sets to high.
* Need to wait for PHY configuration completion before accessing NVM
* and PHY. */
if
(
hw
->
mac_type
==
e1000_82573
)
msec_delay
(
25
);
return
E1000_SUCCESS
;
}
...
...
drivers/net/e1000/e1000_hw.h
浏览文件 @
d1138cf0
...
...
@@ -439,6 +439,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
#define E1000_DEV_ID_82546GB_FIBER 0x107A
#define E1000_DEV_ID_82546GB_SERDES 0x107B
#define E1000_DEV_ID_82546GB_PCIE 0x108A
#define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099
#define E1000_DEV_ID_82547EI 0x1019
#define E1000_DEV_ID_82571EB_COPPER 0x105E
#define E1000_DEV_ID_82571EB_FIBER 0x105F
...
...
@@ -449,6 +450,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
#define E1000_DEV_ID_82573E 0x108B
#define E1000_DEV_ID_82573E_IAMT 0x108C
#define E1000_DEV_ID_82573L 0x109A
#define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5
#define NODE_ADDRESS_SIZE 6
...
...
@@ -1497,6 +1499,7 @@ struct e1000_hw {
#define E1000_CTRL_EXT_EE_RST 0x00002000
/* Reinitialize from EEPROM */
#define E1000_CTRL_EXT_IPS 0x00004000
/* Invert Power State */
#define E1000_CTRL_EXT_SPD_BYPS 0x00008000
/* Speed Select Bypass */
#define E1000_CTRL_EXT_RO_DIS 0x00020000
/* Relaxed Ordering disable */
#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000
#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000
#define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000
...
...
@@ -1954,6 +1957,23 @@ struct e1000_host_command_info {
#define E1000_MDALIGN 4096
/* PCI-Ex registers */
/* PCI-Ex Control Register */
#define E1000_GCR_RXD_NO_SNOOP 0x00000001
#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002
#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004
#define E1000_GCR_TXD_NO_SNOOP 0x00000008
#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010
#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020
#define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \
E1000_GCR_RXDSCW_NO_SNOOP | \
E1000_GCR_RXDSCR_NO_SNOOP | \
E1000_GCR TXD_NO_SNOOP | \
E1000_GCR_TXDSCW_NO_SNOOP | \
E1000_GCR_TXDSCR_NO_SNOOP)
#define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000
/* Function Active and Power State to MNG */
#define E1000_FACTPS_FUNC0_POWER_STATE_MASK 0x00000003
...
...
@@ -2077,7 +2097,10 @@ struct e1000_host_command_info {
/* Collision related configuration parameters */
#define E1000_COLLISION_THRESHOLD 15
#define E1000_CT_SHIFT 4
#define E1000_COLLISION_DISTANCE 64
/* Collision distance is a 0-based value that applies to
* half-duplex-capable hardware only. */
#define E1000_COLLISION_DISTANCE 63
#define E1000_COLLISION_DISTANCE_82542 64
#define E1000_FDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE
#define E1000_HDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE
#define E1000_COLD_SHIFT 12
...
...
drivers/net/e1000/e1000_main.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/e1000/e1000_param.c
浏览文件 @
d1138cf0
...
...
@@ -177,7 +177,7 @@ E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
*
* Valid Range: 100-100000 (0=off, 1=dynamic)
*
* Default Value:
1
* Default Value:
8000
*/
E1000_PARAM
(
InterruptThrottleRate
,
"Interrupt Throttling Rate"
);
...
...
@@ -320,7 +320,7 @@ e1000_check_options(struct e1000_adapter *adapter)
}
else
{
tx_ring
->
count
=
opt
.
def
;
}
for
(
i
=
0
;
i
<
adapter
->
num_queues
;
i
++
)
for
(
i
=
0
;
i
<
adapter
->
num_
tx_
queues
;
i
++
)
tx_ring
[
i
].
count
=
tx_ring
->
count
;
}
{
/* Receive Descriptor Count */
...
...
@@ -346,7 +346,7 @@ e1000_check_options(struct e1000_adapter *adapter)
}
else
{
rx_ring
->
count
=
opt
.
def
;
}
for
(
i
=
0
;
i
<
adapter
->
num_queues
;
i
++
)
for
(
i
=
0
;
i
<
adapter
->
num_
rx_
queues
;
i
++
)
rx_ring
[
i
].
count
=
rx_ring
->
count
;
}
{
/* Checksum Offload Enable/Disable */
...
...
@@ -388,7 +388,7 @@ e1000_check_options(struct e1000_adapter *adapter)
e1000_validate_option
(
&
fc
,
&
opt
,
adapter
);
adapter
->
hw
.
fc
=
adapter
->
hw
.
original_fc
=
fc
;
}
else
{
adapter
->
hw
.
fc
=
opt
.
def
;
adapter
->
hw
.
fc
=
adapter
->
hw
.
original_fc
=
opt
.
def
;
}
}
{
/* Transmit Interrupt Delay */
...
...
@@ -584,6 +584,12 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
.
p
=
dplx_list
}}
};
if
(
e1000_check_phy_reset_block
(
&
adapter
->
hw
))
{
DPRINTK
(
PROBE
,
INFO
,
"Link active due to SoL/IDER Session. "
"Speed/Duplex/AutoNeg parameter ignored.
\n
"
);
return
;
}
if
(
num_Duplex
>
bd
)
{
dplx
=
Duplex
[
bd
];
e1000_validate_option
(
&
dplx
,
&
opt
,
adapter
);
...
...
drivers/net/mv643xx_eth.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/skge.c
浏览文件 @
d1138cf0
...
...
@@ -3243,13 +3243,23 @@ static int __devinit skge_probe(struct pci_dev *pdev,
pci_set_master
(
pdev
);
if
(
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
)))
if
(
sizeof
(
dma_addr_t
)
>
sizeof
(
u32
)
&&
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
)))
{
using_dac
=
1
;
else
if
(
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
)))
{
err
=
pci_set_consistent_dma_mask
(
pdev
,
DMA_64BIT_MASK
);
if
(
err
<
0
)
{
printk
(
KERN_ERR
PFX
"%s unable to obtain 64 bit DMA "
"for consistent allocations
\n
"
,
pci_name
(
pdev
));
goto
err_out_free_regions
;
}
}
else
{
err
=
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
);
if
(
err
)
{
printk
(
KERN_ERR
PFX
"%s no usable DMA configuration
\n
"
,
pci_name
(
pdev
));
goto
err_out_free_regions
;
}
}
#ifdef __BIG_ENDIAN
/* byte swap descriptors in hardware */
...
...
drivers/net/sky2.c
浏览文件 @
d1138cf0
...
...
@@ -57,7 +57,7 @@
#include "sky2.h"
#define DRV_NAME "sky2"
#define DRV_VERSION "0.1
1
"
#define DRV_VERSION "0.1
3
"
#define PFX DRV_NAME " "
/*
...
...
@@ -75,6 +75,7 @@
#define RX_LE_BYTES (RX_LE_SIZE*sizeof(struct sky2_rx_le))
#define RX_MAX_PENDING (RX_LE_SIZE/2 - 2)
#define RX_DEF_PENDING RX_MAX_PENDING
#define RX_SKB_ALIGN 8
#define TX_RING_SIZE 512
#define TX_DEF_PENDING (TX_RING_SIZE - 1)
...
...
@@ -91,7 +92,7 @@
static
const
u32
default_msg
=
NETIF_MSG_DRV
|
NETIF_MSG_PROBE
|
NETIF_MSG_LINK
|
NETIF_MSG_TIMER
|
NETIF_MSG_TX_ERR
|
NETIF_MSG_RX_ERR
|
NETIF_MSG_IFUP
|
NETIF_MSG_IFDOWN
|
NETIF_MSG_INTR
;
|
NETIF_MSG_IFUP
|
NETIF_MSG_IFDOWN
;
static
int
debug
=
-
1
;
/* defaults above */
module_param
(
debug
,
int
,
0
);
...
...
@@ -624,13 +625,16 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
}
static
void
sky2_ramset
(
struct
sky2_hw
*
hw
,
u16
q
,
u32
start
,
size_t
len
)
/* Assign Ram Buffer allocation.
* start and end are in units of 4k bytes
* ram registers are in units of 64bit words
*/
static
void
sky2_ramset
(
struct
sky2_hw
*
hw
,
u16
q
,
u8
startk
,
u8
endk
)
{
u32
end
;
u32
start
,
end
;
start
/=
8
;
len
/=
8
;
end
=
start
+
len
-
1
;
start
=
startk
*
4096
/
8
;
end
=
(
endk
*
4096
/
8
)
-
1
;
sky2_write8
(
hw
,
RB_ADDR
(
q
,
RB_CTRL
),
RB_RST_CLR
);
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_START
),
start
);
...
...
@@ -639,14 +643,19 @@ static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, size_t len)
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_RP
),
start
);
if
(
q
==
Q_R1
||
q
==
Q_R2
)
{
u32
rxup
,
rxlo
;
u32
space
=
(
endk
-
startk
)
*
4096
/
8
;
u32
tp
=
space
-
space
/
4
;
rxlo
=
len
/
2
;
rxup
=
rxlo
+
len
/
4
;
/* On receive queue's set the thresholds
* give receiver priority when > 3/4 full
* send pause when down to 2K
*/
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_RX_UTHP
),
tp
);
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_RX_LTHP
),
space
/
2
);
/* Set thresholds on receive queue's */
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_RX_UTPP
),
rxu
p
);
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_RX_LTPP
),
rxlo
);
tp
=
space
-
2048
/
8
;
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_RX_UTPP
),
t
p
);
sky2_write32
(
hw
,
RB_ADDR
(
q
,
RB_RX_LTPP
),
space
/
4
);
}
else
{
/* Enable store & forward on Tx queue's because
* Tx FIFO is only 1K on Yukon
...
...
@@ -695,9 +704,10 @@ static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2)
* This is a workaround code taken from SysKonnect sk98lin driver
* to deal with chip bug on Yukon EC rev 0 in the wraparound case.
*/
static
inline
void
sky2_put_idx
(
struct
sky2_hw
*
hw
,
unsigned
q
,
static
void
sky2_put_idx
(
struct
sky2_hw
*
hw
,
unsigned
q
,
u16
idx
,
u16
*
last
,
u16
size
)
{
wmb
();
if
(
is_ec_a1
(
hw
)
&&
idx
<
*
last
)
{
u16
hwget
=
sky2_read16
(
hw
,
Y2_QADDR
(
q
,
PREF_UNIT_GET_IDX
));
...
...
@@ -721,6 +731,7 @@ static inline void sky2_put_idx(struct sky2_hw *hw, unsigned q,
sky2_write16
(
hw
,
Y2_QADDR
(
q
,
PREF_UNIT_PUT_IDX
),
idx
);
}
*
last
=
idx
;
mmiowb
();
}
...
...
@@ -734,11 +745,11 @@ static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2)
/* Return high part of DMA address (could be 32 or 64 bit) */
static
inline
u32
high32
(
dma_addr_t
a
)
{
return
(
a
>>
16
)
>>
16
;
return
sizeof
(
a
)
>
sizeof
(
u32
)
?
(
a
>>
16
)
>>
16
:
0
;
}
/* Build description to hardware about buffer */
static
inline
void
sky2_rx_add
(
struct
sky2_port
*
sky2
,
dma_addr_t
map
)
static
void
sky2_rx_add
(
struct
sky2_port
*
sky2
,
dma_addr_t
map
)
{
struct
sky2_rx_le
*
le
;
u32
hi
=
high32
(
map
);
...
...
@@ -878,13 +889,13 @@ static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp
struct
sky2_hw
*
hw
=
sky2
->
hw
;
u16
port
=
sky2
->
port
;
spin_lock
(
&
sky2
->
tx_lock
);
spin_lock
_bh
(
&
sky2
->
tx_lock
);
sky2_write32
(
hw
,
SK_REG
(
port
,
RX_GMF_CTRL_T
),
RX_VLAN_STRIP_ON
);
sky2_write32
(
hw
,
SK_REG
(
port
,
TX_GMF_CTRL_T
),
TX_VLAN_TAG_ON
);
sky2
->
vlgrp
=
grp
;
spin_unlock
(
&
sky2
->
tx_lock
);
spin_unlock
_bh
(
&
sky2
->
tx_lock
);
}
static
void
sky2_vlan_rx_kill_vid
(
struct
net_device
*
dev
,
unsigned
short
vid
)
...
...
@@ -893,27 +904,42 @@ static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
struct
sky2_hw
*
hw
=
sky2
->
hw
;
u16
port
=
sky2
->
port
;
spin_lock
(
&
sky2
->
tx_lock
);
spin_lock
_bh
(
&
sky2
->
tx_lock
);
sky2_write32
(
hw
,
SK_REG
(
port
,
RX_GMF_CTRL_T
),
RX_VLAN_STRIP_OFF
);
sky2_write32
(
hw
,
SK_REG
(
port
,
TX_GMF_CTRL_T
),
TX_VLAN_TAG_OFF
);
if
(
sky2
->
vlgrp
)
sky2
->
vlgrp
->
vlan_devices
[
vid
]
=
NULL
;
spin_unlock
(
&
sky2
->
tx_lock
);
spin_unlock
_bh
(
&
sky2
->
tx_lock
);
}
#endif
/*
* It appears the hardware has a bug in the FIFO logic that
* cause it to hang if the FIFO gets overrun and the receive buffer
* is not aligned. ALso alloc_skb() won't align properly if slab
* debugging is enabled.
*/
static
inline
struct
sk_buff
*
sky2_alloc_skb
(
unsigned
int
size
,
gfp_t
gfp_mask
)
{
struct
sk_buff
*
skb
;
skb
=
alloc_skb
(
size
+
RX_SKB_ALIGN
,
gfp_mask
);
if
(
likely
(
skb
))
{
unsigned
long
p
=
(
unsigned
long
)
skb
->
data
;
skb_reserve
(
skb
,
((
p
+
RX_SKB_ALIGN
-
1
)
&
~
(
RX_SKB_ALIGN
-
1
))
-
p
);
}
return
skb
;
}
/*
* Allocate and setup receiver buffer pool.
* In case of 64 bit dma, there are 2X as many list elements
* available as ring entries
* and need to reserve one list element so we don't wrap around.
*
* It appears the hardware has a bug in the FIFO logic that
* cause it to hang if the FIFO gets overrun and the receive buffer
* is not aligned. This means we can't use skb_reserve to align
* the IP header.
*/
static
int
sky2_rx_start
(
struct
sky2_port
*
sky2
)
{
...
...
@@ -929,7 +955,7 @@ static int sky2_rx_start(struct sky2_port *sky2)
for
(
i
=
0
;
i
<
sky2
->
rx_pending
;
i
++
)
{
struct
ring_info
*
re
=
sky2
->
rx_ring
+
i
;
re
->
skb
=
dev_alloc_skb
(
sky2
->
rx_bufsize
);
re
->
skb
=
sky2_alloc_skb
(
sky2
->
rx_bufsize
,
GFP_KERNEL
);
if
(
!
re
->
skb
)
goto
nomem
;
...
...
@@ -986,19 +1012,19 @@ static int sky2_up(struct net_device *dev)
sky2_mac_init
(
hw
,
port
);
/* Configure RAM buffers */
if
(
hw
->
chip_id
==
CHIP_ID_YUKON_FE
||
(
hw
->
chip_id
==
CHIP_ID_YUKON_EC
&&
hw
->
chip_rev
==
2
))
ramsize
=
4096
;
else
{
u8
e0
=
sky2_read8
(
hw
,
B2_E_0
);
ramsize
=
(
e0
==
0
)
?
(
128
*
1024
)
:
(
e0
*
4096
);
}
/* Determine available ram buffer space (in 4K blocks).
* Note: not sure about the FE setting below yet
*/
if
(
hw
->
chip_id
==
CHIP_ID_YUKON_FE
)
ramsize
=
4
;
else
ramsize
=
sky2_read8
(
hw
,
B2_E_0
);
/* Give transmitter one third (rounded up) */
rxspace
=
ramsize
-
(
ramsize
+
2
)
/
3
;
/* 2/3 for Rx */
rxspace
=
(
2
*
ramsize
)
/
3
;
sky2_ramset
(
hw
,
rxqaddr
[
port
],
0
,
rxspace
);
sky2_ramset
(
hw
,
txqaddr
[
port
],
rxspace
,
ramsize
-
rxspace
);
sky2_ramset
(
hw
,
txqaddr
[
port
],
rxspace
,
ramsize
);
/* Make sure SyncQ is disabled */
sky2_write8
(
hw
,
RB_ADDR
(
port
==
0
?
Q_XS1
:
Q_XS2
,
RB_CTRL
),
...
...
@@ -1054,7 +1080,7 @@ static inline int tx_avail(const struct sky2_port *sky2)
}
/* Estimate of number of transmit list elements required */
static
inline
unsigned
tx_le_req
(
const
struct
sk_buff
*
skb
)
static
unsigned
tx_le_req
(
const
struct
sk_buff
*
skb
)
{
unsigned
count
;
...
...
@@ -1090,6 +1116,10 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
u16
mss
;
u8
ctrl
;
/* No BH disabling for tx_lock here. We are running in BH disabled
* context and TX reclaim runs via poll inside of a software
* interrupt, and no related locks in IRQ processing.
*/
if
(
!
spin_trylock
(
&
sky2
->
tx_lock
))
return
NETDEV_TX_LOCKED
;
...
...
@@ -1099,6 +1129,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
*/
if
(
!
netif_queue_stopped
(
dev
))
{
netif_stop_queue
(
dev
);
if
(
net_ratelimit
())
printk
(
KERN_WARNING
PFX
"%s: ring full when queue awake!
\n
"
,
dev
->
name
);
}
...
...
@@ -1199,7 +1230,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
mapping
=
pci_map_page
(
hw
->
pdev
,
frag
->
page
,
frag
->
page_offset
,
frag
->
size
,
PCI_DMA_TODEVICE
);
addr64
=
(
mapping
>>
16
)
>>
16
;
addr64
=
high32
(
mapping
)
;
if
(
addr64
!=
sky2
->
tx_addr64
)
{
le
=
get_tx_le
(
sky2
);
le
->
tx
.
addr
=
cpu_to_le32
(
addr64
);
...
...
@@ -1229,7 +1260,6 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
netif_stop_queue
(
dev
);
out_unlock:
mmiowb
();
spin_unlock
(
&
sky2
->
tx_lock
);
dev
->
trans_start
=
jiffies
;
...
...
@@ -1282,17 +1312,17 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done)
dev_kfree_skb_any
(
skb
);
}
spin_lock
(
&
sky2
->
tx_lock
);
sky2
->
tx_cons
=
put
;
if
(
netif_queue_stopped
(
dev
)
&&
tx_avail
(
sky2
)
>
MAX_SKB_TX_LE
)
netif_wake_queue
(
dev
);
spin_unlock
(
&
sky2
->
tx_lock
);
}
/* Cleanup all untransmitted buffers, assume transmitter not running */
static
void
sky2_tx_clean
(
struct
sky2_port
*
sky2
)
{
spin_lock_bh
(
&
sky2
->
tx_lock
);
sky2_tx_complete
(
sky2
,
sky2
->
tx_prod
);
spin_unlock_bh
(
&
sky2
->
tx_lock
);
}
/* Network shutdown */
...
...
@@ -1582,28 +1612,40 @@ static void sky2_phy_task(void *arg)
local_irq_enable
();
}
/* Transmit timeout is only called if we are running, carries is up
* and tx queue is full (stopped).
*/
static
void
sky2_tx_timeout
(
struct
net_device
*
dev
)
{
struct
sky2_port
*
sky2
=
netdev_priv
(
dev
);
struct
sky2_hw
*
hw
=
sky2
->
hw
;
unsigned
txq
=
txqaddr
[
sky2
->
port
];
u16
ridx
;
/* Maybe we just missed an status interrupt */
spin_lock
(
&
sky2
->
tx_lock
);
ridx
=
sky2_read16
(
hw
,
sky2
->
port
==
0
?
STAT_TXA1_RIDX
:
STAT_TXA2_RIDX
);
sky2_tx_complete
(
sky2
,
ridx
);
spin_unlock
(
&
sky2
->
tx_lock
);
if
(
!
netif_queue_stopped
(
dev
))
{
if
(
net_ratelimit
())
pr_info
(
PFX
"transmit interrupt missed? recovered
\n
"
);
return
;
}
if
(
netif_msg_timer
(
sky2
))
printk
(
KERN_ERR
PFX
"%s: tx timeout
\n
"
,
dev
->
name
);
netif_stop_queue
(
dev
);
sky2_write32
(
hw
,
Q_ADDR
(
txq
,
Q_CSR
),
BMU_STOP
);
sky2_read32
(
hw
,
Q_ADDR
(
txq
,
Q_CSR
));
sky2_write32
(
hw
,
Y2_QADDR
(
txq
,
PREF_UNIT_CTRL
),
PREF_UNIT_RST_SET
);
sky2_tx_clean
(
sky2
);
sky2_qset
(
hw
,
txq
);
sky2_prefetch_init
(
hw
,
txq
,
sky2
->
tx_le_map
,
TX_RING_SIZE
-
1
);
netif_wake_queue
(
dev
);
}
...
...
@@ -1713,7 +1755,7 @@ static struct sk_buff *sky2_receive(struct sky2_port *sky2,
}
else
{
struct
sk_buff
*
nskb
;
nskb
=
dev_alloc_skb
(
sky2
->
rx_bufsize
);
nskb
=
sky2_alloc_skb
(
sky2
->
rx_bufsize
,
GFP_ATOMIC
);
if
(
!
nskb
)
goto
resubmit
;
...
...
@@ -1745,7 +1787,7 @@ static struct sk_buff *sky2_receive(struct sky2_port *sky2,
error:
++
sky2
->
net_stats
.
rx_errors
;
if
(
netif_msg_rx_err
(
sky2
))
if
(
netif_msg_rx_err
(
sky2
)
&&
net_ratelimit
()
)
printk
(
KERN_INFO
PFX
"%s: rx error, status 0x%x length %d
\n
"
,
sky2
->
netdev
->
name
,
status
,
length
);
...
...
@@ -1766,13 +1808,16 @@ static struct sk_buff *sky2_receive(struct sky2_port *sky2,
*/
#define TX_NO_STATUS 0xffff
static
inline
void
sky2_tx_check
(
struct
sky2_hw
*
hw
,
int
port
,
u16
last
)
static
void
sky2_tx_check
(
struct
sky2_hw
*
hw
,
int
port
,
u16
last
)
{
if
(
last
!=
TX_NO_STATUS
)
{
struct
net_device
*
dev
=
hw
->
dev
[
port
];
if
(
dev
&&
netif_running
(
dev
))
{
struct
sky2_port
*
sky2
=
netdev_priv
(
dev
);
spin_lock
(
&
sky2
->
tx_lock
);
sky2_tx_complete
(
sky2
,
last
);
spin_unlock
(
&
sky2
->
tx_lock
);
}
}
}
...
...
@@ -1800,7 +1845,6 @@ static int sky2_poll(struct net_device *dev0, int *budget)
struct
sk_buff
*
skb
;
u32
status
;
u16
length
;
u8
op
;
le
=
hw
->
st_le
+
hw
->
st_idx
;
hw
->
st_idx
=
(
hw
->
st_idx
+
1
)
%
STATUS_RING_SIZE
;
...
...
@@ -1814,10 +1858,8 @@ static int sky2_poll(struct net_device *dev0, int *budget)
sky2
=
netdev_priv
(
dev
);
status
=
le32_to_cpu
(
le
->
status
);
length
=
le16_to_cpu
(
le
->
length
);
op
=
le
->
opcode
&
~
HW_OWNER
;
le
->
opcode
=
0
;
switch
(
op
)
{
switch
(
le
->
opcode
&
~
HW_OWNER
)
{
case
OP_RXSTAT
:
skb
=
sky2_receive
(
sky2
,
length
,
status
);
if
(
!
skb
)
...
...
@@ -1865,14 +1907,13 @@ static int sky2_poll(struct net_device *dev0, int *budget)
default:
if
(
net_ratelimit
())
printk
(
KERN_WARNING
PFX
"unknown status opcode 0x%x
\n
"
,
op
);
"unknown status opcode 0x%x
\n
"
,
le
->
opcode
);
break
;
}
}
exit_loop:
sky2_write32
(
hw
,
STAT_CTRL
,
SC_STAT_CLR_IRQ
);
mmiowb
();
sky2_tx_check
(
hw
,
0
,
tx_done
[
0
]);
sky2_tx_check
(
hw
,
1
,
tx_done
[
1
]);
...
...
@@ -1887,7 +1928,6 @@ static int sky2_poll(struct net_device *dev0, int *budget)
netif_rx_complete
(
dev0
);
hw
->
intr_mask
|=
Y2_IS_STAT_BMU
;
sky2_write32
(
hw
,
B0_IMSK
,
hw
->
intr_mask
);
mmiowb
();
return
0
;
}
else
{
*
budget
-=
work_done
;
...
...
@@ -1900,10 +1940,12 @@ static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status)
{
struct
net_device
*
dev
=
hw
->
dev
[
port
];
if
(
net_ratelimit
())
printk
(
KERN_INFO
PFX
"%s: hw error interrupt status 0x%x
\n
"
,
dev
->
name
,
status
);
if
(
status
&
Y2_IS_PAR_RD1
)
{
if
(
net_ratelimit
())
printk
(
KERN_ERR
PFX
"%s: ram data read parity error
\n
"
,
dev
->
name
);
/* Clear IRQ */
...
...
@@ -1911,6 +1953,7 @@ static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status)
}
if
(
status
&
Y2_IS_PAR_WR1
)
{
if
(
net_ratelimit
())
printk
(
KERN_ERR
PFX
"%s: ram data write parity error
\n
"
,
dev
->
name
);
...
...
@@ -1918,17 +1961,21 @@ static void sky2_hw_error(struct sky2_hw *hw, unsigned port, u32 status)
}
if
(
status
&
Y2_IS_PAR_MAC1
)
{
if
(
net_ratelimit
())
printk
(
KERN_ERR
PFX
"%s: MAC parity error
\n
"
,
dev
->
name
);
sky2_write8
(
hw
,
SK_REG
(
port
,
TX_GMF_CTRL_T
),
GMF_CLI_TX_PE
);
}
if
(
status
&
Y2_IS_PAR_RX1
)
{
if
(
net_ratelimit
())
printk
(
KERN_ERR
PFX
"%s: RX parity error
\n
"
,
dev
->
name
);
sky2_write32
(
hw
,
Q_ADDR
(
rxqaddr
[
port
],
Q_CSR
),
BMU_CLR_IRQ_PAR
);
}
if
(
status
&
Y2_IS_TCP_TXA1
)
{
printk
(
KERN_ERR
PFX
"%s: TCP segmentation error
\n
"
,
dev
->
name
);
if
(
net_ratelimit
())
printk
(
KERN_ERR
PFX
"%s: TCP segmentation error
\n
"
,
dev
->
name
);
sky2_write32
(
hw
,
Q_ADDR
(
txqaddr
[
port
],
Q_CSR
),
BMU_CLR_IRQ_TCP
);
}
}
...
...
@@ -1944,6 +1991,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
u16
pci_err
;
pci_read_config_word
(
hw
->
pdev
,
PCI_STATUS
,
&
pci_err
);
if
(
net_ratelimit
())
printk
(
KERN_ERR
PFX
"%s: pci hw error (0x%x)
\n
"
,
pci_name
(
hw
->
pdev
),
pci_err
);
...
...
@@ -1959,6 +2007,7 @@ static void sky2_hw_intr(struct sky2_hw *hw)
pci_read_config_dword
(
hw
->
pdev
,
PEX_UNC_ERR_STAT
,
&
pex_err
);
if
(
net_ratelimit
())
printk
(
KERN_ERR
PFX
"%s: pci express error (0x%x)
\n
"
,
pci_name
(
hw
->
pdev
),
pex_err
);
...
...
@@ -2250,7 +2299,7 @@ static int sky2_reset(struct sky2_hw *hw)
return
0
;
}
static
inline
u32
sky2_supported_modes
(
const
struct
sky2_hw
*
hw
)
static
u32
sky2_supported_modes
(
const
struct
sky2_hw
*
hw
)
{
u32
modes
;
if
(
hw
->
copper
)
{
...
...
@@ -2995,7 +3044,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
return
dev
;
}
static
inline
void
sky2_show_addr
(
struct
net_device
*
dev
)
static
void
__devinit
sky2_show_addr
(
struct
net_device
*
dev
)
{
const
struct
sky2_port
*
sky2
=
netdev_priv
(
dev
);
...
...
@@ -3038,13 +3087,17 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
goto
err_out_free_regions
;
}
if
(
sizeof
(
dma_addr_t
)
>
sizeof
(
u32
))
{
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
);
if
(
!
err
)
if
(
sizeof
(
dma_addr_t
)
>
sizeof
(
u32
)
&&
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
)))
{
using_dac
=
1
;
err
=
pci_set_consistent_dma_mask
(
pdev
,
DMA_64BIT_MASK
);
if
(
err
<
0
)
{
printk
(
KERN_ERR
PFX
"%s unable to obtain 64 bit DMA "
"for consistent allocations
\n
"
,
pci_name
(
pdev
));
goto
err_out_free_regions
;
}
if
(
!
using_dac
)
{
}
else
{
err
=
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
);
if
(
err
)
{
printk
(
KERN_ERR
PFX
"%s no usable DMA configuration
\n
"
,
...
...
@@ -3052,6 +3105,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
goto
err_out_free_regions
;
}
}
#ifdef __BIG_ENDIAN
/* byte swap descriptors in hardware */
{
...
...
@@ -3064,14 +3118,13 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
#endif
err
=
-
ENOMEM
;
hw
=
k
m
alloc
(
sizeof
(
*
hw
),
GFP_KERNEL
);
hw
=
k
z
alloc
(
sizeof
(
*
hw
),
GFP_KERNEL
);
if
(
!
hw
)
{
printk
(
KERN_ERR
PFX
"%s: cannot allocate hardware struct
\n
"
,
pci_name
(
pdev
));
goto
err_out_free_regions
;
}
memset
(
hw
,
0
,
sizeof
(
*
hw
));
hw
->
pdev
=
pdev
;
hw
->
regs
=
ioremap_nocache
(
pci_resource_start
(
pdev
,
0
),
0x4000
);
...
...
drivers/net/spider_net.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/spider_net.h
浏览文件 @
d1138cf0
...
...
@@ -33,25 +33,32 @@ extern struct ethtool_ops spider_net_ethtool_ops;
extern
char
spider_net_driver_name
[];
#define SPIDER_NET_MAX_MTU 2308
#define SPIDER_NET_MAX_FRAME 2312
#define SPIDER_NET_MAX_MTU 2294
#define SPIDER_NET_MIN_MTU 64
#define SPIDER_NET_RXBUF_ALIGN 128
#define SPIDER_NET_RX_DESCRIPTORS_DEFAULT
64
#define SPIDER_NET_RX_DESCRIPTORS_DEFAULT
256
#define SPIDER_NET_RX_DESCRIPTORS_MIN 16
#define SPIDER_NET_RX_DESCRIPTORS_MAX
256
#define SPIDER_NET_RX_DESCRIPTORS_MAX
512
#define SPIDER_NET_TX_DESCRIPTORS_DEFAULT
64
#define SPIDER_NET_TX_DESCRIPTORS_DEFAULT
256
#define SPIDER_NET_TX_DESCRIPTORS_MIN 16
#define SPIDER_NET_TX_DESCRIPTORS_MAX 256
#define SPIDER_NET_TX_DESCRIPTORS_MAX 512
#define SPIDER_NET_TX_TIMER 20
#define SPIDER_NET_RX_CSUM_DEFAULT 1
#define SPIDER_NET_WATCHDOG_TIMEOUT
5
*HZ
#define SPIDER_NET_WATCHDOG_TIMEOUT
50
*HZ
#define SPIDER_NET_NAPI_WEIGHT 64
#define SPIDER_NET_FIRMWARE_LEN 1024
#define SPIDER_NET_FIRMWARE_SEQS 6
#define SPIDER_NET_FIRMWARE_SEQWORDS 1024
#define SPIDER_NET_FIRMWARE_LEN (SPIDER_NET_FIRMWARE_SEQS * \
SPIDER_NET_FIRMWARE_SEQWORDS * \
sizeof(u32))
#define SPIDER_NET_FIRMWARE_NAME "spider_fw.bin"
/** spider_net SMMIO registers */
...
...
@@ -142,14 +149,12 @@ extern char spider_net_driver_name[];
/** SCONFIG registers */
#define SPIDER_NET_SCONFIG_IOACTE 0x00002810
/**
hardcoded register value
s */
#define SPIDER_NET_INT0_MASK_VALUE 0x3f7fe
3ff
#define SPIDER_NET_INT1_MASK_VALUE 0xffff
ffff
/**
interrupt mask register
s */
#define SPIDER_NET_INT0_MASK_VALUE 0x3f7fe
2c7
#define SPIDER_NET_INT1_MASK_VALUE 0xffff
7ff7
/* no MAC aborts -> auto retransmission */
#define SPIDER_NET_INT2_MASK_VALUE 0xff
fff
ff1
#define SPIDER_NET_INT2_MASK_VALUE 0xff
ef7
ff1
/* clear counter when interrupt sources are cleared
#define SPIDER_NET_FRAMENUM_VALUE 0x0001f001 */
/* we rely on flagged descriptor interrupts */
#define SPIDER_NET_FRAMENUM_VALUE 0x00000000
/* set this first, then the FRAMENUM_VALUE */
...
...
@@ -168,7 +173,7 @@ extern char spider_net_driver_name[];
#if 0
#define SPIDER_NET_WOL_VALUE 0x00000000
#endif
#define SPIDER_NET_IPSECINIT_VALUE 0x
00f000f8
#define SPIDER_NET_IPSECINIT_VALUE 0x
6f716f71
/* pause frames: automatic, no upper retransmission count */
/* outside loopback mode: ETOMOD signal dont matter, not connected */
...
...
@@ -318,6 +323,10 @@ enum spider_net_int2_status {
#define SPIDER_NET_RXINT ( (1 << SPIDER_NET_GDAFDCINT) | \
(1 << SPIDER_NET_GRMFLLINT) )
#define SPIDER_NET_ERRINT ( 0xffffffff & \
(~SPIDER_NET_TXINT) & \
(~SPIDER_NET_RXINT) )
#define SPIDER_NET_GPREXEC 0x80000000
#define SPIDER_NET_GPRDAT_MASK 0x0000ffff
...
...
@@ -358,9 +367,6 @@ enum spider_net_int2_status {
/* descr ready, descr is in middle of chain, get interrupt on completion */
#define SPIDER_NET_DMAC_RX_CARDOWNED 0xa0800000
/* multicast is no problem */
#define SPIDER_NET_DATA_ERROR_MASK 0xffffbfff
enum
spider_net_descr_status
{
SPIDER_NET_DESCR_COMPLETE
=
0x00
,
/* used in rx and tx */
SPIDER_NET_DESCR_RESPONSE_ERROR
=
0x01
,
/* used in rx and tx */
...
...
@@ -373,9 +379,9 @@ enum spider_net_descr_status {
struct
spider_net_descr
{
/* as defined by the hardware */
dma_addr_t
buf_addr
;
u32
buf_addr
;
u32
buf_size
;
dma_addr_t
next_descr_addr
;
u32
next_descr_addr
;
u32
dmac_cmd_status
;
u32
result_size
;
u32
valid_size
;
/* all zeroes for tx */
...
...
@@ -384,7 +390,7 @@ struct spider_net_descr {
/* used in the driver */
struct
sk_buff
*
skb
;
dma_addr_t
bus_addr
;
u32
bus_addr
;
struct
spider_net_descr
*
next
;
struct
spider_net_descr
*
prev
;
}
__attribute__
((
aligned
(
32
)));
...
...
@@ -396,21 +402,21 @@ struct spider_net_descr_chain {
};
/* descriptor data_status bits */
#define SPIDER_NET_RXIPCHK 29
#define SPIDER_NET_TCPUDPIPCHK 28
#define SPIDER_NET_DATA_STATUS_CHK_MASK (1 << SPIDER_NET_RXIPCHK | \
1 << SPIDER_NET_TCPUDPIPCHK)
#define SPIDER_NET_RX_IPCHK 29
#define SPIDER_NET_RX_TCPCHK 28
#define SPIDER_NET_VLAN_PACKET 21
#define SPIDER_NET_DATA_STATUS_CKSUM_MASK ( (1 << SPIDER_NET_RX_IPCHK) | \
(1 << SPIDER_NET_RX_TCPCHK) )
/* descriptor data_error bits */
#define SPIDER_NET_RXIPCHKERR 27
#define SPIDER_NET_RX
TCPCHKERR 26
#define SPIDER_NET_DATA_ERROR_CHK_MASK (1 << SPIDER_NET_RXIPCHKERR | \
1 << SPIDER_NET_RXTC
PCHKERR)
#define SPIDER_NET_RX
_
IPCHKERR 27
#define SPIDER_NET_RX
_RXTCPCHKERR 28
#define SPIDER_NET_DATA_ERR_CKSUM_MASK (1 << SPIDER_NET_RX_I
PCHKERR)
/* the cases we don't pass the packet to the stack */
#define SPIDER_NET_DESTROY_RX_FLAGS 0x70138000
/* the cases we don't pass the packet to the stack.
* 701b8000 would be correct, but every packets gets that flag */
#define SPIDER_NET_DESTROY_RX_FLAGS 0x700b8000
#define SPIDER_NET_DESCR_SIZE 32
...
...
@@ -445,13 +451,16 @@ struct spider_net_card {
struct
spider_net_descr_chain
tx_chain
;
struct
spider_net_descr_chain
rx_chain
;
spinlock_t
chain_lock
;
atomic_t
rx_chain_refill
;
atomic_t
tx_chain_release
;
struct
net_device_stats
netdev_stats
;
struct
spider_net_options
options
;
spinlock_t
intmask_lock
;
struct
tasklet_struct
rxram_full_tl
;
struct
timer_list
tx_timer
;
struct
work_struct
tx_timeout_task
;
atomic_t
tx_timeout_task_counter
;
...
...
drivers/net/spider_net_ethtool.c
浏览文件 @
d1138cf0
...
...
@@ -113,6 +113,23 @@ spider_net_ethtool_set_rx_csum(struct net_device *netdev, u32 n)
return
0
;
}
static
uint32_t
spider_net_ethtool_get_tx_csum
(
struct
net_device
*
netdev
)
{
return
(
netdev
->
features
&
NETIF_F_HW_CSUM
)
!=
0
;
}
static
int
spider_net_ethtool_set_tx_csum
(
struct
net_device
*
netdev
,
uint32_t
data
)
{
if
(
data
)
netdev
->
features
|=
NETIF_F_HW_CSUM
;
else
netdev
->
features
&=
~
NETIF_F_HW_CSUM
;
return
0
;
}
struct
ethtool_ops
spider_net_ethtool_ops
=
{
.
get_settings
=
spider_net_ethtool_get_settings
,
.
get_drvinfo
=
spider_net_ethtool_get_drvinfo
,
...
...
@@ -122,5 +139,7 @@ struct ethtool_ops spider_net_ethtool_ops = {
.
nway_reset
=
spider_net_ethtool_nway_reset
,
.
get_rx_csum
=
spider_net_ethtool_get_rx_csum
,
.
set_rx_csum
=
spider_net_ethtool_set_rx_csum
,
.
get_tx_csum
=
spider_net_ethtool_get_tx_csum
,
.
set_tx_csum
=
spider_net_ethtool_set_tx_csum
,
};
drivers/net/wireless/airo.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/atmel.c
浏览文件 @
d1138cf0
...
...
@@ -1718,11 +1718,11 @@ static int atmel_get_essid(struct net_device *dev,
if
(
priv
->
new_SSID_size
!=
0
)
{
memcpy
(
extra
,
priv
->
new_SSID
,
priv
->
new_SSID_size
);
extra
[
priv
->
new_SSID_size
]
=
'\0'
;
dwrq
->
length
=
priv
->
new_SSID_size
+
1
;
dwrq
->
length
=
priv
->
new_SSID_size
;
}
else
{
memcpy
(
extra
,
priv
->
SSID
,
priv
->
SSID_size
);
extra
[
priv
->
SSID_size
]
=
'\0'
;
dwrq
->
length
=
priv
->
SSID_size
+
1
;
dwrq
->
length
=
priv
->
SSID_size
;
}
dwrq
->
flags
=
!
priv
->
connect_to_any_BSS
;
/* active */
...
...
drivers/net/wireless/hostap/Kconfig
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/Makefile
浏览文件 @
d1138cf0
hostap-y
:=
hostap_main.o
hostap-y
:=
hostap_80211_rx.o hostap_80211_tx.o hostap_ap.o hostap_info.o
\
hostap_ioctl.o hostap_main.o hostap_proc.o
obj-$(CONFIG_HOSTAP)
+=
hostap.o
obj-$(CONFIG_HOSTAP_CS)
+=
hostap_cs.o
...
...
drivers/net/wireless/hostap/hostap.h
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_80211.h
浏览文件 @
d1138cf0
#ifndef HOSTAP_80211_H
#define HOSTAP_80211_H
#include <linux/types.h>
#include <net/ieee80211_crypt.h>
struct
hostap_ieee80211_mgmt
{
u16
frame_control
;
u16
duration
;
...
...
drivers/net/wireless/hostap/hostap_80211_rx.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_80211_tx.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_ap.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_ap.h
浏览文件 @
d1138cf0
#ifndef HOSTAP_AP_H
#define HOSTAP_AP_H
#include "hostap_80211.h"
/* AP data structures for STAs */
/* maximum number of frames to buffer per STA */
...
...
drivers/net/wireless/hostap/hostap_common.h
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_config.h
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_info.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_ioctl.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_main.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_proc.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/hostap/hostap_wlan.h
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/ipw2100.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/ipw2200.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/prism54/isl_ioctl.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/prism54/islpci_eth.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/ray_cs.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
drivers/net/wireless/wavelan_cs.c
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
include/net/ieee80211_crypt.h
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
include/net/iw_handler.h
浏览文件 @
d1138cf0
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录