From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:13
Take care of a few stragglers and make netdev->dev_addr const.
netdev->dev_addr can be held on the address tree like any other
address now.
Jakub Kicinski (9):
net: ax88796c: don't write to netdev->dev_addr directly
mlxsw: constify address in mlxsw_sp_port_dev_addr_set
wilc1000: copy address before calling wilc_set_mac_address
ipw2200: constify address in ipw_send_adapter_address
net: constify netdev->dev_addr
net: unexport dev_addr_init() & dev_addr_flush()
dev_addr: add a modification check
dev_addr_list: put the first addr on the tree
net: kunit: add a test for dev_addr_lists
drivers/net/ethernet/asix/ax88796c_main.c | 18 +-
.../net/ethernet/mellanox/mlxsw/spectrum.c | 2 +-
drivers/net/wireless/intel/ipw2x00/ipw2200.c | 2 +-
.../net/wireless/microchip/wilc1000/netdev.c | 6 +-
include/linux/netdevice.h | 17 +-
net/Kconfig | 5 +
net/core/Makefile | 2 +
net/core/dev.c | 1 +
net/core/dev_addr_lists.c | 93 ++++---
net/core/dev_addr_lists_test.c | 234 ++++++++++++++++++
10 files changed, 328 insertions(+), 52 deletions(-)
create mode 100644 net/core/dev_addr_lists_test.c
--
2.31.1
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:22
The future is here, convert the new driver as we are about
to make netdev->dev_addr const.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
CC: l.stelmach@samsung.com
---
drivers/net/ethernet/asix/ax88796c_main.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
@@ -144,12 +144,13 @@ static void ax88796c_set_mac_addr(struct net_device *ndev)staticvoidax88796c_load_mac_addr(structnet_device*ndev){structax88796c_device*ax_local=to_ax88796c_device(ndev);+u8addr[ETH_ALEN];u16temp;lockdep_assert_held(&ax_local->spi_lock);/* Try the device tree first */-if(!eth_platform_get_mac_address(&ax_local->spi->dev,ndev->dev_addr)&&+if(!platform_get_ethdev_address(&ax_local->spi->dev,ndev)&&is_valid_ether_addr(ndev->dev_addr)){if(netif_msg_probe(ax_local))dev_info(&ax_local->spi->dev,
@@ -159,18 +160,19 @@ static void ax88796c_load_mac_addr(struct net_device *ndev)/* Read the MAC address from AX88796C */temp=AX_READ(&ax_local->ax_spi,P3_MACASR0);-ndev->dev_addr[5]=(u8)temp;-ndev->dev_addr[4]=(u8)(temp>>8);+addr[5]=(u8)temp;+addr[4]=(u8)(temp>>8);temp=AX_READ(&ax_local->ax_spi,P3_MACASR1);-ndev->dev_addr[3]=(u8)temp;-ndev->dev_addr[2]=(u8)(temp>>8);+addr[3]=(u8)temp;+addr[2]=(u8)(temp>>8);temp=AX_READ(&ax_local->ax_spi,P3_MACASR2);-ndev->dev_addr[1]=(u8)temp;-ndev->dev_addr[0]=(u8)(temp>>8);+addr[1]=(u8)temp;+addr[0]=(u8)(temp>>8);-if(is_valid_ether_addr(ndev->dev_addr)){+if(is_valid_ether_addr(addr)){+eth_hw_addr_set(ndev,addr);if(netif_msg_probe(ax_local))dev_info(&ax_local->spi->dev,"MAC address read from ASIX chip\n");
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:22
Add const to the address param of ipw_send_adapter_address()
all the functions down the chain have already been changed.
Not sure how I lost this in the rebase.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
CC: stas.yakovlev@gmail.com
CC: kvalo@codeaurora.org
---
drivers/net/wireless/intel/ipw2x00/ipw2200.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:22
Since all netdev->dev_addr modifications go via dev_addr_mod()
we can put it on the list. When address is change remove it
and add it back.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
net/core/dev_addr_lists.c | 62 +++++++++++++++++++++------------------
1 file changed, 34 insertions(+), 28 deletions(-)
@@ -50,11 +79,6 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list,if(addr_len>MAX_ADDR_LEN)return-EINVAL;-ha=list_first_entry(&list->list,structnetdev_hw_addr,list);-if(ha&&!memcmp(addr,ha->addr,addr_len)&&-(!addr_type||addr_type==ha->type))-gotofound_it;-while(*ins_point){intdiff;
@@ -69,7 +93,6 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list,}elseif(diff>0){ins_point=&parent->rb_right;}else{-found_it:if(exclusive)return-EEXIST;if(global){
@@ -94,16 +117,8 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list,if(!ha)return-ENOMEM;-/* The first address in dev->dev_addrs is pointed to by dev->dev_addr-*andmutatedfreelybydevicedriversandnetdevops,soifweinsert-*itintothetreewe'llendupwithaninvalidrbtree.-*/-if(list->count>0){-rb_link_node(&ha->node,parent,ins_point);-rb_insert_color(&ha->node,&list->tree);-}else{-RB_CLEAR_NODE(&ha->node);-}+rb_link_node(&ha->node,parent,ins_point);+rb_insert_color(&ha->node,&list->tree);list_add_tail_rcu(&ha->list,&list->list);list->count++;
@@ -138,8 +153,7 @@ static int __hw_addr_del_entry(struct netdev_hw_addr_list *list,if(--ha->refcount)return0;-if(!RB_EMPTY_NODE(&ha->node))-rb_erase(&ha->node,&list->tree);+rb_erase(&ha->node,&list->tree);list_del_rcu(&ha->list);kfree_rcu(ha,rcu_head);
@@ -151,18 +165,8 @@ static struct netdev_hw_addr *__hw_addr_lookup(struct netdev_hw_addr_list *list,constunsignedchar*addr,intaddr_len,unsignedcharaddr_type){-structnetdev_hw_addr*ha;structrb_node*node;-/* The first address isn't inserted into the tree because in the dev->dev_addrs-*listit'stheaddresspointedtobydev->dev_addrwhichisfreelymutated-*inplace,soweneedtocheckitseparately.-*/-ha=list_first_entry(&list->list,structnetdev_hw_addr,list);-if(ha&&!memcmp(addr,ha->addr,addr_len)&&-(!addr_type||addr_type==ha->type))-returnha;-node=list->tree.rb_node;while(node){
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:22
wilc_set_mac_address() calls IO routines which don't guarantee
the pointer won't be written to. Make a copy.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
CC: ajay.kathat@microchip.com
CC: claudiu.beznea@microchip.com
CC: kvalo@codeaurora.org
---
drivers/net/wireless/microchip/wilc1000/netdev.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:22
There are no module callers in-tree and it's hard to justify
why anyone would init or flush addresses of a netdev (note
the flush is more of a destructor, it frees netdev->dev_addr).
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
net/core/dev_addr_lists.c | 2 --
1 file changed, 2 deletions(-)
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:22
netdev->dev_addr should only be modified via helpers,
but someone may be casting off the const. Add a runtime
check to catch abuses.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
include/linux/netdevice.h | 3 +++
net/core/dev.c | 1 +
net/core/dev_addr_lists.c | 19 +++++++++++++++++++
3 files changed, 23 insertions(+)
@@ -1377,6 +1377,7 @@ static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)intret;ASSERT_RTNL();+dev_addr_check(dev);if(!netif_device_present(dev)){/* may be detached because parent is runtime-suspended */
@@ -498,6 +498,21 @@ EXPORT_SYMBOL(__hw_addr_init);*Deviceaddresseshandlingfunctions*/+/* Check that netdev->dev_addr is not written to directly as this would+*breaktherbtreelayout.Allchangesshouldgothrudev_addr_set()andco.+*Removethischeckinmid-2024.+*/+voiddev_addr_check(structnet_device*dev)+{+if(!memcmp(dev->dev_addr,dev->dev_addr_shadow,MAX_ADDR_LEN))+return;++netdev_warn(dev,"Current addr: %*ph\n",MAX_ADDR_LEN,dev->dev_addr);+netdev_warn(dev,"Expected addr: %*ph\n",+MAX_ADDR_LEN,dev->dev_addr_shadow);+netdev_WARN(dev,"Incorrect netdev->dev_addr\n");+}+/***dev_addr_flush-Flushdeviceaddresslist*@dev:device
@@ -509,6 +524,7 @@ EXPORT_SYMBOL(__hw_addr_init);voiddev_addr_flush(structnet_device*dev){/* rtnl_mutex must be held here */+dev_addr_check(dev);__hw_addr_flush(&dev->dev_addrs);dev->dev_addr=NULL;
@@ -455,4 +455,9 @@ config ETHTOOL_NETLINKnetlink.Itprovidesbetterextensibilityandsomenewfeatures,e.g.notificationmessages.+configNETDEV_ADDR_LIST_TEST+tristate"Unit tests for device address list"+defaultKUNIT_ALL_TESTS+depends onKUNIT+endif# if NET
@@ -0,0 +1,234 @@+#include<kunit/test.h>+#include<linux/etherdevice.h>+#include<linux/netdevice.h>+#include<linux/rtnetlink.h>++staticconststructnet_device_opsdummy_netdev_ops={+};++structdev_addr_test_priv{+u32addr_seen;+};++staticintdev_addr_test_sync(structnet_device*netdev,constunsignedchar*a)+{+structdev_addr_test_priv*datp=netdev_priv(netdev);++if(a[0]<31&&!memchr_inv(a,a[0],ETH_ALEN))+datp->addr_seen|=1<<a[0];+return0;+}++staticintdev_addr_test_unsync(structnet_device*netdev,+constunsignedchar*a)+{+structdev_addr_test_priv*datp=netdev_priv(netdev);++if(a[0]<31&&!memchr_inv(a,a[0],ETH_ALEN))+datp->addr_seen&=~(1<<a[0]);+return0;+}++staticintdev_addr_test_init(structkunit*test)+{+structdev_addr_test_priv*datp;+structnet_device*netdev;+interr;++netdev=alloc_etherdev(sizeof(*datp));+KUNIT_ASSERT_TRUE(test,netdev!=NULL);++test->priv=netdev;+netdev->netdev_ops=&dummy_netdev_ops;++err=register_netdev(netdev);+if(err){+free_netdev(netdev);+KUNIT_FAIL(test,"Can't register netdev %d",err);+}++rtnl_lock();+return0;+}++staticvoiddev_addr_test_exit(structkunit*test)+{+structnet_device*netdev=test->priv;++rtnl_unlock();+unregister_netdev(netdev);+free_netdev(netdev);+}++staticvoiddev_addr_test_basic(structkunit*test)+{+structnet_device*netdev=test->priv;+u8addr[ETH_ALEN];++KUNIT_EXPECT_TRUE(test,netdev->dev_addr!=NULL);++memset(addr,2,sizeof(addr));+eth_hw_addr_set(netdev,addr);+KUNIT_EXPECT_EQ(test,0,memcmp(netdev->dev_addr,addr,sizeof(addr)));++memset(addr,3,sizeof(addr));+dev_addr_set(netdev,addr);+KUNIT_EXPECT_EQ(test,0,memcmp(netdev->dev_addr,addr,sizeof(addr)));+}++staticvoiddev_addr_test_sync_one(structkunit*test)+{+structnet_device*netdev=test->priv;+structdev_addr_test_priv*datp;+u8addr[ETH_ALEN];++datp=netdev_priv(netdev);++memset(addr,1,sizeof(addr));+eth_hw_addr_set(netdev,addr);++__hw_addr_sync_dev(&netdev->dev_addrs,netdev,dev_addr_test_sync,+dev_addr_test_unsync);+KUNIT_EXPECT_EQ(test,2,datp->addr_seen);++memset(addr,2,sizeof(addr));+eth_hw_addr_set(netdev,addr);++datp->addr_seen=0;+__hw_addr_sync_dev(&netdev->dev_addrs,netdev,dev_addr_test_sync,+dev_addr_test_unsync);+/* It's not going to sync anything because the main address is+*consideredsyncedandweoverwriteinplace.+*/+KUNIT_EXPECT_EQ(test,0,datp->addr_seen);+}++staticvoiddev_addr_test_add_del(structkunit*test)+{+structnet_device*netdev=test->priv;+structdev_addr_test_priv*datp;+u8addr[ETH_ALEN];+inti;++datp=netdev_priv(netdev);++for(i=1;i<4;i++){+memset(addr,i,sizeof(addr));+KUNIT_EXPECT_EQ(test,0,dev_addr_add(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+}+/* Add 3 again */+KUNIT_EXPECT_EQ(test,0,dev_addr_add(netdev,addr,+NETDEV_HW_ADDR_T_LAN));++__hw_addr_sync_dev(&netdev->dev_addrs,netdev,dev_addr_test_sync,+dev_addr_test_unsync);+KUNIT_EXPECT_EQ(test,0xf,datp->addr_seen);++KUNIT_EXPECT_EQ(test,0,dev_addr_del(netdev,addr,+NETDEV_HW_ADDR_T_LAN));++__hw_addr_sync_dev(&netdev->dev_addrs,netdev,dev_addr_test_sync,+dev_addr_test_unsync);+KUNIT_EXPECT_EQ(test,0xf,datp->addr_seen);++for(i=1;i<4;i++){+memset(addr,i,sizeof(addr));+KUNIT_EXPECT_EQ(test,0,dev_addr_del(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+}++__hw_addr_sync_dev(&netdev->dev_addrs,netdev,dev_addr_test_sync,+dev_addr_test_unsync);+KUNIT_EXPECT_EQ(test,1,datp->addr_seen);+}++staticvoiddev_addr_test_del_main(structkunit*test)+{+structnet_device*netdev=test->priv;+u8addr[ETH_ALEN];++memset(addr,1,sizeof(addr));+eth_hw_addr_set(netdev,addr);++KUNIT_EXPECT_EQ(test,-ENOENT,dev_addr_del(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+KUNIT_EXPECT_EQ(test,0,dev_addr_add(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+KUNIT_EXPECT_EQ(test,0,dev_addr_del(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+KUNIT_EXPECT_EQ(test,-ENOENT,dev_addr_del(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+}++staticvoiddev_addr_test_add_set(structkunit*test)+{+structnet_device*netdev=test->priv;+structdev_addr_test_priv*datp;+u8addr[ETH_ALEN];+inti;++datp=netdev_priv(netdev);++/* There is no external API like dev_addr_add_excl(),+*soshufflethetreealittlebitandexploitaliasing.+*/+for(i=1;i<16;i++){+memset(addr,i,sizeof(addr));+KUNIT_EXPECT_EQ(test,0,dev_addr_add(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+}++memset(addr,i,sizeof(addr));+eth_hw_addr_set(netdev,addr);+KUNIT_EXPECT_EQ(test,0,dev_addr_add(netdev,addr,+NETDEV_HW_ADDR_T_LAN));+memset(addr,0,sizeof(addr));+eth_hw_addr_set(netdev,addr);++__hw_addr_sync_dev(&netdev->dev_addrs,netdev,dev_addr_test_sync,+dev_addr_test_unsync);+KUNIT_EXPECT_EQ(test,0xffff,datp->addr_seen);+}++staticvoiddev_addr_test_add_excl(structkunit*test)+{+structnet_device*netdev=test->priv;+u8addr[ETH_ALEN];+inti;++for(i=0;i<10;i++){+memset(addr,i,sizeof(addr));+KUNIT_EXPECT_EQ(test,0,dev_uc_add_excl(netdev,addr));+}+KUNIT_EXPECT_EQ(test,-EEXIST,dev_uc_add_excl(netdev,addr));++for(i=0;i<10;i+=2){+memset(addr,i,sizeof(addr));+KUNIT_EXPECT_EQ(test,0,dev_uc_del(netdev,addr));+}+for(i=1;i<10;i+=2){+memset(addr,i,sizeof(addr));+KUNIT_EXPECT_EQ(test,-EEXIST,dev_uc_add_excl(netdev,addr));+}+}++staticstructkunit_casedev_addr_test_cases[]={+KUNIT_CASE(dev_addr_test_basic),+KUNIT_CASE(dev_addr_test_sync_one),+KUNIT_CASE(dev_addr_test_add_del),+KUNIT_CASE(dev_addr_test_del_main),+KUNIT_CASE(dev_addr_test_add_set),+KUNIT_CASE(dev_addr_test_add_excl),+{}+};++staticstructkunit_suitedev_addr_test_suite={+.name="dev-addr-list-test",+.test_cases=dev_addr_test_cases,+.init=dev_addr_test_init,+.exit=dev_addr_test_exit,+};+kunit_test_suite(dev_addr_test_suite);++MODULE_LICENSE("GPL");
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-11-18 04:15:23
Commit 406f42fa0d3c ("net-next: When a bond have a massive amount
of VLANs...") introduced a rbtree for faster Ethernet address look
up. We converted all users to make modifications via appropriate
helpers, make netdev->dev_addr const.
The update helpers need to upcast from the buffer to
struct netdev_hw_addr.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
include/linux/netdevice.h | 14 +++++---------
net/core/dev_addr_lists.c | 10 ++++++++++
2 files changed, 15 insertions(+), 9 deletions(-)
@@ -2117,7 +2117,7 @@ struct net_device {*Cachelinesmostlyusedonreceivepath(includingeth_type_trans())*//* Interface address info used in eth_type_trans() */-unsignedchar*dev_addr;+constunsignedchar*dev_addr;structnetdev_rx_queue*_rx;unsignedintnum_rx_queues;
@@ -4268,10 +4268,13 @@ void __hw_addr_unsync_dev(struct netdev_hw_addr_list *list,void__hw_addr_init(structnetdev_hw_addr_list*list);/* Functions used for device addresses handling */+voiddev_addr_mod(structnet_device*dev,unsignedintoffset,+constvoid*addr,size_tlen);+staticinlinevoid__dev_addr_set(structnet_device*dev,constvoid*addr,size_tlen){-memcpy(dev->dev_addr,addr,len);+dev_addr_mod(dev,0,addr,len);}staticinlinevoiddev_addr_set(structnet_device*dev,constu8*addr)
From: Kalle Valo <hidden> Date: 2021-11-18 05:35:51
Jakub Kicinski [off-list ref] writes:
wilc_set_mac_address() calls IO routines which don't guarantee
the pointer won't be written to. Make a copy.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
From: Kalle Valo <hidden> Date: 2021-11-18 05:36:24
Jakub Kicinski [off-list ref] writes:
Add const to the address param of ipw_send_adapter_address()
all the functions down the chain have already been changed.
Not sure how I lost this in the rebase.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/8390/mac8390.c:317:31: warning: passing argument 1 of 'nubus_get_rsrc_mem' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
317 | nubus_get_rsrc_mem(dev->dev_addr, &ent, 6);
| ~~~^~~~~~~~~~
In file included from drivers/net/ethernet/8390/mac8390.c:29:
include/linux/nubus.h:156:31: note: expected 'void *' but argument is of type 'const unsigned char *'
156 | void nubus_get_rsrc_mem(void *dest, const struct nubus_dirent *dirent,
| ~~~~~~^~~~
--
drivers/net/ethernet/amd/atarilance.c:370:28: warning: no previous prototype for 'atarilance_probe' [-Wmissing-prototypes]
370 | struct net_device * __init atarilance_probe(void)
| ^~~~~~~~~~~~~~~~
drivers/net/ethernet/amd/atarilance.c: In function 'lance_probe1':
quoted
drivers/net/ethernet/amd/atarilance.c:588:33: warning: passing argument 1 of 'lp->memcpy_f' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
588 | lp->memcpy_f(dev->dev_addr, RIEBL_HWADDR_ADDR, ETH_ALEN);
| ~~~^~~~~~~~~~
drivers/net/ethernet/amd/atarilance.c:588:33: note: expected 'void *' but argument is of type 'const unsigned char *'
drivers/net/ethernet/amd/atarilance.c:593:42: error: assignment of read-only location '*(dev->dev_addr + (sizetype)i)'
593 | dev->dev_addr[i] =
| ^
--
drivers/net/ethernet/apple/macmace.c: In function 'mace_probe':
drivers/net/ethernet/apple/macmace.c:232:34: error: assignment of read-only location '*(dev->dev_addr + (sizetype)j)'
232 | dev->dev_addr[j] = v;
| ^
drivers/net/ethernet/apple/macmace.c: In function 'mace_reset':
quoted
drivers/net/ethernet/apple/macmace.c:294:36: warning: passing argument 2 of '__mace_set_address' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
294 | __mace_set_address(dev, dev->dev_addr);
| ~~~^~~~~~~~~~
drivers/net/ethernet/apple/macmace.c:95:62: note: expected 'void *' but argument is of type 'const unsigned char *'
95 | static void __mace_set_address(struct net_device *dev, void *addr);
| ~~~~~~^~~~
drivers/net/ethernet/apple/macmace.c: In function '__mace_set_address':
drivers/net/ethernet/apple/macmace.c:334:45: error: assignment of read-only location '*(dev->dev_addr + (sizetype)i)'
334 | mb->padr = dev->dev_addr[i] = p[i];
| ^
--
drivers/net/ethernet/natsemi/macsonic.c: In function 'mac_onboard_sonic_ethernet_addr':
drivers/net/ethernet/natsemi/macsonic.c:216:42: error: assignment of read-only location '*(dev->dev_addr + (sizetype)i)'
216 | dev->dev_addr[i] = SONIC_READ_PROM(i);
| ^
quoted
drivers/net/ethernet/natsemi/macsonic.c:225:37: warning: passing argument 1 of 'bit_reverse_addr' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
225 | bit_reverse_addr(dev->dev_addr);
| ~~~^~~~~~~~~~
drivers/net/ethernet/natsemi/macsonic.c:109:51: note: expected 'unsigned char *' but argument is of type 'const unsigned char *'
109 | static inline void bit_reverse_addr(unsigned char addr[6])
| ~~~~~~~~~~~~~~^~~~~~~
drivers/net/ethernet/natsemi/macsonic.c:246:26: error: assignment of read-only location '*(dev->dev_addr + 5)'
246 | dev->dev_addr[5] = val >> 8;
| ^
drivers/net/ethernet/natsemi/macsonic.c:247:26: error: assignment of read-only location '*(dev->dev_addr + 4)'
247 | dev->dev_addr[4] = val & 0xff;
| ^
drivers/net/ethernet/natsemi/macsonic.c:249:26: error: assignment of read-only location '*(dev->dev_addr + 3)'
249 | dev->dev_addr[3] = val >> 8;
| ^
drivers/net/ethernet/natsemi/macsonic.c:250:26: error: assignment of read-only location '*(dev->dev_addr + 2)'
250 | dev->dev_addr[2] = val & 0xff;
| ^
drivers/net/ethernet/natsemi/macsonic.c:252:26: error: assignment of read-only location '*(dev->dev_addr + 1)'
252 | dev->dev_addr[1] = val >> 8;
| ^
drivers/net/ethernet/natsemi/macsonic.c:253:26: error: assignment of read-only location '*dev->dev_addr'
253 | dev->dev_addr[0] = val & 0xff;
| ^
drivers/net/ethernet/natsemi/macsonic.c: In function 'mac_sonic_nubus_ethernet_addr':
drivers/net/ethernet/natsemi/macsonic.c:360:34: error: assignment of read-only location '*(dev->dev_addr + (sizetype)i)'
360 | dev->dev_addr[i] = SONIC_READ_PROM(i);
| ^
drivers/net/ethernet/natsemi/macsonic.c:364:37: warning: passing argument 1 of 'bit_reverse_addr' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
364 | bit_reverse_addr(dev->dev_addr);
| ~~~^~~~~~~~~~
drivers/net/ethernet/natsemi/macsonic.c:109:51: note: expected 'unsigned char *' but argument is of type 'const unsigned char *'
109 | static inline void bit_reverse_addr(unsigned char addr[6])
| ~~~~~~~~~~~~~~^~~~~~~
vim +317 drivers/net/ethernet/8390/mac8390.c
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 285
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 286 static bool mac8390_rsrc_init(struct net_device *dev,
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 287 struct nubus_rsrc *fres,
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 288 enum mac8390_type cardtype)
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 289 {
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 290 struct nubus_board *board = fres->board;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 291 struct nubus_dir dir;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 292 struct nubus_dirent ent;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 293 int offset;
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 294 volatile unsigned short *i;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 295
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 296 dev->irq = SLOT2IRQ(board->slot);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 297 /* This is getting to be a habit */
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 298 dev->base_addr = board->slot_addr | ((board->slot & 0xf) << 20);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 299
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 300 /*
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 301 * Get some Nubus info - we will trust the card's idea
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 302 * of where its memory and registers are.
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 303 */
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 304
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 305 if (nubus_get_func_dir(fres, &dir) == -1) {
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 306 dev_err(&board->dev,
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 307 "Unable to get Nubus functional directory\n");
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 308 return false;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 309 }
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 310
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 311 /* Get the MAC address */
8e4d9696b45d96 drivers/net/mac8390.c Joe Perches 2010-01-04 312 if (nubus_find_rsrc(&dir, NUBUS_RESID_MAC_ADDRESS, &ent) == -1) {
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 313 dev_info(&board->dev, "MAC address resource not found\n");
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 314 return false;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 315 }
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 316
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 @317 nubus_get_rsrc_mem(dev->dev_addr, &ent, 6);
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 318
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 319 if (useresources[cardtype] == 1) {
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 320 nubus_rewinddir(&dir);
8e4d9696b45d96 drivers/net/mac8390.c Joe Perches 2010-01-04 321 if (nubus_find_rsrc(&dir, NUBUS_RESID_MINOR_BASEOS,
8e4d9696b45d96 drivers/net/mac8390.c Joe Perches 2010-01-04 322 &ent) == -1) {
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 323 dev_err(&board->dev,
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 324 "Memory offset resource not found\n");
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 325 return false;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 326 }
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 327 nubus_get_rsrc_mem(&offset, &ent, 4);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 328 dev->mem_start = dev->base_addr + offset;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 329 /* yes, this is how the Apple driver does it */
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 330 dev->base_addr = dev->mem_start + 0x10000;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 331 nubus_rewinddir(&dir);
8e4d9696b45d96 drivers/net/mac8390.c Joe Perches 2010-01-04 332 if (nubus_find_rsrc(&dir, NUBUS_RESID_MINOR_LENGTH,
8e4d9696b45d96 drivers/net/mac8390.c Joe Perches 2010-01-04 333 &ent) == -1) {
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 334 dev_info(&board->dev,
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 335 "Memory length resource not found, probing\n");
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 336 offset = mac8390_memsize(dev->mem_start);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 337 } else {
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 338 nubus_get_rsrc_mem(&offset, &ent, 4);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 339 }
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 340 dev->mem_end = dev->mem_start + offset;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 341 } else {
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 342 switch (cardtype) {
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 343 case MAC8390_KINETICS:
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 344 case MAC8390_DAYNA: /* it's the same */
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 345 dev->base_addr = (int)(board->slot_addr +
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 346 DAYNA_8390_BASE);
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 347 dev->mem_start = (int)(board->slot_addr +
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 348 DAYNA_8390_MEM);
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 349 dev->mem_end = dev->mem_start +
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 350 mac8390_memsize(dev->mem_start);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 351 break;
2964db0f590437 drivers/net/mac8390.c Finn Thain 2007-05-01 352 case MAC8390_INTERLAN:
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 353 dev->base_addr = (int)(board->slot_addr +
2964db0f590437 drivers/net/mac8390.c Finn Thain 2007-05-01 354 INTERLAN_8390_BASE);
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 355 dev->mem_start = (int)(board->slot_addr +
2964db0f590437 drivers/net/mac8390.c Finn Thain 2007-05-01 356 INTERLAN_8390_MEM);
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 357 dev->mem_end = dev->mem_start +
2964db0f590437 drivers/net/mac8390.c Finn Thain 2007-05-01 358 mac8390_memsize(dev->mem_start);
2964db0f590437 drivers/net/mac8390.c Finn Thain 2007-05-01 359 break;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 360 case MAC8390_CABLETRON:
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 361 dev->base_addr = (int)(board->slot_addr +
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 362 CABLETRON_8390_BASE);
494a973e229542 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 363 dev->mem_start = (int)(board->slot_addr +
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 364 CABLETRON_8390_MEM);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 365 /* The base address is unreadable if 0x00
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 366 * has been written to the command register
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 367 * Reset the chip by writing E8390_NODMA +
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 368 * E8390_PAGE0 + E8390_STOP just to be
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 369 * sure
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 370 */
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 371 i = (void *)dev->base_addr;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 372 *i = 0x21;
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 373 dev->mem_end = dev->mem_start +
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 374 mac8390_memsize(dev->mem_start);
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 375 break;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 376
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 377 default:
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 378 dev_err(&board->dev,
4a1b27c9e32c39 drivers/net/ethernet/8390/mac8390.c Finn Thain 2018-02-18 379 "No known base address for card type\n");
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 380 return false;
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 381 }
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 382 }
^1da177e4c3f41 drivers/net/mac8390.c Linus Torvalds 2005-04-16 383
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 384 return true;
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 385 }
f6de7acc42de90 drivers/net/mac8390.c Joe Perches 2010-01-04 386
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
It was <2021-11-17 śro 20:14>, when Jakub Kicinski wrote:
The future is here, convert the new driver as we are about
to make netdev->dev_addr const.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
CC: l.stelmach@samsung.com
---
drivers/net/ethernet/asix/ax88796c_main.c | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
@@ -144,12 +144,13 @@ static void ax88796c_set_mac_addr(struct net_device *ndev)staticvoidax88796c_load_mac_addr(structnet_device*ndev){structax88796c_device*ax_local=to_ax88796c_device(ndev);+u8addr[ETH_ALEN];u16temp;lockdep_assert_held(&ax_local->spi_lock);/* Try the device tree first */-if(!eth_platform_get_mac_address(&ax_local->spi->dev,ndev->dev_addr)&&+if(!platform_get_ethdev_address(&ax_local->spi->dev,ndev)&&is_valid_ether_addr(ndev->dev_addr)){if(netif_msg_probe(ax_local))dev_info(&ax_local->spi->dev,
@@ -159,18 +160,19 @@ static void ax88796c_load_mac_addr(struct net_device *ndev)/* Read the MAC address from AX88796C */temp=AX_READ(&ax_local->ax_spi,P3_MACASR0);-ndev->dev_addr[5]=(u8)temp;-ndev->dev_addr[4]=(u8)(temp>>8);+addr[5]=(u8)temp;+addr[4]=(u8)(temp>>8);temp=AX_READ(&ax_local->ax_spi,P3_MACASR1);-ndev->dev_addr[3]=(u8)temp;-ndev->dev_addr[2]=(u8)(temp>>8);+addr[3]=(u8)temp;+addr[2]=(u8)(temp>>8);temp=AX_READ(&ax_local->ax_spi,P3_MACASR2);-ndev->dev_addr[1]=(u8)temp;-ndev->dev_addr[0]=(u8)(temp>>8);+addr[1]=(u8)temp;+addr[0]=(u8)(temp>>8);-if(is_valid_ether_addr(ndev->dev_addr)){+if(is_valid_ether_addr(addr)){+eth_hw_addr_set(ndev,addr);if(netif_msg_probe(ax_local))dev_info(&ax_local->spi->dev,"MAC address read from ASIX chip\n");
--
Łukasz Stelmach
Samsung R&D Institute Poland
Samsung Electronics
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c:2820:55: sparse: expected unsigned char [usertype] *addr
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c:2820:55: sparse: got unsigned char const *dev_addr
--
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c:121:25: sparse: sparse: symbol 'bnx2x_iov_wq' was not declared. Should it be static?