2 Copyright (c) 2002, Micrel Kendin Operations
4 Written 2002 by LIQUN RUAN
6 This software may be used and distributed according to the terms of
7 the GNU General Public License (GPL), incorporated herein by reference.
8 Drivers based on or derived from this code fall under the GPL and must
9 retain the authorship, copyright and license notice. This file is not
10 a complete program and may only be used when the entire operating
11 system is licensed under the GPL.
13 The author may be reached as lruan@kendin.com
14 Micrel Kendin Operations
18 This driver is for Kendin's KS8695 SOHO Router Chipset as ethernet driver.
20 Support and updates available at
21 www.kendin.com/ks8695/
27 struct _ADAPTER_STRUCT
;
28 typedef struct _ADAPTER_STRUCT ADAPTER_STRUCT
, *PADAPTER_STRUCT
;
30 #include "ks8695_kcompat.h"
31 //#include <linux/module.h>
32 #include <linux/types.h>
33 #include <asm/byteorder.h>
34 #include "ks8695_chipdef.h"
36 #include "ks8695_fxhw.h"
40 #define DRV_INFO(S, args...) printk(KERN_INFO "eth info: " S "\n" , ##args)
41 #define DRV_DBG(S, args...) printk(KERN_DEBUG "eth dbg: " S "\n" , ## args)
42 #define DRV_ERR(S, args...) printk(KERN_ERR "eth err: " S "\n" , ## args)
43 #define DRV_WARN(S, args...) printk(KERN_WARNING "eth warning: " S "\n" , ## args)
45 #include <linux/init.h>
47 #include <linux/errno.h>
48 #include <linux/ioport.h>
49 #include <linux/pci.h>
50 #include <linux/kernel.h>
51 #include <linux/netdevice.h>
52 #include <linux/etherdevice.h>
53 #include <linux/skbuff.h>
54 #include <linux/delay.h>
55 #include <linux/timer.h>
56 #include <linux/interrupt.h>
57 #include <linux/string.h>
58 #include <asm/bitops.h>
61 #include <linux/capability.h>
66 /* command line options defaults */
67 #define TXDESC_DEFAULT 128
68 #define TXDESC_MAX 256
71 #define RXDESC_DEFAULT 128
72 #define RXDESC_MAX 256
75 #define OPTION_UNSET -1
76 #define OPTION_DISABLED 0
77 #define OPTION_ENABLED 1
79 #if defined(CONFIG_MACH_LITE300) || defined(CONFIG_MACH_CM4002) || \
80 defined(CONFIG_MACH_CM4008) || defined(CONFIG_MACH_CM41xx) || \
81 defined(CONFIG_MACH_SE4200)
82 #define RXCHECKSUM_DEFAULT OPTION_DISABLED
83 #define TXCHECKSUM_DEFAULT OPTION_DISABLED
85 #define RXCHECKSUM_DEFAULT OPTION_ENABLED
86 #define TXCHECKSUM_DEFAULT OPTION_ENABLED
88 #define FLOWCONTROL_DEFAULT OPTION_ENABLED
90 #define PBL_DEFAULT 8 /* 0 for unlimited, other value for (4 * x), our VxWorks shows that 8 is optimized */
92 // Supported RX Buffer Sizes
93 #define BUFFER_1568 1568 /* 0x620 */
94 #define BUFFER_2048 2048
95 #define BUFFER_4K 4096
97 // standard ethernet header
98 #define ENET_HEADER_SIZE 14
99 #define MAXIMUM_ETHERNET_PACKET_SIZE 1514
100 #define MINIMUM_ETHERNET_PACKET_SIZE 60
101 #define ETH_CRC_LENGTH 4
102 #define ETH_LENGTH_OF_ADDRESS 6
104 #define KS8695_ROUNDUP(size, unit) (unit * ((size + unit - 1) / unit))
107 struct ks8695_buffer
{
110 unsigned long length
;
114 // Adapter->flags definitions
115 #define KS8695_BOARD_OPEN 0
117 /* board specific private data structure */
118 struct _ADAPTER_STRUCT
{
119 struct _ADAPTER_STRUCT
*next
;
120 struct _ADAPTER_STRUCT
*prev
;
124 struct timer_list timer_id
;
126 struct net_device
*netdev
;
127 struct pci_dev
*pdev
;
128 struct net_device_stats net_stats
;
130 DMA_INFO stDMAInfo
; /* DMA information */
131 u8 rev
; /* revision, for KS8695P */
134 #define DI (Adapter->stDMAInfo) /* Dma Information */
135 #define DPI (Adapter->stDMAInfo.port) /* Dma Port Inforamtion */
138 extern int ks8695_init_module(void);
139 extern void ks8695_exit_module(void);
140 extern int ks8695_probe(struct pci_dev
*pdev
,
141 const struct pci_device_id
*ent
);
142 extern void ks8695_remove(struct pci_dev
*pdev
);
143 extern void ks8695_delete(PADAPTER_STRUCT Adapter
);
144 extern int ks8695_open(struct net_device
*netdev
);
145 extern int ks8695_close(struct net_device
*netdev
);
146 extern void ks8695_set_multi(struct net_device
*netdev
);
147 extern int ks8695_xmit_frame(struct sk_buff
*skb
, struct net_device
*netdev
);
148 extern struct net_device_stats
*ks8695_get_stats(struct net_device
*netdev
);
149 extern int ks8695_change_mtu(struct net_device
*netdev
, int new_mtu
);
150 extern int ks8695_set_mac(struct net_device
*netdev
, void *p
);
151 extern irqreturn_t
ks8695_isr(int irq
, void *data
);
152 /* for I-cache lockdown or FIQ purpose */
153 extern void ks8695_isre(void); /* to fix compiler complain if integrated with kernel */
154 extern irqreturn_t
ks8695_isr_link(int irq
, void *data
);
155 extern int ks8695_ioctl(struct net_device
*netdev
, struct ifreq
*ifr
, int cmd
);
156 extern void ks8695_watchdog(unsigned long data
);
159 extern BOOLEAN
ks8695_ChipInit(PADAPTER_STRUCT Adapter
, BOOLEAN bResetPhy
);
160 extern void macSetLoopback(PADAPTER_STRUCT Adapter
, BOOLEAN bLoopback
);
161 extern void macStopAll(PADAPTER_STRUCT Adapter
);
162 extern void macStartRx(PADAPTER_STRUCT Adapter
, BOOLEAN bStart
);
163 extern void macStartTx(PADAPTER_STRUCT Adapter
, BOOLEAN bStart
);
164 extern int macSetStationEx(PADAPTER_STRUCT Adapter
, UCHAR
*pMac
, UINT uIndex
);
165 extern int macResetStationEx(PADAPTER_STRUCT Adapter
, UCHAR
*pMac
);
166 extern void macGetStationAddress(PADAPTER_STRUCT Adapter
, uint8_t *pMacAddress
);
167 extern void macEnableInterrupt(PADAPTER_STRUCT Adapter
, BOOLEAN bEnable
);
168 extern void macSetStationAddress(PADAPTER_STRUCT Adapter
, uint8_t *pMacAddress
);
169 extern int macGetIndexStationEx(PADAPTER_STRUCT Adapter
);
172 extern void swSetLED(PADAPTER_STRUCT Adapter
, BOOLEAN bLED1
, LED_SELECTOR nSel
);
173 extern int swGetPhyStatus(PADAPTER_STRUCT Adapter
, UINT uPort
);
174 extern UINT
swReadSNMPReg(PADAPTER_STRUCT Adapter
, UINT uIndex
);
175 extern void swResetSNMPInfo(PADAPTER_STRUCT Adapter
);
176 extern void swEnableSwitch(PADAPTER_STRUCT Adapter
, UINT enable
);
177 extern void swDetectPhyConnection(PADAPTER_STRUCT Adapter
, UINT uPort
);
178 extern BOOLEAN
swPhyLoopback(PADAPTER_STRUCT Adapter
, UINT uPort
, BOOLEAN bLoopback
);
179 extern BOOLEAN
swGetWANLinkStatus(PADAPTER_STRUCT Adapter
);
180 extern void swAutoNegoAdvertisement(PADAPTER_STRUCT Adapter
, UINT uPort
);
181 extern void swPhyReset(PADAPTER_STRUCT Adapter
, UINT uPort
);
182 extern void swConfigureMediaType(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT uSpeed
, UINT uDuplex
);
183 extern void swConfigTagRemoval(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bRemoval
);
184 extern void swConfigTagInsertion(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bInsert
);
185 extern void swConfigurePort(PADAPTER_STRUCT Adapter
, UINT uPort
);
187 extern void gpioSet(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bSet
);
189 #ifdef CONFIG_ARCH_KS8695P
190 extern void enablePhyLoopback(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bEnable
);
191 extern void enableRemoteLoopback(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bEnable
);
192 extern void enablePhyIsolate(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bEnable
);
193 extern void forcePhyLink(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bEnable
);
194 extern void dumpDynamicMacTable(PADAPTER_STRUCT Adapter
);
195 extern void dumpStaticMacTable(PADAPTER_STRUCT Adapter
);
196 void enableTxRateControl(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bEnable
,
197 UINT bEnableLow
, UINT bEnableHigh
);
198 void enableRxRateControl(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT bEnable
,
199 UINT bEnableLow
, UINT bEnableHigh
);
200 void setTxRate(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT lrate
, UINT hrate
);
201 void setRxRate(PADAPTER_STRUCT Adapter
, UINT uPort
, UINT lrate
, UINT hrate
);
204 #endif /* __KS8695DRV_H */