4bf4066d7a49bdadd52eb07da43cacf7ddbef670
[oweals/u-boot.git] / drivers / usb / eth / r8152_fw.c
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 }