-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[PATCH] phy: new SMSC LAN83C185 PHY driver
new SMSC LAN83C185 10BaseT/100BaseTX PHY driver for the PHY subsystem Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
- Loading branch information
Herbert Valerio Riedel
authored and
Jeff Garzik
committed
May 24, 2006
1 parent
d7fbeba
commit c9e055a
Showing
3 changed files
with
108 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/* | ||
* drivers/net/phy/smsc.c | ||
* | ||
* Driver for SMSC PHYs | ||
* | ||
* Author: Herbert Valerio Riedel | ||
* | ||
* Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the | ||
* Free Software Foundation; either version 2 of the License, or (at your | ||
* option) any later version. | ||
* | ||
*/ | ||
|
||
#include <linux/config.h> | ||
#include <linux/kernel.h> | ||
#include <linux/module.h> | ||
#include <linux/mii.h> | ||
#include <linux/ethtool.h> | ||
#include <linux/phy.h> | ||
#include <linux/netdevice.h> | ||
|
||
#define MII_LAN83C185_ISF 29 /* Interrupt Source Flags */ | ||
#define MII_LAN83C185_IM 30 /* Interrupt Mask */ | ||
|
||
#define MII_LAN83C185_ISF_INT1 (1<<1) /* Auto-Negotiation Page Received */ | ||
#define MII_LAN83C185_ISF_INT2 (1<<2) /* Parallel Detection Fault */ | ||
#define MII_LAN83C185_ISF_INT3 (1<<3) /* Auto-Negotiation LP Ack */ | ||
#define MII_LAN83C185_ISF_INT4 (1<<4) /* Link Down */ | ||
#define MII_LAN83C185_ISF_INT5 (1<<5) /* Remote Fault Detected */ | ||
#define MII_LAN83C185_ISF_INT6 (1<<6) /* Auto-Negotiation complete */ | ||
#define MII_LAN83C185_ISF_INT7 (1<<7) /* ENERGYON */ | ||
|
||
#define MII_LAN83C185_ISF_INT_ALL (0x0e) | ||
|
||
#define MII_LAN83C185_ISF_INT_PHYLIB_EVENTS \ | ||
(MII_LAN83C185_ISF_INT6 | MII_LAN83C185_ISF_INT4) | ||
|
||
|
||
static int lan83c185_config_intr(struct phy_device *phydev) | ||
{ | ||
int rc = phy_write (phydev, MII_LAN83C185_IM, | ||
((PHY_INTERRUPT_ENABLED == phydev->interrupts) | ||
? MII_LAN83C185_ISF_INT_PHYLIB_EVENTS | ||
: 0)); | ||
|
||
return rc < 0 ? rc : 0; | ||
} | ||
|
||
static int lan83c185_ack_interrupt(struct phy_device *phydev) | ||
{ | ||
int rc = phy_read (phydev, MII_LAN83C185_ISF); | ||
|
||
return rc < 0 ? rc : 0; | ||
} | ||
|
||
static int lan83c185_config_init(struct phy_device *phydev) | ||
{ | ||
return lan83c185_ack_interrupt (phydev); | ||
} | ||
|
||
|
||
static struct phy_driver lan83c185_driver = { | ||
.phy_id = 0x0007c0a0, /* OUI=0x00800f, Model#=0x0a */ | ||
.phy_id_mask = 0xfffffff0, | ||
.name = "SMSC LAN83C185", | ||
|
||
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause | ||
| SUPPORTED_Asym_Pause), | ||
.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG, | ||
|
||
/* basic functions */ | ||
.config_aneg = genphy_config_aneg, | ||
.read_status = genphy_read_status, | ||
.config_init = lan83c185_config_init, | ||
|
||
/* IRQ related */ | ||
.ack_interrupt = lan83c185_ack_interrupt, | ||
.config_intr = lan83c185_config_intr, | ||
|
||
.driver = { .owner = THIS_MODULE, } | ||
}; | ||
|
||
static int __init smsc_init(void) | ||
{ | ||
return phy_driver_register (&lan83c185_driver); | ||
} | ||
|
||
static void __exit smsc_exit(void) | ||
{ | ||
phy_driver_unregister (&lan83c185_driver); | ||
} | ||
|
||
MODULE_DESCRIPTION("SMSC PHY driver"); | ||
MODULE_AUTHOR("Herbert Valerio Riedel"); | ||
MODULE_LICENSE("GPL"); | ||
|
||
module_init(smsc_init); | ||
module_exit(smsc_exit); |