1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2015 Realtek Semiconductor Corp. All rights reserved.
4 *
5 */
6 #include <common.h>
7 #include <dm.h>
8 #include <errno.h>
9 #include "usb_ether.h"
10 #include "r8152.h"
11
12 static u8 r8152b_pla_patch_a[] = {
13 0x08, 0xe0, 0x40, 0xe0, 0x78, 0xe0, 0x85, 0xe0,
14 0x5d, 0xe1, 0xa1, 0xe1, 0xa3, 0xe1, 0xab, 0xe1,
15 0x31, 0xc3, 0x60, 0x72, 0xa0, 0x49, 0x10, 0xf0,
16 0xa4, 0x49, 0x0e, 0xf0, 0x2c, 0xc3, 0x62, 0x72,
17 0x26, 0x70, 0x80, 0x49, 0x05, 0xf0, 0x2f, 0x48,
18 0x62, 0x9a, 0x24, 0x70, 0x60, 0x98, 0x24, 0xc3,
19 0x60, 0x99, 0x23, 0xc3, 0x00, 0xbb, 0x2c, 0x75,
20 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13, 0x0a, 0xf0,
21 0x03, 0x13, 0x08, 0xf0, 0x02, 0x13, 0x06, 0xf0,
22 0x01, 0x13, 0x04, 0xf0, 0x08, 0x13, 0x02, 0xf0,
23 0x03, 0xe0, 0xd4, 0x49, 0x04, 0xf1, 0x14, 0xc2,
24 0x12, 0xc3, 0x00, 0xbb, 0x12, 0xc3, 0x60, 0x75,
25 0xd0, 0x49, 0x05, 0xf1, 0x50, 0x48, 0x60, 0x9d,
26 0x09, 0xc6, 0x00, 0xbe, 0xd0, 0x48, 0x60, 0x9d,
27 0xf3, 0xe7, 0xc2, 0xc0, 0x38, 0xd2, 0xc6, 0xd2,
28 0x84, 0x17, 0xa2, 0x13, 0x0c, 0x17, 0xbc, 0xc0,
29 0xa2, 0xd1, 0x33, 0xc5, 0xa0, 0x74, 0xc0, 0x49,
30 0x1f, 0xf0, 0x30, 0xc5, 0xa0, 0x73, 0x00, 0x13,
31 0x04, 0xf1, 0xa2, 0x73, 0x00, 0x13, 0x14, 0xf0,
32 0x28, 0xc5, 0xa0, 0x74, 0xc8, 0x49, 0x1b, 0xf1,
33 0x26, 0xc5, 0xa0, 0x76, 0xa2, 0x74, 0x01, 0x06,
34 0x20, 0x37, 0xa0, 0x9e, 0xa2, 0x9c, 0x1e, 0xc5,
35 0xa2, 0x73, 0x23, 0x40, 0x10, 0xf8, 0x04, 0xf3,
36 0xa0, 0x73, 0x33, 0x40, 0x0c, 0xf8, 0x15, 0xc5,
37 0xa0, 0x74, 0x41, 0x48, 0xa0, 0x9c, 0x14, 0xc5,
38 0xa0, 0x76, 0x62, 0x48, 0xe0, 0x48, 0xa0, 0x9e,
39 0x10, 0xc6, 0x00, 0xbe, 0x0a, 0xc5, 0xa0, 0x74,
40 0x48, 0x48, 0xa0, 0x9c, 0x0b, 0xc5, 0x20, 0x1e,
41 0xa0, 0x9e, 0xe5, 0x48, 0xa0, 0x9e, 0xf0, 0xe7,
42 0xbc, 0xc0, 0xc8, 0xd2, 0xcc, 0xd2, 0x28, 0xe4,
43 0x22, 0x02, 0xf0, 0xc0, 0x0b, 0xc0, 0x00, 0x71,
44 0x0a, 0xc0, 0x00, 0x72, 0xa0, 0x49, 0x04, 0xf0,
45 0xa4, 0x49, 0x02, 0xf0, 0x93, 0x48, 0x04, 0xc0,
46 0x00, 0xb8, 0x00, 0xe4, 0xc2, 0xc0, 0x8c, 0x09,
47 0x14, 0xc2, 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b,
48 0x11, 0xc2, 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0,
49 0xbf, 0x49, 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd,
50 0xb1, 0x49, 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b,
51 0x02, 0xc2, 0x00, 0xba, 0x82, 0x18, 0x00, 0xa0,
52 0x1e, 0xfc, 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8,
53 0x00, 0x80, 0x00, 0x60, 0x2c, 0x75, 0xd4, 0x49,
54 0x12, 0xf1, 0x29, 0xe0, 0xf8, 0xc2, 0x46, 0x71,
55 0xf7, 0xc2, 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1,
56 0xf5, 0xc7, 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30,
57 0x26, 0x62, 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72,
58 0xa0, 0x49, 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f,
59 0x97, 0x30, 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75,
60 0x32, 0xc3, 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1,
61 0xdc, 0x21, 0xbc, 0x25, 0x27, 0xc6, 0xc0, 0x77,
62 0x04, 0x13, 0x18, 0xf0, 0x03, 0x13, 0x19, 0xf0,
63 0x02, 0x13, 0x1a, 0xf0, 0x01, 0x13, 0x1b, 0xf0,
64 0xd4, 0x49, 0x03, 0xf1, 0x1c, 0xc5, 0x00, 0xbd,
65 0xcd, 0xc6, 0xc6, 0x67, 0x2e, 0x75, 0xd7, 0x22,
66 0xdd, 0x26, 0x05, 0x15, 0x1a, 0xf0, 0x14, 0xc6,
67 0x00, 0xbe, 0x13, 0xc5, 0x00, 0xbd, 0x12, 0xc5,
68 0x00, 0xbd, 0xf1, 0x49, 0xfb, 0xf1, 0xef, 0xe7,
69 0xf4, 0x49, 0xfa, 0xf1, 0xec, 0xe7, 0xf3, 0x49,
70 0xf7, 0xf1, 0xe9, 0xe7, 0xf2, 0x49, 0xf4, 0xf1,
71 0xe6, 0xe7, 0xb6, 0xc0, 0x6a, 0x14, 0xac, 0x13,
72 0xd6, 0x13, 0xfa, 0x14, 0xa0, 0xd1, 0x00, 0x00,
73 0xc0, 0x75, 0xd0, 0x49, 0x46, 0xf0, 0x26, 0x72,
74 0xa7, 0x49, 0x43, 0xf0, 0x22, 0x72, 0x25, 0x25,
75 0x20, 0x1f, 0x97, 0x30, 0x91, 0x30, 0x40, 0x73,
76 0xf3, 0xc4, 0x1c, 0x40, 0x04, 0xf0, 0xd7, 0x49,
77 0x05, 0xf1, 0x37, 0xe0, 0x53, 0x48, 0xc0, 0x9d,
78 0x08, 0x02, 0x40, 0x66, 0x64, 0x27, 0x06, 0x16,
79 0x30, 0xf1, 0x46, 0x63, 0x3b, 0x13, 0x2d, 0xf1,
80 0x34, 0x9b, 0x18, 0x1b, 0x93, 0x30, 0x2b, 0xc3,
81 0x10, 0x1c, 0x2b, 0xe8, 0x01, 0x14, 0x25, 0xf1,
82 0x00, 0x1d, 0x26, 0x1a, 0x8a, 0x30, 0x22, 0x73,
83 0xb5, 0x25, 0x0e, 0x0b, 0x00, 0x1c, 0x2c, 0xe8,
84 0x1f, 0xc7, 0x27, 0x40, 0x1a, 0xf1, 0x38, 0xe8,
85 0x32, 0x1f, 0x8f, 0x30, 0x08, 0x1b, 0x24, 0xe8,
86 0x36, 0x72, 0x46, 0x77, 0x00, 0x17, 0x0d, 0xf0,
87 0x13, 0xc3, 0x1f, 0x40, 0x03, 0xf1, 0x00, 0x1f,
88 0x46, 0x9f, 0x44, 0x77, 0x9f, 0x44, 0x5f, 0x44,
89 0x17, 0xe8, 0x0a, 0xc7, 0x27, 0x40, 0x05, 0xf1,
90 0x02, 0xc3, 0x00, 0xbb, 0x50, 0x1a, 0x06, 0x1a,
91 0xff, 0xc7, 0x00, 0xbf, 0xb8, 0xcd, 0xff, 0xff,
92 0x02, 0x0c, 0x54, 0xa5, 0xdc, 0xa5, 0x2f, 0x40,
93 0x05, 0xf1, 0x00, 0x14, 0xfa, 0xf1, 0x01, 0x1c,
94 0x02, 0xe0, 0x00, 0x1c, 0x80, 0xff, 0xb0, 0x49,
95 0x04, 0xf0, 0x01, 0x0b, 0xd3, 0xa1, 0x03, 0xe0,
96 0x02, 0x0b, 0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37,
97 0x02, 0x0b, 0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37,
98 0x00, 0x13, 0xfb, 0xf1, 0x80, 0xff, 0x22, 0x73,
99 0xb5, 0x25, 0x18, 0x1e, 0xde, 0x30, 0xd9, 0x30,
100 0x64, 0x72, 0x11, 0x1e, 0x68, 0x23, 0x16, 0x31,
101 0x80, 0xff, 0xd4, 0x49, 0x28, 0xf0, 0x02, 0xb4,
102 0x2a, 0xc4, 0x00, 0x1d, 0x2e, 0xe8, 0xe0, 0x73,
103 0xb9, 0x21, 0xbd, 0x25, 0x04, 0x13, 0x02, 0xf0,
104 0x1a, 0xe0, 0x22, 0xc4, 0x23, 0xc3, 0x2f, 0xe8,
105 0x23, 0xc3, 0x2d, 0xe8, 0x00, 0x1d, 0x21, 0xe8,
106 0xe2, 0x73, 0xbb, 0x49, 0xfc, 0xf0, 0xe0, 0x73,
107 0xb7, 0x48, 0x03, 0xb4, 0x81, 0x1d, 0x19, 0xe8,
108 0x40, 0x1a, 0x84, 0x1d, 0x16, 0xe8, 0x12, 0xc3,
109 0x1e, 0xe8, 0x03, 0xb0, 0x81, 0x1d, 0x11, 0xe8,
110 0x0e, 0xc3, 0x19, 0xe8, 0x02, 0xb0, 0x06, 0xc7,
111 0x04, 0x1e, 0xe0, 0x9e, 0x02, 0xc6, 0x00, 0xbe,
112 0x22, 0x02, 0x20, 0xe4, 0x04, 0xb8, 0x34, 0xb0,
113 0x00, 0x02, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x0c,
114 0x09, 0xc7, 0xe0, 0x9b, 0xe2, 0x9a, 0xe4, 0x9c,
115 0xe6, 0x8d, 0xe6, 0x76, 0xef, 0x49, 0xfe, 0xf1,
116 0x80, 0xff, 0x08, 0xea, 0x82, 0x1d, 0xf5, 0xef,
117 0x00, 0x1a, 0x88, 0x1d, 0xf2, 0xef, 0xed, 0xc2,
118 0xf0, 0xef, 0x80, 0xff, 0x02, 0xc6, 0x00, 0xbe,
119 0x46, 0x06, 0x08, 0xc2, 0x40, 0x73, 0x3a, 0x48,
120 0x40, 0x9b, 0x06, 0xff, 0x02, 0xc6, 0x00, 0xbe,
121 0x86, 0x17, 0x1e, 0xfc, 0x36, 0xf0, 0x08, 0x1c,
122 0xea, 0x8c, 0xe3, 0x64, 0xc7, 0x49, 0x25, 0xf1,
123 0xe0, 0x75, 0xff, 0x1b, 0xeb, 0x47, 0xff, 0x1b,
124 0x6b, 0x47, 0xe0, 0x9d, 0x15, 0xc3, 0x60, 0x75,
125 0xd8, 0x49, 0x04, 0xf0, 0x81, 0x1d, 0xe2, 0x8d,
126 0x05, 0xe0, 0xe2, 0x63, 0x81, 0x1d, 0xdd, 0x47,
127 0xe2, 0x8b, 0x0b, 0xc3, 0x00, 0x1d, 0x61, 0x8d,
128 0x3c, 0x03, 0x60, 0x75, 0xd8, 0x49, 0x06, 0xf1,
129 0xdf, 0x48, 0x61, 0x95, 0x16, 0xe0, 0x4e, 0xe8,
130 0x12, 0xe8, 0x21, 0xc5, 0xa0, 0x73, 0xb0, 0x49,
131 0x03, 0xf0, 0x31, 0x48, 0xa0, 0x9b, 0x0d, 0xe0,
132 0xc0, 0x49, 0x0b, 0xf1, 0xe2, 0x63, 0x7e, 0x1d,
133 0xdd, 0x46, 0xe2, 0x8b, 0xe0, 0x75, 0x83, 0x1b,
134 0xeb, 0x46, 0xfe, 0x1b, 0x6b, 0x46, 0xe0, 0x9d,
135 0xe4, 0x49, 0x11, 0xf0, 0x10, 0x1d, 0xea, 0x8d,
136 0xe3, 0x64, 0xc6, 0x49, 0x09, 0xf1, 0x07, 0xc5,
137 0xa0, 0x73, 0xb1, 0x48, 0xa0, 0x9b, 0x02, 0xc5,
138 0x00, 0xbd, 0xe6, 0x04, 0xa0, 0xd1, 0x02, 0xc5,
139 0x00, 0xbd, 0xfe, 0x04, 0x02, 0xc5, 0x00, 0xbd,
140 0x30, 0x05, 0x00, 0x00 };
141
142 static u16 r8152b_ram_code1[] = {
143 0x9700, 0x7fe0, 0x4c00, 0x4007, 0x4400, 0x4800, 0x7c1f, 0x4c00,
144 0x5310, 0x6000, 0x7c07, 0x6800, 0x673e, 0x0000, 0x0000, 0x571f,
145 0x5ffb, 0xaa05, 0x5b58, 0x7d80, 0x6100, 0x3019, 0x5b64, 0x7d80,
146 0x6080, 0xa6f8, 0xdcdb, 0x0015, 0xb915, 0xb511, 0xd16b, 0x000f,
147 0xb40f, 0xd06b, 0x000d, 0xb206, 0x7c01, 0x5800, 0x7c04, 0x5c00,
148 0x3011, 0x7c01, 0x5801, 0x7c04, 0x5c04, 0x3019, 0x30a5, 0x3127,
149 0x31d5, 0x7fe0, 0x4c60, 0x7c07, 0x6803, 0x7d00, 0x6900, 0x65a0,
150 0x0000, 0x0000, 0xaf03, 0x6015, 0x303e, 0x6017, 0x57e0, 0x580c,
151 0x588c, 0x7fdd, 0x5fa2, 0x4827, 0x7c1f, 0x4c00, 0x7c1f, 0x4c10,
152 0x8400, 0x7c30, 0x6020, 0x48bf, 0x7c1f, 0x4c00, 0x7c1f, 0x4c01,
153 0x7c07, 0x6803, 0xb806, 0x7c08, 0x6800, 0x0000, 0x0000, 0x305c,
154 0x7c08, 0x6808, 0x0000, 0x0000, 0xae06, 0x7c02, 0x5c02, 0x0000,
155 0x0000, 0x3067, 0x8e05, 0x7c02, 0x5c00, 0x0000, 0x0000, 0xad06,
156 0x7c20, 0x5c20, 0x0000, 0x0000, 0x3072, 0x8d05, 0x7c20, 0x5c00,
157 0x0000, 0x0000, 0xa008, 0x7c07, 0x6800, 0xb8db, 0x7c07, 0x6803,
158 0xd9b3, 0x00d7, 0x7fe0, 0x4c80, 0x7c08, 0x6800, 0x0000, 0x0000,
159 0x7c23, 0x5c23, 0x481d, 0x7c1f, 0x4c00, 0x7c1f, 0x4c02, 0x5310,
160 0x81ff, 0x30f5, 0x7fe0, 0x4d00, 0x4832, 0x7c1f, 0x4c00, 0x7c1f,
161 0x4c10, 0x7c08, 0x6000, 0xa49e, 0x7c07, 0x6800, 0xb89b, 0x7c07,
162 0x6803, 0xd9b3, 0x00f9, 0x7fe0, 0x4d20, 0x7e00, 0x6200, 0x3001,
163 0x7fe0, 0x4dc0, 0xd09d, 0x0002, 0xb4fe, 0x7fe0, 0x4d80, 0x7c04,
164 0x6004, 0x7c07, 0x6802, 0x6728, 0x0000, 0x0000, 0x7c08, 0x6000,
165 0x486c, 0x7c1f, 0x4c00, 0x7c1f, 0x4c01, 0x9503, 0x7e00, 0x6200,
166 0x571f, 0x5fbb, 0xaa05, 0x5b58, 0x7d80, 0x6100, 0x30c2, 0x5b64,
167 0x7d80, 0x6080, 0xcdab, 0x0063, 0xcd8d, 0x0061, 0xd96b, 0x005f,
168 0xd0a0, 0x00d7, 0xcba0, 0x0003, 0x80ec, 0x30cf, 0x30dc, 0x7fe0,
169 0x4ce0, 0x4832, 0x7c1f, 0x4c00, 0x7c1f, 0x4c08, 0x7c08, 0x6008,
170 0x8300, 0xb902, 0x30a5, 0x308a, 0x7fe0, 0x4da0, 0x65a8, 0x0000,
171 0x0000, 0x56a0, 0x590c, 0x7ffd, 0x5fa2, 0xae06, 0x7c02, 0x5c02,
172 0x0000, 0x0000, 0x30f0, 0x8e05, 0x7c02, 0x5c00, 0x0000, 0x0000,
173 0xcba4, 0x0004, 0xcd8d, 0x0002, 0x80f1, 0x7fe0, 0x4ca0, 0x7c08,
174 0x6408, 0x0000, 0x0000, 0x7d00, 0x6800, 0xb603, 0x7c10, 0x6010,
175 0x7d1f, 0x551f, 0x5fb3, 0xaa07, 0x7c80, 0x5800, 0x5b58, 0x7d80,
176 0x6100, 0x310f, 0x7c80, 0x5800, 0x5b64, 0x7d80, 0x6080, 0x4827,
177 0x7c1f, 0x4c00, 0x7c1f, 0x4c10, 0x8400, 0x7c10, 0x6000, 0x7fe0,
178 0x4cc0, 0x5fbb, 0x4824, 0x7c1f, 0x4c00, 0x7c1f, 0x4c04, 0x8200,
179 0x7ce0, 0x5400, 0x6728, 0x0000, 0x0000, 0x30cf, 0x3001, 0x7fe0,
180 0x4e00, 0x4007, 0x4400, 0x5310, 0x7c07, 0x6800, 0x673e, 0x0000,
181 0x0000, 0x570f, 0x5fff, 0xaa05, 0x585b, 0x7d80, 0x6100, 0x313b,
182 0x5867, 0x7d80, 0x6080, 0x9403, 0x7e00, 0x6200, 0xcda3, 0x00e7,
183 0xcd85, 0x00e5, 0xd96b, 0x00e3, 0x96e3, 0x7c07, 0x6800, 0x673e,
184 0x0000, 0x0000, 0x7fe0, 0x4e20, 0x96db, 0x8b04, 0x7c08, 0x5008,
185 0xab03, 0x7c08, 0x5000, 0x7c07, 0x6801, 0x677e, 0x0000, 0x0000,
186 0xdb7c, 0x00ec, 0x0000, 0x7fe1, 0x4f40, 0x4837, 0x4418, 0x41c7,
187 0x7fe0, 0x4e40, 0x7c40, 0x5400, 0x7c1f, 0x4c01, 0x7c1f, 0x4c01,
188 0x8fbf, 0xd2a0, 0x004b, 0x9204, 0xa042, 0x3168, 0x3127, 0x7fe1,
189 0x4f60, 0x489c, 0x4628, 0x7fe0, 0x4e60, 0x7e28, 0x4628, 0x7c40,
190 0x5400, 0x7c01, 0x5800, 0x7c04, 0x5c00, 0x41e8, 0x7c1f, 0x4c01,
191 0x7c1f, 0x4c01, 0x8fa5, 0xb241, 0xa02a, 0x3182, 0x7fe0, 0x4ea0,
192 0x7c02, 0x4402, 0x4448, 0x4894, 0x7c1f, 0x4c01, 0x7c1f, 0x4c03,
193 0x4824, 0x7c1f, 0x4c07, 0x41ef, 0x41ff, 0x4891, 0x7c1f, 0x4c07,
194 0x7c1f, 0x4c17, 0x8400, 0x8ef8, 0x41c7, 0x8f8a, 0x92d5, 0xa10f,
195 0xd480, 0x0008, 0xd580, 0x00b8, 0xa202, 0x319d, 0x7c04, 0x4404,
196 0x319d, 0xd484, 0x00f3, 0xd484, 0x00f1, 0x3127, 0x7fe0, 0x4ee0,
197 0x7c40, 0x5400, 0x4488, 0x41cf, 0x3127, 0x7fe0, 0x4ec0, 0x48f3,
198 0x7c1f, 0x4c01, 0x7c1f, 0x4c09, 0x4508, 0x41c7, 0x8fb0, 0xd218,
199 0x00ae, 0xd2a4, 0x009e, 0x31be, 0x7fe0, 0x4e80, 0x4832, 0x7c1f,
200 0x4c01, 0x7c1f, 0x4c11, 0x4428, 0x7c40, 0x5440, 0x7c01, 0x5801,
201 0x7c04, 0x5c04, 0x41e8, 0xa4b3, 0x31d3, 0x7fe0, 0x4f20, 0x7c07,
202 0x6800, 0x673e, 0x0000, 0x0000, 0x570f, 0x5fff, 0xaa04, 0x585b,
203 0x6100, 0x31e4, 0x5867, 0x6080, 0xbcf1, 0x3001 };
204
205 static u16 r8152b_pla_patch_a_bp[] = {
206 0xfc26, 0x8000, 0xfc28, 0x170b, 0xfc2a, 0x01e1, 0xfc2c, 0x0989,
207 0xfc2e, 0x1349, 0xfc30, 0x01b7, 0xfc32, 0x061d, 0xe422, 0x0020,
208 0xe420, 0x0018, 0xfc34, 0x1785, 0xfc36, 0x047b };
209
210 static u8 r8152b_pla_patch_a2[] = {
211 0x08, 0xe0, 0x1a, 0xe0, 0xf2, 0xe0, 0xfa, 0xe0,
212 0x32, 0xe1, 0x34, 0xe1, 0x36, 0xe1, 0x38, 0xe1,
213 0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13,
214 0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0, 0x02, 0x13,
215 0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0, 0x08, 0x13,
216 0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb, 0x03, 0xc3,
217 0x00, 0xbb, 0xd2, 0x17, 0xbc, 0x17, 0x14, 0xc2,
218 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b, 0x11, 0xc2,
219 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0, 0xbf, 0x49,
220 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd, 0xb1, 0x49,
221 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b, 0x02, 0xc2,
222 0x00, 0xba, 0x4e, 0x19, 0x00, 0xa0, 0x1e, 0xfc,
223 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8, 0x00, 0x80,
224 0x00, 0x60, 0x2c, 0x75, 0xd4, 0x49, 0x12, 0xf1,
225 0x29, 0xe0, 0xf8, 0xc2, 0x46, 0x71, 0xf7, 0xc2,
226 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1, 0xf5, 0xc7,
227 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30, 0x26, 0x62,
228 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72, 0xa0, 0x49,
229 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f, 0x97, 0x30,
230 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75, 0x32, 0xc3,
231 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1, 0xdc, 0x21,
232 0xbc, 0x25, 0x27, 0xc6, 0xc0, 0x77, 0x04, 0x13,
233 0x18, 0xf0, 0x03, 0x13, 0x19, 0xf0, 0x02, 0x13,
234 0x1a, 0xf0, 0x01, 0x13, 0x1b, 0xf0, 0xd4, 0x49,
235 0x03, 0xf1, 0x1c, 0xc5, 0x00, 0xbd, 0xcd, 0xc6,
236 0xc6, 0x67, 0x2e, 0x75, 0xd7, 0x22, 0xdd, 0x26,
237 0x05, 0x15, 0x1a, 0xf0, 0x14, 0xc6, 0x00, 0xbe,
238 0x13, 0xc5, 0x00, 0xbd, 0x12, 0xc5, 0x00, 0xbd,
239 0xf1, 0x49, 0xfb, 0xf1, 0xef, 0xe7, 0xf4, 0x49,
240 0xfa, 0xf1, 0xec, 0xe7, 0xf3, 0x49, 0xf7, 0xf1,
241 0xe9, 0xe7, 0xf2, 0x49, 0xf4, 0xf1, 0xe6, 0xe7,
242 0xb6, 0xc0, 0xf6, 0x14, 0x36, 0x14, 0x62, 0x14,
243 0x86, 0x15, 0xa0, 0xd1, 0x00, 0x00, 0xc0, 0x75,
244 0xd0, 0x49, 0x46, 0xf0, 0x26, 0x72, 0xa7, 0x49,
245 0x43, 0xf0, 0x22, 0x72, 0x25, 0x25, 0x20, 0x1f,
246 0x97, 0x30, 0x91, 0x30, 0x40, 0x73, 0xf3, 0xc4,
247 0x1c, 0x40, 0x04, 0xf0, 0xd7, 0x49, 0x05, 0xf1,
248 0x37, 0xe0, 0x53, 0x48, 0xc0, 0x9d, 0x08, 0x02,
249 0x40, 0x66, 0x64, 0x27, 0x06, 0x16, 0x30, 0xf1,
250 0x46, 0x63, 0x3b, 0x13, 0x2d, 0xf1, 0x34, 0x9b,
251 0x18, 0x1b, 0x93, 0x30, 0x2b, 0xc3, 0x10, 0x1c,
252 0x2b, 0xe8, 0x01, 0x14, 0x25, 0xf1, 0x00, 0x1d,
253 0x26, 0x1a, 0x8a, 0x30, 0x22, 0x73, 0xb5, 0x25,
254 0x0e, 0x0b, 0x00, 0x1c, 0x2c, 0xe8, 0x1f, 0xc7,
255 0x27, 0x40, 0x1a, 0xf1, 0x38, 0xe8, 0x32, 0x1f,
256 0x8f, 0x30, 0x08, 0x1b, 0x24, 0xe8, 0x36, 0x72,
257 0x46, 0x77, 0x00, 0x17, 0x0d, 0xf0, 0x13, 0xc3,
258 0x1f, 0x40, 0x03, 0xf1, 0x00, 0x1f, 0x46, 0x9f,
259 0x44, 0x77, 0x9f, 0x44, 0x5f, 0x44, 0x17, 0xe8,
260 0x0a, 0xc7, 0x27, 0x40, 0x05, 0xf1, 0x02, 0xc3,
261 0x00, 0xbb, 0x1c, 0x1b, 0xd2, 0x1a, 0xff, 0xc7,
262 0x00, 0xbf, 0xb8, 0xcd, 0xff, 0xff, 0x02, 0x0c,
263 0x54, 0xa5, 0xdc, 0xa5, 0x2f, 0x40, 0x05, 0xf1,
264 0x00, 0x14, 0xfa, 0xf1, 0x01, 0x1c, 0x02, 0xe0,
265 0x00, 0x1c, 0x80, 0xff, 0xb0, 0x49, 0x04, 0xf0,
266 0x01, 0x0b, 0xd3, 0xa1, 0x03, 0xe0, 0x02, 0x0b,
267 0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37, 0x02, 0x0b,
268 0xd3, 0xa5, 0x27, 0x31, 0x20, 0x37, 0x00, 0x13,
269 0xfb, 0xf1, 0x80, 0xff, 0x22, 0x73, 0xb5, 0x25,
270 0x18, 0x1e, 0xde, 0x30, 0xd9, 0x30, 0x64, 0x72,
271 0x11, 0x1e, 0x68, 0x23, 0x16, 0x31, 0x80, 0xff,
272 0x08, 0xc2, 0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b,
273 0x06, 0xff, 0x02, 0xc6, 0x00, 0xbe, 0x4e, 0x18,
274 0x1e, 0xfc, 0x33, 0xc5, 0xa0, 0x74, 0xc0, 0x49,
275 0x1f, 0xf0, 0x30, 0xc5, 0xa0, 0x73, 0x00, 0x13,
276 0x04, 0xf1, 0xa2, 0x73, 0x00, 0x13, 0x14, 0xf0,
277 0x28, 0xc5, 0xa0, 0x74, 0xc8, 0x49, 0x1b, 0xf1,
278 0x26, 0xc5, 0xa0, 0x76, 0xa2, 0x74, 0x01, 0x06,
279 0x20, 0x37, 0xa0, 0x9e, 0xa2, 0x9c, 0x1e, 0xc5,
280 0xa2, 0x73, 0x23, 0x40, 0x10, 0xf8, 0x04, 0xf3,
281 0xa0, 0x73, 0x33, 0x40, 0x0c, 0xf8, 0x15, 0xc5,
282 0xa0, 0x74, 0x41, 0x48, 0xa0, 0x9c, 0x14, 0xc5,
283 0xa0, 0x76, 0x62, 0x48, 0xe0, 0x48, 0xa0, 0x9e,
284 0x10, 0xc6, 0x00, 0xbe, 0x0a, 0xc5, 0xa0, 0x74,
285 0x48, 0x48, 0xa0, 0x9c, 0x0b, 0xc5, 0x20, 0x1e,
286 0xa0, 0x9e, 0xe5, 0x48, 0xa0, 0x9e, 0xf0, 0xe7,
287 0xbc, 0xc0, 0xc8, 0xd2, 0xcc, 0xd2, 0x28, 0xe4,
288 0x22, 0x02, 0xf0, 0xc0, 0x02, 0xc6, 0x00, 0xbe,
289 0x00, 0x00, 0x02, 0xc6, 0x00, 0xbe, 0x00, 0x00,
290 0x02, 0xc6, 0x00, 0xbe, 0x00, 0x00, 0x02, 0xc6,
291 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
292
293 static u16 r8152b_pla_patch_a2_bp[] = {
294 0xfc28, 0x8000, 0xfc28, 0x17a5, 0xfc2a, 0x13ad,
295 0xfc2c, 0x184d, 0xfc2e, 0x01e1 };
296
297 static u16 r8153_ram_code_a[] = {
298 0xE86C, 0xA000, 0xB436, 0xB820, 0xB438, 0x0290, 0xB436, 0xA012,
299 0xB438, 0x0000, 0xB436, 0xA014, 0xB438, 0x2c04, 0xB438, 0x2c18,
300 0xB438, 0x2c45, 0xB438, 0x2c45, 0xB438, 0xd502, 0xB438, 0x8301,
301 0xB438, 0x8306, 0xB438, 0xd500, 0xB438, 0x8208, 0xB438, 0xd501,
302 0xB438, 0xe018, 0xB438, 0x0308, 0xB438, 0x60f2, 0xB438, 0x8404,
303 0xB438, 0x607d, 0xB438, 0xc117, 0xB438, 0x2c16, 0xB438, 0xc116,
304 0xB438, 0x2c16, 0xB438, 0x607d, 0xB438, 0xc117, 0xB438, 0xa404,
305 0xB438, 0xd500, 0xB438, 0x0800, 0xB438, 0xd501, 0xB438, 0x62d2,
306 0xB438, 0x615d, 0xB438, 0xc115, 0xB438, 0xa404, 0xB438, 0xc307,
307 0xB438, 0xd502, 0xB438, 0x8301, 0xB438, 0x8306, 0xB438, 0xd500,
308 0xB438, 0x8208, 0xB438, 0x2c42, 0xB438, 0xc114, 0xB438, 0x8404,
309 0xB438, 0xc317, 0xB438, 0xd701, 0xB438, 0x435d, 0xB438, 0xd500,
310 0xB438, 0xa208, 0xB438, 0xd502, 0xB438, 0xa306, 0xB438, 0xa301,
311 0xB438, 0x2c42, 0xB438, 0x8404, 0xB438, 0x613d, 0xB438, 0xc115,
312 0xB438, 0xc307, 0xB438, 0xd502, 0xB438, 0x8301, 0xB438, 0x8306,
313 0xB438, 0xd500, 0xB438, 0x8208, 0xB438, 0x2c42, 0xB438, 0xc114,
314 0xB438, 0xc317, 0xB438, 0xd701, 0xB438, 0x40dd, 0xB438, 0xd500,
315 0xB438, 0xa208, 0xB438, 0xd502, 0xB438, 0xa306, 0xB438, 0xa301,
316 0xB438, 0xd500, 0xB438, 0xd702, 0xB438, 0x0800, 0xB436, 0xA01A,
317 0xB438, 0x0000, 0xB436, 0xA006, 0xB438, 0x0fff, 0xB436, 0xA004,
318 0xB438, 0x0fff, 0xB436, 0xA002, 0xB438, 0x05a3, 0xB436, 0xA000,
319 0xB438, 0x3591, 0xB436, 0xB820, 0xB438, 0x0210 };
320
321 static u8 r8153_usb_patch_c[] = {
322 0x08, 0xe0, 0x0a, 0xe0, 0x14, 0xe0, 0x2e, 0xe0,
323 0x37, 0xe0, 0x3e, 0xe0, 0x6d, 0xe0, 0x78, 0xe0,
324 0x02, 0xc5, 0x00, 0xbd, 0x38, 0x3b, 0xdb, 0x49,
325 0x04, 0xf1, 0x06, 0xc3, 0x00, 0xbb, 0x5a, 0x02,
326 0x05, 0xc4, 0x03, 0xc3, 0x00, 0xbb, 0xa4, 0x04,
327 0x7e, 0x02, 0x30, 0xd4, 0x30, 0x18, 0x18, 0xc1,
328 0x0c, 0xe8, 0x17, 0xc6, 0xc7, 0x65, 0xd0, 0x49,
329 0x05, 0xf0, 0x32, 0x48, 0x02, 0xc2, 0x00, 0xba,
330 0x3e, 0x16, 0x02, 0xc2, 0x00, 0xba, 0x48, 0x16,
331 0x02, 0xb4, 0x09, 0xc2, 0x40, 0x99, 0x0e, 0x48,
332 0x42, 0x98, 0x42, 0x70, 0x8e, 0x49, 0xfe, 0xf1,
333 0x02, 0xb0, 0x80, 0xff, 0xc0, 0xd4, 0xe4, 0x40,
334 0x20, 0xd4, 0xb0, 0x49, 0x04, 0xf0, 0x30, 0x18,
335 0x06, 0xc1, 0xef, 0xef, 0xfa, 0xc7, 0x02, 0xc0,
336 0x00, 0xb8, 0xd0, 0x10, 0xe4, 0x4b, 0x07, 0xc3,
337 0x70, 0x61, 0x12, 0x48, 0x70, 0x89, 0x02, 0xc3,
338 0x00, 0xbb, 0x9c, 0x15, 0x20, 0xd4, 0x2b, 0xc5,
339 0xa0, 0x77, 0x00, 0x1c, 0xa0, 0x9c, 0x28, 0xc5,
340 0xa0, 0x64, 0xc0, 0x48, 0xc1, 0x48, 0xc2, 0x48,
341 0xa0, 0x8c, 0xb1, 0x64, 0xc0, 0x48, 0xb1, 0x8c,
342 0x20, 0xc5, 0xa0, 0x64, 0x40, 0x48, 0x41, 0x48,
343 0xc2, 0x48, 0xa0, 0x8c, 0x19, 0xc5, 0xa4, 0x64,
344 0x44, 0x48, 0xa4, 0x8c, 0xb1, 0x64, 0x40, 0x48,
345 0xb1, 0x8c, 0x14, 0xc4, 0x80, 0x73, 0x13, 0xc4,
346 0x82, 0x9b, 0x11, 0x1b, 0x80, 0x9b, 0x0c, 0xc5,
347 0xa0, 0x64, 0x40, 0x48, 0x41, 0x48, 0x42, 0x48,
348 0xa0, 0x8c, 0x05, 0xc5, 0xa0, 0x9f, 0x02, 0xc5,
349 0x00, 0xbd, 0x6c, 0x3a, 0x1e, 0xfc, 0x10, 0xd8,
350 0x86, 0xd4, 0xf8, 0xcb, 0x20, 0xe4, 0x0a, 0xc0,
351 0x16, 0x61, 0x91, 0x48, 0x16, 0x89, 0x07, 0xc0,
352 0x11, 0x19, 0x0c, 0x89, 0x02, 0xc1, 0x00, 0xb9,
353 0x02, 0x06, 0x00, 0xd4, 0x40, 0xb4, 0xfe, 0xc0,
354 0x16, 0x61, 0x91, 0x48, 0x16, 0x89, 0xfb, 0xc0,
355 0x11, 0x19, 0x0c, 0x89, 0x02, 0xc1, 0x00, 0xb9,
356 0xd2, 0x05, 0x00, 0x00 };
357
358 static u16 r8153_usb_patch_c_bp[] = {
359 0xfc26, 0xa000, 0xfc28, 0x3b34, 0xfc2a, 0x027c, 0xfc2c, 0x162c,
360 0xfc2e, 0x10ce, 0xfc30, 0x0000, 0xfc32, 0x3a28, 0xfc34, 0x05f8,
361 0xfc36, 0x05c8 };
362
363 static u8 r8153_pla_patch_c[] = {
364 0x08, 0xe0, 0xea, 0xe0, 0xf2, 0xe0, 0x04, 0xe1,
365 0x06, 0xe1, 0x08, 0xe1, 0x40, 0xe1, 0xf1, 0xe1,
366 0x14, 0xc2, 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b,
367 0x11, 0xc2, 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0,
368 0xbf, 0x49, 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd,
369 0xb1, 0x49, 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b,
370 0x02, 0xc2, 0x00, 0xba, 0xde, 0x18, 0x00, 0xe0,
371 0x1e, 0xfc, 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8,
372 0x00, 0x80, 0x00, 0x20, 0x2c, 0x75, 0xd4, 0x49,
373 0x12, 0xf1, 0x32, 0xe0, 0xf8, 0xc2, 0x46, 0x71,
374 0xf7, 0xc2, 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1,
375 0xf5, 0xc7, 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30,
376 0x26, 0x62, 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72,
377 0xa0, 0x49, 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f,
378 0x97, 0x30, 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75,
379 0x3c, 0xc3, 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1,
380 0xdc, 0x21, 0xbc, 0x25, 0x30, 0xc6, 0xc0, 0x77,
381 0x04, 0x13, 0x21, 0xf0, 0x03, 0x13, 0x22, 0xf0,
382 0x02, 0x13, 0x23, 0xf0, 0x01, 0x13, 0x24, 0xf0,
383 0x08, 0x13, 0x08, 0xf1, 0x2e, 0x73, 0xba, 0x21,
384 0xbd, 0x25, 0x05, 0x13, 0x03, 0xf1, 0x24, 0xc5,
385 0x00, 0xbd, 0xd4, 0x49, 0x03, 0xf1, 0x1c, 0xc5,
386 0x00, 0xbd, 0xc4, 0xc6, 0xc6, 0x67, 0x2e, 0x75,
387 0xd7, 0x22, 0xdd, 0x26, 0x05, 0x15, 0x1b, 0xf0,
388 0x14, 0xc6, 0x00, 0xbe, 0x13, 0xc5, 0x00, 0xbd,
389 0x12, 0xc5, 0x00, 0xbd, 0xf1, 0x49, 0xfb, 0xf1,
390 0xef, 0xe7, 0xf4, 0x49, 0xfa, 0xf1, 0xec, 0xe7,
391 0xf3, 0x49, 0xf7, 0xf1, 0xe9, 0xe7, 0xf2, 0x49,
392 0xf4, 0xf1, 0xe6, 0xe7, 0xb6, 0xc0, 0x50, 0x14,
393 0x90, 0x13, 0xbc, 0x13, 0xf2, 0x14, 0x00, 0xa0,
394 0xa0, 0xd1, 0x00, 0x00, 0xc0, 0x75, 0xd0, 0x49,
395 0x46, 0xf0, 0x26, 0x72, 0xa7, 0x49, 0x43, 0xf0,
396 0x22, 0x72, 0x25, 0x25, 0x20, 0x1f, 0x97, 0x30,
397 0x91, 0x30, 0x40, 0x73, 0xf3, 0xc4, 0x1c, 0x40,
398 0x04, 0xf0, 0xd7, 0x49, 0x05, 0xf1, 0x37, 0xe0,
399 0x53, 0x48, 0xc0, 0x9d, 0x08, 0x02, 0x40, 0x66,
400 0x64, 0x27, 0x06, 0x16, 0x30, 0xf1, 0x46, 0x63,
401 0x3b, 0x13, 0x2d, 0xf1, 0x34, 0x9b, 0x18, 0x1b,
402 0x93, 0x30, 0x2b, 0xc3, 0x10, 0x1c, 0x2b, 0xe8,
403 0x01, 0x14, 0x25, 0xf1, 0x00, 0x1d, 0x26, 0x1a,
404 0x8a, 0x30, 0x22, 0x73, 0xb5, 0x25, 0x0e, 0x0b,
405 0x00, 0x1c, 0x2c, 0xe8, 0x1f, 0xc7, 0x27, 0x40,
406 0x1a, 0xf1, 0x38, 0xe8, 0x32, 0x1f, 0x8f, 0x30,
407 0x08, 0x1b, 0x24, 0xe8, 0x36, 0x72, 0x46, 0x77,
408 0x00, 0x17, 0x0d, 0xf0, 0x13, 0xc3, 0x1f, 0x40,
409 0x03, 0xf1, 0x00, 0x1f, 0x46, 0x9f, 0x44, 0x77,
410 0x9f, 0x44, 0x5f, 0x44, 0x17, 0xe8, 0x0a, 0xc7,
411 0x27, 0x40, 0x05, 0xf1, 0x02, 0xc3, 0x00, 0xbb,
412 0xbe, 0x1a, 0x74, 0x14, 0xff, 0xc7, 0x00, 0xbf,
413 0xb8, 0xcd, 0xff, 0xff, 0x02, 0x0c, 0x54, 0xa5,
414 0xdc, 0xa5, 0x2f, 0x40, 0x05, 0xf1, 0x00, 0x14,
415 0xfa, 0xf1, 0x01, 0x1c, 0x02, 0xe0, 0x00, 0x1c,
416 0x80, 0xff, 0xb0, 0x49, 0x04, 0xf0, 0x01, 0x0b,
417 0xd3, 0xa1, 0x03, 0xe0, 0x02, 0x0b, 0xd3, 0xa5,
418 0x27, 0x31, 0x20, 0x37, 0x02, 0x0b, 0xd3, 0xa5,
419 0x27, 0x31, 0x20, 0x37, 0x00, 0x13, 0xfb, 0xf1,
420 0x80, 0xff, 0x22, 0x73, 0xb5, 0x25, 0x18, 0x1e,
421 0xde, 0x30, 0xd9, 0x30, 0x64, 0x72, 0x11, 0x1e,
422 0x68, 0x23, 0x16, 0x31, 0x80, 0xff, 0x08, 0xc2,
423 0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b, 0x06, 0xff,
424 0x02, 0xc6, 0x00, 0xbe, 0xcc, 0x17, 0x1e, 0xfc,
425 0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13,
426 0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0, 0x02, 0x13,
427 0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0, 0x08, 0x13,
428 0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb, 0x03, 0xc3,
429 0x00, 0xbb, 0x50, 0x17, 0x3a, 0x17, 0x02, 0xc6,
430 0x00, 0xbe, 0x00, 0x00, 0x02, 0xc6, 0x00, 0xbe,
431 0x00, 0x00, 0x33, 0xc5, 0xa0, 0x74, 0xc0, 0x49,
432 0x1f, 0xf0, 0x30, 0xc5, 0xa0, 0x73, 0x00, 0x13,
433 0x04, 0xf1, 0xa2, 0x73, 0x00, 0x13, 0x14, 0xf0,
434 0x28, 0xc5, 0xa0, 0x74, 0xc8, 0x49, 0x1b, 0xf1,
435 0x26, 0xc5, 0xa0, 0x76, 0xa2, 0x74, 0x01, 0x06,
436 0x20, 0x37, 0xa0, 0x9e, 0xa2, 0x9c, 0x1e, 0xc5,
437 0xa2, 0x73, 0x23, 0x40, 0x10, 0xf8, 0x04, 0xf3,
438 0xa0, 0x73, 0x33, 0x40, 0x0c, 0xf8, 0x15, 0xc5,
439 0xa0, 0x74, 0x41, 0x48, 0xa0, 0x9c, 0x14, 0xc5,
440 0xa0, 0x76, 0x62, 0x48, 0xe0, 0x48, 0xa0, 0x9e,
441 0x10, 0xc6, 0x00, 0xbe, 0x0a, 0xc5, 0xa0, 0x74,
442 0x48, 0x48, 0xa0, 0x9c, 0x0b, 0xc5, 0x20, 0x1e,
443 0xa0, 0x9e, 0xe5, 0x48, 0xa0, 0x9e, 0xf0, 0xe7,
444 0xbc, 0xc0, 0xc8, 0xd2, 0xcc, 0xd2, 0x28, 0xe4,
445 0xfa, 0x01, 0xf0, 0xc0, 0x18, 0x89, 0x00, 0x1d,
446 0x43, 0xc3, 0x62, 0x62, 0xa0, 0x49, 0x06, 0xf0,
447 0x41, 0xc0, 0x02, 0x71, 0x60, 0x99, 0x3f, 0xc1,
448 0x03, 0xe0, 0x3c, 0xc0, 0x3d, 0xc1, 0x02, 0x99,
449 0x00, 0x61, 0x67, 0x11, 0x3d, 0xf1, 0x69, 0x33,
450 0x34, 0xc0, 0x28, 0x40, 0xf7, 0xf1, 0x35, 0xc0,
451 0x00, 0x19, 0x81, 0x1b, 0x89, 0xe8, 0x32, 0xc0,
452 0x04, 0x1a, 0x84, 0x1b, 0x85, 0xe8, 0x7a, 0xe8,
453 0xa3, 0x49, 0xfe, 0xf0, 0x2c, 0xc0, 0x76, 0xe8,
454 0xa1, 0x48, 0x29, 0xc0, 0x84, 0x1b, 0x7c, 0xe8,
455 0x00, 0x1d, 0x69, 0x33, 0x00, 0x1e, 0x01, 0x06,
456 0xff, 0x18, 0x30, 0x40, 0xfd, 0xf1, 0x7f, 0xc0,
457 0x00, 0x76, 0x2e, 0x40, 0xf7, 0xf1, 0x21, 0x48,
458 0x1a, 0xc0, 0x84, 0x1b, 0x6d, 0xe8, 0x76, 0xc0,
459 0x61, 0xe8, 0xa1, 0x49, 0xfd, 0xf0, 0x12, 0xc0,
460 0x00, 0x1a, 0x84, 0x1b, 0x65, 0xe8, 0x5a, 0xe8,
461 0xa5, 0x49, 0xfe, 0xf0, 0x0a, 0xc0, 0x01, 0x19,
462 0x81, 0x1b, 0x5e, 0xe8, 0x48, 0xe0, 0x8c, 0xd3,
463 0xb8, 0x0b, 0x50, 0xe8, 0x83, 0x00, 0x82, 0x00,
464 0x20, 0xb4, 0x10, 0xd8, 0x84, 0xd4, 0xfa, 0xc0,
465 0x00, 0x61, 0x9c, 0x20, 0x9c, 0x24, 0x06, 0x11,
466 0x06, 0xf1, 0x5d, 0xc0, 0x00, 0x61, 0x11, 0x48,
467 0x00, 0x89, 0x35, 0xe0, 0x00, 0x11, 0x02, 0xf1,
468 0x03, 0xe0, 0x04, 0x11, 0x06, 0xf1, 0x53, 0xc0,
469 0x00, 0x61, 0x92, 0x48, 0x00, 0x89, 0x2b, 0xe0,
470 0x05, 0x11, 0x08, 0xf1, 0x4c, 0xc0, 0x00, 0x61,
471 0x91, 0x49, 0x04, 0xf0, 0x91, 0x48, 0x00, 0x89,
472 0x11, 0xe0, 0xdc, 0xc0, 0x00, 0x61, 0x98, 0x20,
473 0x98, 0x24, 0x25, 0x11, 0x1c, 0xf1, 0x40, 0xc0,
474 0x25, 0xe8, 0x95, 0x49, 0x18, 0xf0, 0xd2, 0xc0,
475 0x00, 0x61, 0x98, 0x20, 0x98, 0x24, 0x25, 0x11,
476 0x12, 0xf1, 0x35, 0xc0, 0x00, 0x61, 0x92, 0x49,
477 0x0e, 0xf1, 0x12, 0x48, 0x00, 0x89, 0x2d, 0xc0,
478 0x00, 0x19, 0x00, 0x89, 0x2b, 0xc0, 0x01, 0x89,
479 0x27, 0xc0, 0x10, 0xe8, 0x25, 0xc0, 0x12, 0x48,
480 0x81, 0x1b, 0x16, 0xe8, 0xb9, 0xc3, 0x62, 0x62,
481 0xa0, 0x49, 0x05, 0xf0, 0xb5, 0xc3, 0x60, 0x71,
482 0xb5, 0xc0, 0x02, 0x99, 0x02, 0xc0, 0x00, 0xb8,
483 0xd6, 0x07, 0x13, 0xc4, 0x84, 0x98, 0x00, 0x1b,
484 0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1,
485 0x80, 0x71, 0x82, 0x72, 0x80, 0xff, 0x09, 0xc4,
486 0x84, 0x98, 0x80, 0x99, 0x82, 0x9a, 0x86, 0x8b,
487 0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1, 0x80, 0xff,
488 0x08, 0xea, 0x10, 0xd4, 0x88, 0xd3, 0x30, 0xd4,
489 0x10, 0xc0, 0x12, 0xe8, 0x8a, 0xd3, 0x00, 0xd8,
490 0x02, 0xc0, 0x00, 0xb8, 0xe0, 0x08, 0x00, 0x00,
491 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
492
493 static u16 r8153_pla_patch_c_bp[] = {
494 0xfc26, 0x8000, 0xfc28, 0x1306, 0xfc2a, 0x17ca, 0xfc2c, 0x171e,
495 0xfc2e, 0x0000, 0xfc30, 0x0000, 0xfc32, 0x01b4, 0xfc34, 0x07d4,
496 0xfc36, 0x0894, 0xfc38, 0x00e7 };
497
498 static u16 r8153_ram_code_bc[] = {
499 0xB436, 0xB820, 0xB438, 0x0290, 0xB436, 0xA012, 0xB438, 0x0000,
500 0xB436, 0xA014, 0xB438, 0x2c04, 0xB438, 0x2c07, 0xB438, 0x2c0a,
501 0xB438, 0x2c0d, 0xB438, 0xa240, 0xB438, 0xa104, 0xB438, 0x292d,
502 0xB438, 0x8620, 0xB438, 0xa480, 0xB438, 0x2a2c, 0xB438, 0x8480,
503 0xB438, 0xa101, 0xB438, 0x2a36, 0xB438, 0xd056, 0xB438, 0x2223,
504 0xB436, 0xA01A, 0xB438, 0x0000, 0xB436, 0xA006, 0xB438, 0x0222,
505 0xB436, 0xA004, 0xB438, 0x0a35, 0xB436, 0xA002, 0xB438, 0x0a2b,
506 0xB436, 0xA000, 0xB438, 0xf92c, 0xB436, 0xB820, 0xB438, 0x0210 };
507
508 static u8 r8153_usb_patch_b[] = {
509 0x08, 0xe0, 0x0f, 0xe0, 0x18, 0xe0, 0x24, 0xe0,
510 0x26, 0xe0, 0x3a, 0xe0, 0x84, 0xe0, 0x9c, 0xe0,
511 0xc2, 0x49, 0x04, 0xf0, 0x02, 0xc0, 0x00, 0xb8,
512 0x14, 0x18, 0x02, 0xc0, 0x00, 0xb8, 0x2e, 0x18,
513 0x06, 0x89, 0x08, 0xc0, 0x0c, 0x61, 0x92, 0x48,
514 0x93, 0x48, 0x0c, 0x89, 0x02, 0xc0, 0x00, 0xb8,
515 0x08, 0x05, 0x40, 0xb4, 0x16, 0x89, 0x6d, 0xc0,
516 0x00, 0x61, 0x95, 0x49, 0x06, 0xf0, 0xfa, 0xc0,
517 0x0c, 0x61, 0x92, 0x48, 0x93, 0x48, 0x0c, 0x89,
518 0x02, 0xc0, 0x00, 0xb8, 0xe2, 0x04, 0x02, 0xc2,
519 0x00, 0xba, 0xec, 0x11, 0x60, 0x60, 0x85, 0x49,
520 0x0d, 0xf1, 0x11, 0xc6, 0xd2, 0x61, 0x91, 0x49,
521 0xfd, 0xf0, 0x74, 0x60, 0x04, 0x48, 0x74, 0x88,
522 0x08, 0xc6, 0x08, 0xc0, 0xc4, 0x98, 0x01, 0x18,
523 0xc0, 0x88, 0x02, 0xc0, 0x00, 0xb8, 0x6e, 0x12,
524 0x04, 0xe4, 0x0d, 0x00, 0x00, 0xd4, 0xd1, 0x49,
525 0x3c, 0xf1, 0xd2, 0x49, 0x16, 0xf1, 0xd3, 0x49,
526 0x18, 0xf1, 0xd4, 0x49, 0x19, 0xf1, 0xd5, 0x49,
527 0x1a, 0xf1, 0xd6, 0x49, 0x1b, 0xf1, 0xd7, 0x49,
528 0x1c, 0xf1, 0xd8, 0x49, 0x1d, 0xf1, 0xd9, 0x49,
529 0x20, 0xf1, 0xda, 0x49, 0x23, 0xf1, 0xdb, 0x49,
530 0x24, 0xf1, 0x02, 0xc4, 0x00, 0xbc, 0x20, 0x04,
531 0xe5, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x14, 0x02,
532 0x02, 0xc4, 0x00, 0xbc, 0x16, 0x02, 0x02, 0xc4,
533 0x00, 0xbc, 0x18, 0x02, 0x02, 0xc4, 0x00, 0xbc,
534 0x1a, 0x02, 0x02, 0xc4, 0x00, 0xbc, 0x1c, 0x02,
535 0x02, 0xc4, 0x00, 0xbc, 0x94, 0x02, 0x10, 0xc7,
536 0xe0, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x8a, 0x02,
537 0x0b, 0xc7, 0xe4, 0x8e, 0x02, 0xc4, 0x00, 0xbc,
538 0x88, 0x02, 0x02, 0xc4, 0x00, 0xbc, 0x6e, 0x02,
539 0x02, 0xc4, 0x00, 0xbc, 0x5a, 0x02, 0x30, 0xe4,
540 0x0c, 0xc3, 0x60, 0x64, 0xc5, 0x49, 0x04, 0xf1,
541 0x74, 0x64, 0xc4, 0x48, 0x74, 0x8c, 0x06, 0xc3,
542 0x64, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x20, 0x04,
543 0x00, 0xd8, 0x00, 0xe4, 0xb2, 0xc0, 0x00, 0x61,
544 0x90, 0x49, 0x09, 0xf1, 0x8b, 0xc6, 0xca, 0x61,
545 0x94, 0x49, 0x0e, 0xf1, 0xf6, 0xc6, 0xda, 0x60,
546 0x81, 0x49, 0x0a, 0xf0, 0x65, 0x60, 0x03, 0x48,
547 0x65, 0x88, 0xef, 0xc6, 0xdc, 0x60, 0x80, 0x48,
548 0xdc, 0x88, 0x05, 0xc6, 0x00, 0xbe, 0x02, 0xc6,
549 0x00, 0xbe, 0x36, 0x13, 0x4c, 0x17, 0x99, 0xc4,
550 0x80, 0x65, 0xd0, 0x49, 0x04, 0xf1, 0xfa, 0x75,
551 0x04, 0xc4, 0x00, 0xbc, 0x03, 0xc4, 0x00, 0xbc,
552 0x9a, 0x00, 0xee, 0x01 };
553
554 static u16 r8153_usb_patch_b_bp[] = {
555 0xfc26, 0xa000, 0xfc28, 0x180c, 0xfc2a, 0x0506, 0xfc2c, 0x04E0,
556 0xfc2e, 0x11E4, 0xfc30, 0x125C, 0xfc32, 0x0232, 0xfc34, 0x131E,
557 0xfc36, 0x0098, 0xfc38, 0x00FF };
558
559 static u8 r8153_pla_patch_b[] = {
560 0x08, 0xe0, 0xea, 0xe0, 0xf2, 0xe0, 0x04, 0xe1,
561 0x09, 0xe1, 0x0e, 0xe1, 0x46, 0xe1, 0xf3, 0xe1,
562 0x14, 0xc2, 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b,
563 0x11, 0xc2, 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0,
564 0xbf, 0x49, 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd,
565 0xb1, 0x49, 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b,
566 0x02, 0xc2, 0x00, 0xba, 0x1a, 0x17, 0x00, 0xe0,
567 0x1e, 0xfc, 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8,
568 0x00, 0x80, 0x00, 0x20, 0x2c, 0x75, 0xd4, 0x49,
569 0x12, 0xf1, 0x32, 0xe0, 0xf8, 0xc2, 0x46, 0x71,
570 0xf7, 0xc2, 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1,
571 0xf5, 0xc7, 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30,
572 0x26, 0x62, 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72,
573 0xa0, 0x49, 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f,
574 0x97, 0x30, 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75,
575 0x3c, 0xc3, 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1,
576 0xdc, 0x21, 0xbc, 0x25, 0x30, 0xc6, 0xc0, 0x77,
577 0x04, 0x13, 0x21, 0xf0, 0x03, 0x13, 0x22, 0xf0,
578 0x02, 0x13, 0x23, 0xf0, 0x01, 0x13, 0x24, 0xf0,
579 0x08, 0x13, 0x08, 0xf1, 0x2e, 0x73, 0xba, 0x21,
580 0xbd, 0x25, 0x05, 0x13, 0x03, 0xf1, 0x24, 0xc5,
581 0x00, 0xbd, 0xd4, 0x49, 0x03, 0xf1, 0x1c, 0xc5,
582 0x00, 0xbd, 0xc4, 0xc6, 0xc6, 0x67, 0x2e, 0x75,
583 0xd7, 0x22, 0xdd, 0x26, 0x05, 0x15, 0x1b, 0xf0,
584 0x14, 0xc6, 0x00, 0xbe, 0x13, 0xc5, 0x00, 0xbd,
585 0x12, 0xc5, 0x00, 0xbd, 0xf1, 0x49, 0xfb, 0xf1,
586 0xef, 0xe7, 0xf4, 0x49, 0xfa, 0xf1, 0xec, 0xe7,
587 0xf3, 0x49, 0xf7, 0xf1, 0xe9, 0xe7, 0xf2, 0x49,
588 0xf4, 0xf1, 0xe6, 0xe7, 0xb6, 0xc0, 0x9e, 0x12,
589 0xde, 0x11, 0x0a, 0x12, 0x3c, 0x13, 0x00, 0xa0,
590 0xa0, 0xd1, 0x00, 0x00, 0xc0, 0x75, 0xd0, 0x49,
591 0x46, 0xf0, 0x26, 0x72, 0xa7, 0x49, 0x43, 0xf0,
592 0x22, 0x72, 0x25, 0x25, 0x20, 0x1f, 0x97, 0x30,
593 0x91, 0x30, 0x40, 0x73, 0xf3, 0xc4, 0x1c, 0x40,
594 0x04, 0xf0, 0xd7, 0x49, 0x05, 0xf1, 0x37, 0xe0,
595 0x53, 0x48, 0xc0, 0x9d, 0x08, 0x02, 0x40, 0x66,
596 0x64, 0x27, 0x06, 0x16, 0x30, 0xf1, 0x46, 0x63,
597 0x3b, 0x13, 0x2d, 0xf1, 0x34, 0x9b, 0x18, 0x1b,
598 0x93, 0x30, 0x2b, 0xc3, 0x10, 0x1c, 0x2b, 0xe8,
599 0x01, 0x14, 0x25, 0xf1, 0x00, 0x1d, 0x26, 0x1a,
600 0x8a, 0x30, 0x22, 0x73, 0xb5, 0x25, 0x0e, 0x0b,
601 0x00, 0x1c, 0x2c, 0xe8, 0x1f, 0xc7, 0x27, 0x40,
602 0x1a, 0xf1, 0x38, 0xe8, 0x32, 0x1f, 0x8f, 0x30,
603 0x08, 0x1b, 0x24, 0xe8, 0x36, 0x72, 0x46, 0x77,
604 0x00, 0x17, 0x0d, 0xf0, 0x13, 0xc3, 0x1f, 0x40,
605 0x03, 0xf1, 0x00, 0x1f, 0x46, 0x9f, 0x44, 0x77,
606 0x9f, 0x44, 0x5f, 0x44, 0x17, 0xe8, 0x0a, 0xc7,
607 0x27, 0x40, 0x05, 0xf1, 0x02, 0xc3, 0x00, 0xbb,
608 0xfa, 0x18, 0xb0, 0x18, 0xff, 0xc7, 0x00, 0xbf,
609 0xb8, 0xcd, 0xff, 0xff, 0x02, 0x0c, 0x54, 0xa5,
610 0xdc, 0xa5, 0x2f, 0x40, 0x05, 0xf1, 0x00, 0x14,
611 0xfa, 0xf1, 0x01, 0x1c, 0x02, 0xe0, 0x00, 0x1c,
612 0x80, 0xff, 0xb0, 0x49, 0x04, 0xf0, 0x01, 0x0b,
613 0xd3, 0xa1, 0x03, 0xe0, 0x02, 0x0b, 0xd3, 0xa5,
614 0x27, 0x31, 0x20, 0x37, 0x02, 0x0b, 0xd3, 0xa5,
615 0x27, 0x31, 0x20, 0x37, 0x00, 0x13, 0xfb, 0xf1,
616 0x80, 0xff, 0x22, 0x73, 0xb5, 0x25, 0x18, 0x1e,
617 0xde, 0x30, 0xd9, 0x30, 0x64, 0x72, 0x11, 0x1e,
618 0x68, 0x23, 0x16, 0x31, 0x80, 0xff, 0x08, 0xc2,
619 0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b, 0x06, 0xff,
620 0x02, 0xc6, 0x00, 0xbe, 0x08, 0x16, 0x1e, 0xfc,
621 0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13,
622 0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0, 0x02, 0x13,
623 0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0, 0x08, 0x13,
624 0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb, 0x03, 0xc3,
625 0x00, 0xbb, 0x8c, 0x15, 0x76, 0x15, 0xa0, 0x64,
626 0x40, 0x48, 0xa0, 0x8c, 0x02, 0xc4, 0x00, 0xbc,
627 0x82, 0x00, 0xa0, 0x62, 0x21, 0x48, 0xa0, 0x8a,
628 0x02, 0xc2, 0x00, 0xba, 0x40, 0x03, 0x33, 0xc5,
629 0xa0, 0x74, 0xc0, 0x49, 0x1f, 0xf0, 0x30, 0xc5,
630 0xa0, 0x73, 0x00, 0x13, 0x04, 0xf1, 0xa2, 0x73,
631 0x00, 0x13, 0x14, 0xf0, 0x28, 0xc5, 0xa0, 0x74,
632 0xc8, 0x49, 0x1b, 0xf1, 0x26, 0xc5, 0xa0, 0x76,
633 0xa2, 0x74, 0x01, 0x06, 0x20, 0x37, 0xa0, 0x9e,
634 0xa2, 0x9c, 0x1e, 0xc5, 0xa2, 0x73, 0x23, 0x40,
635 0x10, 0xf8, 0x04, 0xf3, 0xa0, 0x73, 0x33, 0x40,
636 0x0c, 0xf8, 0x15, 0xc5, 0xa0, 0x74, 0x41, 0x48,
637 0xa0, 0x9c, 0x14, 0xc5, 0xa0, 0x76, 0x62, 0x48,
638 0xe0, 0x48, 0xa0, 0x9e, 0x10, 0xc6, 0x00, 0xbe,
639 0x0a, 0xc5, 0xa0, 0x74, 0x48, 0x48, 0xa0, 0x9c,
640 0x0b, 0xc5, 0x20, 0x1e, 0xa0, 0x9e, 0xe5, 0x48,
641 0xa0, 0x9e, 0xf0, 0xe7, 0xbc, 0xc0, 0xc8, 0xd2,
642 0xcc, 0xd2, 0x28, 0xe4, 0xe6, 0x01, 0xf0, 0xc0,
643 0x18, 0x89, 0x00, 0x1d, 0x3c, 0xc3, 0x60, 0x71,
644 0x3c, 0xc0, 0x02, 0x99, 0x00, 0x61, 0x67, 0x11,
645 0x3c, 0xf1, 0x69, 0x33, 0x35, 0xc0, 0x28, 0x40,
646 0xf6, 0xf1, 0x34, 0xc0, 0x00, 0x19, 0x81, 0x1b,
647 0x8c, 0xe8, 0x31, 0xc0, 0x04, 0x1a, 0x84, 0x1b,
648 0x88, 0xe8, 0x7d, 0xe8, 0xa3, 0x49, 0xfe, 0xf0,
649 0x2b, 0xc0, 0x79, 0xe8, 0xa1, 0x48, 0x28, 0xc0,
650 0x84, 0x1b, 0x7f, 0xe8, 0x00, 0x1d, 0x69, 0x33,
651 0x00, 0x1e, 0x01, 0x06, 0xff, 0x18, 0x30, 0x40,
652 0xfd, 0xf1, 0x18, 0xc0, 0x00, 0x76, 0x2e, 0x40,
653 0xf7, 0xf1, 0x21, 0x48, 0x19, 0xc0, 0x84, 0x1b,
654 0x70, 0xe8, 0x79, 0xc0, 0x64, 0xe8, 0xa1, 0x49,
655 0xfd, 0xf0, 0x11, 0xc0, 0x00, 0x1a, 0x84, 0x1b,
656 0x68, 0xe8, 0x5d, 0xe8, 0xa5, 0x49, 0xfe, 0xf0,
657 0x09, 0xc0, 0x01, 0x19, 0x81, 0x1b, 0x61, 0xe8,
658 0x4f, 0xe0, 0x88, 0xd3, 0x8c, 0xd3, 0xb8, 0x0b,
659 0x50, 0xe8, 0x20, 0xb4, 0x10, 0xd8, 0x84, 0xd4,
660 0xfc, 0xc0, 0x00, 0x61, 0x9c, 0x20, 0x9c, 0x24,
661 0x06, 0x11, 0x06, 0xf1, 0x60, 0xc0, 0x00, 0x61,
662 0x11, 0x48, 0x00, 0x89, 0x3d, 0xe0, 0x00, 0x11,
663 0x02, 0xf1, 0x03, 0xe0, 0x04, 0x11, 0x06, 0xf1,
664 0x56, 0xc0, 0x00, 0x61, 0x92, 0x48, 0x00, 0x89,
665 0x33, 0xe0, 0x05, 0x11, 0x08, 0xf1, 0x4f, 0xc0,
666 0x00, 0x61, 0x91, 0x49, 0x04, 0xf0, 0x91, 0x48,
667 0x00, 0x89, 0x11, 0xe0, 0xde, 0xc0, 0x00, 0x61,
668 0x98, 0x20, 0x98, 0x24, 0x25, 0x11, 0x24, 0xf1,
669 0x45, 0xc0, 0x29, 0xe8, 0x95, 0x49, 0x20, 0xf0,
670 0xd4, 0xc0, 0x00, 0x61, 0x98, 0x20, 0x98, 0x24,
671 0x25, 0x11, 0x1a, 0xf1, 0x38, 0xc0, 0x00, 0x61,
672 0x92, 0x49, 0x16, 0xf1, 0x12, 0x48, 0x00, 0x89,
673 0x30, 0xc0, 0x00, 0x19, 0x00, 0x89, 0x2e, 0xc0,
674 0x01, 0x89, 0x2e, 0xc0, 0x04, 0x19, 0x81, 0x1b,
675 0x1c, 0xe8, 0x2b, 0xc0, 0x14, 0x19, 0x81, 0x1b,
676 0x18, 0xe8, 0x22, 0xc0, 0x0c, 0xe8, 0x20, 0xc0,
677 0x12, 0x48, 0x81, 0x1b, 0x12, 0xe8, 0xb3, 0xc3,
678 0x62, 0x71, 0xb3, 0xc0, 0x02, 0x99, 0x02, 0xc0,
679 0x00, 0xb8, 0x96, 0x07, 0x13, 0xc4, 0x84, 0x98,
680 0x00, 0x1b, 0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49,
681 0xfe, 0xf1, 0x80, 0x71, 0x82, 0x72, 0x80, 0xff,
682 0x09, 0xc4, 0x84, 0x98, 0x80, 0x99, 0x82, 0x9a,
683 0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1,
684 0x80, 0xff, 0x08, 0xea, 0x10, 0xd4, 0x30, 0xd4,
685 0x10, 0xc0, 0x12, 0xe8, 0x8a, 0xd3, 0x28, 0xe4,
686 0x2c, 0xe4, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00,
687 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
688
689 static u16 r8153_pla_patch_b_bp[] = {
690 0xfc26, 0x8000, 0xfc28, 0x1154, 0xfc2a, 0x1606, 0xfc2c, 0x155a,
691 0xfc2e, 0x0080, 0xfc30, 0x033c, 0xfc32, 0x01a0, 0xfc34, 0x0794,
692 0xfc36, 0x0000, 0xfc38, 0x007f };
693
694 static u16 r8153_ram_code_d[] = {
695 0xa436, 0xb820, 0xa438, 0x0290, 0xa436, 0xa012, 0xa438, 0x0000,
696 0xa436, 0xa014, 0xa438, 0x2c04, 0xb438, 0x2c07, 0xb438, 0x2c07,
697 0xb438, 0x2c07, 0xb438, 0xa240, 0xb438, 0xa104, 0xb438, 0x2944,
698 0xa436, 0xa01a, 0xa438, 0x0000, 0xa436, 0xa006, 0xa438, 0x0fff,
699 0xa436, 0xa004, 0xa438, 0x0fff, 0xa436, 0xa002, 0xa438, 0x0fff,
700 0xa436, 0xa000, 0xa438, 0x1943, 0xa436, 0xb820, 0xa438, 0x0210 };
701
702 static u8 usb_patch_d[] = {
703 0x08, 0xe0, 0x0a, 0xe0, 0x0c, 0xe0, 0x1f, 0xe0,
704 0x28, 0xe0, 0x2a, 0xe0, 0x2c, 0xe0, 0x2e, 0xe0,
705 0x02, 0xc5, 0x00, 0xbd, 0x00, 0x00, 0x02, 0xc3,
706 0x00, 0xbb, 0x00, 0x00, 0x30, 0x18, 0x11, 0xc1,
707 0x05, 0xe8, 0x10, 0xc6, 0x02, 0xc2, 0x00, 0xba,
708 0x94, 0x17, 0x02, 0xb4, 0x09, 0xc2, 0x40, 0x99,
709 0x0e, 0x48, 0x42, 0x98, 0x42, 0x70, 0x8e, 0x49,
710 0xfe, 0xf1, 0x02, 0xb0, 0x80, 0xff, 0xc0, 0xd4,
711 0xe4, 0x40, 0x20, 0xd4, 0xb0, 0x49, 0x04, 0xf0,
712 0x30, 0x18, 0x06, 0xc1, 0xef, 0xef, 0xfa, 0xc7,
713 0x02, 0xc0, 0x00, 0xb8, 0x38, 0x12, 0xe4, 0x4b,
714 0x02, 0xc3, 0x00, 0xbb, 0x00, 0x00, 0x02, 0xc5,
715 0x00, 0xbd, 0x00, 0x00, 0x02, 0xc1, 0x00, 0xb9,
716 0x00, 0x00, 0x02, 0xc1, 0x00, 0xb9, 0x00, 0x00 };
717
718 static u16 r8153_usb_patch_d_bp[] = {
719 0xfc26, 0xa000, 0xfc28, 0x0000, 0xfc2a, 0x0000, 0xfc2c, 0x1792,
720 0xfc2e, 0x1236, 0xfc30, 0x0000, 0xfc32, 0x0000, 0xfc34, 0x0000,
721 0xfc36, 0x0000, 0xfc38, 0x000c };
722
rtl_clear_bp(struct r8152 * tp)723 static void rtl_clear_bp(struct r8152 *tp)
724 {
725 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_0, 0);
726 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_2, 0);
727 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_4, 0);
728 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_6, 0);
729 ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_0, 0);
730 ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_2, 0);
731 ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_4, 0);
732 ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_6, 0);
733
734 mdelay(6);
735
736 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_BA, 0);
737 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_BA, 0);
738 }
739
r8153_clear_bp(struct r8152 * tp)740 static void r8153_clear_bp(struct r8152 *tp)
741 {
742 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
743 ocp_write_byte(tp, MCU_TYPE_USB, USB_BP_EN, 0);
744 rtl_clear_bp(tp);
745 }
746
r8152b_set_dq_desc(struct r8152 * tp)747 static void r8152b_set_dq_desc(struct r8152 *tp)
748 {
749 u8 data;
750
751 data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
752 data |= 0x80;
753 ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
754 ocp_write_word(tp, MCU_TYPE_USB, 0xc0ce, 0x0210);
755 data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
756 data &= ~0x80;
757 ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
758 }
759
r8153_pre_ram_code(struct r8152 * tp,u16 patch_key)760 static int r8153_pre_ram_code(struct r8152 *tp, u16 patch_key)
761 {
762 u16 data;
763 int i;
764
765 data = ocp_reg_read(tp, 0xb820);
766 data |= 0x0010;
767 ocp_reg_write(tp, 0xb820, data);
768
769 for (i = 0, data = 0; !data && i < 5000; i++) {
770 mdelay(2);
771 data = ocp_reg_read(tp, 0xb800) & 0x0040;
772 }
773
774 sram_write(tp, 0x8146, patch_key);
775 sram_write(tp, 0xb82e, 0x0001);
776
777 return -EBUSY;
778 }
779
r8153_post_ram_code(struct r8152 * tp)780 static int r8153_post_ram_code(struct r8152 *tp)
781 {
782 u16 data;
783
784 sram_write(tp, 0x0000, 0x0000);
785
786 data = ocp_reg_read(tp, 0xb82e);
787 data &= ~0x0001;
788 ocp_reg_write(tp, 0xb82e, data);
789
790 sram_write(tp, 0x8146, 0x0000);
791
792 data = ocp_reg_read(tp, 0xb820);
793 data &= ~0x0010;
794 ocp_reg_write(tp, 0xb820, data);
795
796 ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base);
797
798 return 0;
799 }
800
r8153_wdt1_end(struct r8152 * tp)801 static void r8153_wdt1_end(struct r8152 *tp)
802 {
803 int i;
804
805 for (i = 0; i < 104; i++) {
806 if (!(ocp_read_byte(tp, MCU_TYPE_USB, 0xe404) & 1))
807 break;
808 mdelay(2);
809 }
810 }
811
r8152b_firmware(struct r8152 * tp)812 void r8152b_firmware(struct r8152 *tp)
813 {
814 int i;
815
816 if (tp->version == RTL_VER_01) {
817 int i;
818
819 r8152b_set_dq_desc(tp);
820 rtl_clear_bp(tp);
821
822 generic_ocp_write(tp, 0xf800, 0x3f,
823 sizeof(r8152b_pla_patch_a),
824 r8152b_pla_patch_a, MCU_TYPE_PLA);
825
826 for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a_bp); i += 2)
827 ocp_write_word(tp, MCU_TYPE_PLA,
828 r8152b_pla_patch_a_bp[i],
829 r8152b_pla_patch_a_bp[i+1]);
830
831 ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, 0x2000);
832 ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7070);
833 ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0600);
834 for (i = 0; i < ARRAY_SIZE(r8152b_ram_code1); i++)
835 ocp_write_word(tp, MCU_TYPE_PLA, 0xb09a,
836 r8152b_ram_code1[i]);
837
838 ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0200);
839 ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7030);
840 } else if (tp->version == RTL_VER_02) {
841 rtl_clear_bp(tp);
842
843 generic_ocp_write(tp, 0xf800, 0xff,
844 sizeof(r8152b_pla_patch_a2),
845 r8152b_pla_patch_a2, MCU_TYPE_PLA);
846
847 for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a2_bp);
848 i += 2)
849 ocp_write_word(tp, MCU_TYPE_PLA,
850 r8152b_pla_patch_a2_bp[i],
851 r8152b_pla_patch_a2_bp[i+1]);
852 }
853 }
854
r8153_firmware(struct r8152 * tp)855 void r8153_firmware(struct r8152 *tp)
856 {
857 int i;
858
859 if (tp->version == RTL_VER_03) {
860 r8153_clear_bp(tp);
861
862 r8153_pre_ram_code(tp, 0x7000);
863
864 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_a); i += 2)
865 ocp_write_word(tp, MCU_TYPE_PLA,
866 r8153_ram_code_a[i],
867 r8153_ram_code_a[i+1]);
868
869 r8153_post_ram_code(tp);
870 } else if (tp->version == RTL_VER_04) {
871 r8153_pre_ram_code(tp, 0x7001);
872
873 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
874 ocp_write_word(tp, MCU_TYPE_PLA,
875 r8153_ram_code_bc[i],
876 r8153_ram_code_bc[i+1]);
877
878 r8153_post_ram_code(tp);
879
880 r8153_wdt1_end(tp);
881 r8153_clear_bp(tp);
882
883 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
884 generic_ocp_write(tp, 0xf800, 0xff,
885 sizeof(r8153_usb_patch_b),
886 r8153_usb_patch_b, MCU_TYPE_USB);
887
888 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_b_bp); i += 2)
889 ocp_write_word(tp, MCU_TYPE_USB,
890 r8153_usb_patch_b_bp[i],
891 r8153_usb_patch_b_bp[i+1]);
892
893 if (!(ocp_read_word(tp, MCU_TYPE_PLA, 0xd38e) & BIT(0))) {
894 ocp_write_word(tp, MCU_TYPE_PLA, 0xd38c, 0x0082);
895 ocp_write_word(tp, MCU_TYPE_PLA, 0xd38e, 0x0082);
896 }
897
898 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
899 generic_ocp_write(tp, 0xf800, 0xff,
900 sizeof(r8153_pla_patch_b),
901 r8153_pla_patch_b, MCU_TYPE_PLA);
902
903 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_b_bp); i += 2)
904 ocp_write_word(tp, MCU_TYPE_PLA,
905 r8153_pla_patch_b_bp[i],
906 r8153_pla_patch_b_bp[i+1]);
907
908 ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
909 } else if (tp->version == RTL_VER_05) {
910 u32 ocp_data;
911
912 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
913 ocp_data &= ~0x4000;
914 ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
915
916 r8153_pre_ram_code(tp, 0x7001);
917
918 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
919 ocp_write_word(tp, MCU_TYPE_PLA,
920 r8153_ram_code_bc[i],
921 r8153_ram_code_bc[i+1]);
922
923 r8153_post_ram_code(tp);
924
925 r8153_wdt1_end(tp);
926 r8153_clear_bp(tp);
927
928 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
929 generic_ocp_write(tp, 0xf800, 0xff,
930 sizeof(r8153_usb_patch_c),
931 r8153_usb_patch_c, MCU_TYPE_USB);
932
933 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_c_bp); i += 2)
934 ocp_write_word(tp, MCU_TYPE_USB,
935 r8153_usb_patch_c_bp[i],
936 r8153_usb_patch_c_bp[i+1]);
937
938 if (ocp_read_byte(tp, MCU_TYPE_USB, 0xcfef) & 1) {
939 ocp_write_word(tp, MCU_TYPE_USB, 0xfc30, 0x1578);
940 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ff);
941 } else {
942 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ef);
943 }
944
945 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
946 generic_ocp_write(tp, 0xf800, 0xff,
947 sizeof(r8153_pla_patch_c),
948 r8153_pla_patch_c, MCU_TYPE_PLA);
949
950 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_c_bp); i += 2)
951 ocp_write_word(tp, MCU_TYPE_PLA,
952 r8153_pla_patch_c_bp[i],
953 r8153_pla_patch_c_bp[i+1]);
954
955 ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
956
957 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
958 ocp_data |= 0x4000;
959 ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
960 } else if (tp->version == RTL_VER_06) {
961 r8153_pre_ram_code(tp, 0x7002);
962
963 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_d); i += 2)
964 ocp_write_word(tp, MCU_TYPE_PLA,
965 r8153_ram_code_d[i],
966 r8153_ram_code_d[i+1]);
967
968 r8153_post_ram_code(tp);
969
970 r8153_clear_bp(tp);
971
972 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
973 generic_ocp_write(tp, 0xf800, 0xff, sizeof(usb_patch_d),
974 usb_patch_d, MCU_TYPE_USB);
975
976 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_d_bp); i += 2)
977 ocp_write_word(tp, MCU_TYPE_USB,
978 r8153_usb_patch_d_bp[i],
979 r8153_usb_patch_d_bp[i+1]);
980 }
981 }
982