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
10@ mii_reg @
11expression devname;
12identifier readfunc, writefunc;
13@@
14
15+ int retval;
16- miiphy_register(devname, readfunc, writefunc);
17+ struct mii_dev *mdiodev = mdio_alloc();
18+ if (!mdiodev) return -ENOMEM;
19+ strncpy(mdiodev->name, devname, MDIO_NAME_LEN);
20+ mdiodev->read = readfunc;
21+ mdiodev->write = writefunc;
22+
23+ retval = mdio_register(mdiodev);
24+ if (retval < 0) return retval;
25
26@ update_read_sig @
27identifier mii_reg.readfunc;
28identifier name0, addr0, reg0, output;
29type addrT, outputT;
30@@
31
32- readfunc (
33- 	const char *name0,
34- 	addrT addr0,
35- 	addrT reg0,
36- 	outputT *output
37- )
38+ readfunc (
39+ 	struct mii_dev *bus,
40+ 	int addr0,
41+ 	int devad,
42+ 	int reg0
43+ )
44  {
45  ...
46  }
47
48@ update_read_impl @
49identifier mii_reg.readfunc;
50identifier update_read_sig.output;
51type update_read_sig.outputT;
52constant c;
53identifier retvar;
54expression E;
55@@
56
57  readfunc (...)
58  {
59+ outputT output = 0;
60  ...
61(
62- return 0;
63+ return *output;
64|
65  return c;
66|
67- return retvar;
68+ if (retvar < 0)
69+ 	return retvar;
70+ return *output;
71|
72- return E;
73+ int retval = E;
74+ if (retval < 0)
75+ 	return retval;
76+ return *output;
77)
78  }
79
80@ update_read_impl2 @
81identifier mii_reg.readfunc;
82identifier update_read_sig.output;
83@@
84
85  readfunc (...)
86  {
87  <...
88(
89- *output
90+ output
91|
92- output
93+ &output
94)
95  ...>
96  }
97
98@ update_read_name @
99identifier mii_reg.readfunc;
100identifier update_read_sig.name0;
101@@
102  readfunc (...) {
103  <...
104- name0
105+ bus->name
106  ...>
107  }
108
109@ update_write_sig @
110identifier mii_reg.writefunc;
111identifier name0, addr0, reg0, value0;
112type addrT, valueT;
113typedef u16;
114@@
115
116- writefunc (
117- 	const char *name0,
118- 	addrT addr0,
119- 	addrT reg0,
120- 	valueT value0
121- )
122+ writefunc (
123+ 	struct mii_dev *bus,
124+ 	int addr0,
125+ 	int devad,
126+ 	int reg0,
127+ 	u16 value0
128+ )
129  {
130  ...
131  }
132
133@ update_write_name @
134identifier mii_reg.writefunc;
135identifier update_write_sig.name0;
136@@
137  writefunc (...) {
138  <...
139- name0
140+ bus->name
141  ...>
142  }
143