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