1 /*****************************************************************************/
2 /* sis900.c: A SiS 900 PCI Fast Ethernet driver for Linux. */
4 /* Silicon Integrated System Corporation */
5 /* Revision: 1.05 Aug 7 1999 */
7 /*****************************************************************************/
10 Modified from the driver which is originally written by Donald Becker.
12 This software may be used and distributed according to the terms
13 of the GNU Public License (GPL), incorporated herein by reference.
14 Drivers based on this skeleton fall under the GPL and must retain
15 the authorship (implicit copyright) notice.
17 The author may be reached as becker@tidalwave.net, or
22 Support and updates [to the original skeleton] available at
23 http://www.tidalwave.net/~becker/pci-skeleton.html
26 static const char *version
=
27 "sis900.c:v1.05 8/07/99\n";
29 static int max_interrupt_work
= 20;
30 #define sis900_debug debug
31 static int sis900_debug
= 0;
33 static int multicast_filter_limit
= 128;
35 #define MAX_UNITS 8 /* More are supported, limit only on options */
36 static int speeds
[MAX_UNITS
] = {100, 100, 100, 100, 100, 100, 100, 100};
37 static int full_duplex
[MAX_UNITS
] = {1, 1, 1, 1, 1, 1, 1, 1};
39 #define TX_BUF_SIZE 1536
40 #define RX_BUF_SIZE 1536
42 #define TX_DMA_BURST 0
43 #define RX_DMA_BURST 0
44 #define TX_FIFO_THRESH 16
45 #define TxDRNT_100 (1536>>5)
52 /* Operational parameters that usually are not changed. */
53 /* Time in jiffies before concluding the transmitter is hung. */
54 #define TX_TIMEOUT (4*HZ)
56 #include <linux/module.h>
57 #include <linux/version.h>
58 #include <linux/kernel.h>
59 #include <linux/sched.h>
60 #include <linux/string.h>
61 #include <linux/timer.h>
62 #include <linux/errno.h>
63 #include <linux/ioport.h>
64 #include <linux/malloc.h>
65 #include <linux/interrupt.h>
66 #include <linux/pci.h>
67 #include <linux/netdevice.h>
68 #include <linux/etherdevice.h>
69 #include <linux/skbuff.h>
70 #include <asm/processor.h> /* Processor type for cache alignment. */
71 #include <asm/bitops.h>
74 #define RUN_AT(x) (jiffies + (x))
76 #include <linux/delay.h>
78 #if LINUX_VERSION_CODE < 0x20123
79 #define test_and_set_bit(val, addr) set_bit(val, addr)
81 #if LINUX_VERSION_CODE <= 0x20139
82 #define net_device_stats enet_statistics
86 #if LINUX_VERSION_CODE < 0x20155 || defined(CARDBUS)
87 /* Grrrr, the PCI code changed, but did not consider CardBus... */
88 #include <linux/bios32.h>
89 #define PCI_SUPPORT_VER1
91 #define PCI_SUPPORT_VER2
93 #if LINUX_VERSION_CODE < 0x20159
94 #define dev_free_skb(skb) dev_kfree_skb(skb, FREE_WRITE);
96 #define dev_free_skb(skb) dev_kfree_skb(skb);
100 #define SIS900_TOTAL_SIZE 0x100
102 /* This table drives the PCI probe routines. It's mostly boilerplate in all
103 of the drivers, and will likely be provided by some future kernel.
104 Note the matching code -- the first table entry matchs all 56** cards but
105 second only the 1234 card.
109 PCI_USES_IO
=1, PCI_USES_MEM
=2, PCI_USES_MASTER
=4,
114 u16 vendor_id
, device_id
, device_id_mask
, flags
;
116 struct net_device
*(*probe1
)(int pci_bus
, int pci_devfn
, struct net_device
*dev
,
117 long ioaddr
, int irq
, int chip_idx
, int fnd_cnt
);
120 static struct net_device
* sis900_probe1(int pci_bus
, int pci_devfn
,
121 struct net_device
*dev
, long ioaddr
,
122 int irq
, int chp_idx
, int fnd_cnt
);
124 static struct pci_id_info pci_tbl
[] =
125 {{ "SiS 900 PCI Fast Ethernet",
126 0x1039, 0x0900, 0xffff, PCI_USES_IO
|PCI_USES_MASTER
, 0x100, sis900_probe1
},
127 { "SiS 7016 PCI Fast Ethernet",
128 0x1039, 0x7016, 0xffff, PCI_USES_IO
|PCI_USES_MASTER
, 0x100, sis900_probe1
},
129 {0,}, /* 0 terminated list. */
132 /* The capability table matches the chip table above. */
133 enum {HAS_MII_XCVR
=0x01, HAS_CHIP_XCVR
=0x02, HAS_LNK_CHNG
=0x04};
134 static int sis_cap_tbl
[] = {
135 HAS_MII_XCVR
|HAS_CHIP_XCVR
|HAS_LNK_CHNG
,
136 HAS_MII_XCVR
|HAS_CHIP_XCVR
|HAS_LNK_CHNG
,
139 /* The rest of these values should never change. */
140 #define NUM_TX_DESC 16 /* Number of Tx descriptor registers. */
141 #define NUM_RX_DESC 8 /* Number of Rx descriptor registers. */
143 /* Symbolic offsets to registers. */
144 enum SIS900_registers
{
145 cr
=0x0, //Command Register
146 cfg
=0x4, //Configuration Register
147 mear
=0x8, //EEPROM Access Register
148 ptscr
=0xc, //PCI Test Control Register
149 isr
=0x10, //Interrupt Status Register
150 imr
=0x14, //Interrupt Mask Register
151 ier
=0x18, //Interrupt Enable Register
152 epar
=0x18, //Enhanced PHY Access Register
153 txdp
=0x20, //Transmit Descriptor Pointer Register
154 txcfg
=0x24, //Transmit Configuration Register
155 rxdp
=0x30, //Receive Descriptor Pointer Register
156 rxcfg
=0x34, //Receive Configuration Register
157 flctrl
=0x38, //Flow Control Register
158 rxlen
=0x3c, //Receive Packet Length Register
159 rfcr
=0x48, //Receive Filter Control Register
160 rfdr
=0x4C, //Receive Filter Data Register
161 pmctrl
=0xB0, //Power Management Control Register
162 pmer
=0xB4 //Power Management Wake-up Event Register
165 #define RESET 0x00000100
166 #define SWI 0x00000080
167 #define RxRESET 0x00000020
168 #define TxRESET 0x00000010
169 #define RxDIS 0x00000008
170 #define RxENA 0x00000004
171 #define TxDIS 0x00000002
172 #define TxENA 0x00000001
174 #define BISE 0x80000000
175 #define EUPHCOM 0x00000100
176 #define REQALG 0x00000080
177 #define SB 0x00000040
178 #define POW 0x00000020
179 #define EXD 0x00000010
180 #define PESEL 0x00000008
181 #define LPM 0x00000004
182 #define BEM 0x00000001
184 /* Interrupt register bits, using my own meaningful names. */
185 #define WKEVT 0x10000000
186 #define TxPAUSEEND 0x08000000
187 #define TxPAUSE 0x04000000
188 #define TxRCMP 0x02000000
189 #define RxRCMP 0x01000000
190 #define DPERR 0x00800000
191 #define SSERR 0x00400000
192 #define RMABT 0x00200000
193 #define RTABT 0x00100000
194 #define RxSOVR 0x00010000
195 #define HIBERR 0x00008000
196 #define SWINT 0x00001000
197 #define MIBINT 0x00000800
198 #define TxURN 0x00000400
199 #define TxIDLE 0x00000200
200 #define TxERR 0x00000100
201 #define TxDESC 0x00000080
202 #define TxOK 0x00000040
203 #define RxORN 0x00000020
204 #define RxIDLE 0x00000010
205 #define RxEARLY 0x00000008
206 #define RxERR 0x00000004
207 #define RxDESC 0x00000002
208 #define RxOK 0x00000001
210 #define IE 0x00000001
212 #define TxCSI 0x80000000
213 #define TxHBI 0x40000000
214 #define TxMLB 0x20000000
215 #define TxATP 0x10000000
216 #define TxIFG 0x0C000000
217 #define TxMXF 0x03800000
218 #define TxMXF_shift 0x23
219 #define TxMXDMA 0x00700000
220 #define TxMXDMA_shift 20
221 #define TxRTCNT 0x000F0000
222 #define TxRTCNT_shift 16
223 #define TxFILLT 0x00007F00
224 #define TxFILLT_shift 8
225 #define TxDRNT 0x0000007F
227 #define RxAEP 0x80000000
228 #define RxARP 0x40000000
229 #define RxATP 0x10000000
230 #define RxAJAB 0x08000000
231 #define RxMXF 0x03800000
232 #define RxMXF_shift 23
233 #define RxMXDMA 0x00700000
234 #define RxMXDMA_shift 20
235 #define RxDRNT 0x0000007F
237 #define RFEN 0x80000000
238 #define RFAAB 0x40000000
239 #define RFAAM 0x20000000
240 #define RFAAP 0x10000000
241 #define RFPromiscuous (RFAAB|RFAAM|RFAAP)
242 #define RFAA_shift 28
243 #define RFEP 0x00070000
244 #define RFEP_shift 16
246 #define RFDAT 0x0000FFFF
248 #define OWN 0x80000000
249 #define MORE 0x40000000
250 #define INTR 0x20000000
251 #define OK 0x08000000
252 #define DSIZE 0x00000FFF
254 #define SUPCRC 0x10000000
255 #define ABORT 0x04000000
256 #define UNDERRUN 0x02000000
257 #define NOCARRIER 0x01000000
258 #define DEFERD 0x00800000
259 #define EXCDEFER 0x00400000
260 #define OWCOLL 0x00200000
261 #define EXCCOLL 0x00100000
262 #define COLCNT 0x000F0000
264 #define INCCRC 0x10000000
266 #define OVERRUN 0x02000000
267 #define DEST 0x01800000
268 #define BCAST 0x01800000
269 #define MCAST 0x01000000
270 #define UNIMATCH 0x00800000
271 #define TOOLONG 0x00400000
272 #define RUNT 0x00200000
273 #define RXISERR 0x00100000
274 #define CRCERR 0x00080000
275 #define FAERR 0x00040000
276 #define LOOPBK 0x00020000
277 #define RXCOL 0x00010000
279 #define EuphLiteEEMACAddr 0x08
280 #define EuphLiteEEVendorID 0x02
281 #define EuphLiteEEDeviceID 0x03
282 #define EuphLiteEECardTypeRev 0x0b
283 #define EuphLiteEEPlexusRev 0x0c
284 #define EuphLiteEEChecksum 0x0f
286 #define RXSTS_shift 18
287 #define OWN 0x80000000
288 #define MORE 0x40000000
289 #define INTR 0x20000000
290 #define OK 0x08000000
291 #define DSIZE 0x00000FFF
292 /* MII register offsets */
293 #define MII_CONTROL 0x0000
294 #define MII_STATUS 0x0001
295 #define MII_PHY_ID0 0x0002
296 #define MII_PHY_ID1 0x0003
297 #define MII_ANAR 0x0004
298 #define MII_ANLPAR 0x0005
299 #define MII_ANER 0x0006
300 /* MII Control register bit definitions. */
301 #define MIICNTL_FDX 0x0100
302 #define MIICNTL_RST_AUTO 0x0200
303 #define MIICNTL_ISOLATE 0x0400
304 #define MIICNTL_PWRDWN 0x0800
305 #define MIICNTL_AUTO 0x1000
306 #define MIICNTL_SPEED 0x2000
307 #define MIICNTL_LPBK 0x4000
308 #define MIICNTL_RESET 0x8000
309 /* MII Status register bit significance. */
310 #define MIISTAT_EXT 0x0001
311 #define MIISTAT_JAB 0x0002
312 #define MIISTAT_LINK 0x0004
313 #define MIISTAT_CAN_AUTO 0x0008
314 #define MIISTAT_FAULT 0x0010
315 #define MIISTAT_AUTO_DONE 0x0020
316 #define MIISTAT_CAN_T 0x0800
317 #define MIISTAT_CAN_T_FDX 0x1000
318 #define MIISTAT_CAN_TX 0x2000
319 #define MIISTAT_CAN_TX_FDX 0x4000
320 #define MIISTAT_CAN_T4 0x8000
321 /* MII NWAY Register Bits ...
322 ** valid for the ANAR (Auto-Negotiation Advertisement) and
323 ** ANLPAR (Auto-Negotiation Link Partner) registers */
324 #define MII_NWAY_NODE_SEL 0x001f
325 #define MII_NWAY_CSMA_CD 0x0001
326 #define MII_NWAY_T 0x0020
327 #define MII_NWAY_T_FDX 0x0040
328 #define MII_NWAY_TX 0x0080
329 #define MII_NWAY_TX_FDX 0x0100
330 #define MII_NWAY_T4 0x0200
331 #define MII_NWAY_RF 0x2000
332 #define MII_NWAY_ACK 0x4000
333 #define MII_NWAY_NP 0x8000
335 /* MII Auto-Negotiation Expansion Register Bits */
336 #define MII_ANER_PDF 0x0010
337 #define MII_ANER_LP_NP_ABLE 0x0008
338 #define MII_ANER_NP_ABLE 0x0004
339 #define MII_ANER_RX_PAGE 0x0002
340 #define MII_ANER_LP_AN_ABLE 0x0001
341 #define HALF_DUPLEX 1
342 #define FDX_CAPABLE_DUPLEX_UNKNOWN 2
343 #define FDX_CAPABLE_HALF_SELECTED 3
344 #define FDX_CAPABLE_FULL_SELECTED 4
345 #define HW_SPEED_UNCONFIG 0
346 #define HW_SPEED_10_MBPS 10
347 #define HW_SPEED_100_MBPS 100
348 #define HW_SPEED_DEFAULT (HW_SPEED_10_MBPS)
350 #define ACCEPT_ALL_PHYS 0x01
351 #define ACCEPT_ALL_MCASTS 0x02
352 #define ACCEPT_ALL_BCASTS 0x04
353 #define ACCEPT_ALL_ERRORS 0x08
354 #define ACCEPT_CAM_QUALIFIED 0x10
355 #define MAC_LOOPBACK 0x20
356 //#define FDX_CAPABLE_FULL_SELECTED 4
358 #define MAC_HEADER_SIZE 14
360 typedef struct _EuphLiteDesc
{
364 /* Hardware sees the physical address of descriptor */
370 struct sis900_private
{
371 char devname
[8]; /* Used only for kernel debugging. */
372 const char *product_name
;
373 struct net_device
*next_module
;
376 unsigned char pci_bus
, pci_devfn
;
377 #if LINUX_VERSION_CODE > 0x20139
378 struct net_device_stats stats
;
380 struct enet_statistics stats
;
382 struct timer_list timer
; /* Media selection timer. */
383 unsigned int cur_rx
; /* Index into the Rx buffer of next Rx pkt. */
384 unsigned int cur_tx
, dirty_tx
, tx_flag
;
386 /* The saved address of a sent-in-place packet/buffer, for skfree(). */
387 struct sk_buff
* tx_skbuff
[NUM_TX_DESC
];
388 EuphLiteDesc tx_buf
[NUM_TX_DESC
]; /* Tx bounce buffers */
389 EuphLiteDesc rx_buf
[NUM_RX_DESC
];
390 unsigned char *rx_bufs
;
391 unsigned char *tx_bufs
; /* Tx bounce buffer region. */
392 char phys
[4]; /* MII device addresses. */
393 int phy_idx
; /* Support Max 4 PHY */
395 unsigned int tx_full
; /* The Tx queue is full. */
396 int MediaSpeed
; /* user force speed */
397 int MediaDuplex
; /* user force duplex */
398 int full_duplex
; /* Full/Half-duplex. */
399 int speeds
; /* 100/10 Mbps. */
405 #if LINUX_VERSION_CODE > 0x20115
406 MODULE_AUTHOR("Jim Huang <cmhuang@sis.com.tw>");
407 MODULE_DESCRIPTION("SiS 900 PCI Fast Ethernet driver");
408 MODULE_PARM(speeds
, "1-" __MODULE_STRING(MAX_UNITS
) "i");
409 MODULE_PARM(full_duplex
, "1-" __MODULE_STRING(MAX_UNITS
) "i");
410 MODULE_PARM(multicast_filter_limit
, "i");
411 MODULE_PARM(max_interrupt_work
, "i");
412 MODULE_PARM(debug
, "i");
416 static int sis900_open(struct net_device
*dev
);
417 static u16
read_eeprom(long ioaddr
, int location
);
418 static int mdio_read(struct net_device
*dev
, int phy_id
, int location
);
419 static void mdio_write(struct net_device
*dev
, int phy_id
, int location
, int val
);
420 static void sis900_timer(unsigned long data
);
421 static void sis900_tx_timeout(struct net_device
*dev
);
422 static void sis900_init_ring(struct net_device
*dev
);
423 static int sis900_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
);
424 static int sis900_rx(struct net_device
*dev
);
425 static void sis900_interrupt(int irq
, void *dev_instance
, struct pt_regs
*regs
);
426 static int sis900_close(struct net_device
*dev
);
427 static int mii_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
);
428 static struct enet_statistics
*sis900_get_stats(struct net_device
*dev
);
429 static void set_rx_mode(struct net_device
*dev
);
430 static void sis900_reset(struct net_device
*dev
);
431 static u16
elAutoNegotiate(struct net_device
*dev
, int phy_id
, int *duplex
, int *speed
);
432 static void elSetCapability(struct net_device
*dev
, int phy_id
, int duplex
, int speed
);
433 static u16
elPMDreadMode(struct net_device
*dev
, int phy_id
, int *speed
, int *duplex
);
434 static u16
elMIIpollBit(struct net_device
*dev
, int phy_id
, int location
, u16 mask
, u16 polarity
, u16
*value
);
435 static void elSetMediaType(struct net_device
*dev
, int speed
, int duplex
);
437 /* A list of all installed SiS900 devices, for removing the driver module. */
438 static struct net_device
*root_sis900_dev
= NULL
;
440 /* Ideally we would detect all network cards in slot order. That would
441 be best done a central PCI probe dispatch, which wouldn't work
442 well when dynamically adding drivers. So instead we detect just the
443 SiS 900 cards in slot order. */
445 int sis900_probe(struct net_device
*dev
)
449 unsigned char pci_bus
, pci_device_fn
;
451 if ( ! pcibios_present())
454 for (;pci_index
< 0xff; pci_index
++) {
455 u16 vendor
, device
, pci_command
, new_command
;
459 if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET
<< 8,
461 &pci_bus
, &pci_device_fn
)
462 != PCIBIOS_SUCCESSFUL
) {
465 pcibios_read_config_word(pci_bus
, pci_device_fn
, PCI_VENDOR_ID
,
467 pcibios_read_config_word(pci_bus
, pci_device_fn
, PCI_DEVICE_ID
,
470 for (chip_idx
= 0; pci_tbl
[chip_idx
].vendor_id
; chip_idx
++)
471 if (vendor
== pci_tbl
[chip_idx
].vendor_id
&&
472 (device
& pci_tbl
[chip_idx
].device_id_mask
) ==
473 pci_tbl
[chip_idx
].device_id
)
475 if (pci_tbl
[chip_idx
].vendor_id
== 0) /* Compiled out! */
479 struct pci_dev
*pdev
= pci_find_slot(pci_bus
, pci_device_fn
);
480 ioaddr
= pdev
->resource
[0].start
;
484 if ((pci_tbl
[chip_idx
].flags
& PCI_USES_IO
) &&
485 check_region(ioaddr
, pci_tbl
[chip_idx
].io_size
))
488 /* Activate the card: fix for brain-damaged Win98 BIOSes. */
489 pcibios_read_config_word(pci_bus
, pci_device_fn
,
490 PCI_COMMAND
, &pci_command
);
491 new_command
= pci_command
| (pci_tbl
[chip_idx
].flags
& 7);
492 if (pci_command
!= new_command
) {
493 printk(KERN_INFO
" The PCI BIOS has not enabled the"
495 "Updating PCI command %4.4x->%4.4x.\n",
496 pci_bus
, pci_device_fn
,
497 pci_command
, new_command
);
499 pcibios_write_config_word(pci_bus
, pci_device_fn
,
500 PCI_COMMAND
, new_command
);
503 dev
= pci_tbl
[chip_idx
].probe1(pci_bus
,
511 if (dev
&& (pci_tbl
[chip_idx
].flags
& PCI_COMMAND_MASTER
)) {
514 pcibios_read_config_byte(pci_bus
, pci_device_fn
,
515 PCI_LATENCY_TIMER
, &pci_latency
);
517 if (pci_latency
< 32) {
518 printk(KERN_NOTICE
" PCI latency timer (CFLT) is "
519 "unreasonably low at %d. Setting to 64 clocks.\n",
521 pcibios_write_config_byte(pci_bus
, pci_device_fn
,
522 PCI_LATENCY_TIMER
, 64);
528 return cards_found
? 0 : -ENODEV
;
531 static struct net_device
* sis900_probe1( int pci_bus
,
533 struct net_device
*dev
,
539 static int did_version
= 0; /* Already printed version info. */
540 struct sis900_private
*tp
;
542 int duplex
= found_cnt
< MAX_UNITS
? full_duplex
[found_cnt
] : 0 ;
543 int speed
= found_cnt
< MAX_UNITS
? speeds
[found_cnt
] : 0 ;
544 int phy
=0, phy_idx
=0, i
;
546 if (did_version
++ == 0)
547 printk(KERN_INFO
"%s", version
);
549 dev
= init_etherdev(dev
, 0);
554 printk(KERN_INFO
"%s: %s at %#lx, IRQ %d, ",
555 dev
->name
, pci_tbl
[chip_idx
].name
, ioaddr
, irq
);
557 if ((u16
)read_eeprom(ioaddr
, EuphLiteEEVendorID
) != 0xffff) {
558 for (i
= 0; i
< 3; i
++)
559 ((u16
*)(dev
->dev_addr
))[i
] =
560 read_eeprom(ioaddr
,i
+EuphLiteEEMACAddr
);
561 for (i
= 0; i
< 5; i
++)
562 printk("%2.2x:", (u8
)dev
->dev_addr
[i
]);
563 printk("%2.2x.\n", dev
->dev_addr
[i
]);
565 printk(KERN_INFO
"Error EEPROM read\n");
567 /* We do a request_region() to register /proc/ioports info. */
568 request_region(ioaddr
, pci_tbl
[chip_idx
].io_size
, dev
->name
);
570 dev
->base_addr
= ioaddr
;
573 /* Some data structures must be quadword aligned. */
574 tp
= kmalloc(sizeof(*tp
), GFP_KERNEL
| GFP_DMA
);
577 release_region(ioaddr
, pci_tbl
[chip_idx
].io_size
);
580 memset(tp
, 0, sizeof(*tp
));
583 tp
->next_module
= root_sis900_dev
;
584 root_sis900_dev
= dev
;
586 tp
->chip_id
= chip_idx
;
587 tp
->pci_bus
= pci_bus
;
588 tp
->pci_devfn
= pci_devfn
;
590 /* Find the connected MII xcvrs.
591 Doing this in open() would allow detecting external xcvrs later, but
592 takes too much time. */
593 if (sis_cap_tbl
[chip_idx
] & HAS_MII_XCVR
) {
594 for (phy
= 0, phy_idx
= 0;
595 phy
< 32 && phy_idx
< sizeof(tp
->phys
); phy
++)
598 mii_status
= mdio_read(dev
, phy
, MII_STATUS
);
600 if (mii_status
!= 0xffff && mii_status
!= 0x0000) {
601 tp
->phy_idx
= phy_idx
;
602 tp
->phys
[phy_idx
++] = phy
;
603 tp
->pmd_status
=mdio_read(dev
, phy
, MII_STATUS
);
604 printk(KERN_INFO
"%s: MII transceiver found "
612 printk(KERN_INFO
"%s: No MII transceivers found!\n",
622 if ((tp
->pmd_status
> 0) && (phy_idx
> 0)) {
623 if (sis900_debug
> 1) {
624 printk(KERN_INFO
"duplex=%d, speed=%d\n",
627 if (!duplex
&& !speed
) {
628 // auto-config media type
629 // Set full capability
630 if (sis900_debug
> 1) {
631 printk(KERN_INFO
"Auto Config ...\n");
633 elSetCapability(dev
, tp
->phys
[tp
->phy_idx
], 1, 100);
634 tp
->pmd_status
=elAutoNegotiate(dev
,
635 tp
->phys
[tp
->phy_idx
],
639 tp
->MediaSpeed
= speed
;
640 tp
->MediaDuplex
= duplex
;
641 elSetCapability(dev
, tp
->phys
[tp
->phy_idx
],
643 elAutoNegotiate(dev
, tp
->phys
[tp
->phy_idx
],
646 status
= mdio_read(dev
, phy
, MII_ANLPAR
);
647 if ( !(status
& (MII_NWAY_T
| MII_NWAY_T_FDX
|
648 MII_NWAY_TX
| MII_NWAY_TX_FDX
)))
651 cmd
|= ( speed
== 100 ?
653 cmd
|= ( duplex
? MIICNTL_FDX
: 0 );
654 mdio_write(dev
, phy
, MII_CONTROL
, cmd
);
655 elSetMediaType(dev
, speed
==100 ?
659 FDX_CAPABLE_FULL_SELECTED
:
660 FDX_CAPABLE_HALF_SELECTED
);
661 elMIIpollBit(dev
, phy
, MII_STATUS
,
662 MIISTAT_LINK
, TRUE
, &status
);
664 status
= mdio_read(dev
, phy
, MII_STATUS
);
668 if (tp
->pmd_status
& MIISTAT_LINK
)
673 tp
->LinkChange
= FALSE
;
677 if (sis900_debug
> 1) {
678 if (tp
->full_duplex
== FDX_CAPABLE_FULL_SELECTED
) {
679 printk(KERN_INFO
"%s: Media type is Full Duplex.\n",
682 printk(KERN_INFO
"%s: Media type is Half Duplex.\n",
685 if (tp
->speeds
== HW_SPEED_100_MBPS
) {
686 printk(KERN_INFO
"%s: Speed is 100mbps.\n", dev
->name
);
688 printk(KERN_INFO
"%s: Speed is 10mbps.\n", dev
->name
);
692 /* The SiS900-specific entries in the device structure. */
693 dev
->open
= &sis900_open
;
694 dev
->hard_start_xmit
= &sis900_start_xmit
;
695 dev
->stop
= &sis900_close
;
696 dev
->get_stats
= &sis900_get_stats
;
697 dev
->set_multicast_list
= &set_rx_mode
;
698 dev
->do_ioctl
= &mii_ioctl
;
703 /* Serial EEPROM section. */
705 /* EEPROM_Ctrl bits. */
706 #define EECLK 0x00000004 /* EEPROM shift clock. */
707 #define EECS 0x00000008 /* EEPROM chip select. */
708 #define EEDO 0x00000002 /* EEPROM chip data out. */
709 #define EEDI 0x00000001 /* EEPROM chip data in. */
711 /* Delay between EEPROM clock transitions.
712 No extra delay is needed with 33Mhz PCI, but 66Mhz may change this.
715 #define eeprom_delay() inl(ee_addr)
717 /* The EEPROM commands include the alway-set leading bit. */
718 #define EEread 0x0180
719 #define EEwrite 0x0140
720 #define EEerase 0x01C0
721 #define EEwriteEnable 0x0130
722 #define EEwriteDisable 0x0100
723 #define EEeraseAll 0x0120
724 #define EEwriteAll 0x0110
725 #define EEaddrMask 0x013F
726 #define EEcmdShift 16
728 static u16
read_eeprom(long ioaddr
, int location
)
732 long ee_addr
= ioaddr
+ mear
;
733 u32 read_cmd
= location
| EEread
;
737 outl(EECLK
, ee_addr
);
740 /* Shift the read command bits out. */
741 for (i
= 8; i
>= 0; i
--) {
742 u32 dataval
= (read_cmd
& (1 << i
)) ? EEDI
| EECS
: EECS
;
743 outl(dataval
, ee_addr
);
745 outl(dataval
| EECLK
, ee_addr
);
751 for (i
= 16; i
> 0; i
--) {
754 outl(EECS
| EECLK
, ee_addr
);
756 retval
= (retval
<< 1) | ((inl(ee_addr
) & EEDO
) ? 1 : 0);
760 /* Terminate the EEPROM access. */
763 outl(EECLK
, ee_addr
);
767 /* MII serial management: mostly bogus for now. */
768 /* Read and write the MII management registers using software-generated
769 serial MDIO protocol.
770 The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
771 met by back-to-back PCI I/O cycles, but we insert a delay to avoid
772 "overclocking" issues. */
774 #define mdio_delay() inl(mdio_addr)
776 #define MIIread 0x6000
777 #define MIIwrite 0x6002
778 #define MIIpmdMask 0x0F80
779 #define MIIpmdShift 7
780 #define MIIregMask 0x007C
781 #define MIIregShift 2
782 #define MIIturnaroundBits 2
784 #define MIIcmdShift 16
785 #define MIIreset 0xFFFFFFFF
788 #define MDC 0x00000040
789 #define MDDIR 0x00000020
790 #define MDIO 0x00000010
792 static void mdio_idle(long mdio_addr
)
794 outl(MDIO
| MDDIR
, mdio_addr
);
796 outl(MDIO
| MDDIR
| MDC
, mdio_addr
);
799 /* Syncronize the MII management interface by shifting 32 one bits out. */
800 static void mdio_reset(long mdio_addr
)
804 for (i
= 31; i
>= 0; i
--) {
805 outl(MDDIR
| MDIO
, mdio_addr
);
807 outl(MDDIR
| MDIO
| MDC
, mdio_addr
);
813 static int mdio_read(struct net_device
*dev
, int phy_id
, int location
)
815 long mdio_addr
= dev
->base_addr
+ mear
;
816 int mii_cmd
= MIIread
|(phy_id
<<MIIpmdShift
)|(location
<<MIIregShift
);
820 mdio_reset(mdio_addr
);
821 mdio_idle(mdio_addr
);
823 for (i
= 15; i
>= 0; i
--) {
824 int dataval
= (mii_cmd
& (1 << i
)) ? MDDIR
| MDIO
: MDDIR
;
825 outl(dataval
, mdio_addr
);
826 outl(dataval
| MDC
, mdio_addr
);
829 /* Read the two transition, 16 data, and wire-idle bits. */
830 for (i
= 16; i
> 0; i
--) {
833 retval
= (retval
<< 1) | ((inl(mdio_addr
) & MDIO
) ? 1 : 0);
834 outl(MDC
, mdio_addr
);
840 static void mdio_write(struct net_device
*dev
, int phy_id
, int location
, int value
)
842 long mdio_addr
= dev
->base_addr
+ mear
;
843 int mii_cmd
= MIIwrite
|(phy_id
<<MIIpmdShift
)|(location
<<MIIregShift
);
846 mdio_reset(mdio_addr
);
847 mdio_idle(mdio_addr
);
849 /* Shift the command bits out. */
850 for (i
= 31; i
>= 0; i
--) {
851 int dataval
= (mii_cmd
& (1 << i
)) ? MDDIR
| MDIO
: MDDIR
;
852 outb(dataval
, mdio_addr
);
854 outb(dataval
| MDC
, mdio_addr
);
858 /* Clear out extra bits. */
859 for (i
= 2; i
> 0; i
--) {
862 outb(MDC
, mdio_addr
);
869 sis900_open(struct net_device
*dev
)
871 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
872 long ioaddr
= dev
->base_addr
;
874 if (sis900_debug
> 0)
875 printk(KERN_INFO
"%s sis900_open, IO Addr=%x, Irq=%x\n",
876 dev
->name
, (unsigned int)ioaddr
, dev
->irq
);
878 /* Soft reset the chip. */
879 outl(0, ioaddr
+ imr
);
880 outl(0, ioaddr
+ ier
);
881 outl(0, ioaddr
+ rfcr
);
882 outl(RESET
| RxRESET
| TxRESET
, ioaddr
+ cr
);
884 if (request_irq(dev
->irq
, &sis900_interrupt
, SA_SHIRQ
, dev
->name
, dev
))
891 tp
->tx_bufs
= kmalloc(TX_BUF_SIZE
* NUM_TX_DESC
, GFP_KERNEL
);
892 tp
->rx_bufs
= kmalloc(RX_BUF_SIZE
* NUM_RX_DESC
, GFP_KERNEL
);
893 if (tp
->tx_bufs
== NULL
|| tp
->rx_bufs
== NULL
) {
899 printk(KERN_ERR
"%s: Can't allocate a %d byte TX Bufs.\n",
900 dev
->name
, TX_BUF_SIZE
* NUM_TX_DESC
);
903 printk(KERN_ERR
"%s: Can't allocate a %d byte RX Bufs.\n",
904 dev
->name
, RX_BUF_SIZE
* NUM_RX_DESC
);
914 rfcrSave
= inl(rfcr
);
915 outl(rfcrSave
& ~RFEN
, rfcr
);
916 for (i
=0 ; i
<3 ; i
++) {
917 w
= (u16
)*((u16
*)(dev
->dev_addr
)+i
);
918 outl((((u32
) i
) << RFEP_shift
), ioaddr
+ rfcr
);
919 outl((u32
)w
, ioaddr
+ rfdr
);
920 if (sis900_debug
> 4) {
921 printk(KERN_INFO
"Filter Addr[%d]=%x\n",
922 i
, inl(ioaddr
+ rfdr
));
925 outl(rfcrSave
, rfcr
);
928 sis900_init_ring(dev
);
929 outl((u32
)tp
->tx_buf
[0].physAddr
, ioaddr
+ txdp
);
930 outl((u32
)tp
->rx_buf
[0].physAddr
, ioaddr
+ rxdp
);
932 if (sis900_debug
> 4)
933 printk(KERN_INFO
"txdp:%8.8x\n", inl(ioaddr
+ txdp
));
935 /* Check that the chip has finished the reset. */
939 status
= TxRCMP
| RxRCMP
;
940 while (status
&& (j
++ < 30000)) {
941 status
^= (inl(isr
) & status
);
945 outl(PESEL
, ioaddr
+ cfg
);
947 /* Must enable Tx/Rx before setting transfer thresholds! */
949 * #define TX_DMA_BURST 0
950 * #define RX_DMA_BURST 0
951 * #define TX_FIFO_THRESH 16
952 * #define TxDRNT_100 (1536>>5)
953 * #define TxDRNT_10 (1536>>5)
954 * #define RxDRNT_100 (1536>>5)
955 * #define RxDRNT_10 (1536>>5)
957 outl((RX_DMA_BURST
<<20) | (RxDRNT_10
<< 1), ioaddr
+rxcfg
);
958 outl(TxATP
| (TX_DMA_BURST
<< 20) | (TX_FIFO_THRESH
<<8) | TxDRNT_10
,
960 if (sis900_debug
> 1)
963 printk(KERN_INFO
"%s: Media Type %s%s-duplex.\n",
965 tp
->speeds
==HW_SPEED_100_MBPS
?
966 "100mbps " : "10mbps ",
967 tp
->full_duplex
== FDX_CAPABLE_FULL_SELECTED
?
970 else printk(KERN_INFO
"%s: Media Link Off\n", dev
->name
);
978 /* Enable all known interrupts by setting the interrupt mask. */
979 outl((RxOK
|RxERR
|RxORN
|RxSOVR
|TxOK
|TxERR
|TxURN
), ioaddr
+ imr
);
980 outl(RxENA
, ioaddr
+ cr
);
981 outl(IE
, ioaddr
+ ier
);
983 if (sis900_debug
> 3)
984 printk(KERN_INFO
"%s: sis900_open() ioaddr %#lx IRQ %d \n",
985 dev
->name
, ioaddr
, dev
->irq
);
987 /* Set the timer to switch to check for link beat and perhaps switch
988 to an alternate media type. */
989 init_timer(&tp
->timer
);
990 tp
->timer
.expires
= RUN_AT((24*HZ
)/10); /* 2.4 sec. */
991 tp
->timer
.data
= (unsigned long)dev
;
992 tp
->timer
.function
= &sis900_timer
; /* timer handler */
993 add_timer(&tp
->timer
);
998 static void sis900_timer(unsigned long data
)
1000 struct net_device
*dev
= (struct net_device
*)data
;
1001 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1006 status
= mdio_read(dev
, tp
->phys
[tp
->phy_idx
], MII_STATUS
);
1007 if (status
& MIISTAT_LINK
) {
1008 elPMDreadMode(dev
, tp
->phys
[tp
->phy_idx
],
1009 &tp
->speeds
, &tp
->full_duplex
);
1011 printk(KERN_INFO
"%s: Media Link On %s%s-duplex ",
1013 tp
->speeds
== HW_SPEED_100_MBPS
?
1014 "100mbps " : "10mbps ",
1015 tp
->full_duplex
==FDX_CAPABLE_FULL_SELECTED
?
1018 } else { // previous link on
1019 status
= mdio_read(dev
, tp
->phys
[tp
->phy_idx
], MII_STATUS
);
1020 if (!(status
& MIISTAT_LINK
)) {
1022 printk(KERN_INFO
"%s: Media Link Off\n", dev
->name
);
1028 tp
->timer
.expires
= RUN_AT(next_tick
);
1029 add_timer(&tp
->timer
);
1033 static void sis900_tx_timeout(struct net_device
*dev
)
1035 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1036 long ioaddr
= dev
->base_addr
;
1039 if (sis900_debug
> 0)
1040 printk(KERN_INFO
"%s: Transmit timeout, status %2.2x %4.4x \n",
1041 dev
->name
, inl(ioaddr
+ cr
), inl(ioaddr
+ isr
));
1043 /* Disable interrupts by clearing the interrupt mask. */
1044 outl(0x0000, ioaddr
+ imr
);
1046 /* Emit info to figure out what went wrong. */
1047 if (sis900_debug
> 1) {
1048 printk(KERN_INFO
"%s:Tx queue start entry %d dirty entry %d.\n",
1049 dev
->name
, tp
->cur_tx
, tp
->dirty_tx
);
1050 for (i
= 0; i
< NUM_TX_DESC
; i
++)
1051 printk(KERN_INFO
"%s: Tx descriptor %d is %8.8x.%s\n",
1052 dev
->name
, i
, (unsigned int)&tp
->tx_buf
[i
],
1053 i
== tp
->dirty_tx
% NUM_TX_DESC
?
1054 " (queue head)" : "");
1057 /* Soft reset the chip. */
1058 //outb(RESET, ioaddr + cr);
1059 /* Check that the chip has finished the reset. */
1061 for (i = 1000; i > 0; i--)
1062 if ((inb(ioaddr + cr) & RESET) == 0)
1067 /* Must enable Tx/Rx before setting transfer thresholds! */
1071 { /* Save the unsent Tx packets. */
1072 struct sk_buff
*saved_skb
[NUM_TX_DESC
], *skb
;
1074 for (j
= 0; tp
->cur_tx
- tp
->dirty_tx
> 0 ; j
++, tp
->dirty_tx
++)
1075 saved_skb
[j
]=tp
->tx_skbuff
[tp
->dirty_tx
% NUM_TX_DESC
];
1076 tp
->dirty_tx
= tp
->cur_tx
= 0;
1078 for (i
= 0; i
< j
; i
++) {
1079 skb
= tp
->tx_skbuff
[i
] = saved_skb
[i
];
1080 /* Always alignment */
1081 memcpy((unsigned char*)(tp
->tx_buf
[i
].buf
),
1082 skb
->data
, skb
->len
);
1083 tp
->tx_buf
[i
].cmdsts
= OWN
| skb
->len
;
1084 /* Note: the chip doesn't have auto-pad! */
1086 outl(tp->tx_flag|(skb->len>=ETH_ZLEN?skb->len:ETH_ZLEN),
1087 ioaddr + TxStatus0 + i*4);
1090 outl(TxENA
, ioaddr
+ cr
);
1092 while (i
< NUM_TX_DESC
)
1093 tp
->tx_skbuff
[i
++] = 0;
1094 if (tp
->cur_tx
- tp
->dirty_tx
< NUM_TX_DESC
) {/* Typical path */
1102 dev
->trans_start
= jiffies
;
1103 tp
->stats
.tx_errors
++;
1104 /* Enable all known interrupts by setting the interrupt mask. */
1105 outl((RxOK
|RxERR
|RxORN
|RxSOVR
|TxOK
|TxERR
|TxURN
), ioaddr
+ imr
);
1110 /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
1112 sis900_init_ring(struct net_device
*dev
)
1114 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1119 tp
->dirty_tx
= tp
->cur_tx
= 0;
1122 for (i
= 0; i
< NUM_TX_DESC
; i
++) {
1123 tp
->tx_skbuff
[i
] = 0;
1124 tp
->tx_buf
[i
].buf
= &tp
->tx_bufs
[i
*TX_BUF_SIZE
];
1125 tp
->tx_buf
[i
].bufPhys
=
1126 virt_to_bus(&tp
->tx_bufs
[i
*TX_BUF_SIZE
]);
1130 for (i
= 0; i
< NUM_TX_DESC
; i
++) {
1131 tp
->tx_buf
[i
].llink
= (u32
)
1132 &(tp
->tx_buf
[((i
+1) < NUM_TX_DESC
) ? (i
+1) : 0]);
1133 tp
->tx_buf
[i
].plink
= (u32
)
1134 virt_to_bus(&(tp
->tx_buf
[((i
+1) < NUM_TX_DESC
) ?
1136 tp
->tx_buf
[i
].physAddr
=
1137 virt_to_bus(&(tp
->tx_buf
[i
].plink
));
1138 tp
->tx_buf
[i
].cmdsts
=0;
1142 for (i
= 0; i
< NUM_RX_DESC
; i
++) {
1143 tp
->rx_buf
[i
].buf
= &tp
->rx_bufs
[i
*RX_BUF_SIZE
];
1144 tp
->rx_buf
[i
].bufPhys
=
1145 virt_to_bus(&tp
->rx_bufs
[i
*RX_BUF_SIZE
]);
1149 for (i
= 0; i
< NUM_RX_DESC
; i
++) {
1150 tp
->rx_buf
[i
].llink
= (u32
)
1151 &(tp
->rx_buf
[((i
+1) < NUM_RX_DESC
) ? (i
+1) : 0]);
1152 tp
->rx_buf
[i
].plink
= (u32
)
1153 virt_to_bus(&(tp
->rx_buf
[((i
+1) < NUM_RX_DESC
) ?
1155 tp
->rx_buf
[i
].physAddr
=
1156 virt_to_bus(&(tp
->rx_buf
[i
].plink
));
1157 tp
->rx_buf
[i
].cmdsts
=RX_BUF_SIZE
;
1162 sis900_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
1164 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1165 long ioaddr
= dev
->base_addr
;
1168 /* Block a timer-based transmit from overlapping. This could better be
1169 done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
1170 if (test_and_set_bit(0, (void*)&dev
->tbusy
) != 0) {
1171 if (jiffies
- dev
->trans_start
< TX_TIMEOUT
)
1173 sis900_tx_timeout(dev
);
1177 /* Calculate the next Tx descriptor entry. ????? */
1178 entry
= tp
->cur_tx
% NUM_TX_DESC
;
1180 tp
->tx_skbuff
[entry
] = skb
;
1182 if (sis900_debug
> 5) {
1184 printk(KERN_INFO
"%s: SKB Tx Frame contents:(len=%d)",
1185 dev
->name
,skb
->len
);
1187 for (i
= 0; i
< skb
->len
; i
++) {
1194 memcpy(tp
->tx_buf
[entry
].buf
,
1195 skb
->data
, skb
->len
);
1197 tp
->tx_buf
[entry
].cmdsts
=(OWN
| skb
->len
);
1199 //tp->tx_buf[entry].plink = 0;
1200 outl(TxENA
, ioaddr
+ cr
);
1201 if (++tp
->cur_tx
- tp
->dirty_tx
< NUM_TX_DESC
) {/* Typical path */
1202 clear_bit(0, (void*)&dev
->tbusy
);
1207 /* Note: the chip doesn't have auto-pad! */
1209 dev
->trans_start
= jiffies
;
1210 if (sis900_debug
> 4)
1211 printk(KERN_INFO
"%s: Queued Tx packet at "
1212 "%p size %d to slot %d.\n",
1213 dev
->name
, skb
->data
, (int)skb
->len
, entry
);
1218 /* The interrupt handler does all of the Rx thread work and cleans up
1219 after the Tx thread. */
1220 static void sis900_interrupt(int irq
, void *dev_instance
, struct pt_regs
*regs
)
1222 struct net_device
*dev
= (struct net_device
*)dev_instance
;
1223 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1224 int boguscnt
= max_interrupt_work
;
1226 long ioaddr
= dev
->base_addr
;
1228 #if defined(__i386__)
1229 /* A lock to prevent simultaneous entry bug on Intel SMP machines. */
1230 if (test_and_set_bit(0, (void*)&dev
->interrupt
)) {
1231 printk(KERN_INFO
"%s: SMP simultaneous entry of "
1232 "an interrupt handler.\n", dev
->name
);
1233 dev
->interrupt
= 0; /* Avoid halting machine. */
1237 if (dev
->interrupt
) {
1238 printk(KERN_INFO
"%s: Re-entering the "
1239 "interrupt handler.\n", dev
->name
);
1246 status
= inl(ioaddr
+ isr
);
1247 /* Acknowledge all of the current interrupt sources ASAP. */
1248 outl(status
, ioaddr
+ isr
); // ?????
1250 if (sis900_debug
> 4)
1251 printk(KERN_INFO
"%s: interrupt status=%#4.4x "
1252 "new intstat=%#4.4x.\n",
1253 dev
->name
, status
, inl(ioaddr
+ isr
));
1255 if ((status
& (TxURN
|TxERR
|TxOK
| RxORN
|RxERR
|RxOK
)) == 0) {
1259 if (status
& (RxOK
|RxORN
|RxERR
)) /* Rx interrupt */
1262 if (status
& (TxOK
| TxERR
)) {
1263 unsigned int dirty_tx
;
1265 if (sis900_debug
> 5) {
1266 printk(KERN_INFO
"TxOK:tp->cur_tx:%d,"
1267 "tp->dirty_tx:%x\n",
1268 tp
->cur_tx
, tp
->dirty_tx
);
1270 for (dirty_tx
= tp
->dirty_tx
; dirty_tx
< tp
->cur_tx
;
1274 int entry
= dirty_tx
% NUM_TX_DESC
;
1275 int txstatus
= tp
->tx_buf
[entry
].cmdsts
;
1277 if (sis900_debug
> 4) {
1278 printk(KERN_INFO
"%s: Tx Frame contents:"
1280 dev
->name
, (txstatus
& DSIZE
));
1282 for (i
= 0; i
< (txstatus
& DSIZE
) ;
1285 (u8
)(tp
->tx_buf
[entry
].buf
[i
]));
1289 if ( ! (txstatus
& (OK
| UNDERRUN
)))
1291 if (sis900_debug
> 1)
1292 printk(KERN_INFO
"Tx NOT (OK,"
1294 break; /* It still hasn't been Txed */
1297 /* Note: TxCarrierLost is always asserted
1299 if (txstatus
& (OWCOLL
| ABORT
)) {
1300 /* There was an major error, log it. */
1301 if (sis900_debug
> 1)
1302 printk(KERN_INFO
"Tx Out of "
1304 #ifndef final_version
1305 if (sis900_debug
> 1)
1306 printk(KERN_INFO
"%s: Transmit "
1307 "error, Tx status %8.8x.\n",
1308 dev
->name
, txstatus
);
1310 tp
->stats
.tx_errors
++;
1311 if (txstatus
& ABORT
) {
1312 tp
->stats
.tx_aborted_errors
++;
1314 if (txstatus
& NOCARRIER
)
1315 tp
->stats
.tx_carrier_errors
++;
1316 if (txstatus
& OWCOLL
)
1317 tp
->stats
.tx_window_errors
++;
1319 if ((txstatus
& COLCNT
)==COLCNT
)
1320 tp
->stats
.collisions16
++;
1324 /* No count for tp->stats.tx_deferred */
1326 if (txstatus
& UNDERRUN
) {
1327 if (sis900_debug
> 2)
1328 printk(KERN_INFO
"Tx UnderRun\n");
1330 tp
->stats
.collisions
+=
1331 (txstatus
>> 16) & 0xF;
1332 #if LINUX_VERSION_CODE > 0x20119
1333 tp
->stats
.tx_bytes
+= txstatus
& DSIZE
;
1335 if (sis900_debug
> 2)
1336 printk(KERN_INFO
"Tx Transmit OK\n");
1337 tp
->stats
.tx_packets
++;
1340 /* Free the original skb. */
1341 if (sis900_debug
> 2)
1342 printk(KERN_INFO
"Free original skb\n");
1343 dev_free_skb(tp
->tx_skbuff
[entry
]);
1344 tp
->tx_skbuff
[entry
] = 0;
1347 #ifndef final_version
1348 if (tp
->cur_tx
- dirty_tx
> NUM_TX_DESC
) {
1349 printk(KERN_INFO
"%s: Out-of-sync dirty pointer,"
1350 " %d vs. %d, full=%d.\n",
1351 dev
->name
, dirty_tx
,
1352 tp
->cur_tx
, tp
->tx_full
);
1353 dirty_tx
+= NUM_TX_DESC
;
1357 if (tp
->tx_full
&& dirty_tx
> tp
->cur_tx
-NUM_TX_DESC
) {
1358 /* The ring is no longer full, clear tbusy. */
1359 if (sis900_debug
> 3)
1360 printk(KERN_INFO
"Tx Ring NO LONGER Full\n");
1366 tp
->dirty_tx
= dirty_tx
;
1367 if (sis900_debug
> 2)
1368 printk(KERN_INFO
"TxOK,tp->cur_tx:%d,tp->dirty:%d\n",
1369 tp
->cur_tx
, tp
->dirty_tx
);
1370 } // if (TxOK | TxERR)
1372 /* Check uncommon events with one test. */
1373 if (status
& (RxORN
| TxERR
| RxERR
)) {
1374 if (sis900_debug
> 2)
1375 printk(KERN_INFO
"%s: Abnormal interrupt,"
1376 "status %8.8x.\n", dev
->name
, status
);
1378 if (status
== 0xffffffff)
1380 if (status
& (RxORN
| RxERR
))
1381 tp
->stats
.rx_errors
++;
1384 if (status
& RxORN
) {
1385 tp
->stats
.rx_over_errors
++;
1388 if (--boguscnt
< 0) {
1389 printk(KERN_INFO
"%s: Too much work at interrupt, "
1390 "IntrStatus=0x%4.4x.\n",
1396 if (sis900_debug
> 3)
1397 printk(KERN_INFO
"%s: exiting interrupt, intr_status=%#4.4x.\n",
1398 dev
->name
, inl(ioaddr
+ isr
));
1400 #if defined(__i386__)
1401 clear_bit(0, (void*)&dev
->interrupt
);
1408 /* The data sheet doesn't describe the Rx ring at all, so I'm guessing at the
1409 field alignments and semantics. */
1410 static int sis900_rx(struct net_device
*dev
)
1412 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1413 long ioaddr
= dev
->base_addr
;
1414 u16 cur_rx
= tp
->cur_rx
% NUM_RX_DESC
;
1415 int rx_status
=tp
->rx_buf
[cur_rx
].cmdsts
;
1417 if (sis900_debug
> 4)
1418 printk(KERN_INFO
"%s: sis900_rx, current %4.4x,"
1419 " rx status=%8.8x\n",
1423 while (rx_status
& OWN
) {
1424 int rx_size
= rx_status
& DSIZE
;
1425 rx_size
-= CRC_SIZE
;
1427 if (sis900_debug
> 4) {
1429 printk(KERN_INFO
"%s: sis900_rx, rx status %8.8x,"
1430 " size %4.4x, cur %4.4x.\n",
1431 dev
->name
, rx_status
, rx_size
, cur_rx
);
1432 printk(KERN_INFO
"%s: Rx Frame contents:", dev
->name
);
1434 for (i
= 0; i
< rx_size
; i
++) {
1436 (u8
)(tp
->rx_buf
[cur_rx
].buf
[i
]));
1441 if (rx_status
& TOOLONG
) {
1442 if (sis900_debug
> 1)
1443 printk(KERN_INFO
"%s: Oversized Ethernet frame,"
1445 dev
->name
, rx_status
);
1446 tp
->stats
.rx_length_errors
++;
1447 } else if (rx_status
& (RXISERR
| RUNT
| CRCERR
| FAERR
)) {
1448 if (sis900_debug
> 1)
1449 printk(KERN_INFO
"%s: Ethernet frame had errors,"
1451 dev
->name
, rx_status
);
1452 tp
->stats
.rx_errors
++;
1453 if (rx_status
& (RXISERR
| FAERR
))
1454 tp
->stats
.rx_frame_errors
++;
1455 if (rx_status
& (RUNT
| TOOLONG
))
1456 tp
->stats
.rx_length_errors
++;
1457 if (rx_status
& CRCERR
) tp
->stats
.rx_crc_errors
++;
1459 /* Malloc up new buffer, compatible with net-2e. */
1460 /* Omit the four octet CRC from the length. */
1461 struct sk_buff
*skb
;
1463 skb
= dev_alloc_skb(rx_size
+ 2);
1465 printk(KERN_INFO
"%s: Memory squeeze,"
1466 "deferring packet.\n",
1468 /* We should check that some rx space is free.
1470 free one and mark stats->rx_dropped++. */
1471 tp
->stats
.rx_dropped
++;
1472 tp
->rx_buf
[cur_rx
].cmdsts
= RX_BUF_SIZE
;
1476 skb_reserve(skb
, 2); /* 16 byte align the IP fields. */
1477 if (rx_size
+CRC_SIZE
> RX_BUF_SIZE
) {
1479 int semi_count = RX_BUF_LEN - ring_offset - 4;
1480 memcpy(skb_put(skb, semi_count),
1481 &rx_bufs[ring_offset + 4], semi_count);
1482 memcpy(skb_put(skb, rx_size-semi_count),
1483 rx_bufs, rx_size - semi_count);
1484 if (sis900_debug > 4) {
1486 printk(KERN_DEBUG"%s: Frame wrap @%d",
1487 dev->name, semi_count);
1488 for (i = 0; i < 16; i++)
1489 printk(" %2.2x", rx_bufs[i]);
1491 memset(rx_bufs, 0xcc, 16);
1495 #if 0 /* USE_IP_COPYSUM */
1496 eth_copy_and_sum(skb
,
1497 tp
->rx_buf
[cur_rx
].buf
, rx_size
, 0);
1498 skb_put(skb
, rx_size
);
1500 memcpy(skb_put(skb
, rx_size
),
1501 tp
->rx_buf
[cur_rx
].buf
, rx_size
);
1504 skb
->protocol
= eth_type_trans(skb
, dev
);
1506 #if LINUX_VERSION_CODE > 0x20119
1507 tp
->stats
.rx_bytes
+= rx_size
;
1509 tp
->stats
.rx_packets
++;
1511 tp
->rx_buf
[cur_rx
].cmdsts
= RX_BUF_SIZE
;
1513 cur_rx
= ((cur_rx
+1) % NUM_RX_DESC
);
1514 rx_status
= tp
->rx_buf
[cur_rx
].cmdsts
;
1516 if (sis900_debug
> 4)
1517 printk(KERN_INFO
"%s: Done sis900_rx(), current %4.4x "
1521 tp
->cur_rx
= cur_rx
;
1526 sis900_close(struct net_device
*dev
)
1528 long ioaddr
= dev
->base_addr
;
1529 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1535 if (sis900_debug
> 1)
1536 printk(KERN_DEBUG
"%s: Shutting down ethercard, status was 0x%4.4x.\n",
1537 dev
->name
, inl(ioaddr
+ isr
));
1539 /* Disable interrupts by clearing the interrupt mask. */
1540 outl(0x0000, ioaddr
+ imr
);
1542 /* Stop the chip's Tx and Rx DMA processes. */
1543 outl(0x00, ioaddr
+ cr
);
1545 del_timer(&tp
->timer
);
1547 free_irq(dev
->irq
, dev
);
1549 for (i
= 0; i
< NUM_TX_DESC
; i
++) {
1550 if (tp
->tx_skbuff
[i
])
1551 dev_free_skb(tp
->tx_skbuff
[i
]);
1552 tp
->tx_skbuff
[i
] = 0;
1557 /* Green! Put the chip in low-power mode. */
1564 static int mii_ioctl(struct net_device
*dev
, struct ifreq
*rq
, int cmd
)
1566 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1567 u16
*data
= (u16
*)&rq
->ifr_data
;
1570 case SIOCDEVPRIVATE
: /* Get the address of the PHY in use. */
1571 data
[0] = tp
->phys
[tp
->phy_idx
];
1573 case SIOCDEVPRIVATE
+1: /* Read the specified MII register. */
1574 data
[3] = mdio_read(dev
, data
[0] & 0x1f, data
[1] & 0x1f);
1576 case SIOCDEVPRIVATE
+2: /* Write the specified MII register */
1579 mdio_write(dev
, data
[0] & 0x1f, data
[1] & 0x1f, data
[2]);
1586 static struct enet_statistics
*
1587 sis900_get_stats(struct net_device
*dev
)
1589 struct sis900_private
*tp
= (struct sis900_private
*)dev
->priv
;
1594 /* Set or clear the multicast filter for this adaptor.
1595 This routine is not state sensitive and need not be SMP locked. */
1597 static u16
elComputeHashTableIndex(u8
*addr
)
1599 #define POLYNOMIAL 0x04C11DB6L
1600 u32 crc
= 0xffffffff, msb
;
1604 for( i
=0; i
<6; i
++ ) {
1606 for( j
=0; j
<8; j
++ ) {
1609 if( msb
^ ( byte
& 1 )) {
1616 // 7 bit crc for 128 bit hash table
1617 return( (int)(crc
>> 25) );
1620 static u16
elMIIpollBit(struct net_device
*dev
,
1630 *value
= mdio_read(dev
, phy_id
, location
);
1632 if (mask
& *value
) return(TRUE
);
1634 if (mask
& ~(*value
)) return(TRUE
);
1636 if (++i
== 1200) break;
1641 static u16
elPMDreadMode(struct net_device
*dev
,
1648 *speed
= HW_SPEED_10_MBPS
;
1649 *duplex
= FDX_CAPABLE_HALF_SELECTED
;
1651 status
= mdio_read(dev
, phy_id
, MII_ANLPAR
);
1652 OurCap
= mdio_read(dev
, phy_id
, MII_ANAR
);
1653 if (sis900_debug
> 1) {
1654 printk(KERN_INFO
"Link Part Status %4X\n", status
);
1655 printk(KERN_INFO
"Our Status %4X\n", OurCap
);
1656 printk(KERN_INFO
"Status Reg %4X\n",
1657 mdio_read(dev
, phy_id
, MII_STATUS
));
1662 (MII_NWAY_T
|MII_NWAY_T_FDX
| MII_NWAY_TX
| MII_NWAY_TX_FDX
))) {
1663 if (sis900_debug
> 1) {
1664 printk(KERN_INFO
"The other end NOT support NWAY...\n");
1666 while (( status
= mdio_read(dev
, phy_id
, 18)) & 0x4000) ;
1667 while (( status
= mdio_read(dev
, phy_id
, 18)) & 0x0020) ;
1669 *speed
= HW_SPEED_100_MBPS
;
1671 *duplex
= FDX_CAPABLE_FULL_SELECTED
;
1672 if (sis900_debug
> 3) {
1673 printk(KERN_INFO
"%s: Setting %s%s-duplex.\n",
1675 *speed
== HW_SPEED_100_MBPS
?
1676 "100mbps " : "10mbps ",
1677 *duplex
== FDX_CAPABLE_FULL_SELECTED
?
1681 if (sis900_debug
> 1) {
1682 printk(KERN_INFO
"The other end support NWAY...\n");
1685 if (status
& (MII_NWAY_TX_FDX
| MII_NWAY_T_FDX
)) {
1686 *duplex
= FDX_CAPABLE_FULL_SELECTED
;
1688 if (status
& (MII_NWAY_TX_FDX
| MII_NWAY_TX
)) {
1689 *speed
= HW_SPEED_100_MBPS
;
1691 if (sis900_debug
> 3) {
1692 printk(KERN_INFO
"%s: Setting %s%s-duplex based on"
1693 " auto-negotiated partner ability.\n",
1695 *speed
== HW_SPEED_100_MBPS
?
1696 "100mbps " : "10mbps ",
1697 *duplex
== FDX_CAPABLE_FULL_SELECTED
?
1704 static u16
elAutoNegotiate(struct net_device
*dev
, int phy_id
, int *duplex
, int *speed
)
1706 u16 status
, retnVal
;
1708 if (sis900_debug
> 1) {
1709 printk(KERN_INFO
"AutoNegotiate...\n");
1711 mdio_write(dev
, phy_id
, MII_CONTROL
, 0);
1712 mdio_write(dev
, phy_id
, MII_CONTROL
, MIICNTL_AUTO
| MIICNTL_RST_AUTO
);
1713 retnVal
= elMIIpollBit(dev
, phy_id
, MII_CONTROL
, MIICNTL_RST_AUTO
,
1716 printk(KERN_INFO
"Not wait for Reset Complete\n");
1718 retnVal
= elMIIpollBit(dev
, phy_id
, MII_STATUS
, MIISTAT_AUTO_DONE
,
1721 printk(KERN_INFO
"Not wait for AutoNego Complete\n");
1723 retnVal
= elMIIpollBit(dev
, phy_id
, MII_STATUS
, MIISTAT_LINK
,
1726 printk(KERN_INFO
"Not wait for Link Complete\n");
1728 if (status
& MIISTAT_LINK
) {
1729 elPMDreadMode(dev
, phy_id
, speed
, duplex
);
1730 elSetMediaType(dev
, *speed
, *duplex
);
1735 static void elSetCapability(struct net_device
*dev
, int phy_id
,
1736 int duplex
, int speed
)
1738 u16 cap
= ( MII_NWAY_T
| MII_NWAY_T_FDX
|
1739 MII_NWAY_TX
| MII_NWAY_TX_FDX
| MII_NWAY_CSMA_CD
);
1742 cap
&= ~( MII_NWAY_TX
| MII_NWAY_TX_FDX
);
1743 if (sis900_debug
> 1) {
1744 printk(KERN_INFO
"UNSET 100Mbps\n");
1749 cap
&= ~( MII_NWAY_T_FDX
| MII_NWAY_TX_FDX
);
1750 if (sis900_debug
> 1) {
1751 printk(KERN_INFO
"UNSET full-duplex\n");
1755 mdio_write(dev
, phy_id
, MII_ANAR
, cap
);
1758 static void elSetMediaType(struct net_device
*dev
, int speed
, int duplex
)
1760 long ioaddr
= dev
->base_addr
;
1761 u32 txCfgOn
= 0, txCfgOff
= TxDRNT
;
1762 u32 rxCfgOn
= 0, rxCfgOff
= 0;
1764 if (speed
== HW_SPEED_100_MBPS
) {
1765 txCfgOn
|= (TxDRNT_100
| TxHBI
);
1767 txCfgOn
|= TxDRNT_10
;
1770 if (duplex
== FDX_CAPABLE_FULL_SELECTED
) {
1771 txCfgOn
|= (TxCSI
| TxHBI
);
1774 txCfgOff
|= (TxCSI
| TxHBI
);
1777 outl( (inl(ioaddr
+ txcfg
) & ~txCfgOff
) | txCfgOn
, ioaddr
+ txcfg
);
1778 outl( (inl(ioaddr
+ rxcfg
) & ~rxCfgOff
) | rxCfgOn
, ioaddr
+ rxcfg
);
1781 static void set_rx_mode(struct net_device
*dev
)
1783 long ioaddr
= dev
->base_addr
;
1787 u32 rxCfgOn
= 0, rxCfgOff
= 0;
1788 u32 txCfgOn
= 0, txCfgOff
= 0;
1790 if (sis900_debug
> 3)
1791 printk(KERN_INFO
"%s: set_rx_mode (%4.4x) done--"
1793 dev
->name
, dev
->flags
, inl(ioaddr
+ rxcfg
));
1795 /* Note: do not reorder, GCC is clever about common statements. */
1796 if (dev
->flags
& IFF_PROMISC
) {
1797 printk(KERN_NOTICE
"%s: Promiscuous mode enabled.\n", dev
->name
);
1798 rx_mode
= ACCEPT_ALL_BCASTS
| ACCEPT_ALL_MCASTS
|
1799 ACCEPT_CAM_QUALIFIED
| ACCEPT_ALL_PHYS
;
1800 for (i
=0 ; i
<8 ; i
++)
1801 mc_filter
[i
]=0xffff;
1802 } else if ((dev
->mc_count
> multicast_filter_limit
)
1803 || (dev
->flags
& IFF_ALLMULTI
)) {
1804 rx_mode
= ACCEPT_ALL_BCASTS
| ACCEPT_ALL_MCASTS
|
1805 ACCEPT_CAM_QUALIFIED
;
1806 for (i
=0 ; i
<8 ; i
++)
1807 mc_filter
[i
]=0xffff;
1809 struct dev_mc_list
*mclist
;
1810 rx_mode
= ACCEPT_ALL_BCASTS
| ACCEPT_ALL_MCASTS
|
1811 ACCEPT_CAM_QUALIFIED
;
1812 for (i
=0 ; i
<8 ; i
++)
1814 for (i
= 0, mclist
= dev
->mc_list
; mclist
&& i
< dev
->mc_count
;
1815 i
++, mclist
= mclist
->next
)
1816 set_bit(elComputeHashTableIndex(mclist
->dmi_addr
),
1820 for (i
=0 ; i
<8 ; i
++) {
1821 outl((u32
)(0x00000004+i
) << 16, ioaddr
+ rfcr
);
1822 outl(mc_filter
[i
], ioaddr
+ rfdr
);
1824 /* We can safely update without stopping the chip. */
1825 //rx_mode = ACCEPT_CAM_QUALIFIED | ACCEPT_ALL_BCASTS | ACCEPT_ALL_PHYS;
1826 //rx_mode = ACCEPT_CAM_QUALIFIED | ACCEPT_ALL_BCASTS;
1827 outl(RFEN
| ((rx_mode
& (ACCEPT_ALL_MCASTS
| ACCEPT_ALL_BCASTS
|
1828 ACCEPT_ALL_PHYS
)) << RFAA_shift
), ioaddr
+ rfcr
);
1830 if (rx_mode
& ACCEPT_ALL_ERRORS
) {
1831 rxCfgOn
= RxAEP
| RxARP
| RxAJAB
;
1833 rxCfgOff
= RxAEP
| RxARP
| RxAJAB
;
1835 if (rx_mode
& MAC_LOOPBACK
) {
1839 if (!(( (struct sis900_private
*)(dev
->priv
) )->full_duplex
))
1844 if (sis900_debug
> 2) {
1845 printk(KERN_INFO
"Before Set TxCfg=%8.8x\n",inl(ioaddr
+txcfg
));
1846 printk(KERN_INFO
"Before Set RxCfg=%8.8x\n",inl(ioaddr
+rxcfg
));
1849 outl((inl(ioaddr
+ rxcfg
) | rxCfgOn
) & ~rxCfgOff
, ioaddr
+ rxcfg
);
1850 outl((inl(ioaddr
+ txcfg
) | txCfgOn
) & ~txCfgOff
, ioaddr
+ txcfg
);
1852 if (sis900_debug
> 2) {
1853 printk(KERN_INFO
"After Set TxCfg=%8.8x\n",inl(ioaddr
+txcfg
));
1854 printk(KERN_INFO
"After Set RxCfg=%8.8x\n",inl(ioaddr
+rxcfg
));
1855 printk(KERN_INFO
"Receive Filter Register:%8.8x\n",
1856 inl(ioaddr
+ rfcr
));
1861 static void sis900_reset(struct net_device
*dev
)
1863 long ioaddr
= dev
->base_addr
;
1865 outl(0, ioaddr
+ ier
);
1866 outl(0, ioaddr
+ imr
);
1867 outl(0, ioaddr
+ rfcr
);
1869 outl(RxRESET
| TxRESET
| RESET
, ioaddr
+ cr
);
1870 outl(PESEL
, ioaddr
+ cfg
);
1876 int init_module(void)
1878 return sis900_probe(0);
1882 cleanup_module(void)
1884 struct net_device
*next_dev
;
1886 /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
1887 while (root_sis900_dev
) {
1888 struct sis900_private
*tp
=
1889 (struct sis900_private
*)root_sis900_dev
->priv
;
1890 next_dev
= tp
->next_module
;
1891 unregister_netdev(root_sis900_dev
);
1892 release_region(root_sis900_dev
->base_addr
,
1893 pci_tbl
[tp
->chip_id
].io_size
);
1895 kfree(root_sis900_dev
);
1896 root_sis900_dev
= next_dev
;
1903 * compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c sis900.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
1904 * SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c sis900.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"