diff options
author | David S. Miller <davem@davemloft.net> | 2016-07-23 19:31:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-07-24 00:53:32 -0400 |
commit | de0ba9a0d8909996f9e293d311c2cc459fa77d67 (patch) | |
tree | 199214afc477824bf431d11d08834ff7555c994b /drivers/net/usb | |
parent | d95a93a9b71677a43f967a1b7986decab84b7765 (diff) | |
parent | 107df03203bb66de56e2caec3bde6d22b55480c5 (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.c | 85 |
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 | |||
463 | enum rtl_register_content { | 469 | enum 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 | */ | ||
1053 | static 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 | |||
1103 | amacout: | ||
1104 | kfree(obj); | ||
1105 | return ret; | ||
1106 | } | ||
1107 | |||
1043 | static int set_ethernet_addr(struct r8152 *tp) | 1108 | static 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); | |||
4361 | MODULE_AUTHOR(DRIVER_AUTHOR); | 4427 | MODULE_AUTHOR(DRIVER_AUTHOR); |
4362 | MODULE_DESCRIPTION(DRIVER_DESC); | 4428 | MODULE_DESCRIPTION(DRIVER_DESC); |
4363 | MODULE_LICENSE("GPL"); | 4429 | MODULE_LICENSE("GPL"); |
4430 | MODULE_VERSION(DRIVER_VERSION); | ||