diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2014-02-03 09:55:55 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-02-03 09:55:55 +0100 |
commit | d08d73ba957ff4fe28a7428d7c00172073c95a5c (patch) | |
tree | 316681925c5671c9ab0dce8f2883319c47204aad /drivers | |
parent | 52c43f57313f6e2c17326eb53a1469f28438bcc6 (diff) | |
parent | 7a150c5fb1007fef1ffb7b57aa5c3869b3275803 (diff) | |
download | barebox-d08d73ba957ff4fe28a7428d7c00172073c95a5c.tar.gz barebox-d08d73ba957ff4fe28a7428d7c00172073c95a5c.tar.xz |
Merge branch 'for-next/net'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/phy/Kconfig | 5 | ||||
-rw-r--r-- | drivers/net/phy/Makefile | 1 | ||||
-rw-r--r-- | drivers/net/phy/national.c | 95 | ||||
-rw-r--r-- | drivers/net/usb/asix.c | 36 |
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 }; |