diff -uNr linux-2.4.20-orig/drivers/net/epic100.c linux-2.4.20/drivers/net/epic100.c
--- linux-2.4.20-orig/drivers/net/epic100.c	2003-01-28 11:38:46.000000000 +0100
+++ linux-2.4.20/drivers/net/epic100.c	2003-01-28 12:46:43.000000000 +0100
@@ -67,10 +67,14 @@
 	* fix spurious bad initializations
 	* pound phy a la SMSC's app note on the subject
 
+	epic100_fx.diff:
+	* fiber link enabled on the SMC9432FTX-SC, tested during open of the interface; if no link found, utp/bnc is enabled
+	  real work done by Christoph Dolina, I made some improvements and code-cleanup (<gernot@hillier.de>)
+
 */
 
 #define DRV_NAME	"epic100"
-#define DRV_VERSION	"1.11+LK1.1.14"
+#define DRV_VERSION	"1.11+LK1.1.14+fx.diff"
 #define DRV_RELDATE	"Aug 4, 2002"
 
 
@@ -162,7 +166,7 @@
 MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
 MODULE_PARM_DESC(debug, "EPIC/100 debug level (0-5)");
 MODULE_PARM_DESC(max_interrupt_work, "EPIC/100 maximum events handled per interrupt");
-MODULE_PARM_DESC(options, "EPIC/100: Bits 0-3: media type, bit 4: full duplex");
+MODULE_PARM_DESC(options, "EPIC/100: Bits 0-3: media type (0=auto, 1=10Base2, 6=100BaseFX), bit 4: full duplex");
 MODULE_PARM_DESC(rx_copybreak, "EPIC/100 copy breakpoint for copy-only-tiny-frames");
 MODULE_PARM_DESC(full_duplex, "EPIC/100 full duplex setting(s) (1)");
 
@@ -349,6 +353,7 @@
 	struct mii_if_info mii;
 	unsigned int tx_full:1;				/* The Tx queue is full. */
 	unsigned int default_port:4;		/* Last dev->if_port value. */
+	unsigned int mii_phy_id:32;		/* MII_PHY_ID1 << 16 + MII_PHY_ID2  -> type of MII we have */	
 };
 
 static int epic_open(struct net_device *dev);
@@ -489,6 +494,9 @@
 	ep->chip_id = chip_idx;
 	ep->chip_flags = pci_id_tbl[chip_idx].drv_flags;
 
+	/* (Christoph Dolina): Needed for rising up the Hardware */
+	udelay(200);
+
 	/* Find the connected MII xcvrs.
 	   Doing this in open() would allow detecting external xcvrs later, but
 	   takes much time and no cards have external MII. */
@@ -510,6 +518,8 @@
 			printk(KERN_INFO DRV_NAME "(%s): Autonegotiation advertising %4.4x link "
 				   "partner %4.4x.\n",
 				   pdev->slot_name, ep->mii.advertising, mdio_read(dev, phy, 5));
+			ep->mii_phy_id = mdio_read(dev,phy,MII_PHYSID1);
+                        ep->mii_phy_id = (ep->mii_phy_id << 16) + mdio_read(dev,phy,MII_PHYSID2);
 		} else if ( ! (ep->chip_flags & NO_MII)) {
 			printk(KERN_WARNING DRV_NAME "(%s): ***WARNING***: No MII transceiver found!\n",
 			       pdev->slot_name);
@@ -671,6 +681,7 @@
 	long ioaddr = dev->base_addr;
 	int i;
 	int retval;
+        signed long remaining;
 
 	/* Soft reset the chip. */
 	outl(0x4001, ioaddr + GENCTL);
@@ -714,29 +725,65 @@
 	ep->tx_threshold = TX_FIFO_THRESH;
 	outl(ep->tx_threshold, ioaddr + TxThresh);
 
-	if (media2miictl[dev->if_port & 15]) {
-		if (ep->mii_phy_cnt)
-			mdio_write(dev, ep->phys[0], MII_BMCR, media2miictl[dev->if_port&15]);
-		if (dev->if_port == 1) {
-			if (debug > 1)
-				printk(KERN_INFO "%s: Using the 10base2 transceiver, MII "
-					   "status %4.4x.\n",
-					   dev->name, mdio_read(dev, ep->phys[0], MII_BMSR));
+	udelay(200);
+
+	/* fiber media support for the SMC9432FTX-SC (LevelOne LXT970 MII) */
+	/* if fiber selected and we have LXT970, search for link on fiber, if not switch to utp */
+	if ((dev->if_port==0 || dev->if_port==6) && ((ep->mii_phy_id & 0xfffffc00) == 0x78100000 ) ) {
+		if (debug>1)
+			printk(KERN_INFO "%s: activating fiber, waiting 1.5 sec for link up\n",dev->name);
+
+		/* disable auto-negotiation, enable full duplex and 100 Mbps (see Level One LXT970 data sheet, revision 1.1, page 11-185) */
+		mdio_write(dev, ep->phys[0], MII_BMCR, BMCR_FULLDPLX | BMCR_SPEED100);
+		/* enable fiber, Led_On must be set otherwise the fiber transceiver on the SMC9432FTX won't work ?! */
+		mdio_write(dev, ep->phys[0], MII_LXT970_CONFIG, LXT970_CONFIG_100BASEFX | LXT970_CONFIG_LEDC_ON);
+
+		/* Wait until fiber ready => so we can check for link up */
+		remaining=1.5*HZ;
+		while (remaining) {
+			set_current_state(TASK_INTERRUPTIBLE);
+			remaining=schedule_timeout(remaining);
 		}
-	} else {
-		int mii_lpa = mdio_read(dev, ep->phys[0], MII_LPA);
-		if (mii_lpa != 0xffff) {
-			if ((mii_lpa & LPA_100FULL) || (mii_lpa & 0x01C0) == LPA_10FULL)
-				ep->mii.full_duplex = 1;
-			else if (! (mii_lpa & LPA_LPACK))
-				mdio_write(dev, ep->phys[0], MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART);
-			if (debug > 1)
-				printk(KERN_INFO "%s: Setting %s-duplex based on MII xcvr %d"
-					   " register read of %4.4x.\n", dev->name,
-					   ep->mii.full_duplex ? "full" : "half",
-					   ep->phys[0], mii_lpa);
+
+		/* Status-Reg (0x14): check for link up */
+		i = mdio_read(dev, ep->phys[0], MII_LXT970_CHIPSTAT);
+	} else 
+		i=0; /* we have no link till now */
+
+	/* IF no Link, change type of media */
+	if ( (dev->if_port != 6) && (( i & LXT970_CHIPSTAT_LINKOK) == 0) ) {
+		if (debug > 1)
+			printk(KERN_INFO "%s: no link, change media\n", dev->name);
+
+		if ( (ep->mii_phy_id & 0xfffffc00) == 0x78100000 ) /* if LXT970 transceiver, then disable fiber */
+			mdio_write(dev, ep->phys[0], MII_LXT970_CONFIG, 0x0000);
+		mdio_write(dev, ep->phys[0], MII_BMCR, BMCR_ANENABLE); /* re-enable auto-negotiation */
+
+                /* now let's activate utp or bnc */
+		if (media2miictl[dev->if_port & 15]) {
+			if (ep->mii_phy_cnt)
+				mdio_write(dev, ep->phys[0], MII_BMCR, media2miictl[dev->if_port&15]);
+			if (dev->if_port == 1) {
+				if (debug > 1)
+					printk(KERN_INFO "%s: Using the 10base2 transceiver, MII "
+						"status %4.4x.\n",
+						dev->name, mdio_read(dev, ep->phys[0], MII_BMSR));
+			}
+		} else {
+			int mii_lpa = mdio_read(dev, ep->phys[0], MII_LPA);
+			if (mii_lpa != 0xffff) {
+				if ((mii_lpa & LPA_100FULL) || (mii_lpa & 0x01C0) == LPA_10FULL)
+					ep->mii.full_duplex = 1;
+				else if (! (mii_lpa & LPA_LPACK))
+					mdio_write(dev, ep->phys[0], MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART);
+				if (debug > 1)
+					printk(KERN_INFO "%s: Setting %s-duplex based on MII xcvr %d"
+						" register read of %4.4x.\n", dev->name,
+						ep->mii.full_duplex ? "full" : "half",
+						ep->phys[0], mii_lpa);
+			}
 		}
-	}
+        }
 
 	outl(ep->mii.full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
 	outl(ep->rx_ring_dma, ioaddr + PRxCDAR);
diff -uNr linux-2.4.20-orig/include/linux/mii.h linux-2.4.20/include/linux/mii.h
--- linux-2.4.20-orig/include/linux/mii.h	2003-01-28 11:39:53.000000000 +0100
+++ linux-2.4.20/include/linux/mii.h	2003-01-28 12:18:42.000000000 +0100
@@ -3,6 +3,9 @@
  * Originally drivers/net/sunhme.h.
  *
  * Copyright (C) 1996, 1999, 2001 David S. Miller (davem@redhat.com)
+ * 
+ * 2002-08-08: symbols for LXT970 MII transceiver added (<gernot@hillier.de>)
+ *
  */
 
 #ifndef __LINUX_MII_H__
@@ -10,15 +13,18 @@
 
 #include <linux/types.h>
 
-/* Generic MII registers. */
-
+/* Generic MII registers (0,1 mandatory, 2-7 optional). */
 #define MII_BMCR            0x00        /* Basic mode control register */
 #define MII_BMSR            0x01        /* Basic mode status register  */
 #define MII_PHYSID1         0x02        /* PHYS ID 1                   */
 #define MII_PHYSID2         0x03        /* PHYS ID 2                   */
 #define MII_ADVERTISE       0x04        /* Advertisement control reg   */
 #define MII_LPA             0x05        /* Link partner ability reg    */
-#define MII_EXPANSION       0x06        /* Expansion register          */
+#define MII_EXPANSION       0x06        /* Auto-Negotiation Expansion  */
+#define MII_NEXTPAGE	    0x07        /* Auto-Negotiation Next Page  */
+/* 0x07 - 0x0F: reserved */
+
+/* vendor specific MII registers. */
 #define MII_DCOUNTER        0x12        /* Disconnect counter          */
 #define MII_FCSCOUNTER      0x13        /* False carrier counter       */
 #define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
@@ -31,6 +37,14 @@
 #define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */
 #define MII_NCONFIG         0x1c        /* Network interface config    */
 
+/* vendor specific MII registers for Level One LXT970 transceiver (see LXT970 Data Sheet, Revision 1.1 of May 1997). */
+#define MII_LXT970_MIRROR   0x10	/* Mirror Register	       */
+#define MII_LXT970_INTENAB  0x11	/* Interrupt Enable Register   */
+#define MII_LXT970_INTSTAT  0x12	/* Interrupt Status Register   */
+#define MII_LXT970_CONFIG   0x13	/* Config Register	       */
+#define MII_LXT970_CHIPSTAT 0x14	/* Chip Status Register	       */
+ 
+
 /* Basic mode control register. */
 #define BMCR_RESV               0x007f  /* Unused...                   */
 #define BMCR_CTST               0x0080  /* Collision test              */
@@ -50,7 +64,11 @@
 #define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */
 #define BMSR_RFAULT             0x0010  /* Remote fault detected       */
 #define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
-#define BMSR_RESV               0x07c0  /* Unused...                   */
+#define BMSR_MFPREAMBLESUP      0x0040  /* MF with suppressed preamble */
+#define BMSR_MSCONFIGFAULT      0x0080  /* Master-Slave config fault   */
+#define BMSR_RESV               0x0100  /* Unused...                   */
+#define BMSR_100BASE2HALF       0x0200  /* Can do 100BASET2, half-dupl */
+#define BMSR_100BASE2FULL       0x0400  /* Can do 100BASET2, full-dupl */
 #define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
 #define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
 #define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
@@ -103,6 +121,53 @@
 #define NWAYTEST_LOOPBACK       0x0100  /* Enable loopback for N-way   */
 #define NWAYTEST_RESV2          0xfe00  /* Unused...                   */
 
+/* LXT970 Interrupt Enable Register. */
+#define LXT970_INTENAB_TINT	0x0001  /* force MDINT		       */
+#define LXT970_INTENAB_INTEN    0x0002  /* enable interrupts	       */
+#define LXT970_INTENAB_RESV	0xfffc  /* Unused...		       */
+
+/* LXT970 Interrupt Status Register. */
+#define LXT970_INTSTAT_RESV	0x3fff  /* Unused...		       */
+#define LXT970_INTSTAT_XTALOK	0x4000	/* XTAL circuit available      */ 
+#define LXT970_INTSTAT_MINT	0x8000  /* MII interrupt pending       */
+
+/* LXT970 Configuration Register. */
+#define LXT970_CONFIG_TRANSDISC 0x0001  /* disconnect TP transmitter   */
+#define LXT970_CONFIG_RESV1	0x0002	/* Unused...		       */
+#define LXT970_CONFIG_100BASEFX 0x0004  /* enable fiber interface      */
+#define LXT970_CONFIG_NOSCRAM   0x0008  /* bypass scramblers           */
+#define LXT970_CONFIG_5BSYMBOL  0x0010  /* 5-bit Symbol Mode	       */
+#define LXT970_CONFIG_TXCLOCK	0x0020  /* special TX clock mode       */
+#define LXT970_CONFIG_LEDC_COLL 0x0000  /* LEDC indicates collision    */
+#define LXT970_CONFIG_LEDC_OFF  0x0040  /* LEDC off                    */
+#define LXT970_CONFIG_LEDC_ACT  0x0080  /* LEDC indicates activity     */
+#define LXT970_CONFIG_LEDC_ON   0x00c0  /* LEDC continuously on        */
+#define LXT970_CONFIG_NOLINKTST 0x0100  /* disable 10BaseT link test   */
+#define LXT970_CONFIG_NOJABBER  0x0200  /* disable 10BaseT jabber      */
+#define LXT970_CONFIG_SQE	0x0400  /* enable 10BaseT SQE	       */
+#define LXT970_CONFIG_NOTPLOOPB 0x0800  /* disable 10BaseT TP loopback */
+#define LXT970_CONFIG_MDIOINT   0x1000  /* enable MDIO interrupt       */
+#define LXT970_CONFIG_REPEATER 	0x2000  /* enable repeater mode	       */
+#define LXT970_CONFIG_TXTEST 	0x4000  /* enable 100BaseT transmit tst*/
+#define LXT970_CONFIG_RESV2	0x8000  /* Unused...		       */
+
+/* LXT970 Chip Status Register. */
+#define LXT970_CHIPSTAT_NOPLL	0x0001	/* 100BaseTX/FX recv not locked*/
+#define LXT970_CHIPSTAT_RESV1   0x0002  /* Unused...		       */
+#define LXT970_CHIPSTAT_LVFAULT 0x0004  /* low voltage fault on VCC    */
+#define LXT970_CHIPSTAT_RESV2	0x0008  /* Unused...		       */
+#define LXT970_CHIPSTAT_MLT3ERR 0x0010  /* MLT3 encoding error 	       */
+#define LXT970_CHIPSTAT_SYMBERR 0x0020  /* Symbol Error detected       */
+#define LXT970_CHIPSTAT_STREAML 0x0040  /* scrambler/decoder locked    */ 
+#define LXT970_CHIPSTAT_RESV3	0x0080	/* Unused...		       */
+#define LXT970_CHIPSTAT_PAGERCV 0x0100  /* duplicate of EXPANSION_LCWP */
+#define LXT970_CHIPSTAT_ANCOMPL 0x0200  /* dupl of BMSR_ANEGCOMPLETE   */
+#define LXT970_CHIPSTAT_RESV4   0x0400  /* Unused...		       */
+#define LXT970_CHIPSTAT_100MBPS 0x0800  /* 100 Mbps operation	       */
+#define LXT970_CHIPSTAT_FULLDPL 0x1000  /* full duplex operation       */
+#define LXT970_CHIPSTAT_LINKOK  0x2000  /* link is up (dynamic)        */
+#define LXT970_CHIPSTAT_RESV5  	0xc000  /* Unused...		       */
+
 
 struct mii_if_info {
 	int phy_id;
