Merge https://gitlab.denx.de/u-boot/custodians/u-boot-spi into next
[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         0xfc26, 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, 0x58, 0xe0,
325         0x64, 0xe0, 0x79, 0xe0, 0xab, 0xe0, 0xb6, 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, 0x65, 0xc6, 0x66, 0x61,
330         0x92, 0x49, 0x12, 0xf1, 0x3e, 0xc0, 0x02, 0x61,
331         0x97, 0x49, 0x05, 0xf0, 0x3c, 0xc0, 0x00, 0x61,
332         0x90, 0x49, 0x0a, 0xf1, 0xca, 0x63, 0xb0, 0x49,
333         0x09, 0xf1, 0xb1, 0x49, 0x05, 0xf0, 0x32, 0xc0,
334         0x00, 0x71, 0x9e, 0x49, 0x03, 0xf1, 0xb0, 0x48,
335         0x05, 0xe0, 0x30, 0x48, 0xda, 0x61, 0x10, 0x48,
336         0xda, 0x89, 0x4a, 0xc6, 0xc0, 0x60, 0x85, 0x49,
337         0x03, 0xf0, 0x31, 0x48, 0x04, 0xe0, 0xb1, 0x48,
338         0xb2, 0x48, 0x0f, 0xe0, 0x30, 0x18, 0x1b, 0xc1,
339         0x0f, 0xe8, 0x1a, 0xc6, 0xc7, 0x65, 0xd0, 0x49,
340         0x05, 0xf0, 0x32, 0x48, 0x02, 0xc2, 0x00, 0xba,
341         0x3e, 0x16, 0x02, 0xc2, 0x00, 0xba, 0x48, 0x16,
342         0x02, 0xc2, 0x00, 0xba, 0x4a, 0x16, 0x02, 0xb4,
343         0x09, 0xc2, 0x40, 0x99, 0x0e, 0x48, 0x42, 0x98,
344         0x42, 0x70, 0x8e, 0x49, 0xfe, 0xf1, 0x02, 0xb0,
345         0x80, 0xff, 0xc0, 0xd4, 0xe4, 0x40, 0x20, 0xd4,
346         0xca, 0xcf, 0x00, 0xcf, 0x3c, 0xe4, 0x0c, 0xc0,
347         0x00, 0x63, 0xb5, 0x49, 0x09, 0xc0, 0x30, 0x18,
348         0x06, 0xc1, 0xea, 0xef, 0xf5, 0xc7, 0x02, 0xc0,
349         0x00, 0xb8, 0xd0, 0x10, 0xe4, 0x4b, 0x00, 0xd8,
350         0x14, 0xc3, 0x60, 0x61, 0x90, 0x49, 0x06, 0xf0,
351         0x11, 0xc3, 0x70, 0x61, 0x12, 0x48, 0x70, 0x89,
352         0x08, 0xe0, 0x0a, 0xc6, 0xd4, 0x61, 0x93, 0x48,
353         0xd4, 0x89, 0x02, 0xc1, 0x00, 0xb9, 0x72, 0x17,
354         0x02, 0xc1, 0x00, 0xb9, 0x9c, 0x15, 0x00, 0xd8,
355         0xef, 0xcf, 0x20, 0xd4, 0x30, 0x18, 0xe7, 0xc1,
356         0xcb, 0xef, 0x2b, 0xc5, 0xa0, 0x77, 0x00, 0x1c,
357         0xa0, 0x9c, 0x28, 0xc5, 0xa0, 0x64, 0xc0, 0x48,
358         0xc1, 0x48, 0xc2, 0x48, 0xa0, 0x8c, 0xb1, 0x64,
359         0xc0, 0x48, 0xb1, 0x8c, 0x20, 0xc5, 0xa0, 0x64,
360         0x40, 0x48, 0x41, 0x48, 0xc2, 0x48, 0xa0, 0x8c,
361         0x19, 0xc5, 0xa4, 0x64, 0x44, 0x48, 0xa4, 0x8c,
362         0xb1, 0x64, 0x40, 0x48, 0xb1, 0x8c, 0x14, 0xc4,
363         0x80, 0x73, 0x13, 0xc4, 0x82, 0x9b, 0x11, 0x1b,
364         0x80, 0x9b, 0x0c, 0xc5, 0xa0, 0x64, 0x40, 0x48,
365         0x41, 0x48, 0x42, 0x48, 0xa0, 0x8c, 0x05, 0xc5,
366         0xa0, 0x9f, 0x02, 0xc5, 0x00, 0xbd, 0x6c, 0x3a,
367         0x1e, 0xfc, 0x10, 0xd8, 0x86, 0xd4, 0xf8, 0xcb,
368         0x20, 0xe4, 0x0a, 0xc0, 0x16, 0x61, 0x91, 0x48,
369         0x16, 0x89, 0x07, 0xc0, 0x11, 0x19, 0x0c, 0x89,
370         0x02, 0xc1, 0x00, 0xb9, 0x02, 0x06, 0x00, 0xd4,
371         0x40, 0xb4, 0xfe, 0xc0, 0x16, 0x61, 0x91, 0x48,
372         0x16, 0x89, 0xfb, 0xc0, 0x11, 0x19, 0x0c, 0x89,
373         0x02, 0xc1, 0x00, 0xb9, 0xd2, 0x05, 0x00, 0x00 };
374
375 static u16 r8153_usb_patch_c_bp[] = {
376         0xfc26, 0xa000, 0xfc28, 0x3b34, 0xfc2a, 0x027c, 0xfc2c, 0x15de,
377         0xfc2e, 0x10ce, 0xfc30, 0x1adc, 0xfc32, 0x3a28, 0xfc34, 0x05f8,
378         0xfc36, 0x05c8, 0xfc38, 0x00f3 };
379
380 static u8 r8153_pla_patch_c[] = {
381         0x5d, 0xe0, 0x07, 0xe0, 0x0f, 0xe0, 0x5a, 0xe0,
382         0x59, 0xe0, 0x1f, 0xe0, 0x57, 0xe0, 0x3e, 0xe1,
383         0x08, 0xc2, 0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b,
384         0x06, 0xff, 0x02, 0xc6, 0x00, 0xbe, 0xcc, 0x17,
385         0x1e, 0xfc, 0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25,
386         0x04, 0x13, 0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0,
387         0x02, 0x13, 0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0,
388         0x08, 0x13, 0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb,
389         0x03, 0xc3, 0x00, 0xbb, 0x50, 0x17, 0x3a, 0x17,
390         0x33, 0xc5, 0xa0, 0x74, 0xc0, 0x49, 0x1f, 0xf0,
391         0x30, 0xc5, 0xa0, 0x73, 0x00, 0x13, 0x04, 0xf1,
392         0xa2, 0x73, 0x00, 0x13, 0x14, 0xf0, 0x28, 0xc5,
393         0xa0, 0x74, 0xc8, 0x49, 0x1b, 0xf1, 0x26, 0xc5,
394         0xa0, 0x76, 0xa2, 0x74, 0x01, 0x06, 0x20, 0x37,
395         0xa0, 0x9e, 0xa2, 0x9c, 0x1e, 0xc5, 0xa2, 0x73,
396         0x23, 0x40, 0x10, 0xf8, 0x04, 0xf3, 0xa0, 0x73,
397         0x33, 0x40, 0x0c, 0xf8, 0x15, 0xc5, 0xa0, 0x74,
398         0x41, 0x48, 0xa0, 0x9c, 0x14, 0xc5, 0xa0, 0x76,
399         0x62, 0x48, 0xe0, 0x48, 0xa0, 0x9e, 0x10, 0xc6,
400         0x00, 0xbe, 0x0a, 0xc5, 0xa0, 0x74, 0x48, 0x48,
401         0xa0, 0x9c, 0x0b, 0xc5, 0x20, 0x1e, 0xa0, 0x9e,
402         0xe5, 0x48, 0xa0, 0x9e, 0xf0, 0xe7, 0xbc, 0xc0,
403         0xc8, 0xd2, 0xcc, 0xd2, 0x28, 0xe4, 0xfa, 0x01,
404         0xf0, 0xc0, 0x18, 0x89, 0x74, 0xc0, 0xcd, 0xe8,
405         0x80, 0x76, 0x00, 0x1d, 0x6e, 0xc3, 0x66, 0x62,
406         0xa0, 0x49, 0x06, 0xf0, 0x64, 0xc0, 0x02, 0x71,
407         0x60, 0x99, 0x62, 0xc1, 0x03, 0xe0, 0x5f, 0xc0,
408         0x60, 0xc1, 0x02, 0x99, 0x00, 0x61, 0x0f, 0x1b,
409         0x59, 0x41, 0x03, 0x13, 0x18, 0xf1, 0xe4, 0x49,
410         0x20, 0xf1, 0xe5, 0x49, 0x1e, 0xf0, 0x59, 0xc6,
411         0xd0, 0x73, 0xb7, 0x49, 0x08, 0xf0, 0x01, 0x0b,
412         0x80, 0x13, 0x03, 0xf0, 0xd0, 0x8b, 0x03, 0xe0,
413         0x3f, 0x48, 0xd0, 0x9b, 0x51, 0xc0, 0x10, 0x1a,
414         0x84, 0x1b, 0xb1, 0xe8, 0x4b, 0xc2, 0x40, 0x63,
415         0x30, 0x48, 0x0a, 0xe0, 0xe5, 0x49, 0x09, 0xf0,
416         0x47, 0xc0, 0x00, 0x1a, 0x84, 0x1b, 0xa7, 0xe8,
417         0x41, 0xc2, 0x40, 0x63, 0xb0, 0x48, 0x40, 0x8b,
418         0x67, 0x11, 0x3f, 0xf1, 0x69, 0x33, 0x32, 0xc0,
419         0x28, 0x40, 0xd2, 0xf1, 0x33, 0xc0, 0x00, 0x19,
420         0x81, 0x1b, 0x99, 0xe8, 0x30, 0xc0, 0x04, 0x1a,
421         0x84, 0x1b, 0x95, 0xe8, 0x8a, 0xe8, 0xa3, 0x49,
422         0xfe, 0xf0, 0x2a, 0xc0, 0x86, 0xe8, 0xa1, 0x48,
423         0x84, 0x1b, 0x8d, 0xe8, 0x00, 0x1d, 0x69, 0x33,
424         0x00, 0x1e, 0x01, 0x06, 0xff, 0x18, 0x30, 0x40,
425         0xfd, 0xf1, 0x1f, 0xc0, 0x00, 0x76, 0x2e, 0x40,
426         0xf7, 0xf1, 0x21, 0x48, 0x19, 0xc0, 0x84, 0x1b,
427         0x7e, 0xe8, 0x74, 0x08, 0x72, 0xe8, 0xa1, 0x49,
428         0xfd, 0xf0, 0x11, 0xc0, 0x00, 0x1a, 0x84, 0x1b,
429         0x76, 0xe8, 0x6b, 0xe8, 0xa5, 0x49, 0xfe, 0xf0,
430         0x09, 0xc0, 0x01, 0x19, 0x81, 0x1b, 0x6f, 0xe8,
431         0x5a, 0xe0, 0xb8, 0x0b, 0x50, 0xe8, 0x83, 0x00,
432         0x82, 0x00, 0x20, 0xb4, 0x10, 0xd8, 0x84, 0xd4,
433         0x88, 0xd3, 0x10, 0xe0, 0x00, 0xd8, 0x24, 0xd4,
434         0xf9, 0xc0, 0x57, 0xe8, 0x48, 0x33, 0xf3, 0xc0,
435         0x00, 0x61, 0x6a, 0xc0, 0x47, 0x11, 0x03, 0xf0,
436         0x57, 0x11, 0x05, 0xf1, 0x00, 0x61, 0x17, 0x48,
437         0x00, 0x89, 0x41, 0xe0, 0x9c, 0x20, 0x9c, 0x24,
438         0xd0, 0x49, 0x09, 0xf0, 0x04, 0x11, 0x07, 0xf1,
439         0x00, 0x61, 0x97, 0x49, 0x38, 0xf0, 0x97, 0x48,
440         0x00, 0x89, 0x2b, 0xe0, 0x00, 0x11, 0x05, 0xf1,
441         0x00, 0x61, 0x92, 0x48, 0x00, 0x89, 0x2f, 0xe0,
442         0x06, 0x11, 0x05, 0xf1, 0x00, 0x61, 0x11, 0x48,
443         0x00, 0x89, 0x29, 0xe0, 0x05, 0x11, 0x0f, 0xf1,
444         0x00, 0x61, 0x93, 0x49, 0x1a, 0xf1, 0x91, 0x49,
445         0x0a, 0xf0, 0x91, 0x48, 0x00, 0x89, 0x0f, 0xe0,
446         0xc6, 0xc0, 0x00, 0x61, 0x98, 0x20, 0x98, 0x24,
447         0x25, 0x11, 0x80, 0xff, 0xfa, 0xef, 0x17, 0xf1,
448         0x38, 0xc0, 0x1f, 0xe8, 0x95, 0x49, 0x13, 0xf0,
449         0xf4, 0xef, 0x11, 0xf1, 0x31, 0xc0, 0x00, 0x61,
450         0x92, 0x49, 0x0d, 0xf1, 0x12, 0x48, 0x00, 0x89,
451         0x29, 0xc0, 0x00, 0x19, 0x00, 0x89, 0x27, 0xc0,
452         0x01, 0x89, 0x23, 0xc0, 0x0e, 0xe8, 0x12, 0x48,
453         0x81, 0x1b, 0x15, 0xe8, 0xae, 0xc3, 0x66, 0x62,
454         0xa0, 0x49, 0x04, 0xf0, 0x64, 0x71, 0xa3, 0xc0,
455         0x02, 0x99, 0x02, 0xc0, 0x00, 0xb8, 0xd6, 0x07,
456         0x13, 0xc4, 0x84, 0x98, 0x00, 0x1b, 0x86, 0x8b,
457         0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1, 0x80, 0x71,
458         0x82, 0x72, 0x80, 0xff, 0x09, 0xc4, 0x84, 0x98,
459         0x80, 0x99, 0x82, 0x9a, 0x86, 0x8b, 0x86, 0x73,
460         0xbf, 0x49, 0xfe, 0xf1, 0x80, 0xff, 0x08, 0xea,
461         0x30, 0xd4, 0x10, 0xc0, 0x12, 0xe8, 0x8a, 0xd3,
462         0x00, 0xd8, 0x02, 0xc6, 0x00, 0xbe, 0xe0, 0x08 };
463
464 static u16 r8153_pla_patch_c_bp[] = {
465         0xfc26, 0x8000, 0xfc28, 0x1306, 0xfc2a, 0x17ca, 0xfc2c, 0x171e,
466         0xfc2e, 0x0000, 0xfc30, 0x0000, 0xfc32, 0x01b4, 0xfc34, 0x07d4,
467         0xfc36, 0x0894, 0xfc38, 0x00e6 };
468
469 static u16 r8153_ram_code_bc[] = {
470         0xB436, 0xB820, 0xB438, 0x0290, 0xB436, 0xA012, 0xB438, 0x0000,
471         0xB436, 0xA014, 0xB438, 0x2c04, 0xB438, 0x2c07, 0xB438, 0x2c0a,
472         0xB438, 0x2c0d, 0xB438, 0xa240, 0xB438, 0xa104, 0xB438, 0x292d,
473         0xB438, 0x8620, 0xB438, 0xa480, 0xB438, 0x2a2c, 0xB438, 0x8480,
474         0xB438, 0xa101, 0xB438, 0x2a36, 0xB438, 0xd056, 0xB438, 0x2223,
475         0xB436, 0xA01A, 0xB438, 0x0000, 0xB436, 0xA006, 0xB438, 0x0222,
476         0xB436, 0xA004, 0xB438, 0x0a35, 0xB436, 0xA002, 0xB438, 0x0a2b,
477         0xB436, 0xA000, 0xB438, 0xf92c, 0xB436, 0xB820, 0xB438, 0x0210 };
478
479 static u8 r8153_usb_patch_b[] = {
480         0x08, 0xe0, 0x0f, 0xe0, 0x18, 0xe0, 0x24, 0xe0,
481         0x26, 0xe0, 0x3a, 0xe0, 0x84, 0xe0, 0x9c, 0xe0,
482         0xc2, 0x49, 0x04, 0xf0, 0x02, 0xc0, 0x00, 0xb8,
483         0x14, 0x18, 0x02, 0xc0, 0x00, 0xb8, 0x2e, 0x18,
484         0x06, 0x89, 0x08, 0xc0, 0x0c, 0x61, 0x92, 0x48,
485         0x93, 0x48, 0x0c, 0x89, 0x02, 0xc0, 0x00, 0xb8,
486         0x08, 0x05, 0x40, 0xb4, 0x16, 0x89, 0x6d, 0xc0,
487         0x00, 0x61, 0x95, 0x49, 0x06, 0xf0, 0xfa, 0xc0,
488         0x0c, 0x61, 0x92, 0x48, 0x93, 0x48, 0x0c, 0x89,
489         0x02, 0xc0, 0x00, 0xb8, 0xe2, 0x04, 0x02, 0xc2,
490         0x00, 0xba, 0xec, 0x11, 0x60, 0x60, 0x85, 0x49,
491         0x0d, 0xf1, 0x11, 0xc6, 0xd2, 0x61, 0x91, 0x49,
492         0xfd, 0xf0, 0x74, 0x60, 0x04, 0x48, 0x74, 0x88,
493         0x08, 0xc6, 0x08, 0xc0, 0xc4, 0x98, 0x01, 0x18,
494         0xc0, 0x88, 0x02, 0xc0, 0x00, 0xb8, 0x6e, 0x12,
495         0x04, 0xe4, 0x0d, 0x00, 0x00, 0xd4, 0xd1, 0x49,
496         0x3c, 0xf1, 0xd2, 0x49, 0x16, 0xf1, 0xd3, 0x49,
497         0x18, 0xf1, 0xd4, 0x49, 0x19, 0xf1, 0xd5, 0x49,
498         0x1a, 0xf1, 0xd6, 0x49, 0x1b, 0xf1, 0xd7, 0x49,
499         0x1c, 0xf1, 0xd8, 0x49, 0x1d, 0xf1, 0xd9, 0x49,
500         0x20, 0xf1, 0xda, 0x49, 0x23, 0xf1, 0xdb, 0x49,
501         0x24, 0xf1, 0x02, 0xc4, 0x00, 0xbc, 0x20, 0x04,
502         0xe5, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x14, 0x02,
503         0x02, 0xc4, 0x00, 0xbc, 0x16, 0x02, 0x02, 0xc4,
504         0x00, 0xbc, 0x18, 0x02, 0x02, 0xc4, 0x00, 0xbc,
505         0x1a, 0x02, 0x02, 0xc4, 0x00, 0xbc, 0x1c, 0x02,
506         0x02, 0xc4, 0x00, 0xbc, 0x94, 0x02, 0x10, 0xc7,
507         0xe0, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x8a, 0x02,
508         0x0b, 0xc7, 0xe4, 0x8e, 0x02, 0xc4, 0x00, 0xbc,
509         0x88, 0x02, 0x02, 0xc4, 0x00, 0xbc, 0x6e, 0x02,
510         0x02, 0xc4, 0x00, 0xbc, 0x5a, 0x02, 0x30, 0xe4,
511         0x0c, 0xc3, 0x60, 0x64, 0xc5, 0x49, 0x04, 0xf1,
512         0x74, 0x64, 0xc4, 0x48, 0x74, 0x8c, 0x06, 0xc3,
513         0x64, 0x8e, 0x02, 0xc4, 0x00, 0xbc, 0x20, 0x04,
514         0x00, 0xd8, 0x00, 0xe4, 0xb2, 0xc0, 0x00, 0x61,
515         0x90, 0x49, 0x09, 0xf1, 0x8b, 0xc6, 0xca, 0x61,
516         0x94, 0x49, 0x0e, 0xf1, 0xf6, 0xc6, 0xda, 0x60,
517         0x81, 0x49, 0x0a, 0xf0, 0x65, 0x60, 0x03, 0x48,
518         0x65, 0x88, 0xef, 0xc6, 0xdc, 0x60, 0x80, 0x48,
519         0xdc, 0x88, 0x05, 0xc6, 0x00, 0xbe, 0x02, 0xc6,
520         0x00, 0xbe, 0x36, 0x13, 0x4c, 0x17, 0x99, 0xc4,
521         0x80, 0x65, 0xd0, 0x49, 0x04, 0xf1, 0xfa, 0x75,
522         0x04, 0xc4, 0x00, 0xbc, 0x03, 0xc4, 0x00, 0xbc,
523         0x9a, 0x00, 0xee, 0x01 };
524
525 static u16 r8153_usb_patch_b_bp[] = {
526         0xfc26, 0xa000, 0xfc28, 0x180c, 0xfc2a, 0x0506, 0xfc2c, 0x04E0,
527         0xfc2e, 0x11E4, 0xfc30, 0x125C, 0xfc32, 0x0232, 0xfc34, 0x131E,
528         0xfc36, 0x0098, 0xfc38, 0x00FF };
529
530 static u8 r8153_pla_patch_b[] = {
531         0x08, 0xe0, 0xea, 0xe0, 0xf2, 0xe0, 0x04, 0xe1,
532         0x09, 0xe1, 0x0e, 0xe1, 0x46, 0xe1, 0xf7, 0xe1,
533         0x14, 0xc2, 0x40, 0x73, 0xba, 0x48, 0x40, 0x9b,
534         0x11, 0xc2, 0x40, 0x73, 0xb0, 0x49, 0x17, 0xf0,
535         0xbf, 0x49, 0x03, 0xf1, 0x09, 0xc5, 0x00, 0xbd,
536         0xb1, 0x49, 0x11, 0xf0, 0xb1, 0x48, 0x40, 0x9b,
537         0x02, 0xc2, 0x00, 0xba, 0x1a, 0x17, 0x00, 0xe0,
538         0x1e, 0xfc, 0xbc, 0xc0, 0xf0, 0xc0, 0xde, 0xe8,
539         0x00, 0x80, 0x00, 0x20, 0x2c, 0x75, 0xd4, 0x49,
540         0x12, 0xf1, 0x32, 0xe0, 0xf8, 0xc2, 0x46, 0x71,
541         0xf7, 0xc2, 0x40, 0x73, 0xbe, 0x49, 0x03, 0xf1,
542         0xf5, 0xc7, 0x02, 0xe0, 0xf2, 0xc7, 0x4f, 0x30,
543         0x26, 0x62, 0xa1, 0x49, 0xf0, 0xf1, 0x22, 0x72,
544         0xa0, 0x49, 0xed, 0xf1, 0x25, 0x25, 0x18, 0x1f,
545         0x97, 0x30, 0x91, 0x30, 0x36, 0x9a, 0x2c, 0x75,
546         0x3c, 0xc3, 0x60, 0x73, 0xb1, 0x49, 0x0d, 0xf1,
547         0xdc, 0x21, 0xbc, 0x25, 0x30, 0xc6, 0xc0, 0x77,
548         0x04, 0x13, 0x21, 0xf0, 0x03, 0x13, 0x22, 0xf0,
549         0x02, 0x13, 0x23, 0xf0, 0x01, 0x13, 0x24, 0xf0,
550         0x08, 0x13, 0x08, 0xf1, 0x2e, 0x73, 0xba, 0x21,
551         0xbd, 0x25, 0x05, 0x13, 0x03, 0xf1, 0x24, 0xc5,
552         0x00, 0xbd, 0xd4, 0x49, 0x03, 0xf1, 0x1c, 0xc5,
553         0x00, 0xbd, 0xc4, 0xc6, 0xc6, 0x67, 0x2e, 0x75,
554         0xd7, 0x22, 0xdd, 0x26, 0x05, 0x15, 0x1b, 0xf0,
555         0x14, 0xc6, 0x00, 0xbe, 0x13, 0xc5, 0x00, 0xbd,
556         0x12, 0xc5, 0x00, 0xbd, 0xf1, 0x49, 0xfb, 0xf1,
557         0xef, 0xe7, 0xf4, 0x49, 0xfa, 0xf1, 0xec, 0xe7,
558         0xf3, 0x49, 0xf7, 0xf1, 0xe9, 0xe7, 0xf2, 0x49,
559         0xf4, 0xf1, 0xe6, 0xe7, 0xb6, 0xc0, 0x9e, 0x12,
560         0xde, 0x11, 0x0a, 0x12, 0x3c, 0x13, 0x00, 0xa0,
561         0xa0, 0xd1, 0x00, 0x00, 0xc0, 0x75, 0xd0, 0x49,
562         0x46, 0xf0, 0x26, 0x72, 0xa7, 0x49, 0x43, 0xf0,
563         0x22, 0x72, 0x25, 0x25, 0x20, 0x1f, 0x97, 0x30,
564         0x91, 0x30, 0x40, 0x73, 0xf3, 0xc4, 0x1c, 0x40,
565         0x04, 0xf0, 0xd7, 0x49, 0x05, 0xf1, 0x37, 0xe0,
566         0x53, 0x48, 0xc0, 0x9d, 0x08, 0x02, 0x40, 0x66,
567         0x64, 0x27, 0x06, 0x16, 0x30, 0xf1, 0x46, 0x63,
568         0x3b, 0x13, 0x2d, 0xf1, 0x34, 0x9b, 0x18, 0x1b,
569         0x93, 0x30, 0x2b, 0xc3, 0x10, 0x1c, 0x2b, 0xe8,
570         0x01, 0x14, 0x25, 0xf1, 0x00, 0x1d, 0x26, 0x1a,
571         0x8a, 0x30, 0x22, 0x73, 0xb5, 0x25, 0x0e, 0x0b,
572         0x00, 0x1c, 0x2c, 0xe8, 0x1f, 0xc7, 0x27, 0x40,
573         0x1a, 0xf1, 0x38, 0xe8, 0x32, 0x1f, 0x8f, 0x30,
574         0x08, 0x1b, 0x24, 0xe8, 0x36, 0x72, 0x46, 0x77,
575         0x00, 0x17, 0x0d, 0xf0, 0x13, 0xc3, 0x1f, 0x40,
576         0x03, 0xf1, 0x00, 0x1f, 0x46, 0x9f, 0x44, 0x77,
577         0x9f, 0x44, 0x5f, 0x44, 0x17, 0xe8, 0x0a, 0xc7,
578         0x27, 0x40, 0x05, 0xf1, 0x02, 0xc3, 0x00, 0xbb,
579         0xfa, 0x18, 0xb0, 0x18, 0xff, 0xc7, 0x00, 0xbf,
580         0xb8, 0xcd, 0xff, 0xff, 0x02, 0x0c, 0x54, 0xa5,
581         0xdc, 0xa5, 0x2f, 0x40, 0x05, 0xf1, 0x00, 0x14,
582         0xfa, 0xf1, 0x01, 0x1c, 0x02, 0xe0, 0x00, 0x1c,
583         0x80, 0xff, 0xb0, 0x49, 0x04, 0xf0, 0x01, 0x0b,
584         0xd3, 0xa1, 0x03, 0xe0, 0x02, 0x0b, 0xd3, 0xa5,
585         0x27, 0x31, 0x20, 0x37, 0x02, 0x0b, 0xd3, 0xa5,
586         0x27, 0x31, 0x20, 0x37, 0x00, 0x13, 0xfb, 0xf1,
587         0x80, 0xff, 0x22, 0x73, 0xb5, 0x25, 0x18, 0x1e,
588         0xde, 0x30, 0xd9, 0x30, 0x64, 0x72, 0x11, 0x1e,
589         0x68, 0x23, 0x16, 0x31, 0x80, 0xff, 0x08, 0xc2,
590         0x40, 0x73, 0x3a, 0x48, 0x40, 0x9b, 0x06, 0xff,
591         0x02, 0xc6, 0x00, 0xbe, 0x08, 0x16, 0x1e, 0xfc,
592         0x2c, 0x75, 0xdc, 0x21, 0xbc, 0x25, 0x04, 0x13,
593         0x0b, 0xf0, 0x03, 0x13, 0x09, 0xf0, 0x02, 0x13,
594         0x07, 0xf0, 0x01, 0x13, 0x05, 0xf0, 0x08, 0x13,
595         0x03, 0xf0, 0x04, 0xc3, 0x00, 0xbb, 0x03, 0xc3,
596         0x00, 0xbb, 0x8c, 0x15, 0x76, 0x15, 0xa0, 0x64,
597         0x40, 0x48, 0xa0, 0x8c, 0x02, 0xc4, 0x00, 0xbc,
598         0x82, 0x00, 0xa0, 0x62, 0x21, 0x48, 0xa0, 0x8a,
599         0x02, 0xc2, 0x00, 0xba, 0x40, 0x03, 0x33, 0xc5,
600         0xa0, 0x74, 0xc0, 0x49, 0x1f, 0xf0, 0x30, 0xc5,
601         0xa0, 0x73, 0x00, 0x13, 0x04, 0xf1, 0xa2, 0x73,
602         0x00, 0x13, 0x14, 0xf0, 0x28, 0xc5, 0xa0, 0x74,
603         0xc8, 0x49, 0x1b, 0xf1, 0x26, 0xc5, 0xa0, 0x76,
604         0xa2, 0x74, 0x01, 0x06, 0x20, 0x37, 0xa0, 0x9e,
605         0xa2, 0x9c, 0x1e, 0xc5, 0xa2, 0x73, 0x23, 0x40,
606         0x10, 0xf8, 0x04, 0xf3, 0xa0, 0x73, 0x33, 0x40,
607         0x0c, 0xf8, 0x15, 0xc5, 0xa0, 0x74, 0x41, 0x48,
608         0xa0, 0x9c, 0x14, 0xc5, 0xa0, 0x76, 0x62, 0x48,
609         0xe0, 0x48, 0xa0, 0x9e, 0x10, 0xc6, 0x00, 0xbe,
610         0x0a, 0xc5, 0xa0, 0x74, 0x48, 0x48, 0xa0, 0x9c,
611         0x0b, 0xc5, 0x20, 0x1e, 0xa0, 0x9e, 0xe5, 0x48,
612         0xa0, 0x9e, 0xf0, 0xe7, 0xbc, 0xc0, 0xc8, 0xd2,
613         0xcc, 0xd2, 0x28, 0xe4, 0xe6, 0x01, 0xf0, 0xc0,
614         0x18, 0x89, 0x00, 0x1d, 0x3c, 0xc3, 0x64, 0x71,
615         0x3c, 0xc0, 0x02, 0x99, 0x00, 0x61, 0x67, 0x11,
616         0x3c, 0xf1, 0x69, 0x33, 0x35, 0xc0, 0x28, 0x40,
617         0xf6, 0xf1, 0x34, 0xc0, 0x00, 0x19, 0x81, 0x1b,
618         0x91, 0xe8, 0x31, 0xc0, 0x04, 0x1a, 0x84, 0x1b,
619         0x8d, 0xe8, 0x82, 0xe8, 0xa3, 0x49, 0xfe, 0xf0,
620         0x2b, 0xc0, 0x7e, 0xe8, 0xa1, 0x48, 0x28, 0xc0,
621         0x84, 0x1b, 0x84, 0xe8, 0x00, 0x1d, 0x69, 0x33,
622         0x00, 0x1e, 0x01, 0x06, 0xff, 0x18, 0x30, 0x40,
623         0xfd, 0xf1, 0x19, 0xc0, 0x00, 0x76, 0x2e, 0x40,
624         0xf7, 0xf1, 0x21, 0x48, 0x19, 0xc0, 0x84, 0x1b,
625         0x75, 0xe8, 0x10, 0xc0, 0x69, 0xe8, 0xa1, 0x49,
626         0xfd, 0xf0, 0x11, 0xc0, 0x00, 0x1a, 0x84, 0x1b,
627         0x6d, 0xe8, 0x62, 0xe8, 0xa5, 0x49, 0xfe, 0xf0,
628         0x09, 0xc0, 0x01, 0x19, 0x81, 0x1b, 0x66, 0xe8,
629         0x54, 0xe0, 0x10, 0xd4, 0x88, 0xd3, 0xb8, 0x0b,
630         0x50, 0xe8, 0x20, 0xb4, 0x10, 0xd8, 0x84, 0xd4,
631         0xfd, 0xc0, 0x52, 0xe8, 0x48, 0x33, 0xf9, 0xc0,
632         0x00, 0x61, 0x9c, 0x20, 0x9c, 0x24, 0xd0, 0x49,
633         0x04, 0xf0, 0x04, 0x11, 0x02, 0xf1, 0x03, 0xe0,
634         0x00, 0x11, 0x06, 0xf1, 0x5c, 0xc0, 0x00, 0x61,
635         0x92, 0x48, 0x00, 0x89, 0x3a, 0xe0, 0x06, 0x11,
636         0x06, 0xf1, 0x55, 0xc0, 0x00, 0x61, 0x11, 0x48,
637         0x00, 0x89, 0x33, 0xe0, 0x05, 0x11, 0x08, 0xf1,
638         0x4e, 0xc0, 0x00, 0x61, 0x91, 0x49, 0x04, 0xf0,
639         0x91, 0x48, 0x00, 0x89, 0x11, 0xe0, 0xd9, 0xc0,
640         0x00, 0x61, 0x98, 0x20, 0x98, 0x24, 0x25, 0x11,
641         0x24, 0xf1, 0x44, 0xc0, 0x29, 0xe8, 0x95, 0x49,
642         0x20, 0xf0, 0xcf, 0xc0, 0x00, 0x61, 0x98, 0x20,
643         0x98, 0x24, 0x25, 0x11, 0x1a, 0xf1, 0x37, 0xc0,
644         0x00, 0x61, 0x92, 0x49, 0x16, 0xf1, 0x12, 0x48,
645         0x00, 0x89, 0x2f, 0xc0, 0x00, 0x19, 0x00, 0x89,
646         0x2d, 0xc0, 0x01, 0x89, 0x2d, 0xc0, 0x04, 0x19,
647         0x81, 0x1b, 0x1c, 0xe8, 0x2a, 0xc0, 0x14, 0x19,
648         0x81, 0x1b, 0x18, 0xe8, 0x21, 0xc0, 0x0c, 0xe8,
649         0x1f, 0xc0, 0x12, 0x48, 0x81, 0x1b, 0x12, 0xe8,
650         0xae, 0xc3, 0x66, 0x71, 0xae, 0xc0, 0x02, 0x99,
651         0x02, 0xc0, 0x00, 0xb8, 0x96, 0x07, 0x13, 0xc4,
652         0x84, 0x98, 0x00, 0x1b, 0x86, 0x8b, 0x86, 0x73,
653         0xbf, 0x49, 0xfe, 0xf1, 0x80, 0x71, 0x82, 0x72,
654         0x80, 0xff, 0x09, 0xc4, 0x84, 0x98, 0x80, 0x99,
655         0x82, 0x9a, 0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49,
656         0xfe, 0xf1, 0x80, 0xff, 0x08, 0xea, 0x30, 0xd4,
657         0x10, 0xc0, 0x12, 0xe8, 0x8a, 0xd3, 0x28, 0xe4,
658         0x2c, 0xe4, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00 };
659
660 static u16 r8153_pla_patch_b_bp[] = {
661         0xfc26, 0x8000, 0xfc28, 0x1154, 0xfc2a, 0x1606, 0xfc2c, 0x155a,
662         0xfc2e, 0x0080, 0xfc30, 0x033c, 0xfc32, 0x01a0, 0xfc34, 0x0794,
663         0xfc36, 0x0000, 0xfc38, 0x007f };
664
665 static u16 r8153_ram_code_d[] = {
666         0xB436, 0xB820, 0xB438, 0x0290, 0xB436, 0xA012, 0xB438, 0x0000,
667         0xB436, 0xA014, 0xB438, 0x2c04, 0xB438, 0x2c07, 0xB438, 0x2c07,
668         0xB438, 0x2c07, 0xB438, 0xa240, 0xB438, 0xa104, 0xB438, 0x2944,
669         0xB436, 0xA01A, 0xB438, 0x0000, 0xB436, 0xA006, 0xB438, 0x0fff,
670         0xB436, 0xA004, 0xB438, 0x0fff, 0xB436, 0xA002, 0xB438, 0x0fff,
671         0xB436, 0xA000, 0xB438, 0x1943, 0xB436, 0xB820, 0xB438, 0x0210 };
672
673 static u8 usb_patch_d[] = {
674         0x08, 0xe0, 0x0e, 0xe0, 0x11, 0xe0, 0x24, 0xe0,
675         0x2b, 0xe0, 0x33, 0xe0, 0x3a, 0xe0, 0x3c, 0xe0,
676         0x1e, 0xc3, 0x70, 0x61, 0x12, 0x48, 0x70, 0x89,
677         0x02, 0xc3, 0x00, 0xbb, 0x02, 0x17, 0x32, 0x19,
678         0x02, 0xc3, 0x00, 0xbb, 0x44, 0x14, 0x30, 0x18,
679         0x11, 0xc1, 0x05, 0xe8, 0x10, 0xc6, 0x02, 0xc2,
680         0x00, 0xba, 0x94, 0x17, 0x02, 0xb4, 0x09, 0xc2,
681         0x40, 0x99, 0x0e, 0x48, 0x42, 0x98, 0x42, 0x70,
682         0x8e, 0x49, 0xfe, 0xf1, 0x02, 0xb0, 0x80, 0xff,
683         0xc0, 0xd4, 0xe4, 0x40, 0x20, 0xd4, 0x30, 0x18,
684         0x06, 0xc1, 0xf1, 0xef, 0xfc, 0xc7, 0x02, 0xc0,
685         0x00, 0xb8, 0x38, 0x12, 0xe4, 0x4b, 0x0c, 0x61,
686         0x92, 0x48, 0x93, 0x48, 0x95, 0x48, 0x96, 0x48,
687         0x0c, 0x89, 0x02, 0xc0, 0x00, 0xb8, 0x0e, 0x06,
688         0x30, 0x18, 0xf5, 0xc1, 0xe0, 0xef, 0x04, 0xc5,
689         0x02, 0xc4, 0x00, 0xbc, 0x76, 0x3c, 0x1e, 0xfc,
690         0x02, 0xc6, 0x00, 0xbe, 0x00, 0x00, 0x02, 0xc6,
691         0x00, 0xbe, 0x00, 0x00 };
692
693 static u16 r8153_usb_patch_d_bp[] = {
694         0xfc26, 0xa000, 0xfc28, 0x16de, 0xfc2a, 0x1442, 0xfc2c, 0x1792,
695         0xfc2e, 0x1236, 0xfc30, 0x0606, 0xfc32, 0x3c74, 0xfc34, 0x0000,
696         0xfc36, 0x0000, 0xfc38, 0x003e };
697
698 static u8 pla_patch_d[] = {
699         0x03, 0xe0, 0x16, 0xe0, 0x30, 0xe0, 0x12, 0xc2,
700         0x40, 0x73, 0xb0, 0x49, 0x08, 0xf0, 0xb8, 0x49,
701         0x06, 0xf0, 0xb8, 0x48, 0x40, 0x9b, 0x0b, 0xc2,
702         0x40, 0x76, 0x05, 0xe0, 0x02, 0x61, 0x02, 0xc3,
703         0x00, 0xbb, 0x54, 0x08, 0x02, 0xc3, 0x00, 0xbb,
704         0x64, 0x08, 0x98, 0xd3, 0x1e, 0xfc, 0xfe, 0xc0,
705         0x02, 0x62, 0xa0, 0x48, 0x02, 0x8a, 0x00, 0x72,
706         0xa0, 0x49, 0x11, 0xf0, 0x13, 0xc1, 0x20, 0x62,
707         0x2e, 0x21, 0x2f, 0x25, 0x00, 0x71, 0x9f, 0x24,
708         0x0a, 0x40, 0x09, 0xf0, 0x00, 0x71, 0x18, 0x48,
709         0xa0, 0x49, 0x03, 0xf1, 0x9f, 0x48, 0x02, 0xe0,
710         0x1f, 0x48, 0x00, 0x99, 0x02, 0xc2, 0x00, 0xba,
711         0xac, 0x0c, 0x08, 0xe9, 0x36, 0xc0, 0x00, 0x61,
712         0x9c, 0x20, 0x9c, 0x24, 0x33, 0xc0, 0x07, 0x11,
713         0x05, 0xf1, 0x00, 0x61, 0x17, 0x48, 0x00, 0x89,
714         0x0d, 0xe0, 0x04, 0x11, 0x0b, 0xf1, 0x00, 0x61,
715         0x97, 0x49, 0x08, 0xf0, 0x97, 0x48, 0x00, 0x89,
716         0x23, 0xc0, 0x0e, 0xe8, 0x12, 0x48, 0x81, 0x1b,
717         0x15, 0xe8, 0x1f, 0xc0, 0x00, 0x61, 0x67, 0x11,
718         0x04, 0xf0, 0x02, 0xc0, 0x00, 0xb8, 0x42, 0x09,
719         0x02, 0xc0, 0x00, 0xb8, 0x90, 0x08, 0x13, 0xc4,
720         0x84, 0x98, 0x00, 0x1b, 0x86, 0x8b, 0x86, 0x73,
721         0xbf, 0x49, 0xfe, 0xf1, 0x80, 0x71, 0x82, 0x72,
722         0x80, 0xff, 0x09, 0xc4, 0x84, 0x98, 0x80, 0x99,
723         0x82, 0x9a, 0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49,
724         0xfe, 0xf1, 0x80, 0xff, 0x08, 0xea, 0x30, 0xd4,
725         0x50, 0xe8, 0x8a, 0xd3 };
726
727 static u16 r8153_pla_patch_d_bp[] = {
728         0xfc26, 0x8000, 0xfc28, 0x0852, 0xfc2a, 0x0c92, 0xfc2c, 0x088c,
729         0xfc2e, 0x0000, 0xfc30, 0x0000, 0xfc32, 0x0000, 0xfc34, 0x0000,
730         0xfc36, 0x0000, 0xfc38, 0x0007 };
731
732 static void rtl_clear_bp(struct r8152 *tp)
733 {
734         ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_0, 0);
735         ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_2, 0);
736         ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_4, 0);
737         ocp_write_dword(tp, MCU_TYPE_PLA, PLA_BP_6, 0);
738         ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_0, 0);
739         ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_2, 0);
740         ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_4, 0);
741         ocp_write_dword(tp, MCU_TYPE_USB, USB_BP_6, 0);
742
743         mdelay(6);
744
745         ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_BA, 0);
746         ocp_write_word(tp, MCU_TYPE_USB, USB_BP_BA, 0);
747 }
748
749 static void r8153_clear_bp(struct r8152 *tp)
750 {
751         ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
752         ocp_write_byte(tp, MCU_TYPE_USB, USB_BP_EN, 0);
753         rtl_clear_bp(tp);
754 }
755
756 static void r8152b_set_dq_desc(struct r8152 *tp)
757 {
758         u8 data;
759
760         data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
761         data |= 0x80;
762         ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
763         ocp_write_word(tp, MCU_TYPE_USB, 0xc0ce, 0x0210);
764         data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
765         data &= ~0x80;
766         ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
767 }
768
769 static int r8153_pre_ram_code(struct r8152 *tp, u16 patch_key)
770 {
771         u16 data;
772         int i;
773
774         data = ocp_reg_read(tp, 0xb820);
775         data |= 0x0010;
776         ocp_reg_write(tp, 0xb820, data);
777
778         for (i = 0, data = 0; !data && i < 5000; i++) {
779                 mdelay(2);
780                 data = ocp_reg_read(tp, 0xb800) & 0x0040;
781         }
782
783         sram_write(tp, 0x8146, patch_key);
784         sram_write(tp, 0xb82e, 0x0001);
785
786         return -EBUSY;
787 }
788
789 static int r8153_post_ram_code(struct r8152 *tp)
790 {
791         u16 data;
792
793         sram_write(tp, 0x0000, 0x0000);
794
795         data = ocp_reg_read(tp, 0xb82e);
796         data &= ~0x0001;
797         ocp_reg_write(tp, 0xb82e, data);
798
799         sram_write(tp, 0x8146, 0x0000);
800
801         data = ocp_reg_read(tp, 0xb820);
802         data &= ~0x0010;
803         ocp_reg_write(tp, 0xb820, data);
804
805         ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base);
806
807         return 0;
808 }
809
810 static void r8153_wdt1_end(struct r8152 *tp)
811 {
812         int i;
813
814         for (i = 0; i < 104; i++) {
815                 if (!(ocp_read_byte(tp, MCU_TYPE_USB, 0xe404) & 1))
816                         break;
817                 mdelay(2);
818         }
819 }
820
821 void r8152b_firmware(struct r8152 *tp)
822 {
823         int i;
824
825         if (tp->version == RTL_VER_01) {
826                 int i;
827
828                 r8152b_set_dq_desc(tp);
829                 rtl_clear_bp(tp);
830
831                 generic_ocp_write(tp, 0xf800, 0x3f,
832                                   sizeof(r8152b_pla_patch_a),
833                                   r8152b_pla_patch_a, MCU_TYPE_PLA);
834
835                 for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a_bp); i += 2)
836                         ocp_write_word(tp, MCU_TYPE_PLA,
837                                        r8152b_pla_patch_a_bp[i],
838                                        r8152b_pla_patch_a_bp[i+1]);
839
840                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, 0x2000);
841                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7070);
842                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0600);
843                 for (i = 0; i < ARRAY_SIZE(r8152b_ram_code1); i++)
844                         ocp_write_word(tp, MCU_TYPE_PLA, 0xb09a,
845                                        r8152b_ram_code1[i]);
846
847                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0200);
848                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7030);
849         } else if (tp->version == RTL_VER_02) {
850                 rtl_clear_bp(tp);
851
852                 generic_ocp_write(tp, 0xf800, 0xff,
853                                   sizeof(r8152b_pla_patch_a2),
854                                   r8152b_pla_patch_a2, MCU_TYPE_PLA);
855
856                 for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a2_bp);
857                      i += 2)
858                         ocp_write_word(tp, MCU_TYPE_PLA,
859                                        r8152b_pla_patch_a2_bp[i],
860                                        r8152b_pla_patch_a2_bp[i+1]);
861         }
862 }
863
864 void r8153_firmware(struct r8152 *tp)
865 {
866         int i;
867
868         if (tp->version == RTL_VER_03) {
869                 r8153_clear_bp(tp);
870
871                 r8153_pre_ram_code(tp, 0x7000);
872
873                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_a); i += 2)
874                         ocp_write_word(tp, MCU_TYPE_PLA,
875                                        r8153_ram_code_a[i],
876                                        r8153_ram_code_a[i+1]);
877
878                 r8153_post_ram_code(tp);
879         } else if (tp->version == RTL_VER_04) {
880                 r8153_pre_ram_code(tp, 0x7001);
881
882                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
883                         ocp_write_word(tp, MCU_TYPE_PLA,
884                                        r8153_ram_code_bc[i],
885                                        r8153_ram_code_bc[i+1]);
886
887                 r8153_post_ram_code(tp);
888
889                 r8153_wdt1_end(tp);
890                 r8153_clear_bp(tp);
891
892                 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
893                 generic_ocp_write(tp, 0xf800, 0xff,
894                                   sizeof(r8153_usb_patch_b),
895                                   r8153_usb_patch_b, MCU_TYPE_USB);
896
897                 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_b_bp); i += 2)
898                         ocp_write_word(tp, MCU_TYPE_USB,
899                                        r8153_usb_patch_b_bp[i],
900                                        r8153_usb_patch_b_bp[i+1]);
901
902                 if (!(ocp_read_word(tp, MCU_TYPE_PLA, 0xd38e) & BIT(0))) {
903                         ocp_write_word(tp, MCU_TYPE_PLA, 0xd38c, 0x0082);
904                         ocp_write_word(tp, MCU_TYPE_PLA, 0xd38e, 0x0082);
905                 }
906
907                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
908                 generic_ocp_write(tp, 0xf800, 0xff,
909                                   sizeof(r8153_pla_patch_b),
910                                   r8153_pla_patch_b, MCU_TYPE_PLA);
911
912                 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_b_bp); i += 2)
913                         ocp_write_word(tp, MCU_TYPE_PLA,
914                                        r8153_pla_patch_b_bp[i],
915                                        r8153_pla_patch_b_bp[i+1]);
916
917                 ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
918         } else if (tp->version == RTL_VER_05) {
919                 u32 ocp_data;
920
921                 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
922                 ocp_data &= ~0x4000;
923                 ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
924
925                 r8153_pre_ram_code(tp, 0x7001);
926
927                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
928                         ocp_write_word(tp, MCU_TYPE_PLA,
929                                        r8153_ram_code_bc[i],
930                                        r8153_ram_code_bc[i+1]);
931
932                 r8153_post_ram_code(tp);
933
934                 r8153_wdt1_end(tp);
935                 r8153_clear_bp(tp);
936
937                 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
938                 generic_ocp_write(tp, 0xf800, 0xff,
939                                   sizeof(r8153_usb_patch_c),
940                                   r8153_usb_patch_c, MCU_TYPE_USB);
941
942                 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_c_bp); i += 2)
943                         ocp_write_word(tp, MCU_TYPE_USB,
944                                        r8153_usb_patch_c_bp[i],
945                                        r8153_usb_patch_c_bp[i+1]);
946
947                 if (ocp_read_byte(tp, MCU_TYPE_USB, 0xcfef) & 1) {
948                         ocp_write_word(tp, MCU_TYPE_USB, 0xfc30, 0x1578);
949                         ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ff);
950                 } else {
951                         ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ef);
952                 }
953
954                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
955                 generic_ocp_write(tp, 0xf800, 0xff,
956                                   sizeof(r8153_pla_patch_c),
957                                   r8153_pla_patch_c, MCU_TYPE_PLA);
958
959                 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_c_bp); i += 2)
960                         ocp_write_word(tp, MCU_TYPE_PLA,
961                                        r8153_pla_patch_c_bp[i],
962                                        r8153_pla_patch_c_bp[i+1]);
963
964                 ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
965
966                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS,
967                                U3P3_CHECK_EN | 4);
968
969                 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
970                 ocp_data |= 0x4000;
971                 ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
972
973                 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
974                 ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
975                 ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
976         } else if (tp->version == RTL_VER_06) {
977                 u32 ocp_data;
978
979                 r8153_pre_ram_code(tp, 0x7002);
980
981                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_d); i += 2)
982                         ocp_write_word(tp, MCU_TYPE_PLA,
983                                        r8153_ram_code_d[i],
984                                        r8153_ram_code_d[i+1]);
985
986                 r8153_post_ram_code(tp);
987
988                 r8153_clear_bp(tp);
989
990                 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
991                 generic_ocp_write(tp, 0xf800, 0xff, sizeof(usb_patch_d),
992                                   usb_patch_d, MCU_TYPE_USB);
993
994                 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_d_bp); i += 2)
995                         ocp_write_word(tp, MCU_TYPE_USB,
996                                        r8153_usb_patch_d_bp[i],
997                                        r8153_usb_patch_d_bp[i+1]);
998
999                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
1000                 generic_ocp_write(tp, 0xf800, 0xff, sizeof(pla_patch_d),
1001                                   pla_patch_d, MCU_TYPE_PLA);
1002
1003                 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_d_bp); i += 2)
1004                         ocp_write_word(tp, MCU_TYPE_PLA,
1005                                        r8153_pla_patch_d_bp[i],
1006                                        r8153_pla_patch_d_bp[i + 1]);
1007
1008                 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
1009                 ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
1010                 ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
1011
1012                 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1);
1013                 ocp_data |= FW_IP_RESET_EN;
1014                 ocp_write_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1, ocp_data);
1015         }
1016 }