[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <21830693-d8a0-4bbf-ae2f-11f793436895@intel.com>
Date: Tue, 12 Aug 2025 11:04:58 -0700
From: "Tantilov, Emil S" <emil.s.tantilov@...el.com>
To: "Hay, Joshua A" <joshua.a.hay@...el.com>,
"intel-wired-lan@...ts.osuosl.org" <intel-wired-lan@...ts.osuosl.org>
CC: "netdev@...r.kernel.org" <netdev@...r.kernel.org>, "Loktionov, Aleksandr"
<aleksandr.loktionov@...el.com>, "Kitszel, Przemyslaw"
<przemyslaw.kitszel@...el.com>, "Nguyen, Anthony L"
<anthony.l.nguyen@...el.com>, "andrew+netdev@...n.ch"
<andrew+netdev@...n.ch>, "davem@...emloft.net" <davem@...emloft.net>,
"edumazet@...gle.com" <edumazet@...gle.com>, "kuba@...nel.org"
<kuba@...nel.org>, "pabeni@...hat.com" <pabeni@...hat.com>,
"jianliu@...hat.com" <jianliu@...hat.com>, "Schmidt, Michal"
<mschmidt@...hat.com>, "decot@...gle.com" <decot@...gle.com>,
"willemb@...gle.com" <willemb@...gle.com>
Subject: Re: [PATCH iwl-net] idpf: set mac type when adding and removing MAC
filters
On 8/12/2025 9:20 AM, Hay, Joshua A wrote:
>> On control planes that allow changing the MAC address of the interface,
>> the driver must provide a MAC type to avoid errors such as:
>>
>> idpf 0000:0a:00.0: Transaction failed (op 535)
>> idpf 0000:0a:00.0: Received invalid MAC filter payload (op 535) (len 0)
>>
>> These errors occur during driver load or when changing the MAC via:
>> ip link set <iface> address <mac>
>>
>> Add logic to set the MAC type before performing ADD/DEL operations.
>> Since only one primary MAC is supported per vport, the driver only needs
>> to perform ADD in idpf_set_mac().
>>
>> Fixes: ce1b75d0635c ("idpf: add ptypes and MAC filter support")
>> Reported-by: Jian Liu <jianliu@...hat.com>
>> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@...el.com>
>> Signed-off-by: Emil Tantilov <emil.s.tantilov@...el.com>
>> ---
>> drivers/net/ethernet/intel/idpf/idpf_lib.c | 6 ++----
>> drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 11 +++++++++++
>> 2 files changed, 13 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c
>> b/drivers/net/ethernet/intel/idpf/idpf_lib.c
>> index 80382ff4a5fa..77d554b0944b 100644
>> --- a/drivers/net/ethernet/intel/idpf/idpf_lib.c
>> +++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c
>> @@ -2284,17 +2284,15 @@ static int idpf_set_mac(struct net_device
>> *netdev, void *p)
>> if (ether_addr_equal(netdev->dev_addr, addr->sa_data))
>> goto unlock_mutex;
>>
>> + ether_addr_copy(vport->default_mac_addr, addr->sa_data);
>> vport_config = vport->adapter->vport_config[vport->idx];
>> err = idpf_add_mac_filter(vport, np, addr->sa_data, false);
>> if (err) {
>> __idpf_del_mac_filter(vport_config, addr->sa_data);
>> + ether_addr_copy(vport->default_mac_addr, netdev-
>>> dev_addr);
>> goto unlock_mutex;
>> }
>>
>> - if (is_valid_ether_addr(vport->default_mac_addr))
>> - idpf_del_mac_filter(vport, np, vport->default_mac_addr,
>> false);
>
> We still need the call to __idpf_del_mac_filter here with the old addr to free it from the filter list.
Yeah, there is no need to send the message, but the filter list needs to
be updated accordingly. Good catch! Will submit v2 to resolve it.
Thanks,
Emil
>
> Thanks,
> Josh
>
>> -
>> - ether_addr_copy(vport->default_mac_addr, addr->sa_data);
>> eth_hw_addr_set(netdev, addr->sa_data);
>>
>> unlock_mutex:
>> diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
>> b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
>> index 24febaaa8fbb..7563289dc1e3 100644
>> --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
>> +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
>> @@ -3507,6 +3507,15 @@ u32 idpf_get_vport_id(struct idpf_vport *vport)
>> return le32_to_cpu(vport_msg->vport_id);
>> }
>>
>> +static void idpf_set_mac_type(struct idpf_vport *vport,
>> + struct virtchnl2_mac_addr *mac_addr)
>> +{
>> + if (ether_addr_equal(vport->default_mac_addr, mac_addr->addr))
>> + mac_addr->type = VIRTCHNL2_MAC_ADDR_PRIMARY;
>> + else
>> + mac_addr->type = VIRTCHNL2_MAC_ADDR_EXTRA;
>> +}
>> +
>> /**
>> * idpf_mac_filter_async_handler - Async callback for mac filters
>> * @adapter: private data struct
>> @@ -3636,6 +3645,7 @@ int idpf_add_del_mac_filters(struct idpf_vport
>> *vport,
>> list) {
>> if (add && f->add) {
>> ether_addr_copy(mac_addr[i].addr, f->macaddr);
>> + idpf_set_mac_type(vport, &mac_addr[i]);
>> i++;
>> f->add = false;
>> if (i == total_filters)
>> @@ -3643,6 +3653,7 @@ int idpf_add_del_mac_filters(struct idpf_vport
>> *vport,
>> }
>> if (!add && f->remove) {
>> ether_addr_copy(mac_addr[i].addr, f->macaddr);
>> + idpf_set_mac_type(vport, &mac_addr[i]);
>> i++;
>> f->remove = false;
>> if (i == total_filters)
>> --
>> 2.37.3
>>
>
Powered by blists - more mailing lists