2 sis190.c: Silicon Integrated Systems SiS190 ethernet driver
4 Copyright (c) 2003 K.M. Liu <kmliu@sis.com>
5 Copyright (c) 2003, 2004 Jeff Garzik <jgarzik@pobox.com>
6 Copyright (c) 2003, 2004, 2005 Francois Romieu <romieu@fr.zoreil.com>
8 Modified for gPXE 2009 by Thomas Miletich <thomas.miletich@gmail.com>
10 Based on r8169.c, tg3.c, 8139cp.c, skge.c, epic100.c and SiS 190/191
13 This software may be used and distributed according to the terms of
14 the GNU General Public License (GPL), incorporated herein by reference.
15 Drivers based on or derived from this code fall under the GPL and must
16 retain the authorship, copyright and license notice. This file is not
17 a complete program and may only be used when the entire operating
18 system is licensed under the GPL.
20 See the file COPYING in this distribution for more information.
24 FILE_LICENCE ( GPL_ANY
);
28 static struct pci_device_id sis190_pci_tbl
[] = {
29 PCI_ROM (0x1039, 0x0190, "sis190", "sis190", 0),
30 PCI_ROM (0x1039, 0x0191, "sis191", "sis191", 0),
33 /******************************************************************************
34 *************** HACK to keep ISA bridge in the PCI device list ***************
35 ******************************************************************************/
37 /* Some sis190 variants store the MAC address in the BIOS CMOS. To read it, we
38 * have to use a PCI to ISA bridge. To access the bridge we need a few things
39 * from it's struct pci_device. We fake the successful probe of a driver to
40 * keep the bridge's struct pci_device in the list of pci_devices.
41 * See details in sis190_get_mac_addr_from_apc().
44 static struct pci_device_id sis190_isa_bridge_tbl
[] = {
45 PCI_ID (0x1039, 0x0965, "", "", 0),
46 PCI_ID (0x1039, 0x0966, "", "", 0),
47 PCI_ID (0x1039, 0x0968, "", "", 0),
50 static int sis190_isa_bridge_probe(struct pci_device
*pdev __unused
,
51 const struct pci_device_id
*ent __unused
)
56 static void sis190_isa_bridge_remove(struct pci_device
*pdev __unused
)
61 struct pci_driver sis190_isa_bridge_driver __pci_driver
= {
62 .ids
= sis190_isa_bridge_tbl
,
63 .id_count
= (sizeof(sis190_isa_bridge_tbl
) /
64 sizeof(sis190_isa_bridge_tbl
[0])),
65 .probe
= sis190_isa_bridge_probe
,
66 .remove
= sis190_isa_bridge_remove
,
69 /******************************************************************************
70 *********************************** </HACK> **********************************
71 ******************************************************************************/
73 static const u32 sis190_intr_mask
=
74 RxQEmpty
| RxQInt
| TxQ1Int
| TxQ0Int
| RxHalt
| TxHalt
| LinkChange
;
77 * Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
78 * The chips use a 64 element hash table based on the Ethernet CRC.
80 static const int multicast_filter_limit
= 32;
82 static void __mdio_cmd(void *ioaddr
, u32 ctl
)
86 SIS_W32(GMIIControl
, ctl
);
90 for (i
= 0; i
< 100; i
++) {
91 if (!(SIS_R32(GMIIControl
) & EhnMIInotDone
))
97 DBG("sis190: PHY command timed out !\n");
100 static void mdio_write(void *ioaddr
, int phy_id
, int reg
, int val
)
102 __mdio_cmd(ioaddr
, EhnMIIreq
| EhnMIIwrite
|
103 (((u32
) reg
) << EhnMIIregShift
) | (phy_id
<< EhnMIIpmdShift
) |
104 (((u32
) val
) << EhnMIIdataShift
));
107 static int mdio_read(void *ioaddr
, int phy_id
, int reg
)
109 __mdio_cmd(ioaddr
, EhnMIIreq
| EhnMIIread
|
110 (((u32
) reg
) << EhnMIIregShift
) | (phy_id
<< EhnMIIpmdShift
));
112 return (u16
) (SIS_R32(GMIIControl
) >> EhnMIIdataShift
);
115 static void __mdio_write(struct net_device
*dev
, int phy_id
, int reg
, int val
)
117 struct sis190_private
*tp
= netdev_priv(dev
);
119 mdio_write(tp
->mmio_addr
, phy_id
, reg
, val
);
122 static int __mdio_read(struct net_device
*dev
, int phy_id
, int reg
)
124 struct sis190_private
*tp
= netdev_priv(dev
);
126 return mdio_read(tp
->mmio_addr
, phy_id
, reg
);
129 static u16
mdio_read_latched(void *ioaddr
, int phy_id
, int reg
)
131 mdio_read(ioaddr
, phy_id
, reg
);
132 return mdio_read(ioaddr
, phy_id
, reg
);
135 static u16
sis190_read_eeprom(void *ioaddr
, u32 reg
)
140 if (!(SIS_R32(ROMControl
) & 0x0002))
143 SIS_W32(ROMInterface
, EEREQ
| EEROP
| (reg
<< 10));
145 for (i
= 0; i
< 200; i
++) {
146 if (!(SIS_R32(ROMInterface
) & EEREQ
)) {
147 data
= (SIS_R32(ROMInterface
) & 0xffff0000) >> 16;
156 static void sis190_irq_mask_and_ack(void *ioaddr
)
158 SIS_W32(IntrMask
, 0x00);
159 SIS_W32(IntrStatus
, 0xffffffff);
163 static void sis190_asic_down(void *ioaddr
)
165 /* Stop the chip's Tx and Rx DMA processes. */
167 SIS_W32(TxControl
, 0x1a00);
168 SIS_W32(RxControl
, 0x1a00);
170 sis190_irq_mask_and_ack(ioaddr
);
173 static inline void sis190_mark_as_last_descriptor(struct RxDesc
*desc
)
175 desc
->size
|= cpu_to_le32(RingEnd
);
178 static inline void sis190_give_to_asic(struct RxDesc
*desc
)
180 u32 eor
= le32_to_cpu(desc
->size
) & RingEnd
;
183 desc
->size
= cpu_to_le32((RX_BUF_SIZE
& RX_BUF_MASK
) | eor
);
185 desc
->status
= cpu_to_le32(OWNbit
| INTbit
);
188 static inline void sis190_map_to_asic(struct RxDesc
*desc
, u32 mapping
)
190 desc
->addr
= cpu_to_le32(mapping
);
191 sis190_give_to_asic(desc
);
194 static inline void sis190_make_unusable_by_asic(struct RxDesc
*desc
)
197 desc
->addr
= cpu_to_le32(0xdeadbeef);
198 desc
->size
&= cpu_to_le32(RingEnd
);
203 static struct io_buffer
*sis190_alloc_rx_iob(struct RxDesc
*desc
)
205 struct io_buffer
*iob
;
207 iob
= alloc_iob(RX_BUF_SIZE
);
211 mapping
= virt_to_bus(iob
->data
);
212 sis190_map_to_asic(desc
, mapping
);
214 DBG("sis190: alloc_iob failed\n");
215 sis190_make_unusable_by_asic(desc
);
221 static u32
sis190_rx_fill(struct sis190_private
*tp
, u32 start
, u32 end
)
225 for (cur
= start
; cur
< end
; cur
++) {
226 unsigned int i
= cur
% NUM_RX_DESC
;
231 tp
->Rx_iobuf
[i
] = sis190_alloc_rx_iob(tp
->RxDescRing
+ i
);
233 if (!tp
->Rx_iobuf
[i
])
239 static inline int sis190_rx_pkt_err(u32 status
)
241 #define ErrMask (OVRUN | SHORT | LIMIT | MIIER | NIBON | COLON | ABORT)
243 if ((status
& CRCOK
) && !(status
& ErrMask
))
249 static int sis190_process_rx(struct sis190_private
*tp
)
251 u32 rx_left
, cur_rx
= tp
->cur_rx
;
254 rx_left
= NUM_RX_DESC
+ tp
->dirty_rx
- cur_rx
;
256 for (; rx_left
> 0; rx_left
--, cur_rx
++) {
257 unsigned int entry
= cur_rx
% NUM_RX_DESC
;
258 struct RxDesc
*desc
= tp
->RxDescRing
+ entry
;
261 if (le32_to_cpu(desc
->status
) & OWNbit
)
264 status
= le32_to_cpu(desc
->PSize
);
266 if (sis190_rx_pkt_err(status
) < 0) {
267 sis190_give_to_asic(desc
);
269 struct io_buffer
*iob
= tp
->Rx_iobuf
[entry
];
270 unsigned int pkt_size
= (status
& RxSizeMask
) - 4;
272 if (pkt_size
> RX_BUF_SIZE
) {
273 DBG("sis190: (frag) status = %08x.\n", status
);
274 sis190_give_to_asic(desc
);
278 sis190_make_unusable_by_asic(desc
);
280 iob_put(iob
, pkt_size
);
282 DBG2("sis190: received packet. len: %d\n", pkt_size
);
283 netdev_rx(tp
->dev
, iob
);
284 DBGIO_HD(iob
->data
, 60);
285 tp
->Rx_iobuf
[entry
] = NULL
;
288 count
= cur_rx
- tp
->cur_rx
;
291 delta
= sis190_rx_fill(tp
, tp
->dirty_rx
, tp
->cur_rx
);
293 DBG("sis190: no Rx buffer allocated.\n");
294 tp
->dirty_rx
+= delta
;
296 if (((tp
->dirty_rx
+ NUM_RX_DESC
) == tp
->cur_rx
))
297 DBG("sis190: Rx buffers exhausted.\n");
302 static inline int sis190_tx_pkt_err(u32 status
)
304 #define TxErrMask (WND | TABRT | FIFO | LINK)
306 if (!(status
& TxErrMask
))
312 static void sis190_process_tx(struct sis190_private
*tp
)
314 u32 pending
, dirty_tx
= tp
->dirty_tx
;
316 pending
= tp
->cur_tx
- dirty_tx
;
318 for (; pending
; pending
--, dirty_tx
++) {
319 unsigned int entry
= dirty_tx
% NUM_TX_DESC
;
320 struct TxDesc
*txd
= tp
->TxDescRing
+ entry
;
321 u32 status
= le32_to_cpu(txd
->status
);
322 struct io_buffer
*iob
;
327 iob
= tp
->Tx_iobuf
[entry
];
332 if (sis190_tx_pkt_err(status
) == 0) {
333 DBG2("sis190: Transmitted packet: %#08x\n", status
);
334 netdev_tx_complete(tp
->dev
, iob
);
336 DBG("sis190: Transmit error: %#08x\n", status
);
337 netdev_tx_complete_err(tp
->dev
, iob
, -EINVAL
);
340 tp
->Tx_iobuf
[entry
] = NULL
;
343 if (tp
->dirty_tx
!= dirty_tx
)
344 tp
->dirty_tx
= dirty_tx
;
348 * The interrupt handler does all of the Rx thread work and cleans up after
351 static void sis190_poll(struct net_device
*dev
)
353 struct sis190_private
*tp
= netdev_priv(dev
);
354 void *ioaddr
= tp
->mmio_addr
;
357 status
= SIS_R32(IntrStatus
);
359 if ((status
== 0xffffffff) || !status
)
362 SIS_W32(IntrStatus
, status
);
364 /* sis190_phy_task() needs to be called in event of a LinkChange and
365 * after auto-negotiation is finished. Finishing auto-neg won't generate
366 * any indication, hence we call it every time if the link is bad. */
367 if ((status
& LinkChange
) || !netdev_link_ok(dev
))
371 sis190_process_rx(tp
);
373 if (status
& TxQ0Int
)
374 sis190_process_tx(tp
);
377 static inline void sis190_init_ring_indexes(struct sis190_private
*tp
)
379 tp
->dirty_tx
= tp
->dirty_rx
= tp
->cur_tx
= tp
->cur_rx
= 0;
382 static int sis190_init_ring(struct net_device
*dev
)
384 struct sis190_private
*tp
= netdev_priv(dev
);
386 sis190_init_ring_indexes(tp
);
388 memset(tp
->Tx_iobuf
, 0, NUM_TX_DESC
* sizeof(struct io_buffer
*));
389 memset(tp
->Rx_iobuf
, 0, NUM_RX_DESC
* sizeof(struct io_buffer
*));
391 if (sis190_rx_fill(tp
, 0, NUM_RX_DESC
) != NUM_RX_DESC
)
394 sis190_mark_as_last_descriptor(tp
->RxDescRing
+ NUM_RX_DESC
- 1);
403 static void sis190_set_rx_mode(struct net_device
*dev
)
405 struct sis190_private
*tp
= netdev_priv(dev
);
406 void *ioaddr
= tp
->mmio_addr
;
407 u32 mc_filter
[2]; /* Multicast hash filter */
410 rx_mode
= AcceptBroadcast
| AcceptMyPhys
| AcceptMulticast
;
411 mc_filter
[1] = mc_filter
[0] = 0xffffffff;
413 SIS_W16(RxMacControl
, rx_mode
| 0x2);
414 SIS_W32(RxHashTable
, mc_filter
[0]);
415 SIS_W32(RxHashTable
+ 4, mc_filter
[1]);
419 static void sis190_soft_reset(void *ioaddr
)
421 SIS_W32(IntrControl
, 0x8000);
423 SIS_W32(IntrControl
, 0x0);
424 sis190_asic_down(ioaddr
);
427 static void sis190_hw_start(struct net_device
*dev
)
429 struct sis190_private
*tp
= netdev_priv(dev
);
430 void *ioaddr
= tp
->mmio_addr
;
432 sis190_soft_reset(ioaddr
);
434 SIS_W32(TxDescStartAddr
, tp
->tx_dma
);
435 SIS_W32(RxDescStartAddr
, tp
->rx_dma
);
437 SIS_W32(IntrStatus
, 0xffffffff);
438 SIS_W32(IntrMask
, 0x0);
439 SIS_W32(GMIIControl
, 0x0);
440 SIS_W32(TxMacControl
, 0x60);
441 SIS_W16(RxMacControl
, 0x02);
442 SIS_W32(RxHashTable
, 0x0);
444 SIS_W32(RxWolCtrl
, 0x0);
445 SIS_W32(RxWolData
, 0x0);
449 sis190_set_rx_mode(dev
);
451 SIS_W32(TxControl
, 0x1a00 | CmdTxEnb
);
452 SIS_W32(RxControl
, 0x1a1d);
455 static void sis190_phy_task(struct sis190_private
*tp
)
457 struct net_device
*dev
= tp
->dev
;
458 void *ioaddr
= tp
->mmio_addr
;
459 int phy_id
= tp
->mii_if
.phy_id
;
463 val
= mdio_read(ioaddr
, phy_id
, MII_BMCR
);
465 /* 100ms timeout is completely arbitrary. I have no datasheet to
466 * check whether that's a sensible value or not.
468 while ((val
& BMCR_RESET
) && (cnt
< 100)) {
469 val
= mdio_read(ioaddr
, phy_id
, MII_BMCR
);
475 DBG("sis190: BMCR_RESET timeout\n");
479 if (!(mdio_read_latched(ioaddr
, phy_id
, MII_BMSR
) &
480 BMSR_ANEGCOMPLETE
)) {
481 DBG("sis190: auto-negotiating...\n");
482 netdev_link_down(dev
);
490 { LPA_1000FULL
, 0x07000c00 | 0x00001000,
491 "1000 Mbps Full Duplex" },
492 { LPA_1000HALF
, 0x07000c00,
493 "1000 Mbps Half Duplex" },
494 { LPA_100FULL
, 0x04000800 | 0x00001000,
495 "100 Mbps Full Duplex" },
496 { LPA_100HALF
, 0x04000800,
497 "100 Mbps Half Duplex" },
498 { LPA_10FULL
, 0x04000400 | 0x00001000,
499 "10 Mbps Full Duplex" },
500 { LPA_10HALF
, 0x04000400,
501 "10 Mbps Half Duplex" },
502 { 0, 0x04000400, "unknown" }
504 u16 adv
, autoexp
, gigadv
, gigrec
;
506 val
= mdio_read(ioaddr
, phy_id
, 0x1f);
508 val
= mdio_read(ioaddr
, phy_id
, MII_LPA
);
509 adv
= mdio_read(ioaddr
, phy_id
, MII_ADVERTISE
);
511 autoexp
= mdio_read(ioaddr
, phy_id
, MII_EXPANSION
);
513 if (val
& LPA_NPAGE
&& autoexp
& EXPANSION_NWAY
) {
514 /* check for gigabit speed */
515 gigadv
= mdio_read(ioaddr
, phy_id
, MII_CTRL1000
);
516 gigrec
= mdio_read(ioaddr
, phy_id
, MII_STAT1000
);
517 val
= (gigadv
& (gigrec
>> 2));
518 if (val
& ADVERTISE_1000FULL
)
520 else if (val
& ADVERTISE_1000HALF
)
527 for (p
= reg31
; p
->val
; p
++) {
528 if ((val
& p
->val
) == p
->val
)
533 p
->ctl
|= SIS_R32(StationControl
) & ~0x0f001c00;
535 if ((tp
->features
& F_HAS_RGMII
) &&
536 (tp
->features
& F_PHY_BCM5461
)) {
537 // Set Tx Delay in RGMII mode.
538 mdio_write(ioaddr
, phy_id
, 0x18, 0xf1c7);
540 mdio_write(ioaddr
, phy_id
, 0x1c, 0x8c00);
541 p
->ctl
|= 0x03000000;
544 SIS_W32(StationControl
, p
->ctl
);
546 if (tp
->features
& F_HAS_RGMII
) {
547 SIS_W32(RGDelay
, 0x0441);
548 SIS_W32(RGDelay
, 0x0440);
551 DBG("sis190: link on %s mode.\n", p
->msg
);
556 static int sis190_open(struct net_device
*dev
)
558 struct sis190_private
*tp
= netdev_priv(dev
);
561 /* Allocate TX ring */
562 tp
->TxDescRing
= malloc_dma(TX_RING_BYTES
, RING_ALIGNMENT
);
563 if (!tp
->TxDescRing
) {
564 DBG("sis190: TX ring allocation failed\n");
568 tp
->tx_dma
= cpu_to_le32(virt_to_bus(tp
->TxDescRing
));
570 /* Allocate RX ring */
571 tp
->RxDescRing
= malloc_dma(RX_RING_BYTES
, RING_ALIGNMENT
);
572 if (!tp
->RxDescRing
) {
573 DBG("sis190: RX ring allocation failed\n");
577 tp
->rx_dma
= cpu_to_le32(virt_to_bus(tp
->RxDescRing
));
579 rc
= sis190_init_ring(dev
);
583 /* init rx filter, also program MAC address to card */
584 sis190_init_rxfilter(dev
);
586 sis190_hw_start(dev
);
595 static void sis190_down(struct net_device
*dev
)
597 struct sis190_private
*tp
= netdev_priv(dev
);
598 void *ioaddr
= tp
->mmio_addr
;
601 sis190_asic_down(ioaddr
);
602 } while (SIS_R32(IntrMask
));
605 static void sis190_free(struct net_device
*dev
)
607 struct sis190_private
*tp
= netdev_priv(dev
);
610 free_dma(tp
->TxDescRing
, TX_RING_BYTES
);
611 free_dma(tp
->RxDescRing
, RX_RING_BYTES
);
613 tp
->TxDescRing
= NULL
;
614 tp
->RxDescRing
= NULL
;
619 tp
->cur_tx
= tp
->dirty_tx
= 0;
620 tp
->cur_rx
= tp
->dirty_rx
= 0;
622 for (i
= 0; i
< NUM_RX_DESC
; i
++) {
623 free_iob(tp
->Rx_iobuf
[i
]);
624 tp
->Rx_iobuf
[i
] = NULL
;
627 /* tx io_buffers aren't owned by the driver, so don't free them */
628 for(i
= 0; i
< NUM_TX_DESC
; i
++)
629 tp
->Tx_iobuf
[i
] = NULL
;
632 static void sis190_close(struct net_device
*dev
)
638 static int sis190_transmit(struct net_device
*dev
, struct io_buffer
*iob
)
640 struct sis190_private
*tp
= netdev_priv(dev
);
641 void *ioaddr
= tp
->mmio_addr
;
646 if (len
< ETH_ZLEN
) {
647 iob_pad(iob
, ETH_ZLEN
);
651 entry
= tp
->cur_tx
% NUM_TX_DESC
;
652 desc
= tp
->TxDescRing
+ entry
;
654 if (le32_to_cpu(desc
->status
) & OWNbit
) {
655 DBG("sis190: Tx Ring full\n");
659 tp
->Tx_iobuf
[entry
] = iob
;
661 desc
->PSize
= cpu_to_le32(len
);
662 desc
->addr
= cpu_to_le32(virt_to_bus(iob
->data
));
664 desc
->size
= cpu_to_le32(len
);
665 if (entry
== (NUM_TX_DESC
- 1))
666 desc
->size
|= cpu_to_le32(RingEnd
);
670 desc
->status
= cpu_to_le32(OWNbit
| INTbit
| DEFbit
| CRCbit
| PADbit
);
674 SIS_W32(TxControl
, 0x1a00 | CmdReset
| CmdTxEnb
);
679 static void sis190_free_phy(struct list_head
*first_phy
)
681 struct sis190_phy
*cur
, *next
;
683 list_for_each_entry_safe(cur
, next
, first_phy
, list
) {
689 * sis190_default_phy - Select default PHY for sis190 mac.
690 * @dev: the net device to probe for
692 * Select first detected PHY with link as default.
693 * If no one is link on, select PHY whose types is HOME as default.
694 * If HOME doesn't exist, select LAN.
696 static u16
sis190_default_phy(struct sis190_private
*tp
)
698 struct sis190_phy
*phy
, *phy_home
, *phy_default
, *phy_lan
;
699 struct mii_if_info
*mii_if
= &tp
->mii_if
;
700 void *ioaddr
= tp
->mmio_addr
;
703 phy_home
= phy_default
= phy_lan
= NULL
;
705 list_for_each_entry(phy
, &tp
->first_phy
, list
) {
706 status
= mdio_read_latched(ioaddr
, phy
->phy_id
, MII_BMSR
);
708 // Link ON & Not select default PHY & not ghost PHY.
709 if ((status
& BMSR_LSTATUS
) &&
711 (phy
->type
!= UNKNOWN
)) {
714 status
= mdio_read(ioaddr
, phy
->phy_id
, MII_BMCR
);
715 mdio_write(ioaddr
, phy
->phy_id
, MII_BMCR
,
716 status
| BMCR_ANENABLE
| BMCR_ISOLATE
);
717 if (phy
->type
== HOME
)
719 else if (phy
->type
== LAN
)
726 phy_default
= phy_home
;
728 phy_default
= phy_lan
;
730 phy_default
= list_entry(&tp
->first_phy
,
731 struct sis190_phy
, list
);
734 if (mii_if
->phy_id
!= phy_default
->phy_id
) {
735 mii_if
->phy_id
= phy_default
->phy_id
;
736 DBG("sis190: Using transceiver at address %d as default.\n",
740 status
= mdio_read(ioaddr
, mii_if
->phy_id
, MII_BMCR
);
741 status
&= (~BMCR_ISOLATE
);
743 mdio_write(ioaddr
, mii_if
->phy_id
, MII_BMCR
, status
);
744 status
= mdio_read_latched(ioaddr
, mii_if
->phy_id
, MII_BMSR
);
749 static void sis190_init_phy(struct sis190_private
*tp
,
750 struct sis190_phy
*phy
, unsigned int phy_id
,
753 void *ioaddr
= tp
->mmio_addr
;
754 struct mii_chip_info
*p
;
756 INIT_LIST_HEAD(&phy
->list
);
757 phy
->status
= mii_status
;
758 phy
->phy_id
= phy_id
;
760 phy
->id
[0] = mdio_read(ioaddr
, phy_id
, MII_PHYSID1
);
761 phy
->id
[1] = mdio_read(ioaddr
, phy_id
, MII_PHYSID2
);
763 for (p
= mii_chip_table
; p
->type
; p
++) {
764 if ((p
->id
[0] == phy
->id
[0]) &&
765 (p
->id
[1] == (phy
->id
[1] & 0xfff0))) {
771 phy
->type
= (p
->type
== MIX
) ?
772 ((mii_status
& (BMSR_100FULL
| BMSR_100HALF
)) ?
773 LAN
: HOME
) : p
->type
;
774 tp
->features
|= p
->feature
;
776 DBG("sis190: %s transceiver at address %d.\n", p
->name
, phy_id
);
780 DBG("sis190: unknown PHY 0x%x:0x%x transceiver at address %d\n",
781 phy
->id
[0], (phy
->id
[1] & 0xfff0), phy_id
);
785 static void sis190_mii_probe_88e1111_fixup(struct sis190_private
*tp
)
787 if (tp
->features
& F_PHY_88E1111
) {
788 void *ioaddr
= tp
->mmio_addr
;
789 int phy_id
= tp
->mii_if
.phy_id
;
795 p
= (tp
->features
& F_HAS_RGMII
) ? reg
[0] : reg
[1];
797 mdio_write(ioaddr
, phy_id
, 0x1b, p
[0]);
799 mdio_write(ioaddr
, phy_id
, 0x14, p
[1]);
805 * sis190_mii_probe - Probe MII PHY for sis190
806 * @dev: the net device to probe for
808 * Search for total of 32 possible mii phy addresses.
809 * Identify and set current phy if found one,
810 * return error if it failed to found.
812 static int sis190_mii_probe(struct net_device
*dev
)
814 struct sis190_private
*tp
= netdev_priv(dev
);
815 struct mii_if_info
*mii_if
= &tp
->mii_if
;
816 void *ioaddr
= tp
->mmio_addr
;
820 INIT_LIST_HEAD(&tp
->first_phy
);
822 for (phy_id
= 0; phy_id
< PHY_MAX_ADDR
; phy_id
++) {
823 struct sis190_phy
*phy
;
826 status
= mdio_read_latched(ioaddr
, phy_id
, MII_BMSR
);
828 // Try next mii if the current one is not accessible.
829 if (status
== 0xffff || status
== 0x0000)
832 phy
= zalloc(sizeof(*phy
));
834 sis190_free_phy(&tp
->first_phy
);
839 DBG("sis190: found PHY\n");
841 sis190_init_phy(tp
, phy
, phy_id
, status
);
843 list_add(&tp
->first_phy
, &phy
->list
);
846 if (list_empty(&tp
->first_phy
)) {
847 DBG("sis190: No MII transceivers found!\n");
852 /* Select default PHY for mac */
853 sis190_default_phy(tp
);
855 sis190_mii_probe_88e1111_fixup(tp
);
858 mii_if
->mdio_read
= __mdio_read
;
859 mii_if
->mdio_write
= __mdio_write
;
860 mii_if
->phy_id_mask
= PHY_ID_ANY
;
861 mii_if
->reg_num_mask
= MII_REG_ANY
;
866 static void sis190_mii_remove(struct net_device
*dev
)
868 struct sis190_private
*tp
= netdev_priv(dev
);
870 sis190_free_phy(&tp
->first_phy
);
873 static int sis190_init_board(struct pci_device
*pdev
, struct net_device
**netdev
)
875 struct sis190_private
*tp
;
876 struct net_device
*dev
;
880 dev
= alloc_etherdev(sizeof(*tp
));
882 DBG("sis190: unable to alloc new etherdev\n");
887 dev
->dev
= &pdev
->dev
;
889 tp
= netdev_priv(dev
);
890 memset(tp
, 0, sizeof(*tp
));
894 adjust_pci_device(pdev
);
896 ioaddr
= ioremap(pdev
->membase
, SIS190_REGS_SIZE
);
898 DBG("sis190: cannot remap MMIO, aborting\n");
903 tp
->pci_device
= pdev
;
904 tp
->mmio_addr
= ioaddr
;
906 sis190_irq_mask_and_ack(ioaddr
);
908 sis190_soft_reset(ioaddr
);
918 static void sis190_set_rgmii(struct sis190_private
*tp
, u8 reg
)
920 tp
->features
|= (reg
& 0x80) ? F_HAS_RGMII
: 0;
923 static int sis190_get_mac_addr_from_eeprom(struct pci_device
*pdev __unused
,
924 struct net_device
*dev
)
926 struct sis190_private
*tp
= netdev_priv(dev
);
927 void *ioaddr
= tp
->mmio_addr
;
931 DBG("sis190: Read MAC address from EEPROM\n");
933 /* Check to see if there is a sane EEPROM */
934 sig
= (u16
) sis190_read_eeprom(ioaddr
, EEPROMSignature
);
936 if ((sig
== 0xffff) || (sig
== 0x0000)) {
937 DBG("sis190: Error EEPROM read.\n");
941 /* Get MAC address from EEPROM */
942 for (i
= 0; i
< ETH_ALEN
/ 2; i
++) {
943 u16 w
= sis190_read_eeprom(ioaddr
, EEPROMMACAddr
+ i
);
945 ((u16
*)dev
->hw_addr
)[i
] = cpu_to_le16(w
);
948 sis190_set_rgmii(tp
, sis190_read_eeprom(ioaddr
, EEPROMInfo
));
954 * sis190_get_mac_addr_from_apc - Get MAC address for SiS96x model
956 * @dev: network device to get address for
958 * SiS96x model, use APC CMOS RAM to store MAC address.
959 * APC CMOS RAM is accessed through ISA bridge.
960 * MAC address is read into @net_dev->dev_addr.
962 static int sis190_get_mac_addr_from_apc(struct pci_device
*pdev
,
963 struct net_device
*dev
)
965 struct sis190_private
*tp
= netdev_priv(dev
);
966 struct pci_device
*isa_bridge
= NULL
;
971 DBG("sis190: Read MAC address from APC.\n");
973 list_for_each_entry(d
, &(pdev
->dev
.siblings
), siblings
) {
975 isa_bridge
= container_of(d
, struct pci_device
, dev
);
976 for(i
= 0; i
< sis190_isa_bridge_driver
.id_count
; i
++) {
977 if(isa_bridge
->vendor
==
978 sis190_isa_bridge_driver
.ids
[i
].vendor
979 && isa_bridge
->device
==
980 sis190_isa_bridge_driver
.ids
[i
].device
) {
981 DBG("sis190: ISA bridge found\n");
992 DBG("sis190: Can not find ISA bridge.\n");
996 /* Enable port 78h & 79h to access APC Registers. */
997 pci_read_config_byte(isa_bridge
, 0x48, &tmp8
);
998 reg
= (tmp8
& ~0x02);
999 pci_write_config_byte(isa_bridge
, 0x48, reg
);
1001 pci_read_config_byte(isa_bridge
, 0x48, ®
);
1003 for (i
= 0; i
< ETH_ALEN
; i
++) {
1004 outb(0x9 + i
, 0x78);
1005 dev
->hw_addr
[i
] = inb(0x79);
1011 sis190_set_rgmii(tp
, reg
);
1013 /* Restore the value to ISA Bridge */
1014 pci_write_config_byte(isa_bridge
, 0x48, tmp8
);
1020 * sis190_init_rxfilter - Initialize the Rx filter
1021 * @dev: network device to initialize
1023 * Set receive filter address to our MAC address
1024 * and enable packet filtering.
1026 static inline void sis190_init_rxfilter(struct net_device
*dev
)
1028 struct sis190_private
*tp
= netdev_priv(dev
);
1029 void *ioaddr
= tp
->mmio_addr
;
1033 ctl
= SIS_R16(RxMacControl
);
1035 * Disable packet filtering before setting filter.
1036 * Note: SiS's driver writes 32 bits but RxMacControl is 16 bits
1037 * only and followed by RxMacAddr (6 bytes). Strange. -- FR
1039 SIS_W16(RxMacControl
, ctl
& ~0x0f00);
1041 for (i
= 0; i
< ETH_ALEN
; i
++)
1042 SIS_W8(RxMacAddr
+ i
, dev
->ll_addr
[i
]);
1044 SIS_W16(RxMacControl
, ctl
);
1048 static int sis190_get_mac_addr(struct pci_device
*pdev
,
1049 struct net_device
*dev
)
1053 rc
= sis190_get_mac_addr_from_eeprom(pdev
, dev
);
1057 pci_read_config_byte(pdev
, 0x73, ®
);
1059 if (reg
& 0x00000001)
1060 rc
= sis190_get_mac_addr_from_apc(pdev
, dev
);
1065 static void sis190_set_speed_auto(struct net_device
*dev
)
1067 struct sis190_private
*tp
= netdev_priv(dev
);
1068 void *ioaddr
= tp
->mmio_addr
;
1069 int phy_id
= tp
->mii_if
.phy_id
;
1072 DBG("sis190: Enabling Auto-negotiation.\n");
1074 val
= mdio_read(ioaddr
, phy_id
, MII_ADVERTISE
);
1076 // Enable 10/100 Full/Half Mode, leave MII_ADVERTISE bit4:0
1078 mdio_write(ioaddr
, phy_id
, MII_ADVERTISE
, (val
& ADVERTISE_SLCT
) |
1079 ADVERTISE_100FULL
| ADVERTISE_10FULL
|
1080 ADVERTISE_100HALF
| ADVERTISE_10HALF
);
1082 // Enable 1000 Full Mode.
1083 mdio_write(ioaddr
, phy_id
, MII_CTRL1000
, ADVERTISE_1000FULL
);
1085 // Enable auto-negotiation and restart auto-negotiation.
1086 mdio_write(ioaddr
, phy_id
, MII_BMCR
,
1087 BMCR_ANENABLE
| BMCR_ANRESTART
| BMCR_RESET
);
1090 static void sis190_irq(struct net_device
*dev
, int enable
)
1092 struct sis190_private
*tp
= netdev_priv(dev
);
1093 void *ioaddr
= tp
->mmio_addr
;
1095 SIS_W32(IntrStatus
, 0xffffffff);
1098 SIS_W32(IntrMask
, 0x00);
1100 SIS_W32(IntrMask
, sis190_intr_mask
);
1105 static struct net_device_operations sis190_netdev_ops
= {
1106 .open
= sis190_open
,
1107 .close
= sis190_close
,
1108 .poll
= sis190_poll
,
1109 .transmit
= sis190_transmit
,
1113 static int sis190_probe(struct pci_device
*pdev
,
1114 const struct pci_device_id
*ent __unused
)
1116 struct sis190_private
*tp
;
1117 struct net_device
*dev
;
1121 rc
= sis190_init_board(pdev
, &dev
);
1125 pci_set_drvdata(pdev
, dev
);
1127 tp
= netdev_priv(dev
);
1128 ioaddr
= tp
->mmio_addr
;
1130 rc
= sis190_get_mac_addr(pdev
, dev
);
1134 rc
= sis190_mii_probe(dev
);
1138 rc
= register_netdev(dev
);
1142 sis190_set_speed_auto(dev
);
1143 sis190_phy_task(tp
);
1145 netdev_init(dev
, &sis190_netdev_ops
);
1146 netdev_link_down(dev
);
1151 sis190_mii_remove(dev
);
1152 iounmap(tp
->mmio_addr
);
1156 static void sis190_remove(struct pci_device
*pdev
)
1158 struct net_device
*dev
= pci_get_drvdata(pdev
);
1159 struct sis190_private
*tp
= dev
->priv
;
1160 void *ioaddr
= tp
->mmio_addr
;
1162 sis190_mii_remove(dev
);
1164 /* shutdown chip, disable interrupts, etc */
1165 sis190_soft_reset(ioaddr
);
1167 iounmap(tp
->mmio_addr
);
1169 unregister_netdev(dev
);
1170 netdev_nullify(dev
);
1174 struct pci_driver sis190_pci_driver __pci_driver
= {
1175 .ids
= sis190_pci_tbl
,
1176 .id_count
= (sizeof(sis190_pci_tbl
) / sizeof(sis190_pci_tbl
[0])),
1177 .probe
= sis190_probe
,
1178 .remove
= sis190_remove
,