Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp152031pxj; Mon, 17 May 2021 23:40:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz30ZakqTWNfhUsWocWrmsoGuMU8bWzf2xnCfmSuz9cfdd0uH2yrZ18fAku/7VNuBYkNiHD X-Received: by 2002:a05:6e02:dcf:: with SMTP id l15mr2887681ilj.227.1621320030244; Mon, 17 May 2021 23:40:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621320030; cv=none; d=google.com; s=arc-20160816; b=qZPwt2VCgzEfkjNZ2HhPh6Jr7yaZXQSkNKgtWsgv57Nau4iVi9V4SSg1CCLcqYQkuR yMl31IBTx+nKUdEGkQPkVnishG1V/McgOdZ/Pks1AHZt+S5f6NekG4GOv9/M0WQ4DPgo juXI5ttASSXxyYsvkPYVCcYOw3+Em5XO+gXA+5bFRDmQh0LKF0K6H2WwzAUbFmLoRcN9 Zp/UywXrmE95/g91RTN1/+YI8BVvWDCKxdoCur1870x1WmbOqVdYxLjAu5R9P+XPVuiT mbp5kndiQmY0L4LY2bN5sIk8EG3vgvO7qXi4lABGTFEUj+8obKIechOKH1kuXCu6q2hg bR0A== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=3xps4yku4dFFHj+zCrb6BetByhbi0ZaQP+GWLEJVcEs=; b=zPmbd3XAEo8BGHHOL7hYGN3iQpbO5rXdTKEFh/21ryuDsMCGi7b6ehkoPYKE/lckO1 4U1qUFnAp/yVcV45/BbPqW2cOKRAJFAvXO2jgUF25INQClfZvhEFbMnfauBRGunZnfWT 062GC5MKnO8aGOn2A09Z3mcRtmUNgebGB7B7aTJd3wipE4A5GRUesaFKJOg9r+86+gJg ym0sXvjka5HFJrCkqYdZLmCXpRcCMZOgEKwfdeWDIju3Cd3hEjgcHmlUj5Qv8N9j0d3o 2xEKtmKOgWsEbmwLb6F+cpn9Zg+M1xpU2kHb99jSO6KLzPOZAHZgOr8p0aRCQwaTaol/ 74sw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=0M0XGKh7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q3si24552403ilu.88.2021.05.17.23.40.17; Mon, 17 May 2021 23:40:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-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=@linuxfoundation.org header.s=korg header.b=0M0XGKh7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241476AbhEQOvH (ORCPT + 99 others); Mon, 17 May 2021 10:51:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:54228 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241268AbhEQOn1 (ORCPT ); Mon, 17 May 2021 10:43:27 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id B3E5161956; Mon, 17 May 2021 14:19:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1621261188; bh=6r56QBO1lUI0eIJMbOcrck/Kl+oNsMP1657xqdG6OBA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0M0XGKh7QxCCJMbrrAbMAs9wFLGh+gkwUU+Dccgs6l//rkwPiS5rKb2o95T+iMYIl t3/AnyP+Tlq8bVlrcOtzF5CpgA95oibBNDdL8tFPVpw0qPZt6LAVlTJR9/4TwGuljF na9j5AFx5KceHZ7HQP/vFXblS+OFGswGrSuLqMWY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, David Mosberger-Tang , Kalle Valo , Sasha Levin Subject: [PATCH 5.11 085/329] wilc1000: Bring MAC address setting in line with typical Linux behavior Date: Mon, 17 May 2021 15:59:56 +0200 Message-Id: <20210517140304.997207336@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210517140302.043055203@linuxfoundation.org> References: <20210517140302.043055203@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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