1 /*
2 sis190.c: Silicon Integrated Systems SiS190 ethernet driver
3
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>
7
8 Modified for gPXE 2009 by Thomas Miletich <thomas.miletich@gmail.com>
9
10 Based on r8169.c, tg3.c, 8139cp.c, skge.c, epic100.c and SiS 190/191
11 genuine driver.
12
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.
19
20 See the file COPYING in this distribution for more information.
21
22 */
23
24 FILE_LICENCE ( GPL_ANY );
25
26 #include "sis190.h"
27
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),
31 };
32
33 /******************************************************************************
34 *************** HACK to keep ISA bridge in the PCI device list ***************
35 ******************************************************************************/
36
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().
42 */
43
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),
48 };
49
sis190_isa_bridge_probe(struct pci_device * pdev __unused,const struct pci_device_id * ent __unused)50 static int sis190_isa_bridge_probe(struct pci_device *pdev __unused,
51 const struct pci_device_id *ent __unused)
52 {
53 return 0;
54 }
55
sis190_isa_bridge_remove(struct pci_device * pdev __unused)56 static void sis190_isa_bridge_remove(struct pci_device *pdev __unused)
57 {
58 return;
59 }
60
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,
67 };
68
69 /******************************************************************************
70 *********************************** </HACK> **********************************
71 ******************************************************************************/
72
73 static const u32 sis190_intr_mask =
74 RxQEmpty | RxQInt | TxQ1Int | TxQ0Int | RxHalt | TxHalt | LinkChange;
75
76 /*
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.
79 */
80 static const int multicast_filter_limit = 32;
81
__mdio_cmd(void * ioaddr,u32 ctl)82 static void __mdio_cmd(void *ioaddr, u32 ctl)
83 {
84 unsigned int i;
85
86 SIS_W32(GMIIControl, ctl);
87
88 mdelay(1);
89
90 for (i = 0; i < 100; i++) {
91 if (!(SIS_R32(GMIIControl) & EhnMIInotDone))
92 break;
93 mdelay(1);
94 }
95
96 if (i > 99)
97 DBG("sis190: PHY command timed out !\n");
98 }
99
mdio_write(void * ioaddr,int phy_id,int reg,int val)100 static void mdio_write(void *ioaddr, int phy_id, int reg, int val)
101 {
102 __mdio_cmd(ioaddr, EhnMIIreq | EhnMIIwrite |
103 (((u32) reg) << EhnMIIregShift) | (phy_id << EhnMIIpmdShift) |
104 (((u32) val) << EhnMIIdataShift));
105 }
106
mdio_read(void * ioaddr,int phy_id,int reg)107 static int mdio_read(void *ioaddr, int phy_id, int reg)
108 {
109 __mdio_cmd(ioaddr, EhnMIIreq | EhnMIIread |
110 (((u32) reg) << EhnMIIregShift) | (phy_id << EhnMIIpmdShift));
111
112 return (u16) (SIS_R32(GMIIControl) >> EhnMIIdataShift);
113 }
114
__mdio_write(struct net_device * dev,int phy_id,int reg,int val)115 static void __mdio_write(struct net_device *dev, int phy_id, int reg, int val)
116 {
117 struct sis190_private *tp = netdev_priv(dev);
118
119 mdio_write(tp->mmio_addr, phy_id, reg, val);
120 }
121
__mdio_read(struct net_device * dev,int phy_id,int reg)122 static int __mdio_read(struct net_device *dev, int phy_id, int reg)
123 {
124 struct sis190_private *tp = netdev_priv(dev);
125
126 return mdio_read(tp->mmio_addr, phy_id, reg);
127 }
128
mdio_read_latched(void * ioaddr,int phy_id,int reg)129 static u16 mdio_read_latched(void *ioaddr, int phy_id, int reg)
130 {
131 mdio_read(ioaddr, phy_id, reg);
132 return mdio_read(ioaddr, phy_id, reg);
133 }
134
sis190_read_eeprom(void * ioaddr,u32 reg)135 static u16 sis190_read_eeprom(void *ioaddr, u32 reg)
136 {
137 u16 data = 0xffff;
138 unsigned int i;
139
140 if (!(SIS_R32(ROMControl) & 0x0002))
141 return 0;
142
143 SIS_W32(ROMInterface, EEREQ | EEROP | (reg << 10));
144
145 for (i = 0; i < 200; i++) {
146 if (!(SIS_R32(ROMInterface) & EEREQ)) {
147 data = (SIS_R32(ROMInterface) & 0xffff0000) >> 16;
148 break;
149 }
150 mdelay(1);
151 }
152
153 return data;
154 }
155
sis190_irq_mask_and_ack(void * ioaddr)156 static void sis190_irq_mask_and_ack(void *ioaddr)
157 {
158 SIS_W32(IntrMask, 0x00);
159 SIS_W32(IntrStatus, 0xffffffff);
160 SIS_PCI_COMMIT();
161 }
162
sis190_asic_down(void * ioaddr)163 static void sis190_asic_down(void *ioaddr)
164 {
165 /* Stop the chip's Tx and Rx DMA processes. */
166
167 SIS_W32(TxControl, 0x1a00);
168 SIS_W32(RxControl, 0x1a00);
169
170 sis190_irq_mask_and_ack(ioaddr);
171 }
172
sis190_mark_as_last_descriptor(struct RxDesc * desc)173 static inline void sis190_mark_as_last_descriptor(struct RxDesc *desc)
174 {
175 desc->size |= cpu_to_le32(RingEnd);
176 }
177
sis190_give_to_asic(struct RxDesc * desc)178 static inline void sis190_give_to_asic(struct RxDesc *desc)
179 {
180 u32 eor = le32_to_cpu(desc->size) & RingEnd;
181
182 desc->PSize = 0x0;
183 desc->size = cpu_to_le32((RX_BUF_SIZE & RX_BUF_MASK) | eor);
184 wmb();
185 desc->status = cpu_to_le32(OWNbit | INTbit);
186 }
187
sis190_map_to_asic(struct RxDesc * desc,u32 mapping)188 static inline void sis190_map_to_asic(struct RxDesc *desc, u32 mapping)
189 {
190 desc->addr = cpu_to_le32(mapping);
191 sis190_give_to_asic(desc);
192 }
193
sis190_make_unusable_by_asic(struct RxDesc * desc)194 static inline void sis190_make_unusable_by_asic(struct RxDesc *desc)
195 {
196 desc->PSize = 0x0;
197 desc->addr = cpu_to_le32(0xdeadbeef);
198 desc->size &= cpu_to_le32(RingEnd);
199 wmb();
200 desc->status = 0x0;
201 }
202
sis190_alloc_rx_iob(struct RxDesc * desc)203 static struct io_buffer *sis190_alloc_rx_iob(struct RxDesc *desc)
204 {
205 struct io_buffer *iob;
206
207 iob = alloc_iob(RX_BUF_SIZE);
208 if (iob) {
209 u32 mapping;
210
211 mapping = virt_to_bus(iob->data);
212 sis190_map_to_asic(desc, mapping);
213 } else {
214 DBG("sis190: alloc_iob failed\n");
215 sis190_make_unusable_by_asic(desc);
216 }
217
218 return iob;
219 }
220
sis190_rx_fill(struct sis190_private * tp,u32 start,u32 end)221 static u32 sis190_rx_fill(struct sis190_private *tp, u32 start, u32 end)
222 {
223 u32 cur;
224
225 for (cur = start; cur < end; cur++) {
226 unsigned int i = cur % NUM_RX_DESC;
227
228 if (tp->Rx_iobuf[i])
229 continue;
230
231 tp->Rx_iobuf[i] = sis190_alloc_rx_iob(tp->RxDescRing + i);
232
233 if (!tp->Rx_iobuf[i])
234 break;
235 }
236 return cur - start;
237 }
238
sis190_rx_pkt_err(u32 status)239 static inline int sis190_rx_pkt_err(u32 status)
240 {
241 #define ErrMask (OVRUN | SHORT | LIMIT | MIIER | NIBON | COLON | ABORT)
242
243 if ((status & CRCOK) && !(status & ErrMask))
244 return 0;
245
246 return -1;
247 }
248
sis190_process_rx(struct sis190_private * tp)249 static int sis190_process_rx(struct sis190_private *tp)
250 {
251 u32 rx_left, cur_rx = tp->cur_rx;
252 u32 delta, count;
253
254 rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
255
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;
259 u32 status;
260
261 if (le32_to_cpu(desc->status) & OWNbit)
262 break;
263
264 status = le32_to_cpu(desc->PSize);
265
266 if (sis190_rx_pkt_err(status) < 0) {
267 sis190_give_to_asic(desc);
268 } else {
269 struct io_buffer *iob = tp->Rx_iobuf[entry];
270 unsigned int pkt_size = (status & RxSizeMask) - 4;
271
272 if (pkt_size > RX_BUF_SIZE) {
273 DBG("sis190: (frag) status = %08x.\n", status);
274 sis190_give_to_asic(desc);
275 continue;
276 }
277
278 sis190_make_unusable_by_asic(desc);
279
280 iob_put(iob, pkt_size);
281
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;
286 }
287 }
288 count = cur_rx - tp->cur_rx;
289 tp->cur_rx = cur_rx;
290
291 delta = sis190_rx_fill(tp, tp->dirty_rx, tp->cur_rx);
292 if (!delta && count)
293 DBG("sis190: no Rx buffer allocated.\n");
294 tp->dirty_rx += delta;
295
296 if (((tp->dirty_rx + NUM_RX_DESC) == tp->cur_rx))
297 DBG("sis190: Rx buffers exhausted.\n");
298
299 return count;
300 }
301
sis190_tx_pkt_err(u32 status)302 static inline int sis190_tx_pkt_err(u32 status)
303 {
304 #define TxErrMask (WND | TABRT | FIFO | LINK)
305
306 if (!(status & TxErrMask))
307 return 0;
308
309 return -1;
310 }
311
sis190_process_tx(struct sis190_private * tp)312 static void sis190_process_tx(struct sis190_private *tp)
313 {
314 u32 pending, dirty_tx = tp->dirty_tx;
315
316 pending = tp->cur_tx - dirty_tx;
317
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;
323
324 if (status & OWNbit)
325 break;
326
327 iob = tp->Tx_iobuf[entry];
328
329 if (!iob)
330 break;
331
332 if (sis190_tx_pkt_err(status) == 0) {
333 DBG2("sis190: Transmitted packet: %#08x\n", status);
334 netdev_tx_complete(tp->dev, iob);
335 } else {
336 DBG("sis190: Transmit error: %#08x\n", status);
337 netdev_tx_complete_err(tp->dev, iob, -EINVAL);
338 }
339
340 tp->Tx_iobuf[entry] = NULL;
341 }
342
343 if (tp->dirty_tx != dirty_tx)
344 tp->dirty_tx = dirty_tx;
345 }
346
347 /*
348 * The interrupt handler does all of the Rx thread work and cleans up after
349 * the Tx thread.
350 */
sis190_poll(struct net_device * dev)351 static void sis190_poll(struct net_device *dev)
352 {
353 struct sis190_private *tp = netdev_priv(dev);
354 void *ioaddr = tp->mmio_addr;
355 u32 status;
356
357 status = SIS_R32(IntrStatus);
358
359 if ((status == 0xffffffff) || !status)
360 return;
361
362 SIS_W32(IntrStatus, status);
363
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))
368 sis190_phy_task(tp);
369
370 if (status & RxQInt)
371 sis190_process_rx(tp);
372
373 if (status & TxQ0Int)
374 sis190_process_tx(tp);
375 }
376
sis190_init_ring_indexes(struct sis190_private * tp)377 static inline void sis190_init_ring_indexes(struct sis190_private *tp)
378 {
379 tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
380 }
381
sis190_init_ring(struct net_device * dev)382 static int sis190_init_ring(struct net_device *dev)
383 {
384 struct sis190_private *tp = netdev_priv(dev);
385
386 sis190_init_ring_indexes(tp);
387
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 *));
390
391 if (sis190_rx_fill(tp, 0, NUM_RX_DESC) != NUM_RX_DESC)
392 goto err;
393
394 sis190_mark_as_last_descriptor(tp->RxDescRing + NUM_RX_DESC - 1);
395
396 return 0;
397
398 err:
399 sis190_free(dev);
400 return -ENOMEM;
401 }
402
sis190_set_rx_mode(struct net_device * dev)403 static void sis190_set_rx_mode(struct net_device *dev)
404 {
405 struct sis190_private *tp = netdev_priv(dev);
406 void *ioaddr = tp->mmio_addr;
407 u32 mc_filter[2]; /* Multicast hash filter */
408 u16 rx_mode;
409
410 rx_mode = AcceptBroadcast | AcceptMyPhys | AcceptMulticast;
411 mc_filter[1] = mc_filter[0] = 0xffffffff;
412
413 SIS_W16(RxMacControl, rx_mode | 0x2);
414 SIS_W32(RxHashTable, mc_filter[0]);
415 SIS_W32(RxHashTable + 4, mc_filter[1]);
416
417 }
418
sis190_soft_reset(void * ioaddr)419 static void sis190_soft_reset(void *ioaddr)
420 {
421 SIS_W32(IntrControl, 0x8000);
422 SIS_PCI_COMMIT();
423 SIS_W32(IntrControl, 0x0);
424 sis190_asic_down(ioaddr);
425 }
426
sis190_hw_start(struct net_device * dev)427 static void sis190_hw_start(struct net_device *dev)
428 {
429 struct sis190_private *tp = netdev_priv(dev);
430 void *ioaddr = tp->mmio_addr;
431
432 sis190_soft_reset(ioaddr);
433
434 SIS_W32(TxDescStartAddr, tp->tx_dma);
435 SIS_W32(RxDescStartAddr, tp->rx_dma);
436
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);
443 SIS_W32(0x6c, 0x0);
444 SIS_W32(RxWolCtrl, 0x0);
445 SIS_W32(RxWolData, 0x0);
446
447 SIS_PCI_COMMIT();
448
449 sis190_set_rx_mode(dev);
450
451 SIS_W32(TxControl, 0x1a00 | CmdTxEnb);
452 SIS_W32(RxControl, 0x1a1d);
453 }
454
sis190_phy_task(struct sis190_private * tp)455 static void sis190_phy_task(struct sis190_private *tp)
456 {
457 struct net_device *dev = tp->dev;
458 void *ioaddr = tp->mmio_addr;
459 int phy_id = tp->mii_if.phy_id;
460 int cnt = 0;
461 u16 val;
462
463 val = mdio_read(ioaddr, phy_id, MII_BMCR);
464
465 /* 100ms timeout is completely arbitrary. I have no datasheet to
466 * check whether that's a sensible value or not.
467 */
468 while ((val & BMCR_RESET) && (cnt < 100)) {
469 val = mdio_read(ioaddr, phy_id, MII_BMCR);
470 mdelay(1);
471 cnt++;
472 }
473
474 if (cnt > 99) {
475 DBG("sis190: BMCR_RESET timeout\n");
476 return;
477 }
478
479 if (!(mdio_read_latched(ioaddr, phy_id, MII_BMSR) &
480 BMSR_ANEGCOMPLETE)) {
481 DBG("sis190: auto-negotiating...\n");
482 netdev_link_down(dev);
483 } else {
484 /* Rejoice ! */
485 struct {
486 int val;
487 u32 ctl;
488 const char *msg;
489 } reg31[] = {
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" }
503 }, *p = NULL;
504 u16 adv, autoexp, gigadv, gigrec;
505
506 val = mdio_read(ioaddr, phy_id, 0x1f);
507
508 val = mdio_read(ioaddr, phy_id, MII_LPA);
509 adv = mdio_read(ioaddr, phy_id, MII_ADVERTISE);
510
511 autoexp = mdio_read(ioaddr, phy_id, MII_EXPANSION);
512
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)
519 p = reg31;
520 else if (val & ADVERTISE_1000HALF)
521 p = reg31 + 1;
522 }
523
524 if (!p) {
525 val &= adv;
526
527 for (p = reg31; p->val; p++) {
528 if ((val & p->val) == p->val)
529 break;
530 }
531 }
532
533 p->ctl |= SIS_R32(StationControl) & ~0x0f001c00;
534
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);
539 udelay(200);
540 mdio_write(ioaddr, phy_id, 0x1c, 0x8c00);
541 p->ctl |= 0x03000000;
542 }
543
544 SIS_W32(StationControl, p->ctl);
545
546 if (tp->features & F_HAS_RGMII) {
547 SIS_W32(RGDelay, 0x0441);
548 SIS_W32(RGDelay, 0x0440);
549 }
550
551 DBG("sis190: link on %s mode.\n", p->msg);
552 netdev_link_up(dev);
553 }
554 }
555
sis190_open(struct net_device * dev)556 static int sis190_open(struct net_device *dev)
557 {
558 struct sis190_private *tp = netdev_priv(dev);
559 int rc;
560
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");
565 rc = -ENOMEM;
566 goto out;
567 }
568 tp->tx_dma = cpu_to_le32(virt_to_bus(tp->TxDescRing));
569
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");
574 rc = -ENOMEM;
575 goto error;
576 }
577 tp->rx_dma = cpu_to_le32(virt_to_bus(tp->RxDescRing));
578
579 rc = sis190_init_ring(dev);
580 if (rc < 0)
581 goto error;
582
583 /* init rx filter, also program MAC address to card */
584 sis190_init_rxfilter(dev);
585
586 sis190_hw_start(dev);
587 out:
588 return rc;
589
590 error:
591 sis190_free(dev);
592 goto out;
593 }
594
sis190_down(struct net_device * dev)595 static void sis190_down(struct net_device *dev)
596 {
597 struct sis190_private *tp = netdev_priv(dev);
598 void *ioaddr = tp->mmio_addr;
599
600 do {
601 sis190_asic_down(ioaddr);
602 } while (SIS_R32(IntrMask));
603 }
604
sis190_free(struct net_device * dev)605 static void sis190_free(struct net_device *dev)
606 {
607 struct sis190_private *tp = netdev_priv(dev);
608 int i;
609
610 free_dma(tp->TxDescRing, TX_RING_BYTES);
611 free_dma(tp->RxDescRing, RX_RING_BYTES);
612
613 tp->TxDescRing = NULL;
614 tp->RxDescRing = NULL;
615
616 tp->tx_dma = 0;
617 tp->rx_dma = 0;
618
619 tp->cur_tx = tp->dirty_tx = 0;
620 tp->cur_rx = tp->dirty_rx = 0;
621
622 for (i = 0; i < NUM_RX_DESC; i++) {
623 free_iob(tp->Rx_iobuf[i]);
624 tp->Rx_iobuf[i] = NULL;
625 }
626
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;
630 }
631
sis190_close(struct net_device * dev)632 static void sis190_close(struct net_device *dev)
633 {
634 sis190_down(dev);
635 sis190_free(dev);
636 }
637
sis190_transmit(struct net_device * dev,struct io_buffer * iob)638 static int sis190_transmit(struct net_device *dev, struct io_buffer *iob)
639 {
640 struct sis190_private *tp = netdev_priv(dev);
641 void *ioaddr = tp->mmio_addr;
642 u32 len, entry;
643 struct TxDesc *desc;
644
645 len = iob_len(iob);
646 if (len < ETH_ZLEN) {
647 iob_pad(iob, ETH_ZLEN);
648 len = ETH_ZLEN;
649 }
650
651 entry = tp->cur_tx % NUM_TX_DESC;
652 desc = tp->TxDescRing + entry;
653
654 if (le32_to_cpu(desc->status) & OWNbit) {
655 DBG("sis190: Tx Ring full\n");
656 return -EINVAL;
657 }
658
659 tp->Tx_iobuf[entry] = iob;
660
661 desc->PSize = cpu_to_le32(len);
662 desc->addr = cpu_to_le32(virt_to_bus(iob->data));
663
664 desc->size = cpu_to_le32(len);
665 if (entry == (NUM_TX_DESC - 1))
666 desc->size |= cpu_to_le32(RingEnd);
667
668 wmb();
669
670 desc->status = cpu_to_le32(OWNbit | INTbit | DEFbit | CRCbit | PADbit);
671
672 tp->cur_tx++;
673
674 SIS_W32(TxControl, 0x1a00 | CmdReset | CmdTxEnb);
675
676 return 0;
677 }
678
sis190_free_phy(struct list_head * first_phy)679 static void sis190_free_phy(struct list_head *first_phy)
680 {
681 struct sis190_phy *cur, *next;
682
683 list_for_each_entry_safe(cur, next, first_phy, list) {
684 free(cur);
685 }
686 }
687
688 /**
689 * sis190_default_phy - Select default PHY for sis190 mac.
690 * @dev: the net device to probe for
691 *
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.
695 */
sis190_default_phy(struct sis190_private * tp)696 static u16 sis190_default_phy(struct sis190_private *tp)
697 {
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;
701 u16 status;
702
703 phy_home = phy_default = phy_lan = NULL;
704
705 list_for_each_entry(phy, &tp->first_phy, list) {
706 status = mdio_read_latched(ioaddr, phy->phy_id, MII_BMSR);
707
708 // Link ON & Not select default PHY & not ghost PHY.
709 if ((status & BMSR_LSTATUS) &&
710 !phy_default &&
711 (phy->type != UNKNOWN)) {
712 phy_default = phy;
713 } else {
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)
718 phy_home = phy;
719 else if (phy->type == LAN)
720 phy_lan = phy;
721 }
722 }
723
724 if (!phy_default) {
725 if (phy_home)
726 phy_default = phy_home;
727 else if (phy_lan)
728 phy_default = phy_lan;
729 else
730 phy_default = list_entry(&tp->first_phy,
731 struct sis190_phy, list);
732 }
733
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",
737 mii_if->phy_id);
738 }
739
740 status = mdio_read(ioaddr, mii_if->phy_id, MII_BMCR);
741 status &= (~BMCR_ISOLATE);
742
743 mdio_write(ioaddr, mii_if->phy_id, MII_BMCR, status);
744 status = mdio_read_latched(ioaddr, mii_if->phy_id, MII_BMSR);
745
746 return status;
747 }
748
sis190_init_phy(struct sis190_private * tp,struct sis190_phy * phy,unsigned int phy_id,u16 mii_status)749 static void sis190_init_phy(struct sis190_private *tp,
750 struct sis190_phy *phy, unsigned int phy_id,
751 u16 mii_status)
752 {
753 void *ioaddr = tp->mmio_addr;
754 struct mii_chip_info *p;
755
756 INIT_LIST_HEAD(&phy->list);
757 phy->status = mii_status;
758 phy->phy_id = phy_id;
759
760 phy->id[0] = mdio_read(ioaddr, phy_id, MII_PHYSID1);
761 phy->id[1] = mdio_read(ioaddr, phy_id, MII_PHYSID2);
762
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))) {
766 break;
767 }
768 }
769
770 if (p->id[1]) {
771 phy->type = (p->type == MIX) ?
772 ((mii_status & (BMSR_100FULL | BMSR_100HALF)) ?
773 LAN : HOME) : p->type;
774 tp->features |= p->feature;
775
776 DBG("sis190: %s transceiver at address %d.\n", p->name, phy_id);
777 } else {
778 phy->type = UNKNOWN;
779
780 DBG("sis190: unknown PHY 0x%x:0x%x transceiver at address %d\n",
781 phy->id[0], (phy->id[1] & 0xfff0), phy_id);
782 }
783 }
784
sis190_mii_probe_88e1111_fixup(struct sis190_private * tp)785 static void sis190_mii_probe_88e1111_fixup(struct sis190_private *tp)
786 {
787 if (tp->features & F_PHY_88E1111) {
788 void *ioaddr = tp->mmio_addr;
789 int phy_id = tp->mii_if.phy_id;
790 u16 reg[2][2] = {
791 { 0x808b, 0x0ce1 },
792 { 0x808f, 0x0c60 }
793 }, *p;
794
795 p = (tp->features & F_HAS_RGMII) ? reg[0] : reg[1];
796
797 mdio_write(ioaddr, phy_id, 0x1b, p[0]);
798 udelay(200);
799 mdio_write(ioaddr, phy_id, 0x14, p[1]);
800 udelay(200);
801 }
802 }
803
804 /**
805 * sis190_mii_probe - Probe MII PHY for sis190
806 * @dev: the net device to probe for
807 *
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.
811 */
sis190_mii_probe(struct net_device * dev)812 static int sis190_mii_probe(struct net_device *dev)
813 {
814 struct sis190_private *tp = netdev_priv(dev);
815 struct mii_if_info *mii_if = &tp->mii_if;
816 void *ioaddr = tp->mmio_addr;
817 int phy_id;
818 int rc = 0;
819
820 INIT_LIST_HEAD(&tp->first_phy);
821
822 for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) {
823 struct sis190_phy *phy;
824 u16 status;
825
826 status = mdio_read_latched(ioaddr, phy_id, MII_BMSR);
827
828 // Try next mii if the current one is not accessible.
829 if (status == 0xffff || status == 0x0000)
830 continue;
831
832 phy = zalloc(sizeof(*phy));
833 if (!phy) {
834 sis190_free_phy(&tp->first_phy);
835 rc = -ENOMEM;
836 goto out;
837 }
838
839 DBG("sis190: found PHY\n");
840
841 sis190_init_phy(tp, phy, phy_id, status);
842
843 list_add(&tp->first_phy, &phy->list);
844 }
845
846 if (list_empty(&tp->first_phy)) {
847 DBG("sis190: No MII transceivers found!\n");
848 rc = -EIO;
849 goto out;
850 }
851
852 /* Select default PHY for mac */
853 sis190_default_phy(tp);
854
855 sis190_mii_probe_88e1111_fixup(tp);
856
857 mii_if->dev = dev;
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;
862 out:
863 return rc;
864 }
865
sis190_mii_remove(struct net_device * dev)866 static void sis190_mii_remove(struct net_device *dev)
867 {
868 struct sis190_private *tp = netdev_priv(dev);
869
870 sis190_free_phy(&tp->first_phy);
871 }
872
sis190_init_board(struct pci_device * pdev,struct net_device ** netdev)873 static int sis190_init_board(struct pci_device *pdev, struct net_device **netdev)
874 {
875 struct sis190_private *tp;
876 struct net_device *dev;
877 void *ioaddr;
878 int rc;
879
880 dev = alloc_etherdev(sizeof(*tp));
881 if (!dev) {
882 DBG("sis190: unable to alloc new etherdev\n");
883 rc = -ENOMEM;
884 goto err;
885 }
886
887 dev->dev = &pdev->dev;
888
889 tp = netdev_priv(dev);
890 memset(tp, 0, sizeof(*tp));
891
892 tp->dev = dev;
893
894 adjust_pci_device(pdev);
895
896 ioaddr = ioremap(pdev->membase, SIS190_REGS_SIZE);
897 if (!ioaddr) {
898 DBG("sis190: cannot remap MMIO, aborting\n");
899 rc = -EIO;
900 goto err;
901 }
902
903 tp->pci_device = pdev;
904 tp->mmio_addr = ioaddr;
905
906 sis190_irq_mask_and_ack(ioaddr);
907
908 sis190_soft_reset(ioaddr);
909
910 *netdev = dev;
911
912 return 0;
913
914 err:
915 return rc;
916 }
917
sis190_set_rgmii(struct sis190_private * tp,u8 reg)918 static void sis190_set_rgmii(struct sis190_private *tp, u8 reg)
919 {
920 tp->features |= (reg & 0x80) ? F_HAS_RGMII : 0;
921 }
922
sis190_get_mac_addr_from_eeprom(struct pci_device * pdev __unused,struct net_device * dev)923 static int sis190_get_mac_addr_from_eeprom(struct pci_device *pdev __unused,
924 struct net_device *dev)
925 {
926 struct sis190_private *tp = netdev_priv(dev);
927 void *ioaddr = tp->mmio_addr;
928 u16 sig;
929 int i;
930
931 DBG("sis190: Read MAC address from EEPROM\n");
932
933 /* Check to see if there is a sane EEPROM */
934 sig = (u16) sis190_read_eeprom(ioaddr, EEPROMSignature);
935
936 if ((sig == 0xffff) || (sig == 0x0000)) {
937 DBG("sis190: Error EEPROM read.\n");
938 return -EIO;
939 }
940
941 /* Get MAC address from EEPROM */
942 for (i = 0; i < ETH_ALEN / 2; i++) {
943 u16 w = sis190_read_eeprom(ioaddr, EEPROMMACAddr + i);
944
945 ((u16 *)dev->hw_addr)[i] = cpu_to_le16(w);
946 }
947
948 sis190_set_rgmii(tp, sis190_read_eeprom(ioaddr, EEPROMInfo));
949
950 return 0;
951 }
952
953 /**
954 * sis190_get_mac_addr_from_apc - Get MAC address for SiS96x model
955 * @pdev: PCI device
956 * @dev: network device to get address for
957 *
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.
961 */
sis190_get_mac_addr_from_apc(struct pci_device * pdev,struct net_device * dev)962 static int sis190_get_mac_addr_from_apc(struct pci_device *pdev,
963 struct net_device *dev)
964 {
965 struct sis190_private *tp = netdev_priv(dev);
966 struct pci_device *isa_bridge = NULL;
967 struct device *d;
968 u8 reg, tmp8;
969 unsigned int i;
970
971 DBG("sis190: Read MAC address from APC.\n");
972
973 list_for_each_entry(d, &(pdev->dev.siblings), siblings) {
974 unsigned int i;
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");
982 break;
983 } else {
984 isa_bridge = NULL;
985 }
986 }
987 if(isa_bridge)
988 break;
989 }
990
991 if (!isa_bridge) {
992 DBG("sis190: Can not find ISA bridge.\n");
993 return -EIO;
994 }
995
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);
1000 udelay(50);
1001 pci_read_config_byte(isa_bridge, 0x48, ®);
1002
1003 for (i = 0; i < ETH_ALEN; i++) {
1004 outb(0x9 + i, 0x78);
1005 dev->hw_addr[i] = inb(0x79);
1006 }
1007
1008 outb(0x12, 0x78);
1009 reg = inb(0x79);
1010
1011 sis190_set_rgmii(tp, reg);
1012
1013 /* Restore the value to ISA Bridge */
1014 pci_write_config_byte(isa_bridge, 0x48, tmp8);
1015
1016 return 0;
1017 }
1018
1019 /**
1020 * sis190_init_rxfilter - Initialize the Rx filter
1021 * @dev: network device to initialize
1022 *
1023 * Set receive filter address to our MAC address
1024 * and enable packet filtering.
1025 */
sis190_init_rxfilter(struct net_device * dev)1026 static inline void sis190_init_rxfilter(struct net_device *dev)
1027 {
1028 struct sis190_private *tp = netdev_priv(dev);
1029 void *ioaddr = tp->mmio_addr;
1030 u16 ctl;
1031 int i;
1032
1033 ctl = SIS_R16(RxMacControl);
1034 /*
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
1038 */
1039 SIS_W16(RxMacControl, ctl & ~0x0f00);
1040
1041 for (i = 0; i < ETH_ALEN; i++)
1042 SIS_W8(RxMacAddr + i, dev->ll_addr[i]);
1043
1044 SIS_W16(RxMacControl, ctl);
1045 SIS_PCI_COMMIT();
1046 }
1047
sis190_get_mac_addr(struct pci_device * pdev,struct net_device * dev)1048 static int sis190_get_mac_addr(struct pci_device *pdev,
1049 struct net_device *dev)
1050 {
1051 int rc;
1052
1053 rc = sis190_get_mac_addr_from_eeprom(pdev, dev);
1054 if (rc < 0) {
1055 u8 reg;
1056
1057 pci_read_config_byte(pdev, 0x73, ®);
1058
1059 if (reg & 0x00000001)
1060 rc = sis190_get_mac_addr_from_apc(pdev, dev);
1061 }
1062 return rc;
1063 }
1064
sis190_set_speed_auto(struct net_device * dev)1065 static void sis190_set_speed_auto(struct net_device *dev)
1066 {
1067 struct sis190_private *tp = netdev_priv(dev);
1068 void *ioaddr = tp->mmio_addr;
1069 int phy_id = tp->mii_if.phy_id;
1070 int val;
1071
1072 DBG("sis190: Enabling Auto-negotiation.\n");
1073
1074 val = mdio_read(ioaddr, phy_id, MII_ADVERTISE);
1075
1076 // Enable 10/100 Full/Half Mode, leave MII_ADVERTISE bit4:0
1077 // unchanged.
1078 mdio_write(ioaddr, phy_id, MII_ADVERTISE, (val & ADVERTISE_SLCT) |
1079 ADVERTISE_100FULL | ADVERTISE_10FULL |
1080 ADVERTISE_100HALF | ADVERTISE_10HALF);
1081
1082 // Enable 1000 Full Mode.
1083 mdio_write(ioaddr, phy_id, MII_CTRL1000, ADVERTISE_1000FULL);
1084
1085 // Enable auto-negotiation and restart auto-negotiation.
1086 mdio_write(ioaddr, phy_id, MII_BMCR,
1087 BMCR_ANENABLE | BMCR_ANRESTART | BMCR_RESET);
1088 }
1089
sis190_irq(struct net_device * dev,int enable)1090 static void sis190_irq(struct net_device *dev, int enable)
1091 {
1092 struct sis190_private *tp = netdev_priv(dev);
1093 void *ioaddr = tp->mmio_addr;
1094
1095 SIS_W32(IntrStatus, 0xffffffff);
1096
1097 if (enable == 0)
1098 SIS_W32(IntrMask, 0x00);
1099 else
1100 SIS_W32(IntrMask, sis190_intr_mask);
1101
1102 SIS_PCI_COMMIT();
1103 }
1104
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,
1110 .irq = sis190_irq,
1111 };
1112
sis190_probe(struct pci_device * pdev,const struct pci_device_id * ent __unused)1113 static int sis190_probe(struct pci_device *pdev,
1114 const struct pci_device_id *ent __unused)
1115 {
1116 struct sis190_private *tp;
1117 struct net_device *dev;
1118 void *ioaddr;
1119 int rc;
1120
1121 rc = sis190_init_board(pdev, &dev);
1122 if (rc < 0)
1123 goto out;
1124
1125 pci_set_drvdata(pdev, dev);
1126
1127 tp = netdev_priv(dev);
1128 ioaddr = tp->mmio_addr;
1129
1130 rc = sis190_get_mac_addr(pdev, dev);
1131 if (rc < 0)
1132 goto err;
1133
1134 rc = sis190_mii_probe(dev);
1135 if (rc < 0)
1136 goto err;
1137
1138 rc = register_netdev(dev);
1139 if (rc < 0)
1140 goto err;
1141
1142 sis190_set_speed_auto(dev);
1143 sis190_phy_task(tp);
1144
1145 netdev_init(dev, &sis190_netdev_ops);
1146 netdev_link_down(dev);
1147 out:
1148 return rc;
1149
1150 err:
1151 sis190_mii_remove(dev);
1152 iounmap(tp->mmio_addr);
1153 goto out;
1154 }
1155
sis190_remove(struct pci_device * pdev)1156 static void sis190_remove(struct pci_device *pdev)
1157 {
1158 struct net_device *dev = pci_get_drvdata(pdev);
1159 struct sis190_private *tp = dev->priv;
1160 void *ioaddr = tp->mmio_addr;
1161
1162 sis190_mii_remove(dev);
1163
1164 /* shutdown chip, disable interrupts, etc */
1165 sis190_soft_reset(ioaddr);
1166
1167 iounmap(tp->mmio_addr);
1168
1169 unregister_netdev(dev);
1170 netdev_nullify(dev);
1171 netdev_put(dev);
1172 }
1173
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,
1179 };
1180