Here is a patch to use the fiber optic interface from an Allied Telesyn AT-2450FTX. The card uses the AMD 79C972 chip and works fine using the original driver on the twisted pair port. The change is only effective as a module, and takes the parameter "fiber=1" to enable the interface. This patch is for kernel 2.2.18. All questions and comments are welcome. Thank you, Stephen H Koh --- drivers/net/pcnet32.c.orig Tue Jan 16 21:48:58 2001 +++ drivers/net/pcnet32.c Tue Jan 16 22:34:39 2001 @@ -90,6 +90,7 @@ #define MAX_UNITS 8 static int options[MAX_UNITS] = {0, }; static int full_duplex[MAX_UNITS] = {0, }; +static int fiber; /* * Theory of Operation @@ -810,6 +811,25 @@ (u32) virt_to_bus(lp->rx_ring), (u32) virt_to_bus(&lp->init_block)); + /* + * option for fiber optic interface + * as found in Allied Telesyn's AT-2450FTX + * + * set DANAS, clear ASEL, select MII + * set the external PHY Isolate bit for PHYAD 1 + * and clear it for PHYAD 2 + */ + if (fiber) { + printk("pcnet32: using fiber optic interface\n"); + lp->a.write_bcr(ioaddr, 32, lp->a.read_bcr(ioaddr, 32) | 0x80); + lp->a.write_bcr(ioaddr, 2, lp->a.read_bcr(ioaddr, 2) & ~0x2); + lp->a.write_csr(ioaddr, 15, lp->a.read_csr(ioaddr, 15) | 0x180); + lp->a.write_bcr(ioaddr, 33, (lp->a.read_bcr(ioaddr, 33) & ~0x3e0) | 0x1 << 5); + lp->a.write_bcr(ioaddr, 34, lp->a.read_bcr(ioaddr, 34) | 0x400); + lp->a.write_bcr(ioaddr, 33, (lp->a.read_bcr(ioaddr, 33) & ~0x3e0) | 0x2 << 5); + lp->a.write_bcr(ioaddr, 34, lp->a.read_bcr(ioaddr, 34) & ~0x400); + } + /* set/reset autoselect bit */ val = lp->a.read_bcr (ioaddr, 2) & ~2; if (lp->options & PORT_ASEL) @@ -1502,6 +1522,7 @@ MODULE_PARM(tx_start_pt, "i"); MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i"); MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i"); +MODULE_PARM(fiber, "i"); /* An additional parameter that may be passed in... */ - : send the line "unsubscribe linux-net" in the body of a message to majordomo@vger.kernel.org