summaryrefslogtreecommitdiffstats
path: root/drivers/net/usb
diff options
context:
space:
mode:
authorMario Limonciello <mario.limonciello@dell.com>2019-04-04 14:46:53 -0400
committerDavid S. Miller <davem@davemloft.net>2019-04-06 21:21:46 -0400
commit25766271e42f6b15b72ba156cb42a3fea91b5b21 (patch)
treecd4ed0320a87ab3634d276cbd0c4160f56721935 /drivers/net/usb
parent78fdde30d4bd3175f77bcdfc1bb18f96e3dedef0 (diff)
r8152: Refresh MAC address during USBDEVFS_RESET
On some platforms it is possible to dynamically change the policy of what MAC address is selected from the ASL at runtime. These tools will reset the USB device and expect the change to be made immediately. Signed-off-by: Mario Limonciello <mario.limonciello@dell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r--drivers/net/usb/r8152.c50
1 files changed, 35 insertions, 15 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index dc1bfff0b5dc..6d63dcb73b26 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -1220,43 +1220,55 @@ amacout:
1220 return ret; 1220 return ret;
1221} 1221}
1222 1222
1223static int set_ethernet_addr(struct r8152 *tp) 1223static int determine_ethernet_addr(struct r8152 *tp, struct sockaddr *sa)
1224{ 1224{
1225 struct net_device *dev = tp->netdev; 1225 struct net_device *dev = tp->netdev;
1226 struct sockaddr sa;
1227 int ret; 1226 int ret;
1228 1227
1229 if (tp->version == RTL_VER_01) { 1228 if (tp->version == RTL_VER_01) {
1230 ret = pla_ocp_read(tp, PLA_IDR, 8, sa.sa_data); 1229 ret = pla_ocp_read(tp, PLA_IDR, 8, sa->sa_data);
1231 } else { 1230 } else {
1232 /* if device doesn't support MAC pass through this will 1231 /* if device doesn't support MAC pass through this will
1233 * be expected to be non-zero 1232 * be expected to be non-zero
1234 */ 1233 */
1235 ret = vendor_mac_passthru_addr_read(tp, &sa); 1234 ret = vendor_mac_passthru_addr_read(tp, sa);
1236 if (ret < 0) 1235 if (ret < 0)
1237 ret = pla_ocp_read(tp, PLA_BACKUP, 8, sa.sa_data); 1236 ret = pla_ocp_read(tp, PLA_BACKUP, 8, sa->sa_data);
1238 } 1237 }
1239 1238
1240 if (ret < 0) { 1239 if (ret < 0) {
1241 netif_err(tp, probe, dev, "Get ether addr fail\n"); 1240 netif_err(tp, probe, dev, "Get ether addr fail\n");
1242 } else if (!is_valid_ether_addr(sa.sa_data)) { 1241 } else if (!is_valid_ether_addr(sa->sa_data)) {
1243 netif_err(tp, probe, dev, "Invalid ether addr %pM\n", 1242 netif_err(tp, probe, dev, "Invalid ether addr %pM\n",
1244 sa.sa_data); 1243 sa->sa_data);
1245 eth_hw_addr_random(dev); 1244 eth_hw_addr_random(dev);
1246 ether_addr_copy(sa.sa_data, dev->dev_addr); 1245 ether_addr_copy(sa->sa_data, dev->dev_addr);
1247 ret = rtl8152_set_mac_address(dev, &sa);
1248 netif_info(tp, probe, dev, "Random ether addr %pM\n", 1246 netif_info(tp, probe, dev, "Random ether addr %pM\n",
1249 sa.sa_data); 1247 sa->sa_data);
1250 } else { 1248 return 0;
1251 if (tp->version == RTL_VER_01)
1252 ether_addr_copy(dev->dev_addr, sa.sa_data);
1253 else
1254 ret = rtl8152_set_mac_address(dev, &sa);
1255 } 1249 }
1256 1250
1257 return ret; 1251 return ret;
1258} 1252}
1259 1253
1254static int set_ethernet_addr(struct r8152 *tp)
1255{
1256 struct net_device *dev = tp->netdev;
1257 struct sockaddr sa;
1258 int ret;
1259
1260 ret = determine_ethernet_addr(tp, &sa);
1261 if (ret < 0)
1262 return ret;
1263
1264 if (tp->version == RTL_VER_01)
1265 ether_addr_copy(dev->dev_addr, sa.sa_data);
1266 else
1267 ret = rtl8152_set_mac_address(dev, &sa);
1268
1269 return ret;
1270}
1271
1260static void read_bulk_callback(struct urb *urb) 1272static void read_bulk_callback(struct urb *urb)
1261{ 1273{
1262 struct net_device *netdev; 1274 struct net_device *netdev;
@@ -4263,10 +4275,18 @@ static int rtl8152_post_reset(struct usb_interface *intf)
4263{ 4275{
4264 struct r8152 *tp = usb_get_intfdata(intf); 4276 struct r8152 *tp = usb_get_intfdata(intf);
4265 struct net_device *netdev; 4277 struct net_device *netdev;
4278 struct sockaddr sa;
4266 4279
4267 if (!tp) 4280 if (!tp)
4268 return 0; 4281 return 0;
4269 4282
4283 /* reset the MAC adddress in case of policy change */
4284 if (determine_ethernet_addr(tp, &sa) >= 0) {
4285 rtnl_lock();
4286 dev_set_mac_address (tp->netdev, &sa, NULL);
4287 rtnl_unlock();
4288 }
4289
4270 netdev = tp->netdev; 4290 netdev = tp->netdev;
4271 if (!netif_running(netdev)) 4291 if (!netif_running(netdev))
4272 return 0; 4292 return 0;