aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-07-23 19:31:37 -0400
committerDavid S. Miller <davem@davemloft.net>2016-07-24 00:53:32 -0400
commitde0ba9a0d8909996f9e293d311c2cc459fa77d67 (patch)
tree199214afc477824bf431d11d08834ff7555c994b /drivers/net/usb
parentd95a93a9b71677a43f967a1b7986decab84b7765 (diff)
parent107df03203bb66de56e2caec3bde6d22b55480c5 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Just several instances of overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r--drivers/net/usb/r8152.c85
1 files changed, 76 insertions, 9 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 168a8e2e15c8..f41a8ad4740e 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -26,6 +26,7 @@
26#include <linux/mdio.h> 26#include <linux/mdio.h>
27#include <linux/usb/cdc.h> 27#include <linux/usb/cdc.h>
28#include <linux/suspend.h> 28#include <linux/suspend.h>
29#include <linux/acpi.h>
29 30
30/* Information for net-next */ 31/* Information for net-next */
31#define NETNEXT_VERSION "08" 32#define NETNEXT_VERSION "08"
@@ -460,6 +461,11 @@
460/* SRAM_IMPEDANCE */ 461/* SRAM_IMPEDANCE */
461#define RX_DRIVING_MASK 0x6000 462#define RX_DRIVING_MASK 0x6000
462 463
464/* MAC PASSTHRU */
465#define AD_MASK 0xfee0
466#define EFUSE 0xcfdb
467#define PASS_THRU_MASK 0x1
468
463enum rtl_register_content { 469enum rtl_register_content {
464 _1000bps = 0x10, 470 _1000bps = 0x10,
465 _100bps = 0x08, 471 _100bps = 0x08,
@@ -1040,6 +1046,65 @@ out1:
1040 return ret; 1046 return ret;
1041} 1047}
1042 1048
1049/* Devices containing RTL8153-AD can support a persistent
1050 * host system provided MAC address.
1051 * Examples of this are Dell TB15 and Dell WD15 docks
1052 */
1053static int vendor_mac_passthru_addr_read(struct r8152 *tp, struct sockaddr *sa)
1054{
1055 acpi_status status;
1056 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
1057 union acpi_object *obj;
1058 int ret = -EINVAL;
1059 u32 ocp_data;
1060 unsigned char buf[6];
1061
1062 /* test for -AD variant of RTL8153 */
1063 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
1064 if ((ocp_data & AD_MASK) != 0x1000)
1065 return -ENODEV;
1066
1067 /* test for MAC address pass-through bit */
1068 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, EFUSE);
1069 if ((ocp_data & PASS_THRU_MASK) != 1)
1070 return -ENODEV;
1071
1072 /* returns _AUXMAC_#AABBCCDDEEFF# */
1073 status = acpi_evaluate_object(NULL, "\\_SB.AMAC", NULL, &buffer);
1074 obj = (union acpi_object *)buffer.pointer;
1075 if (!ACPI_SUCCESS(status))
1076 return -ENODEV;
1077 if (obj->type != ACPI_TYPE_BUFFER || obj->string.length != 0x17) {
1078 netif_warn(tp, probe, tp->netdev,
1079 "Invalid buffer when reading pass-thru MAC addr: "
1080 "(%d, %d)\n",
1081 obj->type, obj->string.length);
1082 goto amacout;
1083 }
1084 if (strncmp(obj->string.pointer, "_AUXMAC_#", 9) != 0 ||
1085 strncmp(obj->string.pointer + 0x15, "#", 1) != 0) {
1086 netif_warn(tp, probe, tp->netdev,
1087 "Invalid header when reading pass-thru MAC addr\n");
1088 goto amacout;
1089 }
1090 ret = hex2bin(buf, obj->string.pointer + 9, 6);
1091 if (!(ret == 0 && is_valid_ether_addr(buf))) {
1092 netif_warn(tp, probe, tp->netdev,
1093 "Invalid MAC when reading pass-thru MAC addr: "
1094 "%d, %pM\n", ret, buf);
1095 ret = -EINVAL;
1096 goto amacout;
1097 }
1098 memcpy(sa->sa_data, buf, 6);
1099 ether_addr_copy(tp->netdev->dev_addr, sa->sa_data);
1100 netif_info(tp, probe, tp->netdev,
1101 "Using pass-thru MAC addr %pM\n", sa->sa_data);
1102
1103amacout:
1104 kfree(obj);
1105 return ret;
1106}
1107
1043static int set_ethernet_addr(struct r8152 *tp) 1108static int set_ethernet_addr(struct r8152 *tp)
1044{ 1109{
1045 struct net_device *dev = tp->netdev; 1110 struct net_device *dev = tp->netdev;
@@ -1048,8 +1113,15 @@ static int set_ethernet_addr(struct r8152 *tp)
1048 1113
1049 if (tp->version == RTL_VER_01) 1114 if (tp->version == RTL_VER_01)
1050 ret = pla_ocp_read(tp, PLA_IDR, 8, sa.sa_data); 1115 ret = pla_ocp_read(tp, PLA_IDR, 8, sa.sa_data);
1051 else 1116 else {
1052 ret = pla_ocp_read(tp, PLA_BACKUP, 8, sa.sa_data); 1117 /* if this is not an RTL8153-AD, no eFuse mac pass thru set,
1118 * or system doesn't provide valid _SB.AMAC this will be
1119 * be expected to non-zero
1120 */
1121 ret = vendor_mac_passthru_addr_read(tp, &sa);
1122 if (ret < 0)
1123 ret = pla_ocp_read(tp, PLA_BACKUP, 8, sa.sa_data);
1124 }
1053 1125
1054 if (ret < 0) { 1126 if (ret < 0) {
1055 netif_err(tp, probe, dev, "Get ether addr fail\n"); 1127 netif_err(tp, probe, dev, "Get ether addr fail\n");
@@ -2300,10 +2372,6 @@ static u32 __rtl_get_wol(struct r8152 *tp)
2300 u32 ocp_data; 2372 u32 ocp_data;
2301 u32 wolopts = 0; 2373 u32 wolopts = 0;
2302 2374
2303 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG5);
2304 if (!(ocp_data & LAN_WAKE_EN))
2305 return 0;
2306
2307 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG34); 2375 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG34);
2308 if (ocp_data & LINK_ON_WAKE_EN) 2376 if (ocp_data & LINK_ON_WAKE_EN)
2309 wolopts |= WAKE_PHY; 2377 wolopts |= WAKE_PHY;
@@ -2336,15 +2404,13 @@ static void __rtl_set_wol(struct r8152 *tp, u32 wolopts)
2336 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CONFIG34, ocp_data); 2404 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CONFIG34, ocp_data);
2337 2405
2338 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG5); 2406 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG5);
2339 ocp_data &= ~(UWF_EN | BWF_EN | MWF_EN | LAN_WAKE_EN); 2407 ocp_data &= ~(UWF_EN | BWF_EN | MWF_EN);
2340 if (wolopts & WAKE_UCAST) 2408 if (wolopts & WAKE_UCAST)
2341 ocp_data |= UWF_EN; 2409 ocp_data |= UWF_EN;
2342 if (wolopts & WAKE_BCAST) 2410 if (wolopts & WAKE_BCAST)
2343 ocp_data |= BWF_EN; 2411 ocp_data |= BWF_EN;
2344 if (wolopts & WAKE_MCAST) 2412 if (wolopts & WAKE_MCAST)
2345 ocp_data |= MWF_EN; 2413 ocp_data |= MWF_EN;
2346 if (wolopts & WAKE_ANY)
2347 ocp_data |= LAN_WAKE_EN;
2348 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CONFIG5, ocp_data); 2414 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CONFIG5, ocp_data);
2349 2415
2350 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); 2416 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
@@ -4361,3 +4427,4 @@ module_usb_driver(rtl8152_driver);
4361MODULE_AUTHOR(DRIVER_AUTHOR); 4427MODULE_AUTHOR(DRIVER_AUTHOR);
4362MODULE_DESCRIPTION(DRIVER_DESC); 4428MODULE_DESCRIPTION(DRIVER_DESC);
4363MODULE_LICENSE("GPL"); 4429MODULE_LICENSE("GPL");
4430MODULE_VERSION(DRIVER_VERSION);