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