cocci.inria.fr archive mirror
 help / color / mirror / Atom feed
* [Cocci] changing of_get_mac_address() to pass a buffer
@ 2021-04-01  8:13 Michael Walle
  2021-04-01 17:06 ` Markus Elfring
  2021-04-04 17:48 ` Mansour Moufid
  0 siblings, 2 replies; 6+ messages in thread
From: Michael Walle @ 2021-04-01  8:13 UTC (permalink / raw)
  To: cocci

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-04-05 21:58 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-01  8:13 [Cocci] changing of_get_mac_address() to pass a buffer Michael Walle
2021-04-01 17:06 ` Markus Elfring
2021-04-04 17:48 ` Mansour Moufid
2021-04-04 18:34   ` Julia Lawall
2021-04-05 21:50   ` Michael Walle
2021-04-05 21:58     ` Julia Lawall

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).