Received: by 2002:ab2:2441:0:b0:1f3:1f8c:d0c6 with SMTP id k1csp118565lqe; Thu, 4 Apr 2024 01:08:14 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCV9ay1tVAC8aCA0rWgcR5dLz0n4fF7chvHxbvqo1YJVAkFZ40VUOpqeCZ8aoUnSGryIWDSpHmqb0rSF0TOwjkZWxJHmNynPbp1f56+McQ== X-Google-Smtp-Source: AGHT+IEsXlau+e7gR7+MahrSE1cikNdI2vF0yU/AAmt8I48ufprFNMZs+kSDWh1bRYFQMVNvjQZT X-Received: by 2002:a17:90a:f998:b0:29f:f1f0:88c2 with SMTP id cq24-20020a17090af99800b0029ff1f088c2mr1618142pjb.4.1712218093961; Thu, 04 Apr 2024 01:08:13 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712218093; cv=pass; d=google.com; s=arc-20160816; b=HteJU8Sx7XHJ+orQBOtR2MYQRj0hiO6ulHMnO0/3QoYEPCpcynkb3WGBYUF7mbsXDH eARp5PtnHWOxiRthCTo58RGKmU0ozsDnA4GQ1js1nxWBEe6N40KFnslhzPcYyf+zS7sC Jev2yrIp8hzImgIojWwTl8v+qS+6YY8AiTqvSosOAc79jiLS7+8edl1UeXdkNSdWtwTr SZOHE3qGm37+5QOUb6ME7WWioijcgfTvhjRx/0bPKegctrWsHSEt/lxgYCrzz52ifmLQ iC1JVijOMUeH88CkxyefwId5Tk1afPXJbcqRDyXfqWYUwBdBVFeEHpBbJECDwIr/bF75 0uVA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=Q8qjQ9dmdVB2B2yrlfzMnrRDgO9DYDQN2xa+EkvT42A=; fh=6Ns0gvaPPCgoRB6k7/2LetHz7jbLGPUv+w7VUsr8kbg=; b=085IJS5D4ya0Bc0/Cd8vmEYSKLY90c7RSzzN88S7g+2WCq2hv+X9gbIYFGbsSkXhBp +3jY1I0acZ3FN04Ut0/R3p97UflOhcjZuR+xtU0gimVlHNgu0BFTzeW6c9+K9VdKHGu4 TUFEuKK+RwW9Iz0q8cVANsUoi85/YwmUSOsh66698oKWtGu7qaIm2jMA3LMv7BxYNdGm MKyPMu74BG7rI0q5IOBDe8lHDGhSDpx450WepQCGRB1G4ZmnALQuX2+xbsSZT6VyPdwB wl0it4tlPlht0q1nPMj+6JHQGbwloo9MVNklgRY1uXno4D6MWoLjSHfuApLm5L2VZguY sQ0g==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=ReNob7He; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-131068-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-131068-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id co9-20020a17090afe8900b0029c74a38c69si1167649pjb.168.2024.04.04.01.08.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Apr 2024 01:08:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-131068-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=ReNob7He; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-131068-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-131068-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id D53E6B275A7 for ; Thu, 4 Apr 2024 08:00:04 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A4BB65D8E1; Thu, 4 Apr 2024 07:59:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ReNob7He" Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F157A5A110 for ; Thu, 4 Apr 2024 07:59:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712217587; cv=none; b=V9LnpRk7EX3+Gf+gjrSpMwXyHHIcOCsXBGGaA5DfIxiqyl4unfKL8+dryg6r5mcCbB3kwA77QuXbU7u+DDNrlcl3aKfTapba5l995FVmViqBQmzndyatcVOgqLR3BB9n6Dj9kecoLzQdHLlFPRqYd65sEM0sZOBYQw2ygGmmm7E= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712217587; c=relaxed/simple; bh=6VQEKdOi8hityzEeY031NRE+HxpeOBcsP78gbB19eP4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=KhMspllkKAm2gqYVhFKUWg5ImRefa6o2D4/NXbsT1x/vzZ1+GC+GMdtBP2VNIh4RIlp0JNI6XuGjyjQjCy0smphVzOSns9EgfEUNDeQ1GqM1fkY+SGKgkc8x61bL6DLos86NZoFTowDn+JPxzAfJW6Fo2zexMcWr1BzMXW/HcL4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ReNob7He; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1712217584; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Q8qjQ9dmdVB2B2yrlfzMnrRDgO9DYDQN2xa+EkvT42A=; b=ReNob7HeVb/wo0W+bN2V5akUJu6pzq51NO7Kq8bovnc9wU4gLUqsKmzEtOvjjDofyoxigB 1ua26QhmvLcALpISB+UvZFegBslrgjZMnXgVCjvWUEwl0m0g2vNFCkX7WECg54oJjvXGhN ulEenTqngMA3NBVx5kWBKnVePdWoQZQ= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-197-ygA45I3yM9Ce2VrY_mmmVg-1; Thu, 04 Apr 2024 03:59:42 -0400 X-MC-Unique: ygA45I3yM9Ce2VrY_mmmVg-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 988C9805AA4; Thu, 4 Apr 2024 07:59:40 +0000 (UTC) Received: from ksundara-mac.redhat.com (unknown [10.74.17.36]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3D03C200A386; Thu, 4 Apr 2024 07:59:33 +0000 (UTC) From: Karthik Sundaravel To: jesse.brandeburg@intel.com, wojciech.drewek@intel.com, sumang@marvell.com, jacob.e.keller@intel.com, anthony.l.nguyen@intel.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: pmenzel@molgen.mpg.de, jiri@resnulli.us, michal.swiatkowski@linux.intel.com, rjarry@redhat.com, aharivel@redhat.com, vchundur@redhat.com, ksundara@redhat.com, cfontain@redhat.com Subject: [PATCH v8] ice: Add get/set hw address for VFs using devlink commands Date: Thu, 4 Apr 2024 13:29:17 +0530 Message-Id: <20240404075917.4347-2-ksundara@redhat.com> In-Reply-To: <20240404075917.4347-1-ksundara@redhat.com> References: <20240404075917.4347-1-ksundara@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.4 Changing the MAC address of the VFs is currently unsupported via devlink. Add the function handlers to set and get the HW address for the VFs. Signed-off-by: Karthik Sundaravel --- drivers/net/ethernet/intel/ice/ice_devlink.c | 60 ++++++++++++++++++- drivers/net/ethernet/intel/ice/ice_sriov.c | 62 ++++++++++++++++++++ drivers/net/ethernet/intel/ice/ice_sriov.h | 8 +++ 3 files changed, 129 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c index 80dc5445b50d..381c7411fcf7 100644 --- a/drivers/net/ethernet/intel/ice/ice_devlink.c +++ b/drivers/net/ethernet/intel/ice/ice_devlink.c @@ -1576,6 +1576,63 @@ void ice_devlink_destroy_pf_port(struct ice_pf *pf) devlink_port_unregister(&pf->devlink_port); } +/** + * ice_devlink_port_get_vf_fn_mac - .port_fn_hw_addr_get devlink handler + * @port: devlink port structure + * @hw_addr: MAC address of the port + * @hw_addr_len: length of MAC address + * @extack: extended netdev ack structure + * + * Callback for the devlink .port_fn_hw_addr_get operation + * Return: zero on success or an error code on failure. + */ + +static int ice_devlink_port_get_vf_fn_mac(struct devlink_port *port, + u8 *hw_addr, int *hw_addr_len, + struct netlink_ext_ack *extack) +{ + struct ice_vf *vf = container_of(port, struct ice_vf, devlink_port); + + ether_addr_copy(hw_addr, vf->dev_lan_addr); + *hw_addr_len = ETH_ALEN; + + return 0; +} + +/** + * ice_devlink_port_set_vf_fn_mac - .port_fn_hw_addr_set devlink handler + * @port: devlink port structure + * @hw_addr: MAC address of the port + * @hw_addr_len: length of MAC address + * @extack: extended netdev ack structure + * + * Callback for the devlink .port_fn_hw_addr_set operation + * Return: zero on success or an error code on failure. + */ +static int ice_devlink_port_set_vf_fn_mac(struct devlink_port *port, + const u8 *hw_addr, + int hw_addr_len, + struct netlink_ext_ack *extack) + +{ + struct devlink_port_attrs *attrs = &port->attrs; + struct devlink_port_pci_vf_attrs *pci_vf; + struct devlink *devlink = port->devlink; + struct ice_pf *pf; + u16 vf_id; + + pf = devlink_priv(devlink); + pci_vf = &attrs->pci_vf; + vf_id = pci_vf->vf; + + return ice_set_vf_fn_mac(pf, vf_id, hw_addr); +} + +static const struct devlink_port_ops ice_devlink_vf_port_ops = { + .port_fn_hw_addr_get = ice_devlink_port_get_vf_fn_mac, + .port_fn_hw_addr_set = ice_devlink_port_set_vf_fn_mac, +}; + /** * ice_devlink_create_vf_port - Create a devlink port for this VF * @vf: the VF to create a port for @@ -1611,7 +1668,8 @@ int ice_devlink_create_vf_port(struct ice_vf *vf) devlink_port_attrs_set(devlink_port, &attrs); devlink = priv_to_devlink(pf); - err = devlink_port_register(devlink, devlink_port, vsi->idx); + err = devlink_port_register_with_ops(devlink, devlink_port, + vsi->idx, &ice_devlink_vf_port_ops); if (err) { dev_err(dev, "Failed to create devlink port for VF %d, error %d\n", vf->vf_id, err); diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.c b/drivers/net/ethernet/intel/ice/ice_sriov.c index 31314e7540f8..20a0eb406c40 100644 --- a/drivers/net/ethernet/intel/ice/ice_sriov.c +++ b/drivers/net/ethernet/intel/ice/ice_sriov.c @@ -1216,6 +1216,68 @@ ice_get_vf_cfg(struct net_device *netdev, int vf_id, struct ifla_vf_info *ivi) return ret; } +/** + * ice_set_vf_fn_mac + * @pf: PF to be configure + * @vf_id: VF identifier + * @mac: MAC address + * + * program VF MAC address + */ +int ice_set_vf_fn_mac(struct ice_pf *pf, u16 vf_id, const u8 *mac) +{ + struct device *dev; + struct ice_vf *vf; + int ret; + + dev = ice_pf_to_dev(pf); + if (is_multicast_ether_addr(mac)) { + dev_err(dev, "%pM not a valid unicast address\n", mac); + return -EINVAL; + } + + vf = ice_get_vf_by_id(pf, vf_id); + if (!vf) + return -EINVAL; + + /* nothing left to do, unicast MAC already set */ + if (ether_addr_equal(vf->dev_lan_addr, mac) && + ether_addr_equal(vf->hw_lan_addr, mac)) { + ret = 0; + goto out_put_vf; + } + + ret = ice_check_vf_ready_for_cfg(vf); + if (ret) + goto out_put_vf; + + mutex_lock(&vf->cfg_lock); + + /* VF is notified of its new MAC via the PF's response to the + * VIRTCHNL_OP_GET_VF_RESOURCES message after the VF has been reset + */ + ether_addr_copy(vf->dev_lan_addr, mac); + ether_addr_copy(vf->hw_lan_addr, mac); + if (is_zero_ether_addr(mac)) { + /* VF will send VIRTCHNL_OP_ADD_ETH_ADDR message with its MAC */ + vf->pf_set_mac = false; + dev_info(dev, "Removing MAC on VF %d. VF driver will be reinitialized\n", + vf->vf_id); + } else { + /* PF will add MAC rule for the VF */ + vf->pf_set_mac = true; + dev_info(dev, "Setting MAC %pM on VF %d. VF driver will be reinitialized\n", + mac, vf_id); + } + + ice_reset_vf(vf, ICE_VF_RESET_NOTIFY); + mutex_unlock(&vf->cfg_lock); + +out_put_vf: + ice_put_vf(vf); + return ret; +} + /** * ice_set_vf_mac * @netdev: network interface device structure diff --git a/drivers/net/ethernet/intel/ice/ice_sriov.h b/drivers/net/ethernet/intel/ice/ice_sriov.h index 346cb2666f3a..afde25cd1c9f 100644 --- a/drivers/net/ethernet/intel/ice/ice_sriov.h +++ b/drivers/net/ethernet/intel/ice/ice_sriov.h @@ -28,6 +28,7 @@ #ifdef CONFIG_PCI_IOV void ice_process_vflr_event(struct ice_pf *pf); int ice_sriov_configure(struct pci_dev *pdev, int num_vfs); +int ice_set_vf_fn_mac(struct ice_pf *pf, u16 vf_id, const u8 *mac); int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac); int ice_get_vf_cfg(struct net_device *netdev, int vf_id, struct ifla_vf_info *ivi); @@ -76,6 +77,13 @@ ice_sriov_configure(struct pci_dev __always_unused *pdev, return -EOPNOTSUPP; } +static inline int +ice_set_vf_fn_mac(struct ice_pf __always_unused *pf, + u16 __always_unused vf_id, const u8 __always_unused *mac) +{ + return -EOPNOTSUPP; +} + static inline int ice_set_vf_mac(struct net_device __always_unused *netdev, int __always_unused vf_id, u8 __always_unused *mac) -- 2.39.3 (Apple Git-146)