blob: b8a89947ac480e4d92ff46ac8a2404e8449306f6 [file] [log] [blame]
Shad Ansari2f7f9be2017-06-07 13:34:53 -07001/*
2<:copyright-BRCM:2016:DUAL/GPL:standard
3
4 Broadcom Proprietary and Confidential.(c) 2016 Broadcom
5 All Rights Reserved
6
7Unless you and Broadcom execute a separate written software license
8agreement governing use of this software, this software is licensed
9to you under the terms of the GNU General Public License version 2
10(the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
11with the following added to such license:
12
13 As a special exception, the copyright holders of this software give
14 you permission to link this software with independent modules, and
15 to copy and distribute the resulting executable under terms of your
16 choice, provided that you also meet, for each linked independent
17 module, the terms and conditions of the license of that module.
18 An independent module is a module which is not derived from this
19 software. The special exception does not apply to any modifications
20 of the software.
21
22Not withstanding the above, under no circumstances may you combine
23this software in any way with any other Broadcom software provided
24under a license other than the GPL, without Broadcom's express prior
25written consent.
26
27:>
28 */
29
30#include "bcmolt_utils.h"
31
32/* HexPrint a single line */
33#define BYTES_IN_LINE 16
34
35#define b2a(c) (isprint(c)?c:'.')
36
37static void _hexprint1(bcmos_msg_print_cb print_cb, void *context, uint16_t o, const uint8_t *p_data, uint16_t count, const char *indent)
38{
39 int i;
40
41 if (indent)
42 print_cb(context, "%s", indent);
43
44 print_cb(context, "%04x: ", o);
45 for (i=0; i<count; i++)
46 {
47 print_cb(context, "%02x", p_data[i]);
48 if (!((i+1)%4))
49 print_cb(context, " ");
50 }
51 for (; i<BYTES_IN_LINE; i++)
52 {
53 if (!((i+1)%4))
54 print_cb(context, " ");
55 else
56 print_cb(context, " ");
57 }
58 for (i=0; i<count; i++)
59 print_cb(context, "%c", b2a(p_data[i]));
60 print_cb(context, "\n");
61}
62
63void bcmos_hexdump(bcmos_msg_print_cb print_cb, void *context, const void *buffer, uint32_t offset, uint32_t count, const char *indent)
64{
65 const uint8_t *p_data = buffer;
66 uint16_t n;
67
68 while (count)
69 {
70 n = (count > BYTES_IN_LINE) ? BYTES_IN_LINE : count;
71 _hexprint1(print_cb, context, offset, p_data, n, indent);
72 count -= n;
73 p_data += n;
74 offset += n;
75 }
76}
77
78void bcmos_hexdump_one_line(const char *funcname, /* __FUNCTION__ */
79 uint32_t lineno, /* __LINE__ */
80 bcmos_msg_print_cb print_cb,
81 void *context,
82 const void *buffer, /* start of memory region to dump */
83 uint32_t start_offset, /* start offset into the region */
84 uint32_t byte_count, /* number of bytes in region to dump */
85 const char *prefix, /* optional prefix string */
86 const char *suffix) /* optional suffix string */
87{
88 const uint8_t *p_data = buffer;
89 uint32_t data_offset = start_offset;
90 size_t max_buf_size = 8000; /* room enough to dump ~2600 bytes with shortish prefixes/suffixes */
91 char *out_buf = bcmos_calloc(max_buf_size);
92 size_t out_buf_offset = 0;
93 uint32_t tmp_num_chars = 0;
94
95 BUG_UNLESS(out_buf);
96
97 memset(out_buf, 0, max_buf_size);
98
99 if (prefix)
100 {
101 tmp_num_chars = snprintf(out_buf + out_buf_offset, /* out_buf start offset */
102 max_buf_size - out_buf_offset, /* remaining space in out_buf */
103 "\n%40s:%-5u %s", funcname, lineno, prefix);
104 }
105 else
106 {
107 tmp_num_chars = snprintf(out_buf + out_buf_offset, /* out_buf start offset */
108 max_buf_size - out_buf_offset, /* remaining space in out_buf */
109 "\n");
110 }
111 out_buf_offset += tmp_num_chars;
112
113 while ((data_offset < (start_offset + byte_count)) && (out_buf_offset < max_buf_size))
114 {
115 tmp_num_chars = snprintf(out_buf + out_buf_offset, /* out_buf start offset */
116 max_buf_size - out_buf_offset, /* remaining space in out_buf */
117 "%02x ",
118 p_data[data_offset++]); /* byte to dump */
119 BUG_UNLESS(3 == tmp_num_chars);
120 out_buf_offset += tmp_num_chars;
121 }
122
123 if (tmp_num_chars < max_buf_size)
124 {
125 if (suffix)
126 {
127 tmp_num_chars = snprintf(out_buf + out_buf_offset, /* out_buf start offset */
128 max_buf_size - out_buf_offset, /* remaining space in out_buf */
129 "%s", suffix);
130 }
131 else
132 {
133 tmp_num_chars = snprintf(out_buf + out_buf_offset, /* out_buf start offset */
134 max_buf_size - out_buf_offset, /* remaining space in out_buf */
135 "\n");
136 }
137 out_buf_offset += tmp_num_chars;
138 BUG_UNLESS(out_buf_offset < max_buf_size);
139 }
140
141 print_cb(context, "%s", out_buf);
142 bcmos_free(out_buf);
143}
144
145static uint32_t eth_crc32_tab[] =
146{
147 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
148 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
149 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
150 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
151 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
152 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
153 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
154 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
155 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
156 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
157 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
158 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
159 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
160 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
161 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
162 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
163 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
164 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
165 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
166 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
167 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
168 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
169 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
170 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
171 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
172 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
173 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
174 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
175 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
176 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
177 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
178 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
179 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
180 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
181 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
182 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
183 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
184 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
185 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
186 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
187 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
188 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
189 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
190};
191
192uint32_t eth_calc_crc32(uint32_t crc, const void *buf, size_t size)
193{
194 const uint8_t *p;
195
196 p = buf;
197 crc = crc ^ ~0U;
198
199 while (size--)
200 crc = eth_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
201
202 return crc ^ ~0U;
203}
204