mdio_register.cocci 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /// Use mdio_alloc and mdio_register instead of miiphy_register
  2. ///
  3. //# Stop using the oldest mii interface in drivers
  4. //
  5. // Confidence: High
  6. // Copyright: (C) 2016 Joe Hershberger. GPLv2.
  7. // Comments:
  8. // Options: --include-headers --recursive-includes --local-includes -I include
  9. @ mii_reg @
  10. expression devname;
  11. identifier readfunc, writefunc;
  12. @@
  13. + int retval;
  14. - miiphy_register(devname, readfunc, writefunc);
  15. + struct mii_dev *mdiodev = mdio_alloc();
  16. + if (!mdiodev) return -ENOMEM;
  17. + strncpy(mdiodev->name, devname, MDIO_NAME_LEN);
  18. + mdiodev->read = readfunc;
  19. + mdiodev->write = writefunc;
  20. +
  21. + retval = mdio_register(mdiodev);
  22. + if (retval < 0) return retval;
  23. @ update_read_sig @
  24. identifier mii_reg.readfunc;
  25. identifier name0, addr0, reg0, output;
  26. type addrT, outputT;
  27. @@
  28. - readfunc (
  29. - const char *name0,
  30. - addrT addr0,
  31. - addrT reg0,
  32. - outputT *output
  33. - )
  34. + readfunc (
  35. + struct mii_dev *bus,
  36. + int addr0,
  37. + int devad,
  38. + int reg0
  39. + )
  40. {
  41. ...
  42. }
  43. @ update_read_impl @
  44. identifier mii_reg.readfunc;
  45. identifier update_read_sig.output;
  46. type update_read_sig.outputT;
  47. constant c;
  48. identifier retvar;
  49. expression E;
  50. @@
  51. readfunc (...)
  52. {
  53. + outputT output = 0;
  54. ...
  55. (
  56. - return 0;
  57. + return *output;
  58. |
  59. return c;
  60. |
  61. - return retvar;
  62. + if (retvar < 0)
  63. + return retvar;
  64. + return *output;
  65. |
  66. - return E;
  67. + int retval = E;
  68. + if (retval < 0)
  69. + return retval;
  70. + return *output;
  71. )
  72. }
  73. @ update_read_impl2 @
  74. identifier mii_reg.readfunc;
  75. identifier update_read_sig.output;
  76. @@
  77. readfunc (...)
  78. {
  79. <...
  80. (
  81. - *output
  82. + output
  83. |
  84. - output
  85. + &output
  86. )
  87. ...>
  88. }
  89. @ update_read_name @
  90. identifier mii_reg.readfunc;
  91. identifier update_read_sig.name0;
  92. @@
  93. readfunc (...) {
  94. <...
  95. - name0
  96. + bus->name
  97. ...>
  98. }
  99. @ update_write_sig @
  100. identifier mii_reg.writefunc;
  101. identifier name0, addr0, reg0, value0;
  102. type addrT, valueT;
  103. typedef u16;
  104. @@
  105. - writefunc (
  106. - const char *name0,
  107. - addrT addr0,
  108. - addrT reg0,
  109. - valueT value0
  110. - )
  111. + writefunc (
  112. + struct mii_dev *bus,
  113. + int addr0,
  114. + int devad,
  115. + int reg0,
  116. + u16 value0
  117. + )
  118. {
  119. ...
  120. }
  121. @ update_write_name @
  122. identifier mii_reg.writefunc;
  123. identifier update_write_sig.name0;
  124. @@
  125. writefunc (...) {
  126. <...
  127. - name0
  128. + bus->name
  129. ...>
  130. }