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