summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-02-03 09:55:55 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2014-02-03 09:55:55 +0100
commitd08d73ba957ff4fe28a7428d7c00172073c95a5c (patch)
tree316681925c5671c9ab0dce8f2883319c47204aad /drivers
parent52c43f57313f6e2c17326eb53a1469f28438bcc6 (diff)
parent7a150c5fb1007fef1ffb7b57aa5c3869b3275803 (diff)
downloadbarebox-d08d73ba957ff4fe28a7428d7c00172073c95a5c.tar.gz
barebox-d08d73ba957ff4fe28a7428d7c00172073c95a5c.tar.xz
Merge branch 'for-next/net'
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/phy/Kconfig5
-rw-r--r--drivers/net/phy/Makefile1
-rw-r--r--drivers/net/phy/national.c95
-rw-r--r--drivers/net/usb/asix.c36
4 files changed, 132 insertions, 5 deletions
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index 7ebdaa0c01..260774e265 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -23,6 +23,11 @@ config MICREL_PHY
---help---
Supports the KSZ9021, VSC8201, KS8001 PHYs.
+config NATIONAL_PHY
+ bool "Driver for National Semiconductor PHYs"
+ ---help---
+ Currently supports the DP83865 PHY.
+
config SMSC_PHY
bool "Drivers for SMSC PHYs"
---help---
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
index 451573ed83..a00cc76efe 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -2,4 +2,5 @@ obj-y += phy.o mdio_bus.o
obj-$(CONFIG_AT803X_PHY) += at803x.o
obj-$(CONFIG_LXT_PHY) += lxt.o
obj-$(CONFIG_MICREL_PHY) += micrel.o
+obj-$(CONFIG_NATIONAL_PHY) += national.o
obj-$(CONFIG_SMSC_PHY) += smsc.o
diff --git a/drivers/net/phy/national.c b/drivers/net/phy/national.c
new file mode 100644
index 0000000000..e46d587cd4
--- /dev/null
+++ b/drivers/net/phy/national.c
@@ -0,0 +1,95 @@
+/*
+ * drivers/net/phy/national.c
+ *
+ * Driver for National Semiconductor PHYs
+ *
+ * based on Stuart Menefy's linux national.c driver
+ *
+ * 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 <common.h>
+#include <init.h>
+#include <linux/phy.h>
+
+/* Advanced proprietary configuration */
+#define NS_EXP_MEM_CTL 0x16
+#define NS_EXP_MEM_DATA 0x1d
+#define NS_EXP_MEM_ADD 0x1e
+
+#define LED_CTRL_REG 0x13
+#define AN_FALLBACK_AN 0x0001
+#define AN_FALLBACK_CRC 0x0002
+#define AN_FALLBACK_IE 0x0004
+#define ALL_FALLBACK_ON (AN_FALLBACK_AN | AN_FALLBACK_CRC | AN_FALLBACK_IE)
+
+enum hdx_loopback {
+ hdx_loopback_on = 0,
+ hdx_loopback_off = 1,
+};
+
+static u8 ns_exp_read(struct phy_device *phydev, u16 reg)
+{
+ phy_write(phydev, NS_EXP_MEM_ADD, reg);
+ return phy_read(phydev, NS_EXP_MEM_DATA);
+}
+
+static void ns_exp_write(struct phy_device *phydev, u16 reg, u8 data)
+{
+ phy_write(phydev, NS_EXP_MEM_ADD, reg);
+ phy_write(phydev, NS_EXP_MEM_DATA, data);
+}
+
+static void ns_giga_speed_fallback(struct phy_device *phydev, int mode)
+{
+ int bmcr = phy_read(phydev, MII_BMCR);
+
+ phy_write(phydev, MII_BMCR, (bmcr | BMCR_PDOWN));
+
+ /* Enable 8 bit expended memory read/write (no auto increment) */
+ phy_write(phydev, NS_EXP_MEM_CTL, 0);
+ phy_write(phydev, NS_EXP_MEM_ADD, 0x1C0);
+ phy_write(phydev, NS_EXP_MEM_DATA, 0x0008);
+ phy_write(phydev, MII_BMCR, (bmcr & ~BMCR_PDOWN));
+ phy_write(phydev, LED_CTRL_REG, mode);
+}
+
+static void ns_10_base_t_hdx_loopack(struct phy_device *phydev, int disable)
+{
+ if (disable)
+ ns_exp_write(phydev, 0x1c0, ns_exp_read(phydev, 0x1c0) | 1);
+ else
+ ns_exp_write(phydev, 0x1c0,
+ ns_exp_read(phydev, 0x1c0) & 0xfffe);
+
+ pr_debug("10BASE-T HDX loopback %s\n",
+ (ns_exp_read(phydev, 0x1c0) & 0x0001) ? "off" : "on");
+}
+
+static int ns_config_init(struct phy_device *phydev)
+{
+ ns_giga_speed_fallback(phydev, ALL_FALLBACK_ON);
+ /* In the latest MAC or switches design, the 10 Mbps loopback
+ is desired to be turned off. */
+ ns_10_base_t_hdx_loopack(phydev, hdx_loopback_off);
+
+ return 0;
+}
+
+static struct phy_driver dp83865_driver = {
+ .phy_id = 0x20005c70,
+ .phy_id_mask = 0xfffffff0,
+ .drv.name = "NatSemi DP83865",
+ .features = PHY_GBIT_FEATURES |
+ SUPPORTED_Pause | SUPPORTED_Asym_Pause,
+ .config_init = ns_config_init,
+};
+
+static int ns_phy_init(void)
+{
+ return phy_driver_register(&dp83865_driver);
+}
+fs_initcall(ns_phy_init);
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
index 5975e2a342..b58db5d7b4 100644
--- a/drivers/net/usb/asix.c
+++ b/drivers/net/usb/asix.c
@@ -132,6 +132,8 @@
#define MARVELL_CTRL_TXDELAY 0x0002
#define MARVELL_CTRL_RXDELAY 0x0080
+#define FLAG_EEPROM_MAC (1UL << 0) /* init device MAC from eeprom */
+
/* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */
struct asix_data {
u8 multi_filter[AX_MCAST_FILTER_SIZE];
@@ -364,11 +366,21 @@ static int asix_write_gpio(struct usbnet *dev, u16 value, int sleep)
static int asix_get_ethaddr(struct eth_device *edev, unsigned char *adr)
{
struct usbnet *udev = container_of(edev, struct usbnet, edev);
- int ret;
+ int i, ret;
/* Get the MAC address */
- if ((ret = asix_read_cmd(udev, AX_CMD_READ_NODE_ID,
- 0, 0, 6, adr)) < 0) {
+ if (udev->driver_info->data & FLAG_EEPROM_MAC) {
+ for (i = 0; i < (6 >> 1); i++) {
+ ret = asix_read_cmd(udev, AX_CMD_READ_EEPROM, 0x04 + i,
+ 0, 2, adr + i * 2);
+ if (ret < 0)
+ break;
+ }
+ } else {
+ ret = asix_read_cmd(udev, AX_CMD_READ_NODE_ID, 0, 0, 6, adr);
+ }
+
+ if (ret < 0) {
debug("Failed to read MAC address: %d\n", ret);
return -1;
}
@@ -408,11 +420,11 @@ static int asix_rx_fixup(struct usbnet *dev, void *buf, int len)
len -= 4;
while (len > 0) {
- if ((short)(header & 0x0000ffff) != ~((short)((header & 0xffff0000) >> 16)))
+ if ((header & 0x07ff) != ((~header >> 16) & 0x07ff))
dev_err(&dev->edev.dev, "asix_rx_fixup() Bad Header Length\n");
/* get the packet length */
- size = (unsigned short) (header & 0x0000ffff);
+ size = (unsigned short) (header & 0x07ff);
if (size > 1514) {
dev_err(&dev->edev.dev, "asix_rx_fixup() Bad RX Length %d\n", size);
@@ -680,6 +692,16 @@ static struct driver_info ax88772_info = {
.tx_fixup = asix_tx_fixup,
};
+static struct driver_info ax88772b_info = {
+ .description = "ASIX AX88772B USB 2.0 Ethernet",
+ .bind = ax88772_bind,
+ .unbind = asix_unbind,
+ .flags = FLAG_ETHER | FLAG_FRAMING_AX,
+ .rx_fixup = asix_rx_fixup,
+ .tx_fixup = asix_tx_fixup,
+ .data = FLAG_EEPROM_MAC,
+};
+
static const struct usb_device_id products [] = {
{
// Linksys USB200M
@@ -761,6 +783,10 @@ static const struct usb_device_id products [] = {
// Cables-to-Go USB Ethernet Adapter
USB_DEVICE(0x0b95, 0x772a),
.driver_info = &ax88772_info,
+}, {
+ // LevelOne USB Fast Ethernet Adapter
+ USB_DEVICE(0x0b95, 0x772b),
+ .driver_info = &ax88772b_info,
},
{ }, // END
};