davicom.c revision cf93c94581bab447a5634c6d737c1cf38c080261
100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming/* 200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * drivers/net/phy/davicom.c 300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * 400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * Driver for Davicom PHYs 500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * 600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * Author: Andy Fleming 700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * 800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * Copyright (c) 2004 Freescale Semiconductor, Inc. 900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * 1000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * This program is free software; you can redistribute it and/or modify it 1100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * under the terms of the GNU General Public License as published by the 1200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * Free Software Foundation; either version 2 of the License, or (at your 1300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * option) any later version. 1400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming * 1500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming */ 1600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/kernel.h> 1700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/string.h> 1800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/errno.h> 1900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/unistd.h> 2000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/interrupt.h> 2100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/init.h> 2200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/delay.h> 2300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/netdevice.h> 2400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/etherdevice.h> 2500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/skbuff.h> 2600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/spinlock.h> 2700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/mm.h> 2800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/module.h> 2900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/mii.h> 3000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/ethtool.h> 3100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <linux/phy.h> 3200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 3300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <asm/io.h> 3400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <asm/irq.h> 3500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#include <asm/uaccess.h> 3600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 3700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_SCR 0x10 3800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_SCR_INIT 0x0610 398b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo#define MII_DM9161_SCR_RMII 0x0100 4000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 4100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming/* DM9161 Interrupt Register */ 4200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR 0x15 4300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_PEND 0x8000 4400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_DPLX_MASK 0x0800 4500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_SPD_MASK 0x0400 4600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_LINK_MASK 0x0200 4700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_MASK 0x0100 4800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_DPLX_CHANGE 0x0010 4900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_SPD_CHANGE 0x0008 5000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_LINK_CHANGE 0x0004 5100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_INIT 0x0000 5200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_INTR_STOP \ 5300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming(MII_DM9161_INTR_DPLX_MASK | MII_DM9161_INTR_SPD_MASK \ 5400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming | MII_DM9161_INTR_LINK_MASK | MII_DM9161_INTR_MASK) 5500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 5600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming/* DM9161 10BT Configuration/Status */ 5700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_10BTCSR 0x12 5800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define MII_DM9161_10BTCSR_INIT 0x7800 5900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 6000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy FlemingMODULE_DESCRIPTION("Davicom PHY driver"); 6100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy FlemingMODULE_AUTHOR("Andy Fleming"); 6200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy FlemingMODULE_LICENSE("GPL"); 6300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 6400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 6500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming#define DM9161_DELAY 1 6600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingstatic int dm9161_config_intr(struct phy_device *phydev) 6700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming{ 6800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming int temp; 6900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 7000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming temp = phy_read(phydev, MII_DM9161_INTR); 7100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 7200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (temp < 0) 7300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return temp; 7400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 7500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if(PHY_INTERRUPT_ENABLED == phydev->interrupts ) 7600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming temp &= ~(MII_DM9161_INTR_STOP); 7700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming else 7800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming temp |= MII_DM9161_INTR_STOP; 7900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 8000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming temp = phy_write(phydev, MII_DM9161_INTR, temp); 8100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 8200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return temp; 8300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming} 8400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 8500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingstatic int dm9161_config_aneg(struct phy_device *phydev) 8600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming{ 8700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming int err; 8800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 8900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming /* Isolate the PHY */ 9000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming err = phy_write(phydev, MII_BMCR, BMCR_ISOLATE); 9100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 9200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (err < 0) 9300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return err; 9400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 9500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming /* Configure the new settings */ 9600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming err = genphy_config_aneg(phydev); 9700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 9800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (err < 0) 9900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return err; 10000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 10100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return 0; 10200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming} 10300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 10400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingstatic int dm9161_config_init(struct phy_device *phydev) 10500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming{ 1068b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo int err, temp; 10700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 10800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming /* Isolate the PHY */ 10900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming err = phy_write(phydev, MII_BMCR, BMCR_ISOLATE); 11000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 11100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (err < 0) 11200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return err; 11300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 1148b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo switch (phydev->interface) { 1158b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo case PHY_INTERFACE_MODE_MII: 1168b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo temp = MII_DM9161_SCR_INIT; 1178b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo break; 1188b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo case PHY_INTERFACE_MODE_RMII: 1198b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo temp = MII_DM9161_SCR_INIT | MII_DM9161_SCR_RMII; 1208b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo break; 1218b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo default: 1228b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo return -EINVAL; 1238b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo } 12400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 1258b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo /* Do not bypass the scrambler/descrambler */ 1268b7c1664405a1262bb78e80011ec10aa6b79df81frederic Rodo err = phy_write(phydev, MII_DM9161_SCR, temp); 12700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (err < 0) 12800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return err; 12900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 13000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming /* Clear 10BTCSR to default */ 13100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming err = phy_write(phydev, MII_DM9161_10BTCSR, MII_DM9161_10BTCSR_INIT); 13200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 13300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (err < 0) 13400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return err; 13500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 13600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming /* Reconnect the PHY, and enable Autonegotiation */ 13700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming err = phy_write(phydev, MII_BMCR, BMCR_ANENABLE); 13800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 13900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (err < 0) 14000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return err; 14100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 14200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return 0; 14300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming} 14400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 14500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingstatic int dm9161_ack_interrupt(struct phy_device *phydev) 14600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming{ 14700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming int err = phy_read(phydev, MII_DM9161_INTR); 14800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 14900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return (err < 0) ? err : 0; 15000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming} 15100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 15212414db11da8789d9a6b549c4899250f6e116630Kim Phillipsstatic struct phy_driver dm9161e_driver = { 15300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .phy_id = 0x0181b880, 15400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .name = "Davicom DM9161E", 15500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .phy_id_mask = 0x0ffffff0, 15600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .features = PHY_BASIC_FEATURES, 15700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .config_init = dm9161_config_init, 15800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .config_aneg = dm9161_config_aneg, 15900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .read_status = genphy_read_status, 16012414db11da8789d9a6b549c4899250f6e116630Kim Phillips .driver = { .owner = THIS_MODULE,}, 16112414db11da8789d9a6b549c4899250f6e116630Kim Phillips}; 16212414db11da8789d9a6b549c4899250f6e116630Kim Phillips 16312414db11da8789d9a6b549c4899250f6e116630Kim Phillipsstatic struct phy_driver dm9161a_driver = { 16412414db11da8789d9a6b549c4899250f6e116630Kim Phillips .phy_id = 0x0181b8a0, 16512414db11da8789d9a6b549c4899250f6e116630Kim Phillips .name = "Davicom DM9161A", 16612414db11da8789d9a6b549c4899250f6e116630Kim Phillips .phy_id_mask = 0x0ffffff0, 16712414db11da8789d9a6b549c4899250f6e116630Kim Phillips .features = PHY_BASIC_FEATURES, 16812414db11da8789d9a6b549c4899250f6e116630Kim Phillips .config_init = dm9161_config_init, 16912414db11da8789d9a6b549c4899250f6e116630Kim Phillips .config_aneg = dm9161_config_aneg, 17012414db11da8789d9a6b549c4899250f6e116630Kim Phillips .read_status = genphy_read_status, 17112414db11da8789d9a6b549c4899250f6e116630Kim Phillips .driver = { .owner = THIS_MODULE,}, 17200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming}; 17300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 17400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingstatic struct phy_driver dm9131_driver = { 17500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .phy_id = 0x00181b80, 17600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .name = "Davicom DM9131", 17700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .phy_id_mask = 0x0ffffff0, 17800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .features = PHY_BASIC_FEATURES, 17900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .flags = PHY_HAS_INTERRUPT, 18000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .config_aneg = genphy_config_aneg, 18100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .read_status = genphy_read_status, 18200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .ack_interrupt = dm9161_ack_interrupt, 18300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming .config_intr = dm9161_config_intr, 18412414db11da8789d9a6b549c4899250f6e116630Kim Phillips .driver = { .owner = THIS_MODULE,}, 18500db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming}; 18600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 18700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingstatic int __init davicom_init(void) 18800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming{ 18900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming int ret; 19000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 19112414db11da8789d9a6b549c4899250f6e116630Kim Phillips ret = phy_driver_register(&dm9161e_driver); 19200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (ret) 19300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming goto err1; 19400db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 19512414db11da8789d9a6b549c4899250f6e116630Kim Phillips ret = phy_driver_register(&dm9161a_driver); 19600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming if (ret) 19700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming goto err2; 19812414db11da8789d9a6b549c4899250f6e116630Kim Phillips 19912414db11da8789d9a6b549c4899250f6e116630Kim Phillips ret = phy_driver_register(&dm9131_driver); 20012414db11da8789d9a6b549c4899250f6e116630Kim Phillips if (ret) 20112414db11da8789d9a6b549c4899250f6e116630Kim Phillips goto err3; 20200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return 0; 20300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 20412414db11da8789d9a6b549c4899250f6e116630Kim Phillips err3: 20512414db11da8789d9a6b549c4899250f6e116630Kim Phillips phy_driver_unregister(&dm9161a_driver); 20612414db11da8789d9a6b549c4899250f6e116630Kim Phillips err2: 20712414db11da8789d9a6b549c4899250f6e116630Kim Phillips phy_driver_unregister(&dm9161e_driver); 20800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming err1: 20900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming return ret; 21000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming} 21100db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 21200db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingstatic void __exit davicom_exit(void) 21300db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming{ 21412414db11da8789d9a6b549c4899250f6e116630Kim Phillips phy_driver_unregister(&dm9161e_driver); 21512414db11da8789d9a6b549c4899250f6e116630Kim Phillips phy_driver_unregister(&dm9161a_driver); 21600db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming phy_driver_unregister(&dm9131_driver); 21700db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming} 21800db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Fleming 21900db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingmodule_init(davicom_init); 22000db8189d984d6c51226dafbbe4a667ce9b7d5daAndy Flemingmodule_exit(davicom_exit); 2214e4f10f6498bc5038c0a110b5f21682fcb5578d7David Woodhouse 222cf93c94581bab447a5634c6d737c1cf38c080261Uwe Kleine-Königstatic struct mdio_device_id __maybe_unused davicom_tbl[] = { 2234e4f10f6498bc5038c0a110b5f21682fcb5578d7David Woodhouse { 0x0181b880, 0x0ffffff0 }, 2244e4f10f6498bc5038c0a110b5f21682fcb5578d7David Woodhouse { 0x0181b8a0, 0x0ffffff0 }, 2254e4f10f6498bc5038c0a110b5f21682fcb5578d7David Woodhouse { 0x00181b80, 0x0ffffff0 }, 2264e4f10f6498bc5038c0a110b5f21682fcb5578d7David Woodhouse { } 2274e4f10f6498bc5038c0a110b5f21682fcb5578d7David Woodhouse}; 2284e4f10f6498bc5038c0a110b5f21682fcb5578d7David Woodhouse 2294e4f10f6498bc5038c0a110b5f21682fcb5578d7David WoodhouseMODULE_DEVICE_TABLE(mdio, davicom_tbl); 230