| /// Use mdio_alloc and mdio_register instead of miiphy_register | 
| /// | 
| //# Stop using the oldest mii interface in drivers | 
| // | 
| // Confidence: High | 
| // Copyright: (C) 2016 Joe Hershberger.  GPLv2. | 
| // Comments: | 
| // Options: --include-headers --recursive-includes --local-includes -I include | 
|   | 
| @ mii_reg @ | 
| expression devname; | 
| identifier readfunc, writefunc; | 
| @@ | 
|   | 
| + int retval; | 
| - miiphy_register(devname, readfunc, writefunc); | 
| + struct mii_dev *mdiodev = mdio_alloc(); | 
| + if (!mdiodev) return -ENOMEM; | 
| + strncpy(mdiodev->name, devname, MDIO_NAME_LEN); | 
| + mdiodev->read = readfunc; | 
| + mdiodev->write = writefunc; | 
| +  | 
| + retval = mdio_register(mdiodev); | 
| + if (retval < 0) return retval; | 
|   | 
| @ update_read_sig @ | 
| identifier mii_reg.readfunc; | 
| identifier name0, addr0, reg0, output; | 
| type addrT, outputT; | 
| @@ | 
|   | 
| - readfunc ( | 
| -     const char *name0, | 
| -     addrT addr0, | 
| -     addrT reg0, | 
| -     outputT *output | 
| - ) | 
| + readfunc ( | 
| +     struct mii_dev *bus, | 
| +     int addr0, | 
| +     int devad, | 
| +     int reg0 | 
| + ) | 
|   { | 
|   ... | 
|   } | 
|   | 
| @ update_read_impl @ | 
| identifier mii_reg.readfunc; | 
| identifier update_read_sig.output; | 
| type update_read_sig.outputT; | 
| constant c; | 
| identifier retvar; | 
| expression E; | 
| @@ | 
|   | 
|   readfunc (...) | 
|   { | 
| + outputT output = 0; | 
|   ... | 
| ( | 
| - return 0; | 
| + return *output; | 
| | | 
|   return c; | 
| | | 
| - return retvar; | 
| + if (retvar < 0) | 
| +     return retvar; | 
| + return *output; | 
| | | 
| - return E; | 
| + int retval = E; | 
| + if (retval < 0) | 
| +     return retval; | 
| + return *output; | 
| ) | 
|   } | 
|   | 
| @ update_read_impl2 @ | 
| identifier mii_reg.readfunc; | 
| identifier update_read_sig.output; | 
| @@ | 
|   | 
|   readfunc (...) | 
|   { | 
|   <... | 
| ( | 
| - *output | 
| + output | 
| | | 
| - output | 
| + &output | 
| ) | 
|   ...> | 
|   } | 
|   | 
| @ update_read_name @ | 
| identifier mii_reg.readfunc; | 
| identifier update_read_sig.name0; | 
| @@ | 
|   readfunc (...) { | 
|   <... | 
| - name0 | 
| + bus->name | 
|   ...> | 
|   } | 
|   | 
| @ update_write_sig @ | 
| identifier mii_reg.writefunc; | 
| identifier name0, addr0, reg0, value0; | 
| type addrT, valueT; | 
| typedef u16; | 
| @@ | 
|   | 
| - writefunc ( | 
| -     const char *name0, | 
| -     addrT addr0, | 
| -     addrT reg0, | 
| -     valueT value0 | 
| - ) | 
| + writefunc ( | 
| +     struct mii_dev *bus, | 
| +     int addr0, | 
| +     int devad, | 
| +     int reg0, | 
| +     u16 value0 | 
| + ) | 
|   { | 
|   ... | 
|   } | 
|   | 
| @ update_write_name @ | 
| identifier mii_reg.writefunc; | 
| identifier update_write_sig.name0; | 
| @@ | 
|   writefunc (...) { | 
|   <... | 
| - name0 | 
| + bus->name | 
|   ...> | 
|   } |