Loading drivers/net/phy/Kconfig +5 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,11 @@ config LSI_ET1011C_PHY ---help--- Supports the LSI ET1011C PHY. config MICREL_PHY tristate "Driver for Micrel PHYs" ---help--- Supports the KSZ9021, VSC8201, KS8001 PHYs. config FIXED_PHY bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs" depends on PHYLIB=y Loading drivers/net/phy/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -20,4 +20,5 @@ obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o obj-$(CONFIG_NATIONAL_PHY) += national.o obj-$(CONFIG_STE10XP) += ste10Xp.o obj-$(CONFIG_MICREL_PHY) += micrel.o obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o drivers/net/phy/micrel.c 0 → 100644 +104 −0 Original line number Diff line number Diff line /* * drivers/net/phy/micrel.c * * Driver for Micrel PHYs * * Author: David J. Choi * * Copyright (c) 2010 Micrel, Inc. * * 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. * * Support : ksz9021 , vsc8201, ks8001 */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/phy.h> #define PHY_ID_KSZ9021 0x00221611 #define PHY_ID_VSC8201 0x000FC413 #define PHY_ID_KS8001 0x0022161A static int kszphy_config_init(struct phy_device *phydev) { return 0; } static struct phy_driver ks8001_driver = { .phy_id = PHY_ID_KS8001, .phy_id_mask = 0x00fffff0, .features = PHY_BASIC_FEATURES, .flags = PHY_POLL, .config_init = kszphy_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, .driver = { .owner = THIS_MODULE,}, }; static struct phy_driver vsc8201_driver = { .phy_id = PHY_ID_VSC8201, .name = "Micrel VSC8201", .phy_id_mask = 0x00fffff0, .features = PHY_BASIC_FEATURES, .flags = PHY_POLL, .config_init = kszphy_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, .driver = { .owner = THIS_MODULE,}, }; static struct phy_driver ksz9021_driver = { .phy_id = PHY_ID_KSZ9021, .phy_id_mask = 0x000fff10, .name = "Micrel KSZ9021 Gigabit PHY", .features = PHY_GBIT_FEATURES | SUPPORTED_Pause, .flags = PHY_POLL, .config_init = kszphy_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, .driver = { .owner = THIS_MODULE, }, }; static int __init ksphy_init(void) { int ret; ret = phy_driver_register(&ks8001_driver); if (ret) goto err1; ret = phy_driver_register(&vsc8201_driver); if (ret) goto err2; ret = phy_driver_register(&ksz9021_driver); if (ret) goto err3; return 0; err3: phy_driver_unregister(&vsc8201_driver); err2: phy_driver_unregister(&ks8001_driver); err1: return ret; } static void __exit ksphy_exit(void) { phy_driver_unregister(&ks8001_driver); phy_driver_unregister(&vsc8201_driver); phy_driver_unregister(&ksz9021_driver); } module_init(ksphy_init); module_exit(ksphy_exit); MODULE_DESCRIPTION("Micrel PHY driver"); MODULE_AUTHOR("David J. Choi"); MODULE_LICENSE("GPL"); drivers/net/ppp_generic.c +22 −12 Original line number Diff line number Diff line Loading @@ -405,6 +405,7 @@ static ssize_t ppp_read(struct file *file, char __user *buf, DECLARE_WAITQUEUE(wait, current); ssize_t ret; struct sk_buff *skb = NULL; struct iovec iov; ret = count; Loading Loading @@ -448,7 +449,9 @@ static ssize_t ppp_read(struct file *file, char __user *buf, if (skb->len > count) goto outf; ret = -EFAULT; if (copy_to_user(buf, skb->data, skb->len)) iov.iov_base = buf; iov.iov_len = count; if (skb_copy_datagram_iovec(skb, 0, &iov, skb->len)) goto outf; ret = skb->len; Loading Loading @@ -1567,13 +1570,22 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb) struct channel *pch = chan->ppp; int proto; if (!pch || skb->len == 0) { if (!pch) { kfree_skb(skb); return; } proto = PPP_PROTO(skb); read_lock_bh(&pch->upl); if (!pskb_may_pull(skb, 2)) { kfree_skb(skb); if (pch->ppp) { ++pch->ppp->dev->stats.rx_length_errors; ppp_receive_error(pch->ppp); } goto done; } proto = PPP_PROTO(skb); if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { /* put it on the channel queue */ skb_queue_tail(&pch->file.rq, skb); Loading @@ -1585,6 +1597,8 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb) } else { ppp_do_recv(pch->ppp, skb, pch); } done: read_unlock_bh(&pch->upl); } Loading Loading @@ -1617,7 +1631,8 @@ ppp_input_error(struct ppp_channel *chan, int code) static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) { if (pskb_may_pull(skb, 2)) { /* note: a 0-length skb is used as an error indication */ if (skb->len > 0) { #ifdef CONFIG_PPP_MULTILINK /* XXX do channel-level decompression here */ if (PPP_PROTO(skb) == PPP_MP) Loading @@ -1625,16 +1640,11 @@ ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) else #endif /* CONFIG_PPP_MULTILINK */ ppp_receive_nonmp_frame(ppp, skb); return; } if (skb->len > 0) /* note: a 0-length skb is used as an error indication */ ++ppp->dev->stats.rx_length_errors; } else { kfree_skb(skb); ppp_receive_error(ppp); } } static void ppp_receive_error(struct ppp *ppp) Loading drivers/net/usb/dm9601.c +1 −1 Original line number Diff line number Diff line Loading @@ -240,7 +240,7 @@ static int dm_write_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 valu goto out; dm_write_reg(dev, DM_SHARED_ADDR, phy ? (reg | 0x40) : reg); dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1c : 0x14); dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1a : 0x12); for (i = 0; i < DM_TIMEOUT; i++) { u8 tmp; Loading Loading
drivers/net/phy/Kconfig +5 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,11 @@ config LSI_ET1011C_PHY ---help--- Supports the LSI ET1011C PHY. config MICREL_PHY tristate "Driver for Micrel PHYs" ---help--- Supports the KSZ9021, VSC8201, KS8001 PHYs. config FIXED_PHY bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs" depends on PHYLIB=y Loading
drivers/net/phy/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -20,4 +20,5 @@ obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o obj-$(CONFIG_NATIONAL_PHY) += national.o obj-$(CONFIG_STE10XP) += ste10Xp.o obj-$(CONFIG_MICREL_PHY) += micrel.o obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o
drivers/net/phy/micrel.c 0 → 100644 +104 −0 Original line number Diff line number Diff line /* * drivers/net/phy/micrel.c * * Driver for Micrel PHYs * * Author: David J. Choi * * Copyright (c) 2010 Micrel, Inc. * * 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. * * Support : ksz9021 , vsc8201, ks8001 */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/phy.h> #define PHY_ID_KSZ9021 0x00221611 #define PHY_ID_VSC8201 0x000FC413 #define PHY_ID_KS8001 0x0022161A static int kszphy_config_init(struct phy_device *phydev) { return 0; } static struct phy_driver ks8001_driver = { .phy_id = PHY_ID_KS8001, .phy_id_mask = 0x00fffff0, .features = PHY_BASIC_FEATURES, .flags = PHY_POLL, .config_init = kszphy_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, .driver = { .owner = THIS_MODULE,}, }; static struct phy_driver vsc8201_driver = { .phy_id = PHY_ID_VSC8201, .name = "Micrel VSC8201", .phy_id_mask = 0x00fffff0, .features = PHY_BASIC_FEATURES, .flags = PHY_POLL, .config_init = kszphy_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, .driver = { .owner = THIS_MODULE,}, }; static struct phy_driver ksz9021_driver = { .phy_id = PHY_ID_KSZ9021, .phy_id_mask = 0x000fff10, .name = "Micrel KSZ9021 Gigabit PHY", .features = PHY_GBIT_FEATURES | SUPPORTED_Pause, .flags = PHY_POLL, .config_init = kszphy_config_init, .config_aneg = genphy_config_aneg, .read_status = genphy_read_status, .driver = { .owner = THIS_MODULE, }, }; static int __init ksphy_init(void) { int ret; ret = phy_driver_register(&ks8001_driver); if (ret) goto err1; ret = phy_driver_register(&vsc8201_driver); if (ret) goto err2; ret = phy_driver_register(&ksz9021_driver); if (ret) goto err3; return 0; err3: phy_driver_unregister(&vsc8201_driver); err2: phy_driver_unregister(&ks8001_driver); err1: return ret; } static void __exit ksphy_exit(void) { phy_driver_unregister(&ks8001_driver); phy_driver_unregister(&vsc8201_driver); phy_driver_unregister(&ksz9021_driver); } module_init(ksphy_init); module_exit(ksphy_exit); MODULE_DESCRIPTION("Micrel PHY driver"); MODULE_AUTHOR("David J. Choi"); MODULE_LICENSE("GPL");
drivers/net/ppp_generic.c +22 −12 Original line number Diff line number Diff line Loading @@ -405,6 +405,7 @@ static ssize_t ppp_read(struct file *file, char __user *buf, DECLARE_WAITQUEUE(wait, current); ssize_t ret; struct sk_buff *skb = NULL; struct iovec iov; ret = count; Loading Loading @@ -448,7 +449,9 @@ static ssize_t ppp_read(struct file *file, char __user *buf, if (skb->len > count) goto outf; ret = -EFAULT; if (copy_to_user(buf, skb->data, skb->len)) iov.iov_base = buf; iov.iov_len = count; if (skb_copy_datagram_iovec(skb, 0, &iov, skb->len)) goto outf; ret = skb->len; Loading Loading @@ -1567,13 +1570,22 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb) struct channel *pch = chan->ppp; int proto; if (!pch || skb->len == 0) { if (!pch) { kfree_skb(skb); return; } proto = PPP_PROTO(skb); read_lock_bh(&pch->upl); if (!pskb_may_pull(skb, 2)) { kfree_skb(skb); if (pch->ppp) { ++pch->ppp->dev->stats.rx_length_errors; ppp_receive_error(pch->ppp); } goto done; } proto = PPP_PROTO(skb); if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { /* put it on the channel queue */ skb_queue_tail(&pch->file.rq, skb); Loading @@ -1585,6 +1597,8 @@ ppp_input(struct ppp_channel *chan, struct sk_buff *skb) } else { ppp_do_recv(pch->ppp, skb, pch); } done: read_unlock_bh(&pch->upl); } Loading Loading @@ -1617,7 +1631,8 @@ ppp_input_error(struct ppp_channel *chan, int code) static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) { if (pskb_may_pull(skb, 2)) { /* note: a 0-length skb is used as an error indication */ if (skb->len > 0) { #ifdef CONFIG_PPP_MULTILINK /* XXX do channel-level decompression here */ if (PPP_PROTO(skb) == PPP_MP) Loading @@ -1625,16 +1640,11 @@ ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) else #endif /* CONFIG_PPP_MULTILINK */ ppp_receive_nonmp_frame(ppp, skb); return; } if (skb->len > 0) /* note: a 0-length skb is used as an error indication */ ++ppp->dev->stats.rx_length_errors; } else { kfree_skb(skb); ppp_receive_error(ppp); } } static void ppp_receive_error(struct ppp *ppp) Loading
drivers/net/usb/dm9601.c +1 −1 Original line number Diff line number Diff line Loading @@ -240,7 +240,7 @@ static int dm_write_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 valu goto out; dm_write_reg(dev, DM_SHARED_ADDR, phy ? (reg | 0x40) : reg); dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1c : 0x14); dm_write_reg(dev, DM_SHARED_CTRL, phy ? 0x1a : 0x12); for (i = 0; i < DM_TIMEOUT; i++) { u8 tmp; Loading