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