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