Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp627102pxy; Wed, 5 May 2021 09:50:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyb7PJGjpE3zqKBsLkI8PgOjqH9HsCa9FVqgXgRXTm2XQ3DcomIMcejpI4v6fdpOIf3PAUq X-Received: by 2002:a17:902:d508:b029:ee:d95b:c39d with SMTP id b8-20020a170902d508b02900eed95bc39dmr16752417plg.42.1620233437893; Wed, 05 May 2021 09:50:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620233437; cv=none; d=google.com; s=arc-20160816; b=o53Y9ESKrObSup3OD8bc0ITQ6Ii6/3WpF6BJ5aLMv10RUmc4U5kKOiSOC5FbPyoKaa /mCXwnB1i7Af/taZs1GcJGiQvVEgc44SR23F54Ja3TIN1YZKLOn1AzqFAuGcPttnZNsW s+cHxhUrhW+7Zyym36jFDWqHVF1ri4rrkHl+QyVBj+Qay5DjhnOQbQ4yeO0KVP3amC8Q RNW+3lFdX4F4tZAneaHk3lsQXo1VY1xQdqvlwo4Fx9xymrJ7q0OZog059XfW9mcwLYoj 2JjSKjfTCtPWdgPoFDkzNT6HD+ce3zxqvKDZTyu5bjWLkl2UQl1KJCDQSm/5i5LVcZG/ kZJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3xps4yku4dFFHj+zCrb6BetByhbi0ZaQP+GWLEJVcEs=; b=VY1gGD+TfTzPr9z15ZChfu3ZM6B5zN7mSoGcGYfihThaLiIvB7aI2SbeiqTnIYaWRI 2TFCx3Ipu7TQ0fOzOfkMGG0kfMwi0XYB+9XJ9TLcqGmK6g5q7EkcqSe/RcaVwlCW3SDw nVWsl5lH5BKv7a7nn13iYIk5jgDOdVyeWdRyNagT5b9zyK0oJS/bo0cLft9ETJ6AM5MM 1zLa9b0xcznpQLiZY/DDL3ZTIpGSe7wSfKxoLZz0KTj5J3fn3qxqQxhFuCt8I+vf6vY2 W40NPd/3mBymgw3FBNGc5dUrK95l8QOt8rwvFGgd1NXlHjF3QtumT9gPjIhFx5gaSVGd bEBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="t6UhR/9j"; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 136si5554594pfz.261.2021.05.05.09.50.13; Wed, 05 May 2021 09:50:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="t6UhR/9j"; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234631AbhEEQsB (ORCPT + 99 others); Wed, 5 May 2021 12:48:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:49344 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235971AbhEEQpW (ORCPT ); Wed, 5 May 2021 12:45:22 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D4D9B61930; Wed, 5 May 2021 16:36:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620232567; bh=6r56QBO1lUI0eIJMbOcrck/Kl+oNsMP1657xqdG6OBA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t6UhR/9j1gwQAoeZQcEC2Ux3qkHDlzjcgtIDOyuX5sRyMWIYdGcXk5+PX1B2QBxfp pZN+mC+hEKe2nDgjm5pGD5I+WDTo5fDKJlUtZpzHPixve2Kqgrf0i5WR4tGtWqYamJ LizQCmo51VO0CpsYod5aZtlPwoTlEQJpyTP+IFC5U9wAOVdYIUVeC1L8rpfaoX+U17 0T+WHRlcgIyTxrh1AZiwavQQA5rL35AKDprBS3Sp+vyZlRdUbYdGhIUs9OZrqfI6+W r245yAoRK2NjIDvUtPJi/auvkP6UYN2v2qdNiuvMgQY82yk3+QV7hZl1pbhIxJSmDL DcqOaIc+tPP5Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: David Mosberger-Tang , Kalle Valo , Sasha Levin , linux-wireless@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH AUTOSEL 5.11 078/104] wilc1000: Bring MAC address setting in line with typical Linux behavior Date: Wed, 5 May 2021 12:33:47 -0400 Message-Id: <20210505163413.3461611-78-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210505163413.3461611-1-sashal@kernel.org> References: <20210505163413.3461611-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: David Mosberger-Tang [ Upstream commit a381b78a1598dde34a6e40dae2842024308a6ef2 ] Linux network drivers normally disallow changing the MAC address when the interface is up. This driver has been different in that it allows to change the MAC address *only* when it's up. This patch brings wilc1000 behavior more in line with other network drivers. We could have replaced wilc_set_mac_addr() with eth_mac_addr() but that would break existing documentation on how to change the MAC address. Likewise, return -EADDRNOTAVAIL (not -EINVAL) when the specified MAC address is invalid or unavailable. Signed-off-by: David Mosberger-Tang Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20210303194846.1823596-1-davidm@egauge.net Signed-off-by: Sasha Levin --- .../net/wireless/microchip/wilc1000/netdev.c | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/net/wireless/microchip/wilc1000/netdev.c b/drivers/net/wireless/microchip/wilc1000/netdev.c index 0c188310919e..acf7ed4bfe57 100644 --- a/drivers/net/wireless/microchip/wilc1000/netdev.c +++ b/drivers/net/wireless/microchip/wilc1000/netdev.c @@ -575,7 +575,6 @@ static int wilc_mac_open(struct net_device *ndev) { struct wilc_vif *vif = netdev_priv(ndev); struct wilc *wl = vif->wilc; - unsigned char mac_add[ETH_ALEN] = {0}; int ret = 0; struct mgmt_frame_regs mgmt_regs = {}; @@ -598,9 +597,12 @@ static int wilc_mac_open(struct net_device *ndev) wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), vif->iftype, vif->idx); - wilc_get_mac_address(vif, mac_add); - netdev_dbg(ndev, "Mac address: %pM\n", mac_add); - ether_addr_copy(ndev->dev_addr, mac_add); + + if (is_valid_ether_addr(ndev->dev_addr)) + wilc_set_mac_address(vif, ndev->dev_addr); + else + wilc_get_mac_address(vif, ndev->dev_addr); + netdev_dbg(ndev, "Mac address: %pM\n", ndev->dev_addr); if (!is_valid_ether_addr(ndev->dev_addr)) { netdev_err(ndev, "Wrong MAC address\n"); @@ -639,7 +641,14 @@ static int wilc_set_mac_addr(struct net_device *dev, void *p) int srcu_idx; if (!is_valid_ether_addr(addr->sa_data)) - return -EINVAL; + return -EADDRNOTAVAIL; + + if (!vif->mac_opened) { + eth_commit_mac_addr_change(dev, p); + return 0; + } + + /* Verify MAC Address is not already in use: */ srcu_idx = srcu_read_lock(&wilc->srcu); list_for_each_entry_rcu(tmp_vif, &wilc->vif_list, list) { @@ -647,7 +656,7 @@ static int wilc_set_mac_addr(struct net_device *dev, void *p) if (ether_addr_equal(addr->sa_data, mac_addr)) { if (vif != tmp_vif) { srcu_read_unlock(&wilc->srcu, srcu_idx); - return -EINVAL; + return -EADDRNOTAVAIL; } srcu_read_unlock(&wilc->srcu, srcu_idx); return 0; @@ -659,9 +668,7 @@ static int wilc_set_mac_addr(struct net_device *dev, void *p) if (result) return result; - ether_addr_copy(vif->bssid, addr->sa_data); - ether_addr_copy(vif->ndev->dev_addr, addr->sa_data); - + eth_commit_mac_addr_change(dev, p); return result; } -- 2.30.2