Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
34812c9e
K
Kernel
项目概览
openeuler
/
Kernel
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
34812c9e
编写于
5月 25, 2005
作者:
提交者:
Jeff Garzik
5月 25, 2005
浏览文件
操作
浏览文件
下载
差异文件
Automatic merge of /spare/repo/netdev-2.6 branch e1000
上级
d6d78f63
2648345f
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
3241 addition
and
786 deletion
+3241
-786
drivers/net/e1000/e1000.h
drivers/net/e1000/e1000.h
+33
-4
drivers/net/e1000/e1000_ethtool.c
drivers/net/e1000/e1000_ethtool.c
+69
-36
drivers/net/e1000/e1000_hw.c
drivers/net/e1000/e1000_hw.c
+1670
-463
drivers/net/e1000/e1000_hw.h
drivers/net/e1000/e1000_hw.h
+547
-23
drivers/net/e1000/e1000_main.c
drivers/net/e1000/e1000_main.c
+891
-256
drivers/net/e1000/e1000_osdep.h
drivers/net/e1000/e1000_osdep.h
+30
-2
drivers/net/e1000/e1000_param.c
drivers/net/e1000/e1000_param.c
+1
-2
未找到文件。
drivers/net/e1000/e1000.h
浏览文件 @
34812c9e
/*******************************************************************************
Copyright(c) 1999 - 200
4
Intel Corporation. All rights reserved.
Copyright(c) 1999 - 200
5
Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
...
...
@@ -112,6 +112,8 @@ struct e1000_adapter;
#define E1000_MAX_82544_RXD 4096
/* Supported Rx Buffer Sizes */
#define E1000_RXBUFFER_128 128
/* Used for packet split */
#define E1000_RXBUFFER_256 256
/* Used for packet split */
#define E1000_RXBUFFER_2048 2048
#define E1000_RXBUFFER_4096 4096
#define E1000_RXBUFFER_8192 8192
...
...
@@ -137,15 +139,19 @@ struct e1000_adapter;
/* How many Rx Buffers do we bundle into one write to the hardware ? */
#define E1000_RX_BUFFER_WRITE 16
/* Must be power of 2 */
#define AUTO_ALL_MODES 0
#define E1000_EEPROM_82544_APM
0x0004
#define E1000_EEPROM_APME 0x0400
#define AUTO_ALL_MODES
0
#define E1000_EEPROM_82544_APM
0x0400
#define E1000_EEPROM_APME
0x0400
#ifndef E1000_MASTER_SLAVE
/* Switch to override PHY master/slave setting */
#define E1000_MASTER_SLAVE e1000_ms_hw_default
#endif
#define E1000_MNG_VLAN_NONE -1
/* Number of packet split data buffers (not including the header buffer) */
#define PS_PAGE_BUFFERS MAX_PS_BUFFERS-1
/* only works for sizes that are powers of 2 */
#define E1000_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1)))
...
...
@@ -159,6 +165,9 @@ struct e1000_buffer {
uint16_t
next_to_watch
;
};
struct
e1000_ps_page
{
struct
page
*
ps_page
[
MAX_PS_BUFFERS
];
};
struct
e1000_ps_page_dma
{
uint64_t
ps_page_dma
[
MAX_PS_BUFFERS
];
};
struct
e1000_desc_ring
{
/* pointer to the descriptor ring memory */
void
*
desc
;
...
...
@@ -174,12 +183,19 @@ struct e1000_desc_ring {
unsigned
int
next_to_clean
;
/* array of buffer information structs */
struct
e1000_buffer
*
buffer_info
;
/* arrays of page information for packet split */
struct
e1000_ps_page
*
ps_page
;
struct
e1000_ps_page_dma
*
ps_page_dma
;
};
#define E1000_DESC_UNUSED(R) \
((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \
(R)->next_to_clean - (R)->next_to_use - 1)
#define E1000_RX_DESC_PS(R, i) \
(&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
#define E1000_RX_DESC_EXT(R, i) \
(&(((union e1000_rx_desc_extended *)((R).desc))[i]))
#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i]))
#define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc)
#define E1000_TX_DESC(R, i) E1000_GET_DESC(R, i, e1000_tx_desc)
...
...
@@ -192,6 +208,7 @@ struct e1000_adapter {
struct
timer_list
watchdog_timer
;
struct
timer_list
phy_info_timer
;
struct
vlan_group
*
vlgrp
;
uint16_t
mng_vlan_id
;
uint32_t
bd_number
;
uint32_t
rx_buffer_len
;
uint32_t
part_num
;
...
...
@@ -228,14 +245,23 @@ struct e1000_adapter {
boolean_t
detect_tx_hung
;
/* RX */
#ifdef CONFIG_E1000_NAPI
boolean_t
(
*
clean_rx
)
(
struct
e1000_adapter
*
adapter
,
int
*
work_done
,
int
work_to_do
);
#else
boolean_t
(
*
clean_rx
)
(
struct
e1000_adapter
*
adapter
);
#endif
void
(
*
alloc_rx_buf
)
(
struct
e1000_adapter
*
adapter
);
struct
e1000_desc_ring
rx_ring
;
uint64_t
hw_csum_err
;
uint64_t
hw_csum_good
;
uint32_t
rx_int_delay
;
uint32_t
rx_abs_int_delay
;
boolean_t
rx_csum
;
boolean_t
rx_ps
;
uint32_t
gorcl
;
uint64_t
gorcl_old
;
uint16_t
rx_ps_bsize0
;
/* Interrupt Throttle Rate */
uint32_t
itr
;
...
...
@@ -257,5 +283,8 @@ struct e1000_adapter {
int
msg_enable
;
#ifdef CONFIG_PCI_MSI
boolean_t
have_msi
;
#endif
};
#endif
/* _E1000_H_ */
drivers/net/e1000/e1000_ethtool.c
浏览文件 @
34812c9e
/*******************************************************************************
Copyright(c) 1999 - 200
4
Intel Corporation. All rights reserved.
Copyright(c) 1999 - 200
5
Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
...
...
@@ -69,6 +69,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{
"rx_crc_errors"
,
E1000_STAT
(
net_stats
.
rx_crc_errors
)
},
{
"rx_frame_errors"
,
E1000_STAT
(
net_stats
.
rx_frame_errors
)
},
{
"rx_fifo_errors"
,
E1000_STAT
(
net_stats
.
rx_fifo_errors
)
},
{
"rx_no_buffer_count"
,
E1000_STAT
(
stats
.
rnbc
)
},
{
"rx_missed_errors"
,
E1000_STAT
(
net_stats
.
rx_missed_errors
)
},
{
"tx_aborted_errors"
,
E1000_STAT
(
net_stats
.
tx_aborted_errors
)
},
{
"tx_carrier_errors"
,
E1000_STAT
(
net_stats
.
tx_carrier_errors
)
},
...
...
@@ -593,7 +594,7 @@ e1000_set_ringparam(struct net_device *netdev,
tx_old
=
adapter
->
tx_ring
;
rx_old
=
adapter
->
rx_ring
;
if
((
ring
->
rx_mini_pending
)
||
(
ring
->
rx_jumbo_pending
))
if
((
ring
->
rx_mini_pending
)
||
(
ring
->
rx_jumbo_pending
))
return
-
EINVAL
;
if
(
netif_running
(
adapter
->
netdev
))
...
...
@@ -784,8 +785,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
/* Hook up test interrupt handler just for this test */
if
(
!
request_irq
(
irq
,
&
e1000_test_intr
,
0
,
netdev
->
name
,
netdev
))
{
shared_int
=
FALSE
;
}
else
if
(
request_irq
(
irq
,
&
e1000_test_intr
,
SA_SHIRQ
,
netdev
->
name
,
netdev
)){
}
else
if
(
request_irq
(
irq
,
&
e1000_test_intr
,
SA_SHIRQ
,
netdev
->
name
,
netdev
)){
*
data
=
1
;
return
-
1
;
}
...
...
@@ -842,10 +843,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
* test failed.
*/
adapter
->
test_icr
=
0
;
E1000_WRITE_REG
(
&
adapter
->
hw
,
IMC
,
(
~
mask
&
0x00007FFF
));
E1000_WRITE_REG
(
&
adapter
->
hw
,
ICS
,
(
~
mask
&
0x00007FFF
));
E1000_WRITE_REG
(
&
adapter
->
hw
,
IMC
,
~
mask
&
0x00007FFF
);
E1000_WRITE_REG
(
&
adapter
->
hw
,
ICS
,
~
mask
&
0x00007FFF
);
msec_delay
(
10
);
if
(
adapter
->
test_icr
)
{
...
...
@@ -919,7 +918,8 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
/* Setup Tx descriptor ring and Tx buffers */
txdr
->
count
=
80
;
if
(
!
txdr
->
count
)
txdr
->
count
=
E1000_DEFAULT_TXD
;
size
=
txdr
->
count
*
sizeof
(
struct
e1000_buffer
);
if
(
!
(
txdr
->
buffer_info
=
kmalloc
(
size
,
GFP_KERNEL
)))
{
...
...
@@ -974,7 +974,8 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
/* Setup Rx descriptor ring and Rx buffers */
rxdr
->
count
=
80
;
if
(
!
rxdr
->
count
)
rxdr
->
count
=
E1000_DEFAULT_RXD
;
size
=
rxdr
->
count
*
sizeof
(
struct
e1000_buffer
);
if
(
!
(
rxdr
->
buffer_info
=
kmalloc
(
size
,
GFP_KERNEL
)))
{
...
...
@@ -1008,7 +1009,7 @@ e1000_setup_desc_rings(struct e1000_adapter *adapter)
struct
e1000_rx_desc
*
rx_desc
=
E1000_RX_DESC
(
*
rxdr
,
i
);
struct
sk_buff
*
skb
;
if
(
!
(
skb
=
alloc_skb
(
E1000_RXBUFFER_2048
+
NET_IP_ALIGN
,
if
(
!
(
skb
=
alloc_skb
(
E1000_RXBUFFER_2048
+
NET_IP_ALIGN
,
GFP_KERNEL
)))
{
ret_val
=
6
;
goto
err_nomem
;
...
...
@@ -1310,31 +1311,62 @@ e1000_run_loopback_test(struct e1000_adapter *adapter)
struct
e1000_desc_ring
*
txdr
=
&
adapter
->
test_tx_ring
;
struct
e1000_desc_ring
*
rxdr
=
&
adapter
->
test_rx_ring
;
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
int
i
,
ret_val
;
int
i
,
j
,
k
,
l
,
lc
,
good_cnt
,
ret_val
=
0
;
unsigned
long
time
;
E1000_WRITE_REG
(
&
adapter
->
hw
,
RDT
,
rxdr
->
count
-
1
);
for
(
i
=
0
;
i
<
64
;
i
++
)
{
e1000_create_lbtest_frame
(
txdr
->
buffer_info
[
i
].
skb
,
1024
);
pci_dma_sync_single_for_device
(
pdev
,
txdr
->
buffer_info
[
i
].
dma
,
txdr
->
buffer_info
[
i
].
length
,
PCI_DMA_TODEVICE
);
}
E1000_WRITE_REG
(
&
adapter
->
hw
,
TDT
,
i
);
msec_delay
(
200
);
i
=
0
;
do
{
pci_dma_sync_single_for_cpu
(
pdev
,
rxdr
->
buffer_info
[
i
].
dma
,
rxdr
->
buffer_info
[
i
].
length
,
PCI_DMA_FROMDEVICE
);
ret_val
=
e1000_check_lbtest_frame
(
rxdr
->
buffer_info
[
i
].
skb
,
1024
);
i
++
;
}
while
(
ret_val
!=
0
&&
i
<
64
);
/* Calculate the loop count based on the largest descriptor ring
* The idea is to wrap the largest ring a number of times using 64
* send/receive pairs during each loop
*/
if
(
rxdr
->
count
<=
txdr
->
count
)
lc
=
((
txdr
->
count
/
64
)
*
2
)
+
1
;
else
lc
=
((
rxdr
->
count
/
64
)
*
2
)
+
1
;
k
=
l
=
0
;
for
(
j
=
0
;
j
<=
lc
;
j
++
)
{
/* loop count loop */
for
(
i
=
0
;
i
<
64
;
i
++
)
{
/* send the packets */
e1000_create_lbtest_frame
(
txdr
->
buffer_info
[
i
].
skb
,
1024
);
pci_dma_sync_single_for_device
(
pdev
,
txdr
->
buffer_info
[
k
].
dma
,
txdr
->
buffer_info
[
k
].
length
,
PCI_DMA_TODEVICE
);
if
(
unlikely
(
++
k
==
txdr
->
count
))
k
=
0
;
}
E1000_WRITE_REG
(
&
adapter
->
hw
,
TDT
,
k
);
msec_delay
(
200
);
time
=
jiffies
;
/* set the start time for the receive */
good_cnt
=
0
;
do
{
/* receive the sent packets */
pci_dma_sync_single_for_cpu
(
pdev
,
rxdr
->
buffer_info
[
l
].
dma
,
rxdr
->
buffer_info
[
l
].
length
,
PCI_DMA_FROMDEVICE
);
ret_val
=
e1000_check_lbtest_frame
(
rxdr
->
buffer_info
[
l
].
skb
,
1024
);
if
(
!
ret_val
)
good_cnt
++
;
if
(
unlikely
(
++
l
==
rxdr
->
count
))
l
=
0
;
/* time + 20 msecs (200 msecs on 2.4) is more than
* enough time to complete the receives, if it's
* exceeded, break and error off
*/
}
while
(
good_cnt
<
64
&&
jiffies
<
(
time
+
20
));
if
(
good_cnt
!=
64
)
{
ret_val
=
13
;
/* ret_val is the same as mis-compare */
break
;
}
if
(
jiffies
>=
(
time
+
2
))
{
ret_val
=
14
;
/* error code for time out error */
break
;
}
}
/* end loop count loop */
return
ret_val
;
}
...
...
@@ -1354,13 +1386,12 @@ static int
e1000_link_test
(
struct
e1000_adapter
*
adapter
,
uint64_t
*
data
)
{
*
data
=
0
;
if
(
adapter
->
hw
.
media_type
==
e1000_media_type_internal_serdes
)
{
int
i
=
0
;
adapter
->
hw
.
serdes_link_down
=
TRUE
;
/*
on some blade server designs link establishment */
/* could take as long as 2-3 minutes.
*/
/*
On some blade server designs, link establishment
* could take as long as 2-3 minutes
*/
do
{
e1000_check_for_link
(
&
adapter
->
hw
);
if
(
adapter
->
hw
.
serdes_link_down
==
FALSE
)
...
...
@@ -1368,9 +1399,11 @@ e1000_link_test(struct e1000_adapter *adapter, uint64_t *data)
msec_delay
(
20
);
}
while
(
i
++
<
3750
);
*
data
=
1
;
*
data
=
1
;
}
else
{
e1000_check_for_link
(
&
adapter
->
hw
);
if
(
adapter
->
hw
.
autoneg
)
/* if auto_neg is set wait for it */
msec_delay
(
4000
);
if
(
!
(
E1000_READ_REG
(
&
adapter
->
hw
,
STATUS
)
&
E1000_STATUS_LU
))
{
*
data
=
1
;
...
...
drivers/net/e1000/e1000_hw.c
浏览文件 @
34812c9e
此差异已折叠。
点击以展开。
drivers/net/e1000/e1000_hw.h
浏览文件 @
34812c9e
此差异已折叠。
点击以展开。
drivers/net/e1000/e1000_main.c
浏览文件 @
34812c9e
此差异已折叠。
点击以展开。
drivers/net/e1000/e1000_osdep.h
浏览文件 @
34812c9e
/*******************************************************************************
Copyright(c) 1999 - 200
4
Intel Corporation. All rights reserved.
Copyright(c) 1999 - 200
5
Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
...
...
@@ -42,7 +42,12 @@
#include <linux/sched.h>
#ifndef msec_delay
#define msec_delay(x) msleep(x)
#define msec_delay(x) do { if(in_interrupt()) { \
/* Don't mdelay in interrupt context! */
\
BUG(); \
} else { \
msleep(x); \
} } while(0)
/* Some workarounds require millisecond delays and are run during interrupt
* context. Most notably, when establishing link, the phy may need tweaking
...
...
@@ -96,6 +101,29 @@ typedef enum {
(((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
((offset) << 2)))
#define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY
#define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY
#define E1000_WRITE_REG_ARRAY_WORD(a, reg, offset, value) ( \
writew((value), ((a)->hw_addr + \
(((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
((offset) << 1))))
#define E1000_READ_REG_ARRAY_WORD(a, reg, offset) ( \
readw((a)->hw_addr + \
(((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
((offset) << 1)))
#define E1000_WRITE_REG_ARRAY_BYTE(a, reg, offset, value) ( \
writeb((value), ((a)->hw_addr + \
(((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
(offset))))
#define E1000_READ_REG_ARRAY_BYTE(a, reg, offset) ( \
readb((a)->hw_addr + \
(((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
(offset)))
#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS)
#endif
/* _E1000_OSDEP_H_ */
drivers/net/e1000/e1000_param.c
浏览文件 @
34812c9e
/*******************************************************************************
Copyright(c) 1999 - 200
4
Intel Corporation. All rights reserved.
Copyright(c) 1999 - 200
5
Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
...
...
@@ -478,7 +478,6 @@ e1000_check_options(struct e1000_adapter *adapter)
DPRINTK
(
PROBE
,
INFO
,
"%s set to dynamic mode
\n
"
,
opt
.
name
);
break
;
case
-
1
:
default:
e1000_validate_option
(
&
adapter
->
itr
,
&
opt
,
adapter
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录