added some extensions to the phy layer
authorJohn Crispin <john@openwrt.org>
Sun, 14 Oct 2007 00:04:53 +0000 (00:04 +0000)
committerJohn Crispin <john@openwrt.org>
Sun, 14 Oct 2007 00:04:53 +0000 (00:04 +0000)
SVN-Revision: 9297

target/linux/generic-2.6/patches-2.6.23/600-phy_extension.patch [new file with mode: 0644]

diff --git a/target/linux/generic-2.6/patches-2.6.23/600-phy_extension.patch b/target/linux/generic-2.6/patches-2.6.23/600-phy_extension.patch
new file mode 100644 (file)
index 0000000..8261d4a
--- /dev/null
@@ -0,0 +1,67 @@
+Index: linux-2.6.23/drivers/net/phy/phy.c
+===================================================================
+--- linux-2.6.23.orig/drivers/net/phy/phy.c    2007-10-14 00:05:26.000000000 +0200
++++ linux-2.6.23/drivers/net/phy/phy.c 2007-10-14 00:44:21.000000000 +0200
+@@ -344,6 +344,50 @@
+ }
+ EXPORT_SYMBOL(phy_ethtool_gset);
++int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr)
++{
++      u32 cmd;
++      int tmp;
++      struct ethtool_cmd ecmd = { ETHTOOL_GSET };
++      struct ethtool_value edata = { ETHTOOL_GLINK };
++
++      if (get_user(cmd, (u32 *) useraddr))
++              return -EFAULT;
++
++      switch (cmd) {
++      case ETHTOOL_GSET:
++              phy_ethtool_gset(phydev, &ecmd);
++              if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
++                      return -EFAULT;
++              return 0;
++      
++      case ETHTOOL_SSET:
++              if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
++                      return -EFAULT;
++              return phy_ethtool_sset(phydev, &ecmd);
++
++      case ETHTOOL_NWAY_RST:
++              /* if autoneg is off, it's an error */
++              tmp = phy_read(phydev, MII_BMCR);
++              if (tmp & BMCR_ANENABLE) {
++                      tmp |= (BMCR_ANRESTART);
++                      phy_write(phydev, MII_BMCR, tmp);
++                      return 0;
++              }       
++              return -EINVAL;
++
++      case ETHTOOL_GLINK:
++              edata.data = (phy_read(phydev,
++                              MII_BMSR) & BMSR_LSTATUS) ? 1 : 0;
++              if (copy_to_user(useraddr, &edata, sizeof(edata)))
++                      return -EFAULT;
++              return 0;
++      }
++
++      return -EOPNOTSUPP;
++}
++EXPORT_SYMBOL(phy_ethtool_ioctl);
++
+ /**
+  * phy_mii_ioctl - generic PHY MII ioctl interface
+  * @phydev: the phy_device struct
+Index: linux-2.6.23/include/linux/phy.h
+===================================================================
+--- linux-2.6.23.orig/include/linux/phy.h      2007-10-14 00:05:15.000000000 +0200
++++ linux-2.6.23/include/linux/phy.h   2007-10-14 00:18:54.000000000 +0200
+@@ -393,6 +393,7 @@
+ void phy_stop_machine(struct phy_device *phydev);
+ int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
+ int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd);
++int phy_ethtool_ioctl(struct phy_device *phydev, void *useraddr);
+ int phy_mii_ioctl(struct phy_device *phydev,
+               struct mii_ioctl_data *mii_data, int cmd);
+ int phy_start_interrupts(struct phy_device *phydev);