diff options
-rw-r--r-- | drivers/char/rio/rioboot.c | 429 |
1 files changed, 177 insertions, 252 deletions
diff --git a/drivers/char/rio/rioboot.c b/drivers/char/rio/rioboot.c index 9a96fc644e52..e1542e8dfb43 100644 --- a/drivers/char/rio/rioboot.c +++ b/drivers/char/rio/rioboot.c | |||
@@ -30,25 +30,19 @@ | |||
30 | ** ----------------------------------------------------------------------------- | 30 | ** ----------------------------------------------------------------------------- |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #ifdef SCCS_LABELS | ||
34 | static char *_rioboot_c_sccs_ = "@(#)rioboot.c 1.3"; | ||
35 | #endif | ||
36 | |||
37 | #include <linux/module.h> | 33 | #include <linux/module.h> |
38 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <linux/termios.h> | ||
36 | #include <linux/serial.h> | ||
37 | #include <asm/semaphore.h> | ||
38 | #include <linux/generic_serial.h> | ||
39 | #include <linux/errno.h> | 39 | #include <linux/errno.h> |
40 | #include <linux/interrupt.h> | 40 | #include <linux/interrupt.h> |
41 | #include <linux/delay.h> | ||
41 | #include <asm/io.h> | 42 | #include <asm/io.h> |
42 | #include <asm/system.h> | 43 | #include <asm/system.h> |
43 | #include <asm/string.h> | 44 | #include <asm/string.h> |
44 | #include <asm/semaphore.h> | 45 | #include <asm/uaccess.h> |
45 | |||
46 | |||
47 | #include <linux/termios.h> | ||
48 | #include <linux/serial.h> | ||
49 | |||
50 | #include <linux/generic_serial.h> | ||
51 | |||
52 | 46 | ||
53 | 47 | ||
54 | #include "linux_compat.h" | 48 | #include "linux_compat.h" |
@@ -80,9 +74,9 @@ static char *_rioboot_c_sccs_ = "@(#)rioboot.c 1.3"; | |||
80 | #include "cmdblk.h" | 74 | #include "cmdblk.h" |
81 | #include "route.h" | 75 | #include "route.h" |
82 | 76 | ||
83 | static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, struct PktCmd *PktCmdP); | 77 | static int RIOBootComplete(struct rio_info *p, struct Host *HostP, unsigned int Rup, struct PktCmd *PktCmdP); |
84 | 78 | ||
85 | static uchar RIOAtVec2Ctrl[] = { | 79 | static const unsigned char RIOAtVec2Ctrl[] = { |
86 | /* 0 */ INTERRUPT_DISABLE, | 80 | /* 0 */ INTERRUPT_DISABLE, |
87 | /* 1 */ INTERRUPT_DISABLE, | 81 | /* 1 */ INTERRUPT_DISABLE, |
88 | /* 2 */ INTERRUPT_DISABLE, | 82 | /* 2 */ INTERRUPT_DISABLE, |
@@ -101,22 +95,22 @@ static uchar RIOAtVec2Ctrl[] = { | |||
101 | /* 15 */ IRQ_15 | INTERRUPT_ENABLE | 95 | /* 15 */ IRQ_15 | INTERRUPT_ENABLE |
102 | }; | 96 | }; |
103 | 97 | ||
104 | /* | 98 | /** |
105 | ** Load in the RTA boot code. | 99 | * RIOBootCodeRTA - Load RTA boot code |
106 | */ | 100 | * @p: RIO to load |
107 | int RIOBootCodeRTA(p, rbp) | 101 | * @rbp: Download descriptor |
108 | struct rio_info *p; | 102 | * |
109 | struct DownLoad *rbp; | 103 | * Called when the user process initiates booting of the card firmware. |
104 | * Lads the firmware | ||
105 | */ | ||
106 | |||
107 | int RIOBootCodeRTA(struct rio_info *p, struct DownLoad * rbp) | ||
110 | { | 108 | { |
111 | int offset; | 109 | int offset; |
112 | 110 | ||
113 | func_enter(); | 111 | func_enter(); |
114 | 112 | ||
115 | /* Linux doesn't allow you to disable interrupts during a | 113 | rio_dprintk(RIO_DEBUG_BOOT, "Data at user address %p\n", rbp->DataP); |
116 | "copyin". (Crash when a pagefault occurs). */ | ||
117 | /* disable(oldspl); */ | ||
118 | |||
119 | rio_dprintk(RIO_DEBUG_BOOT, "Data at user address 0x%x\n", (int) rbp->DataP); | ||
120 | 114 | ||
121 | /* | 115 | /* |
122 | ** Check that we have set asside enough memory for this | 116 | ** Check that we have set asside enough memory for this |
@@ -124,7 +118,6 @@ struct DownLoad *rbp; | |||
124 | if (rbp->Count > SIXTY_FOUR_K) { | 118 | if (rbp->Count > SIXTY_FOUR_K) { |
125 | rio_dprintk(RIO_DEBUG_BOOT, "RTA Boot Code Too Large!\n"); | 119 | rio_dprintk(RIO_DEBUG_BOOT, "RTA Boot Code Too Large!\n"); |
126 | p->RIOError.Error = HOST_FILE_TOO_LARGE; | 120 | p->RIOError.Error = HOST_FILE_TOO_LARGE; |
127 | /* restore(oldspl); */ | ||
128 | func_exit(); | 121 | func_exit(); |
129 | return -ENOMEM; | 122 | return -ENOMEM; |
130 | } | 123 | } |
@@ -132,7 +125,6 @@ struct DownLoad *rbp; | |||
132 | if (p->RIOBooting) { | 125 | if (p->RIOBooting) { |
133 | rio_dprintk(RIO_DEBUG_BOOT, "RTA Boot Code : BUSY BUSY BUSY!\n"); | 126 | rio_dprintk(RIO_DEBUG_BOOT, "RTA Boot Code : BUSY BUSY BUSY!\n"); |
134 | p->RIOError.Error = BOOT_IN_PROGRESS; | 127 | p->RIOError.Error = BOOT_IN_PROGRESS; |
135 | /* restore(oldspl); */ | ||
136 | func_exit(); | 128 | func_exit(); |
137 | return -EBUSY; | 129 | return -EBUSY; |
138 | } | 130 | } |
@@ -149,16 +141,15 @@ struct DownLoad *rbp; | |||
149 | ** because it will (eventually) be part of the Rta run time environment | 141 | ** because it will (eventually) be part of the Rta run time environment |
150 | ** and so should be zeroed. | 142 | ** and so should be zeroed. |
151 | */ | 143 | */ |
152 | bzero((caddr_t) p->RIOBootPackets, offset); | 144 | memset(p->RIOBootPackets, 0, offset); |
153 | 145 | ||
154 | /* | 146 | /* |
155 | ** Copy the data from user space. | 147 | ** Copy the data from user space into the array |
156 | */ | 148 | */ |
157 | 149 | ||
158 | if (copyin((int) rbp->DataP, ((caddr_t) (p->RIOBootPackets)) + offset, rbp->Count) == COPYFAIL) { | 150 | if (copy_from_user(((u8 *)p->RIOBootPackets) + offset, rbp->DataP, rbp->Count)) { |
159 | rio_dprintk(RIO_DEBUG_BOOT, "Bad data copy from user space\n"); | 151 | rio_dprintk(RIO_DEBUG_BOOT, "Bad data copy from user space\n"); |
160 | p->RIOError.Error = COPYIN_FAILED; | 152 | p->RIOError.Error = COPYIN_FAILED; |
161 | /* restore(oldspl); */ | ||
162 | func_exit(); | 153 | func_exit(); |
163 | return -EFAULT; | 154 | return -EFAULT; |
164 | } | 155 | } |
@@ -170,40 +161,25 @@ struct DownLoad *rbp; | |||
170 | p->RIONumBootPkts = (rbp->Count + offset) / RTA_BOOT_DATA_SIZE; | 161 | p->RIONumBootPkts = (rbp->Count + offset) / RTA_BOOT_DATA_SIZE; |
171 | p->RIOBootCount = rbp->Count; | 162 | p->RIOBootCount = rbp->Count; |
172 | 163 | ||
173 | /* restore(oldspl); */ | ||
174 | func_exit(); | 164 | func_exit(); |
175 | return 0; | 165 | return 0; |
176 | } | 166 | } |
177 | 167 | ||
168 | /** | ||
169 | * rio_start_card_running - host card start | ||
170 | * @HostP: The RIO to kick off | ||
171 | * | ||
172 | * Start a RIO processor unit running. Encapsulates the knowledge | ||
173 | * of the card type. | ||
174 | */ | ||
175 | |||
178 | void rio_start_card_running(struct Host *HostP) | 176 | void rio_start_card_running(struct Host *HostP) |
179 | { | 177 | { |
180 | func_enter(); | ||
181 | |||
182 | switch (HostP->Type) { | 178 | switch (HostP->Type) { |
183 | case RIO_AT: | 179 | case RIO_AT: |
184 | rio_dprintk(RIO_DEBUG_BOOT, "Start ISA card running\n"); | 180 | rio_dprintk(RIO_DEBUG_BOOT, "Start ISA card running\n"); |
185 | WBYTE(HostP->Control, BOOT_FROM_RAM | EXTERNAL_BUS_ON | HostP->Mode | RIOAtVec2Ctrl[HostP->Ivec & 0xF]); | 181 | writeb(BOOT_FROM_RAM | EXTERNAL_BUS_ON | HostP->Mode | RIOAtVec2Ctrl[HostP->Ivec & 0xF], &HostP->Control); |
186 | break; | ||
187 | |||
188 | #ifdef FUTURE_RELEASE | ||
189 | case RIO_MCA: | ||
190 | /* | ||
191 | ** MCA handles IRQ vectors differently, so we don't write | ||
192 | ** them to this register. | ||
193 | */ | ||
194 | rio_dprintk(RIO_DEBUG_BOOT, "Start MCA card running\n"); | ||
195 | WBYTE(HostP->Control, McaTpBootFromRam | McaTpBusEnable | HostP->Mode); | ||
196 | break; | ||
197 | |||
198 | case RIO_EISA: | ||
199 | /* | ||
200 | ** EISA is totally different and expects OUTBZs to turn it on. | ||
201 | */ | ||
202 | rio_dprintk(RIO_DEBUG_BOOT, "Start EISA card running\n"); | ||
203 | OUTBZ(HostP->Slot, EISA_CONTROL_PORT, HostP->Mode | RIOEisaVec2Ctrl[HostP->Ivec] | EISA_TP_RUN | EISA_TP_BUS_ENABLE | EISA_TP_BOOT_FROM_RAM); | ||
204 | break; | 182 | break; |
205 | #endif | ||
206 | |||
207 | case RIO_PCI: | 183 | case RIO_PCI: |
208 | /* | 184 | /* |
209 | ** PCI is much the same as MCA. Everything is once again memory | 185 | ** PCI is much the same as MCA. Everything is once again memory |
@@ -211,16 +187,12 @@ void rio_start_card_running(struct Host *HostP) | |||
211 | ** ports. | 187 | ** ports. |
212 | */ | 188 | */ |
213 | rio_dprintk(RIO_DEBUG_BOOT, "Start PCI card running\n"); | 189 | rio_dprintk(RIO_DEBUG_BOOT, "Start PCI card running\n"); |
214 | WBYTE(HostP->Control, PCITpBootFromRam | PCITpBusEnable | HostP->Mode); | 190 | writeb(PCITpBootFromRam | PCITpBusEnable | HostP->Mode, &HostP->Control); |
215 | break; | 191 | break; |
216 | default: | 192 | default: |
217 | rio_dprintk(RIO_DEBUG_BOOT, "Unknown host type %d\n", HostP->Type); | 193 | rio_dprintk(RIO_DEBUG_BOOT, "Unknown host type %d\n", HostP->Type); |
218 | break; | 194 | break; |
219 | } | 195 | } |
220 | /* | ||
221 | printk (KERN_INFO "Done with starting the card\n"); | ||
222 | func_exit (); | ||
223 | */ | ||
224 | return; | 196 | return; |
225 | } | 197 | } |
226 | 198 | ||
@@ -231,40 +203,41 @@ void rio_start_card_running(struct Host *HostP) | |||
231 | ** Put your rubber pants on before messing with this code - even the magic | 203 | ** Put your rubber pants on before messing with this code - even the magic |
232 | ** numbers have trouble understanding what they are doing here. | 204 | ** numbers have trouble understanding what they are doing here. |
233 | */ | 205 | */ |
234 | int RIOBootCodeHOST(p, rbp) | 206 | |
235 | struct rio_info *p; | 207 | int RIOBootCodeHOST(struct rio_info *p, struct DownLoad *rbp) |
236 | register struct DownLoad *rbp; | ||
237 | { | 208 | { |
238 | register struct Host *HostP; | 209 | struct Host *HostP; |
239 | register caddr_t Cad; | 210 | u8 *Cad; |
240 | register PARM_MAP *ParmMapP; | 211 | PARM_MAP *ParmMapP; |
241 | register int RupN; | 212 | int RupN; |
242 | int PortN; | 213 | int PortN; |
243 | uint host; | 214 | unsigned int host; |
244 | caddr_t StartP; | 215 | u8 *StartP; |
245 | BYTE *DestP; | 216 | u8 *DestP; |
246 | int wait_count; | 217 | int wait_count; |
247 | ushort OldParmMap; | 218 | u16 OldParmMap; |
248 | ushort offset; /* It is very important that this is a ushort */ | 219 | u16 offset; /* It is very important that this is a u16 */ |
249 | /* uint byte; */ | 220 | u8 *DownCode = NULL; |
250 | caddr_t DownCode = NULL; | ||
251 | unsigned long flags; | 221 | unsigned long flags; |
252 | 222 | ||
253 | HostP = NULL; /* Assure the compiler we've initialized it */ | 223 | HostP = NULL; /* Assure the compiler we've initialized it */ |
224 | |||
225 | |||
226 | /* Walk the hosts */ | ||
254 | for (host = 0; host < p->RIONumHosts; host++) { | 227 | for (host = 0; host < p->RIONumHosts; host++) { |
255 | rio_dprintk(RIO_DEBUG_BOOT, "Attempt to boot host %d\n", host); | 228 | rio_dprintk(RIO_DEBUG_BOOT, "Attempt to boot host %d\n", host); |
256 | HostP = &p->RIOHosts[host]; | 229 | HostP = &p->RIOHosts[host]; |
257 | 230 | ||
258 | rio_dprintk(RIO_DEBUG_BOOT, "Host Type = 0x%x, Mode = 0x%x, IVec = 0x%x\n", HostP->Type, HostP->Mode, HostP->Ivec); | 231 | rio_dprintk(RIO_DEBUG_BOOT, "Host Type = 0x%x, Mode = 0x%x, IVec = 0x%x\n", HostP->Type, HostP->Mode, HostP->Ivec); |
259 | 232 | ||
260 | 233 | /* Don't boot hosts already running */ | |
261 | if ((HostP->Flags & RUN_STATE) != RC_WAITING) { | 234 | if ((HostP->Flags & RUN_STATE) != RC_WAITING) { |
262 | rio_dprintk(RIO_DEBUG_BOOT, "%s %d already running\n", "Host", host); | 235 | rio_dprintk(RIO_DEBUG_BOOT, "%s %d already running\n", "Host", host); |
263 | continue; | 236 | continue; |
264 | } | 237 | } |
265 | 238 | ||
266 | /* | 239 | /* |
267 | ** Grab a 32 bit pointer to the card. | 240 | ** Grab a pointer to the card (ioremapped) |
268 | */ | 241 | */ |
269 | Cad = HostP->Caddr; | 242 | Cad = HostP->Caddr; |
270 | 243 | ||
@@ -274,13 +247,14 @@ register struct DownLoad *rbp; | |||
274 | ** Therefore, we need to start copying at address | 247 | ** Therefore, we need to start copying at address |
275 | ** (caddr+p->RIOConf.HostLoadBase-rbp->Count) | 248 | ** (caddr+p->RIOConf.HostLoadBase-rbp->Count) |
276 | */ | 249 | */ |
277 | StartP = (caddr_t) & Cad[p->RIOConf.HostLoadBase - rbp->Count]; | 250 | StartP = &Cad[p->RIOConf.HostLoadBase - rbp->Count]; |
278 | 251 | ||
279 | rio_dprintk(RIO_DEBUG_BOOT, "kernel virtual address for host is 0x%x\n", (int) Cad); | 252 | rio_dprintk(RIO_DEBUG_BOOT, "kernel virtual address for host is %p\n", Cad); |
280 | rio_dprintk(RIO_DEBUG_BOOT, "kernel virtual address for download is 0x%x\n", (int) StartP); | 253 | rio_dprintk(RIO_DEBUG_BOOT, "kernel virtual address for download is %p\n", StartP); |
281 | rio_dprintk(RIO_DEBUG_BOOT, "host loadbase is 0x%x\n", p->RIOConf.HostLoadBase); | 254 | rio_dprintk(RIO_DEBUG_BOOT, "host loadbase is 0x%x\n", p->RIOConf.HostLoadBase); |
282 | rio_dprintk(RIO_DEBUG_BOOT, "size of download is 0x%x\n", rbp->Count); | 255 | rio_dprintk(RIO_DEBUG_BOOT, "size of download is 0x%x\n", rbp->Count); |
283 | 256 | ||
257 | /* Make sure it fits */ | ||
284 | if (p->RIOConf.HostLoadBase < rbp->Count) { | 258 | if (p->RIOConf.HostLoadBase < rbp->Count) { |
285 | rio_dprintk(RIO_DEBUG_BOOT, "Bin too large\n"); | 259 | rio_dprintk(RIO_DEBUG_BOOT, "Bin too large\n"); |
286 | p->RIOError.Error = HOST_FILE_TOO_LARGE; | 260 | p->RIOError.Error = HOST_FILE_TOO_LARGE; |
@@ -300,39 +274,23 @@ register struct DownLoad *rbp; | |||
300 | */ | 274 | */ |
301 | rio_dprintk(RIO_DEBUG_BOOT, "Copy in code\n"); | 275 | rio_dprintk(RIO_DEBUG_BOOT, "Copy in code\n"); |
302 | 276 | ||
303 | /* | 277 | /* Buffer to local memory as we want to use I/O space and |
304 | ** PCI hostcard can't cope with 32 bit accesses and so need to copy | 278 | some cards only do 8 or 16 bit I/O */ |
305 | ** data to a local buffer, and then dripfeed the card. | ||
306 | */ | ||
307 | if (HostP->Type == RIO_PCI) { | ||
308 | /* int offset; */ | ||
309 | |||
310 | DownCode = sysbrk(rbp->Count); | ||
311 | if (!DownCode) { | ||
312 | rio_dprintk(RIO_DEBUG_BOOT, "No system memory available\n"); | ||
313 | p->RIOError.Error = NOT_ENOUGH_CORE_FOR_PCI_COPY; | ||
314 | func_exit(); | ||
315 | return -ENOMEM; | ||
316 | } | ||
317 | bzero(DownCode, rbp->Count); | ||
318 | |||
319 | if (copyin((int) rbp->DataP, DownCode, rbp->Count) == COPYFAIL) { | ||
320 | rio_dprintk(RIO_DEBUG_BOOT, "Bad copyin of host data\n"); | ||
321 | sysfree(DownCode, rbp->Count); | ||
322 | p->RIOError.Error = COPYIN_FAILED; | ||
323 | func_exit(); | ||
324 | return -EFAULT; | ||
325 | } | ||
326 | |||
327 | HostP->Copy(DownCode, StartP, rbp->Count); | ||
328 | 279 | ||
329 | sysfree(DownCode, rbp->Count); | 280 | DownCode = vmalloc(rbp->Count); |
330 | } else if (copyin((int) rbp->DataP, StartP, rbp->Count) == COPYFAIL) { | 281 | if (!DownCode) { |
331 | rio_dprintk(RIO_DEBUG_BOOT, "Bad copyin of host data\n"); | 282 | p->RIOError.Error = NOT_ENOUGH_CORE_FOR_PCI_COPY; |
283 | func_exit(); | ||
284 | return -ENOMEM; | ||
285 | } | ||
286 | if (copy_from_user(rbp->DataP, DownCode, rbp->Count)) { | ||
287 | kfree(DownCode); | ||
332 | p->RIOError.Error = COPYIN_FAILED; | 288 | p->RIOError.Error = COPYIN_FAILED; |
333 | func_exit(); | 289 | func_exit(); |
334 | return -EFAULT; | 290 | return -EFAULT; |
335 | } | 291 | } |
292 | HostP->Copy(DownCode, StartP, rbp->Count); | ||
293 | vfree(DownCode); | ||
336 | 294 | ||
337 | rio_dprintk(RIO_DEBUG_BOOT, "Copy completed\n"); | 295 | rio_dprintk(RIO_DEBUG_BOOT, "Copy completed\n"); |
338 | 296 | ||
@@ -411,7 +369,7 @@ register struct DownLoad *rbp; | |||
411 | ** a short branch to 0x7FF8, where a long branch is coded. | 369 | ** a short branch to 0x7FF8, where a long branch is coded. |
412 | */ | 370 | */ |
413 | 371 | ||
414 | DestP = (BYTE *) & Cad[0x7FF8]; /* <<<---- READ THE ABOVE COMMENTS */ | 372 | DestP = (u8 *) &Cad[0x7FF8]; /* <<<---- READ THE ABOVE COMMENTS */ |
415 | 373 | ||
416 | #define NFIX(N) (0x60 | (N)) /* .O = (~(.O + N))<<4 */ | 374 | #define NFIX(N) (0x60 | (N)) /* .O = (~(.O + N))<<4 */ |
417 | #define PFIX(N) (0x20 | (N)) /* .O = (.O + N)<<4 */ | 375 | #define PFIX(N) (0x20 | (N)) /* .O = (.O + N)<<4 */ |
@@ -427,13 +385,14 @@ register struct DownLoad *rbp; | |||
427 | ** cos I don't understand 2's complement). | 385 | ** cos I don't understand 2's complement). |
428 | */ | 386 | */ |
429 | offset = (p->RIOConf.HostLoadBase - 2) - 0x7FFC; | 387 | offset = (p->RIOConf.HostLoadBase - 2) - 0x7FFC; |
430 | WBYTE(DestP[0], NFIX(((ushort) (~offset) >> (ushort) 12) & 0xF)); | ||
431 | WBYTE(DestP[1], PFIX((offset >> 8) & 0xF)); | ||
432 | WBYTE(DestP[2], PFIX((offset >> 4) & 0xF)); | ||
433 | WBYTE(DestP[3], JUMP(offset & 0xF)); | ||
434 | 388 | ||
435 | WBYTE(DestP[6], NFIX(0)); | 389 | writeb(NFIX(((ushort) (~offset) >> (ushort) 12) & 0xF), DestP); |
436 | WBYTE(DestP[7], JUMP(8)); | 390 | writeb(PFIX((offset >> 8) & 0xF), DestP + 1); |
391 | writeb(PFIX((offset >> 4) & 0xF), DestP + 2); | ||
392 | writeb(JUMP(offset & 0xF), DestP + 3); | ||
393 | |||
394 | writeb(NFIX(0), DestP + 6); | ||
395 | writeb(JUMP(8), DestP + 7); | ||
437 | 396 | ||
438 | rio_dprintk(RIO_DEBUG_BOOT, "host loadbase is 0x%x\n", p->RIOConf.HostLoadBase); | 397 | rio_dprintk(RIO_DEBUG_BOOT, "host loadbase is 0x%x\n", p->RIOConf.HostLoadBase); |
439 | rio_dprintk(RIO_DEBUG_BOOT, "startup offset is 0x%x\n", offset); | 398 | rio_dprintk(RIO_DEBUG_BOOT, "startup offset is 0x%x\n", offset); |
@@ -448,7 +407,7 @@ register struct DownLoad *rbp; | |||
448 | ** Grab a copy of the current ParmMap pointer, so we | 407 | ** Grab a copy of the current ParmMap pointer, so we |
449 | ** can tell when it has changed. | 408 | ** can tell when it has changed. |
450 | */ | 409 | */ |
451 | OldParmMap = RWORD(HostP->__ParmMapR); | 410 | OldParmMap = readw(&HostP->__ParmMapR); |
452 | 411 | ||
453 | rio_dprintk(RIO_DEBUG_BOOT, "Original parmmap is 0x%x\n", OldParmMap); | 412 | rio_dprintk(RIO_DEBUG_BOOT, "Original parmmap is 0x%x\n", OldParmMap); |
454 | 413 | ||
@@ -467,9 +426,9 @@ register struct DownLoad *rbp; | |||
467 | ** Now, wait for upto five seconds for the Tp to setup the parmmap | 426 | ** Now, wait for upto five seconds for the Tp to setup the parmmap |
468 | ** pointer: | 427 | ** pointer: |
469 | */ | 428 | */ |
470 | for (wait_count = 0; (wait_count < p->RIOConf.StartupTime) && (RWORD(HostP->__ParmMapR) == OldParmMap); wait_count++) { | 429 | for (wait_count = 0; (wait_count < p->RIOConf.StartupTime) && (readw(&HostP->__ParmMapR) == OldParmMap); wait_count++) { |
471 | rio_dprintk(RIO_DEBUG_BOOT, "Checkout %d, 0x%x\n", wait_count, RWORD(HostP->__ParmMapR)); | 430 | rio_dprintk(RIO_DEBUG_BOOT, "Checkout %d, 0x%x\n", wait_count, readw(&HostP->__ParmMapR)); |
472 | delay(HostP, HUNDRED_MS); | 431 | mdelay(100); |
473 | 432 | ||
474 | } | 433 | } |
475 | 434 | ||
@@ -477,15 +436,16 @@ register struct DownLoad *rbp; | |||
477 | ** If the parmmap pointer is unchanged, then the host code | 436 | ** If the parmmap pointer is unchanged, then the host code |
478 | ** has crashed & burned in a really spectacular way | 437 | ** has crashed & burned in a really spectacular way |
479 | */ | 438 | */ |
480 | if (RWORD(HostP->__ParmMapR) == OldParmMap) { | 439 | if (readw(&HostP->__ParmMapR) == OldParmMap) { |
481 | rio_dprintk(RIO_DEBUG_BOOT, "parmmap 0x%x\n", RWORD(HostP->__ParmMapR)); | 440 | rio_dprintk(RIO_DEBUG_BOOT, "parmmap 0x%x\n", readw(&HostP->__ParmMapR)); |
482 | rio_dprintk(RIO_DEBUG_BOOT, "RIO Mesg Run Fail\n"); | 441 | rio_dprintk(RIO_DEBUG_BOOT, "RIO Mesg Run Fail\n"); |
483 | HostP->Flags &= ~RUN_STATE; | 442 | HostP->Flags &= ~RUN_STATE; |
484 | HostP->Flags |= RC_STUFFED; | 443 | HostP->Flags |= RC_STUFFED; |
485 | RIOHostReset(HostP->Type, (struct DpRam *) HostP->CardP, HostP->Slot); | 444 | RIOHostReset( HostP->Type, (struct DpRam *)HostP->CardP, HostP->Slot ); |
486 | continue} | 445 | continue; |
446 | } | ||
487 | 447 | ||
488 | rio_dprintk(RIO_DEBUG_BOOT, "Running 0x%x\n", RWORD(HostP->__ParmMapR)); | 448 | rio_dprintk(RIO_DEBUG_BOOT, "Running 0x%x\n", readw(&HostP->__ParmMapR)); |
489 | 449 | ||
490 | /* | 450 | /* |
491 | ** Well, the board thought it was OK, and setup its parmmap | 451 | ** Well, the board thought it was OK, and setup its parmmap |
@@ -496,25 +456,26 @@ register struct DownLoad *rbp; | |||
496 | /* | 456 | /* |
497 | ** Grab a 32 bit pointer to the parmmap structure | 457 | ** Grab a 32 bit pointer to the parmmap structure |
498 | */ | 458 | */ |
499 | ParmMapP = (PARM_MAP *) RIO_PTR(Cad, RWORD(HostP->__ParmMapR)); | 459 | ParmMapP = (PARM_MAP *) RIO_PTR(Cad, readw(&HostP->__ParmMapR)); |
500 | rio_dprintk(RIO_DEBUG_BOOT, "ParmMapP : %x\n", (int) ParmMapP); | 460 | rio_dprintk(RIO_DEBUG_BOOT, "ParmMapP : %p\n", ParmMapP); |
501 | ParmMapP = (PARM_MAP *) ((unsigned long) Cad + (unsigned long) ((RWORD((HostP->__ParmMapR))) & 0xFFFF)); | 461 | ParmMapP = (PARM_MAP *) ((unsigned long) Cad + readw(&HostP->__ParmMapR)); |
502 | rio_dprintk(RIO_DEBUG_BOOT, "ParmMapP : %x\n", (int) ParmMapP); | 462 | rio_dprintk(RIO_DEBUG_BOOT, "ParmMapP : %p\n", ParmMapP); |
503 | 463 | ||
504 | /* | 464 | /* |
505 | ** The links entry should be 0xFFFF; we set it up | 465 | ** The links entry should be 0xFFFF; we set it up |
506 | ** with a mask to say how many PHBs to use, and | 466 | ** with a mask to say how many PHBs to use, and |
507 | ** which links to use. | 467 | ** which links to use. |
508 | */ | 468 | */ |
509 | if ((RWORD(ParmMapP->links) & 0xFFFF) != 0xFFFF) { | 469 | if (readw(&ParmMapP->links) != 0xFFFF) { |
510 | rio_dprintk(RIO_DEBUG_BOOT, "RIO Mesg Run Fail %s\n", HostP->Name); | 470 | rio_dprintk(RIO_DEBUG_BOOT, "RIO Mesg Run Fail %s\n", HostP->Name); |
511 | rio_dprintk(RIO_DEBUG_BOOT, "Links = 0x%x\n", RWORD(ParmMapP->links)); | 471 | rio_dprintk(RIO_DEBUG_BOOT, "Links = 0x%x\n", readw(&ParmMapP->links)); |
512 | HostP->Flags &= ~RUN_STATE; | 472 | HostP->Flags &= ~RUN_STATE; |
513 | HostP->Flags |= RC_STUFFED; | 473 | HostP->Flags |= RC_STUFFED; |
514 | RIOHostReset(HostP->Type, (struct DpRam *) HostP->CardP, HostP->Slot); | 474 | RIOHostReset( HostP->Type, (struct DpRam *)HostP->CardP, HostP->Slot ); |
515 | continue} | 475 | continue; |
476 | } | ||
516 | 477 | ||
517 | WWORD(ParmMapP->links, RIO_LINK_ENABLE); | 478 | writew(RIO_LINK_ENABLE, &ParmMapP->links); |
518 | 479 | ||
519 | /* | 480 | /* |
520 | ** now wait for the card to set all the parmmap->XXX stuff | 481 | ** now wait for the card to set all the parmmap->XXX stuff |
@@ -522,19 +483,20 @@ register struct DownLoad *rbp; | |||
522 | */ | 483 | */ |
523 | rio_dprintk(RIO_DEBUG_BOOT, "Looking for init_done - %d ticks\n", p->RIOConf.StartupTime); | 484 | rio_dprintk(RIO_DEBUG_BOOT, "Looking for init_done - %d ticks\n", p->RIOConf.StartupTime); |
524 | HostP->timeout_id = 0; | 485 | HostP->timeout_id = 0; |
525 | for (wait_count = 0; (wait_count < p->RIOConf.StartupTime) && !RWORD(ParmMapP->init_done); wait_count++) { | 486 | for (wait_count = 0; (wait_count < p->RIOConf.StartupTime) && !readw(&ParmMapP->init_done); wait_count++) { |
526 | rio_dprintk(RIO_DEBUG_BOOT, "Waiting for init_done\n"); | 487 | rio_dprintk(RIO_DEBUG_BOOT, "Waiting for init_done\n"); |
527 | delay(HostP, HUNDRED_MS); | 488 | mdelay(100); |
528 | } | 489 | } |
529 | rio_dprintk(RIO_DEBUG_BOOT, "OK! init_done!\n"); | 490 | rio_dprintk(RIO_DEBUG_BOOT, "OK! init_done!\n"); |
530 | 491 | ||
531 | if (RWORD(ParmMapP->error) != E_NO_ERROR || !RWORD(ParmMapP->init_done)) { | 492 | if (readw(&ParmMapP->error) != E_NO_ERROR || !readw(&ParmMapP->init_done)) { |
532 | rio_dprintk(RIO_DEBUG_BOOT, "RIO Mesg Run Fail %s\n", HostP->Name); | 493 | rio_dprintk(RIO_DEBUG_BOOT, "RIO Mesg Run Fail %s\n", HostP->Name); |
533 | rio_dprintk(RIO_DEBUG_BOOT, "Timedout waiting for init_done\n"); | 494 | rio_dprintk(RIO_DEBUG_BOOT, "Timedout waiting for init_done\n"); |
534 | HostP->Flags &= ~RUN_STATE; | 495 | HostP->Flags &= ~RUN_STATE; |
535 | HostP->Flags |= RC_STUFFED; | 496 | HostP->Flags |= RC_STUFFED; |
536 | RIOHostReset(HostP->Type, (struct DpRam *) HostP->CardP, HostP->Slot); | 497 | RIOHostReset( HostP->Type, (struct DpRam *)HostP->CardP, HostP->Slot ); |
537 | continue} | 498 | continue; |
499 | } | ||
538 | 500 | ||
539 | rio_dprintk(RIO_DEBUG_BOOT, "Got init_done\n"); | 501 | rio_dprintk(RIO_DEBUG_BOOT, "Got init_done\n"); |
540 | 502 | ||
@@ -546,17 +508,17 @@ register struct DownLoad *rbp; | |||
546 | /* | 508 | /* |
547 | ** set the time period between interrupts. | 509 | ** set the time period between interrupts. |
548 | */ | 510 | */ |
549 | WWORD(ParmMapP->timer, (short) p->RIOConf.Timer); | 511 | writew(p->RIOConf.Timer, &ParmMapP->timer); |
550 | 512 | ||
551 | /* | 513 | /* |
552 | ** Translate all the 16 bit pointers in the __ParmMapR into | 514 | ** Translate all the 16 bit pointers in the __ParmMapR into |
553 | ** 32 bit pointers for the driver. | 515 | ** 32 bit pointers for the driver in ioremap space. |
554 | */ | 516 | */ |
555 | HostP->ParmMapP = ParmMapP; | 517 | HostP->ParmMapP = ParmMapP; |
556 | HostP->PhbP = (PHB *) RIO_PTR(Cad, RWORD(ParmMapP->phb_ptr)); | 518 | HostP->PhbP = (PHB *) RIO_PTR(Cad, readw(&ParmMapP->phb_ptr)); |
557 | HostP->RupP = (RUP *) RIO_PTR(Cad, RWORD(ParmMapP->rups)); | 519 | HostP->RupP = (RUP *) RIO_PTR(Cad, readw(&ParmMapP->rups)); |
558 | HostP->PhbNumP = (ushort *) RIO_PTR(Cad, RWORD(ParmMapP->phb_num_ptr)); | 520 | HostP->PhbNumP = (ushort *) RIO_PTR(Cad, readw(&ParmMapP->phb_num_ptr)); |
559 | HostP->LinkStrP = (LPB *) RIO_PTR(Cad, RWORD(ParmMapP->link_str_ptr)); | 521 | HostP->LinkStrP = (LPB *) RIO_PTR(Cad, readw(&ParmMapP->link_str_ptr)); |
560 | 522 | ||
561 | /* | 523 | /* |
562 | ** point the UnixRups at the real Rups | 524 | ** point the UnixRups at the real Rups |
@@ -592,12 +554,12 @@ register struct DownLoad *rbp; | |||
592 | 554 | ||
593 | PortP->PhbP = PhbP; | 555 | PortP->PhbP = PhbP; |
594 | 556 | ||
595 | PortP->TxAdd = (WORD *) RIO_PTR(Cad, RWORD(PhbP->tx_add)); | 557 | PortP->TxAdd = (u16 *) RIO_PTR(Cad, readw(&PhbP->tx_add)); |
596 | PortP->TxStart = (WORD *) RIO_PTR(Cad, RWORD(PhbP->tx_start)); | 558 | PortP->TxStart = (u16 *) RIO_PTR(Cad, readw(&PhbP->tx_start)); |
597 | PortP->TxEnd = (WORD *) RIO_PTR(Cad, RWORD(PhbP->tx_end)); | 559 | PortP->TxEnd = (u16 *) RIO_PTR(Cad, readw(&PhbP->tx_end)); |
598 | PortP->RxRemove = (WORD *) RIO_PTR(Cad, RWORD(PhbP->rx_remove)); | 560 | PortP->RxRemove = (u16 *) RIO_PTR(Cad, readw(&PhbP->rx_remove)); |
599 | PortP->RxStart = (WORD *) RIO_PTR(Cad, RWORD(PhbP->rx_start)); | 561 | PortP->RxStart = (u16 *) RIO_PTR(Cad, readw(&PhbP->rx_start)); |
600 | PortP->RxEnd = (WORD *) RIO_PTR(Cad, RWORD(PhbP->rx_end)); | 562 | PortP->RxEnd = (u16 *) RIO_PTR(Cad, readw(&PhbP->rx_end)); |
601 | 563 | ||
602 | rio_spin_unlock_irqrestore(&PortP->portSem, flags); | 564 | rio_spin_unlock_irqrestore(&PortP->portSem, flags); |
603 | /* | 565 | /* |
@@ -631,20 +593,23 @@ register struct DownLoad *rbp; | |||
631 | 593 | ||
632 | 594 | ||
633 | 595 | ||
634 | /* | 596 | /** |
635 | ** Boot an RTA. If we have successfully processed this boot, then | 597 | * RIOBootRup - Boot an RTA |
636 | ** return 1. If we havent, then return 0. | 598 | * @p: rio we are working with |
637 | */ | 599 | * @Rup: Rup number |
638 | int RIOBootRup(p, Rup, HostP, PacketP) | 600 | * @HostP: host object |
639 | struct rio_info *p; | 601 | * @PacketP: packet to use |
640 | uint Rup; | 602 | * |
641 | struct Host *HostP; | 603 | * If we have successfully processed this boot, then |
642 | struct PKT *PacketP; | 604 | * return 1. If we havent, then return 0. |
605 | */ | ||
606 | |||
607 | int RIOBootRup(struct rio_info *p, unsigned int Rup, struct Host *HostP, struct PKT *PacketP) | ||
643 | { | 608 | { |
644 | struct PktCmd *PktCmdP = (struct PktCmd *) PacketP->data; | 609 | struct PktCmd *PktCmdP = (struct PktCmd *) PacketP->data; |
645 | struct PktCmd_M *PktReplyP; | 610 | struct PktCmd_M *PktReplyP; |
646 | struct CmdBlk *CmdBlkP; | 611 | struct CmdBlk *CmdBlkP; |
647 | uint sequence; | 612 | unsigned int sequence; |
648 | 613 | ||
649 | /* | 614 | /* |
650 | ** If we haven't been told what to boot, we can't boot it. | 615 | ** If we haven't been told what to boot, we can't boot it. |
@@ -654,20 +619,17 @@ struct PKT *PacketP; | |||
654 | return 0; | 619 | return 0; |
655 | } | 620 | } |
656 | 621 | ||
657 | /* rio_dprint(RIO_DEBUG_BOOT, NULL,DBG_BOOT,"Incoming command packet\n"); */ | ||
658 | /* ShowPacket( DBG_BOOT, PacketP ); */ | ||
659 | |||
660 | /* | 622 | /* |
661 | ** Special case of boot completed - if we get one of these then we | 623 | ** Special case of boot completed - if we get one of these then we |
662 | ** don't need a command block. For all other cases we do, so handle | 624 | ** don't need a command block. For all other cases we do, so handle |
663 | ** this first and then get a command block, then handle every other | 625 | ** this first and then get a command block, then handle every other |
664 | ** case, relinquishing the command block if disaster strikes! | 626 | ** case, relinquishing the command block if disaster strikes! |
665 | */ | 627 | */ |
666 | if ((RBYTE(PacketP->len) & PKT_CMD_BIT) && (RBYTE(PktCmdP->Command) == BOOT_COMPLETED)) | 628 | if ((readb(&PacketP->len) & PKT_CMD_BIT) && (readb(&PktCmdP->Command) == BOOT_COMPLETED)) |
667 | return RIOBootComplete(p, HostP, Rup, PktCmdP); | 629 | return RIOBootComplete(p, HostP, Rup, PktCmdP); |
668 | 630 | ||
669 | /* | 631 | /* |
670 | ** try to unhook a command block from the command free list. | 632 | ** Try to allocate a command block. This is in kernel space |
671 | */ | 633 | */ |
672 | if (!(CmdBlkP = RIOGetCmdBlk())) { | 634 | if (!(CmdBlkP = RIOGetCmdBlk())) { |
673 | rio_dprintk(RIO_DEBUG_BOOT, "No command blocks to boot RTA! come back later.\n"); | 635 | rio_dprintk(RIO_DEBUG_BOOT, "No command blocks to boot RTA! come back later.\n"); |
@@ -688,13 +650,12 @@ struct PKT *PacketP; | |||
688 | /* | 650 | /* |
689 | ** process COMMANDS on the boot rup! | 651 | ** process COMMANDS on the boot rup! |
690 | */ | 652 | */ |
691 | if (RBYTE(PacketP->len) & PKT_CMD_BIT) { | 653 | if (readb(&PacketP->len) & PKT_CMD_BIT) { |
692 | /* | 654 | /* |
693 | ** We only expect one type of command - a BOOT_REQUEST! | 655 | ** We only expect one type of command - a BOOT_REQUEST! |
694 | */ | 656 | */ |
695 | if (RBYTE(PktCmdP->Command) != BOOT_REQUEST) { | 657 | if (readb(&PktCmdP->Command) != BOOT_REQUEST) { |
696 | rio_dprintk(RIO_DEBUG_BOOT, "Unexpected command %d on BOOT RUP %d of host %d\n", PktCmdP->Command, Rup, HostP - p->RIOHosts); | 658 | rio_dprintk(RIO_DEBUG_BOOT, "Unexpected command %d on BOOT RUP %d of host %Zd\n", readb(&PktCmdP->Command), Rup, HostP - p->RIOHosts); |
697 | ShowPacket(DBG_BOOT, PacketP); | ||
698 | RIOFreeCmdBlk(CmdBlkP); | 659 | RIOFreeCmdBlk(CmdBlkP); |
699 | return 1; | 660 | return 1; |
700 | } | 661 | } |
@@ -702,20 +663,9 @@ struct PKT *PacketP; | |||
702 | /* | 663 | /* |
703 | ** Build a Boot Sequence command block | 664 | ** Build a Boot Sequence command block |
704 | ** | 665 | ** |
705 | ** 02.03.1999 ARG - ESIL 0820 fix | ||
706 | ** We no longer need to use "Boot Mode", we'll always allow | 666 | ** We no longer need to use "Boot Mode", we'll always allow |
707 | ** boot requests - the boot will not complete if the device | 667 | ** boot requests - the boot will not complete if the device |
708 | ** appears in the bindings table. | 668 | ** appears in the bindings table. |
709 | ** So, this conditional is not required ... | ||
710 | ** | ||
711 | if (p->RIOBootMode == RC_BOOT_NONE) | ||
712 | ** | ||
713 | ** If the system is in slave mode, and a boot request is | ||
714 | ** received, set command to BOOT_ABORT so that the boot | ||
715 | ** will not complete. | ||
716 | ** | ||
717 | PktReplyP->Command = BOOT_ABORT; | ||
718 | else | ||
719 | ** | 669 | ** |
720 | ** We'll just (always) set the command field in packet reply | 670 | ** We'll just (always) set the command field in packet reply |
721 | ** to allow an attempted boot sequence : | 671 | ** to allow an attempted boot sequence : |
@@ -728,9 +678,9 @@ struct PKT *PacketP; | |||
728 | 678 | ||
729 | CmdBlkP->Packet.len = BOOT_SEQUENCE_LEN | PKT_CMD_BIT; | 679 | CmdBlkP->Packet.len = BOOT_SEQUENCE_LEN | PKT_CMD_BIT; |
730 | 680 | ||
731 | bcopy("BOOT", (void *) &CmdBlkP->Packet.data[BOOT_SEQUENCE_LEN], 4); | 681 | memcpy((void *) &CmdBlkP->Packet.data[BOOT_SEQUENCE_LEN], "BOOT", 4); |
732 | 682 | ||
733 | rio_dprintk(RIO_DEBUG_BOOT, "Boot RTA on Host %d Rup %d - %d (0x%x) packets to 0x%x\n", HostP - p->RIOHosts, Rup, p->RIONumBootPkts, p->RIONumBootPkts, p->RIOConf.RtaLoadBase); | 683 | rio_dprintk(RIO_DEBUG_BOOT, "Boot RTA on Host %Zd Rup %d - %d (0x%x) packets to 0x%x\n", HostP - p->RIOHosts, Rup, p->RIONumBootPkts, p->RIONumBootPkts, p->RIOConf.RtaLoadBase); |
734 | 684 | ||
735 | /* | 685 | /* |
736 | ** If this host is in slave mode, send the RTA an invalid boot | 686 | ** If this host is in slave mode, send the RTA an invalid boot |
@@ -747,32 +697,35 @@ struct PKT *PacketP; | |||
747 | /* | 697 | /* |
748 | ** It is a request for boot data. | 698 | ** It is a request for boot data. |
749 | */ | 699 | */ |
750 | sequence = RWORD(PktCmdP->Sequence); | 700 | sequence = readw(&PktCmdP->Sequence); |
751 | 701 | ||
752 | rio_dprintk(RIO_DEBUG_BOOT, "Boot block %d on Host %d Rup%d\n", sequence, HostP - p->RIOHosts, Rup); | 702 | rio_dprintk(RIO_DEBUG_BOOT, "Boot block %d on Host %Zd Rup%d\n", sequence, HostP - p->RIOHosts, Rup); |
753 | 703 | ||
754 | if (sequence >= p->RIONumBootPkts) { | 704 | if (sequence >= p->RIONumBootPkts) { |
755 | rio_dprintk(RIO_DEBUG_BOOT, "Got a request for packet %d, max is %d\n", sequence, p->RIONumBootPkts); | 705 | rio_dprintk(RIO_DEBUG_BOOT, "Got a request for packet %d, max is %d\n", sequence, p->RIONumBootPkts); |
756 | ShowPacket(DBG_BOOT, PacketP); | ||
757 | } | 706 | } |
758 | 707 | ||
759 | PktReplyP->Sequence = sequence; | 708 | PktReplyP->Sequence = sequence; |
760 | 709 | memcpy(PktReplyP->BootData, p->RIOBootPackets[p->RIONumBootPkts - sequence - 1], RTA_BOOT_DATA_SIZE); | |
761 | bcopy(p->RIOBootPackets[p->RIONumBootPkts - sequence - 1], PktReplyP->BootData, RTA_BOOT_DATA_SIZE); | ||
762 | |||
763 | CmdBlkP->Packet.len = PKT_MAX_DATA_LEN; | 710 | CmdBlkP->Packet.len = PKT_MAX_DATA_LEN; |
764 | ShowPacket(DBG_BOOT, &CmdBlkP->Packet); | ||
765 | RIOQueueCmdBlk(HostP, Rup, CmdBlkP); | 711 | RIOQueueCmdBlk(HostP, Rup, CmdBlkP); |
766 | return 1; | 712 | return 1; |
767 | } | 713 | } |
768 | 714 | ||
769 | /* | 715 | /** |
770 | ** This function is called when an RTA been booted. | 716 | * RIOBootComplete - RTA boot is done |
771 | ** If booted by a host, HostP->HostUniqueNum is the booting host. | 717 | * @p: RIO we are working with |
772 | ** If booted by an RTA, HostP->Mapping[Rup].RtaUniqueNum is the booting RTA. | 718 | * @HostP: Host structure |
773 | ** RtaUniq is the booted RTA. | 719 | * @Rup: RUP being used |
774 | */ | 720 | * @PktCmdP: Packet command that was used |
775 | static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, struct PktCmd *PktCmdP) | 721 | * |
722 | * This function is called when an RTA been booted. | ||
723 | * If booted by a host, HostP->HostUniqueNum is the booting host. | ||
724 | * If booted by an RTA, HostP->Mapping[Rup].RtaUniqueNum is the booting RTA. | ||
725 | * RtaUniq is the booted RTA. | ||
726 | */ | ||
727 | |||
728 | static int RIOBootComplete(struct rio_info *p, struct Host *HostP, unsigned int Rup, struct PktCmd *PktCmdP) | ||
776 | { | 729 | { |
777 | struct Map *MapP = NULL; | 730 | struct Map *MapP = NULL; |
778 | struct Map *MapP2 = NULL; | 731 | struct Map *MapP2 = NULL; |
@@ -782,12 +735,10 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
782 | int EmptySlot = -1; | 735 | int EmptySlot = -1; |
783 | int entry, entry2; | 736 | int entry, entry2; |
784 | char *MyType, *MyName; | 737 | char *MyType, *MyName; |
785 | uint MyLink; | 738 | unsigned int MyLink; |
786 | ushort RtaType; | 739 | unsigned short RtaType; |
787 | uint RtaUniq = (RBYTE(PktCmdP->UniqNum[0])) + (RBYTE(PktCmdP->UniqNum[1]) << 8) + (RBYTE(PktCmdP->UniqNum[2]) << 16) + (RBYTE(PktCmdP->UniqNum[3]) << 24); | 740 | u32 RtaUniq = (readb(&PktCmdP->UniqNum[0])) + (readb(&PktCmdP->UniqNum[1]) << 8) + (readb(&PktCmdP->UniqNum[2]) << 16) + (readb(&PktCmdP->UniqNum[3]) << 24); |
788 | 741 | ||
789 | /* Was RIOBooting-- . That's bad. If an RTA sends two of them, the | ||
790 | driver will never think that the RTA has booted... -- REW */ | ||
791 | p->RIOBooting = 0; | 742 | p->RIOBooting = 0; |
792 | 743 | ||
793 | rio_dprintk(RIO_DEBUG_BOOT, "RTA Boot completed - BootInProgress now %d\n", p->RIOBooting); | 744 | rio_dprintk(RIO_DEBUG_BOOT, "RTA Boot completed - BootInProgress now %d\n", p->RIOBooting); |
@@ -795,16 +746,16 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
795 | /* | 746 | /* |
796 | ** Determine type of unit (16/8 port RTA). | 747 | ** Determine type of unit (16/8 port RTA). |
797 | */ | 748 | */ |
749 | |||
798 | RtaType = GetUnitType(RtaUniq); | 750 | RtaType = GetUnitType(RtaUniq); |
799 | if (Rup >= (ushort) MAX_RUP) { | 751 | if (Rup >= (ushort) MAX_RUP) |
800 | rio_dprintk(RIO_DEBUG_BOOT, "RIO: Host %s has booted an RTA(%d) on link %c\n", HostP->Name, 8 * RtaType, RBYTE(PktCmdP->LinkNum) + 'A'); | 752 | rio_dprintk(RIO_DEBUG_BOOT, "RIO: Host %s has booted an RTA(%d) on link %c\n", HostP->Name, 8 * RtaType, readb(&PktCmdP->LinkNum) + 'A'); |
801 | } else { | 753 | else |
802 | rio_dprintk(RIO_DEBUG_BOOT, "RIO: RTA %s has booted an RTA(%d) on link %c\n", HostP->Mapping[Rup].Name, 8 * RtaType, RBYTE(PktCmdP->LinkNum) + 'A'); | 754 | rio_dprintk(RIO_DEBUG_BOOT, "RIO: RTA %s has booted an RTA(%d) on link %c\n", HostP->Mapping[Rup].Name, 8 * RtaType, readb(&PktCmdP->LinkNum) + 'A'); |
803 | } | ||
804 | 755 | ||
805 | rio_dprintk(RIO_DEBUG_BOOT, "UniqNum is 0x%x\n", RtaUniq); | 756 | rio_dprintk(RIO_DEBUG_BOOT, "UniqNum is 0x%x\n", RtaUniq); |
806 | 757 | ||
807 | if ((RtaUniq == 0x00000000) || (RtaUniq == 0xffffffff)) { | 758 | if (RtaUniq == 0x00000000 || RtaUniq == 0xffffffff) { |
808 | rio_dprintk(RIO_DEBUG_BOOT, "Illegal RTA Uniq Number\n"); | 759 | rio_dprintk(RIO_DEBUG_BOOT, "Illegal RTA Uniq Number\n"); |
809 | return TRUE; | 760 | return TRUE; |
810 | } | 761 | } |
@@ -814,9 +765,10 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
814 | ** system, or the system is in slave mode, do not attempt to create | 765 | ** system, or the system is in slave mode, do not attempt to create |
815 | ** a new table entry for it. | 766 | ** a new table entry for it. |
816 | */ | 767 | */ |
768 | |||
817 | if (!RIOBootOk(p, HostP, RtaUniq)) { | 769 | if (!RIOBootOk(p, HostP, RtaUniq)) { |
818 | MyLink = RBYTE(PktCmdP->LinkNum); | 770 | MyLink = readb(&PktCmdP->LinkNum); |
819 | if (Rup < (ushort) MAX_RUP) { | 771 | if (Rup < (unsigned short) MAX_RUP) { |
820 | /* | 772 | /* |
821 | ** RtaUniq was clone booted (by this RTA). Instruct this RTA | 773 | ** RtaUniq was clone booted (by this RTA). Instruct this RTA |
822 | ** to hold off further attempts to boot on this link for 30 | 774 | ** to hold off further attempts to boot on this link for 30 |
@@ -825,14 +777,13 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
825 | if (RIOSuspendBootRta(HostP, HostP->Mapping[Rup].ID, MyLink)) { | 777 | if (RIOSuspendBootRta(HostP, HostP->Mapping[Rup].ID, MyLink)) { |
826 | rio_dprintk(RIO_DEBUG_BOOT, "RTA failed to suspend booting on link %c\n", 'A' + MyLink); | 778 | rio_dprintk(RIO_DEBUG_BOOT, "RTA failed to suspend booting on link %c\n", 'A' + MyLink); |
827 | } | 779 | } |
828 | } else { | 780 | } else |
829 | /* | 781 | /* |
830 | ** RtaUniq was booted by this host. Set the booting link | 782 | ** RtaUniq was booted by this host. Set the booting link |
831 | ** to hold off for 30 seconds to give another unit a | 783 | ** to hold off for 30 seconds to give another unit a |
832 | ** chance to boot it. | 784 | ** chance to boot it. |
833 | */ | 785 | */ |
834 | WWORD(HostP->LinkStrP[MyLink].WaitNoBoot, 30); | 786 | writew(30, &HostP->LinkStrP[MyLink].WaitNoBoot); |
835 | } | ||
836 | rio_dprintk(RIO_DEBUG_BOOT, "RTA %x not owned - suspend booting down link %c on unit %x\n", RtaUniq, 'A' + MyLink, HostP->Mapping[Rup].RtaUniqueNum); | 787 | rio_dprintk(RIO_DEBUG_BOOT, "RTA %x not owned - suspend booting down link %c on unit %x\n", RtaUniq, 'A' + MyLink, HostP->Mapping[Rup].RtaUniqueNum); |
837 | return TRUE; | 788 | return TRUE; |
838 | } | 789 | } |
@@ -849,13 +800,10 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
849 | ** unit. | 800 | ** unit. |
850 | */ | 801 | */ |
851 | for (entry = 0; entry < MAX_RUP; entry++) { | 802 | for (entry = 0; entry < MAX_RUP; entry++) { |
852 | uint sysport; | 803 | unsigned int sysport; |
853 | 804 | ||
854 | if ((HostP->Mapping[entry].Flags & SLOT_IN_USE) && (HostP->Mapping[entry].RtaUniqueNum == RtaUniq)) { | 805 | if ((HostP->Mapping[entry].Flags & SLOT_IN_USE) && (HostP->Mapping[entry].RtaUniqueNum == RtaUniq)) { |
855 | HostP->Mapping[entry].Flags |= RTA_BOOTED | RTA_NEWBOOT; | 806 | HostP->Mapping[entry].Flags |= RTA_BOOTED | RTA_NEWBOOT; |
856 | #ifdef NEED_TO_FIX | ||
857 | RIO_SV_BROADCAST(HostP->svFlags[entry]); | ||
858 | #endif | ||
859 | if ((sysport = HostP->Mapping[entry].SysPort) != NO_PORT) { | 807 | if ((sysport = HostP->Mapping[entry].SysPort) != NO_PORT) { |
860 | if (sysport < p->RIOFirstPortsBooted) | 808 | if (sysport < p->RIOFirstPortsBooted) |
861 | p->RIOFirstPortsBooted = sysport; | 809 | p->RIOFirstPortsBooted = sysport; |
@@ -867,9 +815,6 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
867 | if (RtaType == TYPE_RTA16) { | 815 | if (RtaType == TYPE_RTA16) { |
868 | entry2 = HostP->Mapping[entry].ID2 - 1; | 816 | entry2 = HostP->Mapping[entry].ID2 - 1; |
869 | HostP->Mapping[entry2].Flags |= RTA_BOOTED | RTA_NEWBOOT; | 817 | HostP->Mapping[entry2].Flags |= RTA_BOOTED | RTA_NEWBOOT; |
870 | #ifdef NEED_TO_FIX | ||
871 | RIO_SV_BROADCAST(HostP->svFlags[entry2]); | ||
872 | #endif | ||
873 | sysport = HostP->Mapping[entry2].SysPort; | 818 | sysport = HostP->Mapping[entry2].SysPort; |
874 | if (sysport < p->RIOFirstPortsBooted) | 819 | if (sysport < p->RIOFirstPortsBooted) |
875 | p->RIOFirstPortsBooted = sysport; | 820 | p->RIOFirstPortsBooted = sysport; |
@@ -877,18 +822,17 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
877 | p->RIOLastPortsBooted = sysport; | 822 | p->RIOLastPortsBooted = sysport; |
878 | } | 823 | } |
879 | } | 824 | } |
880 | if (RtaType == TYPE_RTA16) { | 825 | if (RtaType == TYPE_RTA16) |
881 | rio_dprintk(RIO_DEBUG_BOOT, "RTA will be given IDs %d+%d\n", entry + 1, entry2 + 1); | 826 | rio_dprintk(RIO_DEBUG_BOOT, "RTA will be given IDs %d+%d\n", entry + 1, entry2 + 1); |
882 | } else { | 827 | else |
883 | rio_dprintk(RIO_DEBUG_BOOT, "RTA will be given ID %d\n", entry + 1); | 828 | rio_dprintk(RIO_DEBUG_BOOT, "RTA will be given ID %d\n", entry + 1); |
884 | } | ||
885 | return TRUE; | 829 | return TRUE; |
886 | } | 830 | } |
887 | } | 831 | } |
888 | 832 | ||
889 | rio_dprintk(RIO_DEBUG_BOOT, "RTA not configured for this host\n"); | 833 | rio_dprintk(RIO_DEBUG_BOOT, "RTA not configured for this host\n"); |
890 | 834 | ||
891 | if (Rup >= (ushort) MAX_RUP) { | 835 | if (Rup >= (unsigned short) MAX_RUP) { |
892 | /* | 836 | /* |
893 | ** It was a host that did the booting | 837 | ** It was a host that did the booting |
894 | */ | 838 | */ |
@@ -901,7 +845,7 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
901 | MyType = "RTA"; | 845 | MyType = "RTA"; |
902 | MyName = HostP->Mapping[Rup].Name; | 846 | MyName = HostP->Mapping[Rup].Name; |
903 | } | 847 | } |
904 | MyLink = RBYTE(PktCmdP->LinkNum); | 848 | MyLink = readb(&PktCmdP->LinkNum); |
905 | 849 | ||
906 | /* | 850 | /* |
907 | ** There is no SLOT_IN_USE entry for this RTA attached to the current | 851 | ** There is no SLOT_IN_USE entry for this RTA attached to the current |
@@ -923,7 +867,7 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
923 | } else | 867 | } else |
924 | rio_dprintk(RIO_DEBUG_BOOT, "Found previous tentative slot (%d)\n", entry); | 868 | rio_dprintk(RIO_DEBUG_BOOT, "Found previous tentative slot (%d)\n", entry); |
925 | if (!p->RIONoMessage) | 869 | if (!p->RIONoMessage) |
926 | cprintf("RTA connected to %s '%s' (%c) not configured.\n", MyType, MyName, MyLink + 'A'); | 870 | printk("RTA connected to %s '%s' (%c) not configured.\n", MyType, MyName, MyLink + 'A'); |
927 | return TRUE; | 871 | return TRUE; |
928 | } | 872 | } |
929 | } | 873 | } |
@@ -1044,11 +988,8 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
1044 | if (Flag & SLOT_IN_USE) { | 988 | if (Flag & SLOT_IN_USE) { |
1045 | rio_dprintk(RIO_DEBUG_BOOT, "This RTA configured on another host - move entry to current host (1)\n"); | 989 | rio_dprintk(RIO_DEBUG_BOOT, "This RTA configured on another host - move entry to current host (1)\n"); |
1046 | HostP->Mapping[entry].SysPort = MapP->SysPort; | 990 | HostP->Mapping[entry].SysPort = MapP->SysPort; |
1047 | CCOPY(MapP->Name, HostP->Mapping[entry].Name, MAX_NAME_LEN); | 991 | memcpy(HostP->Mapping[entry].Name, MapP->Name, MAX_NAME_LEN); |
1048 | HostP->Mapping[entry].Flags = SLOT_IN_USE | RTA_BOOTED | RTA_NEWBOOT; | 992 | HostP->Mapping[entry].Flags = SLOT_IN_USE | RTA_BOOTED | RTA_NEWBOOT; |
1049 | #ifdef NEED_TO_FIX | ||
1050 | RIO_SV_BROADCAST(HostP->svFlags[entry]); | ||
1051 | #endif | ||
1052 | RIOReMapPorts(p, HostP, &HostP->Mapping[entry]); | 993 | RIOReMapPorts(p, HostP, &HostP->Mapping[entry]); |
1053 | if (HostP->Mapping[entry].SysPort < p->RIOFirstPortsBooted) | 994 | if (HostP->Mapping[entry].SysPort < p->RIOFirstPortsBooted) |
1054 | p->RIOFirstPortsBooted = HostP->Mapping[entry].SysPort; | 995 | p->RIOFirstPortsBooted = HostP->Mapping[entry].SysPort; |
@@ -1058,16 +999,10 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
1058 | } else { | 999 | } else { |
1059 | rio_dprintk(RIO_DEBUG_BOOT, "This RTA has a tentative entry on another host - delete that entry (1)\n"); | 1000 | rio_dprintk(RIO_DEBUG_BOOT, "This RTA has a tentative entry on another host - delete that entry (1)\n"); |
1060 | HostP->Mapping[entry].Flags = SLOT_TENTATIVE | RTA_BOOTED | RTA_NEWBOOT; | 1001 | HostP->Mapping[entry].Flags = SLOT_TENTATIVE | RTA_BOOTED | RTA_NEWBOOT; |
1061 | #ifdef NEED_TO_FIX | ||
1062 | RIO_SV_BROADCAST(HostP->svFlags[entry]); | ||
1063 | #endif | ||
1064 | } | 1002 | } |
1065 | if (RtaType == TYPE_RTA16) { | 1003 | if (RtaType == TYPE_RTA16) { |
1066 | if (Flag & SLOT_IN_USE) { | 1004 | if (Flag & SLOT_IN_USE) { |
1067 | HostP->Mapping[entry2].Flags = SLOT_IN_USE | RTA_BOOTED | RTA_NEWBOOT | RTA16_SECOND_SLOT; | 1005 | HostP->Mapping[entry2].Flags = SLOT_IN_USE | RTA_BOOTED | RTA_NEWBOOT | RTA16_SECOND_SLOT; |
1068 | #ifdef NEED_TO_FIX | ||
1069 | RIO_SV_BROADCAST(HostP->svFlags[entry2]); | ||
1070 | #endif | ||
1071 | HostP->Mapping[entry2].SysPort = MapP2->SysPort; | 1006 | HostP->Mapping[entry2].SysPort = MapP2->SysPort; |
1072 | /* | 1007 | /* |
1073 | ** Map second block of ttys for 16 port RTA | 1008 | ** Map second block of ttys for 16 port RTA |
@@ -1080,16 +1015,13 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
1080 | rio_dprintk(RIO_DEBUG_BOOT, "SysPort %d, Name %s\n", (int) HostP->Mapping[entry2].SysPort, HostP->Mapping[entry].Name); | 1015 | rio_dprintk(RIO_DEBUG_BOOT, "SysPort %d, Name %s\n", (int) HostP->Mapping[entry2].SysPort, HostP->Mapping[entry].Name); |
1081 | } else | 1016 | } else |
1082 | HostP->Mapping[entry2].Flags = SLOT_TENTATIVE | RTA_BOOTED | RTA_NEWBOOT | RTA16_SECOND_SLOT; | 1017 | HostP->Mapping[entry2].Flags = SLOT_TENTATIVE | RTA_BOOTED | RTA_NEWBOOT | RTA16_SECOND_SLOT; |
1083 | #ifdef NEED_TO_FIX | 1018 | memset(MapP2, 0, sizeof(struct Map)); |
1084 | RIO_SV_BROADCAST(HostP->svFlags[entry2]); | ||
1085 | #endif | ||
1086 | bzero((caddr_t) MapP2, sizeof(struct Map)); | ||
1087 | } | 1019 | } |
1088 | bzero((caddr_t) MapP, sizeof(struct Map)); | 1020 | memset(MapP, 0, sizeof(struct Map)); |
1089 | if (!p->RIONoMessage) | 1021 | if (!p->RIONoMessage) |
1090 | cprintf("An orphaned RTA has been adopted by %s '%s' (%c).\n", MyType, MyName, MyLink + 'A'); | 1022 | printk("An orphaned RTA has been adopted by %s '%s' (%c).\n", MyType, MyName, MyLink + 'A'); |
1091 | } else if (!p->RIONoMessage) | 1023 | } else if (!p->RIONoMessage) |
1092 | cprintf("RTA connected to %s '%s' (%c) not configured.\n", MyType, MyName, MyLink + 'A'); | 1024 | printk("RTA connected to %s '%s' (%c) not configured.\n", MyType, MyName, MyLink + 'A'); |
1093 | RIOSetChange(p); | 1025 | RIOSetChange(p); |
1094 | return TRUE; | 1026 | return TRUE; |
1095 | } | 1027 | } |
@@ -1100,7 +1032,7 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
1100 | ** so we can ignore it's ID requests. | 1032 | ** so we can ignore it's ID requests. |
1101 | */ | 1033 | */ |
1102 | if (!p->RIONoMessage) | 1034 | if (!p->RIONoMessage) |
1103 | cprintf("The RTA connected to %s '%s' (%c) cannot be configured. You cannot configure more than 128 ports to one host card.\n", MyType, MyName, MyLink + 'A'); | 1035 | printk("The RTA connected to %s '%s' (%c) cannot be configured. You cannot configure more than 128 ports to one host card.\n", MyType, MyName, MyLink + 'A'); |
1104 | for (entry = 0; entry < HostP->NumExtraBooted; entry++) { | 1036 | for (entry = 0; entry < HostP->NumExtraBooted; entry++) { |
1105 | if (HostP->ExtraUnits[entry] == RtaUniq) { | 1037 | if (HostP->ExtraUnits[entry] == RtaUniq) { |
1106 | /* | 1038 | /* |
@@ -1127,13 +1059,10 @@ static int RIOBootComplete(struct rio_info *p, struct Host *HostP, uint Rup, str | |||
1127 | ** We no longer support the RIOBootMode variable. It is all done from the | 1059 | ** We no longer support the RIOBootMode variable. It is all done from the |
1128 | ** "boot/noboot" field in the rio.cf file. | 1060 | ** "boot/noboot" field in the rio.cf file. |
1129 | */ | 1061 | */ |
1130 | int RIOBootOk(p, HostP, RtaUniq) | 1062 | int RIOBootOk(struct rio_info *p, struct Host *HostP, unsigned long RtaUniq) |
1131 | struct rio_info *p; | ||
1132 | struct Host *HostP; | ||
1133 | ulong RtaUniq; | ||
1134 | { | 1063 | { |
1135 | int Entry; | 1064 | int Entry; |
1136 | uint HostUniq = HostP->UniqueNum; | 1065 | unsigned int HostUniq = HostP->UniqueNum; |
1137 | 1066 | ||
1138 | /* | 1067 | /* |
1139 | ** Search bindings table for RTA or its parent. | 1068 | ** Search bindings table for RTA or its parent. |
@@ -1151,11 +1080,7 @@ ulong RtaUniq; | |||
1151 | ** slots tentative, and the second one RTA_SECOND_SLOT as well. | 1080 | ** slots tentative, and the second one RTA_SECOND_SLOT as well. |
1152 | */ | 1081 | */ |
1153 | 1082 | ||
1154 | void FillSlot(entry, entry2, RtaUniq, HostP) | 1083 | void FillSlot(int entry, int entry2, unsigned int RtaUniq, struct Host *HostP) |
1155 | int entry; | ||
1156 | int entry2; | ||
1157 | uint RtaUniq; | ||
1158 | struct Host *HostP; | ||
1159 | { | 1084 | { |
1160 | int link; | 1085 | int link; |
1161 | 1086 | ||