1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun ################################################################################
4*4882a593Smuzhiyun #
5*4882a593Smuzhiyun # r8168 is the Linux device driver released for Realtek Gigabit Ethernet
6*4882a593Smuzhiyun # controllers with PCI-Express interface.
7*4882a593Smuzhiyun #
8*4882a593Smuzhiyun # Copyright(c) 2021 Realtek Semiconductor Corp. All rights reserved.
9*4882a593Smuzhiyun #
10*4882a593Smuzhiyun # This program is free software; you can redistribute it and/or modify it
11*4882a593Smuzhiyun # under the terms of the GNU General Public License as published by the Free
12*4882a593Smuzhiyun # Software Foundation; either version 2 of the License, or (at your option)
13*4882a593Smuzhiyun # any later version.
14*4882a593Smuzhiyun #
15*4882a593Smuzhiyun # This program is distributed in the hope that it will be useful, but WITHOUT
16*4882a593Smuzhiyun # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17*4882a593Smuzhiyun # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18*4882a593Smuzhiyun # more details.
19*4882a593Smuzhiyun #
20*4882a593Smuzhiyun # You should have received a copy of the GNU General Public License along with
21*4882a593Smuzhiyun # this program; if not, see <http://www.gnu.org/licenses/>.
22*4882a593Smuzhiyun #
23*4882a593Smuzhiyun # Author:
24*4882a593Smuzhiyun # Realtek NIC software team <nicfae@realtek.com>
25*4882a593Smuzhiyun # No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
26*4882a593Smuzhiyun #
27*4882a593Smuzhiyun ################################################################################
28*4882a593Smuzhiyun */
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun /************************************************************************************
31*4882a593Smuzhiyun * This product is covered by one or more of the following patents:
32*4882a593Smuzhiyun * US6,570,884, US6,115,776, and US6,327,625.
33*4882a593Smuzhiyun ***********************************************************************************/
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #include <linux/ethtool.h>
36*4882a593Smuzhiyun #include "r8168_dash.h"
37*4882a593Smuzhiyun #include "r8168_realwow.h"
38*4882a593Smuzhiyun #include "r8168_fiber.h"
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
41*4882a593Smuzhiyun typedef int netdev_tx_t;
42*4882a593Smuzhiyun #endif
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
45*4882a593Smuzhiyun #define skb_transport_offset(skb) (skb->h.raw - skb->data)
46*4882a593Smuzhiyun #endif
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
49*4882a593Smuzhiyun #define device_set_wakeup_enable(dev, val) do {} while (0)
50*4882a593Smuzhiyun #endif
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
ether_addr_copy(u8 * dst,const u8 * src)53*4882a593Smuzhiyun static inline void ether_addr_copy(u8 *dst, const u8 *src)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun u16 *a = (u16 *)dst;
56*4882a593Smuzhiyun const u16 *b = (const u16 *)src;
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun a[0] = b[0];
59*4882a593Smuzhiyun a[1] = b[1];
60*4882a593Smuzhiyun a[2] = b[2];
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)
65*4882a593Smuzhiyun #define IS_ERR_OR_NULL(ptr) (!ptr)
66*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)
67*4882a593Smuzhiyun #define reinit_completion(x) ((x)->done = 0)
68*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39)
69*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
70*4882a593Smuzhiyun #define pm_runtime_mark_last_busy(x)
71*4882a593Smuzhiyun #define pm_runtime_put_autosuspend(x) pm_runtime_put(x)
72*4882a593Smuzhiyun #define pm_runtime_put_sync_autosuspend(x) pm_runtime_put_sync(x)
73*4882a593Smuzhiyun
pm_runtime_suspended(struct device * dev)74*4882a593Smuzhiyun static inline bool pm_runtime_suspended(struct device *dev)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun return dev->power.runtime_status == RPM_SUSPENDED
77*4882a593Smuzhiyun && !dev->power.disable_depth;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
pm_runtime_active(struct device * dev)80*4882a593Smuzhiyun static inline bool pm_runtime_active(struct device *dev)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun return dev->power.runtime_status == RPM_ACTIVE
83*4882a593Smuzhiyun || dev->power.disable_depth;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun #endif
86*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)
87*4882a593Smuzhiyun #define queue_delayed_work(long_wq, work, delay) schedule_delayed_work(work, delay)
88*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
89*4882a593Smuzhiyun #define netif_printk(priv, type, level, netdev, fmt, args...) \
90*4882a593Smuzhiyun do { \
91*4882a593Smuzhiyun if (netif_msg_##type(priv)) \
92*4882a593Smuzhiyun printk(level "%s: " fmt,(netdev)->name , ##args); \
93*4882a593Smuzhiyun } while (0)
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun #define netif_emerg(priv, type, netdev, fmt, args...) \
96*4882a593Smuzhiyun netif_printk(priv, type, KERN_EMERG, netdev, fmt, ##args)
97*4882a593Smuzhiyun #define netif_alert(priv, type, netdev, fmt, args...) \
98*4882a593Smuzhiyun netif_printk(priv, type, KERN_ALERT, netdev, fmt, ##args)
99*4882a593Smuzhiyun #define netif_crit(priv, type, netdev, fmt, args...) \
100*4882a593Smuzhiyun netif_printk(priv, type, KERN_CRIT, netdev, fmt, ##args)
101*4882a593Smuzhiyun #define netif_err(priv, type, netdev, fmt, args...) \
102*4882a593Smuzhiyun netif_printk(priv, type, KERN_ERR, netdev, fmt, ##args)
103*4882a593Smuzhiyun #define netif_warn(priv, type, netdev, fmt, args...) \
104*4882a593Smuzhiyun netif_printk(priv, type, KERN_WARNING, netdev, fmt, ##args)
105*4882a593Smuzhiyun #define netif_notice(priv, type, netdev, fmt, args...) \
106*4882a593Smuzhiyun netif_printk(priv, type, KERN_NOTICE, netdev, fmt, ##args)
107*4882a593Smuzhiyun #define netif_info(priv, type, netdev, fmt, args...) \
108*4882a593Smuzhiyun netif_printk(priv, type, KERN_INFO, (netdev), fmt, ##args)
109*4882a593Smuzhiyun #endif
110*4882a593Smuzhiyun #endif
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun #endif
113*4882a593Smuzhiyun #endif
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
116*4882a593Smuzhiyun #define setup_timer(_timer, _function, _data) \
117*4882a593Smuzhiyun do { \
118*4882a593Smuzhiyun (_timer)->function = _function; \
119*4882a593Smuzhiyun (_timer)->data = _data; \
120*4882a593Smuzhiyun init_timer(_timer); \
121*4882a593Smuzhiyun } while (0)
122*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)
125*4882a593Smuzhiyun #if defined(skb_vlan_tag_present) && !defined(vlan_tx_tag_present)
126*4882a593Smuzhiyun #define vlan_tx_tag_present skb_vlan_tag_present
127*4882a593Smuzhiyun #endif
128*4882a593Smuzhiyun #if defined(skb_vlan_tag_get) && !defined(vlan_tx_tag_get)
129*4882a593Smuzhiyun #define vlan_tx_tag_get skb_vlan_tag_get
130*4882a593Smuzhiyun #endif
131*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun #define RTL_ALLOC_SKB_INTR(tp, length) dev_alloc_skb(length)
134*4882a593Smuzhiyun #ifdef CONFIG_R8168_NAPI
135*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0)
136*4882a593Smuzhiyun #undef RTL_ALLOC_SKB_INTR
137*4882a593Smuzhiyun #define RTL_ALLOC_SKB_INTR(tp, length) napi_alloc_skb(&tp->napi, length)
138*4882a593Smuzhiyun #endif
139*4882a593Smuzhiyun #endif
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
142*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
143*4882a593Smuzhiyun #define netdev_features_t u32
144*4882a593Smuzhiyun #endif
145*4882a593Smuzhiyun #endif
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)
148*4882a593Smuzhiyun #define NETIF_F_ALL_CSUM NETIF_F_CSUM_MASK
149*4882a593Smuzhiyun #else
150*4882a593Smuzhiyun #ifndef NETIF_F_ALL_CSUM
151*4882a593Smuzhiyun #define NETIF_F_ALL_CSUM NETIF_F_CSUM_MASK
152*4882a593Smuzhiyun #endif
153*4882a593Smuzhiyun #endif
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37)
156*4882a593Smuzhiyun #define ENABLE_R8168_PROCFS
157*4882a593Smuzhiyun #endif
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
160*4882a593Smuzhiyun #define NETIF_F_HW_VLAN_RX NETIF_F_HW_VLAN_CTAG_RX
161*4882a593Smuzhiyun #define NETIF_F_HW_VLAN_TX NETIF_F_HW_VLAN_CTAG_TX
162*4882a593Smuzhiyun #endif
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
165*4882a593Smuzhiyun #define __devinit
166*4882a593Smuzhiyun #define __devexit
167*4882a593Smuzhiyun #define __devexit_p(func) func
168*4882a593Smuzhiyun #endif
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
171*4882a593Smuzhiyun #define CHECKSUM_PARTIAL CHECKSUM_HW
172*4882a593Smuzhiyun #endif
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
175*4882a593Smuzhiyun #define irqreturn_t void
176*4882a593Smuzhiyun #define IRQ_HANDLED 1
177*4882a593Smuzhiyun #define IRQ_NONE 0
178*4882a593Smuzhiyun #define IRQ_RETVAL(x)
179*4882a593Smuzhiyun #endif
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun #ifndef NETIF_F_RXALL
182*4882a593Smuzhiyun #define NETIF_F_RXALL 0
183*4882a593Smuzhiyun #endif
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun #ifndef NETIF_F_RXFCS
186*4882a593Smuzhiyun #define NETIF_F_RXFCS 0
187*4882a593Smuzhiyun #endif
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun #ifndef HAVE_FREE_NETDEV
190*4882a593Smuzhiyun #define free_netdev(x) kfree(x)
191*4882a593Smuzhiyun #endif
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun #ifndef SET_NETDEV_DEV
194*4882a593Smuzhiyun #define SET_NETDEV_DEV(net, pdev)
195*4882a593Smuzhiyun #endif
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun #ifndef SET_MODULE_OWNER
198*4882a593Smuzhiyun #define SET_MODULE_OWNER(dev)
199*4882a593Smuzhiyun #endif
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun #ifndef SA_SHIRQ
202*4882a593Smuzhiyun #define SA_SHIRQ IRQF_SHARED
203*4882a593Smuzhiyun #endif
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun #ifndef NETIF_F_GSO
206*4882a593Smuzhiyun #define gso_size tso_size
207*4882a593Smuzhiyun #define gso_segs tso_segs
208*4882a593Smuzhiyun #endif
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun #ifndef PCI_VENDOR_ID_DLINK
211*4882a593Smuzhiyun #define PCI_VENDOR_ID_DLINK 0x1186
212*4882a593Smuzhiyun #endif
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun #ifndef dma_mapping_error
215*4882a593Smuzhiyun #define dma_mapping_error(a,b) 0
216*4882a593Smuzhiyun #endif
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun #ifndef netif_err
219*4882a593Smuzhiyun #define netif_err(a,b,c,d)
220*4882a593Smuzhiyun #endif
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun #ifndef AUTONEG_DISABLE
223*4882a593Smuzhiyun #define AUTONEG_DISABLE 0x00
224*4882a593Smuzhiyun #endif
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun #ifndef AUTONEG_ENABLE
227*4882a593Smuzhiyun #define AUTONEG_ENABLE 0x01
228*4882a593Smuzhiyun #endif
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun #ifndef BMCR_SPEED1000
231*4882a593Smuzhiyun #define BMCR_SPEED1000 0x0040
232*4882a593Smuzhiyun #endif
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun #ifndef BMCR_SPEED100
235*4882a593Smuzhiyun #define BMCR_SPEED100 0x2000
236*4882a593Smuzhiyun #endif
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun #ifndef BMCR_SPEED10
239*4882a593Smuzhiyun #define BMCR_SPEED10 0x0000
240*4882a593Smuzhiyun #endif
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun #ifndef SPEED_UNKNOWN
243*4882a593Smuzhiyun #define SPEED_UNKNOWN -1
244*4882a593Smuzhiyun #endif
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun #ifndef DUPLEX_UNKNOWN
247*4882a593Smuzhiyun #define DUPLEX_UNKNOWN 0xff
248*4882a593Smuzhiyun #endif
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun #ifndef SUPPORTED_Pause
251*4882a593Smuzhiyun #define SUPPORTED_Pause (1 << 13)
252*4882a593Smuzhiyun #endif
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun #ifndef SUPPORTED_Asym_Pause
255*4882a593Smuzhiyun #define SUPPORTED_Asym_Pause (1 << 14)
256*4882a593Smuzhiyun #endif
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun #ifndef MDIO_EEE_100TX
259*4882a593Smuzhiyun #define MDIO_EEE_100TX 0x0002
260*4882a593Smuzhiyun #endif
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun #ifndef MDIO_EEE_1000T
263*4882a593Smuzhiyun #define MDIO_EEE_1000T 0x0004
264*4882a593Smuzhiyun #endif
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
267*4882a593Smuzhiyun #ifdef CONFIG_NET_POLL_CONTROLLER
268*4882a593Smuzhiyun #define RTL_NET_POLL_CONTROLLER dev->poll_controller=rtl8168_netpoll
269*4882a593Smuzhiyun #else
270*4882a593Smuzhiyun #define RTL_NET_POLL_CONTROLLER
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun #ifdef CONFIG_R8168_VLAN
274*4882a593Smuzhiyun #define RTL_SET_VLAN dev->vlan_rx_register=rtl8168_vlan_rx_register
275*4882a593Smuzhiyun #else
276*4882a593Smuzhiyun #define RTL_SET_VLAN
277*4882a593Smuzhiyun #endif
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun #define RTL_NET_DEVICE_OPS(ops) dev->open=rtl8168_open; \
280*4882a593Smuzhiyun dev->hard_start_xmit=rtl8168_start_xmit; \
281*4882a593Smuzhiyun dev->get_stats=rtl8168_get_stats; \
282*4882a593Smuzhiyun dev->stop=rtl8168_close; \
283*4882a593Smuzhiyun dev->tx_timeout=rtl8168_tx_timeout; \
284*4882a593Smuzhiyun dev->set_multicast_list=rtl8168_set_rx_mode; \
285*4882a593Smuzhiyun dev->change_mtu=rtl8168_change_mtu; \
286*4882a593Smuzhiyun dev->set_mac_address=rtl8168_set_mac_address; \
287*4882a593Smuzhiyun dev->do_ioctl=rtl8168_do_ioctl; \
288*4882a593Smuzhiyun RTL_NET_POLL_CONTROLLER; \
289*4882a593Smuzhiyun RTL_SET_VLAN;
290*4882a593Smuzhiyun #else
291*4882a593Smuzhiyun #define RTL_NET_DEVICE_OPS(ops) dev->netdev_ops=&ops
292*4882a593Smuzhiyun #endif
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun #ifndef FALSE
295*4882a593Smuzhiyun #define FALSE 0
296*4882a593Smuzhiyun #endif
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun #ifndef TRUE
299*4882a593Smuzhiyun #define TRUE 1
300*4882a593Smuzhiyun #endif
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun #ifndef false
303*4882a593Smuzhiyun #define false 0
304*4882a593Smuzhiyun #endif
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun #ifndef true
307*4882a593Smuzhiyun #define true 1
308*4882a593Smuzhiyun #endif
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun //Hardware will continue interrupt 10 times after interrupt finished.
311*4882a593Smuzhiyun #define RTK_KEEP_INTERRUPT_COUNT (10)
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun //Due to the hardware design of RTL8111B, the low 32 bit address of receive
314*4882a593Smuzhiyun //buffer must be 8-byte alignment.
315*4882a593Smuzhiyun #ifndef NET_IP_ALIGN
316*4882a593Smuzhiyun #define NET_IP_ALIGN 2
317*4882a593Smuzhiyun #endif
318*4882a593Smuzhiyun #define RTK_RX_ALIGN 8
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun #ifdef CONFIG_R8168_NAPI
321*4882a593Smuzhiyun #define NAPI_SUFFIX "-NAPI"
322*4882a593Smuzhiyun #else
323*4882a593Smuzhiyun #define NAPI_SUFFIX ""
324*4882a593Smuzhiyun #endif
325*4882a593Smuzhiyun #ifdef ENABLE_FIBER_SUPPORT
326*4882a593Smuzhiyun #define FIBER_SUFFIX "-FIBER"
327*4882a593Smuzhiyun #else
328*4882a593Smuzhiyun #define FIBER_SUFFIX ""
329*4882a593Smuzhiyun #endif
330*4882a593Smuzhiyun #ifdef ENABLE_REALWOW_SUPPORT
331*4882a593Smuzhiyun #define REALWOW_SUFFIX "-REALWOW"
332*4882a593Smuzhiyun #else
333*4882a593Smuzhiyun #define REALWOW_SUFFIX ""
334*4882a593Smuzhiyun #endif
335*4882a593Smuzhiyun #if defined(ENABLE_DASH_PRINTER_SUPPORT)
336*4882a593Smuzhiyun #define DASH_SUFFIX "-PRINTER"
337*4882a593Smuzhiyun #elif defined(ENABLE_DASH_SUPPORT)
338*4882a593Smuzhiyun #define DASH_SUFFIX "-DASH"
339*4882a593Smuzhiyun #else
340*4882a593Smuzhiyun #define DASH_SUFFIX ""
341*4882a593Smuzhiyun #endif
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun #define RTL8168_VERSION "8.049.02" NAPI_SUFFIX FIBER_SUFFIX REALWOW_SUFFIX DASH_SUFFIX
344*4882a593Smuzhiyun #define MODULENAME "r8168"
345*4882a593Smuzhiyun #define PFX MODULENAME ": "
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun #define GPL_CLAIM "\
348*4882a593Smuzhiyun r8168 Copyright (C) 2021 Realtek NIC software team <nicfae@realtek.com> \n \
349*4882a593Smuzhiyun This program comes with ABSOLUTELY NO WARRANTY; for details, please see <http://www.gnu.org/licenses/>. \n \
350*4882a593Smuzhiyun This is free software, and you are welcome to redistribute it under certain conditions; see <http://www.gnu.org/licenses/>. \n"
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun #ifdef RTL8168_DEBUG
353*4882a593Smuzhiyun #define assert(expr) \
354*4882a593Smuzhiyun if(!(expr)) { \
355*4882a593Smuzhiyun printk( "Assertion failed! %s,%s,%s,line=%d\n", \
356*4882a593Smuzhiyun #expr,__FILE__,__FUNCTION__,__LINE__); \
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun #define dprintk(fmt, args...) do { printk(PFX fmt, ## args); } while (0)
359*4882a593Smuzhiyun #else
360*4882a593Smuzhiyun #define assert(expr) do {} while (0)
361*4882a593Smuzhiyun #define dprintk(fmt, args...) do {} while (0)
362*4882a593Smuzhiyun #endif /* RTL8168_DEBUG */
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun #define R8168_MSG_DEFAULT \
365*4882a593Smuzhiyun (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun #ifdef CONFIG_R8168_NAPI
368*4882a593Smuzhiyun #define rtl8168_rx_hwaccel_skb vlan_hwaccel_receive_skb
369*4882a593Smuzhiyun #define rtl8168_rx_quota(count, quota) min(count, quota)
370*4882a593Smuzhiyun #else
371*4882a593Smuzhiyun #define rtl8168_rx_hwaccel_skb vlan_hwaccel_rx
372*4882a593Smuzhiyun #define rtl8168_rx_quota(count, quota) count
373*4882a593Smuzhiyun #endif
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun /* MAC address length */
376*4882a593Smuzhiyun #ifndef MAC_ADDR_LEN
377*4882a593Smuzhiyun #define MAC_ADDR_LEN 6
378*4882a593Smuzhiyun #endif
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun #ifndef MAC_PROTOCOL_LEN
381*4882a593Smuzhiyun #define MAC_PROTOCOL_LEN 2
382*4882a593Smuzhiyun #endif
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun #ifndef ETH_FCS_LEN
385*4882a593Smuzhiyun #define ETH_FCS_LEN 4
386*4882a593Smuzhiyun #endif
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun #ifndef NETIF_F_TSO6
389*4882a593Smuzhiyun #define NETIF_F_TSO6 0
390*4882a593Smuzhiyun #endif
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun #define Reserved2_data 7
393*4882a593Smuzhiyun #define RX_DMA_BURST 7 /* Maximum PCI burst, '6' is 1024 */
394*4882a593Smuzhiyun #define TX_DMA_BURST_unlimited 7
395*4882a593Smuzhiyun #define TX_DMA_BURST_1024 6
396*4882a593Smuzhiyun #define TX_DMA_BURST_512 5
397*4882a593Smuzhiyun #define TX_DMA_BURST_256 4
398*4882a593Smuzhiyun #define TX_DMA_BURST_128 3
399*4882a593Smuzhiyun #define TX_DMA_BURST_64 2
400*4882a593Smuzhiyun #define TX_DMA_BURST_32 1
401*4882a593Smuzhiyun #define TX_DMA_BURST_16 0
402*4882a593Smuzhiyun #define Reserved1_data 0x3F
403*4882a593Smuzhiyun #define RxPacketMaxSize 0x3FE8 /* 16K - 1 - ETH_HLEN - VLAN - CRC... */
404*4882a593Smuzhiyun #define Jumbo_Frame_1k ETH_DATA_LEN
405*4882a593Smuzhiyun #define Jumbo_Frame_2k (2*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
406*4882a593Smuzhiyun #define Jumbo_Frame_3k (3*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
407*4882a593Smuzhiyun #define Jumbo_Frame_4k (4*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
408*4882a593Smuzhiyun #define Jumbo_Frame_5k (5*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
409*4882a593Smuzhiyun #define Jumbo_Frame_6k (6*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
410*4882a593Smuzhiyun #define Jumbo_Frame_7k (7*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
411*4882a593Smuzhiyun #define Jumbo_Frame_8k (8*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
412*4882a593Smuzhiyun #define Jumbo_Frame_9k (9*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
413*4882a593Smuzhiyun #define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
414*4882a593Smuzhiyun #define RxEarly_off_V1 (0x07 << 11)
415*4882a593Smuzhiyun #define RxEarly_off_V2 (1 << 11)
416*4882a593Smuzhiyun #define Rx_Single_fetch_V2 (1 << 14)
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun #define R8168_REGS_SIZE (256)
419*4882a593Smuzhiyun #define R8168_MAC_REGS_SIZE (256)
420*4882a593Smuzhiyun #define R8168_PHY_REGS_SIZE (16*2)
421*4882a593Smuzhiyun #define R8168_EPHY_REGS_SIZE (31*2)
422*4882a593Smuzhiyun #define R8168_ERI_REGS_SIZE (0x100)
423*4882a593Smuzhiyun #define R8168_REGS_DUMP_SIZE (0x400)
424*4882a593Smuzhiyun #define R8168_PCI_REGS_SIZE (0x100)
425*4882a593Smuzhiyun #define R8168_NAPI_WEIGHT 64
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun #define RTL8168_TX_TIMEOUT (6 * HZ)
428*4882a593Smuzhiyun #define RTL8168_LINK_TIMEOUT (1 * HZ)
429*4882a593Smuzhiyun #define RTL8168_ESD_TIMEOUT (2 * HZ)
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun #define NUM_TX_DESC 1024 /* Number of Tx descriptor registers */
432*4882a593Smuzhiyun #define NUM_RX_DESC 1024 /* Number of Rx descriptor registers */
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun #define RX_BUF_SIZE 0x05F3 /* 0x05F3 = 1522bye + 1 */
435*4882a593Smuzhiyun #define R8168_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc))
436*4882a593Smuzhiyun #define R8168_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc))
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun #define OCP_STD_PHY_BASE 0xa400
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun #define NODE_ADDRESS_SIZE 6
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun #define SHORT_PACKET_PADDING_BUF_SIZE 256
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun #define RTK_MAGIC_DEBUG_VALUE 0x0badbeef
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun /* write/read MMIO register */
447*4882a593Smuzhiyun #define RTL_W8(tp, reg, val8) writeb((val8), tp->mmio_addr + (reg))
448*4882a593Smuzhiyun #define RTL_W16(tp, reg, val16) writew((val16), tp->mmio_addr + (reg))
449*4882a593Smuzhiyun #define RTL_W32(tp, reg, val32) writel((val32), tp->mmio_addr + (reg))
450*4882a593Smuzhiyun #define RTL_R8(tp, reg) readb(tp->mmio_addr + (reg))
451*4882a593Smuzhiyun #define RTL_R16(tp, reg) readw(tp->mmio_addr + (reg))
452*4882a593Smuzhiyun #define RTL_R32(tp, reg) ((unsigned long) readl(tp->mmio_addr + (reg)))
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun #ifndef DMA_64BIT_MASK
455*4882a593Smuzhiyun #define DMA_64BIT_MASK 0xffffffffffffffffULL
456*4882a593Smuzhiyun #endif
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun #ifndef DMA_32BIT_MASK
459*4882a593Smuzhiyun #define DMA_32BIT_MASK 0x00000000ffffffffULL
460*4882a593Smuzhiyun #endif
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun #ifndef NETDEV_TX_OK
463*4882a593Smuzhiyun #define NETDEV_TX_OK 0 /* driver took care of packet */
464*4882a593Smuzhiyun #endif
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun #ifndef NETDEV_TX_BUSY
467*4882a593Smuzhiyun #define NETDEV_TX_BUSY 1 /* driver tx path was busy*/
468*4882a593Smuzhiyun #endif
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun #ifndef NETDEV_TX_LOCKED
471*4882a593Smuzhiyun #define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */
472*4882a593Smuzhiyun #endif
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun #ifndef ADVERTISED_Pause
475*4882a593Smuzhiyun #define ADVERTISED_Pause (1 << 13)
476*4882a593Smuzhiyun #endif
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun #ifndef ADVERTISED_Asym_Pause
479*4882a593Smuzhiyun #define ADVERTISED_Asym_Pause (1 << 14)
480*4882a593Smuzhiyun #endif
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun #ifndef ADVERTISE_PAUSE_CAP
483*4882a593Smuzhiyun #define ADVERTISE_PAUSE_CAP 0x400
484*4882a593Smuzhiyun #endif
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun #ifndef ADVERTISE_PAUSE_ASYM
487*4882a593Smuzhiyun #define ADVERTISE_PAUSE_ASYM 0x800
488*4882a593Smuzhiyun #endif
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun #ifndef MII_CTRL1000
491*4882a593Smuzhiyun #define MII_CTRL1000 0x09
492*4882a593Smuzhiyun #endif
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun #ifndef ADVERTISE_1000FULL
495*4882a593Smuzhiyun #define ADVERTISE_1000FULL 0x200
496*4882a593Smuzhiyun #endif
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun #ifndef ADVERTISE_1000HALF
499*4882a593Smuzhiyun #define ADVERTISE_1000HALF 0x100
500*4882a593Smuzhiyun #endif
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun #ifndef ETH_MIN_MTU
503*4882a593Smuzhiyun #define ETH_MIN_MTU 68
504*4882a593Smuzhiyun #endif
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun /*****************************************************************************/
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun //#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3)
509*4882a593Smuzhiyun #if (( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) || \
510*4882a593Smuzhiyun (( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) && \
511*4882a593Smuzhiyun ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) )))
512*4882a593Smuzhiyun /* copied from linux kernel 2.6.20 include/linux/netdev.h */
513*4882a593Smuzhiyun #define NETDEV_ALIGN 32
514*4882a593Smuzhiyun #define NETDEV_ALIGN_CONST (NETDEV_ALIGN - 1)
515*4882a593Smuzhiyun
netdev_priv(struct net_device * dev)516*4882a593Smuzhiyun static inline void *netdev_priv(struct net_device *dev)
517*4882a593Smuzhiyun {
518*4882a593Smuzhiyun return (char *)dev + ((sizeof(struct net_device)
519*4882a593Smuzhiyun + NETDEV_ALIGN_CONST)
520*4882a593Smuzhiyun & ~NETDEV_ALIGN_CONST);
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3)
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun /*****************************************************************************/
525*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
526*4882a593Smuzhiyun #define RTLDEV tp
527*4882a593Smuzhiyun #else
528*4882a593Smuzhiyun #define RTLDEV dev
529*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
530*4882a593Smuzhiyun /*****************************************************************************/
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
533*4882a593Smuzhiyun typedef struct net_device *napi_ptr;
534*4882a593Smuzhiyun typedef int *napi_budget;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun #define napi dev
537*4882a593Smuzhiyun #define RTL_NAPI_CONFIG(ndev, priv, function, weig) ndev->poll=function; \
538*4882a593Smuzhiyun ndev->weight=weig;
539*4882a593Smuzhiyun #define RTL_NAPI_QUOTA(budget, ndev) min(*budget, ndev->quota)
540*4882a593Smuzhiyun #define RTL_GET_PRIV(stuct_ptr, priv_struct) netdev_priv(stuct_ptr)
541*4882a593Smuzhiyun #define RTL_GET_NETDEV(priv_ptr)
542*4882a593Smuzhiyun #define RTL_RX_QUOTA(budget) *budget
543*4882a593Smuzhiyun #define RTL_NAPI_QUOTA_UPDATE(ndev, work_done, budget) *budget -= work_done; \
544*4882a593Smuzhiyun ndev->quota -= work_done;
545*4882a593Smuzhiyun #define RTL_NETIF_RX_COMPLETE(dev, napi, work_done) netif_rx_complete(dev)
546*4882a593Smuzhiyun #define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi) netif_rx_schedule_prep(dev)
547*4882a593Smuzhiyun #define __RTL_NETIF_RX_SCHEDULE(dev, napi) __netif_rx_schedule(dev)
548*4882a593Smuzhiyun #define RTL_NAPI_RETURN_VALUE work_done >= work_to_do
549*4882a593Smuzhiyun #define RTL_NAPI_ENABLE(dev, napi) netif_poll_enable(dev)
550*4882a593Smuzhiyun #define RTL_NAPI_DISABLE(dev, napi) netif_poll_disable(dev)
551*4882a593Smuzhiyun #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
552*4882a593Smuzhiyun #else
553*4882a593Smuzhiyun typedef struct napi_struct *napi_ptr;
554*4882a593Smuzhiyun typedef int napi_budget;
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun #define RTL_NAPI_CONFIG(ndev, priv, function, weight) netif_napi_add(ndev, &priv->napi, function, weight)
557*4882a593Smuzhiyun #define RTL_NAPI_QUOTA(budget, ndev) min(budget, budget)
558*4882a593Smuzhiyun #define RTL_GET_PRIV(stuct_ptr, priv_struct) container_of(stuct_ptr, priv_struct, stuct_ptr)
559*4882a593Smuzhiyun #define RTL_GET_NETDEV(priv_ptr) struct net_device *dev = priv_ptr->dev;
560*4882a593Smuzhiyun #define RTL_RX_QUOTA(budget) budget
561*4882a593Smuzhiyun #define RTL_NAPI_QUOTA_UPDATE(ndev, work_done, budget)
562*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
563*4882a593Smuzhiyun #define RTL_NETIF_RX_COMPLETE(dev, napi, work_done) netif_rx_complete(dev, napi)
564*4882a593Smuzhiyun #define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi) netif_rx_schedule_prep(dev, napi)
565*4882a593Smuzhiyun #define __RTL_NETIF_RX_SCHEDULE(dev, napi) __netif_rx_schedule(dev, napi)
566*4882a593Smuzhiyun #endif
567*4882a593Smuzhiyun #if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,29)
568*4882a593Smuzhiyun #define RTL_NETIF_RX_COMPLETE(dev, napi, work_done) netif_rx_complete(napi)
569*4882a593Smuzhiyun #define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi) netif_rx_schedule_prep(napi)
570*4882a593Smuzhiyun #define __RTL_NETIF_RX_SCHEDULE(dev, napi) __netif_rx_schedule(napi)
571*4882a593Smuzhiyun #endif
572*4882a593Smuzhiyun #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)
573*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0)
574*4882a593Smuzhiyun #define RTL_NETIF_RX_COMPLETE(dev, napi, work_done) napi_complete_done(napi, work_done)
575*4882a593Smuzhiyun #else
576*4882a593Smuzhiyun #define RTL_NETIF_RX_COMPLETE(dev, napi, work_done) napi_complete(napi)
577*4882a593Smuzhiyun #endif
578*4882a593Smuzhiyun #define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi) napi_schedule_prep(napi)
579*4882a593Smuzhiyun #define __RTL_NETIF_RX_SCHEDULE(dev, napi) __napi_schedule(napi)
580*4882a593Smuzhiyun #endif
581*4882a593Smuzhiyun #define RTL_NAPI_RETURN_VALUE work_done
582*4882a593Smuzhiyun #define RTL_NAPI_ENABLE(dev, napi) napi_enable(napi)
583*4882a593Smuzhiyun #define RTL_NAPI_DISABLE(dev, napi) napi_disable(napi)
584*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
587*4882a593Smuzhiyun #define RTL_NAPI_DEL(priv)
588*4882a593Smuzhiyun #else
589*4882a593Smuzhiyun #define RTL_NAPI_DEL(priv) netif_napi_del(&priv->napi)
590*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
591*4882a593Smuzhiyun
592*4882a593Smuzhiyun /*****************************************************************************/
593*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
594*4882a593Smuzhiyun #ifdef __CHECKER__
595*4882a593Smuzhiyun #define __iomem __attribute__((noderef, address_space(2)))
596*4882a593Smuzhiyun extern void __chk_io_ptr(void __iomem *);
597*4882a593Smuzhiyun #define __bitwise __attribute__((bitwise))
598*4882a593Smuzhiyun #else
599*4882a593Smuzhiyun #define __iomem
600*4882a593Smuzhiyun #define __chk_io_ptr(x) (void)0
601*4882a593Smuzhiyun #define __bitwise
602*4882a593Smuzhiyun #endif
603*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun /*****************************************************************************/
606*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8)
607*4882a593Smuzhiyun #ifdef __CHECKER__
608*4882a593Smuzhiyun #define __force __attribute__((force))
609*4882a593Smuzhiyun #else
610*4882a593Smuzhiyun #define __force
611*4882a593Smuzhiyun #endif
612*4882a593Smuzhiyun #endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8)
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun #ifndef module_param
615*4882a593Smuzhiyun #define module_param(v,t,p) MODULE_PARM(v, "i");
616*4882a593Smuzhiyun #endif
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun #ifndef PCI_DEVICE
619*4882a593Smuzhiyun #define PCI_DEVICE(vend,dev) \
620*4882a593Smuzhiyun .vendor = (vend), .device = (dev), \
621*4882a593Smuzhiyun .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
622*4882a593Smuzhiyun #endif
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun /*****************************************************************************/
625*4882a593Smuzhiyun /* 2.5.28 => 2.4.23 */
626*4882a593Smuzhiyun #if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) )
627*4882a593Smuzhiyun
_kc_synchronize_irq(void)628*4882a593Smuzhiyun static inline void _kc_synchronize_irq(void)
629*4882a593Smuzhiyun {
630*4882a593Smuzhiyun synchronize_irq();
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun #undef synchronize_irq
633*4882a593Smuzhiyun #define synchronize_irq(X) _kc_synchronize_irq()
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun #include <linux/tqueue.h>
636*4882a593Smuzhiyun #define work_struct tq_struct
637*4882a593Smuzhiyun #undef INIT_WORK
638*4882a593Smuzhiyun #define INIT_WORK(a,b,c) INIT_TQUEUE(a,(void (*)(void *))b,c)
639*4882a593Smuzhiyun #undef container_of
640*4882a593Smuzhiyun #define container_of list_entry
641*4882a593Smuzhiyun #define schedule_work schedule_task
642*4882a593Smuzhiyun #define flush_scheduled_work flush_scheduled_tasks
643*4882a593Smuzhiyun #endif /* 2.5.28 => 2.4.17 */
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun /*****************************************************************************/
646*4882a593Smuzhiyun /* 2.6.4 => 2.6.0 */
647*4882a593Smuzhiyun #if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) )
648*4882a593Smuzhiyun #define MODULE_VERSION(_version) MODULE_INFO(version, _version)
649*4882a593Smuzhiyun #endif /* 2.6.4 => 2.6.0 */
650*4882a593Smuzhiyun /*****************************************************************************/
651*4882a593Smuzhiyun /* 2.6.0 => 2.5.28 */
652*4882a593Smuzhiyun #if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) )
653*4882a593Smuzhiyun #define MODULE_INFO(version, _version)
654*4882a593Smuzhiyun #ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT
655*4882a593Smuzhiyun #define CONFIG_E1000_DISABLE_PACKET_SPLIT 1
656*4882a593Smuzhiyun #endif
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun #define pci_set_consistent_dma_mask(dev,mask) 1
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun #undef dev_put
661*4882a593Smuzhiyun #define dev_put(dev) __dev_put(dev)
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun #ifndef skb_fill_page_desc
664*4882a593Smuzhiyun #define skb_fill_page_desc _kc_skb_fill_page_desc
665*4882a593Smuzhiyun extern void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size);
666*4882a593Smuzhiyun #endif
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun #ifndef pci_dma_mapping_error
669*4882a593Smuzhiyun #define pci_dma_mapping_error _kc_pci_dma_mapping_error
_kc_pci_dma_mapping_error(dma_addr_t dma_addr)670*4882a593Smuzhiyun static inline int _kc_pci_dma_mapping_error(dma_addr_t dma_addr)
671*4882a593Smuzhiyun {
672*4882a593Smuzhiyun return dma_addr == 0;
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun #endif
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun #undef ALIGN
677*4882a593Smuzhiyun #define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun #endif /* 2.6.0 => 2.5.28 */
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun /*****************************************************************************/
682*4882a593Smuzhiyun /* 2.4.22 => 2.4.17 */
683*4882a593Smuzhiyun #if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) )
684*4882a593Smuzhiyun #define pci_name(x) ((x)->slot_name)
685*4882a593Smuzhiyun #endif /* 2.4.22 => 2.4.17 */
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun /*****************************************************************************/
688*4882a593Smuzhiyun /* 2.6.5 => 2.6.0 */
689*4882a593Smuzhiyun #if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) )
690*4882a593Smuzhiyun #define pci_dma_sync_single_for_cpu pci_dma_sync_single
691*4882a593Smuzhiyun #define pci_dma_sync_single_for_device pci_dma_sync_single_for_cpu
692*4882a593Smuzhiyun #endif /* 2.6.5 => 2.6.0 */
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun /*****************************************************************************/
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
697*4882a593Smuzhiyun /*
698*4882a593Smuzhiyun * initialize a work-struct's func and data pointers:
699*4882a593Smuzhiyun */
700*4882a593Smuzhiyun #define PREPARE_WORK(_work, _func, _data) \
701*4882a593Smuzhiyun do { \
702*4882a593Smuzhiyun (_work)->func = _func; \
703*4882a593Smuzhiyun (_work)->data = _data; \
704*4882a593Smuzhiyun } while (0)
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun #endif
707*4882a593Smuzhiyun /*****************************************************************************/
708*4882a593Smuzhiyun /* 2.6.4 => 2.6.0 */
709*4882a593Smuzhiyun #if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) && \
710*4882a593Smuzhiyun LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)) || \
711*4882a593Smuzhiyun (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \
712*4882a593Smuzhiyun LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)))
713*4882a593Smuzhiyun #define ETHTOOL_OPS_COMPAT
714*4882a593Smuzhiyun #endif /* 2.6.4 => 2.6.0 */
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun /*****************************************************************************/
717*4882a593Smuzhiyun /* Installations with ethtool version without eeprom, adapter id, or statistics
718*4882a593Smuzhiyun * support */
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun #ifndef ETH_GSTRING_LEN
721*4882a593Smuzhiyun #define ETH_GSTRING_LEN 32
722*4882a593Smuzhiyun #endif
723*4882a593Smuzhiyun
724*4882a593Smuzhiyun #ifndef ETHTOOL_GSTATS
725*4882a593Smuzhiyun #define ETHTOOL_GSTATS 0x1d
726*4882a593Smuzhiyun #undef ethtool_drvinfo
727*4882a593Smuzhiyun #define ethtool_drvinfo k_ethtool_drvinfo
728*4882a593Smuzhiyun struct k_ethtool_drvinfo {
729*4882a593Smuzhiyun u32 cmd;
730*4882a593Smuzhiyun char driver[32];
731*4882a593Smuzhiyun char version[32];
732*4882a593Smuzhiyun char fw_version[32];
733*4882a593Smuzhiyun char bus_info[32];
734*4882a593Smuzhiyun char reserved1[32];
735*4882a593Smuzhiyun char reserved2[16];
736*4882a593Smuzhiyun u32 n_stats;
737*4882a593Smuzhiyun u32 testinfo_len;
738*4882a593Smuzhiyun u32 eedump_len;
739*4882a593Smuzhiyun u32 regdump_len;
740*4882a593Smuzhiyun };
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun struct ethtool_stats {
743*4882a593Smuzhiyun u32 cmd;
744*4882a593Smuzhiyun u32 n_stats;
745*4882a593Smuzhiyun u64 data[0];
746*4882a593Smuzhiyun };
747*4882a593Smuzhiyun #endif /* ETHTOOL_GSTATS */
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun #ifndef ETHTOOL_PHYS_ID
750*4882a593Smuzhiyun #define ETHTOOL_PHYS_ID 0x1c
751*4882a593Smuzhiyun #endif /* ETHTOOL_PHYS_ID */
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun #ifndef ETHTOOL_GSTRINGS
754*4882a593Smuzhiyun #define ETHTOOL_GSTRINGS 0x1b
755*4882a593Smuzhiyun enum ethtool_stringset {
756*4882a593Smuzhiyun ETH_SS_TEST = 0,
757*4882a593Smuzhiyun ETH_SS_STATS,
758*4882a593Smuzhiyun };
759*4882a593Smuzhiyun struct ethtool_gstrings {
760*4882a593Smuzhiyun u32 cmd; /* ETHTOOL_GSTRINGS */
761*4882a593Smuzhiyun u32 string_set; /* string set id e.c. ETH_SS_TEST, etc*/
762*4882a593Smuzhiyun u32 len; /* number of strings in the string set */
763*4882a593Smuzhiyun u8 data[0];
764*4882a593Smuzhiyun };
765*4882a593Smuzhiyun #endif /* ETHTOOL_GSTRINGS */
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun #ifndef ETHTOOL_TEST
768*4882a593Smuzhiyun #define ETHTOOL_TEST 0x1a
769*4882a593Smuzhiyun enum ethtool_test_flags {
770*4882a593Smuzhiyun ETH_TEST_FL_OFFLINE = (1 << 0),
771*4882a593Smuzhiyun ETH_TEST_FL_FAILED = (1 << 1),
772*4882a593Smuzhiyun };
773*4882a593Smuzhiyun struct ethtool_test {
774*4882a593Smuzhiyun u32 cmd;
775*4882a593Smuzhiyun u32 flags;
776*4882a593Smuzhiyun u32 reserved;
777*4882a593Smuzhiyun u32 len;
778*4882a593Smuzhiyun u64 data[0];
779*4882a593Smuzhiyun };
780*4882a593Smuzhiyun #endif /* ETHTOOL_TEST */
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun #ifndef ETHTOOL_GEEPROM
783*4882a593Smuzhiyun #define ETHTOOL_GEEPROM 0xb
784*4882a593Smuzhiyun #undef ETHTOOL_GREGS
785*4882a593Smuzhiyun struct ethtool_eeprom {
786*4882a593Smuzhiyun u32 cmd;
787*4882a593Smuzhiyun u32 magic;
788*4882a593Smuzhiyun u32 offset;
789*4882a593Smuzhiyun u32 len;
790*4882a593Smuzhiyun u8 data[0];
791*4882a593Smuzhiyun };
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun struct ethtool_value {
794*4882a593Smuzhiyun u32 cmd;
795*4882a593Smuzhiyun u32 data;
796*4882a593Smuzhiyun };
797*4882a593Smuzhiyun #endif /* ETHTOOL_GEEPROM */
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun #ifndef ETHTOOL_GLINK
800*4882a593Smuzhiyun #define ETHTOOL_GLINK 0xa
801*4882a593Smuzhiyun #endif /* ETHTOOL_GLINK */
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun #ifndef ETHTOOL_GREGS
804*4882a593Smuzhiyun #define ETHTOOL_GREGS 0x00000004 /* Get NIC registers */
805*4882a593Smuzhiyun #define ethtool_regs _kc_ethtool_regs
806*4882a593Smuzhiyun /* for passing big chunks of data */
807*4882a593Smuzhiyun struct _kc_ethtool_regs {
808*4882a593Smuzhiyun u32 cmd;
809*4882a593Smuzhiyun u32 version; /* driver-specific, indicates different chips/revs */
810*4882a593Smuzhiyun u32 len; /* bytes */
811*4882a593Smuzhiyun u8 data[0];
812*4882a593Smuzhiyun };
813*4882a593Smuzhiyun #endif /* ETHTOOL_GREGS */
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun #ifndef ETHTOOL_GMSGLVL
816*4882a593Smuzhiyun #define ETHTOOL_GMSGLVL 0x00000007 /* Get driver message level */
817*4882a593Smuzhiyun #endif
818*4882a593Smuzhiyun #ifndef ETHTOOL_SMSGLVL
819*4882a593Smuzhiyun #define ETHTOOL_SMSGLVL 0x00000008 /* Set driver msg level, priv. */
820*4882a593Smuzhiyun #endif
821*4882a593Smuzhiyun #ifndef ETHTOOL_NWAY_RST
822*4882a593Smuzhiyun #define ETHTOOL_NWAY_RST 0x00000009 /* Restart autonegotiation, priv */
823*4882a593Smuzhiyun #endif
824*4882a593Smuzhiyun #ifndef ETHTOOL_GLINK
825*4882a593Smuzhiyun #define ETHTOOL_GLINK 0x0000000a /* Get link status */
826*4882a593Smuzhiyun #endif
827*4882a593Smuzhiyun #ifndef ETHTOOL_GEEPROM
828*4882a593Smuzhiyun #define ETHTOOL_GEEPROM 0x0000000b /* Get EEPROM data */
829*4882a593Smuzhiyun #endif
830*4882a593Smuzhiyun #ifndef ETHTOOL_SEEPROM
831*4882a593Smuzhiyun #define ETHTOOL_SEEPROM 0x0000000c /* Set EEPROM data */
832*4882a593Smuzhiyun #endif
833*4882a593Smuzhiyun #ifndef ETHTOOL_GCOALESCE
834*4882a593Smuzhiyun #define ETHTOOL_GCOALESCE 0x0000000e /* Get coalesce config */
835*4882a593Smuzhiyun /* for configuring coalescing parameters of chip */
836*4882a593Smuzhiyun #define ethtool_coalesce _kc_ethtool_coalesce
837*4882a593Smuzhiyun struct _kc_ethtool_coalesce {
838*4882a593Smuzhiyun u32 cmd; /* ETHTOOL_{G,S}COALESCE */
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun /* How many usecs to delay an RX interrupt after
841*4882a593Smuzhiyun * a packet arrives. If 0, only rx_max_coalesced_frames
842*4882a593Smuzhiyun * is used.
843*4882a593Smuzhiyun */
844*4882a593Smuzhiyun u32 rx_coalesce_usecs;
845*4882a593Smuzhiyun
846*4882a593Smuzhiyun /* How many packets to delay an RX interrupt after
847*4882a593Smuzhiyun * a packet arrives. If 0, only rx_coalesce_usecs is
848*4882a593Smuzhiyun * used. It is illegal to set both usecs and max frames
849*4882a593Smuzhiyun * to zero as this would cause RX interrupts to never be
850*4882a593Smuzhiyun * generated.
851*4882a593Smuzhiyun */
852*4882a593Smuzhiyun u32 rx_max_coalesced_frames;
853*4882a593Smuzhiyun
854*4882a593Smuzhiyun /* Same as above two parameters, except that these values
855*4882a593Smuzhiyun * apply while an IRQ is being serviced by the host. Not
856*4882a593Smuzhiyun * all cards support this feature and the values are ignored
857*4882a593Smuzhiyun * in that case.
858*4882a593Smuzhiyun */
859*4882a593Smuzhiyun u32 rx_coalesce_usecs_irq;
860*4882a593Smuzhiyun u32 rx_max_coalesced_frames_irq;
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun /* How many usecs to delay a TX interrupt after
863*4882a593Smuzhiyun * a packet is sent. If 0, only tx_max_coalesced_frames
864*4882a593Smuzhiyun * is used.
865*4882a593Smuzhiyun */
866*4882a593Smuzhiyun u32 tx_coalesce_usecs;
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun /* How many packets to delay a TX interrupt after
869*4882a593Smuzhiyun * a packet is sent. If 0, only tx_coalesce_usecs is
870*4882a593Smuzhiyun * used. It is illegal to set both usecs and max frames
871*4882a593Smuzhiyun * to zero as this would cause TX interrupts to never be
872*4882a593Smuzhiyun * generated.
873*4882a593Smuzhiyun */
874*4882a593Smuzhiyun u32 tx_max_coalesced_frames;
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun /* Same as above two parameters, except that these values
877*4882a593Smuzhiyun * apply while an IRQ is being serviced by the host. Not
878*4882a593Smuzhiyun * all cards support this feature and the values are ignored
879*4882a593Smuzhiyun * in that case.
880*4882a593Smuzhiyun */
881*4882a593Smuzhiyun u32 tx_coalesce_usecs_irq;
882*4882a593Smuzhiyun u32 tx_max_coalesced_frames_irq;
883*4882a593Smuzhiyun
884*4882a593Smuzhiyun /* How many usecs to delay in-memory statistics
885*4882a593Smuzhiyun * block updates. Some drivers do not have an in-memory
886*4882a593Smuzhiyun * statistic block, and in such cases this value is ignored.
887*4882a593Smuzhiyun * This value must not be zero.
888*4882a593Smuzhiyun */
889*4882a593Smuzhiyun u32 stats_block_coalesce_usecs;
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun /* Adaptive RX/TX coalescing is an algorithm implemented by
892*4882a593Smuzhiyun * some drivers to improve latency under low packet rates and
893*4882a593Smuzhiyun * improve throughput under high packet rates. Some drivers
894*4882a593Smuzhiyun * only implement one of RX or TX adaptive coalescing. Anything
895*4882a593Smuzhiyun * not implemented by the driver causes these values to be
896*4882a593Smuzhiyun * silently ignored.
897*4882a593Smuzhiyun */
898*4882a593Smuzhiyun u32 use_adaptive_rx_coalesce;
899*4882a593Smuzhiyun u32 use_adaptive_tx_coalesce;
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun /* When the packet rate (measured in packets per second)
902*4882a593Smuzhiyun * is below pkt_rate_low, the {rx,tx}_*_low parameters are
903*4882a593Smuzhiyun * used.
904*4882a593Smuzhiyun */
905*4882a593Smuzhiyun u32 pkt_rate_low;
906*4882a593Smuzhiyun u32 rx_coalesce_usecs_low;
907*4882a593Smuzhiyun u32 rx_max_coalesced_frames_low;
908*4882a593Smuzhiyun u32 tx_coalesce_usecs_low;
909*4882a593Smuzhiyun u32 tx_max_coalesced_frames_low;
910*4882a593Smuzhiyun
911*4882a593Smuzhiyun /* When the packet rate is below pkt_rate_high but above
912*4882a593Smuzhiyun * pkt_rate_low (both measured in packets per second) the
913*4882a593Smuzhiyun * normal {rx,tx}_* coalescing parameters are used.
914*4882a593Smuzhiyun */
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun /* When the packet rate is (measured in packets per second)
917*4882a593Smuzhiyun * is above pkt_rate_high, the {rx,tx}_*_high parameters are
918*4882a593Smuzhiyun * used.
919*4882a593Smuzhiyun */
920*4882a593Smuzhiyun u32 pkt_rate_high;
921*4882a593Smuzhiyun u32 rx_coalesce_usecs_high;
922*4882a593Smuzhiyun u32 rx_max_coalesced_frames_high;
923*4882a593Smuzhiyun u32 tx_coalesce_usecs_high;
924*4882a593Smuzhiyun u32 tx_max_coalesced_frames_high;
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun /* How often to do adaptive coalescing packet rate sampling,
927*4882a593Smuzhiyun * measured in seconds. Must not be zero.
928*4882a593Smuzhiyun */
929*4882a593Smuzhiyun u32 rate_sample_interval;
930*4882a593Smuzhiyun };
931*4882a593Smuzhiyun #endif /* ETHTOOL_GCOALESCE */
932*4882a593Smuzhiyun
933*4882a593Smuzhiyun #ifndef ETHTOOL_SCOALESCE
934*4882a593Smuzhiyun #define ETHTOOL_SCOALESCE 0x0000000f /* Set coalesce config. */
935*4882a593Smuzhiyun #endif
936*4882a593Smuzhiyun #ifndef ETHTOOL_GRINGPARAM
937*4882a593Smuzhiyun #define ETHTOOL_GRINGPARAM 0x00000010 /* Get ring parameters */
938*4882a593Smuzhiyun /* for configuring RX/TX ring parameters */
939*4882a593Smuzhiyun #define ethtool_ringparam _kc_ethtool_ringparam
940*4882a593Smuzhiyun struct _kc_ethtool_ringparam {
941*4882a593Smuzhiyun u32 cmd; /* ETHTOOL_{G,S}RINGPARAM */
942*4882a593Smuzhiyun
943*4882a593Smuzhiyun /* Read only attributes. These indicate the maximum number
944*4882a593Smuzhiyun * of pending RX/TX ring entries the driver will allow the
945*4882a593Smuzhiyun * user to set.
946*4882a593Smuzhiyun */
947*4882a593Smuzhiyun u32 rx_max_pending;
948*4882a593Smuzhiyun u32 rx_mini_max_pending;
949*4882a593Smuzhiyun u32 rx_jumbo_max_pending;
950*4882a593Smuzhiyun u32 tx_max_pending;
951*4882a593Smuzhiyun
952*4882a593Smuzhiyun /* Values changeable by the user. The valid values are
953*4882a593Smuzhiyun * in the range 1 to the "*_max_pending" counterpart above.
954*4882a593Smuzhiyun */
955*4882a593Smuzhiyun u32 rx_pending;
956*4882a593Smuzhiyun u32 rx_mini_pending;
957*4882a593Smuzhiyun u32 rx_jumbo_pending;
958*4882a593Smuzhiyun u32 tx_pending;
959*4882a593Smuzhiyun };
960*4882a593Smuzhiyun #endif /* ETHTOOL_GRINGPARAM */
961*4882a593Smuzhiyun
962*4882a593Smuzhiyun #ifndef ETHTOOL_SRINGPARAM
963*4882a593Smuzhiyun #define ETHTOOL_SRINGPARAM 0x00000011 /* Set ring parameters, priv. */
964*4882a593Smuzhiyun #endif
965*4882a593Smuzhiyun #ifndef ETHTOOL_GPAUSEPARAM
966*4882a593Smuzhiyun #define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */
967*4882a593Smuzhiyun /* for configuring link flow control parameters */
968*4882a593Smuzhiyun #define ethtool_pauseparam _kc_ethtool_pauseparam
969*4882a593Smuzhiyun struct _kc_ethtool_pauseparam {
970*4882a593Smuzhiyun u32 cmd; /* ETHTOOL_{G,S}PAUSEPARAM */
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun /* If the link is being auto-negotiated (via ethtool_cmd.autoneg
973*4882a593Smuzhiyun * being true) the user may set 'autonet' here non-zero to have the
974*4882a593Smuzhiyun * pause parameters be auto-negotiated too. In such a case, the
975*4882a593Smuzhiyun * {rx,tx}_pause values below determine what capabilities are
976*4882a593Smuzhiyun * advertised.
977*4882a593Smuzhiyun *
978*4882a593Smuzhiyun * If 'autoneg' is zero or the link is not being auto-negotiated,
979*4882a593Smuzhiyun * then {rx,tx}_pause force the driver to use/not-use pause
980*4882a593Smuzhiyun * flow control.
981*4882a593Smuzhiyun */
982*4882a593Smuzhiyun u32 autoneg;
983*4882a593Smuzhiyun u32 rx_pause;
984*4882a593Smuzhiyun u32 tx_pause;
985*4882a593Smuzhiyun };
986*4882a593Smuzhiyun #endif /* ETHTOOL_GPAUSEPARAM */
987*4882a593Smuzhiyun
988*4882a593Smuzhiyun #ifndef ETHTOOL_SPAUSEPARAM
989*4882a593Smuzhiyun #define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */
990*4882a593Smuzhiyun #endif
991*4882a593Smuzhiyun #ifndef ETHTOOL_GRXCSUM
992*4882a593Smuzhiyun #define ETHTOOL_GRXCSUM 0x00000014 /* Get RX hw csum enable (ethtool_value) */
993*4882a593Smuzhiyun #endif
994*4882a593Smuzhiyun #ifndef ETHTOOL_SRXCSUM
995*4882a593Smuzhiyun #define ETHTOOL_SRXCSUM 0x00000015 /* Set RX hw csum enable (ethtool_value) */
996*4882a593Smuzhiyun #endif
997*4882a593Smuzhiyun #ifndef ETHTOOL_GTXCSUM
998*4882a593Smuzhiyun #define ETHTOOL_GTXCSUM 0x00000016 /* Get TX hw csum enable (ethtool_value) */
999*4882a593Smuzhiyun #endif
1000*4882a593Smuzhiyun #ifndef ETHTOOL_STXCSUM
1001*4882a593Smuzhiyun #define ETHTOOL_STXCSUM 0x00000017 /* Set TX hw csum enable (ethtool_value) */
1002*4882a593Smuzhiyun #endif
1003*4882a593Smuzhiyun #ifndef ETHTOOL_GSG
1004*4882a593Smuzhiyun #define ETHTOOL_GSG 0x00000018 /* Get scatter-gather enable
1005*4882a593Smuzhiyun * (ethtool_value) */
1006*4882a593Smuzhiyun #endif
1007*4882a593Smuzhiyun #ifndef ETHTOOL_SSG
1008*4882a593Smuzhiyun #define ETHTOOL_SSG 0x00000019 /* Set scatter-gather enable
1009*4882a593Smuzhiyun * (ethtool_value). */
1010*4882a593Smuzhiyun #endif
1011*4882a593Smuzhiyun #ifndef ETHTOOL_TEST
1012*4882a593Smuzhiyun #define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */
1013*4882a593Smuzhiyun #endif
1014*4882a593Smuzhiyun #ifndef ETHTOOL_GSTRINGS
1015*4882a593Smuzhiyun #define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */
1016*4882a593Smuzhiyun #endif
1017*4882a593Smuzhiyun #ifndef ETHTOOL_PHYS_ID
1018*4882a593Smuzhiyun #define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */
1019*4882a593Smuzhiyun #endif
1020*4882a593Smuzhiyun #ifndef ETHTOOL_GSTATS
1021*4882a593Smuzhiyun #define ETHTOOL_GSTATS 0x0000001d /* get NIC-specific statistics */
1022*4882a593Smuzhiyun #endif
1023*4882a593Smuzhiyun #ifndef ETHTOOL_GTSO
1024*4882a593Smuzhiyun #define ETHTOOL_GTSO 0x0000001e /* Get TSO enable (ethtool_value) */
1025*4882a593Smuzhiyun #endif
1026*4882a593Smuzhiyun #ifndef ETHTOOL_STSO
1027*4882a593Smuzhiyun #define ETHTOOL_STSO 0x0000001f /* Set TSO enable (ethtool_value) */
1028*4882a593Smuzhiyun #endif
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun #ifndef ETHTOOL_BUSINFO_LEN
1031*4882a593Smuzhiyun #define ETHTOOL_BUSINFO_LEN 32
1032*4882a593Smuzhiyun #endif
1033*4882a593Smuzhiyun
1034*4882a593Smuzhiyun /*****************************************************************************/
1035*4882a593Smuzhiyun
1036*4882a593Smuzhiyun enum RTL8168_DSM_STATE {
1037*4882a593Smuzhiyun DSM_MAC_INIT = 1,
1038*4882a593Smuzhiyun DSM_NIC_GOTO_D3 = 2,
1039*4882a593Smuzhiyun DSM_IF_DOWN = 3,
1040*4882a593Smuzhiyun DSM_NIC_RESUME_D3 = 4,
1041*4882a593Smuzhiyun DSM_IF_UP = 5,
1042*4882a593Smuzhiyun };
1043*4882a593Smuzhiyun
1044*4882a593Smuzhiyun enum RTL8168_registers {
1045*4882a593Smuzhiyun MAC0 = 0x00, /* Ethernet hardware address. */
1046*4882a593Smuzhiyun MAC4 = 0x04,
1047*4882a593Smuzhiyun MAR0 = 0x08, /* Multicast filter. */
1048*4882a593Smuzhiyun CounterAddrLow = 0x10,
1049*4882a593Smuzhiyun CounterAddrHigh = 0x14,
1050*4882a593Smuzhiyun CustomLED = 0x18,
1051*4882a593Smuzhiyun TxDescStartAddrLow = 0x20,
1052*4882a593Smuzhiyun TxDescStartAddrHigh = 0x24,
1053*4882a593Smuzhiyun TxHDescStartAddrLow = 0x28,
1054*4882a593Smuzhiyun TxHDescStartAddrHigh = 0x2c,
1055*4882a593Smuzhiyun FLASH = 0x30,
1056*4882a593Smuzhiyun ERSR = 0x36,
1057*4882a593Smuzhiyun ChipCmd = 0x37,
1058*4882a593Smuzhiyun TxPoll = 0x38,
1059*4882a593Smuzhiyun IntrMask = 0x3C,
1060*4882a593Smuzhiyun IntrStatus = 0x3E,
1061*4882a593Smuzhiyun TxConfig = 0x40,
1062*4882a593Smuzhiyun RxConfig = 0x44,
1063*4882a593Smuzhiyun TCTR = 0x48,
1064*4882a593Smuzhiyun Cfg9346 = 0x50,
1065*4882a593Smuzhiyun Config0 = 0x51,
1066*4882a593Smuzhiyun Config1 = 0x52,
1067*4882a593Smuzhiyun Config2 = 0x53,
1068*4882a593Smuzhiyun Config3 = 0x54,
1069*4882a593Smuzhiyun Config4 = 0x55,
1070*4882a593Smuzhiyun Config5 = 0x56,
1071*4882a593Smuzhiyun TDFNR = 0x57,
1072*4882a593Smuzhiyun TimeInt0 = 0x58,
1073*4882a593Smuzhiyun TimeInt1 = 0x5C,
1074*4882a593Smuzhiyun PHYAR = 0x60,
1075*4882a593Smuzhiyun CSIDR = 0x64,
1076*4882a593Smuzhiyun CSIAR = 0x68,
1077*4882a593Smuzhiyun PHYstatus = 0x6C,
1078*4882a593Smuzhiyun MACDBG = 0x6D,
1079*4882a593Smuzhiyun GPIO = 0x6E,
1080*4882a593Smuzhiyun PMCH = 0x6F,
1081*4882a593Smuzhiyun ERIDR = 0x70,
1082*4882a593Smuzhiyun ERIAR = 0x74,
1083*4882a593Smuzhiyun EPHY_RXER_NUM = 0x7C,
1084*4882a593Smuzhiyun EPHYAR = 0x80,
1085*4882a593Smuzhiyun TimeInt2 = 0x8C,
1086*4882a593Smuzhiyun OCPDR = 0xB0,
1087*4882a593Smuzhiyun MACOCP = 0xB0,
1088*4882a593Smuzhiyun OCPAR = 0xB4,
1089*4882a593Smuzhiyun SecMAC0 = 0xB4,
1090*4882a593Smuzhiyun SecMAC4 = 0xB8,
1091*4882a593Smuzhiyun PHYOCP = 0xB8,
1092*4882a593Smuzhiyun DBG_reg = 0xD1,
1093*4882a593Smuzhiyun TwiCmdReg = 0xD2,
1094*4882a593Smuzhiyun MCUCmd_reg = 0xD3,
1095*4882a593Smuzhiyun RxMaxSize = 0xDA,
1096*4882a593Smuzhiyun EFUSEAR = 0xDC,
1097*4882a593Smuzhiyun CPlusCmd = 0xE0,
1098*4882a593Smuzhiyun IntrMitigate = 0xE2,
1099*4882a593Smuzhiyun RxDescAddrLow = 0xE4,
1100*4882a593Smuzhiyun RxDescAddrHigh = 0xE8,
1101*4882a593Smuzhiyun MTPS = 0xEC,
1102*4882a593Smuzhiyun FuncEvent = 0xF0,
1103*4882a593Smuzhiyun PPSW = 0xF2,
1104*4882a593Smuzhiyun FuncEventMask = 0xF4,
1105*4882a593Smuzhiyun TimeInt3 = 0xF4,
1106*4882a593Smuzhiyun FuncPresetState = 0xF8,
1107*4882a593Smuzhiyun CMAC_IBCR0 = 0xF8,
1108*4882a593Smuzhiyun CMAC_IBCR2 = 0xF9,
1109*4882a593Smuzhiyun CMAC_IBIMR0 = 0xFA,
1110*4882a593Smuzhiyun CMAC_IBISR0 = 0xFB,
1111*4882a593Smuzhiyun FuncForceEvent = 0xFC,
1112*4882a593Smuzhiyun };
1113*4882a593Smuzhiyun
1114*4882a593Smuzhiyun enum RTL8168_register_content {
1115*4882a593Smuzhiyun /* InterruptStatusBits */
1116*4882a593Smuzhiyun SYSErr = 0x8000,
1117*4882a593Smuzhiyun PCSTimeout = 0x4000,
1118*4882a593Smuzhiyun SWInt = 0x0100,
1119*4882a593Smuzhiyun TxDescUnavail = 0x0080,
1120*4882a593Smuzhiyun RxFIFOOver = 0x0040,
1121*4882a593Smuzhiyun LinkChg = 0x0020,
1122*4882a593Smuzhiyun RxDescUnavail = 0x0010,
1123*4882a593Smuzhiyun TxErr = 0x0008,
1124*4882a593Smuzhiyun TxOK = 0x0004,
1125*4882a593Smuzhiyun RxErr = 0x0002,
1126*4882a593Smuzhiyun RxOK = 0x0001,
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun /* RxStatusDesc */
1129*4882a593Smuzhiyun RxRWT = (1 << 22),
1130*4882a593Smuzhiyun RxRES = (1 << 21),
1131*4882a593Smuzhiyun RxRUNT = (1 << 20),
1132*4882a593Smuzhiyun RxCRC = (1 << 19),
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun /* ChipCmdBits */
1135*4882a593Smuzhiyun StopReq = 0x80,
1136*4882a593Smuzhiyun CmdReset = 0x10,
1137*4882a593Smuzhiyun CmdRxEnb = 0x08,
1138*4882a593Smuzhiyun CmdTxEnb = 0x04,
1139*4882a593Smuzhiyun RxBufEmpty = 0x01,
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun /* Cfg9346Bits */
1142*4882a593Smuzhiyun Cfg9346_Lock = 0x00,
1143*4882a593Smuzhiyun Cfg9346_Unlock = 0xC0,
1144*4882a593Smuzhiyun Cfg9346_EEDO = (1 << 0),
1145*4882a593Smuzhiyun Cfg9346_EEDI = (1 << 1),
1146*4882a593Smuzhiyun Cfg9346_EESK = (1 << 2),
1147*4882a593Smuzhiyun Cfg9346_EECS = (1 << 3),
1148*4882a593Smuzhiyun Cfg9346_EEM0 = (1 << 6),
1149*4882a593Smuzhiyun Cfg9346_EEM1 = (1 << 7),
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyun /* rx_mode_bits */
1152*4882a593Smuzhiyun AcceptErr = 0x20,
1153*4882a593Smuzhiyun AcceptRunt = 0x10,
1154*4882a593Smuzhiyun AcceptBroadcast = 0x08,
1155*4882a593Smuzhiyun AcceptMulticast = 0x04,
1156*4882a593Smuzhiyun AcceptMyPhys = 0x02,
1157*4882a593Smuzhiyun AcceptAllPhys = 0x01,
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun /* Transmit Priority Polling*/
1160*4882a593Smuzhiyun HPQ = 0x80,
1161*4882a593Smuzhiyun NPQ = 0x40,
1162*4882a593Smuzhiyun FSWInt = 0x01,
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun /* RxConfigBits */
1165*4882a593Smuzhiyun Reserved2_shift = 13,
1166*4882a593Smuzhiyun RxCfgDMAShift = 8,
1167*4882a593Smuzhiyun RxCfg_128_int_en = (1 << 15),
1168*4882a593Smuzhiyun RxCfg_fet_multi_en = (1 << 14),
1169*4882a593Smuzhiyun RxCfg_half_refetch = (1 << 13),
1170*4882a593Smuzhiyun RxCfg_9356SEL = (1 << 6),
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun /* TxConfigBits */
1173*4882a593Smuzhiyun TxInterFrameGapShift = 24,
1174*4882a593Smuzhiyun TxDMAShift = 8, /* DMA burst value (0-7) is shift this many bits */
1175*4882a593Smuzhiyun TxMACLoopBack = (1 << 17), /* MAC loopback */
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun /* Config1 register */
1178*4882a593Smuzhiyun LEDS1 = (1 << 7),
1179*4882a593Smuzhiyun LEDS0 = (1 << 6),
1180*4882a593Smuzhiyun Speed_down = (1 << 4),
1181*4882a593Smuzhiyun MEMMAP = (1 << 3),
1182*4882a593Smuzhiyun IOMAP = (1 << 2),
1183*4882a593Smuzhiyun VPD = (1 << 1),
1184*4882a593Smuzhiyun PMEnable = (1 << 0), /* Power Management Enable */
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun /* Config2 register */
1187*4882a593Smuzhiyun ClkReqEn = (1 << 7), /* Clock Request Enable */
1188*4882a593Smuzhiyun PMSTS_En = (1 << 5),
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun /* Config3 register */
1191*4882a593Smuzhiyun Isolate_en = (1 << 12), /* Isolate enable */
1192*4882a593Smuzhiyun MagicPacket = (1 << 5), /* Wake up when receives a Magic Packet */
1193*4882a593Smuzhiyun LinkUp = (1 << 4), /* This bit is reserved in RTL8168B.*/
1194*4882a593Smuzhiyun /* Wake up when the cable connection is re-established */
1195*4882a593Smuzhiyun ECRCEN = (1 << 3), /* This bit is reserved in RTL8168B*/
1196*4882a593Smuzhiyun Jumbo_En0 = (1 << 2), /* This bit is reserved in RTL8168B*/
1197*4882a593Smuzhiyun RDY_TO_L23 = (1 << 1), /* This bit is reserved in RTL8168B*/
1198*4882a593Smuzhiyun Beacon_en = (1 << 0), /* This bit is reserved in RTL8168B*/
1199*4882a593Smuzhiyun
1200*4882a593Smuzhiyun /* Config4 register */
1201*4882a593Smuzhiyun Jumbo_En1 = (1 << 1), /* This bit is reserved in RTL8168B*/
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun /* Config5 register */
1204*4882a593Smuzhiyun BWF = (1 << 6), /* Accept Broadcast wakeup frame */
1205*4882a593Smuzhiyun MWF = (1 << 5), /* Accept Multicast wakeup frame */
1206*4882a593Smuzhiyun UWF = (1 << 4), /* Accept Unicast wakeup frame */
1207*4882a593Smuzhiyun LanWake = (1 << 1), /* LanWake enable/disable */
1208*4882a593Smuzhiyun PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */
1209*4882a593Smuzhiyun ASPM_en = (1 << 0), /* ASPM enable */
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun /* CPlusCmd */
1212*4882a593Smuzhiyun EnableBist = (1 << 15),
1213*4882a593Smuzhiyun Macdbgo_oe = (1 << 14),
1214*4882a593Smuzhiyun Normal_mode = (1 << 13),
1215*4882a593Smuzhiyun Force_halfdup = (1 << 12),
1216*4882a593Smuzhiyun Force_rxflow_en = (1 << 11),
1217*4882a593Smuzhiyun Force_txflow_en = (1 << 10),
1218*4882a593Smuzhiyun Cxpl_dbg_sel = (1 << 9),//This bit is reserved in RTL8168B
1219*4882a593Smuzhiyun ASF = (1 << 8),//This bit is reserved in RTL8168C
1220*4882a593Smuzhiyun PktCntrDisable = (1 << 7),
1221*4882a593Smuzhiyun RxVlan = (1 << 6),
1222*4882a593Smuzhiyun RxChkSum = (1 << 5),
1223*4882a593Smuzhiyun Macdbgo_sel = 0x001C,
1224*4882a593Smuzhiyun INTT_0 = 0x0000,
1225*4882a593Smuzhiyun INTT_1 = 0x0001,
1226*4882a593Smuzhiyun INTT_2 = 0x0002,
1227*4882a593Smuzhiyun INTT_3 = 0x0003,
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun /* rtl8168_PHYstatus */
1230*4882a593Smuzhiyun PowerSaveStatus = 0x80,
1231*4882a593Smuzhiyun TxFlowCtrl = 0x40,
1232*4882a593Smuzhiyun RxFlowCtrl = 0x20,
1233*4882a593Smuzhiyun _1000bpsF = 0x10,
1234*4882a593Smuzhiyun _100bps = 0x08,
1235*4882a593Smuzhiyun _10bps = 0x04,
1236*4882a593Smuzhiyun LinkStatus = 0x02,
1237*4882a593Smuzhiyun FullDup = 0x01,
1238*4882a593Smuzhiyun
1239*4882a593Smuzhiyun /* DBG_reg */
1240*4882a593Smuzhiyun Fix_Nak_1 = (1 << 4),
1241*4882a593Smuzhiyun Fix_Nak_2 = (1 << 3),
1242*4882a593Smuzhiyun DBGPIN_E2 = (1 << 0),
1243*4882a593Smuzhiyun
1244*4882a593Smuzhiyun /* ResetCounterCommand */
1245*4882a593Smuzhiyun CounterReset = 0x1,
1246*4882a593Smuzhiyun /* DumpCounterCommand */
1247*4882a593Smuzhiyun CounterDump = 0x8,
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun /* PHY access */
1250*4882a593Smuzhiyun PHYAR_Flag = 0x80000000,
1251*4882a593Smuzhiyun PHYAR_Write = 0x80000000,
1252*4882a593Smuzhiyun PHYAR_Read = 0x00000000,
1253*4882a593Smuzhiyun PHYAR_Reg_Mask = 0x1f,
1254*4882a593Smuzhiyun PHYAR_Reg_shift = 16,
1255*4882a593Smuzhiyun PHYAR_Data_Mask = 0xffff,
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun /* EPHY access */
1258*4882a593Smuzhiyun EPHYAR_Flag = 0x80000000,
1259*4882a593Smuzhiyun EPHYAR_Write = 0x80000000,
1260*4882a593Smuzhiyun EPHYAR_Read = 0x00000000,
1261*4882a593Smuzhiyun EPHYAR_Reg_Mask = 0x3f,
1262*4882a593Smuzhiyun EPHYAR_Reg_shift = 16,
1263*4882a593Smuzhiyun EPHYAR_Data_Mask = 0xffff,
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun /* CSI access */
1266*4882a593Smuzhiyun CSIAR_Flag = 0x80000000,
1267*4882a593Smuzhiyun CSIAR_Write = 0x80000000,
1268*4882a593Smuzhiyun CSIAR_Read = 0x00000000,
1269*4882a593Smuzhiyun CSIAR_ByteEn = 0x0f,
1270*4882a593Smuzhiyun CSIAR_ByteEn_shift = 12,
1271*4882a593Smuzhiyun CSIAR_Addr_Mask = 0x0fff,
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun /* ERI access */
1274*4882a593Smuzhiyun ERIAR_Flag = 0x80000000,
1275*4882a593Smuzhiyun ERIAR_Write = 0x80000000,
1276*4882a593Smuzhiyun ERIAR_Read = 0x00000000,
1277*4882a593Smuzhiyun ERIAR_Addr_Align = 4, /* ERI access register address must be 4 byte alignment */
1278*4882a593Smuzhiyun ERIAR_ExGMAC = 0,
1279*4882a593Smuzhiyun ERIAR_MSIX = 1,
1280*4882a593Smuzhiyun ERIAR_ASF = 2,
1281*4882a593Smuzhiyun ERIAR_OOB = 2,
1282*4882a593Smuzhiyun ERIAR_Type_shift = 16,
1283*4882a593Smuzhiyun ERIAR_ByteEn = 0x0f,
1284*4882a593Smuzhiyun ERIAR_ByteEn_shift = 12,
1285*4882a593Smuzhiyun
1286*4882a593Smuzhiyun /* OCP GPHY access */
1287*4882a593Smuzhiyun OCPDR_Write = 0x80000000,
1288*4882a593Smuzhiyun OCPDR_Read = 0x00000000,
1289*4882a593Smuzhiyun OCPDR_Reg_Mask = 0xFF,
1290*4882a593Smuzhiyun OCPDR_Data_Mask = 0xFFFF,
1291*4882a593Smuzhiyun OCPDR_GPHY_Reg_shift = 16,
1292*4882a593Smuzhiyun OCPAR_Flag = 0x80000000,
1293*4882a593Smuzhiyun OCPAR_GPHY_Write = 0x8000F060,
1294*4882a593Smuzhiyun OCPAR_GPHY_Read = 0x0000F060,
1295*4882a593Smuzhiyun OCPR_Write = 0x80000000,
1296*4882a593Smuzhiyun OCPR_Read = 0x00000000,
1297*4882a593Smuzhiyun OCPR_Addr_Reg_shift = 16,
1298*4882a593Smuzhiyun OCPR_Flag = 0x80000000,
1299*4882a593Smuzhiyun OCP_STD_PHY_BASE_PAGE = 0x0A40,
1300*4882a593Smuzhiyun
1301*4882a593Smuzhiyun /* MCU Command */
1302*4882a593Smuzhiyun Now_is_oob = (1 << 7),
1303*4882a593Smuzhiyun Txfifo_empty = (1 << 5),
1304*4882a593Smuzhiyun Rxfifo_empty = (1 << 4),
1305*4882a593Smuzhiyun
1306*4882a593Smuzhiyun /* E-FUSE access */
1307*4882a593Smuzhiyun EFUSE_WRITE = 0x80000000,
1308*4882a593Smuzhiyun EFUSE_WRITE_OK = 0x00000000,
1309*4882a593Smuzhiyun EFUSE_READ = 0x00000000,
1310*4882a593Smuzhiyun EFUSE_READ_OK = 0x80000000,
1311*4882a593Smuzhiyun EFUSE_WRITE_V3 = 0x40000000,
1312*4882a593Smuzhiyun EFUSE_WRITE_OK_V3 = 0x00000000,
1313*4882a593Smuzhiyun EFUSE_READ_V3 = 0x80000000,
1314*4882a593Smuzhiyun EFUSE_READ_OK_V3 = 0x00000000,
1315*4882a593Smuzhiyun EFUSE_Reg_Mask = 0x03FF,
1316*4882a593Smuzhiyun EFUSE_Reg_Shift = 8,
1317*4882a593Smuzhiyun EFUSE_Check_Cnt = 300,
1318*4882a593Smuzhiyun EFUSE_READ_FAIL = 0xFF,
1319*4882a593Smuzhiyun EFUSE_Data_Mask = 0x000000FF,
1320*4882a593Smuzhiyun
1321*4882a593Smuzhiyun /* GPIO */
1322*4882a593Smuzhiyun GPIO_en = (1 << 0),
1323*4882a593Smuzhiyun
1324*4882a593Smuzhiyun };
1325*4882a593Smuzhiyun
1326*4882a593Smuzhiyun enum _DescStatusBit {
1327*4882a593Smuzhiyun DescOwn = (1 << 31), /* Descriptor is owned by NIC */
1328*4882a593Smuzhiyun RingEnd = (1 << 30), /* End of descriptor ring */
1329*4882a593Smuzhiyun FirstFrag = (1 << 29), /* First segment of a packet */
1330*4882a593Smuzhiyun LastFrag = (1 << 28), /* Final segment of a packet */
1331*4882a593Smuzhiyun
1332*4882a593Smuzhiyun /* Tx private */
1333*4882a593Smuzhiyun /*------ offset 0 of tx descriptor ------*/
1334*4882a593Smuzhiyun LargeSend = (1 << 27), /* TCP Large Send Offload (TSO) */
1335*4882a593Smuzhiyun GiantSendv4 = (1 << 26), /* TCP Giant Send Offload V4 (GSOv4) */
1336*4882a593Smuzhiyun GiantSendv6 = (1 << 25), /* TCP Giant Send Offload V6 (GSOv6) */
1337*4882a593Smuzhiyun LargeSend_DP = (1 << 16), /* TCP Large Send Offload (TSO) */
1338*4882a593Smuzhiyun MSSShift = 16, /* MSS value position */
1339*4882a593Smuzhiyun MSSMask = 0x7FFU, /* MSS value 11 bits */
1340*4882a593Smuzhiyun TxIPCS = (1 << 18), /* Calculate IP checksum */
1341*4882a593Smuzhiyun TxUDPCS = (1 << 17), /* Calculate UDP/IP checksum */
1342*4882a593Smuzhiyun TxTCPCS = (1 << 16), /* Calculate TCP/IP checksum */
1343*4882a593Smuzhiyun TxVlanTag = (1 << 17), /* Add VLAN tag */
1344*4882a593Smuzhiyun
1345*4882a593Smuzhiyun /*@@@@@@ offset 4 of tx descriptor => bits for RTL8168C/CP only begin @@@@@@*/
1346*4882a593Smuzhiyun TxUDPCS_C = (1 << 31), /* Calculate UDP/IP checksum */
1347*4882a593Smuzhiyun TxTCPCS_C = (1 << 30), /* Calculate TCP/IP checksum */
1348*4882a593Smuzhiyun TxIPCS_C = (1 << 29), /* Calculate IP checksum */
1349*4882a593Smuzhiyun TxIPV6F_C = (1 << 28), /* Indicate it is an IPv6 packet */
1350*4882a593Smuzhiyun /*@@@@@@ offset 4 of tx descriptor => bits for RTL8168C/CP only end @@@@@@*/
1351*4882a593Smuzhiyun
1352*4882a593Smuzhiyun
1353*4882a593Smuzhiyun /* Rx private */
1354*4882a593Smuzhiyun /*------ offset 0 of rx descriptor ------*/
1355*4882a593Smuzhiyun PID1 = (1 << 18), /* Protocol ID bit 1/2 */
1356*4882a593Smuzhiyun PID0 = (1 << 17), /* Protocol ID bit 2/2 */
1357*4882a593Smuzhiyun
1358*4882a593Smuzhiyun #define RxProtoUDP (PID1)
1359*4882a593Smuzhiyun #define RxProtoTCP (PID0)
1360*4882a593Smuzhiyun #define RxProtoIP (PID1 | PID0)
1361*4882a593Smuzhiyun #define RxProtoMask RxProtoIP
1362*4882a593Smuzhiyun
1363*4882a593Smuzhiyun RxIPF = (1 << 16), /* IP checksum failed */
1364*4882a593Smuzhiyun RxUDPF = (1 << 15), /* UDP/IP checksum failed */
1365*4882a593Smuzhiyun RxTCPF = (1 << 14), /* TCP/IP checksum failed */
1366*4882a593Smuzhiyun RxVlanTag = (1 << 16), /* VLAN tag available */
1367*4882a593Smuzhiyun
1368*4882a593Smuzhiyun /*@@@@@@ offset 0 of rx descriptor => bits for RTL8168C/CP only begin @@@@@@*/
1369*4882a593Smuzhiyun RxUDPT = (1 << 18),
1370*4882a593Smuzhiyun RxTCPT = (1 << 17),
1371*4882a593Smuzhiyun /*@@@@@@ offset 0 of rx descriptor => bits for RTL8168C/CP only end @@@@@@*/
1372*4882a593Smuzhiyun
1373*4882a593Smuzhiyun /*@@@@@@ offset 4 of rx descriptor => bits for RTL8168C/CP only begin @@@@@@*/
1374*4882a593Smuzhiyun RxV6F = (1 << 31),
1375*4882a593Smuzhiyun RxV4F = (1 << 30),
1376*4882a593Smuzhiyun /*@@@@@@ offset 4 of rx descriptor => bits for RTL8168C/CP only end @@@@@@*/
1377*4882a593Smuzhiyun };
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun enum features {
1380*4882a593Smuzhiyun // RTL_FEATURE_WOL = (1 << 0),
1381*4882a593Smuzhiyun RTL_FEATURE_MSI = (1 << 1),
1382*4882a593Smuzhiyun };
1383*4882a593Smuzhiyun
1384*4882a593Smuzhiyun enum wol_capability {
1385*4882a593Smuzhiyun WOL_DISABLED = 0,
1386*4882a593Smuzhiyun WOL_ENABLED = 1
1387*4882a593Smuzhiyun };
1388*4882a593Smuzhiyun
1389*4882a593Smuzhiyun enum bits {
1390*4882a593Smuzhiyun BIT_0 = (1 << 0),
1391*4882a593Smuzhiyun BIT_1 = (1 << 1),
1392*4882a593Smuzhiyun BIT_2 = (1 << 2),
1393*4882a593Smuzhiyun BIT_3 = (1 << 3),
1394*4882a593Smuzhiyun BIT_4 = (1 << 4),
1395*4882a593Smuzhiyun BIT_5 = (1 << 5),
1396*4882a593Smuzhiyun BIT_6 = (1 << 6),
1397*4882a593Smuzhiyun BIT_7 = (1 << 7),
1398*4882a593Smuzhiyun BIT_8 = (1 << 8),
1399*4882a593Smuzhiyun BIT_9 = (1 << 9),
1400*4882a593Smuzhiyun BIT_10 = (1 << 10),
1401*4882a593Smuzhiyun BIT_11 = (1 << 11),
1402*4882a593Smuzhiyun BIT_12 = (1 << 12),
1403*4882a593Smuzhiyun BIT_13 = (1 << 13),
1404*4882a593Smuzhiyun BIT_14 = (1 << 14),
1405*4882a593Smuzhiyun BIT_15 = (1 << 15),
1406*4882a593Smuzhiyun BIT_16 = (1 << 16),
1407*4882a593Smuzhiyun BIT_17 = (1 << 17),
1408*4882a593Smuzhiyun BIT_18 = (1 << 18),
1409*4882a593Smuzhiyun BIT_19 = (1 << 19),
1410*4882a593Smuzhiyun BIT_20 = (1 << 20),
1411*4882a593Smuzhiyun BIT_21 = (1 << 21),
1412*4882a593Smuzhiyun BIT_22 = (1 << 22),
1413*4882a593Smuzhiyun BIT_23 = (1 << 23),
1414*4882a593Smuzhiyun BIT_24 = (1 << 24),
1415*4882a593Smuzhiyun BIT_25 = (1 << 25),
1416*4882a593Smuzhiyun BIT_26 = (1 << 26),
1417*4882a593Smuzhiyun BIT_27 = (1 << 27),
1418*4882a593Smuzhiyun BIT_28 = (1 << 28),
1419*4882a593Smuzhiyun BIT_29 = (1 << 29),
1420*4882a593Smuzhiyun BIT_30 = (1 << 30),
1421*4882a593Smuzhiyun BIT_31 = (1 << 31)
1422*4882a593Smuzhiyun };
1423*4882a593Smuzhiyun
1424*4882a593Smuzhiyun enum effuse {
1425*4882a593Smuzhiyun EFUSE_NOT_SUPPORT = 0,
1426*4882a593Smuzhiyun EFUSE_SUPPORT_V1,
1427*4882a593Smuzhiyun EFUSE_SUPPORT_V2,
1428*4882a593Smuzhiyun EFUSE_SUPPORT_V3,
1429*4882a593Smuzhiyun };
1430*4882a593Smuzhiyun #define RsvdMask 0x3fffc000
1431*4882a593Smuzhiyun
1432*4882a593Smuzhiyun struct TxDesc {
1433*4882a593Smuzhiyun u32 opts1;
1434*4882a593Smuzhiyun u32 opts2;
1435*4882a593Smuzhiyun u64 addr;
1436*4882a593Smuzhiyun };
1437*4882a593Smuzhiyun
1438*4882a593Smuzhiyun struct RxDesc {
1439*4882a593Smuzhiyun u32 opts1;
1440*4882a593Smuzhiyun u32 opts2;
1441*4882a593Smuzhiyun u64 addr;
1442*4882a593Smuzhiyun };
1443*4882a593Smuzhiyun
1444*4882a593Smuzhiyun struct ring_info {
1445*4882a593Smuzhiyun struct sk_buff *skb;
1446*4882a593Smuzhiyun u32 len;
1447*4882a593Smuzhiyun u8 __pad[sizeof(void *) - sizeof(u32)];
1448*4882a593Smuzhiyun };
1449*4882a593Smuzhiyun
1450*4882a593Smuzhiyun struct pci_resource {
1451*4882a593Smuzhiyun u8 cmd;
1452*4882a593Smuzhiyun u8 cls;
1453*4882a593Smuzhiyun u16 io_base_h;
1454*4882a593Smuzhiyun u16 io_base_l;
1455*4882a593Smuzhiyun u16 mem_base_h;
1456*4882a593Smuzhiyun u16 mem_base_l;
1457*4882a593Smuzhiyun u8 ilr;
1458*4882a593Smuzhiyun u16 resv_0x1c_h;
1459*4882a593Smuzhiyun u16 resv_0x1c_l;
1460*4882a593Smuzhiyun u16 resv_0x20_h;
1461*4882a593Smuzhiyun u16 resv_0x20_l;
1462*4882a593Smuzhiyun u16 resv_0x24_h;
1463*4882a593Smuzhiyun u16 resv_0x24_l;
1464*4882a593Smuzhiyun u16 resv_0x2c_h;
1465*4882a593Smuzhiyun u16 resv_0x2c_l;
1466*4882a593Smuzhiyun u32 pci_sn_l;
1467*4882a593Smuzhiyun u32 pci_sn_h;
1468*4882a593Smuzhiyun };
1469*4882a593Smuzhiyun
1470*4882a593Smuzhiyun struct rtl8168_private {
1471*4882a593Smuzhiyun void __iomem *mmio_addr; /* memory map physical address */
1472*4882a593Smuzhiyun struct pci_dev *pci_dev; /* Index of PCI device */
1473*4882a593Smuzhiyun struct net_device *dev;
1474*4882a593Smuzhiyun #ifdef CONFIG_R8168_NAPI
1475*4882a593Smuzhiyun #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
1476*4882a593Smuzhiyun struct napi_struct napi;
1477*4882a593Smuzhiyun #endif
1478*4882a593Smuzhiyun #endif
1479*4882a593Smuzhiyun struct net_device_stats stats; /* statistics of net device */
1480*4882a593Smuzhiyun spinlock_t lock; /* spin lock flag */
1481*4882a593Smuzhiyun u32 msg_enable;
1482*4882a593Smuzhiyun u32 tx_tcp_csum_cmd;
1483*4882a593Smuzhiyun u32 tx_udp_csum_cmd;
1484*4882a593Smuzhiyun u32 tx_ip_csum_cmd;
1485*4882a593Smuzhiyun u32 tx_ipv6_csum_cmd;
1486*4882a593Smuzhiyun int max_jumbo_frame_size;
1487*4882a593Smuzhiyun int chipset;
1488*4882a593Smuzhiyun u32 mcfg;
1489*4882a593Smuzhiyun u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
1490*4882a593Smuzhiyun u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
1491*4882a593Smuzhiyun u32 dirty_rx;
1492*4882a593Smuzhiyun u32 dirty_tx;
1493*4882a593Smuzhiyun struct TxDesc *TxDescArray; /* 256-aligned Tx descriptor ring */
1494*4882a593Smuzhiyun struct RxDesc *RxDescArray; /* 256-aligned Rx descriptor ring */
1495*4882a593Smuzhiyun dma_addr_t TxPhyAddr;
1496*4882a593Smuzhiyun dma_addr_t RxPhyAddr;
1497*4882a593Smuzhiyun struct sk_buff *Rx_skbuff[NUM_RX_DESC]; /* Rx data buffers */
1498*4882a593Smuzhiyun struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */
1499*4882a593Smuzhiyun unsigned rx_buf_sz;
1500*4882a593Smuzhiyun struct timer_list esd_timer;
1501*4882a593Smuzhiyun struct timer_list link_timer;
1502*4882a593Smuzhiyun struct pci_resource pci_cfg_space;
1503*4882a593Smuzhiyun unsigned int esd_flag;
1504*4882a593Smuzhiyun unsigned int pci_cfg_is_read;
1505*4882a593Smuzhiyun unsigned int rtl8168_rx_config;
1506*4882a593Smuzhiyun u16 cp_cmd;
1507*4882a593Smuzhiyun u16 intr_mask;
1508*4882a593Smuzhiyun u16 timer_intr_mask;
1509*4882a593Smuzhiyun int phy_auto_nego_reg;
1510*4882a593Smuzhiyun int phy_1000_ctrl_reg;
1511*4882a593Smuzhiyun u8 org_mac_addr[NODE_ADDRESS_SIZE];
1512*4882a593Smuzhiyun struct rtl8168_counters *tally_vaddr;
1513*4882a593Smuzhiyun dma_addr_t tally_paddr;
1514*4882a593Smuzhiyun
1515*4882a593Smuzhiyun #ifdef CONFIG_R8168_VLAN
1516*4882a593Smuzhiyun struct vlan_group *vlgrp;
1517*4882a593Smuzhiyun #endif
1518*4882a593Smuzhiyun u8 wol_enabled;
1519*4882a593Smuzhiyun u32 wol_opts;
1520*4882a593Smuzhiyun u8 efuse_ver;
1521*4882a593Smuzhiyun u8 eeprom_type;
1522*4882a593Smuzhiyun u8 autoneg;
1523*4882a593Smuzhiyun u8 duplex;
1524*4882a593Smuzhiyun u32 speed;
1525*4882a593Smuzhiyun u32 advertising;
1526*4882a593Smuzhiyun u16 eeprom_len;
1527*4882a593Smuzhiyun u16 cur_page;
1528*4882a593Smuzhiyun u32 bios_setting;
1529*4882a593Smuzhiyun
1530*4882a593Smuzhiyun int (*set_speed)(struct net_device *, u8 autoneg, u32 speed, u8 duplex, u32 adv);
1531*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
1532*4882a593Smuzhiyun void (*get_settings)(struct net_device *, struct ethtool_cmd *);
1533*4882a593Smuzhiyun #else
1534*4882a593Smuzhiyun void (*get_settings)(struct net_device *, struct ethtool_link_ksettings *);
1535*4882a593Smuzhiyun #endif
1536*4882a593Smuzhiyun void (*phy_reset_enable)(struct net_device *);
1537*4882a593Smuzhiyun unsigned int (*phy_reset_pending)(struct net_device *);
1538*4882a593Smuzhiyun unsigned int (*link_ok)(struct net_device *);
1539*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
1540*4882a593Smuzhiyun struct work_struct task;
1541*4882a593Smuzhiyun #else
1542*4882a593Smuzhiyun struct delayed_work task;
1543*4882a593Smuzhiyun #endif
1544*4882a593Smuzhiyun unsigned features;
1545*4882a593Smuzhiyun
1546*4882a593Smuzhiyun u8 org_pci_offset_99;
1547*4882a593Smuzhiyun u8 org_pci_offset_180;
1548*4882a593Smuzhiyun u8 issue_offset_99_event;
1549*4882a593Smuzhiyun
1550*4882a593Smuzhiyun u8 org_pci_offset_80;
1551*4882a593Smuzhiyun u8 org_pci_offset_81;
1552*4882a593Smuzhiyun u8 use_timer_interrrupt;
1553*4882a593Smuzhiyun
1554*4882a593Smuzhiyun u32 keep_intr_cnt;
1555*4882a593Smuzhiyun
1556*4882a593Smuzhiyun u8 HwIcVerUnknown;
1557*4882a593Smuzhiyun u8 NotWrRamCodeToMicroP;
1558*4882a593Smuzhiyun u8 NotWrMcuPatchCode;
1559*4882a593Smuzhiyun u8 HwHasWrRamCodeToMicroP;
1560*4882a593Smuzhiyun
1561*4882a593Smuzhiyun u16 sw_ram_code_ver;
1562*4882a593Smuzhiyun u16 hw_ram_code_ver;
1563*4882a593Smuzhiyun
1564*4882a593Smuzhiyun u8 rtk_enable_diag;
1565*4882a593Smuzhiyun
1566*4882a593Smuzhiyun u8 ShortPacketSwChecksum;
1567*4882a593Smuzhiyun
1568*4882a593Smuzhiyun u8 UseSwPaddingShortPkt;
1569*4882a593Smuzhiyun
1570*4882a593Smuzhiyun u8 RequireAdcBiasPatch;
1571*4882a593Smuzhiyun u16 AdcBiasPatchIoffset;
1572*4882a593Smuzhiyun
1573*4882a593Smuzhiyun u8 RequireAdjustUpsTxLinkPulseTiming;
1574*4882a593Smuzhiyun u16 SwrCnt1msIni;
1575*4882a593Smuzhiyun
1576*4882a593Smuzhiyun u8 HwSuppNowIsOobVer;
1577*4882a593Smuzhiyun
1578*4882a593Smuzhiyun u8 RequiredSecLanDonglePatch;
1579*4882a593Smuzhiyun
1580*4882a593Smuzhiyun u32 HwFiberModeVer;
1581*4882a593Smuzhiyun u32 HwFiberStat;
1582*4882a593Smuzhiyun u8 HwSwitchMdiToFiber;
1583*4882a593Smuzhiyun
1584*4882a593Smuzhiyun u8 HwSuppSerDesPhyVer;
1585*4882a593Smuzhiyun
1586*4882a593Smuzhiyun u8 HwSuppPhyOcpVer;
1587*4882a593Smuzhiyun
1588*4882a593Smuzhiyun u8 HwSuppAspmClkIntrLock;
1589*4882a593Smuzhiyun
1590*4882a593Smuzhiyun u16 NicCustLedValue;
1591*4882a593Smuzhiyun
1592*4882a593Smuzhiyun u8 HwSuppUpsVer;
1593*4882a593Smuzhiyun
1594*4882a593Smuzhiyun u8 HwSuppMagicPktVer;
1595*4882a593Smuzhiyun
1596*4882a593Smuzhiyun u8 HwSuppCheckPhyDisableModeVer;
1597*4882a593Smuzhiyun
1598*4882a593Smuzhiyun u8 random_mac;
1599*4882a593Smuzhiyun
1600*4882a593Smuzhiyun u16 phy_reg_aner;
1601*4882a593Smuzhiyun u16 phy_reg_anlpar;
1602*4882a593Smuzhiyun u16 phy_reg_gbsr;
1603*4882a593Smuzhiyun
1604*4882a593Smuzhiyun u32 HwPcieSNOffset;
1605*4882a593Smuzhiyun
1606*4882a593Smuzhiyun u8 HwSuppEsdVer;
1607*4882a593Smuzhiyun u8 TestPhyOcpReg;
1608*4882a593Smuzhiyun u16 BackupPhyFuseDout_15_0;
1609*4882a593Smuzhiyun u16 BackupPhyFuseDout_47_32;
1610*4882a593Smuzhiyun u16 BackupPhyFuseDout_63_48;
1611*4882a593Smuzhiyun
1612*4882a593Smuzhiyun const char *fw_name;
1613*4882a593Smuzhiyun struct rtl8168_fw *rtl_fw;
1614*4882a593Smuzhiyun u32 ocp_base;
1615*4882a593Smuzhiyun
1616*4882a593Smuzhiyun //Dash+++++++++++++++++
1617*4882a593Smuzhiyun u8 HwSuppDashVer;
1618*4882a593Smuzhiyun u8 DASH;
1619*4882a593Smuzhiyun u8 dash_printer_enabled;
1620*4882a593Smuzhiyun u8 HwPkgDet;
1621*4882a593Smuzhiyun void __iomem *mapped_cmac_ioaddr; /* mapped cmac memory map physical address */
1622*4882a593Smuzhiyun void __iomem *cmac_ioaddr; /* cmac memory map physical address */
1623*4882a593Smuzhiyun
1624*4882a593Smuzhiyun #ifdef ENABLE_DASH_SUPPORT
1625*4882a593Smuzhiyun u16 AfterRecvFromFwBufLen;
1626*4882a593Smuzhiyun u8 AfterRecvFromFwBuf[RECV_FROM_FW_BUF_SIZE];
1627*4882a593Smuzhiyun u16 AfterSendToFwBufLen;
1628*4882a593Smuzhiyun u8 AfterSendToFwBuf[SEND_TO_FW_BUF_SIZE];
1629*4882a593Smuzhiyun u16 SendToFwBufferLen;
1630*4882a593Smuzhiyun u32 SizeOfSendToFwBuffer ;
1631*4882a593Smuzhiyun u32 SizeOfSendToFwBufferMemAlloc ;
1632*4882a593Smuzhiyun u32 NumOfSendToFwBuffer ;
1633*4882a593Smuzhiyun
1634*4882a593Smuzhiyun u8 OobReq;
1635*4882a593Smuzhiyun u8 OobAck;
1636*4882a593Smuzhiyun u32 OobReqComplete;
1637*4882a593Smuzhiyun u32 OobAckComplete;
1638*4882a593Smuzhiyun
1639*4882a593Smuzhiyun u8 RcvFwReqSysOkEvt;
1640*4882a593Smuzhiyun u8 RcvFwDashOkEvt;
1641*4882a593Smuzhiyun u8 SendFwHostOkEvt;
1642*4882a593Smuzhiyun
1643*4882a593Smuzhiyun u8 DashFwDisableRx;
1644*4882a593Smuzhiyun
1645*4882a593Smuzhiyun void *SendToFwBuffer ;
1646*4882a593Smuzhiyun dma_addr_t SendToFwBufferPhy ;
1647*4882a593Smuzhiyun u8 SendingToFw;
1648*4882a593Smuzhiyun PTX_DASH_SEND_FW_DESC TxDashSendFwDesc;
1649*4882a593Smuzhiyun dma_addr_t TxDashSendFwDescPhy;
1650*4882a593Smuzhiyun u32 SizeOfTxDashSendFwDescMemAlloc;
1651*4882a593Smuzhiyun u32 SizeOfTxDashSendFwDesc ;
1652*4882a593Smuzhiyun u32 NumTxDashSendFwDesc ;
1653*4882a593Smuzhiyun u32 CurrNumTxDashSendFwDesc ;
1654*4882a593Smuzhiyun u32 LastSendNumTxDashSendFwDesc ;
1655*4882a593Smuzhiyun
1656*4882a593Smuzhiyun u32 NumRecvFromFwBuffer ;
1657*4882a593Smuzhiyun u32 SizeOfRecvFromFwBuffer ;
1658*4882a593Smuzhiyun u32 SizeOfRecvFromFwBufferMemAlloc ;
1659*4882a593Smuzhiyun void *RecvFromFwBuffer ;
1660*4882a593Smuzhiyun dma_addr_t RecvFromFwBufferPhy ;
1661*4882a593Smuzhiyun
1662*4882a593Smuzhiyun PRX_DASH_FROM_FW_DESC RxDashRecvFwDesc;
1663*4882a593Smuzhiyun dma_addr_t RxDashRecvFwDescPhy;
1664*4882a593Smuzhiyun u32 SizeOfRxDashRecvFwDescMemAlloc;
1665*4882a593Smuzhiyun u32 SizeOfRxDashRecvFwDesc ;
1666*4882a593Smuzhiyun u32 NumRxDashRecvFwDesc ;
1667*4882a593Smuzhiyun u32 CurrNumRxDashRecvFwDesc ;
1668*4882a593Smuzhiyun u8 DashReqRegValue;
1669*4882a593Smuzhiyun u16 HostReqValue;
1670*4882a593Smuzhiyun
1671*4882a593Smuzhiyun u32 CmacResetIsrCounter;
1672*4882a593Smuzhiyun u8 CmacResetIntr ;
1673*4882a593Smuzhiyun u8 CmacResetting ;
1674*4882a593Smuzhiyun u8 CmacOobIssueCmacReset ;
1675*4882a593Smuzhiyun u32 CmacResetbyFwCnt;
1676*4882a593Smuzhiyun
1677*4882a593Smuzhiyun #if defined(ENABLE_DASH_PRINTER_SUPPORT)
1678*4882a593Smuzhiyun struct completion fw_ack;
1679*4882a593Smuzhiyun struct completion fw_req;
1680*4882a593Smuzhiyun struct completion fw_host_ok;
1681*4882a593Smuzhiyun #endif
1682*4882a593Smuzhiyun //Dash-----------------
1683*4882a593Smuzhiyun #endif //ENABLE_DASH_SUPPORT
1684*4882a593Smuzhiyun
1685*4882a593Smuzhiyun //Realwow++++++++++++++
1686*4882a593Smuzhiyun u8 HwSuppKCPOffloadVer;
1687*4882a593Smuzhiyun
1688*4882a593Smuzhiyun u8 EnableDhcpTimeoutWake;
1689*4882a593Smuzhiyun u8 EnableTeredoOffload;
1690*4882a593Smuzhiyun u8 EnableKCPOffload;
1691*4882a593Smuzhiyun #ifdef ENABLE_REALWOW_SUPPORT
1692*4882a593Smuzhiyun u32 DhcpTimeout;
1693*4882a593Smuzhiyun MP_KCP_INFO MpKCPInfo;
1694*4882a593Smuzhiyun //Realwow--------------
1695*4882a593Smuzhiyun #endif //ENABLE_REALWOW_SUPPORT
1696*4882a593Smuzhiyun
1697*4882a593Smuzhiyun u32 eee_adv_t;
1698*4882a593Smuzhiyun u8 eee_enabled;
1699*4882a593Smuzhiyun
1700*4882a593Smuzhiyun u32 dynamic_aspm_packet_count;
1701*4882a593Smuzhiyun
1702*4882a593Smuzhiyun #ifdef ENABLE_R8168_PROCFS
1703*4882a593Smuzhiyun //Procfs support
1704*4882a593Smuzhiyun struct proc_dir_entry *proc_dir;
1705*4882a593Smuzhiyun #endif
1706*4882a593Smuzhiyun };
1707*4882a593Smuzhiyun
1708*4882a593Smuzhiyun enum eetype {
1709*4882a593Smuzhiyun EEPROM_TYPE_NONE=0,
1710*4882a593Smuzhiyun EEPROM_TYPE_93C46,
1711*4882a593Smuzhiyun EEPROM_TYPE_93C56,
1712*4882a593Smuzhiyun EEPROM_TWSI
1713*4882a593Smuzhiyun };
1714*4882a593Smuzhiyun
1715*4882a593Smuzhiyun enum mcfg {
1716*4882a593Smuzhiyun CFG_METHOD_1=0,
1717*4882a593Smuzhiyun CFG_METHOD_2,
1718*4882a593Smuzhiyun CFG_METHOD_3,
1719*4882a593Smuzhiyun CFG_METHOD_4,
1720*4882a593Smuzhiyun CFG_METHOD_5,
1721*4882a593Smuzhiyun CFG_METHOD_6,
1722*4882a593Smuzhiyun CFG_METHOD_7,
1723*4882a593Smuzhiyun CFG_METHOD_8,
1724*4882a593Smuzhiyun CFG_METHOD_9 ,
1725*4882a593Smuzhiyun CFG_METHOD_10,
1726*4882a593Smuzhiyun CFG_METHOD_11,
1727*4882a593Smuzhiyun CFG_METHOD_12,
1728*4882a593Smuzhiyun CFG_METHOD_13,
1729*4882a593Smuzhiyun CFG_METHOD_14,
1730*4882a593Smuzhiyun CFG_METHOD_15,
1731*4882a593Smuzhiyun CFG_METHOD_16,
1732*4882a593Smuzhiyun CFG_METHOD_17,
1733*4882a593Smuzhiyun CFG_METHOD_18,
1734*4882a593Smuzhiyun CFG_METHOD_19,
1735*4882a593Smuzhiyun CFG_METHOD_20,
1736*4882a593Smuzhiyun CFG_METHOD_21,
1737*4882a593Smuzhiyun CFG_METHOD_22,
1738*4882a593Smuzhiyun CFG_METHOD_23,
1739*4882a593Smuzhiyun CFG_METHOD_24,
1740*4882a593Smuzhiyun CFG_METHOD_25,
1741*4882a593Smuzhiyun CFG_METHOD_26,
1742*4882a593Smuzhiyun CFG_METHOD_27,
1743*4882a593Smuzhiyun CFG_METHOD_28,
1744*4882a593Smuzhiyun CFG_METHOD_29,
1745*4882a593Smuzhiyun CFG_METHOD_30,
1746*4882a593Smuzhiyun CFG_METHOD_31,
1747*4882a593Smuzhiyun CFG_METHOD_32,
1748*4882a593Smuzhiyun CFG_METHOD_33,
1749*4882a593Smuzhiyun CFG_METHOD_MAX,
1750*4882a593Smuzhiyun CFG_METHOD_DEFAULT = 0xFF
1751*4882a593Smuzhiyun };
1752*4882a593Smuzhiyun
1753*4882a593Smuzhiyun #define LSO_32K 32000
1754*4882a593Smuzhiyun #define LSO_64K 64000
1755*4882a593Smuzhiyun
1756*4882a593Smuzhiyun #define NIC_MIN_PHYS_BUF_COUNT (2)
1757*4882a593Smuzhiyun #define NIC_MAX_PHYS_BUF_COUNT_LSO_64K (24)
1758*4882a593Smuzhiyun #define NIC_MAX_PHYS_BUF_COUNT_LSO2 (16*4)
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun #define GTTCPHO_SHIFT 18
1761*4882a593Smuzhiyun #define GTTCPHO_MAX 0x7fU
1762*4882a593Smuzhiyun #define GTPKTSIZE_MAX 0x3ffffU
1763*4882a593Smuzhiyun #define TCPHO_SHIFT 18
1764*4882a593Smuzhiyun #define TCPHO_MAX 0x3ffU
1765*4882a593Smuzhiyun #define LSOPKTSIZE_MAX 0xffffU
1766*4882a593Smuzhiyun #define MSS_MAX 0x07ffu /* MSS value */
1767*4882a593Smuzhiyun
1768*4882a593Smuzhiyun #define OOB_CMD_RESET 0x00
1769*4882a593Smuzhiyun #define OOB_CMD_DRIVER_START 0x05
1770*4882a593Smuzhiyun #define OOB_CMD_DRIVER_STOP 0x06
1771*4882a593Smuzhiyun #define OOB_CMD_SET_IPMAC 0x41
1772*4882a593Smuzhiyun
1773*4882a593Smuzhiyun #define WAKEUP_MAGIC_PACKET_NOT_SUPPORT (0)
1774*4882a593Smuzhiyun #define WAKEUP_MAGIC_PACKET_V1 (1)
1775*4882a593Smuzhiyun #define WAKEUP_MAGIC_PACKET_V2 (2)
1776*4882a593Smuzhiyun
1777*4882a593Smuzhiyun //Ram Code Version
1778*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_14 (0x0057)
1779*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_16 (0x0055)
1780*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_18 (0x0052)
1781*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_20 (0x0044)
1782*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_21 (0x0042)
1783*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_24 (0x0001)
1784*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_23 (0x0015)
1785*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_26 (0x0012)
1786*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_28 (0x0019)
1787*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_29 (0x0055)
1788*4882a593Smuzhiyun #define NIC_RAMCODE_VERSION_CFG_METHOD_31 (0x0003)
1789*4882a593Smuzhiyun
1790*4882a593Smuzhiyun //hwoptimize
1791*4882a593Smuzhiyun #define HW_PATCH_SOC_LAN (BIT_0)
1792*4882a593Smuzhiyun #define HW_PATCH_SAMSUNG_LAN_DONGLE (BIT_2)
1793*4882a593Smuzhiyun
1794*4882a593Smuzhiyun #define HW_PHY_STATUS_INI 1
1795*4882a593Smuzhiyun #define HW_PHY_STATUS_EXT_INI 2
1796*4882a593Smuzhiyun #define HW_PHY_STATUS_LAN_ON 3
1797*4882a593Smuzhiyun
1798*4882a593Smuzhiyun void rtl8168_mdio_write(struct rtl8168_private *tp, u16 RegAddr, u16 value);
1799*4882a593Smuzhiyun void rtl8168_mdio_prot_write(struct rtl8168_private *tp, u32 RegAddr, u32 value);
1800*4882a593Smuzhiyun void rtl8168_mdio_prot_direct_write_phy_ocp(struct rtl8168_private *tp, u32 RegAddr, u32 value);
1801*4882a593Smuzhiyun u32 rtl8168_mdio_read(struct rtl8168_private *tp, u16 RegAddr);
1802*4882a593Smuzhiyun u32 rtl8168_mdio_prot_read(struct rtl8168_private *tp, u32 RegAddr);
1803*4882a593Smuzhiyun u32 rtl8168_mdio_prot_direct_read_phy_ocp(struct rtl8168_private *tp, u32 RegAddr);
1804*4882a593Smuzhiyun void rtl8168_ephy_write(struct rtl8168_private *tp, int RegAddr, int value);
1805*4882a593Smuzhiyun void rtl8168_mac_ocp_write(struct rtl8168_private *tp, u16 reg_addr, u16 value);
1806*4882a593Smuzhiyun u16 rtl8168_mac_ocp_read(struct rtl8168_private *tp, u16 reg_addr);
1807*4882a593Smuzhiyun void rtl8168_clear_eth_phy_bit(struct rtl8168_private *tp, u8 addr, u16 mask);
1808*4882a593Smuzhiyun void rtl8168_set_eth_phy_bit(struct rtl8168_private *tp, u8 addr, u16 mask);
1809*4882a593Smuzhiyun void rtl8168_ocp_write(struct rtl8168_private *tp, u16 addr, u8 len, u32 data);
1810*4882a593Smuzhiyun void rtl8168_oob_notify(struct rtl8168_private *tp, u8 cmd);
1811*4882a593Smuzhiyun void rtl8168_init_ring_indexes(struct rtl8168_private *tp);
1812*4882a593Smuzhiyun int rtl8168_eri_write(struct rtl8168_private *tp, int addr, int len, u32 value, int type);
1813*4882a593Smuzhiyun void rtl8168_oob_mutex_lock(struct rtl8168_private *tp);
1814*4882a593Smuzhiyun u32 rtl8168_ocp_read(struct rtl8168_private *tp, u16 addr, u8 len);
1815*4882a593Smuzhiyun u32 rtl8168_ocp_read_with_oob_base_address(struct rtl8168_private *tp, u16 addr, u8 len, u32 base_address);
1816*4882a593Smuzhiyun u32 rtl8168_ocp_write_with_oob_base_address(struct rtl8168_private *tp, u16 addr, u8 len, u32 value, u32 base_address);
1817*4882a593Smuzhiyun u32 rtl8168_eri_read(struct rtl8168_private *tp, int addr, int len, int type);
1818*4882a593Smuzhiyun u32 rtl8168_eri_read_with_oob_base_address(struct rtl8168_private *tp, int addr, int len, int type, u32 base_address);
1819*4882a593Smuzhiyun int rtl8168_eri_write_with_oob_base_address(struct rtl8168_private *tp, int addr, int len, u32 value, int type, u32 base_address);
1820*4882a593Smuzhiyun u16 rtl8168_ephy_read(struct rtl8168_private *tp, int RegAddr);
1821*4882a593Smuzhiyun void rtl8168_wait_txrx_fifo_empty(struct net_device *dev);
1822*4882a593Smuzhiyun void rtl8168_wait_ll_share_fifo_ready(struct net_device *dev);
1823*4882a593Smuzhiyun void rtl8168_enable_now_is_oob(struct rtl8168_private *tp);
1824*4882a593Smuzhiyun void rtl8168_disable_now_is_oob(struct rtl8168_private *tp);
1825*4882a593Smuzhiyun void rtl8168_oob_mutex_unlock(struct rtl8168_private *tp);
1826*4882a593Smuzhiyun void rtl8168_dash2_disable_tx(struct rtl8168_private *tp);
1827*4882a593Smuzhiyun void rtl8168_dash2_enable_tx(struct rtl8168_private *tp);
1828*4882a593Smuzhiyun void rtl8168_dash2_disable_rx(struct rtl8168_private *tp);
1829*4882a593Smuzhiyun void rtl8168_dash2_enable_rx(struct rtl8168_private *tp);
1830*4882a593Smuzhiyun void rtl8168_hw_disable_mac_mcu_bps(struct net_device *dev);
1831*4882a593Smuzhiyun
1832*4882a593Smuzhiyun #define HW_SUPPORT_CHECK_PHY_DISABLE_MODE(_M) ((_M)->HwSuppCheckPhyDisableModeVer > 0 )
1833*4882a593Smuzhiyun #define HW_SUPP_SERDES_PHY(_M) ((_M)->HwSuppSerDesPhyVer > 0)
1834*4882a593Smuzhiyun #define HW_HAS_WRITE_PHY_MCU_RAM_CODE(_M) (((_M)->HwHasWrRamCodeToMicroP == TRUE) ? 1 : 0)
1835*4882a593Smuzhiyun #define HW_SUPPORT_UPS_MODE(_M) ((_M)->HwSuppUpsVer > 0)
1836*4882a593Smuzhiyun
1837*4882a593Smuzhiyun #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
1838*4882a593Smuzhiyun #define netdev_mc_count(dev) ((dev)->mc_count)
1839*4882a593Smuzhiyun #define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0)
1840*4882a593Smuzhiyun #define netdev_for_each_mc_addr(mclist, dev) \
1841*4882a593Smuzhiyun for (mclist = dev->mc_list; mclist; mclist = mclist->next)
1842*4882a593Smuzhiyun #endif
1843