Prepare v2023.10
[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 u8 usb_patch2_b[] = {
733         0x10, 0xe0, 0x26, 0xe0, 0x3a, 0xe0, 0x58, 0xe0,
734         0x6c, 0xe0, 0x85, 0xe0, 0xa5, 0xe0, 0xbe, 0xe0,
735         0xd8, 0xe0, 0xdb, 0xe0, 0xf3, 0xe0, 0xf5, 0xe0,
736         0xf7, 0xe0, 0xf9, 0xe0, 0xfb, 0xe0, 0xfd, 0xe0,
737         0x16, 0xc0, 0x00, 0x75, 0xd1, 0x49, 0x0d, 0xf0,
738         0x0f, 0xc0, 0x0f, 0xc5, 0x00, 0x1e, 0x08, 0x9e,
739         0x0c, 0x9d, 0x0c, 0xc6, 0x0a, 0x9e, 0x8f, 0x1c,
740         0x0e, 0x8c, 0x0e, 0x74, 0xcf, 0x49, 0xfe, 0xf1,
741         0x02, 0xc0, 0x00, 0xb8, 0x96, 0x31, 0x00, 0xdc,
742         0x24, 0xe4, 0x80, 0x02, 0x34, 0xd3, 0xff, 0xc3,
743         0x60, 0x72, 0xa1, 0x49, 0x0d, 0xf0, 0xf8, 0xc3,
744         0xf8, 0xc2, 0x00, 0x1c, 0x68, 0x9c, 0xf6, 0xc4,
745         0x6a, 0x9c, 0x6c, 0x9a, 0x8f, 0x1c, 0x6e, 0x8c,
746         0x6e, 0x74, 0xcf, 0x49, 0xfe, 0xf1, 0x04, 0xc0,
747         0x02, 0xc2, 0x00, 0xba, 0xa8, 0x28, 0xf8, 0xc7,
748         0xea, 0xc0, 0x00, 0x75, 0xd1, 0x49, 0x15, 0xf0,
749         0x19, 0xc7, 0x17, 0xc2, 0xec, 0x9a, 0x00, 0x19,
750         0xee, 0x89, 0xee, 0x71, 0x9f, 0x49, 0xfe, 0xf1,
751         0xea, 0x71, 0x9f, 0x49, 0x0a, 0xf0, 0xd9, 0xc2,
752         0xec, 0x9a, 0x00, 0x19, 0xe8, 0x99, 0x81, 0x19,
753         0xee, 0x89, 0xee, 0x71, 0x9f, 0x49, 0xfe, 0xf1,
754         0x06, 0xc3, 0x02, 0xc2, 0x00, 0xba, 0xf0, 0x1d,
755         0x4c, 0xe8, 0x00, 0xdc, 0x00, 0xd4, 0xcb, 0xc0,
756         0x00, 0x75, 0xd1, 0x49, 0x0d, 0xf0, 0xc4, 0xc0,
757         0xc4, 0xc5, 0x00, 0x1e, 0x08, 0x9e, 0xc2, 0xc6,
758         0x0a, 0x9e, 0x0c, 0x9d, 0x8f, 0x1c, 0x0e, 0x8c,
759         0x0e, 0x74, 0xcf, 0x49, 0xfe, 0xf1, 0x04, 0xc0,
760         0x02, 0xc1, 0x00, 0xb9, 0xc4, 0x16, 0x20, 0xd4,
761         0xb6, 0xc0, 0x00, 0x75, 0xd1, 0x48, 0x00, 0x9d,
762         0xe5, 0xc7, 0xaf, 0xc2, 0xec, 0x9a, 0x00, 0x19,
763         0xe8, 0x9a, 0x81, 0x19, 0xee, 0x89, 0xee, 0x71,
764         0x9f, 0x49, 0xfe, 0xf1, 0x2c, 0xc1, 0xec, 0x99,
765         0x81, 0x19, 0xee, 0x89, 0xee, 0x71, 0x9f, 0x49,
766         0xfe, 0xf1, 0x04, 0xc3, 0x02, 0xc2, 0x00, 0xba,
767         0x96, 0x1c, 0xc0, 0xd4, 0xc0, 0x88, 0x1e, 0xc6,
768         0xc0, 0x70, 0x8f, 0x49, 0x0e, 0xf0, 0x8f, 0x48,
769         0x93, 0xc6, 0xca, 0x98, 0x11, 0x18, 0xc8, 0x98,
770         0x16, 0xc0, 0xcc, 0x98, 0x8f, 0x18, 0xce, 0x88,
771         0xce, 0x70, 0x8f, 0x49, 0xfe, 0xf1, 0x0b, 0xe0,
772         0x43, 0xc6, 0x00, 0x18, 0xc8, 0x98, 0x0b, 0xc0,
773         0xcc, 0x98, 0x81, 0x18, 0xce, 0x88, 0xce, 0x70,
774         0x8f, 0x49, 0xfe, 0xf1, 0x02, 0xc0, 0x00, 0xb8,
775         0xf2, 0x19, 0x40, 0xd3, 0x20, 0xe4, 0x33, 0xc2,
776         0x40, 0x71, 0x91, 0x48, 0x40, 0x99, 0x30, 0xc2,
777         0x00, 0x19, 0x48, 0x99, 0xf8, 0xc1, 0x4c, 0x99,
778         0x81, 0x19, 0x4e, 0x89, 0x4e, 0x71, 0x9f, 0x49,
779         0xfe, 0xf1, 0x0b, 0xc1, 0x4c, 0x99, 0x81, 0x19,
780         0x4e, 0x89, 0x4e, 0x71, 0x9f, 0x49, 0xfe, 0xf1,
781         0x02, 0x71, 0x02, 0xc2, 0x00, 0xba, 0x0e, 0x34,
782         0x24, 0xe4, 0x19, 0xc2, 0x40, 0x71, 0x91, 0x48,
783         0x40, 0x99, 0x16, 0xc2, 0x00, 0x19, 0x48, 0x99,
784         0xde, 0xc1, 0x4c, 0x99, 0x81, 0x19, 0x4e, 0x89,
785         0x4e, 0x71, 0x9f, 0x49, 0xfe, 0xf1, 0xf1, 0xc1,
786         0x4c, 0x99, 0x81, 0x19, 0x4e, 0x89, 0x4e, 0x71,
787         0x9f, 0x49, 0xfe, 0xf1, 0x02, 0x71, 0x02, 0xc2,
788         0x00, 0xba, 0x60, 0x33, 0x34, 0xd3, 0x00, 0xdc,
789         0x1e, 0x89, 0x02, 0xc0, 0x00, 0xb8, 0xfa, 0x12,
790         0x18, 0xc0, 0x00, 0x65, 0xd1, 0x49, 0x0e, 0xf0,
791         0x11, 0xc0, 0x11, 0xc5, 0x00, 0x1e, 0x08, 0x9e,
792         0x0c, 0x9d, 0x0e, 0xc6, 0x0a, 0x9e, 0x8f, 0x1c,
793         0x0e, 0x8c, 0x0e, 0x74, 0xcf, 0x49, 0xfe, 0xf1,
794         0x04, 0xc0, 0x02, 0xc2, 0x00, 0xba, 0xa0, 0x41,
795         0x06, 0xd4, 0x00, 0xdc, 0x24, 0xe4, 0x80, 0x02,
796         0x34, 0xd3, 0x02, 0xc0, 0x00, 0xb8, 0x00, 0x00,
797         0x02, 0xc0, 0x00, 0xb8, 0x00, 0x00, 0x02, 0xc0,
798         0x00, 0xb8, 0x00, 0x00, 0x02, 0xc0, 0x00, 0xb8,
799         0x00, 0x00, 0x02, 0xc0, 0x00, 0xb8, 0x00, 0x00,
800         0x02, 0xc0, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00 };
801
802 static u16 r8153b_usb_patch_b_bp[] = {
803         0xfc26, 0xa000, 0xfc28, 0x2a20, 0xfc2a, 0x28a6, 0xfc2c, 0x1dee,
804         0xfc2e, 0x16c2, 0xfc30, 0x1c94, 0xfc32, 0x19f0, 0xfc34, 0x340c,
805         0xfc36, 0x335e, 0xfc38, 0x12f8, 0xfc3a, 0x419e, 0xfc3c, 0x0000,
806         0xfc3e, 0x0000, 0xfc40, 0x0000, 0xfc42, 0x0000, 0xfc44, 0x0000,
807         0xfc46, 0x0000, 0xfc48, 0x03ff };
808
809 static u8 pla_patch2_b[] = {
810         0x05, 0xe0, 0x1b, 0xe0, 0x2c, 0xe0, 0x60, 0xe0,
811         0x73, 0xe0, 0x15, 0xc6, 0xc2, 0x64, 0xd2, 0x49,
812         0x06, 0xf1, 0xc4, 0x48, 0xc5, 0x48, 0xc6, 0x48,
813         0xc7, 0x48, 0x05, 0xe0, 0x44, 0x48, 0x45, 0x48,
814         0x46, 0x48, 0x47, 0x48, 0xc2, 0x8c, 0xc0, 0x64,
815         0x46, 0x48, 0xc0, 0x8c, 0x05, 0xc5, 0x02, 0xc4,
816         0x00, 0xbc, 0x18, 0x02, 0x06, 0xdc, 0xb0, 0xc0,
817         0x10, 0xc5, 0xa0, 0x77, 0xa0, 0x74, 0x46, 0x48,
818         0x47, 0x48, 0xa0, 0x9c, 0x0b, 0xc5, 0xa0, 0x74,
819         0x44, 0x48, 0x43, 0x48, 0xa0, 0x9c, 0x05, 0xc5,
820         0xa0, 0x9f, 0x02, 0xc5, 0x00, 0xbd, 0x3c, 0x03,
821         0x1c, 0xe8, 0x20, 0xe8, 0xd4, 0x49, 0x04, 0xf1,
822         0xd5, 0x49, 0x20, 0xf1, 0x28, 0xe0, 0x2a, 0xc7,
823         0xe0, 0x75, 0xda, 0x49, 0x14, 0xf0, 0x27, 0xc7,
824         0xe0, 0x75, 0xdc, 0x49, 0x10, 0xf1, 0x24, 0xc7,
825         0xe0, 0x75, 0x25, 0xc7, 0xe0, 0x74, 0x2c, 0x40,
826         0x0a, 0xfa, 0x1f, 0xc7, 0xe4, 0x75, 0xd0, 0x49,
827         0x09, 0xf1, 0x1c, 0xc5, 0xe6, 0x9d, 0x11, 0x1d,
828         0xe4, 0x8d, 0x04, 0xe0, 0x16, 0xc7, 0x00, 0x1d,
829         0xe4, 0x8d, 0xe0, 0x8e, 0x11, 0x1d, 0xe0, 0x8d,
830         0x07, 0xe0, 0x0c, 0xc7, 0xe0, 0x75, 0xda, 0x48,
831         0xe0, 0x9d, 0x0b, 0xc7, 0xe4, 0x8e, 0x02, 0xc4,
832         0x00, 0xbc, 0x28, 0x03, 0x02, 0xc4, 0x00, 0xbc,
833         0x14, 0x03, 0x12, 0xe8, 0x4e, 0xe8, 0x1c, 0xe6,
834         0x20, 0xe4, 0x80, 0x02, 0xa4, 0xc0, 0x12, 0xc2,
835         0x40, 0x73, 0xb0, 0x49, 0x08, 0xf0, 0xb8, 0x49,
836         0x06, 0xf0, 0xb8, 0x48, 0x40, 0x9b, 0x0b, 0xc2,
837         0x40, 0x76, 0x05, 0xe0, 0x02, 0x61, 0x02, 0xc3,
838         0x00, 0xbb, 0x0a, 0x0a, 0x02, 0xc3, 0x00, 0xbb,
839         0x1a, 0x0a, 0x98, 0xd3, 0x1e, 0xfc, 0xfe, 0xc0,
840         0x02, 0x62, 0xa0, 0x48, 0x02, 0x8a, 0x00, 0x72,
841         0xa0, 0x49, 0x11, 0xf0, 0x13, 0xc1, 0x20, 0x62,
842         0x2e, 0x21, 0x2f, 0x25, 0x00, 0x71, 0x9f, 0x24,
843         0x0a, 0x40, 0x09, 0xf0, 0x00, 0x71, 0x18, 0x48,
844         0xa0, 0x49, 0x03, 0xf1, 0x9f, 0x48, 0x02, 0xe0,
845         0x1f, 0x48, 0x00, 0x99, 0x02, 0xc2, 0x00, 0xba,
846         0xda, 0x0e, 0x08, 0xe9 };
847
848 static u16 r8153b_pla_patch_b_bp[] = {
849         0xfc26, 0x8000, 0xfc28, 0x0216, 0xfc2a, 0x0332, 0xfc2c, 0x030c,
850         0xfc2e, 0x0a08, 0xfc30, 0x0ec0, 0xfc32, 0x0000, 0xfc34, 0x0000,
851         0xfc36, 0x0000, 0xfc38, 0x001e };
852
853 static void rtl_clear_bp(struct r8152 *tp, u16 type)
854 {
855         u8 zeros[16] = {0};
856
857         switch (tp->version) {
858         case RTL_VER_01:
859         case RTL_VER_02:
860         case RTL_VER_07:
861                 break;
862         case RTL_VER_03:
863         case RTL_VER_04:
864         case RTL_VER_05:
865         case RTL_VER_06:
866                 ocp_write_byte(tp, type, PLA_BP_EN, 0);
867                 break;
868         case RTL_VER_08:
869         case RTL_VER_09:
870         default:
871                 if (type == MCU_TYPE_USB) {
872                         ocp_write_byte(tp, MCU_TYPE_USB, USB_BP2_EN, 0);
873
874                         generic_ocp_write(tp, USB_BP(8), 0xff, sizeof(zeros),
875                                           zeros, type);
876                 } else {
877                         ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
878                 }
879                 break;
880         }
881
882         generic_ocp_write(tp, USB_BP(0), 0xff, sizeof(zeros), zeros, type);
883
884         mdelay(6);
885
886         ocp_write_word(tp, type, PLA_BP_BA, 0);
887 }
888
889 static void r8152b_set_dq_desc(struct r8152 *tp)
890 {
891         u8 data;
892
893         data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
894         data |= 0x80;
895         ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
896         ocp_write_word(tp, MCU_TYPE_USB, 0xc0ce, 0x0210);
897         data = ocp_read_byte(tp, MCU_TYPE_USB, 0xd429);
898         data &= ~0x80;
899         ocp_write_byte(tp, MCU_TYPE_USB, 0xd429, data);
900 }
901
902 static int r8153_pre_ram_code(struct r8152 *tp, u16 patch_key)
903 {
904         u16 data;
905         int i;
906
907         data = ocp_reg_read(tp, 0xb820);
908         data |= 0x0010;
909         ocp_reg_write(tp, 0xb820, data);
910
911         for (i = 0, data = 0; !data && i < 5000; i++) {
912                 mdelay(2);
913                 data = ocp_reg_read(tp, 0xb800) & 0x0040;
914         }
915
916         sram_write(tp, 0x8146, patch_key);
917         sram_write(tp, 0xb82e, 0x0001);
918
919         return -EBUSY;
920 }
921
922 static int r8153_post_ram_code(struct r8152 *tp)
923 {
924         u16 data;
925
926         sram_write(tp, 0x0000, 0x0000);
927
928         data = ocp_reg_read(tp, 0xb82e);
929         data &= ~0x0001;
930         ocp_reg_write(tp, 0xb82e, data);
931
932         sram_write(tp, 0x8146, 0x0000);
933
934         data = ocp_reg_read(tp, 0xb820);
935         data &= ~0x0010;
936         ocp_reg_write(tp, 0xb820, data);
937
938         ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base);
939
940         return 0;
941 }
942
943 static void r8153_wdt1_end(struct r8152 *tp)
944 {
945         int i;
946
947         for (i = 0; i < 104; i++) {
948                 if (!(ocp_read_byte(tp, MCU_TYPE_USB, 0xe404) & 1))
949                         break;
950                 mdelay(2);
951         }
952 }
953
954 void r8152b_firmware(struct r8152 *tp)
955 {
956         int i;
957
958         if (tp->version == RTL_VER_01) {
959                 int i;
960
961                 r8152b_set_dq_desc(tp);
962                 rtl_clear_bp(tp, MCU_TYPE_PLA);
963
964                 generic_ocp_write(tp, 0xf800, 0x3f,
965                                   sizeof(r8152b_pla_patch_a),
966                                   r8152b_pla_patch_a, MCU_TYPE_PLA);
967
968                 for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a_bp); i += 2)
969                         ocp_write_word(tp, MCU_TYPE_PLA,
970                                        r8152b_pla_patch_a_bp[i],
971                                        r8152b_pla_patch_a_bp[i+1]);
972
973                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, 0x2000);
974                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7070);
975                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0600);
976                 for (i = 0; i < ARRAY_SIZE(r8152b_ram_code1); i++)
977                         ocp_write_word(tp, MCU_TYPE_PLA, 0xb09a,
978                                        r8152b_ram_code1[i]);
979
980                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb098, 0x0200);
981                 ocp_write_word(tp, MCU_TYPE_PLA, 0xb092, 0x7030);
982         } else if (tp->version == RTL_VER_02) {
983                 rtl_clear_bp(tp, MCU_TYPE_PLA);
984
985                 generic_ocp_write(tp, 0xf800, 0xff,
986                                   sizeof(r8152b_pla_patch_a2),
987                                   r8152b_pla_patch_a2, MCU_TYPE_PLA);
988
989                 for (i = 0; i < ARRAY_SIZE(r8152b_pla_patch_a2_bp);
990                      i += 2)
991                         ocp_write_word(tp, MCU_TYPE_PLA,
992                                        r8152b_pla_patch_a2_bp[i],
993                                        r8152b_pla_patch_a2_bp[i+1]);
994         }
995 }
996
997 void r8153_firmware(struct r8152 *tp)
998 {
999         int i;
1000
1001         if (tp->version == RTL_VER_03) {
1002                 r8153_pre_ram_code(tp, 0x7000);
1003
1004                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_a); i += 2)
1005                         ocp_write_word(tp, MCU_TYPE_PLA,
1006                                        r8153_ram_code_a[i],
1007                                        r8153_ram_code_a[i+1]);
1008
1009                 r8153_post_ram_code(tp);
1010         } else if (tp->version == RTL_VER_04) {
1011                 r8153_pre_ram_code(tp, 0x7001);
1012
1013                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
1014                         ocp_write_word(tp, MCU_TYPE_PLA,
1015                                        r8153_ram_code_bc[i],
1016                                        r8153_ram_code_bc[i+1]);
1017
1018                 r8153_post_ram_code(tp);
1019
1020                 r8153_wdt1_end(tp);
1021
1022                 rtl_clear_bp(tp, MCU_TYPE_USB);
1023
1024                 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
1025                 generic_ocp_write(tp, 0xf800, 0xff,
1026                                   sizeof(r8153_usb_patch_b),
1027                                   r8153_usb_patch_b, MCU_TYPE_USB);
1028
1029                 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_b_bp); i += 2)
1030                         ocp_write_word(tp, MCU_TYPE_USB,
1031                                        r8153_usb_patch_b_bp[i],
1032                                        r8153_usb_patch_b_bp[i+1]);
1033
1034                 if (!(ocp_read_word(tp, MCU_TYPE_PLA, 0xd38e) & BIT(0))) {
1035                         ocp_write_word(tp, MCU_TYPE_PLA, 0xd38c, 0x0082);
1036                         ocp_write_word(tp, MCU_TYPE_PLA, 0xd38e, 0x0082);
1037                 }
1038
1039                 rtl_clear_bp(tp, MCU_TYPE_PLA);
1040
1041                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
1042                 generic_ocp_write(tp, 0xf800, 0xff,
1043                                   sizeof(r8153_pla_patch_b),
1044                                   r8153_pla_patch_b, MCU_TYPE_PLA);
1045
1046                 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_b_bp); i += 2)
1047                         ocp_write_word(tp, MCU_TYPE_PLA,
1048                                        r8153_pla_patch_b_bp[i],
1049                                        r8153_pla_patch_b_bp[i+1]);
1050
1051                 ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
1052         } else if (tp->version == RTL_VER_05) {
1053                 u32 ocp_data;
1054
1055                 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
1056                 ocp_data &= ~0x4000;
1057                 ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
1058
1059                 r8153_pre_ram_code(tp, 0x7001);
1060
1061                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_bc); i += 2)
1062                         ocp_write_word(tp, MCU_TYPE_PLA,
1063                                        r8153_ram_code_bc[i],
1064                                        r8153_ram_code_bc[i+1]);
1065
1066                 r8153_post_ram_code(tp);
1067
1068                 r8153_wdt1_end(tp);
1069
1070                 rtl_clear_bp(tp, MCU_TYPE_USB);
1071
1072                 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
1073                 generic_ocp_write(tp, 0xf800, 0xff,
1074                                   sizeof(r8153_usb_patch_c),
1075                                   r8153_usb_patch_c, MCU_TYPE_USB);
1076
1077                 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_c_bp); i += 2)
1078                         ocp_write_word(tp, MCU_TYPE_USB,
1079                                        r8153_usb_patch_c_bp[i],
1080                                        r8153_usb_patch_c_bp[i+1]);
1081
1082                 if (ocp_read_byte(tp, MCU_TYPE_USB, 0xcfef) & 1) {
1083                         ocp_write_word(tp, MCU_TYPE_USB, 0xfc30, 0x1578);
1084                         ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ff);
1085                 } else {
1086                         ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00ef);
1087                 }
1088
1089                 rtl_clear_bp(tp, MCU_TYPE_PLA);
1090
1091                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
1092                 generic_ocp_write(tp, 0xf800, 0xff,
1093                                   sizeof(r8153_pla_patch_c),
1094                                   r8153_pla_patch_c, MCU_TYPE_PLA);
1095
1096                 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_c_bp); i += 2)
1097                         ocp_write_word(tp, MCU_TYPE_PLA,
1098                                        r8153_pla_patch_c_bp[i],
1099                                        r8153_pla_patch_c_bp[i+1]);
1100
1101                 ocp_write_word(tp, MCU_TYPE_PLA, 0xd388, 0x08ca);
1102
1103                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS,
1104                                U3P3_CHECK_EN | 4);
1105
1106                 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcfca);
1107                 ocp_data |= 0x4000;
1108                 ocp_write_word(tp, MCU_TYPE_USB, 0xcfca, ocp_data);
1109
1110                 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
1111                 ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
1112                 ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
1113         } else if (tp->version == RTL_VER_06) {
1114                 u32 ocp_data;
1115
1116                 r8153_pre_ram_code(tp, 0x7002);
1117
1118                 for (i = 0; i < ARRAY_SIZE(r8153_ram_code_d); i += 2)
1119                         ocp_write_word(tp, MCU_TYPE_PLA,
1120                                        r8153_ram_code_d[i],
1121                                        r8153_ram_code_d[i+1]);
1122
1123                 r8153_post_ram_code(tp);
1124
1125                 rtl_clear_bp(tp, MCU_TYPE_USB);
1126
1127                 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
1128                 generic_ocp_write(tp, 0xf800, 0xff, sizeof(usb_patch_d),
1129                                   usb_patch_d, MCU_TYPE_USB);
1130
1131                 for (i = 0; i < ARRAY_SIZE(r8153_usb_patch_d_bp); i += 2)
1132                         ocp_write_word(tp, MCU_TYPE_USB,
1133                                        r8153_usb_patch_d_bp[i],
1134                                        r8153_usb_patch_d_bp[i+1]);
1135
1136                 rtl_clear_bp(tp, MCU_TYPE_PLA);
1137
1138                 ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
1139                 generic_ocp_write(tp, 0xf800, 0xff, sizeof(pla_patch_d),
1140                                   pla_patch_d, MCU_TYPE_PLA);
1141
1142                 for (i = 0; i < ARRAY_SIZE(r8153_pla_patch_d_bp); i += 2)
1143                         ocp_write_word(tp, MCU_TYPE_PLA,
1144                                        r8153_pla_patch_d_bp[i],
1145                                        r8153_pla_patch_d_bp[i + 1]);
1146
1147                 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
1148                 ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
1149                 ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
1150
1151                 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1);
1152                 ocp_data |= FW_IP_RESET_EN;
1153                 ocp_write_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1, ocp_data);
1154         }
1155 }
1156
1157 void r8153b_firmware(struct r8152 *tp)
1158 {
1159         u32 ocp_data;
1160         int i;
1161
1162         if (tp->version != RTL_VER_09)
1163                 return;
1164
1165         rtl_clear_bp(tp, MCU_TYPE_USB);
1166
1167         ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x0000);
1168         generic_ocp_write(tp, 0xe600, 0xff, sizeof(usb_patch2_b),
1169                           usb_patch2_b, MCU_TYPE_USB);
1170
1171         for (i = 0; i < ARRAY_SIZE(r8153b_usb_patch_b_bp); i += 2)
1172                 ocp_write_word(tp, MCU_TYPE_USB,
1173                                r8153b_usb_patch_b_bp[i],
1174                                r8153b_usb_patch_b_bp[i + 1]);
1175
1176         rtl_clear_bp(tp, MCU_TYPE_PLA);
1177
1178         ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0000);
1179         generic_ocp_write(tp, 0xf800, 0xff, sizeof(pla_patch2_b),
1180                           pla_patch2_b, MCU_TYPE_PLA);
1181
1182         for (i = 0; i < ARRAY_SIZE(r8153b_pla_patch_b_bp); i += 2)
1183                 ocp_write_word(tp, MCU_TYPE_PLA,
1184                                r8153b_pla_patch_b_bp[i],
1185                                r8153b_pla_patch_b_bp[i + 1]);
1186
1187         ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
1188         ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
1189         ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
1190
1191         ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1);
1192         ocp_data |= FW_IP_RESET_EN;
1193         ocp_write_word(tp, MCU_TYPE_USB, USB_FW_FIX_EN1, ocp_data);
1194 }