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