This source file includes following definitions.
- hswapn
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <sys/types.h>
19 #include <dev/pci/if_bnxreg.h>
20 #include <fcntl.h>
21 #include <stdlib.h>
22 #include <err.h>
23 #include <unistd.h>
24 #include <string.h>
25 #include <stdio.h>
26
27 #include "bnxfw.h"
28
29 int bnx_rv2p_proc1len;
30 int bnx_rv2p_proc2len;
31
32 #define FILENAME "bnx"
33
34 struct chunks {
35 void *start;
36 int *len;
37 } chunks[] = {
38 { bnx_COM_b06FwText, &bnx_COM_b06FwTextLen },
39 { bnx_COM_b06FwData, &bnx_COM_b06FwDataLen },
40 { bnx_COM_b06FwRodata, &bnx_COM_b06FwRodataLen },
41 { bnx_COM_b06FwBss, &bnx_COM_b06FwBssLen },
42 { bnx_COM_b06FwSbss, &bnx_COM_b06FwSbssLen },
43
44 { bnx_RXP_b06FwText, &bnx_RXP_b06FwTextLen },
45 { bnx_RXP_b06FwData, &bnx_RXP_b06FwDataLen },
46 { bnx_RXP_b06FwRodata, &bnx_RXP_b06FwRodataLen },
47 { bnx_RXP_b06FwBss, &bnx_RXP_b06FwBssLen },
48 { bnx_RXP_b06FwSbss, &bnx_RXP_b06FwSbssLen },
49
50 { bnx_TPAT_b06FwText, &bnx_TPAT_b06FwTextLen },
51 { bnx_TPAT_b06FwData, &bnx_TPAT_b06FwDataLen },
52 { bnx_TPAT_b06FwRodata, &bnx_TPAT_b06FwRodataLen },
53 { bnx_TPAT_b06FwBss, &bnx_TPAT_b06FwBssLen },
54 { bnx_TPAT_b06FwSbss, &bnx_TPAT_b06FwSbssLen },
55
56 { bnx_TXP_b06FwText, &bnx_TXP_b06FwTextLen },
57 { bnx_TXP_b06FwData, &bnx_TXP_b06FwDataLen },
58 { bnx_TXP_b06FwRodata, &bnx_TXP_b06FwRodataLen },
59 { bnx_TXP_b06FwBss, &bnx_TXP_b06FwBssLen },
60 { bnx_TXP_b06FwSbss, &bnx_TXP_b06FwSbssLen },
61
62 { bnx_rv2p_proc1, &bnx_rv2p_proc1len },
63 { bnx_rv2p_proc2, &bnx_rv2p_proc2len }
64 };
65
66 void
67 hswapn(u_int32_t *p, int wcount)
68 {
69 for (; wcount; wcount -=4) {
70 *p = htonl(*p);
71 p++;
72 }
73 }
74
75 int
76 main(int argc, char *argv[])
77 {
78 struct bnx_firmware_header bfproto, *bf;
79 int fd, i, total;
80 ssize_t rlen;
81
82 bnx_rv2p_proc1len = sizeof bnx_rv2p_proc1;
83 bnx_rv2p_proc2len = sizeof bnx_rv2p_proc2;
84
85 bf = (struct bnx_firmware_header *)malloc(sizeof *bf);
86 bzero(bf, sizeof *bf);
87
88
89 bf->bnx_COM_b06FwReleaseMajor = htonl(bnx_COM_b06FwReleaseMajor);
90 bf->bnx_COM_b06FwReleaseMinor = htonl(bnx_COM_b06FwReleaseMinor);
91 bf->bnx_COM_b06FwReleaseFix = htonl(bnx_COM_b06FwReleaseFix);
92 bf->bnx_COM_b06FwStartAddr = htonl(bnx_COM_b06FwStartAddr);
93 bf->bnx_COM_b06FwTextAddr = htonl(bnx_COM_b06FwTextAddr);
94 bf->bnx_COM_b06FwTextLen = htonl(bnx_COM_b06FwTextLen);
95 bf->bnx_COM_b06FwDataAddr = htonl(bnx_COM_b06FwDataAddr);
96 bf->bnx_COM_b06FwDataLen = htonl(bnx_COM_b06FwDataLen);
97 bf->bnx_COM_b06FwRodataAddr = htonl(bnx_COM_b06FwRodataAddr);
98 bf->bnx_COM_b06FwRodataLen = htonl(bnx_COM_b06FwRodataLen);
99 bf->bnx_COM_b06FwBssAddr = htonl(bnx_COM_b06FwBssAddr);
100 bf->bnx_COM_b06FwBssLen = htonl(bnx_COM_b06FwBssLen);
101 bf->bnx_COM_b06FwSbssAddr = htonl(bnx_COM_b06FwSbssAddr);
102 bf->bnx_COM_b06FwSbssLen = htonl(bnx_COM_b06FwSbssLen);
103
104 bf->bnx_RXP_b06FwReleaseMajor = htonl(bnx_RXP_b06FwReleaseMajor);
105 bf->bnx_RXP_b06FwReleaseMinor = htonl(bnx_RXP_b06FwReleaseMinor);
106 bf->bnx_RXP_b06FwReleaseFix = htonl(bnx_RXP_b06FwReleaseFix);
107 bf->bnx_RXP_b06FwStartAddr = htonl(bnx_RXP_b06FwStartAddr);
108 bf->bnx_RXP_b06FwTextAddr = htonl(bnx_RXP_b06FwTextAddr);
109 bf->bnx_RXP_b06FwTextLen = htonl(bnx_RXP_b06FwTextLen);
110 bf->bnx_RXP_b06FwDataAddr = htonl(bnx_RXP_b06FwDataAddr);
111 bf->bnx_RXP_b06FwDataLen = htonl(bnx_RXP_b06FwDataLen);
112 bf->bnx_RXP_b06FwRodataAddr = htonl(bnx_RXP_b06FwRodataAddr);
113 bf->bnx_RXP_b06FwRodataLen = htonl(bnx_RXP_b06FwRodataLen);
114 bf->bnx_RXP_b06FwBssAddr = htonl(bnx_RXP_b06FwBssAddr);
115 bf->bnx_RXP_b06FwBssLen = htonl(bnx_RXP_b06FwBssLen);
116 bf->bnx_RXP_b06FwSbssAddr = htonl(bnx_RXP_b06FwSbssAddr);
117 bf->bnx_RXP_b06FwSbssLen = htonl(bnx_RXP_b06FwSbssLen);
118
119 bf->bnx_TPAT_b06FwReleaseMajor = htonl(bnx_TPAT_b06FwReleaseMajor);
120 bf->bnx_TPAT_b06FwReleaseMinor = htonl(bnx_TPAT_b06FwReleaseMinor);
121 bf->bnx_TPAT_b06FwReleaseFix = htonl(bnx_TPAT_b06FwReleaseFix);
122 bf->bnx_TPAT_b06FwStartAddr = htonl(bnx_TPAT_b06FwStartAddr);
123 bf->bnx_TPAT_b06FwTextAddr = htonl(bnx_TPAT_b06FwTextAddr);
124 bf->bnx_TPAT_b06FwTextLen = htonl(bnx_TPAT_b06FwTextLen);
125 bf->bnx_TPAT_b06FwDataAddr = htonl(bnx_TPAT_b06FwDataAddr);
126 bf->bnx_TPAT_b06FwDataLen = htonl(bnx_TPAT_b06FwDataLen);
127 bf->bnx_TPAT_b06FwRodataAddr = htonl(bnx_TPAT_b06FwRodataAddr);
128 bf->bnx_TPAT_b06FwRodataLen = htonl(bnx_TPAT_b06FwRodataLen);
129 bf->bnx_TPAT_b06FwBssAddr = htonl(bnx_TPAT_b06FwBssAddr);
130 bf->bnx_TPAT_b06FwBssLen = htonl(bnx_TPAT_b06FwBssLen);
131 bf->bnx_TPAT_b06FwSbssAddr = htonl(bnx_TPAT_b06FwSbssAddr);
132 bf->bnx_TPAT_b06FwSbssLen = htonl(bnx_TPAT_b06FwSbssLen);
133
134 bf->bnx_TXP_b06FwReleaseMajor = htonl(bnx_TXP_b06FwReleaseMajor);
135 bf->bnx_TXP_b06FwReleaseMinor = htonl(bnx_TXP_b06FwReleaseMinor);
136 bf->bnx_TXP_b06FwReleaseFix = htonl(bnx_TXP_b06FwReleaseFix);
137 bf->bnx_TXP_b06FwStartAddr = htonl(bnx_TXP_b06FwStartAddr);
138 bf->bnx_TXP_b06FwTextAddr = htonl(bnx_TXP_b06FwTextAddr);
139 bf->bnx_TXP_b06FwTextLen = htonl(bnx_TXP_b06FwTextLen);
140 bf->bnx_TXP_b06FwDataAddr = htonl(bnx_TXP_b06FwDataAddr);
141 bf->bnx_TXP_b06FwDataLen = htonl(bnx_TXP_b06FwDataLen);
142 bf->bnx_TXP_b06FwRodataAddr = htonl(bnx_TXP_b06FwRodataAddr);
143 bf->bnx_TXP_b06FwRodataLen = htonl(bnx_TXP_b06FwRodataLen);
144 bf->bnx_TXP_b06FwBssAddr = htonl(bnx_TXP_b06FwBssAddr);
145 bf->bnx_TXP_b06FwBssLen = htonl(bnx_TXP_b06FwBssLen);
146 bf->bnx_TXP_b06FwSbssAddr = htonl(bnx_TXP_b06FwSbssAddr);
147 bf->bnx_TXP_b06FwSbssLen = htonl(bnx_TXP_b06FwSbssLen);
148
149 bf->bnx_rv2p_proc1len = htonl(bnx_rv2p_proc1len);
150 bf->bnx_rv2p_proc2len = htonl(bnx_rv2p_proc2len);
151
152 printf("creating %s", FILENAME);
153 fd = open(FILENAME, O_WRONLY|O_CREAT|O_TRUNC, 0644);
154 if (fd == -1)
155 err(1, FILENAME);
156
157 rlen = write(fd, bf, sizeof *bf);
158 if (rlen == -1)
159 err(1, "%s", FILENAME);
160 if (rlen != sizeof *bf)
161 errx(1, "%s: short write", FILENAME);
162 total = rlen;
163 printf(" [%d", total);
164 fflush(stdout);
165
166 for (i = 0; i < sizeof(chunks) / sizeof(chunks[0]); i++) {
167 hswapn(chunks[i].start, *chunks[i].len);
168 rlen = write(fd, chunks[i].start, *chunks[i].len);
169 if (rlen == -1) {
170 printf("\n");
171 err(1, "%s", FILENAME);
172 }
173 if (rlen != *chunks[i].len) {
174 printf("\n");
175 errx(1, "%s: short write", FILENAME);
176 }
177 printf("+%d", rlen);
178 fflush(stdout);
179 total += rlen;
180 }
181
182 printf("] total %d\n", total);
183
184 free(bf);
185 close(fd);
186 return 0;
187 }