Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp619851pxy; Wed, 5 May 2021 09:41:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxt8fgTJZZw+3YdSXp8bw40i6H2+vn/1mBi6H8OHexyeTbCImswIHg3Xbzo2UK8i9/BKSX/ X-Received: by 2002:a50:d68a:: with SMTP id r10mr20844959edi.90.1620232873649; Wed, 05 May 2021 09:41:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620232873; cv=none; d=google.com; s=arc-20160816; b=uZBXTAOEo70FS9sYON8nItJhMzQrHG4O0JOZQTNBng4+tQTxvPNJ3u6BGj4h2ULn/S /NmQ/nS3syuT4QzNGWbEOG1sKpVMo5Qc++/BOIt01u3pbUuI9GlnQXCoFlgn++wmAbFe 6e0KR5FyPG07N8tnelX6NxXdBxYR3oUpqb5k5SuGtYZvXVSVHrHi2AsWnaQPG3idl6i+ WS8b0JnMF8tFw72C/GTtpnt/PzO6QAZrTzVVTEmvvb42gvc1X6jlusJiYKnAcdaojkR4 uiGmpPAX5IaDoIuGIqg0MiZCO6aYVabV43EAsOLY+NMQGgX0xcdWkesBPdTs5mF9IW2D 5j5Q== 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=fm1+rNQVGBTPNoggmjmHjXqAqQFHlDN+oF02osEPxYY=; b=JpDuSQNBDUfG8fkU8z9blxqbrYFuMlvz2SckEKpZ/0HOQd+NEiahZRtZn7QNhg3aaL 9DLtXzW0abGOIbqSa5k/vQtfnl+hY9cv68D5UIjWSuHsN8lM2MkZuTiaULaxYY1siWjF /z+m6gmFvViuHURaI0uDq4VucMjxtlmdY0+YYFpeH1GdYX9FUzPdX8Zxye/85DLY7751 a2C0DczSsDnSp2E4mPC7NzHZo/n+hD17zqRHeFUIt2YUBaAB3VLqvuejjxblhN54q4K7 UkQWalglwDxpwvmRRBaq4ivs9NXpE3/z0Gm4GBzlpLkDQgcDAMZQkvPT2GMJIZxSyjA+ mFFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FXFlmlNG; 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 hc43si7244314ejc.387.2021.05.05.09.40.49; Wed, 05 May 2021 09:41:13 -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=FXFlmlNG; 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 S234166AbhEEQkt (ORCPT + 99 others); Wed, 5 May 2021 12:40:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:53402 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234547AbhEEQhV (ORCPT ); Wed, 5 May 2021 12:37:21 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id E38EC61442; Wed, 5 May 2021 16:33:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620232409; bh=3cGMjJNrm/8gkL5HPAi2bxb+Bqm/8WeEaYkUYtNekV8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FXFlmlNGTKYL3hpBl/RcnlCM/7TWE4P4eu4mVJ97R4YknAgkrAx+4B912zjPGrFdN oiB19AMq7Elyw9e0+LAfkNsK8ojKBPp0xUQbnb1jsuthS3imsmEzX7vzC3aFvWC3pg E4yzaxG7StG6LwjxsKbKUGRbbeIrfnvKqOTKthEV/nPByzqvxC4NuzYlp6ETBMa2Pc iQQEbUtDomj3QWvb+gFjhGvEmY9BXpuAJ32+SmowhWpRM9IdVb0U1D6+FoOyZWKpjy FbrVNvxA/Eg3SNCjHqH51eHARdUmeZjibCI8juHAQB26t2pZTFEPw6Cj6nuz/x0gh4 unULgB3uSmY6g== 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.12 088/116] wilc1000: Bring MAC address setting in line with typical Linux behavior Date: Wed, 5 May 2021 12:30:56 -0400 Message-Id: <20210505163125.3460440-88-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210505163125.3460440-1-sashal@kernel.org> References: <20210505163125.3460440-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 1b205e7d97a8..37f40039e4ca 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