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