pcnet32: 79c976 with fiber optic fix
Subsystems (3)
PATCH 1/1 pcnet32: 79c976 with fiber optic fix
After testing this patch I agree that it should be applied. The one change I made was to print the device name (ethN) instead of 'pcnet32'. Tested ia32.
From: Guido Guenther <[email protected]>,
Lars Munch <[email protected]>
Skip PHY selection on Allied Telesyn 2701FX, it looses the link otherwise. Fix up the AT 2700FX as well.
Signed-off-by Guido Guenther <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
Signed-off-by Don Fry <[email protected]>
---
25-akpm/drivers/net/pcnet32.c | 47 ++++++++++++++++++++++++---------------- 25-akpm/include/linux/pci_ids.h | 5 ++++ 2 files changed, 34 insertions(+), 18 deletions(-)
drivers/net/pcnet32.c renamed from drivers/net/pcnet32.c~pcnet32-79c976-with-fiber-optic +29 -18
@@ -1429,25 +1429,36 @@ pcnet32_open(struct net_device *dev) val |=0x10 ; lp->a.write_csr (ioaddr,124 , val); -/* 24 Jun 2004 according AMD, in order to change the PHY, -* DANAS (or DISPM for 79C976) must be set; then select the speed, -* duplex, and/or enable auto negotiation, and clear DANAS */ -if (lp->mii && !(lp->options &PCNET32_PORT_ASEL )) { - lp->a.write_bcr (ioaddr,32 , lp->a.read_bcr (ioaddr,32 ) |0x0080 ); -/* disable Auto Negotiation, set 10Mpbs, HD */ - val = lp->a.read_bcr (ioaddr,32 ) & ~0xb8 ; -if (lp->options &PCNET32_PORT_FD ) - val |=0x10 ; -if (lp->options &PCNET32_PORT_100 ) - val |=0x08 ; - lp->a.write_bcr (ioaddr,32 , val); +/* Allied Telesyn AT 2700/2701 FX looses the link, so skip that */ +if (lp->pci_dev->subsystem_vendor ==PCI_VENDOR_ID_AT && + (lp->pci_dev->subsystem_device ==PCI_SUBDEVICE_ID_AT_2700FX || + lp->pci_dev->subsystem_device ==PCI_SUBDEVICE_ID_AT_2701FX )) { +printk (KERN_DEBUG "%s: Skipping PHY selection.\n" , dev->name); }else { -if (lp->options &PCNET32_PORT_ASEL ) { - lp->a.write_bcr (ioaddr,32 , lp->a.read_bcr (ioaddr,32 ) |0x0080 ); -/* enable auto negotiate, setup, disable fd */ - val = lp->a.read_bcr (ioaddr,32 ) & ~0x98 ; - val |=0x20 ; - lp->a.write_bcr (ioaddr,32 , val); +/* +* 24 Jun 2004 according AMD, in order to change the PHY, +* DANAS (or DISPM for 79C976) must be set; then select the speed, +* duplex, and/or enable auto negotiation, and clear DANAS +*/ +if (lp->mii && !(lp->options &PCNET32_PORT_ASEL )) { + lp->a.write_bcr (ioaddr,32 , + lp->a.read_bcr (ioaddr,32 ) |0x0080 ); +/* disable Auto Negotiation, set 10Mpbs, HD */ + val = lp->a.read_bcr (ioaddr,32 ) & ~0xb8 ; +if (lp->options &PCNET32_PORT_FD ) + val |=0x10 ; +if (lp->options &PCNET32_PORT_100 ) + val |=0x08 ; + lp->a.write_bcr (ioaddr,32 , val); + }else { +if (lp->options &PCNET32_PORT_ASEL ) { + lp->a.write_bcr (ioaddr,32 , + lp->a.read_bcr (ioaddr,32 ) |0x0080 ); +/* enable auto negotiate, setup, disable fd */ + val = lp->a.read_bcr (ioaddr,32 ) & ~0x98 ; + val |=0x20 ; + lp->a.write_bcr (ioaddr,32 , val); + } } }
include/linux/pci_ids.h renamed from include/linux/pci_ids.h~pcnet32-79c976-with-fiber-optic +5 -0
@@ -1644,6 +1644,11 @@#define PCI_DEVICE_ID_OPTIBASE_VPLEXCC 0x2120#define PCI_DEVICE_ID_OPTIBASE_VQUEST 0x2130 +/* Allied Telesyn */ +#define PCI_VENDOR_ID_AT 0x1259 +#define PCI_SUBDEVICE_ID_AT_2700FX 0x2701 +#define PCI_SUBDEVICE_ID_AT_2701FX 0x2703 +#define PCI_VENDOR_ID_ESS 0x125d#define PCI_DEVICE_ID_ESS_ESS1968 0x1968#define PCI_DEVICE_ID_ESS_AUDIOPCI 0x1969
_
Signature · 2 lines
Don Fry [email protected]