Hi, so first I need to say I've never used coccinelle before, so please bear with me ;)
To make of_get_mac_address() work with DSA ports (and a nvmem provider) I'd need to change the semantics of of_get_mac_address(). Right now it returns a pointer to "const char *", I'd need to change that so a buffer will be passed as a parameter in which the MAC address gets stored. (1) Usually the call is something like: const char *mac; mac = of_get_mac_address(np); if (!IS_ERR(mac)) ether_addr_copy(ndev->dev_addr, mac); This would need to be changed to: of_get_mac_address(np, ndev->dev_addr); (2) Unfortunately, there are also other variants of this like. Eg. const char *mac; mac = of_get_mac_address(np); if (IS_ERR(mac)) eth_hw_addr_random(ndev); else ether_addr_copy(ndev->dev_addr, mac); This would need to be changed to: ret = of_get_mac_address(np, ndev->dev_addr); if (ret) eth_hw_addr_random(ndev); (3) Of course there are more variants like "if .. else if .. else" and so on. This is what I've come up for now: <spml> virtual patch @depends on patch@ type T; identifier mac; expression node, dev_addr; statement S; statement list SL; @@ - T mac; <+... - mac = of_get_mac_address(node); ( + of_get_mac_address(node, dev_addr); - if (!IS_ERR(mac)) - ether_addr_copy(dev_addr, mac); | + ret_tbd = of_get_mac_address(node, dev_addr); + if (!ret_tdb) { - if (!IS_ERR(mac)) { ... when != mac - ether_addr_copy(dev_addr, mac); ... when != mac } | + ret_tbd = of_get_mac_address(node, dev_addr); + if (!ret_tdb) { - if (!IS_ERR(mac)) { ... when != mac - ether_addr_copy(dev_addr, mac); ... when != mac } else { ... when != mac } | - if (IS_ERR(mac)) - S - else - ether_addr_copy(dev_addr, mac); + ret_tbd = of_get_mac_address(node, dev_addr); + if (ret_tbd) S | - if (IS_ERR(mac)) { - SL - } else { - ether_addr_copy(dev_addr, mac); - } + ret_tbd = of_get_mac_address(node, dev_addr); + if (ret_tbd) { SL } ) ...+> @depends on patch@ type T; identifier mac; expression node, dev_addr; statement S; @@ - T mac = of_get_mac_address(node); + of_get_mac_address(node, dev_addr); - if (!IS_ERR(mac)) - ether_addr_copy(dev_addr, mac); ... when != mac </spml> Maybe someone could have a brief look at it. Maybe (well I'm sure) there is something to improve here. There is some repeated code here, esp. for the different "if" and "if else" branches. Is there a better way to tell coccinelle, that the else might be optional? And I guess, I need to go over the (maybe) new ret_tbd manually. Of course, this won't match all occurrences, I'll go over the remaining ones manually. Thanks, -michael _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci