Upgrade to Linux 2.6.19
[openwrt.git] / target / linux / brcm63xx-2.6 / patches / 001-bcm963xx.patch
1 diff -urN linux.old/arch/mips/bcm963xx/bcm63xx_led.c linux.dev/arch/mips/bcm963xx/bcm63xx_led.c
2 --- linux.old/arch/mips/bcm963xx/bcm63xx_led.c 1970-01-01 01:00:00.000000000 +0100
3 +++ linux.dev/arch/mips/bcm963xx/bcm63xx_led.c 2006-08-25 00:39:38.000000000 +0200
4 @@ -0,0 +1,582 @@
5 +/*
6 +<:copyright-gpl
7 + Copyright 2002 Broadcom Corp. All Rights Reserved.
8 +
9 + This program is free software; you can distribute it and/or modify it
10 + under the terms of the GNU General Public License (Version 2) as
11 + published by the Free Software Foundation.
12 +
13 + This program is distributed in the hope it will be useful, but WITHOUT
14 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 + for more details.
17 +
18 + You should have received a copy of the GNU General Public License along
19 + with this program; if not, write to the Free Software Foundation, Inc.,
20 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
21 +:>
22 +*/
23 +/***************************************************************************
24 + * File Name : bcm63xx_led.c
25 + *
26 + * Description:
27 + *
28 + * This file contains bcm963xx board led control API functions.
29 + *
30 + * To use it, do the following
31 + *
32 + * 1). define in the board.c the following led mappping (this is for 6345GW board):
33 + * const LED_MAP_PAIR cLedMapping45GW[] =
34 + * { // led name Initial state physical pin (ledMask)
35 + * {kLedUsb, kLedStateOff, GPIO_LED_PIN_7},
36 + * {kLedAdsl, kLedStateOff, GPIO_LED_PIN_8},
37 + * {kLedPPP, kLedStateOff, GPIO_LED_PIN_9}, // PPP and WanData share PIN_9
38 + * {kLedWanData, kLedStateOff, GPIO_LED_PIN_9},
39 + * {kLedWireless, kLedStateOff, GPIO_LED_PIN_10},
40 + * {kLedEnd, kLedStateOff, 0 } // NOTE: kLedEnd has to be at the end.
41 + *
42 + * 2). };To initialize led API and initial state of the leds, call the following function with the mapping
43 + * pointer from the above struct
44 + *
45 + * boardLedInit((PLED_MAP_PAIR) &cLedMapping45R);
46 + *
47 + * 3). Sample call for kernel mode:
48 + *
49 + * kerSysLedCtrl(kLedAdsl, kLedStateBlinkOnce); // kLedxxx defines in board.h
50 + *
51 + * 4). Sample call for user mode
52 + *
53 + * sysLedCtrl(kLedAdsl, kLedStateBlinkOnce); // kLedxxx defines in board_api.h
54 + *
55 + *
56 + * Created on : 10/28/2002 seanl
57 + *
58 + ***************************************************************************/
59 +
60 +/* Includes. */
61 +#include <linux/init.h>
62 +#include <linux/fs.h>
63 +#include <linux/capability.h>
64 +#include <linux/slab.h>
65 +#include <linux/errno.h>
66 +#include <linux/module.h>
67 +#include <linux/netdevice.h>
68 +#include <asm/uaccess.h>
69 +
70 +#include <bcm_map_part.h>
71 +#include <board.h>
72 +
73 +#define k100ms (HZ / 10) // ~100 ms
74 +#define kFastBlinkCount 0 // ~100ms
75 +#define kSlowBlinkCount 5 // ~600ms
76 +
77 +#define MAX_VIRT_LEDS 12
78 +
79 +// uncomment // for debug led
80 +//#define DEBUG_LED
81 +
82 +// global variables:
83 +struct timer_list gLedTimer;
84 +int gTimerOn = FALSE;
85 +int gLedCount = 0;
86 +
87 +typedef struct ledinfo
88 +{
89 + unsigned short ledMask; // mask for led: ie. giop 10 = 0x0400
90 + unsigned short ledActiveLow; // GPIO bit reset to turn on LED
91 + unsigned short ledMaskFail; // mask for led: ie. giop 10 = 0x0400
92 + unsigned short ledActiveLowFail;// GPIO bit reset to turn on LED
93 + BOARD_LED_STATE ledState; // current led state
94 + BOARD_LED_STATE savedLedState; // used in blink once for restore to the orignal ledState
95 + int blinkCountDown; // if == 0, do blink (toggle). Is assgined value and dec by 1 at each timer.
96 +} LED_INFO, *PLED_INFO;
97 +
98 +static PLED_INFO gLed = NULL;
99 +static PLED_INFO gpVirtLeds[MAX_VIRT_LEDS];
100 +static HANDLE_LED_FUNC gLedHwFunc[MAX_VIRT_LEDS];
101 +static HANDLE_LED_FUNC gLedHwFailFunc[MAX_VIRT_LEDS];
102 +
103 +#if 0 /* BROKEN */
104 +#if defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)
105 +static int gLedOffInBridgeMode = 1;
106 +#elif defined(CONFIG_BCM96345)
107 +static int gLedOffInBridgeMode = 0;
108 +#endif
109 +#endif
110 +
111 +void ledTimerExpire(void);
112 +int initLedInfo( PLED_MAP_PAIR pCurMap, PLED_INFO pCurLed );
113 +
114 +//**************************************************************************************
115 +// LED operations
116 +//**************************************************************************************
117 +
118 +// turn led on and set the ledState
119 +void ledOn(PLED_INFO pLed)
120 +{
121 + if( pLed->ledMask )
122 + {
123 + GPIO->GPIODir |= pLed->ledMask; // turn on the direction bit in case was turned off by some one
124 + if( pLed->ledActiveLow )
125 + GPIO->GPIOio &= ~pLed->ledMask; // turn on the led
126 + else
127 + GPIO->GPIOio |= pLed->ledMask; // turn on the led
128 + pLed->ledState = pLed->savedLedState = kLedStateOn;
129 + }
130 +}
131 +
132 +
133 +// turn led off and set the ledState
134 +void ledOff(PLED_INFO pLed)
135 +{
136 + if( pLed->ledMask )
137 + {
138 + GPIO->GPIODir |= pLed->ledMask; // turn on the direction bit in case was turned off by some one
139 + if( pLed->ledActiveLow )
140 + GPIO->GPIOio |= pLed->ledMask; // turn off the led
141 + else
142 + GPIO->GPIOio &= ~pLed->ledMask; // turn off the led
143 + pLed->ledState = pLed->savedLedState = kLedStateOff;
144 + }
145 +}
146 +
147 +// turn led on and set the ledState
148 +void ledOnFail(PLED_INFO pLed)
149 +{
150 + if( pLed->ledMaskFail )
151 + {
152 + GPIO->GPIODir |= pLed->ledMaskFail; // turn on the direction bit in case was turned off by some one
153 + if( pLed->ledActiveLowFail )
154 + GPIO->GPIOio &= ~pLed->ledMaskFail;// turn on the led
155 + else
156 + GPIO->GPIOio |= pLed->ledMaskFail; // turn on the led
157 + pLed->ledState = pLed->savedLedState = kLedStateFail;
158 + }
159 +}
160 +
161 +
162 +// turn led off and set the ledState
163 +void ledOffFail(PLED_INFO pLed)
164 +{
165 + if( pLed->ledMaskFail )
166 + {
167 + GPIO->GPIODir |= pLed->ledMaskFail; // turn on the direction bit in case was turned off by some one
168 + if( pLed->ledActiveLowFail )
169 + GPIO->GPIOio |= pLed->ledMaskFail; // turn off the led
170 + else
171 + GPIO->GPIOio &= ~pLed->ledMaskFail;// turn off the led
172 + pLed->ledState = pLed->savedLedState = kLedStateOff;
173 + }
174 +}
175 +
176 +
177 +// toggle the led and return the current ledState
178 +BOARD_LED_STATE ledToggle(PLED_INFO pLed)
179 +{
180 + GPIO->GPIODir |= pLed->ledMask; // turn on the direction bit in case was turned off by some one
181 + if (GPIO->GPIOio & pLed->ledMask)
182 + {
183 + GPIO->GPIOio &= ~(pLed->ledMask);
184 + return( (pLed->ledActiveLow) ? kLedStateOn : kLedStateOff );
185 + }
186 + else
187 + {
188 + GPIO->GPIOio |= pLed->ledMask;
189 + return( (pLed->ledActiveLow) ? kLedStateOff : kLedStateOn );
190 + }
191 +}
192 +
193 +
194 +// led timer. Will return if timer is already on
195 +void ledTimerStart(void)
196 +{
197 + if (gTimerOn)
198 + return;
199 +
200 +#if defined(DEBUG_LED)
201 + printk("led: add_timer\n");
202 +#endif
203 +
204 + init_timer(&gLedTimer);
205 + gLedTimer.function = (void*)ledTimerExpire;
206 + gLedTimer.expires = jiffies + k100ms; // timer expires in ~100ms
207 + add_timer (&gLedTimer);
208 + gTimerOn = TRUE;
209 +}
210 +
211 +
212 +// led timer expire kicks in about ~100ms and perform the led operation according to the ledState and
213 +// restart the timer according to ledState
214 +void ledTimerExpire(void)
215 +{
216 + int i;
217 + PLED_INFO pCurLed;
218 +
219 + gTimerOn = FALSE;
220 +
221 + for (i = 0, pCurLed = gLed; i < gLedCount; i++, pCurLed++)
222 + {
223 +#if defined(DEBUG_LED)
224 + printk("led[%d]: Mask=0x%04x, State = %d, blcd=%d\n", i, pCurLed->ledMask, pCurLed->ledState, pCurLed->blinkCountDown);
225 +#endif
226 + switch (pCurLed->ledState)
227 + {
228 + case kLedStateOn:
229 + case kLedStateOff:
230 + case kLedStateFail:
231 + pCurLed->blinkCountDown = 0; // reset the blink count down
232 + break;
233 +
234 + case kLedStateBlinkOnce:
235 + ledToggle(pCurLed);
236 + pCurLed->blinkCountDown = 0; // reset to 0
237 + pCurLed->ledState = pCurLed->savedLedState;
238 + if (pCurLed->ledState == kLedStateSlowBlinkContinues ||
239 + pCurLed->ledState == kLedStateFastBlinkContinues)
240 + ledTimerStart(); // start timer if in blinkContinues stats
241 + break;
242 +
243 + case kLedStateSlowBlinkContinues:
244 + if (pCurLed->blinkCountDown-- == 0)
245 + {
246 + pCurLed->blinkCountDown = kSlowBlinkCount;
247 + ledToggle(pCurLed);
248 + }
249 + ledTimerStart();
250 + break;
251 +
252 + case kLedStateFastBlinkContinues:
253 + if (pCurLed->blinkCountDown-- == 0)
254 + {
255 + pCurLed->blinkCountDown = kFastBlinkCount;
256 + ledToggle(pCurLed);
257 + }
258 + ledTimerStart();
259 + break;
260 +
261 + default:
262 + printk("Invalid state = %d\n", pCurLed->ledState);
263 + }
264 + }
265 +}
266 +
267 +// initialize the gLedCount and allocate and fill gLed struct
268 +void __init boardLedInit(PLED_MAP_PAIR cLedMapping)
269 +{
270 + PLED_MAP_PAIR p1, p2;
271 + PLED_INFO pCurLed;
272 + int needTimer = FALSE;
273 + int alreadyUsed = 0;
274 +
275 +#if defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)
276 + /* Set blink rate for BCM6348/BCM6338 hardware LEDs. */
277 + GPIO->LEDCtrl &= ~LED_INTERVAL_SET_MASK;
278 + GPIO->LEDCtrl |= LED_INTERVAL_SET_80MS;
279 +#endif
280 +
281 + memset( gpVirtLeds, 0x00, sizeof(gpVirtLeds) );
282 + memset( gLedHwFunc, 0x00, sizeof(gLedHwFunc) );
283 + memset( gLedHwFailFunc, 0x00, sizeof(gLedHwFailFunc) );
284 +
285 + gLedCount = 0;
286 +
287 + // Check for multiple LED names and multiple LED GPIO pins that share the
288 + // same physical board LED.
289 + for( p1 = cLedMapping; p1->ledName != kLedEnd; p1++ )
290 + {
291 + alreadyUsed = 0;
292 + for( p2 = cLedMapping; p2 != p1; p2++ )
293 + {
294 + if( (p1->ledMask && p1->ledMask == p2->ledMask) ||
295 + (p1->ledMaskFail && p1->ledMaskFail == p2->ledMaskFail) )
296 + {
297 + alreadyUsed = 1;
298 + break;
299 + }
300 + }
301 +
302 + if( alreadyUsed == 0 )
303 + gLedCount++;
304 + }
305 +
306 + gLed = (PLED_INFO) kmalloc((gLedCount * sizeof(LED_INFO)), GFP_KERNEL);
307 + if( gLed == NULL )
308 + {
309 + printk( "LED memory allocation error.\n" );
310 + return;
311 + }
312 +
313 + memset( gLed, 0x00, gLedCount * sizeof(LED_INFO) );
314 +
315 + // initial the gLed with unique ledMask and initial state. If more than 1 ledNames share the physical led
316 + // (ledMask) the first defined led's ledInitState will be used.
317 + pCurLed = gLed;
318 + for( p1 = cLedMapping; p1->ledName != kLedEnd; p1++ )
319 + {
320 + if( (int) p1->ledName > MAX_VIRT_LEDS )
321 + continue;
322 +
323 + alreadyUsed = 0;
324 + for( p2 = cLedMapping; p2 != p1; p2++ )
325 + {
326 + if( (p1->ledMask && p1->ledMask == p2->ledMask) ||
327 + (p1->ledMaskFail && p1->ledMaskFail == p2->ledMaskFail) )
328 + {
329 + alreadyUsed = 1;
330 + break;
331 + }
332 + }
333 +
334 + if( alreadyUsed == 0 )
335 + {
336 + // Initialize the board LED for the first time.
337 + needTimer = initLedInfo( p1, pCurLed );
338 + gpVirtLeds[(int) p1->ledName] = pCurLed;
339 + pCurLed++;
340 + }
341 + else
342 + {
343 + PLED_INFO pLed;
344 + for( pLed = gLed; pLed != pCurLed; pLed++ )
345 + {
346 + // Find the LED_INFO structure that has already been initialized.
347 + if((pLed->ledMask && pLed->ledMask == p1->ledMask) ||
348 + (pLed->ledMaskFail && pLed->ledMaskFail==p1->ledMaskFail))
349 + {
350 + // The board LED has already been initialized but possibly
351 + // not completely initialized.
352 + if( p1->ledMask )
353 + {
354 + pLed->ledMask = p1->ledMask;
355 + pLed->ledActiveLow = p1->ledActiveLow;
356 + }
357 + if( p1->ledMaskFail )
358 + {
359 + pLed->ledMaskFail = p1->ledMaskFail;
360 + pLed->ledActiveLowFail = p1->ledActiveLowFail;
361 + }
362 + gpVirtLeds[(int) p1->ledName] = pLed;
363 + break;
364 + }
365 + }
366 + }
367 + }
368 +
369 + if (needTimer)
370 + ledTimerStart();
371 +
372 +#if defined(DEBUG_LED)
373 + int i;
374 + for (i=0; i < gLedCount; i++)
375 + printk("initLed: led[%d]: mask=0x%04x, state=%d\n", i,(gLed+i)->ledMask, (gLed+i)->ledState);
376 +#endif
377 +
378 +}
379 +
380 +// Initialize a structure that contains information about a physical board LED
381 +// control. The board LED may contain more than one GPIO pin to control a
382 +// normal condition (green) or a failure condition (red).
383 +int initLedInfo( PLED_MAP_PAIR pCurMap, PLED_INFO pCurLed )
384 +{
385 + int needTimer = FALSE;
386 + pCurLed->ledState = pCurLed->savedLedState = pCurMap->ledInitState;
387 + pCurLed->ledMask = pCurMap->ledMask;
388 + pCurLed->ledActiveLow = pCurMap->ledActiveLow;
389 + pCurLed->ledMaskFail = pCurMap->ledMaskFail;
390 + pCurLed->ledActiveLowFail = pCurMap->ledActiveLowFail;
391 +
392 + switch (pCurLed->ledState)
393 + {
394 + case kLedStateOn:
395 + pCurLed->blinkCountDown = 0; // reset the blink count down
396 + ledOn(pCurLed);
397 + break;
398 + case kLedStateOff:
399 + pCurLed->blinkCountDown = 0; // reset the blink count down
400 + ledOff(pCurLed);
401 + break;
402 + case kLedStateFail:
403 + pCurLed->blinkCountDown = 0; // reset the blink count down
404 + ledOnFail(pCurLed);
405 + break;
406 + case kLedStateBlinkOnce:
407 + pCurLed->blinkCountDown = 1;
408 + needTimer = TRUE;
409 + break;
410 + case kLedStateSlowBlinkContinues:
411 + pCurLed->blinkCountDown = kSlowBlinkCount;
412 + needTimer = TRUE;
413 + break;
414 + case kLedStateFastBlinkContinues:
415 + pCurLed->blinkCountDown = kFastBlinkCount;
416 + needTimer = TRUE;
417 + break;
418 + default:
419 + printk("Invalid state = %d\n", pCurLed->ledState);
420 + }
421 +
422 + return( needTimer );
423 +}
424 +
425 +#if 0 /* BROKEN */
426 +// Determines if there is at least one interface in bridge mode. Bridge mode
427 +// is determined by the cfm convention of naming bridge interfaces nas17
428 +// through nas24.
429 +static int isBridgedProtocol(void)
430 +{
431 + extern int dev_get(const char *name);
432 + const int firstBridgeId = 17;
433 + const int lastBridgeId = 24;
434 + int i;
435 + int ret = FALSE;
436 + char name[16];
437 +
438 + for( i = firstBridgeId; i <= lastBridgeId; i++ )
439 + {
440 + sprintf( name, "nas%d", i );
441 +
442 + if( dev_get(name) )
443 + {
444 + ret = TRUE;
445 + break;
446 + }
447 + }
448 +
449 + return(ret);
450 +}
451 +#endif
452 +
453 +// led ctrl. Maps the ledName to the corresponding ledInfoPtr and perform the led operation
454 +void boardLedCtrl(BOARD_LED_NAME ledName, BOARD_LED_STATE ledState)
455 +{
456 + PLED_INFO ledInfoPtr;
457 +
458 + // do the mapping from virtual to physical led
459 + if( (int) ledName < MAX_VIRT_LEDS )
460 + ledInfoPtr = gpVirtLeds[(int) ledName];
461 + else
462 + ledInfoPtr = NULL;
463 +
464 + if (ledInfoPtr == NULL)
465 + return;
466 +
467 + if( ledState != kLedStateFail && gLedHwFunc[(int) ledName] )
468 + {
469 + (*gLedHwFunc[(int) ledName]) (ledName, ledState);
470 + ledOffFail(ledInfoPtr);
471 + return;
472 + }
473 + else
474 + if( ledState == kLedStateFail && gLedHwFailFunc[(int) ledName] )
475 + {
476 + (*gLedHwFailFunc[(int) ledName]) (ledName, ledState);
477 + ledOff(ledInfoPtr);
478 + return;
479 + }
480 +
481 +#if 0 /* BROKEN */
482 + // Do not blink the WAN Data LED if at least one interface is in bridge mode.
483 + if(gLedOffInBridgeMode == 1 && (ledName == kLedWanData || ledName == kLedPPP))
484 + {
485 + static int BridgedProtocol = -1;
486 +
487 + if( BridgedProtocol == -1 )
488 + BridgedProtocol = isBridgedProtocol();
489 +
490 + if( BridgedProtocol == TRUE )
491 + return;
492 + }
493 +#endif
494 +
495 + // If the state is kLedStateFail and there is not a failure LED defined
496 + // in the board parameters, change the state to kLedStateFastBlinkContinues.
497 + if( ledState == kLedStateFail && ledInfoPtr->ledMaskFail == 0 )
498 + ledState = kLedStateFastBlinkContinues;
499 +
500 + switch (ledState)
501 + {
502 + case kLedStateOn:
503 + // First, turn off the complimentary (failure) LED GPIO.
504 + if( ledInfoPtr->ledMaskFail )
505 + ledOffFail(ledInfoPtr);
506 + else
507 + if( gLedHwFailFunc[(int) ledName] )
508 + (*gLedHwFailFunc[(int) ledName]) (ledName, kLedStateOff);
509 +
510 + // Next, turn on the specified LED GPIO.
511 + ledOn(ledInfoPtr);
512 + break;
513 +
514 + case kLedStateOff:
515 + // First, turn off the complimentary (failure) LED GPIO.
516 + if( ledInfoPtr->ledMaskFail )
517 + ledOffFail(ledInfoPtr);
518 + else
519 + if( gLedHwFailFunc[(int) ledName] )
520 + (*gLedHwFailFunc[(int) ledName]) (ledName, kLedStateOff);
521 +
522 + // Next, turn off the specified LED GPIO.
523 + ledOff(ledInfoPtr);
524 + break;
525 +
526 + case kLedStateFail:
527 + // First, turn off the complimentary (normal) LED GPIO.
528 + if( ledInfoPtr->ledMask )
529 + ledOff(ledInfoPtr);
530 + else
531 + if( gLedHwFunc[(int) ledName] )
532 + (*gLedHwFunc[(int) ledName]) (ledName, kLedStateOff);
533 +
534 + // Next, turn on (red) the specified LED GPIO.
535 + ledOnFail(ledInfoPtr);
536 + break;
537 +
538 + case kLedStateBlinkOnce:
539 + // skip blinkOnce if it is already in Slow/Fast blink continues state
540 + if (ledInfoPtr->savedLedState == kLedStateSlowBlinkContinues ||
541 + ledInfoPtr->savedLedState == kLedStateFastBlinkContinues)
542 + ;
543 + else
544 + {
545 + if (ledInfoPtr->blinkCountDown == 0) // skip the call if it is 1
546 + {
547 + ledToggle(ledInfoPtr);
548 + ledInfoPtr->blinkCountDown = 1; // it will be reset to 0 when timer expires
549 + ledInfoPtr->ledState = kLedStateBlinkOnce;
550 + ledTimerStart();
551 + }
552 + }
553 + break;
554 +
555 + case kLedStateSlowBlinkContinues:
556 + ledInfoPtr->blinkCountDown = kSlowBlinkCount;
557 + ledInfoPtr->ledState = kLedStateSlowBlinkContinues;
558 + ledInfoPtr->savedLedState = kLedStateSlowBlinkContinues;
559 + ledTimerStart();
560 + break;
561 +
562 + case kLedStateFastBlinkContinues:
563 + ledInfoPtr->blinkCountDown = kFastBlinkCount;
564 + ledInfoPtr->ledState = kLedStateFastBlinkContinues;
565 + ledInfoPtr->savedLedState = kLedStateFastBlinkContinues;
566 + ledTimerStart();
567 + break;
568 +
569 + default:
570 + printk("Invalid led state\n");
571 + }
572 +}
573 +
574 +// This function is called for an LED that is controlled by hardware.
575 +void kerSysLedRegisterHwHandler( BOARD_LED_NAME ledName,
576 + HANDLE_LED_FUNC ledHwFunc, int ledFailType )
577 +{
578 + if( (int) ledName < MAX_VIRT_LEDS )
579 + {
580 + if( ledFailType == 1 )
581 + gLedHwFailFunc[(int) ledName] = ledHwFunc;
582 + else
583 + gLedHwFunc[(int) ledName] = ledHwFunc;
584 + }
585 +}
586 +
587 diff -urN linux.old/arch/mips/bcm963xx/board.c linux.dev/arch/mips/bcm963xx/board.c
588 --- linux.old/arch/mips/bcm963xx/board.c 1970-01-01 01:00:00.000000000 +0100
589 +++ linux.dev/arch/mips/bcm963xx/board.c 2006-08-27 21:02:04.000000000 +0200
590 @@ -0,0 +1,559 @@
591 +/*
592 +<:copyright-gpl
593 + Copyright 2002 Broadcom Corp. All Rights Reserved.
594 +
595 + This program is free software; you can distribute it and/or modify it
596 + under the terms of the GNU General Public License (Version 2) as
597 + published by the Free Software Foundation.
598 +
599 + This program is distributed in the hope it will be useful, but WITHOUT
600 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
601 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
602 + for more details.
603 +
604 + You should have received a copy of the GNU General Public License along
605 + with this program; if not, write to the Free Software Foundation, Inc.,
606 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
607 +:>
608 +*/
609 +
610 +/* Includes. */
611 +#include <linux/version.h>
612 +#include <linux/init.h>
613 +#include <linux/fs.h>
614 +#include <linux/interrupt.h>
615 +#include <linux/capability.h>
616 +#include <linux/slab.h>
617 +#include <linux/errno.h>
618 +#include <linux/module.h>
619 +#include <linux/pagemap.h>
620 +#include <asm/uaccess.h>
621 +#include <linux/wait.h>
622 +#include <linux/poll.h>
623 +#include <linux/sched.h>
624 +#include <linux/list.h>
625 +#include <linux/if.h>
626 +#include <linux/spinlock.h>
627 +
628 +#include <bcm_map_part.h>
629 +#include <board.h>
630 +#include <bcmTag.h>
631 +#include "boardparms.h"
632 +#include "bcm_intr.h"
633 +#include "board.h"
634 +#include "bcm_map_part.h"
635 +
636 +static DEFINE_SPINLOCK(board_lock);
637 +
638 +/* Typedefs. */
639 +#if defined (NON_CONSECUTIVE_MAC)
640 +// used to be the last octet. Now changed to the first 5 bits of the the forth octet
641 +// to reduced the duplicated MAC addresses.
642 +#define CHANGED_OCTET 3
643 +#define SHIFT_BITS 3
644 +#else
645 +#define CHANGED_OCTET 1
646 +#define SHIFT_BITS 0
647 +#endif
648 +
649 +typedef struct
650 +{
651 + unsigned long ulId;
652 + char chInUse;
653 + char chReserved[3];
654 +} MAC_ADDR_INFO, *PMAC_ADDR_INFO;
655 +
656 +typedef struct
657 +{
658 + unsigned long ulSdramSize;
659 + unsigned long ulPsiSize;
660 + unsigned long ulNumMacAddrs;
661 + unsigned long ucaBaseMacAddr[NVRAM_MAC_ADDRESS_LEN];
662 + MAC_ADDR_INFO MacAddrs[1];
663 +} NVRAM_INFO, *PNVRAM_INFO;
664 +
665 +typedef struct
666 +{
667 + unsigned long eventmask;
668 +} BOARD_IOC, *PBOARD_IOC;
669 +
670 +
671 +/*Dyinggasp callback*/
672 +typedef void (*cb_dgasp_t)(void *arg);
673 +typedef struct _CB_DGASP__LIST
674 +{
675 + struct list_head list;
676 + char name[IFNAMSIZ];
677 + cb_dgasp_t cb_dgasp_fn;
678 + void *context;
679 +}CB_DGASP_LIST , *PCB_DGASP_LIST;
680 +
681 +
682 +static LED_MAP_PAIR LedMapping[] =
683 +{ // led name Initial state physical pin (ledMask)
684 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
685 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
686 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
687 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
688 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
689 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
690 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
691 + {kLedEnd, kLedStateOff, 0, 0, 0, 0},
692 + {kLedEnd, kLedStateOff, 0, 0, 0, 0} // NOTE: kLedEnd has to be at the end.
693 +};
694 +
695 +/* Externs. */
696 +extern struct file fastcall *fget_light(unsigned int fd, int *fput_needed);
697 +extern unsigned int nr_free_pages (void);
698 +extern const char *get_system_type(void);
699 +extern void kerSysFlashInit(void);
700 +extern unsigned long get_nvram_start_addr(void);
701 +extern unsigned long get_scratch_pad_start_addr(void);
702 +extern unsigned long getMemorySize(void);
703 +extern void __init boardLedInit(PLED_MAP_PAIR);
704 +extern void boardLedCtrl(BOARD_LED_NAME, BOARD_LED_STATE);
705 +extern void kerSysLedRegisterHandler( BOARD_LED_NAME ledName,
706 + HANDLE_LED_FUNC ledHwFunc, int ledFailType );
707 +
708 +/* Prototypes. */
709 +void __init InitNvramInfo( void );
710 +
711 +/* DyingGasp function prototype */
712 +static void __init kerSysDyingGaspMapIntr(void);
713 +static irqreturn_t kerSysDyingGaspIsr(int irq, void * dev_id);
714 +static void __init kerSysInitDyingGaspHandler( void );
715 +static void __exit kerSysDeinitDyingGaspHandler( void );
716 +/* -DyingGasp function prototype - */
717 +
718 +static PNVRAM_INFO g_pNvramInfo = NULL;
719 +static int g_ledInitialized = 0;
720 +static CB_DGASP_LIST *g_cb_dgasp_list_head = NULL;
721 +
722 +static int g_wakeup_monitor = 0;
723 +static struct file *g_monitor_file = NULL;
724 +static struct task_struct *g_monitor_task = NULL;
725 +static unsigned int (*g_orig_fop_poll)
726 + (struct file *, struct poll_table_struct *) = NULL;
727 +
728 +void kerSysMipsSoftReset(void)
729 +{
730 + if (PERF->RevID == 0x634800A1) {
731 + typedef void (*FNPTR) (void);
732 + FNPTR bootaddr = (FNPTR) FLASH_BASE;
733 + int i;
734 +
735 + /* Disable interrupts. */
736 + //cli();
737 + spin_lock_irq(&board_lock);
738 +
739 + /* Reset all blocks. */
740 + PERF->BlockSoftReset &= ~BSR_ALL_BLOCKS;
741 + for( i = 0; i < 1000000; i++ )
742 + ;
743 + PERF->BlockSoftReset |= BSR_ALL_BLOCKS;
744 + /* Jump to the power on address. */
745 + (*bootaddr) ();
746 + }
747 + else
748 + PERF->pll_control |= SOFT_RESET; // soft reset mips
749 +}
750 +
751 +
752 +int kerSysGetMacAddress( unsigned char *pucaMacAddr, unsigned long ulId )
753 +{
754 + int nRet = 0;
755 + PMAC_ADDR_INFO pMai = NULL;
756 + PMAC_ADDR_INFO pMaiFreeNoId = NULL;
757 + PMAC_ADDR_INFO pMaiFreeId = NULL;
758 + unsigned long i = 0, ulIdxNoId = 0, ulIdxId = 0, shiftedIdx = 0;
759 +
760 + /* CMO -- Fix le problème avec les adresses mac que l'on n'arrive pas
761 + * * à relire plusieurs fois */
762 + /* inv_xde */
763 +#if 0
764 + if (boot_loader_type == BOOT_CFE)
765 + memcpy( pucaMacAddr, g_pNvramInfo->ucaBaseMacAddr,
766 + NVRAM_MAC_ADDRESS_LEN );
767 + else {
768 +#endif
769 + pucaMacAddr[0] = 0x00;
770 + pucaMacAddr[1] = 0x07;
771 + pucaMacAddr[2] = 0x3A;
772 + pucaMacAddr[3] = 0xFF;
773 + pucaMacAddr[4] = 0xFF;
774 + pucaMacAddr[5] = 0xFF;
775 +#if 0
776 + }
777 +#endif
778 +
779 + return nRet;
780 +} /* kerSysGetMacAddr */
781 +
782 +int kerSysReleaseMacAddress( unsigned char *pucaMacAddr )
783 +{
784 + int nRet = -EINVAL;
785 + unsigned long ulIdx = 0;
786 + int idx = (pucaMacAddr[NVRAM_MAC_ADDRESS_LEN - CHANGED_OCTET] -
787 + g_pNvramInfo->ucaBaseMacAddr[NVRAM_MAC_ADDRESS_LEN - CHANGED_OCTET]);
788 +
789 + // if overflow 255 (negitive), add 256 to have the correct index
790 + if (idx < 0)
791 + idx += 256;
792 + ulIdx = (unsigned long) (idx >> SHIFT_BITS);
793 +
794 + if( ulIdx < g_pNvramInfo->ulNumMacAddrs )
795 + {
796 + PMAC_ADDR_INFO pMai = &g_pNvramInfo->MacAddrs[ulIdx];
797 + if( pMai->chInUse == 1 )
798 + {
799 + pMai->chInUse = 0;
800 + nRet = 0;
801 + }
802 + }
803 +
804 + return( nRet );
805 +} /* kerSysReleaseMacAddr */
806 +
807 +int kerSysGetSdramSize( void )
808 +{
809 + if (boot_loader_type == BOOT_CFE) {
810 + return( (int) g_pNvramInfo->ulSdramSize );
811 + }
812 + else {
813 + printk("kerSysGetSdramSize : 0x%08X\n", (int)getMemorySize() + 0x00040000);
814 + return((int)getMemorySize() + 0x00040000);
815 + }
816 +} /* kerSysGetSdramSize */
817 +
818 +
819 +void kerSysLedCtrl(BOARD_LED_NAME ledName, BOARD_LED_STATE ledState)
820 +{
821 + if (g_ledInitialized)
822 + boardLedCtrl(ledName, ledState);
823 +}
824 +
825 +unsigned int kerSysMonitorPollHook( struct file *f, struct poll_table_struct *t)
826 +{
827 + int mask = (*g_orig_fop_poll) (f, t);
828 +
829 + if( g_wakeup_monitor == 1 && g_monitor_file == f )
830 + {
831 + /* If g_wakeup_monitor is non-0, the user mode application needs to
832 + * return from a blocking select function. Return POLLPRI which will
833 + * cause the select to return with the exception descriptor set.
834 + */
835 + mask |= POLLPRI;
836 + g_wakeup_monitor = 0;
837 + }
838 +
839 + return( mask );
840 +}
841 +
842 +/* Put the user mode application that monitors link state on a run queue. */
843 +void kerSysWakeupMonitorTask( void )
844 +{
845 + g_wakeup_monitor = 1;
846 + if( g_monitor_task )
847 + wake_up_process( g_monitor_task );
848 +}
849 +
850 +//<<JUNHON, 2004/09/15, get reset button status , tim hou , 05/04/12
851 +int kerSysGetResetHold(void)
852 +{
853 + unsigned short gpio;
854 +
855 + if( BpGetPressAndHoldResetGpio( &gpio ) == BP_SUCCESS )
856 + {
857 + unsigned long gpio_mask = GPIO_NUM_TO_MASK(gpio);
858 + volatile unsigned long *gpio_reg = &GPIO->GPIOio;
859 +
860 + if( (gpio & ~BP_ACTIVE_MASK) >= 32 )
861 + {
862 + gpio_mask = GPIO_NUM_TO_MASK_HIGH(gpio);
863 + gpio_reg = &GPIO->GPIOio_high;
864 + }
865 + //printk("gpio=%04x,gpio_mask=%04x,gpio_reg=%04x\n",gpio,gpio_mask,*gpio_reg);
866 + if(*gpio_reg & gpio_mask) //press down
867 + return RESET_BUTTON_UP;
868 + }
869 + return RESET_BUTTON_PRESSDOWN;
870 +}
871 +//<<JUNHON, 2004/09/15
872 +
873 +/***************************************************************************
874 + * Dying gasp ISR and functions.
875 + ***************************************************************************/
876 +#define KERSYS_DBG printk
877 +
878 +#if defined(CONFIG_BCM96345)
879 +#define CYCLE_PER_US 70
880 +#elif defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)
881 +/* The BCM6348 cycles per microsecond is really variable since the BCM6348
882 + * MIPS speed can vary depending on the PLL settings. However, an appoximate
883 + * value of 120 will still work OK for the test being done.
884 + */
885 +#define CYCLE_PER_US 120
886 +#endif
887 +#define DG_GLITCH_TO (100*CYCLE_PER_US)
888 +
889 +static void __init kerSysDyingGaspMapIntr()
890 +{
891 + unsigned long ulIntr;
892 +
893 +#if defined(CONFIG_BCM96348) || defined(_BCM96348_) || defined(CONFIG_BCM96338) || defined(_BCM96338_)
894 + if( BpGetAdslDyingGaspExtIntr( &ulIntr ) == BP_SUCCESS ) {
895 + BcmHalMapInterrupt((FN_HANDLER)kerSysDyingGaspIsr, 0, INTERRUPT_ID_DG);
896 + BcmHalInterruptEnable( INTERRUPT_ID_DG );
897 + }
898 +#elif defined(CONFIG_BCM96345) || defined(_BCM96345_)
899 + if( BpGetAdslDyingGaspExtIntr( &ulIntr ) == BP_SUCCESS ) {
900 + ulIntr += INTERRUPT_ID_EXTERNAL_0;
901 + BcmHalMapInterrupt((FN_HANDLER)kerSysDyingGaspIsr, 0, ulIntr);
902 + BcmHalInterruptEnable( ulIntr );
903 + }
904 +#endif
905 +
906 +}
907 +
908 +void kerSysSetWdTimer(ulong timeUs)
909 +{
910 + TIMER->WatchDogDefCount = timeUs * (FPERIPH/1000000);
911 + TIMER->WatchDogCtl = 0xFF00;
912 + TIMER->WatchDogCtl = 0x00FF;
913 +}
914 +
915 +ulong kerSysGetCycleCount(void)
916 +{
917 + ulong cnt;
918 +#ifdef _WIN32_WCE
919 + cnt = 0;
920 +#else
921 + __asm volatile("mfc0 %0, $9":"=d"(cnt));
922 +#endif
923 + return(cnt);
924 +}
925 +
926 +static Bool kerSysDyingGaspCheckPowerLoss(void)
927 +{
928 + ulong clk0;
929 + ulong ulIntr;
930 +
931 + ulIntr = 0;
932 + clk0 = kerSysGetCycleCount();
933 +
934 + UART->Data = 'D';
935 + UART->Data = '%';
936 + UART->Data = 'G';
937 +
938 +#if defined(CONFIG_BCM96345)
939 + BpGetAdslDyingGaspExtIntr( &ulIntr );
940 +
941 + do {
942 + ulong clk1;
943 +
944 + clk1 = kerSysGetCycleCount(); /* time cleared */
945 + /* wait a little to get new reading */
946 + while ((kerSysGetCycleCount()-clk1) < CYCLE_PER_US*2)
947 + ;
948 + } while ((0 == (PERF->ExtIrqCfg & (1 << (ulIntr + EI_STATUS_SHFT)))) && ((kerSysGetCycleCount() - clk0) < DG_GLITCH_TO));
949 +
950 + if (PERF->ExtIrqCfg & (1 << (ulIntr + EI_STATUS_SHFT))) { /* power glitch */
951 + BcmHalInterruptEnable( ulIntr + INTERRUPT_ID_EXTERNAL_0);
952 + KERSYS_DBG(" - Power glitch detected. Duration: %ld us\n", (kerSysGetCycleCount() - clk0)/CYCLE_PER_US);
953 + return 0;
954 + }
955 +#elif (defined(CONFIG_BCM96348) || defined(CONFIG_BCM96338)) && !defined(VXWORKS)
956 + do {
957 + ulong clk1;
958 +
959 + clk1 = kerSysGetCycleCount(); /* time cleared */
960 + /* wait a little to get new reading */
961 + while ((kerSysGetCycleCount()-clk1) < CYCLE_PER_US*2)
962 + ;
963 + } while ((PERF->IrqStatus & (1 << (INTERRUPT_ID_DG - INTERNAL_ISR_TABLE_OFFSET))) && ((kerSysGetCycleCount() - clk0) < DG_GLITCH_TO));
964 +
965 + if (!(PERF->IrqStatus & (1 << (INTERRUPT_ID_DG - INTERNAL_ISR_TABLE_OFFSET)))) {
966 + BcmHalInterruptEnable( INTERRUPT_ID_DG );
967 + KERSYS_DBG(" - Power glitch detected. Duration: %ld us\n", (kerSysGetCycleCount() - clk0)/CYCLE_PER_US);
968 + return 0;
969 + }
970 +#endif
971 + return 1;
972 +}
973 +
974 +static void kerSysDyingGaspShutdown( void )
975 +{
976 + kerSysSetWdTimer(1000000);
977 +#if defined(CONFIG_BCM96345)
978 + PERF->blkEnables &= ~(EMAC_CLK_EN | USB_CLK_EN | CPU_CLK_EN);
979 +#elif defined(CONFIG_BCM96348)
980 + PERF->blkEnables &= ~(EMAC_CLK_EN | USBS_CLK_EN | USBH_CLK_EN | SAR_CLK_EN);
981 +#endif
982 +}
983 +
984 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
985 +static irqreturn_t kerSysDyingGaspIsr(int irq, void * dev_id)
986 +#else
987 +static unsigned int kerSysDyingGaspIsr(void)
988 +#endif
989 +{
990 + struct list_head *pos;
991 + CB_DGASP_LIST *tmp, *dsl = NULL;
992 +
993 + if (kerSysDyingGaspCheckPowerLoss()) {
994 +
995 + /* first to turn off everything other than dsl */
996 + list_for_each(pos, &g_cb_dgasp_list_head->list) {
997 + tmp = list_entry(pos, CB_DGASP_LIST, list);
998 + if(strncmp(tmp->name, "dsl", 3)) {
999 + (tmp->cb_dgasp_fn)(tmp->context);
1000 + }else {
1001 + dsl = tmp;
1002 + }
1003 + }
1004 +
1005 + /* now send dgasp */
1006 + if(dsl)
1007 + (dsl->cb_dgasp_fn)(dsl->context);
1008 +
1009 + /* reset and shutdown system */
1010 + kerSysDyingGaspShutdown();
1011 + }
1012 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
1013 +return( IRQ_HANDLED );
1014 +#else
1015 + return( 1 );
1016 +#endif
1017 +}
1018 +
1019 +static void __init kerSysInitDyingGaspHandler( void )
1020 +{
1021 + CB_DGASP_LIST *new_node;
1022 +
1023 + if( g_cb_dgasp_list_head != NULL) {
1024 + printk("Error: kerSysInitDyingGaspHandler: list head is not null\n");
1025 + return;
1026 + }
1027 + new_node= (CB_DGASP_LIST *)kmalloc(sizeof(CB_DGASP_LIST), GFP_KERNEL);
1028 + memset(new_node, 0x00, sizeof(CB_DGASP_LIST));
1029 + INIT_LIST_HEAD(&new_node->list);
1030 + g_cb_dgasp_list_head = new_node;
1031 +
1032 +} /* kerSysInitDyingGaspHandler */
1033 +
1034 +static void __exit kerSysDeinitDyingGaspHandler( void )
1035 +{
1036 + struct list_head *pos;
1037 + CB_DGASP_LIST *tmp;
1038 +
1039 + if(g_cb_dgasp_list_head == NULL)
1040 + return;
1041 +
1042 + list_for_each(pos, &g_cb_dgasp_list_head->list) {
1043 + tmp = list_entry(pos, CB_DGASP_LIST, list);
1044 + list_del(pos);
1045 + kfree(tmp);
1046 + }
1047 +
1048 + kfree(g_cb_dgasp_list_head);
1049 + g_cb_dgasp_list_head = NULL;
1050 +
1051 +} /* kerSysDeinitDyingGaspHandler */
1052 +
1053 +void kerSysRegisterDyingGaspHandler(char *devname, void *cbfn, void *context)
1054 +{
1055 + CB_DGASP_LIST *new_node;
1056 +
1057 + if( g_cb_dgasp_list_head == NULL) {
1058 + printk("Error: kerSysRegisterDyingGaspHandler: list head is null\n");
1059 + return;
1060 + }
1061 +
1062 + if( devname == NULL || cbfn == NULL ) {
1063 + printk("Error: kerSysRegisterDyingGaspHandler: register info not enough (%s,%x,%x)\n", devname, (unsigned int)cbfn, (unsigned int)context);
1064 + return;
1065 + }
1066 +
1067 + new_node= (CB_DGASP_LIST *)kmalloc(sizeof(CB_DGASP_LIST), GFP_KERNEL);
1068 + memset(new_node, 0x00, sizeof(CB_DGASP_LIST));
1069 + INIT_LIST_HEAD(&new_node->list);
1070 + strncpy(new_node->name, devname, IFNAMSIZ);
1071 + new_node->cb_dgasp_fn = (cb_dgasp_t)cbfn;
1072 + new_node->context = context;
1073 + list_add(&new_node->list, &g_cb_dgasp_list_head->list);
1074 +
1075 + printk("dgasp: kerSysRegisterDyingGaspHandler: %s registered \n", devname);
1076 +
1077 +} /* kerSysRegisterDyingGaspHandler */
1078 +
1079 +void kerSysDeregisterDyingGaspHandler(char *devname)
1080 +{
1081 + struct list_head *pos;
1082 + CB_DGASP_LIST *tmp;
1083 +
1084 + if(g_cb_dgasp_list_head == NULL) {
1085 + printk("Error: kerSysDeregisterDyingGaspHandler: list head is null\n");
1086 + return;
1087 + }
1088 +
1089 + if(devname == NULL) {
1090 + printk("Error: kerSysDeregisterDyingGaspHandler: devname is null\n");
1091 + return;
1092 + }
1093 +
1094 + printk("kerSysDeregisterDyingGaspHandler: %s is deregistering\n", devname);
1095 +
1096 + list_for_each(pos, &g_cb_dgasp_list_head->list) {
1097 + tmp = list_entry(pos, CB_DGASP_LIST, list);
1098 + if(!strcmp(tmp->name, devname)) {
1099 + list_del(pos);
1100 + kfree(tmp);
1101 + printk("kerSysDeregisterDyingGaspHandler: %s is deregistered\n", devname);
1102 + return;
1103 + }
1104 + }
1105 + printk("kerSysDeregisterDyingGaspHandler: %s not (de)registered\n", devname);
1106 +
1107 +} /* kerSysDeregisterDyingGaspHandler */
1108 +
1109 +//EXPORT_SYMBOL(kerSysNvRamGet);
1110 +EXPORT_SYMBOL(kerSysGetMacAddress);
1111 +EXPORT_SYMBOL(kerSysReleaseMacAddress);
1112 +EXPORT_SYMBOL(kerSysGetSdramSize);
1113 +EXPORT_SYMBOL(kerSysLedCtrl);
1114 +EXPORT_SYMBOL(kerSysGetResetHold);
1115 +EXPORT_SYMBOL(kerSysLedRegisterHwHandler);
1116 +EXPORT_SYMBOL(BpGetBoardIds);
1117 +EXPORT_SYMBOL(BpGetSdramSize);
1118 +EXPORT_SYMBOL(BpGetPsiSize);
1119 +EXPORT_SYMBOL(BpGetEthernetMacInfo);
1120 +EXPORT_SYMBOL(BpGetRj11InnerOuterPairGpios);
1121 +EXPORT_SYMBOL(BpGetPressAndHoldResetGpio);
1122 +EXPORT_SYMBOL(BpGetVoipResetGpio);
1123 +EXPORT_SYMBOL(BpGetVoipIntrGpio);
1124 +EXPORT_SYMBOL(BpGetPcmciaResetGpio);
1125 +EXPORT_SYMBOL(BpGetRtsCtsUartGpios);
1126 +EXPORT_SYMBOL(BpGetAdslLedGpio);
1127 +EXPORT_SYMBOL(BpGetAdslFailLedGpio);
1128 +EXPORT_SYMBOL(BpGetWirelessLedGpio);
1129 +EXPORT_SYMBOL(BpGetUsbLedGpio);
1130 +EXPORT_SYMBOL(BpGetHpnaLedGpio);
1131 +EXPORT_SYMBOL(BpGetWanDataLedGpio);
1132 +EXPORT_SYMBOL(BpGetPppLedGpio);
1133 +EXPORT_SYMBOL(BpGetPppFailLedGpio);
1134 +EXPORT_SYMBOL(BpGetVoipLedGpio);
1135 +EXPORT_SYMBOL(BpGetWirelessExtIntr);
1136 +EXPORT_SYMBOL(BpGetAdslDyingGaspExtIntr);
1137 +EXPORT_SYMBOL(BpGetVoipExtIntr);
1138 +EXPORT_SYMBOL(BpGetHpnaExtIntr);
1139 +EXPORT_SYMBOL(BpGetHpnaChipSelect);
1140 +EXPORT_SYMBOL(BpGetVoipChipSelect);
1141 +EXPORT_SYMBOL(BpGetWirelessSesBtnGpio);
1142 +EXPORT_SYMBOL(BpGetWirelessSesExtIntr);
1143 +EXPORT_SYMBOL(BpGetWirelessSesLedGpio);
1144 +EXPORT_SYMBOL(kerSysRegisterDyingGaspHandler);
1145 +EXPORT_SYMBOL(kerSysDeregisterDyingGaspHandler);
1146 +EXPORT_SYMBOL(kerSysGetCycleCount);
1147 +EXPORT_SYMBOL(kerSysSetWdTimer);
1148 +EXPORT_SYMBOL(kerSysWakeupMonitorTask);
1149 +
1150 diff -urN linux.old/arch/mips/bcm963xx/boardparms.c linux.dev/arch/mips/bcm963xx/boardparms.c
1151 --- linux.old/arch/mips/bcm963xx/boardparms.c 1970-01-01 01:00:00.000000000 +0100
1152 +++ linux.dev/arch/mips/bcm963xx/boardparms.c 2006-08-25 00:39:38.000000000 +0200
1153 @@ -0,0 +1,2391 @@
1154 +/*
1155 +<:copyright-gpl
1156 +
1157 + Copyright 2003 Broadcom Corp. All Rights Reserved.
1158 +
1159 + This program is free software; you can distribute it and/or modify it
1160 + under the terms of the GNU General Public License (Version 2) as
1161 + published by the Free Software Foundation.
1162 +
1163 + This program is distributed in the hope it will be useful, but WITHOUT
1164 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1165 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1166 + for more details.
1167 +
1168 + You should have received a copy of the GNU General Public License along
1169 + with this program; if not, write to the Free Software Foundation, Inc.,
1170 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
1171 +
1172 +:>
1173 +*/
1174 +/**************************************************************************
1175 + * File Name : boardparms.c
1176 + *
1177 + * Description: This file contains the implementation for the BCM63xx board
1178 + * parameter access functions.
1179 + *
1180 + * Updates : 07/14/2003 Created.
1181 + ***************************************************************************/
1182 +
1183 +/* Includes. */
1184 +#include "boardparms.h"
1185 +
1186 +/* Defines. */
1187 +
1188 +/* Default psi size in K bytes */
1189 +#define BP_PSI_DEFAULT_SIZE 24
1190 +
1191 +/* Typedefs */
1192 +typedef struct boardparameters
1193 +{
1194 + char szBoardId[BP_BOARD_ID_LEN]; /* board id string */
1195 + ETHERNET_MAC_INFO EnetMacInfos[BP_MAX_ENET_MACS];
1196 + VOIP_DSP_INFO VoIPDspInfo[BP_MAX_VOIP_DSP];
1197 + unsigned short usSdramSize; /* SDRAM size and type */
1198 + unsigned short usPsiSize; /* persistent storage in K bytes */
1199 + unsigned short usGpioRj11InnerPair; /* GPIO pin or not defined */
1200 + unsigned short usGpioRj11OuterPair; /* GPIO pin or not defined */
1201 + unsigned short usGpioPressAndHoldReset; /* GPIO pin or not defined */
1202 + unsigned short usGpioPcmciaReset; /* GPIO pin or not defined */
1203 + unsigned short usGpioUartRts; /* GPIO pin or not defined */
1204 + unsigned short usGpioUartCts; /* GPIO pin or not defined */
1205 + unsigned short usGpioLedAdsl; /* GPIO pin or not defined */
1206 + unsigned short usGpioLedAdslFail; /* GPIO pin or not defined */
1207 + unsigned short usGpioLedWireless; /* GPIO pin or not defined */
1208 + unsigned short usGpioLedUsb; /* GPIO pin or not defined */
1209 + unsigned short usGpioLedHpna; /* GPIO pin or not defined */
1210 + unsigned short usGpioLedWanData; /* GPIO pin or not defined */
1211 + unsigned short usGpioLedPpp; /* GPIO pin or not defined */
1212 + unsigned short usGpioLedPppFail; /* GPIO pin or not defined */
1213 + unsigned short usGpioLedBlPowerOn; /* GPIO pin or not defined */
1214 + unsigned short usGpioLedBlAlarm; /* GPIO pin or not defined */
1215 + unsigned short usGpioLedBlResetCfg; /* GPIO pin or not defined */
1216 + unsigned short usGpioLedBlStop; /* GPIO pin or not defined */
1217 + unsigned short usExtIntrWireless; /* ext intr or not defined */
1218 + unsigned short usExtIntrAdslDyingGasp; /* ext intr or not defined */
1219 + unsigned short usExtIntrHpna; /* ext intr or not defined */
1220 + unsigned short usCsHpna; /* chip select not defined */
1221 + unsigned short usAntInUseWireless; /* antenna in use or not defined */
1222 + unsigned short usGpioSesBtnWireless; /* GPIO pin or not defined */
1223 + unsigned short usExtIntrSesBtnWireless; /* ext intr or not defined */
1224 + unsigned short usGpioLedSesWireless; /* GPIO pin or not defined */
1225 +} BOARD_PARAMETERS, *PBOARD_PARAMETERS;
1226 +
1227 +/* Variables */
1228 +#if defined(_BCM96338_) || defined(CONFIG_BCM96338)
1229 +static BOARD_PARAMETERS g_bcm96338sv =
1230 +{
1231 + "96338SV", /* szBoardId */
1232 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1233 + 0x01, /* ucPhyAddress */
1234 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1235 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1236 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1237 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1238 + BP_NOT_DEFINED, /* usGpioPhyReset */
1239 + 0x01, /* numSwitchPorts */
1240 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1241 + BP_NOT_DEFINED}, /* usReverseMii */
1242 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1243 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1244 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1245 + BP_MEMORY_16MB_1_CHIP, /* usSdramSize */
1246 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1247 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1248 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1249 + BP_NOT_DEFINED, /* usGpioPressAndHoldReset */
1250 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1251 + BP_NOT_DEFINED, /* usGpioUartRts */
1252 + BP_NOT_DEFINED, /* usGpioUartCts */
1253 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1254 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1255 + BP_NOT_DEFINED, /* usGpioLedWireless */
1256 + BP_NOT_DEFINED, /* usGpioLedUsb */
1257 + BP_NOT_DEFINED, /* usGpioLedHpna */
1258 + BP_NOT_DEFINED, /* usGpioLedWanData */
1259 + BP_NOT_DEFINED, /* usGpioLedPpp */
1260 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1261 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1262 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1263 + BP_NOT_DEFINED, /* usGpioLedBlResetCfg */
1264 + BP_NOT_DEFINED, /* usGpioLedBlStop */
1265 + BP_NOT_DEFINED, /* usExtIntrWireless */
1266 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
1267 + BP_NOT_DEFINED, /* usExtIntrHpna */
1268 + BP_NOT_DEFINED, /* usCsHpna */
1269 + BP_NOT_DEFINED, /* usAntInUseWireless */
1270 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1271 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1272 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1273 +};
1274 +static BOARD_PARAMETERS g_bcm96338l2m8m =
1275 +{
1276 + "96338L-2M-8M", /* szBoardId */
1277 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1278 + 0x01, /* ucPhyAddress */
1279 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1280 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1281 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1282 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1283 + BP_NOT_DEFINED, /* usGpioPhyReset */
1284 + 0x01, /* numSwitchPorts */
1285 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1286 + BP_NOT_DEFINED}, /* usReverseMii */
1287 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1288 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1289 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1290 + BP_MEMORY_8MB_1_CHIP, /* usSdramSize */
1291 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1292 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1293 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1294 + BP_NOT_DEFINED, /* usGpioPressAndHoldReset */
1295 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1296 + BP_NOT_DEFINED, /* usGpioUartRts */
1297 + BP_NOT_DEFINED, /* usGpioUartCts */
1298 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1299 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
1300 + BP_NOT_DEFINED, /* usGpioLedWireless */
1301 + BP_NOT_DEFINED, /* usGpioLedUsb */
1302 + BP_NOT_DEFINED, /* usGpioLedHpna */
1303 + BP_GPIO_3_AL, /* usGpioLedWanData */
1304 + BP_GPIO_3_AL, /* usGpioLedPpp */
1305 + BP_GPIO_4_AL, /* usGpioLedPppFail */
1306 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
1307 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1308 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
1309 + BP_GPIO_1_AL, /* usGpioLedBlStop */
1310 + BP_NOT_DEFINED, /* usExtIntrWireless */
1311 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
1312 + BP_NOT_DEFINED, /* usExtIntrHpna */
1313 + BP_NOT_DEFINED, /* usCsHpna */
1314 + BP_NOT_DEFINED, /* usAntInUseWireless */
1315 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1316 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1317 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1318 +};
1319 +static PBOARD_PARAMETERS g_BoardParms[] =
1320 + {&g_bcm96338sv, &g_bcm96338l2m8m, 0};
1321 +#endif
1322 +
1323 +#if defined(_BCM96345_) || defined(CONFIG_BCM96345)
1324 +static BOARD_PARAMETERS g_bcm96345r =
1325 +{
1326 + "96345R", /* szBoardId */
1327 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1328 + 0x01, /* ucPhyAddress */
1329 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1330 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1331 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1332 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1333 + BP_NOT_DEFINED, /* usGpioPhyReset */
1334 + 0x01, /* numSwitchPorts */
1335 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1336 + BP_NOT_DEFINED}, /* usReverseMii */
1337 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1338 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1339 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1340 + BP_MEMORY_8MB_1_CHIP, /* usSdramSize */
1341 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1342 + BP_GPIO_11_AH, /* usGpioRj11InnerPair */
1343 + BP_GPIO_12_AH, /* usGpioRj11OuterPair */
1344 + BP_GPIO_13_AH, /* usGpioPressAndHoldReset */
1345 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1346 + BP_NOT_DEFINED, /* usGpioUartRts */
1347 + BP_NOT_DEFINED, /* usGpioUartCts */
1348 + BP_GPIO_8_AH, /* usGpioLedAdsl */
1349 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1350 + BP_NOT_DEFINED, /* usGpioLedWireless */
1351 + BP_NOT_DEFINED, /* usGpioLedUsb */
1352 + BP_NOT_DEFINED, /* usGpioLedHpna */
1353 + BP_GPIO_8_AH, /* usGpioLedWanData */
1354 + BP_GPIO_9_AH, /* usGpioLedPpp */
1355 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1356 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1357 + BP_GPIO_10_AH, /* usGpioLedBlAlarm */
1358 + BP_GPIO_9_AH, /* usGpioLedBlResetCfg */
1359 + BP_GPIO_8_AH, /* usGpioLedBlStop */
1360 + BP_NOT_DEFINED, /* usExtIntrWireless */
1361 + BP_EXT_INTR_0, /* usExtIntrAdslDyingGasp */
1362 + BP_NOT_DEFINED, /* usExtIntrHpna */
1363 + BP_NOT_DEFINED, /* usCsHpna */
1364 + BP_NOT_DEFINED, /* usAntInUseWireless */
1365 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1366 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1367 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1368 +};
1369 +
1370 +static BOARD_PARAMETERS g_bcm96345gw2 =
1371 +{
1372 + /* A hardware jumper determines whether GPIO 13 is used for Press and Hold
1373 + * Reset or RTS.
1374 + */
1375 + "96345GW2", /* szBoardId */
1376 + {{BP_ENET_EXTERNAL_SWITCH, /* ucPhyType */
1377 + 0x00, /* ucPhyAddress */
1378 + BP_GPIO_0_AH, /* usGpioPhySpiSck */
1379 + BP_GPIO_4_AH, /* usGpioPhySpiSs */
1380 + BP_GPIO_12_AH, /* usGpioPhySpiMosi */
1381 + BP_GPIO_11_AH, /* usGpioPhySpiMiso */
1382 + BP_NOT_DEFINED, /* usGpioPhyReset */
1383 + 0x04, /* numSwitchPorts */
1384 + BP_ENET_CONFIG_GPIO, /* usConfigType */
1385 + BP_ENET_REVERSE_MII}, /* usReverseMii */
1386 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1387 + {{BP_VOIP_DSP, /* ucDspType */
1388 + 0x00, /* ucDspAddress */
1389 + BP_EXT_INTR_1, /* usExtIntrVoip */
1390 + BP_GPIO_6_AH, /* usGpioVoipReset */
1391 + BP_GPIO_15_AH, /* usGpioVoipIntr */
1392 + BP_NOT_DEFINED, /* usGpioLedVoip */
1393 + BP_CS_2}, /* usCsVoip */
1394 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1395 + BP_MEMORY_16MB_1_CHIP, /* usSdramSize */
1396 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1397 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1398 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1399 + BP_GPIO_13_AH, /* usGpioPressAndHoldReset */
1400 + BP_GPIO_2_AH, /* usGpioPcmciaReset */
1401 + BP_GPIO_13_AH, /* usGpioUartRts */
1402 + BP_GPIO_9_AH, /* usGpioUartCts */
1403 + BP_GPIO_8_AH, /* usGpioLedAdsl */
1404 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1405 + BP_NOT_DEFINED, /* usGpioLedWireless */
1406 + BP_GPIO_7_AH, /* usGpioLedUsb */
1407 + BP_NOT_DEFINED, /* usGpioLedHpna */
1408 + BP_GPIO_8_AH, /* usGpioLedWanData */
1409 + BP_NOT_DEFINED, /* usGpioLedPpp */
1410 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1411 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1412 + BP_GPIO_10_AH, /* usGpioLedBlAlarm */
1413 + BP_GPIO_7_AH, /* usGpioLedBlResetCfg */
1414 + BP_GPIO_8_AH, /* usGpioLedBlStop */
1415 + BP_EXT_INTR_2, /* usExtIntrWireless */
1416 + BP_EXT_INTR_0, /* usExtIntrAdslDyingGasp */
1417 + BP_NOT_DEFINED, /* usExtIntrHpna */
1418 + BP_NOT_DEFINED, /* usCsHpna */
1419 + BP_WLAN_ANT_MAIN, /* usAntInUseWireless */
1420 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1421 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1422 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1423 +};
1424 +
1425 +static BOARD_PARAMETERS g_bcm96345gw =
1426 +{
1427 + "96345GW", /* szBoardId */
1428 + {{BP_ENET_EXTERNAL_SWITCH, /* ucPhyType */
1429 + 0x00, /* ucPhyAddress */
1430 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1431 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1432 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1433 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1434 + BP_NOT_DEFINED, /* usGpioPhyReset */
1435 + 0x04, /* numSwitchPorts */
1436 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1437 + BP_ENET_NO_REVERSE_MII}, /* usReverseMii */
1438 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1439 + {{BP_VOIP_DSP, /* ucDspType */
1440 + 0x00, /* ucDspAddress */
1441 + BP_EXT_INTR_1, /* usExtIntrVoip */
1442 + BP_GPIO_6_AH, /* usGpioVoipReset */
1443 + BP_GPIO_15_AH, /* usGpioVoipIntr */
1444 + BP_NOT_DEFINED, /* usGpioLedVoip */
1445 + BP_CS_2}, /* usCsVoip */
1446 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1447 + BP_MEMORY_16MB_1_CHIP, /* usSdramSize */
1448 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1449 + BP_GPIO_11_AH, /* usGpioRj11InnerPair */
1450 + BP_GPIO_1_AH, /* usGpioRj11OuterPair */
1451 + BP_GPIO_13_AH, /* usGpioPressAndHoldReset */
1452 + BP_GPIO_2_AH, /* usGpioPcmciaReset */
1453 + BP_NOT_DEFINED, /* usGpioUartRts */
1454 + BP_NOT_DEFINED, /* usGpioUartCts */
1455 + BP_GPIO_8_AH, /* usGpioLedAdsl */
1456 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1457 + BP_GPIO_10_AH, /* usGpioLedWireless */
1458 + BP_GPIO_7_AH, /* usGpioLedUsb */
1459 + BP_NOT_DEFINED, /* usGpioLedHpna */
1460 + BP_GPIO_8_AH, /* usGpioLedWanData */
1461 + BP_NOT_DEFINED, /* usGpioLedPpp */
1462 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1463 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1464 + BP_GPIO_9_AH, /* usGpioLedBlAlarm */
1465 + BP_GPIO_10_AH, /* usGpioLedBlResetCfg */
1466 + BP_GPIO_8_AH, /* usGpioLedBlStop */
1467 + BP_EXT_INTR_2, /* usExtIntrWireless */
1468 + BP_EXT_INTR_0, /* usExtIntrAdslDyingGasp */
1469 + BP_EXT_INTR_3, /* usExtIntrHpna */
1470 + BP_CS_1, /* usCsHpna */
1471 + BP_WLAN_ANT_MAIN, /* usAntInUseWireless */
1472 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1473 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1474 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1475 +};
1476 +
1477 +static BOARD_PARAMETERS g_bcm96335r =
1478 +{
1479 + "96335R", /* szBoardId */
1480 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1481 + 0x01, /* ucPhyAddress */
1482 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1483 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1484 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1485 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1486 + BP_NOT_DEFINED, /* usGpioPhyReset */
1487 + 0x01, /* numSwitchPorts */
1488 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1489 + BP_NOT_DEFINED}, /* usReverseMii */
1490 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1491 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1492 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1493 + BP_MEMORY_8MB_1_CHIP, /* usSdramSize */
1494 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1495 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1496 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1497 + BP_GPIO_14_AH, /* usGpioPressAndHoldReset */
1498 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1499 + BP_NOT_DEFINED, /* usGpioUartRts */
1500 + BP_NOT_DEFINED, /* usGpioUartCts */
1501 + BP_GPIO_9_AH, /* usGpioLedAdsl */
1502 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1503 + BP_NOT_DEFINED, /* usGpioLedWireless */
1504 + BP_NOT_DEFINED, /* usGpioLedUsb */
1505 + BP_NOT_DEFINED, /* usGpioLedHpna */
1506 + BP_GPIO_9_AH, /* usGpioLedWanData */
1507 + BP_GPIO_8_AH, /* usGpioLedPpp */
1508 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1509 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1510 + BP_GPIO_10_AH, /* usGpioLedBlAlarm */
1511 + BP_GPIO_8_AH, /* usGpioLedBlResetCfg */
1512 + BP_GPIO_9_AH, /* usGpioLedBlStop */
1513 + BP_NOT_DEFINED, /* usExtIntrWireless */
1514 + BP_NOT_DEFINED, /* usExtIntrAdslDyingGasp */
1515 + BP_NOT_DEFINED, /* usExtIntrHpna */
1516 + BP_NOT_DEFINED, /* usCsHpna */
1517 + BP_NOT_DEFINED, /* usAntInUseWireless */
1518 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1519 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1520 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1521 +};
1522 +
1523 +static BOARD_PARAMETERS g_bcm96345r0 =
1524 +{
1525 + "96345R0", /* szBoardId */
1526 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1527 + 0x01, /* ucPhyAddress */
1528 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1529 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1530 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1531 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1532 + BP_NOT_DEFINED, /* usGpioPhyReset */
1533 + 0x01, /* numSwitchPorts */
1534 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1535 + BP_NOT_DEFINED}, /* usReverseMii */
1536 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1537 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1538 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1539 + BP_MEMORY_8MB_1_CHIP, /* usSdramSize */
1540 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1541 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1542 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1543 + BP_NOT_DEFINED, /* usGpioPressAndHoldReset */
1544 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1545 + BP_NOT_DEFINED, /* usGpioUartRts */
1546 + BP_NOT_DEFINED, /* usGpioUartCts */
1547 + BP_GPIO_8_AH, /* usGpioLedAdsl */
1548 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1549 + BP_NOT_DEFINED, /* usGpioLedWireless */
1550 + BP_NOT_DEFINED, /* usGpioLedUsb */
1551 + BP_NOT_DEFINED, /* usGpioLedHpna */
1552 + BP_GPIO_9_AH, /* usGpioLedWanData */
1553 + BP_GPIO_9_AH, /* usGpioLedPpp */
1554 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1555 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1556 + BP_GPIO_9_AH, /* usGpioLedBlAlarm */
1557 + BP_GPIO_8_AH, /* usGpioLedBlResetCfg */
1558 + BP_GPIO_8_AH, /* usGpioLedBlStop */
1559 + BP_NOT_DEFINED, /* usExtIntrWireless */
1560 + BP_NOT_DEFINED, /* usExtIntrAdslDyingGasp */
1561 + BP_NOT_DEFINED, /* usExtIntrHpna */
1562 + BP_NOT_DEFINED, /* usCsHpna */
1563 + BP_NOT_DEFINED, /* usAntInUseWireless */
1564 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1565 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1566 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1567 +};
1568 +
1569 +static BOARD_PARAMETERS g_bcm96345rs =
1570 +{
1571 + "96345RS", /* szBoardId */
1572 + {{BP_ENET_EXTERNAL_SWITCH, /* ucPhyType */
1573 + 0x00, /* ucPhyAddress */
1574 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1575 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1576 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1577 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1578 + BP_NOT_DEFINED, /* usGpioPhyReset */
1579 + 0x01, /* numSwitchPorts */
1580 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1581 + BP_ENET_NO_REVERSE_MII}, /* usReverseMii */
1582 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1583 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1584 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1585 + BP_MEMORY_8MB_1_CHIP, /* usSdramSize */
1586 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1587 + BP_GPIO_11_AH, /* usGpioRj11InnerPair */
1588 + BP_GPIO_12_AH, /* usGpioRj11OuterPair */
1589 + BP_GPIO_13_AH, /* usGpioPressAndHoldReset */
1590 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1591 + BP_NOT_DEFINED, /* usGpioUartRts */
1592 + BP_NOT_DEFINED, /* usGpioUartCts */
1593 + BP_GPIO_8_AH, /* usGpioLedAdsl */
1594 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1595 + BP_NOT_DEFINED, /* usGpioLedWireless */
1596 + BP_NOT_DEFINED, /* usGpioLedUsb */
1597 + BP_NOT_DEFINED, /* usGpioLedHpna */
1598 + BP_GPIO_8_AH, /* usGpioLedWanData */
1599 + BP_GPIO_9_AH, /* usGpioLedPpp */
1600 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1601 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1602 + BP_GPIO_10_AH, /* usGpioLedBlAlarm */
1603 + BP_GPIO_9_AH, /* usGpioLedBlResetCfg */
1604 + BP_GPIO_8_AH, /* usGpioLedBlStop */
1605 + BP_NOT_DEFINED, /* usExtIntrWireless */
1606 + BP_EXT_INTR_0, /* usExtIntrAdslDyingGasp */
1607 + BP_NOT_DEFINED, /* usExtIntrHpna */
1608 + BP_NOT_DEFINED, /* usCsHpna */
1609 + BP_NOT_DEFINED, /* usAntInUseWireless */
1610 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1611 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1612 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1613 +};
1614 +
1615 +static PBOARD_PARAMETERS g_BoardParms[] =
1616 + {&g_bcm96345r, &g_bcm96345gw2, &g_bcm96345gw, &g_bcm96335r, &g_bcm96345r0,
1617 + &g_bcm96345rs, 0};
1618 +#endif
1619 +
1620 +#if defined(_BCM96348_) || defined(CONFIG_BCM96348)
1621 +
1622 +static BOARD_PARAMETERS g_bcm96348r =
1623 +{
1624 + "96348R", /* szBoardId */
1625 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1626 + 0x01, /* ucPhyAddress */
1627 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1628 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1629 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1630 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1631 + BP_NOT_DEFINED, /* usGpioPhyReset */
1632 + 0x01, /* numSwitchPorts */
1633 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1634 + BP_NOT_DEFINED}, /* usReverseMii */
1635 + {BP_ENET_NO_PHY}}, /* ucPhyType */
1636 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1637 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1638 + BP_MEMORY_8MB_1_CHIP, /* usSdramSize */
1639 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1640 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1641 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1642 + BP_GPIO_7_AH, /* usGpioPressAndHoldReset */
1643 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1644 + BP_NOT_DEFINED, /* usGpioUartRts */
1645 + BP_NOT_DEFINED, /* usGpioUartCts */
1646 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1647 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
1648 + BP_NOT_DEFINED, /* usGpioLedWireless */
1649 + BP_NOT_DEFINED, /* usGpioLedUsb */
1650 + BP_NOT_DEFINED, /* usGpioLedHpna */
1651 + BP_GPIO_3_AL, /* usGpioLedWanData */
1652 + BP_GPIO_3_AL, /* usGpioLedPpp */
1653 + BP_GPIO_4_AL, /* usGpioLedPppFail */
1654 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
1655 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1656 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
1657 + BP_GPIO_1_AL, /* usGpioLedBlStop */
1658 + BP_NOT_DEFINED, /* usExtIntrWireless */
1659 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
1660 + BP_NOT_DEFINED, /* usExtIntrHpna */
1661 + BP_NOT_DEFINED, /* usCsHpna */
1662 + BP_NOT_DEFINED, /* usAntInUseWireless */
1663 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1664 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1665 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1666 +};
1667 +
1668 +static BOARD_PARAMETERS g_bcm96348lv =
1669 +{
1670 + "96348LV", /* szBoardId */
1671 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1672 + 0x01, /* ucPhyAddress */
1673 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1674 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1675 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1676 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1677 + BP_NOT_DEFINED, /* usGpioPhyReset */
1678 + 0x01, /* numSwitchPorts */
1679 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1680 + BP_NOT_DEFINED}, /* usReverseMii */
1681 + {BP_ENET_EXTERNAL_PHY, /* ucPhyType */
1682 + 0x02, /* ucPhyAddress */
1683 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1684 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1685 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1686 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1687 + BP_GPIO_5_AL, /* usGpioPhyReset */
1688 + 0x01, /* numSwitchPorts */
1689 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1690 + BP_NOT_DEFINED}}, /* usReverseMii */
1691 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1692 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1693 + BP_MEMORY_16MB_2_CHIP, /* usSdramSize */
1694 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1695 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1696 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1697 + BP_GPIO_7_AH, /* usGpioPressAndHoldReset */
1698 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1699 + BP_NOT_DEFINED, /* usGpioUartRts */
1700 + BP_NOT_DEFINED, /* usGpioUartCts */
1701 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1702 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
1703 + BP_NOT_DEFINED, /* usGpioLedWireless */
1704 + BP_NOT_DEFINED, /* usGpioLedUsb */
1705 + BP_NOT_DEFINED, /* usGpioLedHpna */
1706 + BP_GPIO_3_AL, /* usGpioLedWanData */
1707 + BP_GPIO_3_AL, /* usGpioLedPpp */
1708 + BP_GPIO_4_AL, /* usGpioLedPppFail */
1709 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
1710 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1711 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
1712 + BP_GPIO_1_AL, /* usGpioLedBlStop */
1713 + BP_NOT_DEFINED, /* usExtIntrWireless */
1714 + BP_NOT_DEFINED, /* usExtIntrAdslDyingGasp */
1715 + BP_NOT_DEFINED, /* usExtIntrHpna */
1716 + BP_NOT_DEFINED, /* usCsHpna */
1717 + BP_NOT_DEFINED, /* usAntInUseWireless */
1718 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1719 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1720 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1721 +};
1722 +
1723 +static BOARD_PARAMETERS g_bcm96348gw =
1724 +{
1725 + "96348GW", /* szBoardId */
1726 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1727 + 0x01, /* ucPhyAddress */
1728 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1729 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1730 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1731 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1732 + BP_NOT_DEFINED, /* usGpioPhyReset */
1733 + 0x01, /* numSwitchPorts */
1734 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1735 + BP_NOT_DEFINED}, /* usReverseMii */
1736 + {BP_ENET_EXTERNAL_SWITCH, /* ucPhyType */
1737 + 0x00, /* ucPhyAddress */
1738 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1739 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1740 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1741 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1742 + BP_NOT_DEFINED, /* usGpioPhyReset */
1743 + 0x03, /* numSwitchPorts */
1744 + BP_ENET_CONFIG_SPI_SSB_0, /* usConfigType */
1745 + BP_ENET_REVERSE_MII}}, /* usReverseMii */
1746 + {{BP_VOIP_DSP, /* ucDspType */
1747 + 0x00, /* ucDspAddress */
1748 + BP_EXT_INTR_2, /* usExtIntrVoip */
1749 + BP_GPIO_6_AH, /* usGpioVoipReset */
1750 + BP_GPIO_34_AH, /* usGpioVoipIntr */
1751 + BP_NOT_DEFINED, /* usGpioLedVoip */
1752 + BP_CS_2}, /* usCsVoip */
1753 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1754 + BP_MEMORY_16MB_2_CHIP, /* usSdramSize */
1755 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1756 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1757 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1758 + BP_GPIO_33_AL, /* usGpioPressAndHoldReset */
1759 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1760 + BP_NOT_DEFINED, /* usGpioUartRts */
1761 + BP_NOT_DEFINED, /* usGpioUartCts */
1762 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1763 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
1764 + BP_NOT_DEFINED, /* usGpioLedWireless */
1765 + BP_NOT_DEFINED, /* usGpioLedUsb */
1766 + BP_NOT_DEFINED, /* usGpioLedHpna */
1767 + BP_GPIO_3_AL, /* usGpioLedWanData */
1768 + BP_GPIO_3_AL, /* usGpioLedPpp */
1769 + BP_GPIO_4_AL, /* usGpioLedPppFail */
1770 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
1771 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1772 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
1773 + BP_GPIO_1_AL, /* usGpioLedBlStop */
1774 + BP_NOT_DEFINED, /* usExtIntrWireless */
1775 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
1776 + BP_NOT_DEFINED, /* usExtIntrHpna */
1777 + BP_NOT_DEFINED, /* usCsHpna */
1778 + BP_WLAN_ANT_MAIN, /* usAntInUseWireless */
1779 + BP_NOT_DEFINED, /* BP_GPIO_35_AH, */ /* usGpioSesBtnWireless */
1780 + BP_NOT_DEFINED, /* BP_EXT_INTR_3, */ /* usExtIntrSesBtnWireless */
1781 + BP_NOT_DEFINED /* BP_GPIO_0_AL */ /* usGpioLedSesWireless */
1782 +};
1783 +
1784 +
1785 +static BOARD_PARAMETERS g_bcm96348gw_10 =
1786 +{
1787 + "96348GW-10", /* szBoardId */
1788 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1789 + 0x01, /* ucPhyAddress */
1790 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1791 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1792 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1793 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1794 + BP_NOT_DEFINED, /* usGpioPhyReset */
1795 + 0x01, /* numSwitchPorts */
1796 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1797 + BP_NOT_DEFINED}, /* usReverseMii */
1798 + {BP_ENET_EXTERNAL_SWITCH, /* ucPhyType */
1799 + 0x00, /* ucPhyAddress */
1800 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1801 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1802 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1803 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1804 + BP_NOT_DEFINED, /* usGpioPhyReset */
1805 + 0x03, /* numSwitchPorts */
1806 + BP_ENET_CONFIG_SPI_SSB_1, /* usConfigType */
1807 + BP_ENET_REVERSE_MII}}, /* usReverseMii */
1808 + {{BP_VOIP_DSP, /* ucDspType */
1809 + 0x00, /* ucDspAddress */
1810 + BP_EXT_INTR_2, /* usExtIntrVoip */
1811 + BP_GPIO_6_AH, /* usGpioVoipReset */
1812 + BP_GPIO_34_AH, /* usGpioVoipIntr */
1813 + BP_NOT_DEFINED, /* usGpioLedVoip */
1814 + BP_CS_2}, /* usCsVoip */
1815 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1816 + BP_MEMORY_16MB_2_CHIP, /* usSdramSize */
1817 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1818 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1819 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1820 + BP_GPIO_33_AL, /* usGpioPressAndHoldReset */
1821 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1822 + BP_NOT_DEFINED, /* usGpioUartRts */
1823 + BP_NOT_DEFINED, /* usGpioUartCts */
1824 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1825 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
1826 + BP_NOT_DEFINED, /* usGpioLedWireless */
1827 + BP_NOT_DEFINED, /* usGpioLedUsb */
1828 + BP_NOT_DEFINED, /* usGpioLedHpna */
1829 + BP_GPIO_3_AL, /* usGpioLedWanData */
1830 + BP_GPIO_3_AL, /* usGpioLedPpp */
1831 + BP_GPIO_4_AL, /* usGpioLedPppFail */
1832 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
1833 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1834 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
1835 + BP_GPIO_1_AL, /* usGpioLedBlStop */
1836 + BP_NOT_DEFINED, /* usExtIntrWireless */
1837 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
1838 + BP_NOT_DEFINED, /* usExtIntrHpna */
1839 + BP_NOT_DEFINED, /* usCsHpna */
1840 + BP_WLAN_ANT_MAIN, /* usAntInUseWireless */
1841 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1842 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1843 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1844 +};
1845 +
1846 +static BOARD_PARAMETERS g_bcm96348gw_11 =
1847 +{
1848 + "96348GW-11", /* szBoardId */
1849 + {{BP_ENET_NO_PHY}, /* ucPhyType */
1850 + {BP_ENET_EXTERNAL_SWITCH, /* ucPhyType */
1851 + 0x00, /* ucPhyAddress */
1852 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1853 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1854 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1855 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1856 + BP_NOT_DEFINED, /* usGpioPhyReset */
1857 + 0x04, /* numSwitchPorts */
1858 + BP_ENET_CONFIG_SPI_SSB_1, /* usConfigType */
1859 + BP_ENET_REVERSE_MII}}, /* usReverseMii */
1860 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1861 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1862 + BP_MEMORY_16MB_2_CHIP, /* usSdramSize */
1863 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1864 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1865 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1866 + BP_GPIO_33_AL, /* usGpioPressAndHoldReset */
1867 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1868 + BP_NOT_DEFINED, /* usGpioUartRts */
1869 + BP_NOT_DEFINED, /* usGpioUartCts */
1870 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1871 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
1872 + BP_NOT_DEFINED, /* usGpioLedWireless */
1873 + BP_NOT_DEFINED, /* usGpioLedUsb */
1874 + BP_NOT_DEFINED, /* usGpioLedHpna */
1875 + BP_GPIO_3_AL, /* usGpioLedWanData */
1876 + BP_GPIO_3_AL, /* usGpioLedPpp */
1877 + BP_GPIO_4_AL, /* usGpioLedPppFail */
1878 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
1879 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1880 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
1881 + BP_GPIO_1_AL, /* usGpioLedBlStop */
1882 + BP_NOT_DEFINED, /* usExtIntrWireless */
1883 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
1884 + BP_NOT_DEFINED, /* usExtIntrHpna */
1885 + BP_NOT_DEFINED, /* usCsHpna */
1886 + BP_NOT_DEFINED, /* usAntInUseWireless */
1887 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1888 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1889 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1890 +};
1891 +
1892 +static BOARD_PARAMETERS g_bcm96348sv =
1893 +{
1894 + "96348SV", /* szBoardId */
1895 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1896 + 0x01, /* ucPhyAddress */
1897 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1898 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1899 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1900 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1901 + BP_NOT_DEFINED, /* usGpioPhyReset */
1902 + 0x01, /* numSwitchPorts */
1903 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1904 + BP_NOT_DEFINED}, /* usReverseMii */
1905 + {BP_ENET_EXTERNAL_PHY, /* ucPhyType */
1906 + 0x1f, /* ucPhyAddress */
1907 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1908 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1909 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1910 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1911 + BP_NOT_DEFINED, /* usGpioPhyReset */
1912 + 0x01, /* numSwitchPorts */
1913 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1914 + BP_NOT_DEFINED}}, /* usReverseMii */
1915 + {{BP_VOIP_NO_DSP}, /* ucDspType */
1916 + {BP_VOIP_NO_DSP}}, /* ucDspType */
1917 + BP_MEMORY_32MB_2_CHIP, /* usSdramSize */
1918 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1919 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1920 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1921 + BP_NOT_DEFINED, /* usGpioPressAndHoldReset */
1922 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1923 + BP_NOT_DEFINED, /* usGpioUartRts */
1924 + BP_NOT_DEFINED, /* usGpioUartCts */
1925 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1926 + BP_NOT_DEFINED, /* usGpioLedAdslFail */
1927 + BP_NOT_DEFINED, /* usGpioLedWireless */
1928 + BP_NOT_DEFINED, /* usGpioLedUsb */
1929 + BP_NOT_DEFINED, /* usGpioLedHpna */
1930 + BP_NOT_DEFINED, /* usGpioLedWanData */
1931 + BP_NOT_DEFINED, /* usGpioLedPpp */
1932 + BP_NOT_DEFINED, /* usGpioLedPppFail */
1933 + BP_NOT_DEFINED, /* usGpioLedBlPowerOn */
1934 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
1935 + BP_NOT_DEFINED, /* usGpioLedBlResetCfg */
1936 + BP_NOT_DEFINED, /* usGpioLedBlStop */
1937 + BP_NOT_DEFINED, /* usExtIntrWireless */
1938 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
1939 + BP_NOT_DEFINED, /* usExtIntrHpna */
1940 + BP_NOT_DEFINED, /* usCsHpna */
1941 + BP_NOT_DEFINED, /* usAntInUseWireless */
1942 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
1943 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
1944 + BP_NOT_DEFINED /* usGpioLedSesWireless */
1945 +};
1946 +
1947 +
1948 +static BOARD_PARAMETERS g_bcm96348gw_dualDsp =
1949 +{
1950 + "96348GW-DualDSP", /* szBoardId */
1951 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
1952 + 0x01, /* ucPhyAddress */
1953 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1954 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1955 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1956 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1957 + BP_NOT_DEFINED, /* usGpioPhyReset */
1958 + 0x01, /* numSwitchPorts */
1959 + BP_ENET_CONFIG_MDIO, /* usConfigType */
1960 + BP_NOT_DEFINED}, /* usReverseMii */
1961 + {BP_ENET_EXTERNAL_SWITCH, /* ucPhyType */
1962 + 0x00, /* ucPhyAddress */
1963 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
1964 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
1965 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
1966 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
1967 + BP_NOT_DEFINED, /* usGpioPhyReset */
1968 + 0x03, /* numSwitchPorts */
1969 + BP_ENET_CONFIG_SPI_SSB_1, /* usConfigType */
1970 + BP_ENET_REVERSE_MII}}, /* usReverseMii */
1971 + {{BP_VOIP_DSP, /* ucDspType */
1972 + 0x00, /* ucDspAddress */
1973 + BP_EXT_INTR_2, /* usExtIntrVoip */
1974 + BP_UNEQUIPPED, /* usGpioVoipReset */
1975 + BP_GPIO_34_AH, /* usGpioVoipIntr */
1976 + BP_NOT_DEFINED, /* usGpioLedVoip */
1977 + BP_CS_2}, /* usCsVoip */
1978 + {BP_VOIP_DSP, /* ucDspType */
1979 + 0x01, /* ucDspAddress */
1980 + BP_EXT_INTR_3, /* usExtIntrVoip */
1981 + BP_UNEQUIPPED , /* usGpioVoipReset */
1982 + BP_GPIO_35_AH, /* usGpioVoipIntr */
1983 + BP_NOT_DEFINED, /* usGpioLedVoip */
1984 + BP_CS_3}}, /* usCsVoip */
1985 + BP_MEMORY_16MB_2_CHIP, /* usSdramSize */
1986 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
1987 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
1988 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
1989 + BP_GPIO_33_AL, /* usGpioPressAndHoldReset */
1990 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
1991 + BP_NOT_DEFINED, /* usGpioUartRts */
1992 + BP_NOT_DEFINED, /* usGpioUartCts */
1993 + BP_NOT_DEFINED, /* usGpioLedAdsl */
1994 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
1995 + BP_NOT_DEFINED, /* usGpioLedWireless */
1996 + BP_NOT_DEFINED, /* usGpioLedUsb */
1997 + BP_NOT_DEFINED, /* usGpioLedHpna */
1998 + BP_GPIO_3_AL, /* usGpioLedWanData */
1999 + BP_GPIO_3_AL, /* usGpioLedPpp */
2000 + BP_GPIO_4_AL, /* usGpioLedPppFail */
2001 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
2002 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
2003 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
2004 + BP_GPIO_1_AL, /* usGpioLedBlStop */
2005 + BP_NOT_DEFINED, /* usExtIntrWireless */
2006 + BP_HW_DEFINED, /* usExtIntrAdslDyingGasp */
2007 + BP_NOT_DEFINED, /* usExtIntrHpna */
2008 + BP_NOT_DEFINED, /* usCsHpna */
2009 + BP_WLAN_ANT_MAIN, /* usAntInUseWireless */
2010 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
2011 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
2012 + BP_NOT_DEFINED /* usGpioLedSesWireless */
2013 +};
2014 +
2015 +
2016 +static BOARD_PARAMETERS g_bcmCustom_01 =
2017 +{
2018 + "BCMCUST_01", /* szBoardId */
2019 + {{BP_ENET_INTERNAL_PHY, /* ucPhyType */
2020 + 0x01, /* ucPhyAddress */
2021 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
2022 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
2023 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
2024 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
2025 + BP_NOT_DEFINED, /* usGpioPhyReset */
2026 + 0x01, /* numSwitchPorts */
2027 + BP_ENET_CONFIG_MDIO, /* usConfigType */
2028 + BP_NOT_DEFINED}, /* usReverseMii */
2029 + {BP_ENET_NO_PHY, /* ucPhyType */
2030 + 0x00, /* ucPhyAddress */
2031 + BP_NOT_DEFINED, /* usGpioPhySpiSck */
2032 + BP_NOT_DEFINED, /* usGpioPhySpiSs */
2033 + BP_NOT_DEFINED, /* usGpioPhySpiMosi */
2034 + BP_NOT_DEFINED, /* usGpioPhySpiMiso */
2035 + BP_NOT_DEFINED, /* usGpioPhyReset */
2036 + 0x01, /* numSwitchPorts */
2037 + BP_ENET_CONFIG_SPI_SSB_1, /* usConfigType */
2038 + BP_ENET_REVERSE_MII}}, /* usReverseMii */
2039 + {{BP_VOIP_DSP, /* ucDspType */
2040 + 0x00, /* ucDspAddress */
2041 + BP_EXT_INTR_2, /* usExtIntrVoip */
2042 + BP_GPIO_36_AH, /* usGpioVoipReset */
2043 + BP_GPIO_34_AL, /* usGpioVoipIntr */
2044 + BP_NOT_DEFINED, /* usGpioLedVoip */
2045 + BP_CS_2}, /* usCsVoip */
2046 + {BP_VOIP_NO_DSP}}, /* ucDspType */
2047 + BP_MEMORY_16MB_2_CHIP, /* usSdramSize */
2048 + BP_PSI_DEFAULT_SIZE, /* usPsiSize */
2049 + BP_NOT_DEFINED, /* usGpioRj11InnerPair */
2050 + BP_NOT_DEFINED, /* usGpioRj11OuterPair */
2051 + BP_GPIO_33_AL, /* usGpioPressAndHoldReset */
2052 + BP_NOT_DEFINED, /* usGpioPcmciaReset */
2053 + BP_NOT_DEFINED, /* usGpioUartRts */
2054 + BP_NOT_DEFINED, /* usGpioUartCts */
2055 + BP_NOT_DEFINED, /* usGpioLedAdsl */
2056 + BP_GPIO_2_AL, /* usGpioLedAdslFail */
2057 + BP_NOT_DEFINED, /* usGpioLedWireless */
2058 + BP_NOT_DEFINED, /* usGpioLedUsb */
2059 + BP_NOT_DEFINED, /* usGpioLedHpna */
2060 + BP_GPIO_3_AL, /* usGpioLedWanData */
2061 + BP_GPIO_3_AL, /* usGpioLedPpp */
2062 + BP_GPIO_4_AL, /* usGpioLedPppFail */
2063 + BP_GPIO_0_AL, /* usGpioLedBlPowerOn */
2064 + BP_NOT_DEFINED, /* usGpioLedBlAlarm */
2065 + BP_GPIO_3_AL, /* usGpioLedBlResetCfg */
2066 + BP_GPIO_1_AL, /* usGpioLedBlStop */
2067 + BP_NOT_DEFINED, /* usExtIntrWireless */
2068 + BP_NOT_DEFINED, /* usExtIntrAdslDyingGasp */
2069 + BP_NOT_DEFINED, /* usExtIntrHpna */
2070 + BP_NOT_DEFINED, /* usCsHpna */
2071 + BP_NOT_DEFINED, /* usAntInUseWireless */
2072 + BP_NOT_DEFINED, /* usGpioSesBtnWireless */
2073 + BP_NOT_DEFINED, /* usExtIntrSesBtnWireless */
2074 + BP_NOT_DEFINED /* usGpioLedSesWireless */
2075 +};
2076 +
2077 +static PBOARD_PARAMETERS g_BoardParms[] =
2078 + {&g_bcm96348r, &g_bcm96348lv, &g_bcm96348gw, &g_bcm96348gw_10,
2079 + &g_bcm96348gw_11, &g_bcm96348sv, &g_bcm96348gw_dualDsp,
2080 + &g_bcmCustom_01, 0};
2081 +#endif
2082 +
2083 +static PBOARD_PARAMETERS g_pCurrentBp = 0;
2084 +
2085 +/**************************************************************************
2086 + * Name : bpstrcmp
2087 + *
2088 + * Description: String compare for this file so it does not depend on an OS.
2089 + * (Linux kernel and CFE share this source file.)
2090 + *
2091 + * Parameters : [IN] dest - destination string
2092 + * [IN] src - source string
2093 + *
2094 + * Returns : -1 - dest < src, 1 - dest > src, 0 dest == src
2095 + ***************************************************************************/
2096 +static int bpstrcmp(const char *dest,const char *src);
2097 +static int bpstrcmp(const char *dest,const char *src)
2098 +{
2099 + while (*src && *dest)
2100 + {
2101 + if (*dest < *src) return -1;
2102 + if (*dest > *src) return 1;
2103 + dest++;
2104 + src++;
2105 + }
2106 +
2107 + if (*dest && !*src) return 1;
2108 + if (!*dest && *src) return -1;
2109 + return 0;
2110 +} /* bpstrcmp */
2111 +
2112 +/**************************************************************************
2113 + * Name : BpGetVoipDspConfig
2114 + *
2115 + * Description: Gets the DSP configuration from the board parameter
2116 + * structure for a given DSP index.
2117 + *
2118 + * Parameters : [IN] dspNum - DSP index (number)
2119 + *
2120 + * Returns : Pointer to DSP configuration block if found/valid, NULL
2121 + * otherwise.
2122 + ***************************************************************************/
2123 +VOIP_DSP_INFO *BpGetVoipDspConfig( unsigned char dspNum );
2124 +VOIP_DSP_INFO *BpGetVoipDspConfig( unsigned char dspNum )
2125 +{
2126 + VOIP_DSP_INFO *pDspConfig = 0;
2127 + int i;
2128 +
2129 + if( g_pCurrentBp )
2130 + {
2131 + for( i = 0 ; i < BP_MAX_VOIP_DSP ; i++ )
2132 + {
2133 + if( g_pCurrentBp->VoIPDspInfo[i].ucDspType != BP_VOIP_NO_DSP &&
2134 + g_pCurrentBp->VoIPDspInfo[i].ucDspAddress == dspNum )
2135 + {
2136 + pDspConfig = &g_pCurrentBp->VoIPDspInfo[i];
2137 + break;
2138 + }
2139 + }
2140 + }
2141 +
2142 + return pDspConfig;
2143 +}
2144 +
2145 +
2146 +/**************************************************************************
2147 + * Name : BpSetBoardId
2148 + *
2149 + * Description: This function find the BOARD_PARAMETERS structure for the
2150 + * specified board id string and assigns it to a global, static
2151 + * variable.
2152 + *
2153 + * Parameters : [IN] pszBoardId - Board id string that is saved into NVRAM.
2154 + *
2155 + * Returns : BP_SUCCESS - Success, value is returned.
2156 + * BP_BOARD_ID_NOT_FOUND - Error, board id input string does not
2157 + * have a board parameters configuration record.
2158 + ***************************************************************************/
2159 +int BpSetBoardId( char *pszBoardId )
2160 +{
2161 + int nRet = BP_BOARD_ID_NOT_FOUND;
2162 + PBOARD_PARAMETERS *ppBp;
2163 +
2164 + for( ppBp = g_BoardParms; *ppBp; ppBp++ )
2165 + {
2166 + if( !bpstrcmp((*ppBp)->szBoardId, pszBoardId) )
2167 + {
2168 + g_pCurrentBp = *ppBp;
2169 + nRet = BP_SUCCESS;
2170 + break;
2171 + }
2172 + }
2173 +
2174 + return( nRet );
2175 +} /* BpSetBoardId */
2176 +
2177 +/**************************************************************************
2178 + * Name : BpGetBoardIds
2179 + *
2180 + * Description: This function returns all of the supported board id strings.
2181 + *
2182 + * Parameters : [OUT] pszBoardIds - Address of a buffer that the board id
2183 + * strings are returned in. Each id starts at BP_BOARD_ID_LEN
2184 + * boundary.
2185 + * [IN] nBoardIdsSize - Number of BP_BOARD_ID_LEN elements that
2186 + * were allocated in pszBoardIds.
2187 + *
2188 + * Returns : Number of board id strings returned.
2189 + ***************************************************************************/
2190 +int BpGetBoardIds( char *pszBoardIds, int nBoardIdsSize )
2191 +{
2192 + PBOARD_PARAMETERS *ppBp;
2193 + int i;
2194 + char *src;
2195 + char *dest;
2196 +
2197 + for( i = 0, ppBp = g_BoardParms; *ppBp && nBoardIdsSize;
2198 + i++, ppBp++, nBoardIdsSize--, pszBoardIds += BP_BOARD_ID_LEN )
2199 + {
2200 + dest = pszBoardIds;
2201 + src = (*ppBp)->szBoardId;
2202 + while( *src )
2203 + *dest++ = *src++;
2204 + *dest = '\0';
2205 + }
2206 +
2207 + return( i );
2208 +} /* BpGetBoardIds */
2209 +
2210 +/**************************************************************************
2211 + * Name : BpGetEthernetMacInfo
2212 + *
2213 + * Description: This function returns all of the supported board id strings.
2214 + *
2215 + * Parameters : [OUT] pEnetInfos - Address of an array of ETHERNET_MAC_INFO
2216 + * buffers.
2217 + * [IN] nNumEnetInfos - Number of ETHERNET_MAC_INFO elements that
2218 + * are pointed to by pEnetInfos.
2219 + *
2220 + * Returns : BP_SUCCESS - Success, value is returned.
2221 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2222 + ***************************************************************************/
2223 +int BpGetEthernetMacInfo( PETHERNET_MAC_INFO pEnetInfos, int nNumEnetInfos )
2224 +{
2225 + int i, nRet;
2226 +
2227 + if( g_pCurrentBp )
2228 + {
2229 + for( i = 0; i < nNumEnetInfos; i++, pEnetInfos++ )
2230 + {
2231 + if( i < BP_MAX_ENET_MACS )
2232 + {
2233 + unsigned char *src = (unsigned char *)
2234 + &g_pCurrentBp->EnetMacInfos[i];
2235 + unsigned char *dest = (unsigned char *) pEnetInfos;
2236 + int len = sizeof(ETHERNET_MAC_INFO);
2237 + while( len-- )
2238 + *dest++ = *src++;
2239 + }
2240 + else
2241 + pEnetInfos->ucPhyType = BP_ENET_NO_PHY;
2242 + }
2243 +
2244 + nRet = BP_SUCCESS;
2245 + }
2246 + else
2247 + {
2248 + for( i = 0; i < nNumEnetInfos; i++, pEnetInfos++ )
2249 + pEnetInfos->ucPhyType = BP_ENET_NO_PHY;
2250 +
2251 + nRet = BP_BOARD_ID_NOT_SET;
2252 + }
2253 +
2254 + return( nRet );
2255 +} /* BpGetEthernetMacInfo */
2256 +
2257 +/**************************************************************************
2258 + * Name : BpGetSdramSize
2259 + *
2260 + * Description: This function returns a constant that describees the board's
2261 + * SDRAM type and size.
2262 + *
2263 + * Parameters : [OUT] pulSdramSize - Address of short word that the SDRAM size
2264 + * is returned in.
2265 + *
2266 + * Returns : BP_SUCCESS - Success, value is returned.
2267 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2268 + ***************************************************************************/
2269 +int BpGetSdramSize( unsigned long *pulSdramSize )
2270 +{
2271 + int nRet;
2272 +
2273 + if( g_pCurrentBp )
2274 + {
2275 + *pulSdramSize = g_pCurrentBp->usSdramSize;
2276 + nRet = BP_SUCCESS;
2277 + }
2278 + else
2279 + {
2280 + *pulSdramSize = BP_NOT_DEFINED;
2281 + nRet = BP_BOARD_ID_NOT_SET;
2282 + }
2283 +
2284 + return( nRet );
2285 +} /* BpGetSdramSize */
2286 +
2287 +/**************************************************************************
2288 + * Name : BpGetPsiSize
2289 + *
2290 + * Description: This function returns the persistent storage size in K bytes.
2291 + *
2292 + * Parameters : [OUT] pulPsiSize - Address of short word that the persistent
2293 + * storage size is returned in.
2294 + *
2295 + * Returns : BP_SUCCESS - Success, value is returned.
2296 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2297 + ***************************************************************************/
2298 +int BpGetPsiSize( unsigned long *pulPsiSize )
2299 +{
2300 + int nRet;
2301 +
2302 + if( g_pCurrentBp )
2303 + {
2304 + *pulPsiSize = g_pCurrentBp->usPsiSize;
2305 + nRet = BP_SUCCESS;
2306 + }
2307 + else
2308 + {
2309 + *pulPsiSize = BP_NOT_DEFINED;
2310 + nRet = BP_BOARD_ID_NOT_SET;
2311 + }
2312 +
2313 + return( nRet );
2314 +} /* BpGetPsiSize */
2315 +
2316 +/**************************************************************************
2317 + * Name : BpGetRj11InnerOuterPairGpios
2318 + *
2319 + * Description: This function returns the GPIO pin assignments for changing
2320 + * between the RJ11 inner pair and RJ11 outer pair.
2321 + *
2322 + * Parameters : [OUT] pusInner - Address of short word that the RJ11 inner pair
2323 + * GPIO pin is returned in.
2324 + * [OUT] pusOuter - Address of short word that the RJ11 outer pair
2325 + * GPIO pin is returned in.
2326 + *
2327 + * Returns : BP_SUCCESS - Success, values are returned.
2328 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2329 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2330 + * for the board.
2331 + ***************************************************************************/
2332 +int BpGetRj11InnerOuterPairGpios( unsigned short *pusInner,
2333 + unsigned short *pusOuter )
2334 +{
2335 + int nRet;
2336 +
2337 + if( g_pCurrentBp )
2338 + {
2339 + *pusInner = g_pCurrentBp->usGpioRj11InnerPair;
2340 + *pusOuter = g_pCurrentBp->usGpioRj11OuterPair;
2341 +
2342 + if( g_pCurrentBp->usGpioRj11InnerPair != BP_NOT_DEFINED &&
2343 + g_pCurrentBp->usGpioRj11OuterPair != BP_NOT_DEFINED )
2344 + {
2345 + nRet = BP_SUCCESS;
2346 + }
2347 + else
2348 + {
2349 + nRet = BP_VALUE_NOT_DEFINED;
2350 + }
2351 + }
2352 + else
2353 + {
2354 + *pusInner = *pusOuter = BP_NOT_DEFINED;
2355 + nRet = BP_BOARD_ID_NOT_SET;
2356 + }
2357 +
2358 + return( nRet );
2359 +} /* BpGetRj11InnerOuterPairGpios */
2360 +
2361 +/**************************************************************************
2362 + * Name : BpGetPressAndHoldResetGpio
2363 + *
2364 + * Description: This function returns the GPIO pin assignment for the press
2365 + * and hold reset button.
2366 + *
2367 + * Parameters : [OUT] pusValue - Address of short word that the press and hold
2368 + * reset button GPIO pin is returned in.
2369 + *
2370 + * Returns : BP_SUCCESS - Success, value is returned.
2371 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2372 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2373 + * for the board.
2374 + ***************************************************************************/
2375 +int BpGetPressAndHoldResetGpio( unsigned short *pusValue )
2376 +{
2377 + int nRet;
2378 +
2379 + if( g_pCurrentBp )
2380 + {
2381 + *pusValue = g_pCurrentBp->usGpioPressAndHoldReset;
2382 +
2383 + if( g_pCurrentBp->usGpioPressAndHoldReset != BP_NOT_DEFINED )
2384 + {
2385 + nRet = BP_SUCCESS;
2386 + }
2387 + else
2388 + {
2389 + nRet = BP_VALUE_NOT_DEFINED;
2390 + }
2391 + }
2392 + else
2393 + {
2394 + *pusValue = BP_NOT_DEFINED;
2395 + nRet = BP_BOARD_ID_NOT_SET;
2396 + }
2397 +
2398 + return( nRet );
2399 +} /* BpGetPressAndHoldResetGpio */
2400 +
2401 +/**************************************************************************
2402 + * Name : BpGetVoipResetGpio
2403 + *
2404 + * Description: This function returns the GPIO pin assignment for the VOIP
2405 + * Reset operation.
2406 + *
2407 + * Parameters : [OUT] pusValue - Address of short word that the VOIP reset
2408 + * GPIO pin is returned in.
2409 + * [IN] dspNum - Address of the DSP to query.
2410 + *
2411 + * Returns : BP_SUCCESS - Success, value is returned.
2412 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2413 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2414 + * for the board.
2415 + ***************************************************************************/
2416 +int BpGetVoipResetGpio( unsigned char dspNum, unsigned short *pusValue )
2417 +{
2418 + int nRet;
2419 +
2420 + if( g_pCurrentBp )
2421 + {
2422 + VOIP_DSP_INFO *pDspInfo = BpGetVoipDspConfig( dspNum );
2423 +
2424 + if( pDspInfo )
2425 + {
2426 + *pusValue = pDspInfo->usGpioVoipReset;
2427 +
2428 + if( *pusValue != BP_NOT_DEFINED ||
2429 + *pusValue == BP_UNEQUIPPED )
2430 + {
2431 + nRet = BP_SUCCESS;
2432 + }
2433 + else
2434 + {
2435 + nRet = BP_VALUE_NOT_DEFINED;
2436 + }
2437 + }
2438 + else
2439 + {
2440 + *pusValue = BP_NOT_DEFINED;
2441 + nRet = BP_BOARD_ID_NOT_FOUND;
2442 + }
2443 + }
2444 + else
2445 + {
2446 + *pusValue = BP_NOT_DEFINED;
2447 + nRet = BP_BOARD_ID_NOT_SET;
2448 + }
2449 +
2450 + return( nRet );
2451 +} /* BpGetVoipResetGpio */
2452 +
2453 +/**************************************************************************
2454 + * Name : BpGetVoipIntrGpio
2455 + *
2456 + * Description: This function returns the GPIO pin assignment for VoIP interrupt.
2457 + *
2458 + * Parameters : [OUT] pusValue - Address of short word that the VOIP interrupt
2459 + * GPIO pin is returned in.
2460 + * [IN] dspNum - Address of the DSP to query.
2461 + *
2462 + * Returns : BP_SUCCESS - Success, value is returned.
2463 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2464 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2465 + * for the board.
2466 + ***************************************************************************/
2467 +int BpGetVoipIntrGpio( unsigned char dspNum, unsigned short *pusValue )
2468 +{
2469 + int nRet;
2470 +
2471 + if( g_pCurrentBp )
2472 + {
2473 + VOIP_DSP_INFO *pDspInfo = BpGetVoipDspConfig( dspNum );
2474 +
2475 + if( pDspInfo )
2476 + {
2477 + *pusValue = pDspInfo->usGpioVoipIntr;
2478 +
2479 + if( *pusValue != BP_NOT_DEFINED )
2480 + {
2481 + nRet = BP_SUCCESS;
2482 + }
2483 + else
2484 + {
2485 + nRet = BP_VALUE_NOT_DEFINED;
2486 + }
2487 + }
2488 + else
2489 + {
2490 + *pusValue = BP_NOT_DEFINED;
2491 + nRet = BP_BOARD_ID_NOT_FOUND;
2492 + }
2493 + }
2494 + else
2495 + {
2496 + *pusValue = BP_NOT_DEFINED;
2497 + nRet = BP_BOARD_ID_NOT_SET;
2498 + }
2499 +
2500 + return( nRet );
2501 +} /* BpGetVoipIntrGpio */
2502 +
2503 +/**************************************************************************
2504 + * Name : BpGetPcmciaResetGpio
2505 + *
2506 + * Description: This function returns the GPIO pin assignment for the PCMCIA
2507 + * Reset operation.
2508 + *
2509 + * Parameters : [OUT] pusValue - Address of short word that the PCMCIA reset
2510 + * GPIO pin is returned in.
2511 + *
2512 + * Returns : BP_SUCCESS - Success, value is returned.
2513 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2514 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2515 + * for the board.
2516 + ***************************************************************************/
2517 +int BpGetPcmciaResetGpio( unsigned short *pusValue )
2518 +{
2519 + int nRet;
2520 +
2521 + if( g_pCurrentBp )
2522 + {
2523 + *pusValue = g_pCurrentBp->usGpioPcmciaReset;
2524 +
2525 + if( g_pCurrentBp->usGpioPcmciaReset != BP_NOT_DEFINED )
2526 + {
2527 + nRet = BP_SUCCESS;
2528 + }
2529 + else
2530 + {
2531 + nRet = BP_VALUE_NOT_DEFINED;
2532 + }
2533 + }
2534 + else
2535 + {
2536 + *pusValue = BP_NOT_DEFINED;
2537 + nRet = BP_BOARD_ID_NOT_SET;
2538 + }
2539 +
2540 + return( nRet );
2541 +} /* BpGetPcmciaResetGpio */
2542 +
2543 +/**************************************************************************
2544 + * Name : BpGetUartRtsCtsGpios
2545 + *
2546 + * Description: This function returns the GPIO pin assignments for RTS and CTS
2547 + * UART signals.
2548 + *
2549 + * Parameters : [OUT] pusRts - Address of short word that the UART RTS GPIO
2550 + * pin is returned in.
2551 + * [OUT] pusCts - Address of short word that the UART CTS GPIO
2552 + * pin is returned in.
2553 + *
2554 + * Returns : BP_SUCCESS - Success, values are returned.
2555 + * BP_BOARD_ID_NOT_SET - Error, board id input string does not
2556 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2557 + * for the board.
2558 + ***************************************************************************/
2559 +int BpGetRtsCtsUartGpios( unsigned short *pusRts, unsigned short *pusCts )
2560 +{
2561 + int nRet;
2562 +
2563 + if( g_pCurrentBp )
2564 + {
2565 + *pusRts = g_pCurrentBp->usGpioUartRts;
2566 + *pusCts = g_pCurrentBp->usGpioUartCts;
2567 +
2568 + if( g_pCurrentBp->usGpioUartRts != BP_NOT_DEFINED &&
2569 + g_pCurrentBp->usGpioUartCts != BP_NOT_DEFINED )
2570 + {
2571 + nRet = BP_SUCCESS;
2572 + }
2573 + else
2574 + {
2575 + nRet = BP_VALUE_NOT_DEFINED;
2576 + }
2577 + }
2578 + else
2579 + {
2580 + *pusRts = *pusCts = BP_NOT_DEFINED;
2581 + nRet = BP_BOARD_ID_NOT_SET;
2582 + }
2583 +
2584 + return( nRet );
2585 +} /* BpGetUartRtsCtsGpios */
2586 +
2587 +/**************************************************************************
2588 + * Name : BpGetAdslLedGpio
2589 + *
2590 + * Description: This function returns the GPIO pin assignment for the ADSL
2591 + * LED.
2592 + *
2593 + * Parameters : [OUT] pusValue - Address of short word that the ADSL LED
2594 + * GPIO pin is returned in.
2595 + *
2596 + * Returns : BP_SUCCESS - Success, value is returned.
2597 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2598 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2599 + * for the board.
2600 + ***************************************************************************/
2601 +int BpGetAdslLedGpio( unsigned short *pusValue )
2602 +{
2603 + int nRet;
2604 +
2605 + if( g_pCurrentBp )
2606 + {
2607 + *pusValue = g_pCurrentBp->usGpioLedAdsl;
2608 +
2609 + if( g_pCurrentBp->usGpioLedAdsl != BP_NOT_DEFINED )
2610 + {
2611 + nRet = BP_SUCCESS;
2612 + }
2613 + else
2614 + {
2615 + nRet = BP_VALUE_NOT_DEFINED;
2616 + }
2617 + }
2618 + else
2619 + {
2620 + *pusValue = BP_NOT_DEFINED;
2621 + nRet = BP_BOARD_ID_NOT_SET;
2622 + }
2623 +
2624 + return( nRet );
2625 +} /* BpGetAdslLedGpio */
2626 +
2627 +/**************************************************************************
2628 + * Name : BpGetAdslFailLedGpio
2629 + *
2630 + * Description: This function returns the GPIO pin assignment for the ADSL
2631 + * LED that is used when there is a DSL connection failure.
2632 + *
2633 + * Parameters : [OUT] pusValue - Address of short word that the ADSL LED
2634 + * GPIO pin is returned in.
2635 + *
2636 + * Returns : BP_SUCCESS - Success, value is returned.
2637 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2638 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2639 + * for the board.
2640 + ***************************************************************************/
2641 +int BpGetAdslFailLedGpio( unsigned short *pusValue )
2642 +{
2643 + int nRet;
2644 +
2645 + if( g_pCurrentBp )
2646 + {
2647 + *pusValue = g_pCurrentBp->usGpioLedAdslFail;
2648 +
2649 + if( g_pCurrentBp->usGpioLedAdslFail != BP_NOT_DEFINED )
2650 + {
2651 + nRet = BP_SUCCESS;
2652 + }
2653 + else
2654 + {
2655 + nRet = BP_VALUE_NOT_DEFINED;
2656 + }
2657 + }
2658 + else
2659 + {
2660 + *pusValue = BP_NOT_DEFINED;
2661 + nRet = BP_BOARD_ID_NOT_SET;
2662 + }
2663 +
2664 + return( nRet );
2665 +} /* BpGetAdslFailLedGpio */
2666 +
2667 +/**************************************************************************
2668 + * Name : BpGetWirelessLedGpio
2669 + *
2670 + * Description: This function returns the GPIO pin assignment for the Wireless
2671 + * LED.
2672 + *
2673 + * Parameters : [OUT] pusValue - Address of short word that the Wireless LED
2674 + * GPIO pin is returned in.
2675 + *
2676 + * Returns : BP_SUCCESS - Success, value is returned.
2677 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2678 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2679 + * for the board.
2680 + ***************************************************************************/
2681 +int BpGetWirelessLedGpio( unsigned short *pusValue )
2682 +{
2683 + int nRet;
2684 +
2685 + if( g_pCurrentBp )
2686 + {
2687 + *pusValue = g_pCurrentBp->usGpioLedWireless;
2688 +
2689 + if( g_pCurrentBp->usGpioLedWireless != BP_NOT_DEFINED )
2690 + {
2691 + nRet = BP_SUCCESS;
2692 + }
2693 + else
2694 + {
2695 + nRet = BP_VALUE_NOT_DEFINED;
2696 + }
2697 + }
2698 + else
2699 + {
2700 + *pusValue = BP_NOT_DEFINED;
2701 + nRet = BP_BOARD_ID_NOT_SET;
2702 + }
2703 +
2704 + return( nRet );
2705 +} /* BpGetWirelessLedGpio */
2706 +
2707 +/**************************************************************************
2708 + * Name : BpGetWirelessAntInUse
2709 + *
2710 + * Description: This function returns the antennas in use for wireless
2711 + *
2712 + * Parameters : [OUT] pusValue - Address of short word that the Wireless Antenna
2713 + * is in use.
2714 + *
2715 + * Returns : BP_SUCCESS - Success, value is returned.
2716 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2717 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2718 + * for the board.
2719 + ***************************************************************************/
2720 +int BpGetWirelessAntInUse( unsigned short *pusValue )
2721 +{
2722 + int nRet;
2723 +
2724 + if( g_pCurrentBp )
2725 + {
2726 + *pusValue = g_pCurrentBp->usAntInUseWireless;
2727 +
2728 + if( g_pCurrentBp->usAntInUseWireless != BP_NOT_DEFINED )
2729 + {
2730 + nRet = BP_SUCCESS;
2731 + }
2732 + else
2733 + {
2734 + nRet = BP_VALUE_NOT_DEFINED;
2735 + }
2736 + }
2737 + else
2738 + {
2739 + *pusValue = BP_NOT_DEFINED;
2740 + nRet = BP_BOARD_ID_NOT_SET;
2741 + }
2742 +
2743 + return( nRet );
2744 +} /* BpGetWirelessAntInUse */
2745 +
2746 +/**************************************************************************
2747 + * Name : BpGetWirelessSesBtnGpio
2748 + *
2749 + * Description: This function returns the GPIO pin assignment for the Wireless
2750 + * Ses Button.
2751 + *
2752 + * Parameters : [OUT] pusValue - Address of short word that the Wireless LED
2753 + * GPIO pin is returned in.
2754 + *
2755 + * Returns : BP_SUCCESS - Success, value is returned.
2756 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2757 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2758 + * for the board.
2759 + ***************************************************************************/
2760 +int BpGetWirelessSesBtnGpio( unsigned short *pusValue )
2761 +{
2762 + int nRet;
2763 +
2764 + if( g_pCurrentBp )
2765 + {
2766 + *pusValue = g_pCurrentBp->usGpioSesBtnWireless;
2767 +
2768 + if( g_pCurrentBp->usGpioSesBtnWireless != BP_NOT_DEFINED )
2769 + {
2770 + nRet = BP_SUCCESS;
2771 + }
2772 + else
2773 + {
2774 + nRet = BP_VALUE_NOT_DEFINED;
2775 + }
2776 + }
2777 + else
2778 + {
2779 + *pusValue = BP_NOT_DEFINED;
2780 + nRet = BP_BOARD_ID_NOT_SET;
2781 + }
2782 +
2783 + return( nRet );
2784 +} /* BpGetWirelessSesBtnGpio */
2785 +
2786 +/**************************************************************************
2787 + * Name : BpGetWirelessSesExtIntr
2788 + *
2789 + * Description: This function returns the external interrupt number for the
2790 + * Wireless Ses Button.
2791 + *
2792 + * Parameters : [OUT] pusValue - Address of short word that the Wireless Ses
2793 + * external interrup is returned in.
2794 + *
2795 + * Returns : BP_SUCCESS - Success, value is returned.
2796 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2797 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2798 + * for the board.
2799 + ***************************************************************************/
2800 +int BpGetWirelessSesExtIntr( unsigned short *pusValue )
2801 +{
2802 + int nRet;
2803 +
2804 + if( g_pCurrentBp )
2805 + {
2806 + *pusValue = g_pCurrentBp->usExtIntrSesBtnWireless;
2807 +
2808 + if( g_pCurrentBp->usExtIntrSesBtnWireless != BP_NOT_DEFINED )
2809 + {
2810 + nRet = BP_SUCCESS;
2811 + }
2812 + else
2813 + {
2814 + nRet = BP_VALUE_NOT_DEFINED;
2815 + }
2816 + }
2817 + else
2818 + {
2819 + *pusValue = BP_NOT_DEFINED;
2820 + nRet = BP_BOARD_ID_NOT_SET;
2821 + }
2822 +
2823 + return( nRet );
2824 +
2825 +} /* BpGetWirelessSesExtIntr */
2826 +
2827 +/**************************************************************************
2828 + * Name : BpGetWirelessSesLedGpio
2829 + *
2830 + * Description: This function returns the GPIO pin assignment for the Wireless
2831 + * Ses Led.
2832 + *
2833 + * Parameters : [OUT] pusValue - Address of short word that the Wireless Ses
2834 + * Led GPIO pin is returned in.
2835 + *
2836 + * Returns : BP_SUCCESS - Success, value is returned.
2837 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2838 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2839 + * for the board.
2840 + ***************************************************************************/
2841 +int BpGetWirelessSesLedGpio( unsigned short *pusValue )
2842 +{
2843 + int nRet;
2844 +
2845 + if( g_pCurrentBp )
2846 + {
2847 + *pusValue = g_pCurrentBp->usGpioLedSesWireless;
2848 +
2849 + if( g_pCurrentBp->usGpioLedSesWireless != BP_NOT_DEFINED )
2850 + {
2851 + nRet = BP_SUCCESS;
2852 + }
2853 + else
2854 + {
2855 + nRet = BP_VALUE_NOT_DEFINED;
2856 + }
2857 + }
2858 + else
2859 + {
2860 + *pusValue = BP_NOT_DEFINED;
2861 + nRet = BP_BOARD_ID_NOT_SET;
2862 + }
2863 +
2864 + return( nRet );
2865 +
2866 +} /* BpGetWirelessSesLedGpio */
2867 +
2868 +/**************************************************************************
2869 + * Name : BpGetUsbLedGpio
2870 + *
2871 + * Description: This function returns the GPIO pin assignment for the USB
2872 + * LED.
2873 + *
2874 + * Parameters : [OUT] pusValue - Address of short word that the USB LED
2875 + * GPIO pin is returned in.
2876 + *
2877 + * Returns : BP_SUCCESS - Success, value is returned.
2878 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2879 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2880 + * for the board.
2881 + ***************************************************************************/
2882 +int BpGetUsbLedGpio( unsigned short *pusValue )
2883 +{
2884 + int nRet;
2885 +
2886 + if( g_pCurrentBp )
2887 + {
2888 + *pusValue = g_pCurrentBp->usGpioLedUsb;
2889 +
2890 + if( g_pCurrentBp->usGpioLedUsb != BP_NOT_DEFINED )
2891 + {
2892 + nRet = BP_SUCCESS;
2893 + }
2894 + else
2895 + {
2896 + nRet = BP_VALUE_NOT_DEFINED;
2897 + }
2898 + }
2899 + else
2900 + {
2901 + *pusValue = BP_NOT_DEFINED;
2902 + nRet = BP_BOARD_ID_NOT_SET;
2903 + }
2904 +
2905 + return( nRet );
2906 +} /* BpGetUsbLedGpio */
2907 +
2908 +/**************************************************************************
2909 + * Name : BpGetHpnaLedGpio
2910 + *
2911 + * Description: This function returns the GPIO pin assignment for the HPNA
2912 + * LED.
2913 + *
2914 + * Parameters : [OUT] pusValue - Address of short word that the HPNA LED
2915 + * GPIO pin is returned in.
2916 + *
2917 + * Returns : BP_SUCCESS - Success, value is returned.
2918 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2919 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2920 + * for the board.
2921 + ***************************************************************************/
2922 +int BpGetHpnaLedGpio( unsigned short *pusValue )
2923 +{
2924 + int nRet;
2925 +
2926 + if( g_pCurrentBp )
2927 + {
2928 + *pusValue = g_pCurrentBp->usGpioLedHpna;
2929 +
2930 + if( g_pCurrentBp->usGpioLedHpna != BP_NOT_DEFINED )
2931 + {
2932 + nRet = BP_SUCCESS;
2933 + }
2934 + else
2935 + {
2936 + nRet = BP_VALUE_NOT_DEFINED;
2937 + }
2938 + }
2939 + else
2940 + {
2941 + *pusValue = BP_NOT_DEFINED;
2942 + nRet = BP_BOARD_ID_NOT_SET;
2943 + }
2944 +
2945 + return( nRet );
2946 +} /* BpGetHpnaLedGpio */
2947 +
2948 +/**************************************************************************
2949 + * Name : BpGetWanDataLedGpio
2950 + *
2951 + * Description: This function returns the GPIO pin assignment for the WAN Data
2952 + * LED.
2953 + *
2954 + * Parameters : [OUT] pusValue - Address of short word that the WAN Data LED
2955 + * GPIO pin is returned in.
2956 + *
2957 + * Returns : BP_SUCCESS - Success, value is returned.
2958 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2959 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
2960 + * for the board.
2961 + ***************************************************************************/
2962 +int BpGetWanDataLedGpio( unsigned short *pusValue )
2963 +{
2964 + int nRet;
2965 +
2966 + if( g_pCurrentBp )
2967 + {
2968 + *pusValue = g_pCurrentBp->usGpioLedWanData;
2969 +
2970 + if( g_pCurrentBp->usGpioLedWanData != BP_NOT_DEFINED )
2971 + {
2972 + nRet = BP_SUCCESS;
2973 + }
2974 + else
2975 + {
2976 + nRet = BP_VALUE_NOT_DEFINED;
2977 + }
2978 + }
2979 + else
2980 + {
2981 + *pusValue = BP_NOT_DEFINED;
2982 + nRet = BP_BOARD_ID_NOT_SET;
2983 + }
2984 +
2985 + return( nRet );
2986 +} /* BpGetWanDataLedGpio */
2987 +
2988 +/**************************************************************************
2989 + * Name : BpGetPppLedGpio
2990 + *
2991 + * Description: This function returns the GPIO pin assignment for the PPP
2992 + * LED.
2993 + *
2994 + * Parameters : [OUT] pusValue - Address of short word that the PPP LED
2995 + * GPIO pin is returned in.
2996 + *
2997 + * Returns : BP_SUCCESS - Success, value is returned.
2998 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
2999 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3000 + * for the board.
3001 + ***************************************************************************/
3002 +int BpGetPppLedGpio( unsigned short *pusValue )
3003 +{
3004 + int nRet;
3005 +
3006 + if( g_pCurrentBp )
3007 + {
3008 + *pusValue = g_pCurrentBp->usGpioLedPpp;
3009 +
3010 + if( g_pCurrentBp->usGpioLedPpp != BP_NOT_DEFINED )
3011 + {
3012 + nRet = BP_SUCCESS;
3013 + }
3014 + else
3015 + {
3016 + nRet = BP_VALUE_NOT_DEFINED;
3017 + }
3018 + }
3019 + else
3020 + {
3021 + *pusValue = BP_NOT_DEFINED;
3022 + nRet = BP_BOARD_ID_NOT_SET;
3023 + }
3024 +
3025 + return( nRet );
3026 +} /* BpGetPppLedGpio */
3027 +
3028 +/**************************************************************************
3029 + * Name : BpGetPppFailLedGpio
3030 + *
3031 + * Description: This function returns the GPIO pin assignment for the PPP
3032 + * LED that is used when there is a PPP connection failure.
3033 + *
3034 + * Parameters : [OUT] pusValue - Address of short word that the PPP LED
3035 + * GPIO pin is returned in.
3036 + *
3037 + * Returns : BP_SUCCESS - Success, value is returned.
3038 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3039 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3040 + * for the board.
3041 + ***************************************************************************/
3042 +int BpGetPppFailLedGpio( unsigned short *pusValue )
3043 +{
3044 + int nRet;
3045 +
3046 + if( g_pCurrentBp )
3047 + {
3048 + *pusValue = g_pCurrentBp->usGpioLedPppFail;
3049 +
3050 + if( g_pCurrentBp->usGpioLedPppFail != BP_NOT_DEFINED )
3051 + {
3052 + nRet = BP_SUCCESS;
3053 + }
3054 + else
3055 + {
3056 + nRet = BP_VALUE_NOT_DEFINED;
3057 + }
3058 + }
3059 + else
3060 + {
3061 + *pusValue = BP_NOT_DEFINED;
3062 + nRet = BP_BOARD_ID_NOT_SET;
3063 + }
3064 +
3065 + return( nRet );
3066 +} /* BpGetPppFailLedGpio */
3067 +
3068 +/**************************************************************************
3069 + * Name : BpGetBootloaderPowerOnLedGpio
3070 + *
3071 + * Description: This function returns the GPIO pin assignment for the power
3072 + * on LED that is set by the bootloader.
3073 + *
3074 + * Parameters : [OUT] pusValue - Address of short word that the alarm LED
3075 + * GPIO pin is returned in.
3076 + *
3077 + * Returns : BP_SUCCESS - Success, value is returned.
3078 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3079 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3080 + * for the board.
3081 + ***************************************************************************/
3082 +int BpGetBootloaderPowerOnLedGpio( unsigned short *pusValue )
3083 +{
3084 + int nRet;
3085 +
3086 + if( g_pCurrentBp )
3087 + {
3088 + *pusValue = g_pCurrentBp->usGpioLedBlPowerOn;
3089 +
3090 + if( g_pCurrentBp->usGpioLedBlPowerOn != BP_NOT_DEFINED )
3091 + {
3092 + nRet = BP_SUCCESS;
3093 + }
3094 + else
3095 + {
3096 + nRet = BP_VALUE_NOT_DEFINED;
3097 + }
3098 + }
3099 + else
3100 + {
3101 + *pusValue = BP_NOT_DEFINED;
3102 + nRet = BP_BOARD_ID_NOT_SET;
3103 + }
3104 +
3105 + return( nRet );
3106 +} /* BpGetBootloaderPowerOn */
3107 +
3108 +/**************************************************************************
3109 + * Name : BpGetBootloaderAlarmLedGpio
3110 + *
3111 + * Description: This function returns the GPIO pin assignment for the alarm
3112 + * LED that is set by the bootloader.
3113 + *
3114 + * Parameters : [OUT] pusValue - Address of short word that the alarm LED
3115 + * GPIO pin is returned in.
3116 + *
3117 + * Returns : BP_SUCCESS - Success, value is returned.
3118 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3119 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3120 + * for the board.
3121 + ***************************************************************************/
3122 +int BpGetBootloaderAlarmLedGpio( unsigned short *pusValue )
3123 +{
3124 + int nRet;
3125 +
3126 + if( g_pCurrentBp )
3127 + {
3128 + *pusValue = g_pCurrentBp->usGpioLedBlAlarm;
3129 +
3130 + if( g_pCurrentBp->usGpioLedBlAlarm != BP_NOT_DEFINED )
3131 + {
3132 + nRet = BP_SUCCESS;
3133 + }
3134 + else
3135 + {
3136 + nRet = BP_VALUE_NOT_DEFINED;
3137 + }
3138 + }
3139 + else
3140 + {
3141 + *pusValue = BP_NOT_DEFINED;
3142 + nRet = BP_BOARD_ID_NOT_SET;
3143 + }
3144 +
3145 + return( nRet );
3146 +} /* BpGetBootloaderAlarmLedGpio */
3147 +
3148 +/**************************************************************************
3149 + * Name : BpGetBootloaderResetCfgLedGpio
3150 + *
3151 + * Description: This function returns the GPIO pin assignment for the reset
3152 + * configuration LED that is set by the bootloader.
3153 + *
3154 + * Parameters : [OUT] pusValue - Address of short word that the reset
3155 + * configuration LED GPIO pin is returned in.
3156 + *
3157 + * Returns : BP_SUCCESS - Success, value is returned.
3158 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3159 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3160 + * for the board.
3161 + ***************************************************************************/
3162 +int BpGetBootloaderResetCfgLedGpio( unsigned short *pusValue )
3163 +{
3164 + int nRet;
3165 +
3166 + if( g_pCurrentBp )
3167 + {
3168 + *pusValue = g_pCurrentBp->usGpioLedBlResetCfg;
3169 +
3170 + if( g_pCurrentBp->usGpioLedBlResetCfg != BP_NOT_DEFINED )
3171 + {
3172 + nRet = BP_SUCCESS;
3173 + }
3174 + else
3175 + {
3176 + nRet = BP_VALUE_NOT_DEFINED;
3177 + }
3178 + }
3179 + else
3180 + {
3181 + *pusValue = BP_NOT_DEFINED;
3182 + nRet = BP_BOARD_ID_NOT_SET;
3183 + }
3184 +
3185 + return( nRet );
3186 +} /* BpGetBootloaderResetCfgLedGpio */
3187 +
3188 +/**************************************************************************
3189 + * Name : BpGetBootloaderStopLedGpio
3190 + *
3191 + * Description: This function returns the GPIO pin assignment for the break
3192 + * into bootloader LED that is set by the bootloader.
3193 + *
3194 + * Parameters : [OUT] pusValue - Address of short word that the break into
3195 + * bootloader LED GPIO pin is returned in.
3196 + *
3197 + * Returns : BP_SUCCESS - Success, value is returned.
3198 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3199 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3200 + * for the board.
3201 + ***************************************************************************/
3202 +int BpGetBootloaderStopLedGpio( unsigned short *pusValue )
3203 +{
3204 + int nRet;
3205 +
3206 + if( g_pCurrentBp )
3207 + {
3208 + *pusValue = g_pCurrentBp->usGpioLedBlStop;
3209 +
3210 + if( g_pCurrentBp->usGpioLedBlStop != BP_NOT_DEFINED )
3211 + {
3212 + nRet = BP_SUCCESS;
3213 + }
3214 + else
3215 + {
3216 + nRet = BP_VALUE_NOT_DEFINED;
3217 + }
3218 + }
3219 + else
3220 + {
3221 + *pusValue = BP_NOT_DEFINED;
3222 + nRet = BP_BOARD_ID_NOT_SET;
3223 + }
3224 +
3225 + return( nRet );
3226 +} /* BpGetBootloaderStopLedGpio */
3227 +
3228 +/**************************************************************************
3229 + * Name : BpGetVoipLedGpio
3230 + *
3231 + * Description: This function returns the GPIO pin assignment for the VOIP
3232 + * LED.
3233 + *
3234 + * Parameters : [OUT] pusValue - Address of short word that the VOIP LED
3235 + * GPIO pin is returned in.
3236 + *
3237 + * Returns : BP_SUCCESS - Success, value is returned.
3238 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3239 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3240 + * for the board.
3241 + *
3242 + * Note : The VoIP structure would allow for having one LED per DSP
3243 + * however, the board initialization function assumes only one
3244 + * LED per functionality (ie one LED for VoIP). Therefore in
3245 + * order to keep this tidy and simple we do not make usage of the
3246 + * one-LED-per-DSP function. Instead, we assume that the LED for
3247 + * VoIP is unique and associated with DSP 0 (always present on
3248 + * any VoIP platform). If changing this to a LED-per-DSP function
3249 + * then one need to update the board initialization driver in
3250 + * bcmdrivers\opensource\char\board\bcm963xx\impl1
3251 + ***************************************************************************/
3252 +int BpGetVoipLedGpio( unsigned short *pusValue )
3253 +{
3254 + int nRet;
3255 +
3256 + if( g_pCurrentBp )
3257 + {
3258 + VOIP_DSP_INFO *pDspInfo = BpGetVoipDspConfig( 0 );
3259 +
3260 + if( pDspInfo )
3261 + {
3262 + *pusValue = pDspInfo->usGpioLedVoip;
3263 +
3264 + if( *pusValue != BP_NOT_DEFINED )
3265 + {
3266 + nRet = BP_SUCCESS;
3267 + }
3268 + else
3269 + {
3270 + nRet = BP_VALUE_NOT_DEFINED;
3271 + }
3272 + }
3273 + else
3274 + {
3275 + *pusValue = BP_NOT_DEFINED;
3276 + nRet = BP_BOARD_ID_NOT_FOUND;
3277 + }
3278 + }
3279 + else
3280 + {
3281 + *pusValue = BP_NOT_DEFINED;
3282 + nRet = BP_BOARD_ID_NOT_SET;
3283 + }
3284 +
3285 + return( nRet );
3286 +} /* BpGetVoipLedGpio */
3287 +
3288 +/**************************************************************************
3289 + * Name : BpGetWirelessExtIntr
3290 + *
3291 + * Description: This function returns the Wireless external interrupt number.
3292 + *
3293 + * Parameters : [OUT] pulValue - Address of short word that the wireless
3294 + * external interrupt number is returned in.
3295 + *
3296 + * Returns : BP_SUCCESS - Success, value is returned.
3297 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3298 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3299 + * for the board.
3300 + ***************************************************************************/
3301 +int BpGetWirelessExtIntr( unsigned long *pulValue )
3302 +{
3303 + int nRet;
3304 +
3305 + if( g_pCurrentBp )
3306 + {
3307 + *pulValue = g_pCurrentBp->usExtIntrWireless;
3308 +
3309 + if( g_pCurrentBp->usExtIntrWireless != BP_NOT_DEFINED )
3310 + {
3311 + nRet = BP_SUCCESS;
3312 + }
3313 + else
3314 + {
3315 + nRet = BP_VALUE_NOT_DEFINED;
3316 + }
3317 + }
3318 + else
3319 + {
3320 + *pulValue = BP_NOT_DEFINED;
3321 + nRet = BP_BOARD_ID_NOT_SET;
3322 + }
3323 +
3324 + return( nRet );
3325 +} /* BpGetWirelessExtIntr */
3326 +
3327 +/**************************************************************************
3328 + * Name : BpGetAdslDyingGaspExtIntr
3329 + *
3330 + * Description: This function returns the ADSL Dying Gasp external interrupt
3331 + * number.
3332 + *
3333 + * Parameters : [OUT] pulValue - Address of short word that the ADSL Dying Gasp
3334 + * external interrupt number is returned in.
3335 + *
3336 + * Returns : BP_SUCCESS - Success, value is returned.
3337 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3338 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3339 + * for the board.
3340 + ***************************************************************************/
3341 +int BpGetAdslDyingGaspExtIntr( unsigned long *pulValue )
3342 +{
3343 + int nRet;
3344 +
3345 + if( g_pCurrentBp )
3346 + {
3347 + *pulValue = g_pCurrentBp->usExtIntrAdslDyingGasp;
3348 +
3349 + if( g_pCurrentBp->usExtIntrAdslDyingGasp != BP_NOT_DEFINED )
3350 + {
3351 + nRet = BP_SUCCESS;
3352 + }
3353 + else
3354 + {
3355 + nRet = BP_VALUE_NOT_DEFINED;
3356 + }
3357 + }
3358 + else
3359 + {
3360 + *pulValue = BP_NOT_DEFINED;
3361 + nRet = BP_BOARD_ID_NOT_SET;
3362 + }
3363 +
3364 + return( nRet );
3365 +} /* BpGetAdslDyingGaspExtIntr */
3366 +
3367 +/**************************************************************************
3368 + * Name : BpGetVoipExtIntr
3369 + *
3370 + * Description: This function returns the VOIP external interrupt number.
3371 + *
3372 + * Parameters : [OUT] pulValue - Address of short word that the VOIP
3373 + * external interrupt number is returned in.
3374 + * [IN] dspNum - Address of the DSP to query.
3375 + *
3376 + * Returns : BP_SUCCESS - Success, value is returned.
3377 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3378 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3379 + * for the board.
3380 + ***************************************************************************/
3381 +int BpGetVoipExtIntr( unsigned char dspNum, unsigned long *pulValue )
3382 +{
3383 + int nRet;
3384 +
3385 + if( g_pCurrentBp )
3386 + {
3387 + VOIP_DSP_INFO *pDspInfo = BpGetVoipDspConfig( dspNum );
3388 +
3389 + if( pDspInfo )
3390 + {
3391 + *pulValue = pDspInfo->usExtIntrVoip;
3392 +
3393 + if( *pulValue != BP_NOT_DEFINED )
3394 + {
3395 + nRet = BP_SUCCESS;
3396 + }
3397 + else
3398 + {
3399 + nRet = BP_VALUE_NOT_DEFINED;
3400 + }
3401 + }
3402 + else
3403 + {
3404 + *pulValue = BP_NOT_DEFINED;
3405 + nRet = BP_BOARD_ID_NOT_FOUND;
3406 + }
3407 + }
3408 + else
3409 + {
3410 + *pulValue = BP_NOT_DEFINED;
3411 + nRet = BP_BOARD_ID_NOT_SET;
3412 + }
3413 +
3414 + return( nRet );
3415 +} /* BpGetVoipExtIntr */
3416 +
3417 +/**************************************************************************
3418 + * Name : BpGetHpnaExtIntr
3419 + *
3420 + * Description: This function returns the HPNA external interrupt number.
3421 + *
3422 + * Parameters : [OUT] pulValue - Address of short word that the HPNA
3423 + * external interrupt number is returned in.
3424 + *
3425 + * Returns : BP_SUCCESS - Success, value is returned.
3426 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3427 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3428 + * for the board.
3429 + ***************************************************************************/
3430 +int BpGetHpnaExtIntr( unsigned long *pulValue )
3431 +{
3432 + int nRet;
3433 +
3434 + if( g_pCurrentBp )
3435 + {
3436 + *pulValue = g_pCurrentBp->usExtIntrHpna;
3437 +
3438 + if( g_pCurrentBp->usExtIntrHpna != BP_NOT_DEFINED )
3439 + {
3440 + nRet = BP_SUCCESS;
3441 + }
3442 + else
3443 + {
3444 + nRet = BP_VALUE_NOT_DEFINED;
3445 + }
3446 + }
3447 + else
3448 + {
3449 + *pulValue = BP_NOT_DEFINED;
3450 + nRet = BP_BOARD_ID_NOT_SET;
3451 + }
3452 +
3453 + return( nRet );
3454 +} /* BpGetHpnaExtIntr */
3455 +
3456 +/**************************************************************************
3457 + * Name : BpGetHpnaChipSelect
3458 + *
3459 + * Description: This function returns the HPNA chip select number.
3460 + *
3461 + * Parameters : [OUT] pulValue - Address of short word that the HPNA
3462 + * chip select number is returned in.
3463 + *
3464 + * Returns : BP_SUCCESS - Success, value is returned.
3465 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3466 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3467 + * for the board.
3468 + ***************************************************************************/
3469 +int BpGetHpnaChipSelect( unsigned long *pulValue )
3470 +{
3471 + int nRet;
3472 +
3473 + if( g_pCurrentBp )
3474 + {
3475 + *pulValue = g_pCurrentBp->usCsHpna;
3476 +
3477 + if( g_pCurrentBp->usCsHpna != BP_NOT_DEFINED )
3478 + {
3479 + nRet = BP_SUCCESS;
3480 + }
3481 + else
3482 + {
3483 + nRet = BP_VALUE_NOT_DEFINED;
3484 + }
3485 + }
3486 + else
3487 + {
3488 + *pulValue = BP_NOT_DEFINED;
3489 + nRet = BP_BOARD_ID_NOT_SET;
3490 + }
3491 +
3492 + return( nRet );
3493 +} /* BpGetHpnaChipSelect */
3494 +
3495 +/**************************************************************************
3496 + * Name : BpGetVoipChipSelect
3497 + *
3498 + * Description: This function returns the VOIP chip select number.
3499 + *
3500 + * Parameters : [OUT] pulValue - Address of short word that the VOIP
3501 + * chip select number is returned in.
3502 + * [IN] dspNum - Address of the DSP to query.
3503 + *
3504 + * Returns : BP_SUCCESS - Success, value is returned.
3505 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3506 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3507 + * for the board.
3508 + ***************************************************************************/
3509 +int BpGetVoipChipSelect( unsigned char dspNum, unsigned long *pulValue )
3510 +{
3511 + int nRet;
3512 +
3513 + if( g_pCurrentBp )
3514 + {
3515 + VOIP_DSP_INFO *pDspInfo = BpGetVoipDspConfig( dspNum );
3516 +
3517 + if( pDspInfo )
3518 + {
3519 + *pulValue = pDspInfo->usCsVoip;
3520 +
3521 + if( *pulValue != BP_NOT_DEFINED )
3522 + {
3523 + nRet = BP_SUCCESS;
3524 + }
3525 + else
3526 + {
3527 + nRet = BP_VALUE_NOT_DEFINED;
3528 + }
3529 + }
3530 + else
3531 + {
3532 + *pulValue = BP_NOT_DEFINED;
3533 + nRet = BP_BOARD_ID_NOT_FOUND;
3534 + }
3535 + }
3536 + else
3537 + {
3538 + *pulValue = BP_NOT_DEFINED;
3539 + nRet = BP_BOARD_ID_NOT_SET;
3540 + }
3541 +
3542 + return( nRet );
3543 +} /* BpGetVoipChipSelect */
3544 +
3545 diff -urN linux.old/arch/mips/bcm963xx/boardparms.h linux.dev/arch/mips/bcm963xx/boardparms.h
3546 --- linux.old/arch/mips/bcm963xx/boardparms.h 1970-01-01 01:00:00.000000000 +0100
3547 +++ linux.dev/arch/mips/bcm963xx/boardparms.h 2006-08-25 00:39:38.000000000 +0200
3548 @@ -0,0 +1,758 @@
3549 +/*
3550 +<:copyright-gpl
3551 +
3552 + Copyright 2003 Broadcom Corp. All Rights Reserved.
3553 +
3554 + This program is free software; you can distribute it and/or modify it
3555 + under the terms of the GNU General Public License (Version 2) as
3556 + published by the Free Software Foundation.
3557 +
3558 + This program is distributed in the hope it will be useful, but WITHOUT
3559 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3560 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3561 + for more details.
3562 +
3563 + You should have received a copy of the GNU General Public License along
3564 + with this program; if not, write to the Free Software Foundation, Inc.,
3565 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
3566 +
3567 +:>
3568 +*/
3569 +/**************************************************************************
3570 + * File Name : boardparms.h
3571 + *
3572 + * Description: This file contains definitions and function prototypes for
3573 + * the BCM63xx board parameter access functions.
3574 + *
3575 + * Updates : 07/14/2003 Created.
3576 + ***************************************************************************/
3577 +
3578 +#if !defined(_BOARDPARMS_H)
3579 +#define _BOARDPARMS_H
3580 +
3581 +/* Return codes. */
3582 +#define BP_SUCCESS 0
3583 +#define BP_BOARD_ID_NOT_FOUND 1
3584 +#define BP_VALUE_NOT_DEFINED 2
3585 +#define BP_BOARD_ID_NOT_SET 3
3586 +
3587 +/* Values for BpGetSdramSize. */
3588 +#define BP_MEMORY_8MB_1_CHIP 0
3589 +#define BP_MEMORY_16MB_1_CHIP 1
3590 +#define BP_MEMORY_32MB_1_CHIP 2
3591 +#define BP_MEMORY_64MB_2_CHIP 3
3592 +#define BP_MEMORY_32MB_2_CHIP 4
3593 +#define BP_MEMORY_16MB_2_CHIP 5
3594 +
3595 +/* Values for EthernetMacInfo PhyType. */
3596 +#define BP_ENET_NO_PHY 0
3597 +#define BP_ENET_INTERNAL_PHY 1
3598 +#define BP_ENET_EXTERNAL_PHY 2
3599 +#define BP_ENET_EXTERNAL_SWITCH 3
3600 +
3601 +/* Values for EthernetMacInfo Configuration type. */
3602 +#define BP_ENET_CONFIG_MDIO 0 /* Internal PHY, External PHY, Switch+(no GPIO, no SPI, no MDIO Pseudo phy */
3603 +#define BP_ENET_CONFIG_GPIO 1 /* Bcm96345GW board + Bcm5325M/E */
3604 +#define BP_ENET_CONFIG_MDIO_PSEUDO_PHY 2 /* Bcm96348GW board + Bcm5325E */
3605 +#define BP_ENET_CONFIG_SPI_SSB_0 3 /* Bcm96348GW board + Bcm5325M/E */
3606 +#define BP_ENET_CONFIG_SPI_SSB_1 4 /* Bcm96348GW board + Bcm5325M/E */
3607 +#define BP_ENET_CONFIG_SPI_SSB_2 5 /* Bcm96348GW board + Bcm5325M/E */
3608 +#define BP_ENET_CONFIG_SPI_SSB_3 6 /* Bcm96348GW board + Bcm5325M/E */
3609 +
3610 +/* Values for EthernetMacInfo Reverse MII. */
3611 +#define BP_ENET_NO_REVERSE_MII 0
3612 +#define BP_ENET_REVERSE_MII 1
3613 +
3614 +/* Values for VoIPDSPInfo DSPType. */
3615 +#define BP_VOIP_NO_DSP 0
3616 +#define BP_VOIP_DSP 1
3617 +
3618 +
3619 +/* Values for GPIO pin assignments (AH = Active High, AL = Active Low). */
3620 +#define BP_ACTIVE_MASK 0x8000
3621 +#define BP_ACTIVE_HIGH 0x0000
3622 +#define BP_ACTIVE_LOW 0x8000
3623 +#define BP_GPIO_0_AH (0 | BP_ACTIVE_HIGH)
3624 +#define BP_GPIO_0_AL (0 | BP_ACTIVE_LOW)
3625 +#define BP_GPIO_1_AH (1 | BP_ACTIVE_HIGH)
3626 +#define BP_GPIO_1_AL (1 | BP_ACTIVE_LOW)
3627 +#define BP_GPIO_2_AH (2 | BP_ACTIVE_HIGH)
3628 +#define BP_GPIO_2_AL (2 | BP_ACTIVE_LOW)
3629 +#define BP_GPIO_3_AH (3 | BP_ACTIVE_HIGH)
3630 +#define BP_GPIO_3_AL (3 | BP_ACTIVE_LOW)
3631 +#define BP_GPIO_4_AH (4 | BP_ACTIVE_HIGH)
3632 +#define BP_GPIO_4_AL (4 | BP_ACTIVE_LOW)
3633 +#define BP_GPIO_5_AH (5 | BP_ACTIVE_HIGH)
3634 +#define BP_GPIO_5_AL (5 | BP_ACTIVE_LOW)
3635 +#define BP_GPIO_6_AH (6 | BP_ACTIVE_HIGH)
3636 +#define BP_GPIO_6_AL (6 | BP_ACTIVE_LOW)
3637 +#define BP_GPIO_7_AH (7 | BP_ACTIVE_HIGH)
3638 +#define BP_GPIO_7_AL (7 | BP_ACTIVE_LOW)
3639 +#define BP_GPIO_8_AH (8 | BP_ACTIVE_HIGH)
3640 +#define BP_GPIO_8_AL (8 | BP_ACTIVE_LOW)
3641 +#define BP_GPIO_9_AH (9 | BP_ACTIVE_HIGH)
3642 +#define BP_GPIO_9_AL (9 | BP_ACTIVE_LOW)
3643 +#define BP_GPIO_10_AH (10 | BP_ACTIVE_HIGH)
3644 +#define BP_GPIO_10_AL (10 | BP_ACTIVE_LOW)
3645 +#define BP_GPIO_11_AH (11 | BP_ACTIVE_HIGH)
3646 +#define BP_GPIO_11_AL (11 | BP_ACTIVE_LOW)
3647 +#define BP_GPIO_12_AH (12 | BP_ACTIVE_HIGH)
3648 +#define BP_GPIO_12_AL (12 | BP_ACTIVE_LOW)
3649 +#define BP_GPIO_13_AH (13 | BP_ACTIVE_HIGH)
3650 +#define BP_GPIO_13_AL (13 | BP_ACTIVE_LOW)
3651 +#define BP_GPIO_14_AH (14 | BP_ACTIVE_HIGH)
3652 +#define BP_GPIO_14_AL (14 | BP_ACTIVE_LOW)
3653 +#define BP_GPIO_15_AH (15 | BP_ACTIVE_HIGH)
3654 +#define BP_GPIO_15_AL (15 | BP_ACTIVE_LOW)
3655 +#define BP_GPIO_16_AH (16 | BP_ACTIVE_HIGH)
3656 +#define BP_GPIO_16_AL (16 | BP_ACTIVE_LOW)
3657 +#define BP_GPIO_17_AH (17 | BP_ACTIVE_HIGH)
3658 +#define BP_GPIO_17_AL (17 | BP_ACTIVE_LOW)
3659 +#define BP_GPIO_18_AH (18 | BP_ACTIVE_HIGH)
3660 +#define BP_GPIO_18_AL (18 | BP_ACTIVE_LOW)
3661 +#define BP_GPIO_19_AH (19 | BP_ACTIVE_HIGH)
3662 +#define BP_GPIO_19_AL (19 | BP_ACTIVE_LOW)
3663 +#define BP_GPIO_20_AH (20 | BP_ACTIVE_HIGH)
3664 +#define BP_GPIO_20_AL (20 | BP_ACTIVE_LOW)
3665 +#define BP_GPIO_21_AH (21 | BP_ACTIVE_HIGH)
3666 +#define BP_GPIO_21_AL (21 | BP_ACTIVE_LOW)
3667 +#define BP_GPIO_22_AH (22 | BP_ACTIVE_HIGH)
3668 +#define BP_GPIO_22_AL (22 | BP_ACTIVE_LOW)
3669 +#define BP_GPIO_23_AH (23 | BP_ACTIVE_HIGH)
3670 +#define BP_GPIO_23_AL (23 | BP_ACTIVE_LOW)
3671 +#define BP_GPIO_24_AH (24 | BP_ACTIVE_HIGH)
3672 +#define BP_GPIO_24_AL (24 | BP_ACTIVE_LOW)
3673 +#define BP_GPIO_25_AH (25 | BP_ACTIVE_HIGH)
3674 +#define BP_GPIO_25_AL (25 | BP_ACTIVE_LOW)
3675 +#define BP_GPIO_26_AH (26 | BP_ACTIVE_HIGH)
3676 +#define BP_GPIO_26_AL (26 | BP_ACTIVE_LOW)
3677 +#define BP_GPIO_27_AH (27 | BP_ACTIVE_HIGH)
3678 +#define BP_GPIO_27_AL (27 | BP_ACTIVE_LOW)
3679 +#define BP_GPIO_28_AH (28 | BP_ACTIVE_HIGH)
3680 +#define BP_GPIO_28_AL (28 | BP_ACTIVE_LOW)
3681 +#define BP_GPIO_29_AH (29 | BP_ACTIVE_HIGH)
3682 +#define BP_GPIO_29_AL (29 | BP_ACTIVE_LOW)
3683 +#define BP_GPIO_30_AH (30 | BP_ACTIVE_HIGH)
3684 +#define BP_GPIO_30_AL (30 | BP_ACTIVE_LOW)
3685 +#define BP_GPIO_31_AH (31 | BP_ACTIVE_HIGH)
3686 +#define BP_GPIO_31_AL (31 | BP_ACTIVE_LOW)
3687 +#define BP_GPIO_32_AH (32 | BP_ACTIVE_HIGH)
3688 +#define BP_GPIO_32_AL (32 | BP_ACTIVE_LOW)
3689 +#define BP_GPIO_33_AH (33 | BP_ACTIVE_HIGH)
3690 +#define BP_GPIO_33_AL (33 | BP_ACTIVE_LOW)
3691 +#define BP_GPIO_34_AH (34 | BP_ACTIVE_HIGH)
3692 +#define BP_GPIO_34_AL (34 | BP_ACTIVE_LOW)
3693 +#define BP_GPIO_35_AH (35 | BP_ACTIVE_HIGH)
3694 +#define BP_GPIO_35_AL (35 | BP_ACTIVE_LOW)
3695 +#define BP_GPIO_36_AH (36 | BP_ACTIVE_HIGH)
3696 +#define BP_GPIO_36_AL (36 | BP_ACTIVE_LOW)
3697 +
3698 +/* Values for external interrupt assignments. */
3699 +#define BP_EXT_INTR_0 0
3700 +#define BP_EXT_INTR_1 1
3701 +#define BP_EXT_INTR_2 2
3702 +#define BP_EXT_INTR_3 3
3703 +
3704 +/* Values for chip select assignments. */
3705 +#define BP_CS_0 0
3706 +#define BP_CS_1 1
3707 +#define BP_CS_2 2
3708 +#define BP_CS_3 3
3709 +
3710 +/* Value for GPIO and external interrupt fields that are not used. */
3711 +#define BP_NOT_DEFINED 0xffff
3712 +#define BP_HW_DEFINED 0xfff0
3713 +#define BP_UNEQUIPPED 0xfff1
3714 +
3715 +/* Maximum size of the board id string. */
3716 +#define BP_BOARD_ID_LEN 16
3717 +
3718 +/* Maximum number of Ethernet MACs. */
3719 +#define BP_MAX_ENET_MACS 2
3720 +
3721 +/* Maximum number of VoIP DSPs. */
3722 +#define BP_MAX_VOIP_DSP 2
3723 +
3724 +/* Wireless Antenna Settings. */
3725 +#define BP_WLAN_ANT_MAIN 0
3726 +#define BP_WLAN_ANT_AUX 1
3727 +#define BP_WLAN_ANT_BOTH 3
3728 +
3729 +#if !defined(__ASSEMBLER__)
3730 +
3731 +/* Information about an Ethernet MAC. If ucPhyType is BP_ENET_NO_PHY,
3732 + * then the other fields are not valid.
3733 + */
3734 +typedef struct EthernetMacInfo
3735 +{
3736 + unsigned char ucPhyType; /* BP_ENET_xxx */
3737 + unsigned char ucPhyAddress; /* 0 to 31 */
3738 + unsigned short usGpioPhySpiSck; /* GPIO pin or not defined */
3739 + unsigned short usGpioPhySpiSs; /* GPIO pin or not defined */
3740 + unsigned short usGpioPhySpiMosi; /* GPIO pin or not defined */
3741 + unsigned short usGpioPhySpiMiso; /* GPIO pin or not defined */
3742 + unsigned short usGpioPhyReset; /* GPIO pin or not defined (96348LV) */
3743 + unsigned short numSwitchPorts; /* Number of PHY ports */
3744 + unsigned short usConfigType; /* Configuration type */
3745 + unsigned short usReverseMii; /* Reverse MII */
3746 +} ETHERNET_MAC_INFO, *PETHERNET_MAC_INFO;
3747 +
3748 +
3749 +/* Information about VoIP DSPs. If ucDspType is BP_VOIP_NO_DSP,
3750 + * then the other fields are not valid.
3751 + */
3752 +typedef struct VoIPDspInfo
3753 +{
3754 + unsigned char ucDspType;
3755 + unsigned char ucDspAddress;
3756 + unsigned short usExtIntrVoip;
3757 + unsigned short usGpioVoipReset;
3758 + unsigned short usGpioVoipIntr;
3759 + unsigned short usGpioLedVoip;
3760 + unsigned short usCsVoip;
3761 +
3762 +} VOIP_DSP_INFO;
3763 +
3764 +
3765 +/**************************************************************************
3766 + * Name : BpSetBoardId
3767 + *
3768 + * Description: This function find the BOARD_PARAMETERS structure for the
3769 + * specified board id string and assigns it to a global, static
3770 + * variable.
3771 + *
3772 + * Parameters : [IN] pszBoardId - Board id string that is saved into NVRAM.
3773 + *
3774 + * Returns : BP_SUCCESS - Success, value is returned.
3775 + * BP_BOARD_ID_NOT_FOUND - Error, board id input string does not
3776 + * have a board parameters configuration record.
3777 + ***************************************************************************/
3778 +int BpSetBoardId( char *pszBoardId );
3779 +
3780 +/**************************************************************************
3781 + * Name : BpGetBoardIds
3782 + *
3783 + * Description: This function returns all of the supported board id strings.
3784 + *
3785 + * Parameters : [OUT] pszBoardIds - Address of a buffer that the board id
3786 + * strings are returned in. Each id starts at BP_BOARD_ID_LEN
3787 + * boundary.
3788 + * [IN] nBoardIdsSize - Number of BP_BOARD_ID_LEN elements that
3789 + * were allocated in pszBoardIds.
3790 + *
3791 + * Returns : Number of board id strings returned.
3792 + ***************************************************************************/
3793 +int BpGetBoardIds( char *pszBoardIds, int nBoardIdsSize );
3794 +
3795 +/**************************************************************************
3796 + * Name : BpGetEthernetMacInfo
3797 + *
3798 + * Description: This function returns all of the supported board id strings.
3799 + *
3800 + * Parameters : [OUT] pEnetInfos - Address of an array of ETHERNET_MAC_INFO
3801 + * buffers.
3802 + * [IN] nNumEnetInfos - Number of ETHERNET_MAC_INFO elements that
3803 + * are pointed to by pEnetInfos.
3804 + *
3805 + * Returns : BP_SUCCESS - Success, value is returned.
3806 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3807 + ***************************************************************************/
3808 +int BpGetEthernetMacInfo( PETHERNET_MAC_INFO pEnetInfos, int nNumEnetInfos );
3809 +
3810 +/**************************************************************************
3811 + * Name : BpGetSdramSize
3812 + *
3813 + * Description: This function returns a constant that describees the board's
3814 + * SDRAM type and size.
3815 + *
3816 + * Parameters : [OUT] pulSdramSize - Address of short word that the SDRAM size
3817 + * is returned in.
3818 + *
3819 + * Returns : BP_SUCCESS - Success, value is returned.
3820 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3821 + ***************************************************************************/
3822 +int BpGetSdramSize( unsigned long *pulSdramSize );
3823 +
3824 +/**************************************************************************
3825 + * Name : BpGetPsiSize
3826 + *
3827 + * Description: This function returns the persistent storage size in K bytes.
3828 + *
3829 + * Parameters : [OUT] pulPsiSize - Address of short word that the persistent
3830 + * storage size is returned in.
3831 + *
3832 + * Returns : BP_SUCCESS - Success, value is returned.
3833 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3834 + ***************************************************************************/
3835 +int BpGetPsiSize( unsigned long *pulPsiSize );
3836 +
3837 +/**************************************************************************
3838 + * Name : BpGetRj11InnerOuterPairGpios
3839 + *
3840 + * Description: This function returns the GPIO pin assignments for changing
3841 + * between the RJ11 inner pair and RJ11 outer pair.
3842 + *
3843 + * Parameters : [OUT] pusInner - Address of short word that the RJ11 inner pair
3844 + * GPIO pin is returned in.
3845 + * [OUT] pusOuter - Address of short word that the RJ11 outer pair
3846 + * GPIO pin is returned in.
3847 + *
3848 + * Returns : BP_SUCCESS - Success, values are returned.
3849 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3850 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3851 + * for the board.
3852 + ***************************************************************************/
3853 +int BpGetRj11InnerOuterPairGpios( unsigned short *pusInner,
3854 + unsigned short *pusOuter );
3855 +
3856 +/**************************************************************************
3857 + * Name : BpGetPressAndHoldResetGpio
3858 + *
3859 + * Description: This function returns the GPIO pin assignment for the press
3860 + * and hold reset button.
3861 + *
3862 + * Parameters : [OUT] pusValue - Address of short word that the press and hold
3863 + * reset button GPIO pin is returned in.
3864 + *
3865 + * Returns : BP_SUCCESS - Success, value is returned.
3866 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3867 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3868 + * for the board.
3869 + ***************************************************************************/
3870 +int BpGetPressAndHoldResetGpio( unsigned short *pusValue );
3871 +
3872 +/**************************************************************************
3873 + * Name : BpGetVoipResetGpio
3874 + *
3875 + * Description: This function returns the GPIO pin assignment for the VOIP
3876 + * Reset operation.
3877 + *
3878 + * Parameters : [OUT] pusValue - Address of short word that the VOIP reset
3879 + * GPIO pin is returned in.
3880 + * [IN] dspNum - Address of the DSP to query.
3881 + *
3882 + * Returns : BP_SUCCESS - Success, value is returned.
3883 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3884 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3885 + * for the board.
3886 + ***************************************************************************/
3887 +int BpGetVoipResetGpio( unsigned char dspNum, unsigned short *pusValue );
3888 +
3889 +/**************************************************************************
3890 + * Name : BpGetVoipIntrGpio
3891 + *
3892 + * Description: This function returns the GPIO pin assignment for VoIP interrupt.
3893 + *
3894 + * Parameters : [OUT] pusValue - Address of short word that the VOIP interrupt
3895 + * GPIO pin is returned in.
3896 + * [IN] dspNum - Address of the DSP to query.
3897 + *
3898 + * Returns : BP_SUCCESS - Success, value is returned.
3899 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3900 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3901 + * for the board.
3902 + ***************************************************************************/
3903 +int BpGetVoipIntrGpio( unsigned char dspNum, unsigned short *pusValue );
3904 +
3905 +/**************************************************************************
3906 + * Name : BpGetPcmciaResetGpio
3907 + *
3908 + * Description: This function returns the GPIO pin assignment for the PCMCIA
3909 + * Reset operation.
3910 + *
3911 + * Parameters : [OUT] pusValue - Address of short word that the PCMCIA reset
3912 + * GPIO pin is returned in.
3913 + *
3914 + * Returns : BP_SUCCESS - Success, value is returned.
3915 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3916 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3917 + * for the board.
3918 + ***************************************************************************/
3919 +int BpGetPcmciaResetGpio( unsigned short *pusValue );
3920 +
3921 +/**************************************************************************
3922 + * Name : BpGetUartRtsCtsGpios
3923 + *
3924 + * Description: This function returns the GPIO pin assignments for RTS and CTS
3925 + * UART signals.
3926 + *
3927 + * Parameters : [OUT] pusRts - Address of short word that the UART RTS GPIO
3928 + * pin is returned in.
3929 + * [OUT] pusCts - Address of short word that the UART CTS GPIO
3930 + * pin is returned in.
3931 + *
3932 + * Returns : BP_SUCCESS - Success, values are returned.
3933 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3934 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3935 + * for the board.
3936 + ***************************************************************************/
3937 +int BpGetRtsCtsUartGpios( unsigned short *pusRts, unsigned short *pusCts );
3938 +
3939 +/**************************************************************************
3940 + * Name : BpGetAdslLedGpio
3941 + *
3942 + * Description: This function returns the GPIO pin assignment for the ADSL
3943 + * LED.
3944 + *
3945 + * Parameters : [OUT] pusValue - Address of short word that the ADSL LED
3946 + * GPIO pin is returned in.
3947 + *
3948 + * Returns : BP_SUCCESS - Success, value is returned.
3949 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3950 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3951 + * for the board.
3952 + ***************************************************************************/
3953 +int BpGetAdslLedGpio( unsigned short *pusValue );
3954 +
3955 +/**************************************************************************
3956 + * Name : BpGetAdslFailLedGpio
3957 + *
3958 + * Description: This function returns the GPIO pin assignment for the ADSL
3959 + * LED that is used when there is a DSL connection failure.
3960 + *
3961 + * Parameters : [OUT] pusValue - Address of short word that the ADSL LED
3962 + * GPIO pin is returned in.
3963 + *
3964 + * Returns : BP_SUCCESS - Success, value is returned.
3965 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3966 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3967 + * for the board.
3968 + ***************************************************************************/
3969 +int BpGetAdslFailLedGpio( unsigned short *pusValue );
3970 +
3971 +/**************************************************************************
3972 + * Name : BpGetWirelessLedGpio
3973 + *
3974 + * Description: This function returns the GPIO pin assignment for the Wireless
3975 + * LED.
3976 + *
3977 + * Parameters : [OUT] pusValue - Address of short word that the Wireless LED
3978 + * GPIO pin is returned in.
3979 + *
3980 + * Returns : BP_SUCCESS - Success, value is returned.
3981 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3982 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3983 + * for the board.
3984 + ***************************************************************************/
3985 +int BpGetWirelessLedGpio( unsigned short *pusValue );
3986 +
3987 +/**************************************************************************
3988 + * Name : BpGetWirelessAntInUse
3989 + *
3990 + * Description: This function returns the antennas in use for wireless
3991 + *
3992 + * Parameters : [OUT] pusValue - Address of short word that the Wireless Antenna
3993 + * is in use.
3994 + *
3995 + * Returns : BP_SUCCESS - Success, value is returned.
3996 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
3997 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
3998 + * for the board.
3999 + ***************************************************************************/
4000 +int BpGetWirelessAntInUse( unsigned short *pusValue );
4001 +
4002 +/**************************************************************************
4003 + * Name : BpGetWirelessSesBtnGpio
4004 + *
4005 + * Description: This function returns the GPIO pin assignment for the Wireless
4006 + * Ses Button.
4007 + *
4008 + * Parameters : [OUT] pusValue - Address of short word that the Wireless Ses
4009 + * Button GPIO pin is returned in.
4010 + *
4011 + * Returns : BP_SUCCESS - Success, value is returned.
4012 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4013 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4014 + * for the board.
4015 + ***************************************************************************/
4016 +int BpGetWirelessSesBtnGpio( unsigned short *pusValue );
4017 +
4018 +/**************************************************************************
4019 + * Name : BpGetWirelessSesExtIntr
4020 + *
4021 + * Description: This function returns the external interrupt number for the
4022 + * Wireless Ses Button.
4023 + *
4024 + * Parameters : [OUT] pusValue - Address of short word that the Wireless Ses
4025 + * external interrup is returned in.
4026 + *
4027 + * Returns : BP_SUCCESS - Success, value is returned.
4028 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4029 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4030 + * for the board.
4031 + ***************************************************************************/
4032 +int BpGetWirelessSesExtIntr( unsigned short *pusValue );
4033 +
4034 +/**************************************************************************
4035 + * Name : BpGetWirelessSesLedGpio
4036 + *
4037 + * Description: This function returns the GPIO pin assignment for the Wireless
4038 + * Ses Led.
4039 + *
4040 + * Parameters : [OUT] pusValue - Address of short word that the Wireless Ses
4041 + * Led GPIO pin is returned in.
4042 + *
4043 + * Returns : BP_SUCCESS - Success, value is returned.
4044 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4045 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4046 + * for the board.
4047 + ***************************************************************************/
4048 +int BpGetWirelessSesLedGpio( unsigned short *pusValue );
4049 +
4050 +/**************************************************************************
4051 + * Name : BpGetUsbLedGpio
4052 + *
4053 + * Description: This function returns the GPIO pin assignment for the USB
4054 + * LED.
4055 + *
4056 + * Parameters : [OUT] pusValue - Address of short word that the USB LED
4057 + * GPIO pin is returned in.
4058 + *
4059 + * Returns : BP_SUCCESS - Success, value is returned.
4060 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4061 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4062 + * for the board.
4063 + ***************************************************************************/
4064 +int BpGetUsbLedGpio( unsigned short *pusValue );
4065 +
4066 +/**************************************************************************
4067 + * Name : BpGetHpnaLedGpio
4068 + *
4069 + * Description: This function returns the GPIO pin assignment for the HPNA
4070 + * LED.
4071 + *
4072 + * Parameters : [OUT] pusValue - Address of short word that the HPNA LED
4073 + * GPIO pin is returned in.
4074 + *
4075 + * Returns : BP_SUCCESS - Success, value is returned.
4076 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4077 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4078 + * for the board.
4079 + ***************************************************************************/
4080 +int BpGetHpnaLedGpio( unsigned short *pusValue );
4081 +
4082 +/**************************************************************************
4083 + * Name : BpGetWanDataLedGpio
4084 + *
4085 + * Description: This function returns the GPIO pin assignment for the WAN Data
4086 + * LED.
4087 + *
4088 + * Parameters : [OUT] pusValue - Address of short word that the WAN Data LED
4089 + * GPIO pin is returned in.
4090 + *
4091 + * Returns : BP_SUCCESS - Success, value is returned.
4092 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4093 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4094 + * for the board.
4095 + ***************************************************************************/
4096 +int BpGetWanDataLedGpio( unsigned short *pusValue );
4097 +
4098 +/**************************************************************************
4099 + * Name : BpGetPppLedGpio
4100 + *
4101 + * Description: This function returns the GPIO pin assignment for the PPP
4102 + * LED.
4103 + *
4104 + * Parameters : [OUT] pusValue - Address of short word that the PPP LED
4105 + * GPIO pin is returned in.
4106 + *
4107 + * Returns : BP_SUCCESS - Success, value is returned.
4108 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4109 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4110 + * for the board.
4111 + ***************************************************************************/
4112 +int BpGetPppLedGpio( unsigned short *pusValue );
4113 +
4114 +/**************************************************************************
4115 + * Name : BpGetPppFailLedGpio
4116 + *
4117 + * Description: This function returns the GPIO pin assignment for the PPP
4118 + * LED that is used when there is a PPP connection failure.
4119 + *
4120 + * Parameters : [OUT] pusValue - Address of short word that the PPP LED
4121 + * GPIO pin is returned in.
4122 + *
4123 + * Returns : BP_SUCCESS - Success, value is returned.
4124 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4125 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4126 + * for the board.
4127 + ***************************************************************************/
4128 +int BpGetPppFailLedGpio( unsigned short *pusValue );
4129 +
4130 +/**************************************************************************
4131 + * Name : BpGetVoipLedGpio
4132 + *
4133 + * Description: This function returns the GPIO pin assignment for the VOIP
4134 + * LED.
4135 + *
4136 + * Parameters : [OUT] pusValue - Address of short word that the VOIP LED
4137 + * GPIO pin is returned in.
4138 + *
4139 + * Returns : BP_SUCCESS - Success, value is returned.
4140 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4141 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4142 + * for the board.
4143 + ***************************************************************************/
4144 +int BpGetVoipLedGpio( unsigned short *pusValue );
4145 +
4146 +/**************************************************************************
4147 + * Name : BpGetBootloaderPowerOnLedGpio
4148 + *
4149 + * Description: This function returns the GPIO pin assignment for the power
4150 + * on LED that is set by the bootloader.
4151 + *
4152 + * Parameters : [OUT] pusValue - Address of short word that the alarm LED
4153 + * GPIO pin is returned in.
4154 + *
4155 + * Returns : BP_SUCCESS - Success, value is returned.
4156 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4157 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4158 + * for the board.
4159 + ***************************************************************************/
4160 +int BpGetBootloaderPowerOnLedGpio( unsigned short *pusValue );
4161 +
4162 +/**************************************************************************
4163 + * Name : BpGetBootloaderAlarmLedGpio
4164 + *
4165 + * Description: This function returns the GPIO pin assignment for the alarm
4166 + * LED that is set by the bootloader.
4167 + *
4168 + * Parameters : [OUT] pusValue - Address of short word that the alarm LED
4169 + * GPIO pin is returned in.
4170 + *
4171 + * Returns : BP_SUCCESS - Success, value is returned.
4172 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4173 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4174 + * for the board.
4175 + ***************************************************************************/
4176 +int BpGetBootloaderAlarmLedGpio( unsigned short *pusValue );
4177 +
4178 +/**************************************************************************
4179 + * Name : BpGetBootloaderResetCfgLedGpio
4180 + *
4181 + * Description: This function returns the GPIO pin assignment for the reset
4182 + * configuration LED that is set by the bootloader.
4183 + *
4184 + * Parameters : [OUT] pusValue - Address of short word that the reset
4185 + * configuration LED GPIO pin is returned in.
4186 + *
4187 + * Returns : BP_SUCCESS - Success, value is returned.
4188 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4189 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4190 + * for the board.
4191 + ***************************************************************************/
4192 +int BpGetBootloaderResetCfgLedGpio( unsigned short *pusValue );
4193 +
4194 +/**************************************************************************
4195 + * Name : BpGetBootloaderStopLedGpio
4196 + *
4197 + * Description: This function returns the GPIO pin assignment for the break
4198 + * into bootloader LED that is set by the bootloader.
4199 + *
4200 + * Parameters : [OUT] pusValue - Address of short word that the break into
4201 + * bootloader LED GPIO pin is returned in.
4202 + *
4203 + * Returns : BP_SUCCESS - Success, value is returned.
4204 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4205 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4206 + * for the board.
4207 + ***************************************************************************/
4208 +int BpGetBootloaderStopLedGpio( unsigned short *pusValue );
4209 +
4210 +/**************************************************************************
4211 + * Name : BpGetWirelessExtIntr
4212 + *
4213 + * Description: This function returns the Wireless external interrupt number.
4214 + *
4215 + * Parameters : [OUT] pulValue - Address of short word that the wireless
4216 + * external interrupt number is returned in.
4217 + *
4218 + * Returns : BP_SUCCESS - Success, value is returned.
4219 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4220 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4221 + * for the board.
4222 + ***************************************************************************/
4223 +int BpGetWirelessExtIntr( unsigned long *pulValue );
4224 +
4225 +/**************************************************************************
4226 + * Name : BpGetAdslDyingGaspExtIntr
4227 + *
4228 + * Description: This function returns the ADSL Dying Gasp external interrupt
4229 + * number.
4230 + *
4231 + * Parameters : [OUT] pulValue - Address of short word that the ADSL Dying Gasp
4232 + * external interrupt number is returned in.
4233 + *
4234 + * Returns : BP_SUCCESS - Success, value is returned.
4235 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4236 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4237 + * for the board.
4238 + ***************************************************************************/
4239 +int BpGetAdslDyingGaspExtIntr( unsigned long *pulValue );
4240 +
4241 +/**************************************************************************
4242 + * Name : BpGetVoipExtIntr
4243 + *
4244 + * Description: This function returns the VOIP external interrupt number.
4245 + *
4246 + * Parameters : [OUT] pulValue - Address of short word that the VOIP
4247 + * external interrupt number is returned in.
4248 + * [IN] dspNum - Address of the DSP to query.
4249 + *
4250 + * Returns : BP_SUCCESS - Success, value is returned.
4251 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4252 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4253 + * for the board.
4254 + ***************************************************************************/
4255 +int BpGetVoipExtIntr( unsigned char dspNum, unsigned long *pulValue );
4256 +
4257 +/**************************************************************************
4258 + * Name : BpGetHpnaExtIntr
4259 + *
4260 + * Description: This function returns the HPNA external interrupt number.
4261 + *
4262 + * Parameters : [OUT] pulValue - Address of short word that the HPNA
4263 + * external interrupt number is returned in.
4264 + *
4265 + * Returns : BP_SUCCESS - Success, value is returned.
4266 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4267 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4268 + * for the board.
4269 + ***************************************************************************/
4270 +int BpGetHpnaExtIntr( unsigned long *pulValue );
4271 +
4272 +/**************************************************************************
4273 + * Name : BpGetHpnaChipSelect
4274 + *
4275 + * Description: This function returns the HPNA chip select number.
4276 + *
4277 + * Parameters : [OUT] pulValue - Address of short word that the HPNA
4278 + * chip select number is returned in.
4279 + *
4280 + * Returns : BP_SUCCESS - Success, value is returned.
4281 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4282 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4283 + * for the board.
4284 + ***************************************************************************/
4285 +int BpGetHpnaChipSelect( unsigned long *pulValue );
4286 +
4287 +/**************************************************************************
4288 + * Name : BpGetVoipChipSelect
4289 + *
4290 + * Description: This function returns the VOIP chip select number.
4291 + *
4292 + * Parameters : [OUT] pulValue - Address of short word that the VOIP
4293 + * chip select number is returned in.
4294 + * [IN] dspNum - Address of the DSP to query.
4295 + *
4296 + * Returns : BP_SUCCESS - Success, value is returned.
4297 + * BP_BOARD_ID_NOT_SET - Error, BpSetBoardId has not been called.
4298 + * BP_VALUE_NOT_DEFINED - At least one return value is not defined
4299 + * for the board.
4300 + ***************************************************************************/
4301 +int BpGetVoipChipSelect( unsigned char dspNum, unsigned long *pulValue );
4302 +
4303 +#endif /* __ASSEMBLER__ */
4304 +
4305 +#endif /* _BOARDPARMS_H */
4306 +
4307 diff -urN linux.old/arch/mips/bcm963xx/include/6338_intr.h linux.dev/arch/mips/bcm963xx/include/6338_intr.h
4308 --- linux.old/arch/mips/bcm963xx/include/6338_intr.h 1970-01-01 01:00:00.000000000 +0100
4309 +++ linux.dev/arch/mips/bcm963xx/include/6338_intr.h 2006-08-25 00:39:38.000000000 +0200
4310 @@ -0,0 +1,64 @@
4311 +/*
4312 +<:copyright-gpl
4313 + Copyright 2003 Broadcom Corp. All Rights Reserved.
4314 +
4315 + This program is free software; you can distribute it and/or modify it
4316 + under the terms of the GNU General Public License (Version 2) as
4317 + published by the Free Software Foundation.
4318 +
4319 + This program is distributed in the hope it will be useful, but WITHOUT
4320 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4321 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4322 + for more details.
4323 +
4324 + You should have received a copy of the GNU General Public License along
4325 + with this program; if not, write to the Free Software Foundation, Inc.,
4326 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
4327 +:>
4328 +*/
4329 +
4330 +#ifndef __6338_INTR_H
4331 +#define __6338_INTR_H
4332 +
4333 +/*=====================================================================*/
4334 +/* BCM6338 External Interrupt Level Assignments */
4335 +/*=====================================================================*/
4336 +#define INTERRUPT_ID_EXTERNAL_0 3
4337 +#define INTERRUPT_ID_EXTERNAL_1 4
4338 +#define INTERRUPT_ID_EXTERNAL_2 5
4339 +#define INTERRUPT_ID_EXTERNAL_3 6
4340 +
4341 +/*=====================================================================*/
4342 +/* BCM6338 Timer Interrupt Level Assignments */
4343 +/*=====================================================================*/
4344 +#define MIPS_TIMER_INT 7
4345 +
4346 +/*=====================================================================*/
4347 +/* Peripheral ISR Table Offset */
4348 +/*=====================================================================*/
4349 +#define INTERNAL_ISR_TABLE_OFFSET 8
4350 +
4351 +/*=====================================================================*/
4352 +/* Logical Peripheral Interrupt IDs */
4353 +/*=====================================================================*/
4354 +
4355 +#define INTERRUPT_ID_TIMER (INTERNAL_ISR_TABLE_OFFSET + 0)
4356 +#define INTERRUPT_ID_SPI (INTERNAL_ISR_TABLE_OFFSET + 1)
4357 +#define INTERRUPT_ID_UART (INTERNAL_ISR_TABLE_OFFSET + 2)
4358 +#define INTERRUPT_ID_DG (INTERNAL_ISR_TABLE_OFFSET + 4)
4359 +#define INTERRUPT_ID_ADSL (INTERNAL_ISR_TABLE_OFFSET + 5)
4360 +#define INTERRUPT_ID_ATM (INTERNAL_ISR_TABLE_OFFSET + 6)
4361 +#define INTERRUPT_ID_USBS (INTERNAL_ISR_TABLE_OFFSET + 7)
4362 +#define INTERRUPT_ID_EMAC1 (INTERNAL_ISR_TABLE_OFFSET + 8)
4363 +#define INTERRUPT_ID_EPHY (INTERNAL_ISR_TABLE_OFFSET + 9)
4364 +#define INTERRUPT_ID_SDRAM (INTERNAL_ISR_TABLE_OFFSET + 10)
4365 +#define INTERRUPT_ID_USB_CNTL_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 11)
4366 +#define INTERRUPT_ID_USB_CNTL_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 12)
4367 +#define INTERRUPT_ID_USB_BULK_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 13)
4368 +#define INTERRUPT_ID_USB_BULK_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 14)
4369 +#define INTERRUPT_ID_EMAC1_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 15)
4370 +#define INTERRUPT_ID_EMAC1_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 16)
4371 +#define INTERRUPT_ID_SDIO (INTERNAL_ISR_TABLE_OFFSET + 17)
4372 +
4373 +#endif /* __BCM6338_H */
4374 +
4375 diff -urN linux.old/arch/mips/bcm963xx/include/6338_map_part.h linux.dev/arch/mips/bcm963xx/include/6338_map_part.h
4376 --- linux.old/arch/mips/bcm963xx/include/6338_map_part.h 1970-01-01 01:00:00.000000000 +0100
4377 +++ linux.dev/arch/mips/bcm963xx/include/6338_map_part.h 2006-08-25 00:39:38.000000000 +0200
4378 @@ -0,0 +1,334 @@
4379 +/*
4380 +<:copyright-gpl
4381 + Copyright 2004 Broadcom Corp. All Rights Reserved.
4382 +
4383 + This program is free software; you can distribute it and/or modify it
4384 + under the terms of the GNU General Public License (Version 2) as
4385 + published by the Free Software Foundation.
4386 +
4387 + This program is distributed in the hope it will be useful, but WITHOUT
4388 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4389 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4390 + for more details.
4391 +
4392 + You should have received a copy of the GNU General Public License along
4393 + with this program; if not, write to the Free Software Foundation, Inc.,
4394 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
4395 +:>
4396 +*/
4397 +
4398 +#ifndef __BCM6338_MAP_H
4399 +#define __BCM6338_MAP_H
4400 +
4401 +#include "bcmtypes.h"
4402 +
4403 +#define PERF_BASE 0xfffe0000
4404 +#define TIMR_BASE 0xfffe0200
4405 +#define UART_BASE 0xfffe0300
4406 +#define GPIO_BASE 0xfffe0400
4407 +#define SPI_BASE 0xfffe0c00
4408 +
4409 +typedef struct PerfControl {
4410 + uint32 RevID;
4411 + uint16 testControl;
4412 + uint16 blkEnables;
4413 +#define EMAC_CLK_EN 0x0010
4414 +#define USBS_CLK_EN 0x0010
4415 +#define SAR_CLK_EN 0x0020
4416 +
4417 +#define SPI_CLK_EN 0x0200
4418 +
4419 + uint32 pll_control;
4420 +#define SOFT_RESET 0x00000001
4421 +
4422 + uint32 IrqMask;
4423 + uint32 IrqStatus;
4424 +
4425 + uint32 ExtIrqCfg;
4426 +#define EI_SENSE_SHFT 0
4427 +#define EI_STATUS_SHFT 5
4428 +#define EI_CLEAR_SHFT 10
4429 +#define EI_MASK_SHFT 15
4430 +#define EI_INSENS_SHFT 20
4431 +#define EI_LEVEL_SHFT 25
4432 +
4433 + uint32 unused[4]; /* (18) */
4434 + uint32 BlockSoftReset; /* (28) */
4435 +#define BSR_SPI 0x00000001
4436 +#define BSR_EMAC 0x00000004
4437 +#define BSR_USBH 0x00000008
4438 +#define BSR_USBS 0x00000010
4439 +#define BSR_ADSL 0x00000020
4440 +#define BSR_DMAMEM 0x00000040
4441 +#define BSR_SAR 0x00000080
4442 +#define BSR_ACLC 0x00000100
4443 +#define BSR_ADSL_MIPS_PLL 0x00000400
4444 +#define BSR_ALL_BLOCKS \
4445 + (BSR_SPI | BSR_EMAC | BSR_USBH | BSR_USBS | BSR_ADSL | BSR_DMAMEM | \
4446 + BSR_SAR | BSR_ACLC | BSR_ADSL_MIPS_PLL)
4447 +} PerfControl;
4448 +
4449 +#define PERF ((volatile PerfControl * const) PERF_BASE)
4450 +
4451 +
4452 +typedef struct Timer {
4453 + uint16 unused0;
4454 + byte TimerMask;
4455 +#define TIMER0EN 0x01
4456 +#define TIMER1EN 0x02
4457 +#define TIMER2EN 0x04
4458 + byte TimerInts;
4459 +#define TIMER0 0x01
4460 +#define TIMER1 0x02
4461 +#define TIMER2 0x04
4462 +#define WATCHDOG 0x08
4463 + uint32 TimerCtl0;
4464 + uint32 TimerCtl1;
4465 + uint32 TimerCtl2;
4466 +#define TIMERENABLE 0x80000000
4467 +#define RSTCNTCLR 0x40000000
4468 + uint32 TimerCnt0;
4469 + uint32 TimerCnt1;
4470 + uint32 TimerCnt2;
4471 + uint32 WatchDogDefCount;
4472 +
4473 + /* Write 0xff00 0x00ff to Start timer
4474 + * Write 0xee00 0x00ee to Stop and re-load default count
4475 + * Read from this register returns current watch dog count
4476 + */
4477 + uint32 WatchDogCtl;
4478 +
4479 + /* Number of 40-MHz ticks for WD Reset pulse to last */
4480 + uint32 WDResetCount;
4481 +} Timer;
4482 +
4483 +#define TIMER ((volatile Timer * const) TIMR_BASE)
4484 +typedef struct UartChannel {
4485 + byte unused0;
4486 + byte control;
4487 +#define BRGEN 0x80 /* Control register bit defs */
4488 +#define TXEN 0x40
4489 +#define RXEN 0x20
4490 +#define LOOPBK 0x10
4491 +#define TXPARITYEN 0x08
4492 +#define TXPARITYEVEN 0x04
4493 +#define RXPARITYEN 0x02
4494 +#define RXPARITYEVEN 0x01
4495 +
4496 + byte config;
4497 +#define XMITBREAK 0x40
4498 +#define BITS5SYM 0x00
4499 +#define BITS6SYM 0x10
4500 +#define BITS7SYM 0x20
4501 +#define BITS8SYM 0x30
4502 +#define ONESTOP 0x07
4503 +#define TWOSTOP 0x0f
4504 + /* 4-LSBS represent STOP bits/char
4505 + * in 1/8 bit-time intervals. Zero
4506 + * represents 1/8 stop bit interval.
4507 + * Fifteen represents 2 stop bits.
4508 + */
4509 + byte fifoctl;
4510 +#define RSTTXFIFOS 0x80
4511 +#define RSTRXFIFOS 0x40
4512 + /* 5-bit TimeoutCnt is in low bits of this register.
4513 + * This count represents the number of characters
4514 + * idle times before setting receive Irq when below threshold
4515 + */
4516 + uint32 baudword;
4517 + /* When divide SysClk/2/(1+baudword) we should get 32*bit-rate
4518 + */
4519 +
4520 + byte txf_levl; /* Read-only fifo depth */
4521 + byte rxf_levl; /* Read-only fifo depth */
4522 + byte fifocfg; /* Upper 4-bits are TxThresh, Lower are
4523 + * RxThreshold. Irq can be asserted
4524 + * when rx fifo> thresh, txfifo<thresh
4525 + */
4526 + byte prog_out; /* Set value of DTR (Bit0), RTS (Bit1)
4527 + * if these bits are also enabled to GPIO_o
4528 + */
4529 +#define DTREN 0x01
4530 +#define RTSEN 0x02
4531 +
4532 + byte unused1;
4533 + byte DeltaIPEdgeNoSense; /* Low 4-bits, set corr bit to 1 to
4534 + * detect irq on rising AND falling
4535 + * edges for corresponding GPIO_i
4536 + * if enabled (edge insensitive)
4537 + */
4538 + byte DeltaIPConfig_Mask; /* Upper 4 bits: 1 for posedge sense
4539 + * 0 for negedge sense if
4540 + * not configured for edge
4541 + * insensitive (see above)
4542 + * Lower 4 bits: Mask to enable change
4543 + * detection IRQ for corresponding
4544 + * GPIO_i
4545 + */
4546 + byte DeltaIP_SyncIP; /* Upper 4 bits show which bits
4547 + * have changed (may set IRQ).
4548 + * read automatically clears bit
4549 + * Lower 4 bits are actual status
4550 + */
4551 +
4552 + uint16 intMask; /* Same Bit defs for Mask and status */
4553 + uint16 intStatus;
4554 +#define DELTAIP 0x0001
4555 +#define TXUNDERR 0x0002
4556 +#define TXOVFERR 0x0004
4557 +#define TXFIFOTHOLD 0x0008
4558 +#define TXREADLATCH 0x0010
4559 +#define TXFIFOEMT 0x0020
4560 +#define RXUNDERR 0x0040
4561 +#define RXOVFERR 0x0080
4562 +#define RXTIMEOUT 0x0100
4563 +#define RXFIFOFULL 0x0200
4564 +#define RXFIFOTHOLD 0x0400
4565 +#define RXFIFONE 0x0800
4566 +#define RXFRAMERR 0x1000
4567 +#define RXPARERR 0x2000
4568 +#define RXBRK 0x4000
4569 +
4570 + uint16 unused2;
4571 + uint16 Data; /* Write to TX, Read from RX */
4572 + /* bits 11:8 are BRK,PAR,FRM errors */
4573 +
4574 + uint32 unused3;
4575 + uint32 unused4;
4576 +} Uart;
4577 +
4578 +#define UART ((volatile Uart * const) UART_BASE)
4579 +
4580 +typedef struct GpioControl {
4581 + uint32 unused0;
4582 + uint32 GPIODir; /* bits 7:0 */
4583 + uint32 unused1;
4584 + uint32 GPIOio; /* bits 7:0 */
4585 + uint32 LEDCtrl;
4586 +#define LED3_STROBE 0x08000000
4587 +#define LED2_STROBE 0x04000000
4588 +#define LED1_STROBE 0x02000000
4589 +#define LED0_STROBE 0x01000000
4590 +#define LED_TEST 0x00010000
4591 +#define LED3_DISABLE_LINK_ACT 0x00008000
4592 +#define LED2_DISABLE_LINK_ACT 0x00004000
4593 +#define LED1_DISABLE_LINK_ACT 0x00002000
4594 +#define LED0_DISABLE_LINK_ACT 0x00001000
4595 +#define LED_INTERVAL_SET_MASK 0x00000f00
4596 +#define LED_INTERVAL_SET_320MS 0x00000500
4597 +#define LED_INTERVAL_SET_160MS 0x00000400
4598 +#define LED_INTERVAL_SET_80MS 0x00000300
4599 +#define LED_INTERVAL_SET_40MS 0x00000200
4600 +#define LED_INTERVAL_SET_20MS 0x00000100
4601 +#define LED3_ON 0x00000080
4602 +#define LED2_ON 0x00000040
4603 +#define LED1_ON 0x00000020
4604 +#define LED0_ON 0x00000010
4605 +#define LED3_ENABLE 0x00000008
4606 +#define LED2_ENABLE 0x00000004
4607 +#define LED1_ENABLE 0x00000002
4608 +#define LED0_ENABLE 0x00000001
4609 + uint32 SpiSlaveCfg;
4610 +#define SPI_SLAVE_RESET 0x00010000
4611 +#define SPI_RESTRICT 0x00000400
4612 +#define SPI_DELAY_DISABLE 0x00000200
4613 +#define SPI_PROBE_MUX_SEL_MASK 0x000001e0
4614 +#define SPI_SER_ADDR_CFG_MASK 0x0000000c
4615 +#define SPI_MODE 0x00000001
4616 + uint32 vRegConfig;
4617 +} GpioControl;
4618 +
4619 +#define GPIO ((volatile GpioControl * const) GPIO_BASE)
4620 +
4621 +/* Number to mask conversion macro used for GPIODir and GPIOio */
4622 +#define GPIO_NUM_MAX_BITS_MASK 0x0f
4623 +#define GPIO_NUM_TO_MASK(X) (1 << ((X) & GPIO_NUM_MAX_BITS_MASK))
4624 +
4625 +/*
4626 +** Spi Controller
4627 +*/
4628 +
4629 +typedef struct SpiControl {
4630 + uint16 spiCmd; /* (0x0): SPI command */
4631 +#define SPI_CMD_START_IMMEDIATE 3
4632 +
4633 +#define SPI_CMD_COMMAND_SHIFT 0
4634 +#define SPI_CMD_DEVICE_ID_SHIFT 4
4635 +#define SPI_CMD_PREPEND_BYTE_CNT_SHIFT 8
4636 +
4637 + byte spiIntStatus; /* (0x2): SPI interrupt status */
4638 + byte spiMaskIntStatus; /* (0x3): SPI masked interrupt status */
4639 +
4640 + byte spiIntMask; /* (0x4): SPI interrupt mask */
4641 +#define SPI_INTR_CMD_DONE 0x01
4642 +#define SPI_INTR_CLEAR_ALL 0x1f
4643 +
4644 + byte spiStatus; /* (0x5): SPI status */
4645 +
4646 + byte spiClkCfg; /* (0x6): SPI clock configuration */
4647 +
4648 + byte spiFillByte; /* (0x7): SPI fill byte */
4649 +
4650 + byte unused0;
4651 + byte spiMsgTail; /* (0x9): msgtail */
4652 + byte unused1;
4653 + byte spiRxTail; /* (0xB): rxtail */
4654 +
4655 + uint32 unused2[13]; /* (0x0c - 0x3c) reserved */
4656 +
4657 + byte spiMsgCtl; /* (0x40) control byte */
4658 +#define HALF_DUPLEX_W 1
4659 +#define HALF_DUPLEX_R 2
4660 +#define SPI_MSG_TYPE_SHIFT 6
4661 +#define SPI_BYTE_CNT_SHIFT 0
4662 + byte spiMsgData[63]; /* (0x41 - 0x7f) msg data */
4663 + byte spiRxDataFifo[64]; /* (0x80 - 0xbf) rx data */
4664 + byte unused3[64]; /* (0xc0 - 0xff) reserved */
4665 +} SpiControl;
4666 +
4667 +#define SPI ((volatile SpiControl * const) SPI_BASE)
4668 +
4669 +/*
4670 +** External Bus Interface
4671 +*/
4672 +typedef struct EbiChipSelect {
4673 + uint32 base; /* base address in upper 24 bits */
4674 +#define EBI_SIZE_8K 0
4675 +#define EBI_SIZE_16K 1
4676 +#define EBI_SIZE_32K 2
4677 +#define EBI_SIZE_64K 3
4678 +#define EBI_SIZE_128K 4
4679 +#define EBI_SIZE_256K 5
4680 +#define EBI_SIZE_512K 6
4681 +#define EBI_SIZE_1M 7
4682 +#define EBI_SIZE_2M 8
4683 +#define EBI_SIZE_4M 9
4684 +#define EBI_SIZE_8M 10
4685 +#define EBI_SIZE_16M 11
4686 +#define EBI_SIZE_32M 12
4687 +#define EBI_SIZE_64M 13
4688 +#define EBI_SIZE_128M 14
4689 +#define EBI_SIZE_256M 15
4690 + uint32 config;
4691 +#define EBI_ENABLE 0x00000001 /* .. enable this range */
4692 +#define EBI_WAIT_STATES 0x0000000e /* .. mask for wait states */
4693 +#define EBI_WTST_SHIFT 1 /* .. for shifting wait states */
4694 +#define EBI_WORD_WIDE 0x00000010 /* .. 16-bit peripheral, else 8 */
4695 +#define EBI_WREN 0x00000020 /* enable posted writes */
4696 +#define EBI_POLARITY 0x00000040 /* .. set to invert something,
4697 + ** don't know what yet */
4698 +#define EBI_TS_TA_MODE 0x00000080 /* .. use TS/TA mode */
4699 +#define EBI_TS_SEL 0x00000100 /* .. drive tsize, not bs_b */
4700 +#define EBI_FIFO 0x00000200 /* .. use fifo */
4701 +#define EBI_RE 0x00000400 /* .. Reverse Endian */
4702 +} EbiChipSelect;
4703 +
4704 +typedef struct MpiRegisters {
4705 + EbiChipSelect cs[1]; /* size chip select configuration */
4706 +} MpiRegisters;
4707 +
4708 +#define MPI ((volatile MpiRegisters * const) MPI_BASE)
4709 +
4710 +
4711 +#endif
4712 +
4713 diff -urN linux.old/arch/mips/bcm963xx/include/6345_intr.h linux.dev/arch/mips/bcm963xx/include/6345_intr.h
4714 --- linux.old/arch/mips/bcm963xx/include/6345_intr.h 1970-01-01 01:00:00.000000000 +0100
4715 +++ linux.dev/arch/mips/bcm963xx/include/6345_intr.h 2006-08-25 00:39:38.000000000 +0200
4716 @@ -0,0 +1,72 @@
4717 +/*
4718 +<:copyright-gpl
4719 + Copyright 2002 Broadcom Corp. All Rights Reserved.
4720 +
4721 + This program is free software; you can distribute it and/or modify it
4722 + under the terms of the GNU General Public License (Version 2) as
4723 + published by the Free Software Foundation.
4724 +
4725 + This program is distributed in the hope it will be useful, but WITHOUT
4726 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4727 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4728 + for more details.
4729 +
4730 + You should have received a copy of the GNU General Public License along
4731 + with this program; if not, write to the Free Software Foundation, Inc.,
4732 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
4733 +:>
4734 +*/
4735 +
4736 +#ifndef __6345_INTR_H
4737 +#define __6345_INTR_H
4738 +
4739 +
4740 +/*=====================================================================*/
4741 +/* BCM6345 External Interrupt Level Assignments */
4742 +/*=====================================================================*/
4743 +#define INTERRUPT_ID_EXTERNAL_0 3
4744 +#define INTERRUPT_ID_EXTERNAL_1 4
4745 +#define INTERRUPT_ID_EXTERNAL_2 5
4746 +#define INTERRUPT_ID_EXTERNAL_3 6
4747 +
4748 +/*=====================================================================*/
4749 +/* BCM6345 Timer Interrupt Level Assignments */
4750 +/*=====================================================================*/
4751 +#define MIPS_TIMER_INT 7
4752 +
4753 +/*=====================================================================*/
4754 +/* Peripheral ISR Table Offset */
4755 +/*=====================================================================*/
4756 +#define INTERNAL_ISR_TABLE_OFFSET 8
4757 +#define DMA_ISR_TABLE_OFFSET (INTERNAL_ISR_TABLE_OFFSET + 13)
4758 +
4759 +/*=====================================================================*/
4760 +/* Logical Peripheral Interrupt IDs */
4761 +/*=====================================================================*/
4762 +
4763 +/* Internal peripheral interrupt IDs */
4764 +#define INTERRUPT_ID_TIMER (INTERNAL_ISR_TABLE_OFFSET + 0)
4765 +#define INTERRUPT_ID_UART (INTERNAL_ISR_TABLE_OFFSET + 2)
4766 +#define INTERRUPT_ID_ADSL (INTERNAL_ISR_TABLE_OFFSET + 3)
4767 +#define INTERRUPT_ID_ATM (INTERNAL_ISR_TABLE_OFFSET + 4)
4768 +#define INTERRUPT_ID_USB (INTERNAL_ISR_TABLE_OFFSET + 5)
4769 +#define INTERRUPT_ID_EMAC (INTERNAL_ISR_TABLE_OFFSET + 8)
4770 +#define INTERRUPT_ID_EPHY (INTERNAL_ISR_TABLE_OFFSET + 12)
4771 +
4772 +/* DMA channel interrupt IDs */
4773 +#define INTERRUPT_ID_EMAC_RX_CHAN (DMA_ISR_TABLE_OFFSET + EMAC_RX_CHAN)
4774 +#define INTERRUPT_ID_EMAC_TX_CHAN (DMA_ISR_TABLE_OFFSET + EMAC_TX_CHAN)
4775 +#define INTERRUPT_ID_EBI_RX_CHAN (DMA_ISR_TABLE_OFFSET + EBI_RX_CHAN)
4776 +#define INTERRUPT_ID_EBI_TX_CHAN (DMA_ISR_TABLE_OFFSET + EBI_TX_CHAN)
4777 +#define INTERRUPT_ID_RESERVED_RX_CHAN (DMA_ISR_TABLE_OFFSET + RESERVED_RX_CHAN)
4778 +#define INTERRUPT_ID_RESERVED_TX_CHAN (DMA_ISR_TABLE_OFFSET + RESERVED_TX_CHAN)
4779 +#define INTERRUPT_ID_USB_BULK_RX_CHAN (DMA_ISR_TABLE_OFFSET + USB_BULK_RX_CHAN)
4780 +#define INTERRUPT_ID_USB_BULK_TX_CHAN (DMA_ISR_TABLE_OFFSET + USB_BULK_TX_CHAN)
4781 +#define INTERRUPT_ID_USB_CNTL_RX_CHAN (DMA_ISR_TABLE_OFFSET + USB_CNTL_RX_CHAN)
4782 +#define INTERRUPT_ID_USB_CNTL_TX_CHAN (DMA_ISR_TABLE_OFFSET + USB_CNTL_TX_CHAN)
4783 +#define INTERRUPT_ID_USB_ISO_RX_CHAN (DMA_ISR_TABLE_OFFSET + USB_ISO_RX_CHAN)
4784 +#define INTERRUPT_ID_USB_ISO_TX_CHAN (DMA_ISR_TABLE_OFFSET + USB_ISO_TX_CHAN)
4785 +
4786 +
4787 +#endif /* __BCM6345_H */
4788 +
4789 diff -urN linux.old/arch/mips/bcm963xx/include/6345_map_part.h linux.dev/arch/mips/bcm963xx/include/6345_map_part.h
4790 --- linux.old/arch/mips/bcm963xx/include/6345_map_part.h 1970-01-01 01:00:00.000000000 +0100
4791 +++ linux.dev/arch/mips/bcm963xx/include/6345_map_part.h 2006-08-25 00:39:38.000000000 +0200
4792 @@ -0,0 +1,163 @@
4793 +/*
4794 +<:copyright-gpl
4795 + Copyright 2002 Broadcom Corp. All Rights Reserved.
4796 +
4797 + This program is free software; you can distribute it and/or modify it
4798 + under the terms of the GNU General Public License (Version 2) as
4799 + published by the Free Software Foundation.
4800 +
4801 + This program is distributed in the hope it will be useful, but WITHOUT
4802 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4803 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4804 + for more details.
4805 +
4806 + You should have received a copy of the GNU General Public License along
4807 + with this program; if not, write to the Free Software Foundation, Inc.,
4808 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
4809 +:>
4810 +*/
4811 +
4812 +#ifndef __BCM6345_MAP_H
4813 +#define __BCM6345_MAP_H
4814 +
4815 +
4816 +#include "bcmtypes.h"
4817 +#include "6345_intr.h"
4818 +
4819 +typedef struct IntControl {
4820 + uint32 RevID;
4821 + uint16 testControl;
4822 + uint16 blkEnables;
4823 +#define USB_CLK_EN 0x0100
4824 +#define EMAC_CLK_EN 0x0080
4825 +#define UART_CLK_EN 0x0008
4826 +#define CPU_CLK_EN 0x0001
4827 +
4828 + uint32 pll_control;
4829 +#define SOFT_RESET 0x00000001
4830 +
4831 + uint32 IrqMask;
4832 + uint32 IrqStatus;
4833 +
4834 + uint32 ExtIrqCfg;
4835 +#define EI_SENSE_SHFT 0
4836 +#define EI_STATUS_SHFT 4
4837 +#define EI_CLEAR_SHFT 8
4838 +#define EI_MASK_SHFT 12
4839 +#define EI_INSENS_SHFT 16
4840 +#define EI_LEVEL_SHFT 20
4841 +} IntControl;
4842 +
4843 +#define INTC_BASE 0xfffe0000
4844 +#define PERF ((volatile IntControl * const) INTC_BASE)
4845 +
4846 +#define TIMR_BASE 0xfffe0200
4847 +typedef struct Timer {
4848 + uint16 unused0;
4849 + byte TimerMask;
4850 +#define TIMER0EN 0x01
4851 +#define TIMER1EN 0x02
4852 +#define TIMER2EN 0x04
4853 + byte TimerInts;
4854 +#define TIMER0 0x01
4855 +#define TIMER1 0x02
4856 +#define TIMER2 0x04
4857 +#define WATCHDOG 0x08
4858 + uint32 TimerCtl0;
4859 + uint32 TimerCtl1;
4860 + uint32 TimerCtl2;
4861 +#define TIMERENABLE 0x80000000
4862 +#define RSTCNTCLR 0x40000000
4863 + uint32 TimerCnt0;
4864 + uint32 TimerCnt1;
4865 + uint32 TimerCnt2;
4866 + uint32 WatchDogDefCount;
4867 +
4868 + /* Write 0xff00 0x00ff to Start timer
4869 + * Write 0xee00 0x00ee to Stop and re-load default count
4870 + * Read from this register returns current watch dog count
4871 + */
4872 + uint32 WatchDogCtl;
4873 +
4874 + /* Number of 40-MHz ticks for WD Reset pulse to last */
4875 + uint32 WDResetCount;
4876 +} Timer;
4877 +
4878 +#define TIMER ((volatile Timer * const) TIMR_BASE)
4879 +
4880 +typedef struct UartChannel {
4881 + byte unused0;
4882 + byte control;
4883 +#define BRGEN 0x80 /* Control register bit defs */
4884 +#define TXEN 0x40
4885 +#define RXEN 0x20
4886 +#define TXPARITYEN 0x08
4887 +#define TXPARITYEVEN 0x04
4888 +#define RXPARITYEN 0x02
4889 +#define RXPARITYEVEN 0x01
4890 + byte config;
4891 +#define BITS5SYM 0x00
4892 +#define BITS6SYM 0x10
4893 +#define BITS7SYM 0x20
4894 +#define BITS8SYM 0x30
4895 +#define XMITBREAK 0x40
4896 +#define ONESTOP 0x07
4897 +#define TWOSTOP 0x0f
4898 +
4899 + byte fifoctl;
4900 +#define RSTTXFIFOS 0x80
4901 +#define RSTRXFIFOS 0x40
4902 + uint32 baudword;
4903 +
4904 + byte txf_levl;
4905 + byte rxf_levl;
4906 + byte fifocfg;
4907 + byte prog_out;
4908 +
4909 + byte unused1;
4910 + byte DeltaIPEdgeNoSense;
4911 + byte DeltaIPConfig_Mask;
4912 + byte DeltaIP_SyncIP;
4913 + uint16 intMask;
4914 + uint16 intStatus;
4915 +#define TXUNDERR 0x0002
4916 +#define TXOVFERR 0x0004
4917 +#define TXFIFOEMT 0x0020
4918 +#define RXOVFERR 0x0080
4919 +#define RXFIFONE 0x0800
4920 +#define RXFRAMERR 0x1000
4921 +#define RXPARERR 0x2000
4922 +#define RXBRK 0x4000
4923 +
4924 + uint16 unused2;
4925 + uint16 Data;
4926 + uint32 unused3;
4927 + uint32 unused4;
4928 +} Uart;
4929 +
4930 +#define UART_BASE 0xfffe0300
4931 +#define UART ((volatile Uart * const) UART_BASE)
4932 +
4933 +typedef struct GpioControl {
4934 + uint16 unused0;
4935 + byte unused1;
4936 + byte TBusSel;
4937 +
4938 + uint16 unused2;
4939 + uint16 GPIODir;
4940 + byte unused3;
4941 + byte Leds;
4942 + uint16 GPIOio;
4943 +
4944 + uint32 UartCtl;
4945 +} GpioControl;
4946 +
4947 +#define GPIO_BASE 0xfffe0400
4948 +#define GPIO ((volatile GpioControl * const) GPIO_BASE)
4949 +
4950 +#define GPIO_NUM_MAX_BITS_MASK 0x0f
4951 +#define GPIO_NUM_TO_MASK(X) (1 << ((X) & GPIO_NUM_MAX_BITS_MASK))
4952 +
4953 +
4954 +#endif
4955 +
4956 diff -urN linux.old/arch/mips/bcm963xx/include/6348_intr.h linux.dev/arch/mips/bcm963xx/include/6348_intr.h
4957 --- linux.old/arch/mips/bcm963xx/include/6348_intr.h 1970-01-01 01:00:00.000000000 +0100
4958 +++ linux.dev/arch/mips/bcm963xx/include/6348_intr.h 2006-08-25 00:39:38.000000000 +0200
4959 @@ -0,0 +1,74 @@
4960 +/*
4961 +<:copyright-gpl
4962 + Copyright 2003 Broadcom Corp. All Rights Reserved.
4963 +
4964 + This program is free software; you can distribute it and/or modify it
4965 + under the terms of the GNU General Public License (Version 2) as
4966 + published by the Free Software Foundation.
4967 +
4968 + This program is distributed in the hope it will be useful, but WITHOUT
4969 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4970 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4971 + for more details.
4972 +
4973 + You should have received a copy of the GNU General Public License along
4974 + with this program; if not, write to the Free Software Foundation, Inc.,
4975 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
4976 +:>
4977 +*/
4978 +
4979 +#ifndef __6348_INTR_H
4980 +#define __6348_INTR_H
4981 +
4982 +
4983 +/*=====================================================================*/
4984 +/* BCM6348 External Interrupt Level Assignments */
4985 +/*=====================================================================*/
4986 +#define INTERRUPT_ID_EXTERNAL_0 3
4987 +#define INTERRUPT_ID_EXTERNAL_1 4
4988 +#define INTERRUPT_ID_EXTERNAL_2 5
4989 +#define INTERRUPT_ID_EXTERNAL_3 6
4990 +
4991 +/*=====================================================================*/
4992 +/* BCM6348 Timer Interrupt Level Assignments */
4993 +/*=====================================================================*/
4994 +#define MIPS_TIMER_INT 7
4995 +
4996 +/*=====================================================================*/
4997 +/* Peripheral ISR Table Offset */
4998 +/*=====================================================================*/
4999 +#define INTERNAL_ISR_TABLE_OFFSET 8
5000 +
5001 +/*=====================================================================*/
5002 +/* Logical Peripheral Interrupt IDs */
5003 +/*=====================================================================*/
5004 +
5005 +#define INTERRUPT_ID_TIMER (INTERNAL_ISR_TABLE_OFFSET + 0)
5006 +#define INTERRUPT_ID_SPI (INTERNAL_ISR_TABLE_OFFSET + 1)
5007 +#define INTERRUPT_ID_UART (INTERNAL_ISR_TABLE_OFFSET + 2)
5008 +#define INTERRUPT_ID_ADSL (INTERNAL_ISR_TABLE_OFFSET + 4)
5009 +#define INTERRUPT_ID_ATM (INTERNAL_ISR_TABLE_OFFSET + 5)
5010 +#define INTERRUPT_ID_USBS (INTERNAL_ISR_TABLE_OFFSET + 6)
5011 +#define INTERRUPT_ID_EMAC2 (INTERNAL_ISR_TABLE_OFFSET + 7)
5012 +#define INTERRUPT_ID_EMAC1 (INTERNAL_ISR_TABLE_OFFSET + 8)
5013 +#define INTERRUPT_ID_EPHY (INTERNAL_ISR_TABLE_OFFSET + 9)
5014 +#define INTERRUPT_ID_M2M (INTERNAL_ISR_TABLE_OFFSET + 10)
5015 +#define INTERRUPT_ID_ACLC (INTERNAL_ISR_TABLE_OFFSET + 11)
5016 +#define INTERRUPT_ID_USBH (INTERNAL_ISR_TABLE_OFFSET + 12)
5017 +#define INTERRUPT_ID_SDRAM (INTERNAL_ISR_TABLE_OFFSET + 13)
5018 +#define INTERRUPT_ID_USB_CNTL_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 14)
5019 +#define INTERRUPT_ID_USB_CNTL_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 15)
5020 +#define INTERRUPT_ID_USB_BULK_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 16)
5021 +#define INTERRUPT_ID_USB_BULK_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 17)
5022 +#define INTERRUPT_ID_USB_ISO_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 18)
5023 +#define INTERRUPT_ID_USB_ISO_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 19)
5024 +#define INTERRUPT_ID_EMAC1_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 20)
5025 +#define INTERRUPT_ID_EMAC1_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 21)
5026 +#define INTERRUPT_ID_EMAC2_RX_DMA (INTERNAL_ISR_TABLE_OFFSET + 22)
5027 +#define INTERRUPT_ID_EMAC2_TX_DMA (INTERNAL_ISR_TABLE_OFFSET + 23)
5028 +#define INTERRUPT_ID_MPI (INTERNAL_ISR_TABLE_OFFSET + 24)
5029 +#define INTERRUPT_ID_DG (INTERNAL_ISR_TABLE_OFFSET + 25)
5030 +
5031 +
5032 +#endif /* __BCM6348_H */
5033 +
5034 diff -urN linux.old/arch/mips/bcm963xx/include/6348_map_part.h linux.dev/arch/mips/bcm963xx/include/6348_map_part.h
5035 --- linux.old/arch/mips/bcm963xx/include/6348_map_part.h 1970-01-01 01:00:00.000000000 +0100
5036 +++ linux.dev/arch/mips/bcm963xx/include/6348_map_part.h 2006-08-25 00:39:38.000000000 +0200
5037 @@ -0,0 +1,500 @@
5038 +/*
5039 +<:copyright-gpl
5040 + Copyright 2002 Broadcom Corp. All Rights Reserved.
5041 +
5042 + This program is free software; you can distribute it and/or modify it
5043 + under the terms of the GNU General Public License (Version 2) as
5044 + published by the Free Software Foundation.
5045 +
5046 + This program is distributed in the hope it will be useful, but WITHOUT
5047 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5048 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5049 + for more details.
5050 +
5051 + You should have received a copy of the GNU General Public License along
5052 + with this program; if not, write to the Free Software Foundation, Inc.,
5053 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
5054 +:>
5055 +*/
5056 +
5057 +#ifndef __BCM6348_MAP_H
5058 +#define __BCM6348_MAP_H
5059 +
5060 +#include "bcmtypes.h"
5061 +
5062 +#define PERF_BASE 0xfffe0000
5063 +#define TIMR_BASE 0xfffe0200
5064 +#define UART_BASE 0xfffe0300
5065 +#define GPIO_BASE 0xfffe0400
5066 +#define MPI_BASE 0xfffe2000 /* MPI control registers */
5067 +#define USB_HOST_BASE 0xfffe1b00 /* USB host registers */
5068 +#define USB_HOST_NON_OHCI 0xfffe1c00 /* USB host non-OHCI registers */
5069 +
5070 +typedef struct PerfControl {
5071 + uint32 RevID;
5072 + uint16 testControl;
5073 + uint16 blkEnables;
5074 +#define EMAC_CLK_EN 0x0010
5075 +#define SAR_CLK_EN 0x0020
5076 +#define USBS_CLK_EN 0x0040
5077 +#define USBH_CLK_EN 0x0100
5078 +
5079 + uint32 pll_control;
5080 +#define SOFT_RESET 0x00000001
5081 +
5082 + uint32 IrqMask;
5083 + uint32 IrqStatus;
5084 +
5085 + uint32 ExtIrqCfg;
5086 +#define EI_SENSE_SHFT 0
5087 +#define EI_STATUS_SHFT 5
5088 +#define EI_CLEAR_SHFT 10
5089 +#define EI_MASK_SHFT 15
5090 +#define EI_INSENS_SHFT 20
5091 +#define EI_LEVEL_SHFT 25
5092 +
5093 + uint32 unused[4]; /* (18) */
5094 + uint32 BlockSoftReset; /* (28) */
5095 +#define BSR_SPI 0x00000001
5096 +#define BSR_EMAC 0x00000004
5097 +#define BSR_USBH 0x00000008
5098 +#define BSR_USBS 0x00000010
5099 +#define BSR_ADSL 0x00000020
5100 +#define BSR_DMAMEM 0x00000040
5101 +#define BSR_SAR 0x00000080
5102 +#define BSR_ACLC 0x00000100
5103 +#define BSR_ADSL_MIPS_PLL 0x00000400
5104 +#define BSR_ALL_BLOCKS \
5105 + (BSR_SPI | BSR_EMAC | BSR_USBH | BSR_USBS | BSR_ADSL | BSR_DMAMEM | \
5106 + BSR_SAR | BSR_ACLC | BSR_ADSL_MIPS_PLL)
5107 + uint32 unused2[2]; /* (2c) */
5108 + uint32 PllStrap; /* (34) */
5109 +#define PLL_N1_SHFT 20
5110 +#define PLL_N1_MASK (7<<PLL_N1_SHFT)
5111 +#define PLL_N2_SHFT 15
5112 +#define PLL_N2_MASK (0x1f<<PLL_N2_SHFT)
5113 +#define PLL_M1_REF_SHFT 12
5114 +#define PLL_M1_REF_MASK (7<<PLL_M1_REF_SHFT)
5115 +#define PLL_M2_REF_SHFT 9
5116 +#define PLL_M2_REF_MASK (7<<PLL_M2_REF_SHFT)
5117 +#define PLL_M1_CPU_SHFT 6
5118 +#define PLL_M1_CPU_MASK (7<<PLL_M1_CPU_SHFT)
5119 +#define PLL_M1_BUS_SHFT 3
5120 +#define PLL_M1_BUS_MASK (7<<PLL_M1_BUS_SHFT)
5121 +#define PLL_M2_BUS_SHFT 0
5122 +#define PLL_M2_BUS_MASK (7<<PLL_M2_BUS_SHFT)
5123 +} PerfControl;
5124 +
5125 +#define PERF ((volatile PerfControl * const) PERF_BASE)
5126 +
5127 +typedef struct Timer {
5128 + uint16 unused0;
5129 + byte TimerMask;
5130 +#define TIMER0EN 0x01
5131 +#define TIMER1EN 0x02
5132 +#define TIMER2EN 0x04
5133 + byte TimerInts;
5134 +#define TIMER0 0x01
5135 +#define TIMER1 0x02
5136 +#define TIMER2 0x04
5137 +#define WATCHDOG 0x08
5138 + uint32 TimerCtl0;
5139 + uint32 TimerCtl1;
5140 + uint32 TimerCtl2;
5141 +#define TIMERENABLE 0x80000000
5142 +#define RSTCNTCLR 0x40000000
5143 + uint32 TimerCnt0;
5144 + uint32 TimerCnt1;
5145 + uint32 TimerCnt2;
5146 + uint32 WatchDogDefCount;
5147 +
5148 + /* Write 0xff00 0x00ff to Start timer
5149 + * Write 0xee00 0x00ee to Stop and re-load default count
5150 + * Read from this register returns current watch dog count
5151 + */
5152 + uint32 WatchDogCtl;
5153 +
5154 + /* Number of 40-MHz ticks for WD Reset pulse to last */
5155 + uint32 WDResetCount;
5156 +} Timer;
5157 +
5158 +#define TIMER ((volatile Timer * const) TIMR_BASE)
5159 +
5160 +typedef struct UartChannel {
5161 + byte unused0;
5162 + byte control;
5163 +#define BRGEN 0x80 /* Control register bit defs */
5164 +#define TXEN 0x40
5165 +#define RXEN 0x20
5166 +#define LOOPBK 0x10
5167 +#define TXPARITYEN 0x08
5168 +#define TXPARITYEVEN 0x04
5169 +#define RXPARITYEN 0x02
5170 +#define RXPARITYEVEN 0x01
5171 +
5172 + byte config;
5173 +#define XMITBREAK 0x40
5174 +#define BITS5SYM 0x00
5175 +#define BITS6SYM 0x10
5176 +#define BITS7SYM 0x20
5177 +#define BITS8SYM 0x30
5178 +#define ONESTOP 0x07
5179 +#define TWOSTOP 0x0f
5180 + /* 4-LSBS represent STOP bits/char
5181 + * in 1/8 bit-time intervals. Zero
5182 + * represents 1/8 stop bit interval.
5183 + * Fifteen represents 2 stop bits.
5184 + */
5185 + byte fifoctl;
5186 +#define RSTTXFIFOS 0x80
5187 +#define RSTRXFIFOS 0x40
5188 + /* 5-bit TimeoutCnt is in low bits of this register.
5189 + * This count represents the number of characters
5190 + * idle times before setting receive Irq when below threshold
5191 + */
5192 + uint32 baudword;
5193 + /* When divide SysClk/2/(1+baudword) we should get 32*bit-rate
5194 + */
5195 +
5196 + byte txf_levl; /* Read-only fifo depth */
5197 + byte rxf_levl; /* Read-only fifo depth */
5198 + byte fifocfg; /* Upper 4-bits are TxThresh, Lower are
5199 + * RxThreshold. Irq can be asserted
5200 + * when rx fifo> thresh, txfifo<thresh
5201 + */
5202 + byte prog_out; /* Set value of DTR (Bit0), RTS (Bit1)
5203 + * if these bits are also enabled to GPIO_o
5204 + */
5205 +#define DTREN 0x01
5206 +#define RTSEN 0x02
5207 +
5208 + byte unused1;
5209 + byte DeltaIPEdgeNoSense; /* Low 4-bits, set corr bit to 1 to
5210 + * detect irq on rising AND falling
5211 + * edges for corresponding GPIO_i
5212 + * if enabled (edge insensitive)
5213 + */
5214 + byte DeltaIPConfig_Mask; /* Upper 4 bits: 1 for posedge sense
5215 + * 0 for negedge sense if
5216 + * not configured for edge
5217 + * insensitive (see above)
5218 + * Lower 4 bits: Mask to enable change
5219 + * detection IRQ for corresponding
5220 + * GPIO_i
5221 + */
5222 + byte DeltaIP_SyncIP; /* Upper 4 bits show which bits
5223 + * have changed (may set IRQ).
5224 + * read automatically clears bit
5225 + * Lower 4 bits are actual status
5226 + */
5227 +
5228 + uint16 intMask; /* Same Bit defs for Mask and status */
5229 + uint16 intStatus;
5230 +#define DELTAIP 0x0001
5231 +#define TXUNDERR 0x0002
5232 +#define TXOVFERR 0x0004
5233 +#define TXFIFOTHOLD 0x0008
5234 +#define TXREADLATCH 0x0010
5235 +#define TXFIFOEMT 0x0020
5236 +#define RXUNDERR 0x0040
5237 +#define RXOVFERR 0x0080
5238 +#define RXTIMEOUT 0x0100
5239 +#define RXFIFOFULL 0x0200
5240 +#define RXFIFOTHOLD 0x0400
5241 +#define RXFIFONE 0x0800
5242 +#define RXFRAMERR 0x1000
5243 +#define RXPARERR 0x2000
5244 +#define RXBRK 0x4000
5245 +
5246 + uint16 unused2;
5247 + uint16 Data; /* Write to TX, Read from RX */
5248 + /* bits 11:8 are BRK,PAR,FRM errors */
5249 +
5250 + uint32 unused3;
5251 + uint32 unused4;
5252 +} Uart;
5253 +
5254 +#define UART ((volatile Uart * const) UART_BASE)
5255 +
5256 +typedef struct GpioControl {
5257 + uint32 GPIODir_high; /* bits 36:32 */
5258 + uint32 GPIODir; /* bits 31:00 */
5259 + uint32 GPIOio_high; /* bits 36:32 */
5260 + uint32 GPIOio; /* bits 31:00 */
5261 + uint32 LEDCtrl;
5262 +#define LED3_STROBE 0x08000000
5263 +#define LED2_STROBE 0x04000000
5264 +#define LED1_STROBE 0x02000000
5265 +#define LED0_STROBE 0x01000000
5266 +#define LED_TEST 0x00010000
5267 +#define LED3_DISABLE_LINK_ACT 0x00008000
5268 +#define LED2_DISABLE_LINK_ACT 0x00004000
5269 +#define LED1_DISABLE_LINK_ACT 0x00002000
5270 +#define LED0_DISABLE_LINK_ACT 0x00001000
5271 +#define LED_INTERVAL_SET_MASK 0x00000f00
5272 +#define LED_INTERVAL_SET_320MS 0x00000500
5273 +#define LED_INTERVAL_SET_160MS 0x00000400
5274 +#define LED_INTERVAL_SET_80MS 0x00000300
5275 +#define LED_INTERVAL_SET_40MS 0x00000200
5276 +#define LED_INTERVAL_SET_20MS 0x00000100
5277 +#define LED3_ON 0x00000080
5278 +#define LED2_ON 0x00000040
5279 +#define LED1_ON 0x00000020
5280 +#define LED0_ON 0x00000010
5281 +#define LED3_ENABLE 0x00000008
5282 +#define LED2_ENABLE 0x00000004
5283 +#define LED1_ENABLE 0x00000002
5284 +#define LED0_ENABLE 0x00000001
5285 + uint32 SpiSlaveCfg;
5286 +#define SPI_SLAVE_RESET 0x00010000
5287 +#define SPI_RESTRICT 0x00000400
5288 +#define SPI_DELAY_DISABLE 0x00000200
5289 +#define SPI_PROBE_MUX_SEL_MASK 0x000001e0
5290 +#define SPI_SER_ADDR_CFG_MASK 0x0000000c
5291 +#define SPI_MODE 0x00000001
5292 + uint32 GPIOMode;
5293 +#define GROUP4_DIAG 0x00090000
5294 +#define GROUP4_UTOPIA 0x00080000
5295 +#define GROUP4_LEGACY_LED 0x00030000
5296 +#define GROUP4_MII_SNOOP 0x00020000
5297 +#define GROUP4_EXT_EPHY 0x00010000
5298 +#define GROUP3_DIAG 0x00009000
5299 +#define GROUP3_UTOPIA 0x00008000
5300 +#define GROUP3_EXT_MII 0x00007000
5301 +#define GROUP2_DIAG 0x00000900
5302 +#define GROUP2_PCI 0x00000500
5303 +#define GROUP1_DIAG 0x00000090
5304 +#define GROUP1_UTOPIA 0x00000080
5305 +#define GROUP1_SPI_UART 0x00000060
5306 +#define GROUP1_SPI_MASTER 0x00000060
5307 +#define GROUP1_MII_PCCARD 0x00000040
5308 +#define GROUP1_MII_SNOOP 0x00000020
5309 +#define GROUP1_EXT_EPHY 0x00000010
5310 +#define GROUP0_DIAG 0x00000009
5311 +#define GROUP0_EXT_MII 0x00000007
5312 +
5313 +} GpioControl;
5314 +
5315 +#define GPIO ((volatile GpioControl * const) GPIO_BASE)
5316 +
5317 +/* Number to mask conversion macro used for GPIODir and GPIOio */
5318 +#define GPIO_NUM_TOTAL_BITS_MASK 0x3f
5319 +#define GPIO_NUM_MAX_BITS_MASK 0x1f
5320 +#define GPIO_NUM_TO_MASK(X) ( (((X) & GPIO_NUM_TOTAL_BITS_MASK) < 32) ? (1 << ((X) & GPIO_NUM_MAX_BITS_MASK)) : (0) )
5321 +
5322 +/* Number to mask conversion macro used for GPIODir_high and GPIOio_high */
5323 +#define GPIO_NUM_MAX_BITS_MASK_HIGH 0x07
5324 +#define GPIO_NUM_TO_MASK_HIGH(X) ( (((X) & GPIO_NUM_TOTAL_BITS_MASK) >= 32) ? (1 << ((X-32) & GPIO_NUM_MAX_BITS_MASK_HIGH)) : (0) )
5325 +
5326 +
5327 +/*
5328 +** External Bus Interface
5329 +*/
5330 +typedef struct EbiChipSelect {
5331 + uint32 base; /* base address in upper 24 bits */
5332 +#define EBI_SIZE_8K 0
5333 +#define EBI_SIZE_16K 1
5334 +#define EBI_SIZE_32K 2
5335 +#define EBI_SIZE_64K 3
5336 +#define EBI_SIZE_128K 4
5337 +#define EBI_SIZE_256K 5
5338 +#define EBI_SIZE_512K 6
5339 +#define EBI_SIZE_1M 7
5340 +#define EBI_SIZE_2M 8
5341 +#define EBI_SIZE_4M 9
5342 +#define EBI_SIZE_8M 10
5343 +#define EBI_SIZE_16M 11
5344 +#define EBI_SIZE_32M 12
5345 +#define EBI_SIZE_64M 13
5346 +#define EBI_SIZE_128M 14
5347 +#define EBI_SIZE_256M 15
5348 + uint32 config;
5349 +#define EBI_ENABLE 0x00000001 /* .. enable this range */
5350 +#define EBI_WAIT_STATES 0x0000000e /* .. mask for wait states */
5351 +#define EBI_WTST_SHIFT 1 /* .. for shifting wait states */
5352 +#define EBI_WORD_WIDE 0x00000010 /* .. 16-bit peripheral, else 8 */
5353 +#define EBI_WREN 0x00000020 /* enable posted writes */
5354 +#define EBI_POLARITY 0x00000040 /* .. set to invert something,
5355 + ** don't know what yet */
5356 +#define EBI_TS_TA_MODE 0x00000080 /* .. use TS/TA mode */
5357 +#define EBI_TS_SEL 0x00000100 /* .. drive tsize, not bs_b */
5358 +#define EBI_FIFO 0x00000200 /* .. use fifo */
5359 +#define EBI_RE 0x00000400 /* .. Reverse Endian */
5360 +} EbiChipSelect;
5361 +
5362 +typedef struct MpiRegisters {
5363 + EbiChipSelect cs[7]; /* size chip select configuration */
5364 +#define EBI_CS0_BASE 0
5365 +#define EBI_CS1_BASE 1
5366 +#define EBI_CS2_BASE 2
5367 +#define EBI_CS3_BASE 3
5368 +#define PCMCIA_COMMON_BASE 4
5369 +#define PCMCIA_ATTRIBUTE_BASE 5
5370 +#define PCMCIA_IO_BASE 6
5371 + uint32 unused0[2]; /* reserved */
5372 + uint32 ebi_control; /* ebi control */
5373 + uint32 unused1[4]; /* reserved */
5374 +#define EBI_ACCESS_TIMEOUT 0x000007FF
5375 + uint32 pcmcia_cntl1; /* pcmcia control 1 */
5376 +#define PCCARD_CARD_RESET 0x00040000
5377 +#define CARDBUS_ENABLE 0x00008000
5378 +#define PCMCIA_ENABLE 0x00004000
5379 +#define PCMCIA_GPIO_ENABLE 0x00002000
5380 +#define CARDBUS_IDSEL 0x00001F00
5381 +#define VS2_OEN 0x00000080
5382 +#define VS1_OEN 0x00000040
5383 +#define VS2_OUT 0x00000020
5384 +#define VS1_OUT 0x00000010
5385 +#define VS2_IN 0x00000008
5386 +#define VS1_IN 0x00000004
5387 +#define CD2_IN 0x00000002
5388 +#define CD1_IN 0x00000001
5389 +#define VS_MASK 0x0000000C
5390 +#define CD_MASK 0x00000003
5391 + uint32 unused2; /* reserved */
5392 + uint32 pcmcia_cntl2; /* pcmcia control 2 */
5393 +#define PCMCIA_BYTESWAP_DIS 0x00000002
5394 +#define PCMCIA_HALFWORD_EN 0x00000001
5395 +#define RW_ACTIVE_CNT_BIT 2
5396 +#define INACTIVE_CNT_BIT 8
5397 +#define CE_SETUP_CNT_BIT 16
5398 +#define CE_HOLD_CNT_BIT 24
5399 + uint32 unused3[40]; /* reserved */
5400 +
5401 + uint32 sp0range; /* PCI to internal system bus address space */
5402 + uint32 sp0remap;
5403 + uint32 sp0cfg;
5404 + uint32 sp1range;
5405 + uint32 sp1remap;
5406 + uint32 sp1cfg;
5407 +
5408 + uint32 EndianCfg;
5409 +
5410 + uint32 l2pcfgctl; /* internal system bus to PCI IO/Cfg control */
5411 +#define DIR_CFG_SEL 0x80000000 /* change from PCI I/O access to PCI config access */
5412 +#define DIR_CFG_USEREG 0x40000000 /* use this register info for PCI configuration access */
5413 +#define DEVICE_NUMBER 0x00007C00 /* device number for the PCI configuration access */
5414 +#define FUNC_NUMBER 0x00000300 /* function number for the PCI configuration access */
5415 +#define REG_NUMBER 0x000000FC /* register number for the PCI configuration access */
5416 +#define CONFIG_TYPE 0x00000003 /* configuration type for the PCI configuration access */
5417 +
5418 + uint32 l2pmrange1; /* internal system bus to PCI memory space */
5419 +#define PCI_SIZE_64K 0xFFFF0000
5420 +#define PCI_SIZE_128K 0xFFFE0000
5421 +#define PCI_SIZE_256K 0xFFFC0000
5422 +#define PCI_SIZE_512K 0xFFF80000
5423 +#define PCI_SIZE_1M 0xFFF00000
5424 +#define PCI_SIZE_2M 0xFFE00000
5425 +#define PCI_SIZE_4M 0xFFC00000
5426 +#define PCI_SIZE_8M 0xFF800000
5427 +#define PCI_SIZE_16M 0xFF000000
5428 +#define PCI_SIZE_32M 0xFE000000
5429 + uint32 l2pmbase1; /* kseg0 or kseg1 address & 0x1FFFFFFF */
5430 + uint32 l2pmremap1;
5431 +#define CARDBUS_MEM 0x00000004
5432 +#define MEM_WINDOW_EN 0x00000001
5433 + uint32 l2pmrange2;
5434 + uint32 l2pmbase2;
5435 + uint32 l2pmremap2;
5436 + uint32 l2piorange; /* internal system bus to PCI I/O space */
5437 + uint32 l2piobase;
5438 + uint32 l2pioremap;
5439 +
5440 + uint32 pcimodesel;
5441 +#define PCI2_INT_BUS_RD_PREFECH 0x000000F0
5442 +#define PCI_BAR2_NOSWAP 0x00000002 /* BAR at offset 0x20 */
5443 +#define PCI_BAR1_NOSWAP 0x00000001 /* BAR at affset 0x1c */
5444 +
5445 + uint32 pciintstat; /* PCI interrupt mask/status */
5446 +#define MAILBOX1_SENT 0x08
5447 +#define MAILBOX0_SENT 0x04
5448 +#define MAILBOX1_MSG_RCV 0x02
5449 +#define MAILBOX0_MSG_RCV 0x01
5450 + uint32 locbuscntrl; /* internal system bus control */
5451 +#define DIR_U2P_NOSWAP 0x00000002
5452 +#define EN_PCI_GPIO 0x00000001
5453 + uint32 locintstat; /* internal system bus interrupt mask/status */
5454 +#define CSERR 0x0200
5455 +#define SERR 0x0100
5456 +#define EXT_PCI_INT 0x0080
5457 +#define DIR_FAILED 0x0040
5458 +#define DIR_COMPLETE 0x0020
5459 +#define PCI_CFG 0x0010
5460 + uint32 unused5[7];
5461 +
5462 + uint32 mailbox0;
5463 + uint32 mailbox1;
5464 +
5465 + uint32 pcicfgcntrl; /* internal system bus PCI configuration control */
5466 +#define PCI_CFG_REG_WRITE_EN 0x00000080
5467 +#define PCI_CFG_ADDR 0x0000003C
5468 + uint32 pcicfgdata; /* internal system bus PCI configuration data */
5469 +
5470 + uint32 locch2ctl; /* PCI to interrnal system bus DMA (downstream) local control */
5471 +#define MPI_DMA_HALT 0x00000008 /* idle after finish current memory burst */
5472 +#define MPI_DMA_PKT_HALT 0x00000004 /* idle after an EOP flag is detected */
5473 +#define MPI_DMA_STALL 0x00000002 /* idle after an EOP flag is detected */
5474 +#define MPI_DMA_ENABLE 0x00000001 /* set to enable channel */
5475 + uint32 locch2intStat;
5476 +#define MPI_DMA_NO_DESC 0x00000004 /* no valid descriptors */
5477 +#define MPI_DMA_DONE 0x00000002 /* packet xfer complete */
5478 +#define MPI_DMA_BUFF_DONE 0x00000001 /* buffer done */
5479 + uint32 locch2intMask;
5480 + uint32 unused6;
5481 + uint32 locch2descaddr;
5482 + uint32 locch2status1;
5483 +#define LOCAL_DESC_STATE 0xE0000000
5484 +#define PCI_DESC_STATE 0x1C000000
5485 +#define BYTE_DONE 0x03FFC000
5486 +#define RING_ADDR 0x00003FFF
5487 + uint32 locch2status2;
5488 +#define BUFPTR_OFFSET 0x1FFF0000
5489 +#define PCI_MASTER_STATE 0x000000C0
5490 +#define LOC_MASTER_STATE 0x00000038
5491 +#define CONTROL_STATE 0x00000007
5492 + uint32 unused7;
5493 +
5494 + uint32 locch1Ctl; /*internal system bus to PCI DMA (upstream) local control */
5495 +#define DMA_U2P_LE 0x00000200 /* local bus is little endian */
5496 +#define DMA_U2P_NOSWAP 0x00000100 /* lccal bus is little endian but no data swapped */
5497 + uint32 locch1intstat;
5498 + uint32 locch1intmask;
5499 + uint32 unused8;
5500 + uint32 locch1descaddr;
5501 + uint32 locch1status1;
5502 + uint32 locch1status2;
5503 + uint32 unused9;
5504 +
5505 + uint32 pcich1ctl; /* internal system bus to PCI DMA PCI control */
5506 + uint32 pcich1intstat;
5507 + uint32 pcich1intmask;
5508 + uint32 pcich1descaddr;
5509 + uint32 pcich1status1;
5510 + uint32 pcich1status2;
5511 +
5512 + uint32 pcich2Ctl; /* PCI to internal system bus DMA PCI control */
5513 + uint32 pcich2intstat;
5514 + uint32 pcich2intmask;
5515 + uint32 pcich2descaddr;
5516 + uint32 pcich2status1;
5517 + uint32 pcich2status2;
5518 +
5519 + uint32 perm_id; /* permanent device and vendor id */
5520 + uint32 perm_rev; /* permanent revision id */
5521 +} MpiRegisters;
5522 +
5523 +#define MPI ((volatile MpiRegisters * const) MPI_BASE)
5524 +
5525 +/* PCI configuration address space start offset 0x40 */
5526 +#define BRCM_PCI_CONFIG_TIMER 0x40
5527 +#define BRCM_PCI_CONFIG_TIMER_RETRY_MASK 0x0000FF00
5528 +#define BRCM_PCI_CONFIG_TIMER_TRDY_MASK 0x000000FF
5529 +
5530 +/* USB host non-Open HCI register, USB_HOST_NON_OHCI, bit definitions. */
5531 +#define NON_OHCI_ENABLE_PORT1 0x00000001 /* Use USB port 1 for host, not dev */
5532 +#define NON_OHCI_BYTE_SWAP 0x00000008 /* Swap USB host registers */
5533 +
5534 +#define USBH_NON_OHCI ((volatile unsigned long * const) USB_HOST_NON_OHCI)
5535 +
5536 +#endif
5537 +
5538 diff -urN linux.old/arch/mips/bcm963xx/include/bcm_intr.h linux.dev/arch/mips/bcm963xx/include/bcm_intr.h
5539 --- linux.old/arch/mips/bcm963xx/include/bcm_intr.h 1970-01-01 01:00:00.000000000 +0100
5540 +++ linux.dev/arch/mips/bcm963xx/include/bcm_intr.h 2006-08-25 00:39:38.000000000 +0200
5541 @@ -0,0 +1,59 @@
5542 +/*
5543 +<:copyright-gpl
5544 + Copyright 2003 Broadcom Corp. All Rights Reserved.
5545 +
5546 + This program is free software; you can distribute it and/or modify it
5547 + under the terms of the GNU General Public License (Version 2) as
5548 + published by the Free Software Foundation.
5549 +
5550 + This program is distributed in the hope it will be useful, but WITHOUT
5551 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5552 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5553 + for more details.
5554 +
5555 + You should have received a copy of the GNU General Public License along
5556 + with this program; if not, write to the Free Software Foundation, Inc.,
5557 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
5558 +:>
5559 +*/
5560 +
5561 +#ifndef __BCM_INTR_H
5562 +#define __BCM_INTR_H
5563 +
5564 +#ifdef __cplusplus
5565 + extern "C" {
5566 +#endif
5567 +
5568 +#if defined(CONFIG_BCM96338)
5569 +#include <6338_intr.h>
5570 +#endif
5571 +#if defined(CONFIG_BCM96345)
5572 +#include <6345_intr.h>
5573 +#endif
5574 +#if defined(CONFIG_BCM96348)
5575 +#include <6348_intr.h>
5576 +#endif
5577 +
5578 +/* defines */
5579 +struct pt_regs;
5580 +typedef int (*FN_HANDLER) (int, void *);
5581 +
5582 +/* prototypes */
5583 +extern void enable_brcm_irq(unsigned int irq);
5584 +extern void disable_brcm_irq(unsigned int irq);
5585 +extern int request_external_irq(unsigned int irq,
5586 + FN_HANDLER handler, unsigned long irqflags,
5587 + const char * devname, void *dev_id);
5588 +extern unsigned int BcmHalMapInterrupt(FN_HANDLER isr, unsigned int param,
5589 + unsigned int interruptId);
5590 +extern void dump_intr_regs(void);
5591 +
5592 +/* compatibility definitions */
5593 +#define BcmHalInterruptEnable(irq) enable_brcm_irq( irq )
5594 +#define BcmHalInterruptDisable(irq) disable_brcm_irq( irq )
5595 +
5596 +#ifdef __cplusplus
5597 + }
5598 +#endif
5599 +
5600 +#endif
5601 diff -urN linux.old/arch/mips/bcm963xx/include/bcm_map_part.h linux.dev/arch/mips/bcm963xx/include/bcm_map_part.h
5602 --- linux.old/arch/mips/bcm963xx/include/bcm_map_part.h 1970-01-01 01:00:00.000000000 +0100
5603 +++ linux.dev/arch/mips/bcm963xx/include/bcm_map_part.h 2006-08-25 00:39:38.000000000 +0200
5604 @@ -0,0 +1,34 @@
5605 +/*
5606 +<:copyright-gpl
5607 + Copyright 2004 Broadcom Corp. All Rights Reserved.
5608 +
5609 + This program is free software; you can distribute it and/or modify it
5610 + under the terms of the GNU General Public License (Version 2) as
5611 + published by the Free Software Foundation.
5612 +
5613 + This program is distributed in the hope it will be useful, but WITHOUT
5614 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5615 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5616 + for more details.
5617 +
5618 + You should have received a copy of the GNU General Public License along
5619 + with this program; if not, write to the Free Software Foundation, Inc.,
5620 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
5621 +:>
5622 +*/
5623 +
5624 +#ifndef __BCM_MAP_PART_H
5625 +#define __BCM_MAP_PART_H
5626 +
5627 +#if defined(CONFIG_BCM96338)
5628 +#include <6338_map_part.h>
5629 +#endif
5630 +#if defined(CONFIG_BCM96345)
5631 +#include <6345_map_part.h>
5632 +#endif
5633 +#if defined(CONFIG_BCM96348)
5634 +#include <6348_map_part.h>
5635 +#endif
5636 +
5637 +#endif
5638 +
5639 diff -urN linux.old/arch/mips/bcm963xx/include/bcmpci.h linux.dev/arch/mips/bcm963xx/include/bcmpci.h
5640 --- linux.old/arch/mips/bcm963xx/include/bcmpci.h 1970-01-01 01:00:00.000000000 +0100
5641 +++ linux.dev/arch/mips/bcm963xx/include/bcmpci.h 2006-08-25 00:39:38.000000000 +0200
5642 @@ -0,0 +1,87 @@
5643 +/*
5644 +<:copyright-gpl
5645 + Copyright 2004 Broadcom Corp. All Rights Reserved.
5646 +
5647 + This program is free software; you can distribute it and/or modify it
5648 + under the terms of the GNU General Public License (Version 2) as
5649 + published by the Free Software Foundation.
5650 +
5651 + This program is distributed in the hope it will be useful, but WITHOUT
5652 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5653 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5654 + for more details.
5655 +
5656 + You should have received a copy of the GNU General Public License along
5657 + with this program; if not, write to the Free Software Foundation, Inc.,
5658 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
5659 +:>
5660 +*/
5661 +
5662 +//
5663 +// bcmpci.h - bcm96348 PCI, Cardbus, and PCMCIA definition
5664 +//
5665 +#ifndef BCMPCI_H
5666 +#define BCMPCI_H
5667 +
5668 +/* Memory window in internal system bus address space */
5669 +#define BCM_PCI_MEM_BASE 0x08000000
5670 +/* IO window in internal system bus address space */
5671 +#define BCM_PCI_IO_BASE 0x0C000000
5672 +
5673 +#define BCM_PCI_ADDR_MASK 0x1fffffff
5674 +
5675 +/* Memory window size (range) */
5676 +#define BCM_PCI_MEM_SIZE_16MB 0x01000000
5677 +/* IO window size (range) */
5678 +#define BCM_PCI_IO_SIZE_64KB 0x00010000
5679 +
5680 +/* PCI Configuration and I/O space acesss */
5681 +#define BCM_PCI_CFG(d, f, o) ( (d << 11) | (f << 8) | (o/4 << 2) )
5682 +
5683 +/* fake USB PCI slot */
5684 +#define USB_HOST_SLOT 9
5685 +#define USB_BAR0_MEM_SIZE 0x0800
5686 +
5687 +#define BCM_HOST_MEM_SPACE1 0x10000000
5688 +#define BCM_HOST_MEM_SPACE2 0x00000000
5689 +
5690 +/*
5691 + * EBI bus clock is 33MHz and share with PCI bus
5692 + * each clock cycle is 30ns.
5693 + */
5694 +/* attribute memory access wait cnt for 4306 */
5695 +#define PCMCIA_ATTR_CE_HOLD 3 // data hold time 70ns
5696 +#define PCMCIA_ATTR_CE_SETUP 3 // data setup time 50ns
5697 +#define PCMCIA_ATTR_INACTIVE 6 // time between read/write cycles 180ns. For the total cycle time 600ns (cnt1+cnt2+cnt3+cnt4)
5698 +#define PCMCIA_ATTR_ACTIVE 10 // OE/WE pulse width 300ns
5699 +
5700 +/* common memory access wait cnt for 4306 */
5701 +#define PCMCIA_MEM_CE_HOLD 1 // data hold time 30ns
5702 +#define PCMCIA_MEM_CE_SETUP 1 // data setup time 30ns
5703 +#define PCMCIA_MEM_INACTIVE 2 // time between read/write cycles 40ns. For the total cycle time 250ns (cnt1+cnt2+cnt3+cnt4)
5704 +#define PCMCIA_MEM_ACTIVE 5 // OE/WE pulse width 150ns
5705 +
5706 +#define PCCARD_VCC_MASK 0x00070000 // Mask Reset also
5707 +#define PCCARD_VCC_33V 0x00010000
5708 +#define PCCARD_VCC_50V 0x00020000
5709 +
5710 +typedef enum {
5711 + MPI_CARDTYPE_NONE, // No Card in slot
5712 + MPI_CARDTYPE_PCMCIA, // 16-bit PCMCIA card in slot
5713 + MPI_CARDTYPE_CARDBUS, // 32-bit CardBus card in slot
5714 +} CardType;
5715 +
5716 +#define CARDBUS_SLOT 0 // Slot 0 is default for CardBus
5717 +
5718 +#define pcmciaAttrOffset 0x00200000
5719 +#define pcmciaMemOffset 0x00000000
5720 +// Needs to be right above PCI I/O space. Give 0x8000 (32K) to PCMCIA.
5721 +#define pcmciaIoOffset (BCM_PCI_IO_BASE + 0x80000)
5722 +// Base Address is that mapped into the MPI ChipSelect registers.
5723 +// UBUS bridge MemoryWindow 0 outputs a 0x00 for the base.
5724 +#define pcmciaBase 0xbf000000
5725 +#define pcmciaAttr (pcmciaAttrOffset | pcmciaBase)
5726 +#define pcmciaMem (pcmciaMemOffset | pcmciaBase)
5727 +#define pcmciaIo (pcmciaIoOffset | pcmciaBase)
5728 +
5729 +#endif
5730 diff -urN linux.old/arch/mips/bcm963xx/include/bcmTag.h linux.dev/arch/mips/bcm963xx/include/bcmTag.h
5731 --- linux.old/arch/mips/bcm963xx/include/bcmTag.h 1970-01-01 01:00:00.000000000 +0100
5732 +++ linux.dev/arch/mips/bcm963xx/include/bcmTag.h 2006-08-25 00:39:38.000000000 +0200
5733 @@ -0,0 +1,153 @@
5734 +/*
5735 +<:copyright-gpl
5736 + Copyright 2002 Broadcom Corp. All Rights Reserved.
5737 +
5738 + This program is free software; you can distribute it and/or modify it
5739 + under the terms of the GNU General Public License (Version 2) as
5740 + published by the Free Software Foundation.
5741 +
5742 + This program is distributed in the hope it will be useful, but WITHOUT
5743 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5744 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5745 + for more details.
5746 +
5747 + You should have received a copy of the GNU General Public License along
5748 + with this program; if not, write to the Free Software Foundation, Inc.,
5749 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
5750 +:>
5751 +*/
5752 +//**************************************************************************************
5753 +// File Name : bcmTag.h
5754 +//
5755 +// Description: add tag with validation system to the firmware image file to be uploaded
5756 +// via http
5757 +//
5758 +// Created : 02/28/2002 seanl
5759 +//**************************************************************************************
5760 +
5761 +#ifndef _BCMTAG_H_
5762 +#define _BCMTAG_H_
5763 +
5764 +
5765 +#define BCM_SIG_1 "Broadcom Corporation"
5766 +#define BCM_SIG_2 "ver. 2.0" // was "firmware version 2.0" now it is split 6 char out for chip id.
5767 +
5768 +#define BCM_TAG_VER "6"
5769 +#define BCM_TAG_VER_LAST "26"
5770 +
5771 +// file tag (head) structure all is in clear text except validationTokens (crc, md5, sha1, etc). Total: 128 unsigned chars
5772 +#define TAG_LEN 256
5773 +#define TAG_VER_LEN 4
5774 +#define SIG_LEN 20
5775 +#define SIG_LEN_2 14 // Original second SIG = 20 is now devided into 14 for SIG_LEN_2 and 6 for CHIP_ID
5776 +#define CHIP_ID_LEN 6
5777 +#define IMAGE_LEN 10
5778 +#define ADDRESS_LEN 12
5779 +#define FLAG_LEN 2
5780 +#define TOKEN_LEN 20
5781 +#define BOARD_ID_LEN 16
5782 +#define RESERVED_LEN (TAG_LEN - TAG_VER_LEN - SIG_LEN - SIG_LEN_2 - CHIP_ID_LEN - BOARD_ID_LEN - \
5783 + (4*IMAGE_LEN) - (3*ADDRESS_LEN) - (3*FLAG_LEN) - (2*TOKEN_LEN))
5784 +
5785 +
5786 +// TAG for downloadable image (kernel plus file system)
5787 +typedef struct _FILE_TAG
5788 +{
5789 + unsigned char tagVersion[TAG_VER_LEN]; // tag version. Will be 2 here.
5790 + unsigned char signiture_1[SIG_LEN]; // text line for company info
5791 + unsigned char signiture_2[SIG_LEN_2]; // additional info (can be version number)
5792 + unsigned char chipId[CHIP_ID_LEN]; // chip id
5793 + unsigned char boardId[BOARD_ID_LEN]; // board id
5794 + unsigned char bigEndian[FLAG_LEN]; // if = 1 - big, = 0 - little endia of the host
5795 + unsigned char totalImageLen[IMAGE_LEN]; // the sum of all the following length
5796 + unsigned char cfeAddress[ADDRESS_LEN]; // if non zero, cfe starting address
5797 + unsigned char cfeLen[IMAGE_LEN]; // if non zero, cfe size in clear ASCII text.
5798 + unsigned char rootfsAddress[ADDRESS_LEN]; // if non zero, filesystem starting address
5799 + unsigned char rootfsLen[IMAGE_LEN]; // if non zero, filesystem size in clear ASCII text.
5800 + unsigned char kernelAddress[ADDRESS_LEN]; // if non zero, kernel starting address
5801 + unsigned char kernelLen[IMAGE_LEN]; // if non zero, kernel size in clear ASCII text.
5802 + unsigned char dualImage[FLAG_LEN]; // if 1, dual image
5803 + unsigned char inactiveLen[FLAG_LEN]; // if 1, the image is INACTIVE; if 0, active
5804 + unsigned char reserved[RESERVED_LEN]; // reserved for later use
5805 + unsigned char imageValidationToken[TOKEN_LEN];// image validation token - can be crc, md5, sha; for
5806 + // now will be 4 unsigned char crc
5807 + unsigned char tagValidationToken[TOKEN_LEN]; // validation token for tag(from signiture_1 to end of // mageValidationToken)
5808 +} FILE_TAG, *PFILE_TAG;
5809 +
5810 +#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */
5811 +#define CRC_LEN 4
5812 +
5813 +// only included if for bcmTag.exe program
5814 +#ifdef BCMTAG_EXE_USE
5815 +
5816 +static unsigned long Crc32_table[256] = {
5817 + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
5818 + 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
5819 + 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
5820 + 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
5821 + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
5822 + 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
5823 + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
5824 + 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
5825 + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
5826 + 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
5827 + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
5828 + 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
5829 + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
5830 + 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
5831 + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
5832 + 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
5833 + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
5834 + 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
5835 + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
5836 + 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
5837 + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
5838 + 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
5839 + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
5840 + 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
5841 + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
5842 + 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
5843 + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
5844 + 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
5845 + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
5846 + 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
5847 + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
5848 + 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
5849 + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
5850 + 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
5851 + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
5852 + 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
5853 + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
5854 + 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
5855 + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
5856 + 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
5857 + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
5858 + 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
5859 + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
5860 + 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
5861 + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
5862 + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
5863 + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
5864 + 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
5865 + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
5866 + 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
5867 + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
5868 + 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
5869 + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
5870 + 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
5871 + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
5872 + 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
5873 + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
5874 + 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
5875 + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
5876 + 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
5877 + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
5878 + 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
5879 + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
5880 + 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
5881 +};
5882 +#endif // BCMTAG_USE
5883 +
5884 +
5885 +#endif // _BCMTAG_H_
5886 +
5887 diff -urN linux.old/arch/mips/bcm963xx/include/bcmtypes.h linux.dev/arch/mips/bcm963xx/include/bcmtypes.h
5888 --- linux.old/arch/mips/bcm963xx/include/bcmtypes.h 1970-01-01 01:00:00.000000000 +0100
5889 +++ linux.dev/arch/mips/bcm963xx/include/bcmtypes.h 2006-08-25 00:39:38.000000000 +0200
5890 @@ -0,0 +1,163 @@
5891 +/*
5892 +<:copyright-gpl
5893 + Copyright 2002 Broadcom Corp. All Rights Reserved.
5894 +
5895 + This program is free software; you can distribute it and/or modify it
5896 + under the terms of the GNU General Public License (Version 2) as
5897 + published by the Free Software Foundation.
5898 +
5899 + This program is distributed in the hope it will be useful, but WITHOUT
5900 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5901 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5902 + for more details.
5903 +
5904 + You should have received a copy of the GNU General Public License along
5905 + with this program; if not, write to the Free Software Foundation, Inc.,
5906 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
5907 +:>
5908 +*/
5909 +
5910 +//
5911 +// bcmtypes.h - misc useful typedefs
5912 +//
5913 +#ifndef BCMTYPES_H
5914 +#define BCMTYPES_H
5915 +
5916 +// These are also defined in typedefs.h in the application area, so I need to
5917 +// protect against re-definition.
5918 +
5919 +#ifndef _TYPEDEFS_H_
5920 +typedef unsigned char uint8;
5921 +typedef unsigned short uint16;
5922 +typedef unsigned long uint32;
5923 +typedef signed char int8;
5924 +typedef signed short int16;
5925 +typedef signed long int32;
5926 +#if !defined(__cplusplus)
5927 +typedef int bool;
5928 +#endif
5929 +#endif
5930 +
5931 +typedef unsigned char byte;
5932 +// typedef unsigned long sem_t;
5933 +
5934 +typedef unsigned long HANDLE,*PULONG,DWORD,*PDWORD;
5935 +typedef signed long LONG,*PLONG;
5936 +
5937 +typedef unsigned int *PUINT;
5938 +typedef signed int INT;
5939 +
5940 +typedef unsigned short *PUSHORT;
5941 +typedef signed short SHORT,*PSHORT;
5942 +typedef unsigned short WORD,*PWORD;
5943 +
5944 +typedef unsigned char *PUCHAR;
5945 +typedef signed char *PCHAR;
5946 +
5947 +typedef void *PVOID;
5948 +
5949 +typedef unsigned char BOOLEAN, *PBOOL, *PBOOLEAN;
5950 +
5951 +typedef unsigned char BYTE,*PBYTE;
5952 +
5953 +//#ifndef __GNUC__
5954 +//The following has been defined in Vxworks internally: vxTypesOld.h
5955 +//redefine under vxworks will cause error
5956 +typedef signed int *PINT;
5957 +
5958 +typedef signed char INT8;
5959 +typedef signed short INT16;
5960 +typedef signed long INT32;
5961 +
5962 +typedef unsigned char UINT8;
5963 +typedef unsigned short UINT16;
5964 +typedef unsigned long UINT32;
5965 +
5966 +typedef unsigned char UCHAR;
5967 +typedef unsigned short USHORT;
5968 +typedef unsigned int UINT;
5969 +typedef unsigned long ULONG;
5970 +
5971 +typedef void VOID;
5972 +typedef unsigned char BOOL;
5973 +
5974 +//#endif /* __GNUC__ */
5975 +
5976 +
5977 +// These are also defined in typedefs.h in the application area, so I need to
5978 +// protect against re-definition.
5979 +#ifndef TYPEDEFS_H
5980 +
5981 +// Maximum and minimum values for a signed 16 bit integer.
5982 +#define MAX_INT16 32767
5983 +#define MIN_INT16 -32768
5984 +
5985 +// Useful for true/false return values. This uses the
5986 +// Taligent notation (k for constant).
5987 +typedef enum
5988 +{
5989 + kFalse = 0,
5990 + kTrue = 1
5991 +} Bool;
5992 +
5993 +#endif
5994 +
5995 +/* macros to protect against unaligned accesses */
5996 +
5997 +#if 0
5998 +/* first arg is an address, second is a value */
5999 +#define PUT16( a, d ) { \
6000 + *((byte *)a) = (byte)((d)>>8); \
6001 + *(((byte *)a)+1) = (byte)(d); \
6002 +}
6003 +
6004 +#define PUT32( a, d ) { \
6005 + *((byte *)a) = (byte)((d)>>24); \
6006 + *(((byte *)a)+1) = (byte)((d)>>16); \
6007 + *(((byte *)a)+2) = (byte)((d)>>8); \
6008 + *(((byte *)a)+3) = (byte)(d); \
6009 +}
6010 +
6011 +/* first arg is an address, returns a value */
6012 +#define GET16( a ) ( \
6013 + (*((byte *)a) << 8) | \
6014 + (*(((byte *)a)+1)) \
6015 +)
6016 +
6017 +#define GET32( a ) ( \
6018 + (*((byte *)a) << 24) | \
6019 + (*(((byte *)a)+1) << 16) | \
6020 + (*(((byte *)a)+2) << 8) | \
6021 + (*(((byte *)a)+3)) \
6022 +)
6023 +#endif
6024 +
6025 +#ifndef YES
6026 +#define YES 1
6027 +#endif
6028 +
6029 +#ifndef NO
6030 +#define NO 0
6031 +#endif
6032 +
6033 +#ifndef IN
6034 +#define IN
6035 +#endif
6036 +
6037 +#ifndef OUT
6038 +#define OUT
6039 +#endif
6040 +
6041 +#ifndef TRUE
6042 +#define TRUE 1
6043 +#endif
6044 +
6045 +#ifndef FALSE
6046 +#define FALSE 0
6047 +#endif
6048 +
6049 +#define READ32(addr) (*(volatile UINT32 *)((ULONG)&addr))
6050 +#define READ16(addr) (*(volatile UINT16 *)((ULONG)&addr))
6051 +#define READ8(addr) (*(volatile UINT8 *)((ULONG)&addr))
6052 +
6053 +#endif
6054 diff -urN linux.old/arch/mips/bcm963xx/include/board.h linux.dev/arch/mips/bcm963xx/include/board.h
6055 --- linux.old/arch/mips/bcm963xx/include/board.h 1970-01-01 01:00:00.000000000 +0100
6056 +++ linux.dev/arch/mips/bcm963xx/include/board.h 2006-08-25 01:52:34.000000000 +0200
6057 @@ -0,0 +1,373 @@
6058 +/*
6059 +<:copyright-gpl
6060 + Copyright 2002 Broadcom Corp. All Rights Reserved.
6061 +
6062 + This program is free software; you can distribute it and/or modify it
6063 + under the terms of the GNU General Public License (Version 2) as
6064 + published by the Free Software Foundation.
6065 +
6066 + This program is distributed in the hope it will be useful, but WITHOUT
6067 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6068 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6069 + for more details.
6070 +
6071 + You should have received a copy of the GNU General Public License along
6072 + with this program; if not, write to the Free Software Foundation, Inc.,
6073 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
6074 +:>
6075 +*/
6076 +/***********************************************************************/
6077 +/* */
6078 +/* MODULE: board.h */
6079 +/* DATE: 97/02/18 */
6080 +/* PURPOSE: Board specific information. This module should include */
6081 +/* all base device addresses and board specific macros. */
6082 +/* */
6083 +/***********************************************************************/
6084 +#ifndef _BOARD_H
6085 +#define _BOARD_H
6086 +
6087 +/*****************************************************************************/
6088 +/* Misc board definitions */
6089 +/*****************************************************************************/
6090 +
6091 +#define DYING_GASP_API
6092 +
6093 +/*****************************************************************************/
6094 +/* Physical Memory Map */
6095 +/*****************************************************************************/
6096 +
6097 +#define PHYS_DRAM_BASE 0x00000000 /* Dynamic RAM Base */
6098 +#define PHYS_FLASH_BASE 0x1FC00000 /* Flash Memory */
6099 +
6100 +/*****************************************************************************/
6101 +/* Note that the addresses above are physical addresses and that programs */
6102 +/* have to use converted addresses defined below: */
6103 +/*****************************************************************************/
6104 +#define DRAM_BASE (0x80000000 | PHYS_DRAM_BASE) /* cached DRAM */
6105 +#define DRAM_BASE_NOCACHE (0xA0000000 | PHYS_DRAM_BASE) /* uncached DRAM */
6106 +#define FLASH_BASE (0xA0000000 | PHYS_FLASH_BASE) /* uncached Flash */
6107 +
6108 +/*****************************************************************************/
6109 +/* Select the PLL value to get the desired CPU clock frequency. */
6110 +/* */
6111 +/* */
6112 +/*****************************************************************************/
6113 +#define FPERIPH 50000000
6114 +
6115 +#define ONEK 1024
6116 +#define BLK64K (64*ONEK)
6117 +#define FLASH45_BLKS_BOOT_ROM 1
6118 +#define FLASH45_LENGTH_BOOT_ROM (FLASH45_BLKS_BOOT_ROM * BLK64K)
6119 +#define FLASH_RESERVED_AT_END (64*ONEK) /*reserved for PSI, scratch pad*/
6120 +
6121 +/*****************************************************************************/
6122 +/* Note that the addresses above are physical addresses and that programs */
6123 +/* have to use converted addresses defined below: */
6124 +/*****************************************************************************/
6125 +#define DRAM_BASE (0x80000000 | PHYS_DRAM_BASE) /* cached DRAM */
6126 +#define DRAM_BASE_NOCACHE (0xA0000000 | PHYS_DRAM_BASE) /* uncached DRAM */
6127 +#define FLASH_BASE (0xA0000000 | PHYS_FLASH_BASE) /* uncached Flash */
6128 +
6129 +/*****************************************************************************/
6130 +/* Select the PLL value to get the desired CPU clock frequency. */
6131 +/* */
6132 +/* */
6133 +/*****************************************************************************/
6134 +#define FPERIPH 50000000
6135 +
6136 +#define SDRAM_TYPE_ADDRESS_OFFSET 16
6137 +#define NVRAM_DATA_OFFSET 0x0580
6138 +#define NVRAM_DATA_ID 0x0f1e2d3c
6139 +#define BOARD_SDRAM_TYPE *(unsigned long *) \
6140 + (FLASH_BASE + SDRAM_TYPE_ADDRESS_OFFSET)
6141 +
6142 +#define ONEK 1024
6143 +#define BLK64K (64*ONEK)
6144 +
6145 +// nvram and psi flash definitions for 45
6146 +#define FLASH45_LENGTH_NVRAM ONEK // 1k nvram
6147 +#define NVRAM_PSI_DEFAULT 24 // default psi in K byes
6148 +
6149 +/*****************************************************************************/
6150 +/* NVRAM Offset and definition */
6151 +/*****************************************************************************/
6152 +
6153 +#define NVRAM_VERSION_NUMBER 2
6154 +#define NVRAM_VERSION_NUMBER_ADDRESS 0
6155 +
6156 +#define NVRAM_BOOTLINE_LEN 256
6157 +#define NVRAM_BOARD_ID_STRING_LEN 16
6158 +#define NVRAM_MAC_ADDRESS_LEN 6
6159 +#define NVRAM_MAC_COUNT_MAX 32
6160 +
6161 +/*****************************************************************************/
6162 +/* Misc Offsets */
6163 +/*****************************************************************************/
6164 +
6165 +#define CFE_VERSION_OFFSET 0x0570
6166 +#define CFE_VERSION_MARK_SIZE 5
6167 +#define CFE_VERSION_SIZE 5
6168 +
6169 +typedef struct
6170 +{
6171 + unsigned long ulVersion;
6172 + char szBootline[NVRAM_BOOTLINE_LEN];
6173 + char szBoardId[NVRAM_BOARD_ID_STRING_LEN];
6174 + unsigned long ulReserved1[2];
6175 + unsigned long ulNumMacAddrs;
6176 + unsigned char ucaBaseMacAddr[NVRAM_MAC_ADDRESS_LEN];
6177 + char chReserved[2];
6178 + unsigned long ulCheckSum;
6179 +} NVRAM_DATA, *PNVRAM_DATA;
6180 +
6181 +
6182 +/*****************************************************************************/
6183 +/* board ioctl calls for flash, led and some other utilities */
6184 +/*****************************************************************************/
6185 +
6186 +
6187 +/* Defines. for board driver */
6188 +#define BOARD_IOCTL_MAGIC 'B'
6189 +#define BOARD_DRV_MAJOR 206
6190 +
6191 +#define MAC_ADDRESS_ANY (unsigned long) -1
6192 +
6193 +#define BOARD_IOCTL_FLASH_INIT \
6194 + _IOWR(BOARD_IOCTL_MAGIC, 0, BOARD_IOCTL_PARMS)
6195 +
6196 +#define BOARD_IOCTL_FLASH_WRITE \
6197 + _IOWR(BOARD_IOCTL_MAGIC, 1, BOARD_IOCTL_PARMS)
6198 +
6199 +#define BOARD_IOCTL_FLASH_READ \
6200 + _IOWR(BOARD_IOCTL_MAGIC, 2, BOARD_IOCTL_PARMS)
6201 +
6202 +#define BOARD_IOCTL_GET_NR_PAGES \
6203 + _IOWR(BOARD_IOCTL_MAGIC, 3, BOARD_IOCTL_PARMS)
6204 +
6205 +#define BOARD_IOCTL_DUMP_ADDR \
6206 + _IOWR(BOARD_IOCTL_MAGIC, 4, BOARD_IOCTL_PARMS)
6207 +
6208 +#define BOARD_IOCTL_SET_MEMORY \
6209 + _IOWR(BOARD_IOCTL_MAGIC, 5, BOARD_IOCTL_PARMS)
6210 +
6211 +#define BOARD_IOCTL_MIPS_SOFT_RESET \
6212 + _IOWR(BOARD_IOCTL_MAGIC, 6, BOARD_IOCTL_PARMS)
6213 +
6214 +#define BOARD_IOCTL_LED_CTRL \
6215 + _IOWR(BOARD_IOCTL_MAGIC, 7, BOARD_IOCTL_PARMS)
6216 +
6217 +#define BOARD_IOCTL_GET_ID \
6218 + _IOWR(BOARD_IOCTL_MAGIC, 8, BOARD_IOCTL_PARMS)
6219 +
6220 +#define BOARD_IOCTL_GET_MAC_ADDRESS \
6221 + _IOWR(BOARD_IOCTL_MAGIC, 9, BOARD_IOCTL_PARMS)
6222 +
6223 +#define BOARD_IOCTL_RELEASE_MAC_ADDRESS \
6224 + _IOWR(BOARD_IOCTL_MAGIC, 10, BOARD_IOCTL_PARMS)
6225 +
6226 +#define BOARD_IOCTL_GET_PSI_SIZE \
6227 + _IOWR(BOARD_IOCTL_MAGIC, 11, BOARD_IOCTL_PARMS)
6228 +
6229 +#define BOARD_IOCTL_GET_SDRAM_SIZE \
6230 + _IOWR(BOARD_IOCTL_MAGIC, 12, BOARD_IOCTL_PARMS)
6231 +
6232 +#define BOARD_IOCTL_SET_MONITOR_FD \
6233 + _IOWR(BOARD_IOCTL_MAGIC, 13, BOARD_IOCTL_PARMS)
6234 +
6235 +#define BOARD_IOCTL_WAKEUP_MONITOR_TASK \
6236 + _IOWR(BOARD_IOCTL_MAGIC, 14, BOARD_IOCTL_PARMS)
6237 +
6238 +#define BOARD_IOCTL_GET_BOOTLINE \
6239 + _IOWR(BOARD_IOCTL_MAGIC, 15, BOARD_IOCTL_PARMS)
6240 +
6241 +#define BOARD_IOCTL_SET_BOOTLINE \
6242 + _IOWR(BOARD_IOCTL_MAGIC, 16, BOARD_IOCTL_PARMS)
6243 +
6244 +#define BOARD_IOCTL_GET_BASE_MAC_ADDRESS \
6245 + _IOWR(BOARD_IOCTL_MAGIC, 17, BOARD_IOCTL_PARMS)
6246 +
6247 +#define BOARD_IOCTL_GET_CHIP_ID \
6248 + _IOWR(BOARD_IOCTL_MAGIC, 18, BOARD_IOCTL_PARMS)
6249 +
6250 +#define BOARD_IOCTL_GET_NUM_ENET \
6251 + _IOWR(BOARD_IOCTL_MAGIC, 19, BOARD_IOCTL_PARMS)
6252 +
6253 +#define BOARD_IOCTL_GET_CFE_VER \
6254 + _IOWR(BOARD_IOCTL_MAGIC, 20, BOARD_IOCTL_PARMS)
6255 +
6256 +#define BOARD_IOCTL_GET_ENET_CFG \
6257 + _IOWR(BOARD_IOCTL_MAGIC, 21, BOARD_IOCTL_PARMS)
6258 +
6259 +#define BOARD_IOCTL_GET_WLAN_ANT_INUSE \
6260 + _IOWR(BOARD_IOCTL_MAGIC, 22, BOARD_IOCTL_PARMS)
6261 +
6262 +#define BOARD_IOCTL_SET_TRIGGER_EVENT \
6263 + _IOWR(BOARD_IOCTL_MAGIC, 23, BOARD_IOCTL_PARMS)
6264 +
6265 +#define BOARD_IOCTL_GET_TRIGGER_EVENT \
6266 + _IOWR(BOARD_IOCTL_MAGIC, 24, BOARD_IOCTL_PARMS)
6267 +
6268 +#define BOARD_IOCTL_UNSET_TRIGGER_EVENT \
6269 + _IOWR(BOARD_IOCTL_MAGIC, 25, BOARD_IOCTL_PARMS)
6270 +
6271 +#define BOARD_IOCTL_SET_SES_LED \
6272 + _IOWR(BOARD_IOCTL_MAGIC, 26, BOARD_IOCTL_PARMS)
6273 +
6274 +//<<JUNHON, 2004/09/15, get reset button status , tim hou , 05/04/12
6275 +#define RESET_BUTTON_UP 1
6276 +#define RESET_BUTTON_PRESSDOWN 0
6277 +#define BOARD_IOCTL_GET_RESETHOLD \
6278 + _IOWR(BOARD_IOCTL_MAGIC, 27, BOARD_IOCTL_PARMS)
6279 +//>>JUNHON, 2004/09/15
6280 +
6281 +// for the action in BOARD_IOCTL_PARMS for flash operation
6282 +typedef enum
6283 +{
6284 + PERSISTENT,
6285 + NVRAM,
6286 + BCM_IMAGE_CFE,
6287 + BCM_IMAGE_FS,
6288 + BCM_IMAGE_KERNEL,
6289 + BCM_IMAGE_WHOLE,
6290 + SCRATCH_PAD,
6291 + FLASH_SIZE,
6292 +} BOARD_IOCTL_ACTION;
6293 +
6294 +
6295 +typedef struct boardIoctParms
6296 +{
6297 + char *string;
6298 + char *buf;
6299 + int strLen;
6300 + int offset;
6301 + BOARD_IOCTL_ACTION action; /* flash read/write: nvram, persistent, bcm image */
6302 + int result;
6303 +} BOARD_IOCTL_PARMS;
6304 +
6305 +
6306 +// LED defines
6307 +typedef enum
6308 +{
6309 + kLedAdsl,
6310 + kLedWireless,
6311 + kLedUsb,
6312 + kLedHpna,
6313 + kLedWanData,
6314 + kLedPPP,
6315 + kLedVoip,
6316 + kLedSes,
6317 + kLedLan,
6318 + kLedSelfTest,
6319 + kLedEnd, // NOTE: Insert the new led name before this one. Alway stay at the end.
6320 +} BOARD_LED_NAME;
6321 +
6322 +typedef enum
6323 +{
6324 + kLedStateOff, /* turn led off */
6325 + kLedStateOn, /* turn led on */
6326 + kLedStateFail, /* turn led on red */
6327 + kLedStateBlinkOnce, /* blink once, ~100ms and ignore the same call during the 100ms period */
6328 + kLedStateSlowBlinkContinues, /* slow blink continues at ~600ms interval */
6329 + kLedStateFastBlinkContinues, /* fast blink continues at ~200ms interval */
6330 +} BOARD_LED_STATE;
6331 +
6332 +
6333 +// virtual and physical map pair defined in board.c
6334 +typedef struct ledmappair
6335 +{
6336 + BOARD_LED_NAME ledName; // virtual led name
6337 + BOARD_LED_STATE ledInitState; // initial led state when the board boots.
6338 + unsigned short ledMask; // physical GPIO pin mask
6339 + unsigned short ledActiveLow; // reset bit to turn on LED
6340 + unsigned short ledMaskFail; // physical GPIO pin mask for state failure
6341 + unsigned short ledActiveLowFail;// reset bit to turn on LED
6342 +} LED_MAP_PAIR, *PLED_MAP_PAIR;
6343 +
6344 +typedef void (*HANDLE_LED_FUNC)(BOARD_LED_NAME ledName, BOARD_LED_STATE ledState);
6345 +
6346 +/* Flash storage address information that is determined by the flash driver. */
6347 +typedef struct flashaddrinfo
6348 +{
6349 + int flash_persistent_start_blk;
6350 + int flash_persistent_number_blk;
6351 + int flash_persistent_length;
6352 + unsigned long flash_persistent_blk_offset;
6353 + int flash_scratch_pad_start_blk; // start before psi (SP_BUF_LEN)
6354 + int flash_scratch_pad_number_blk;
6355 + int flash_scratch_pad_length;
6356 + unsigned long flash_scratch_pad_blk_offset;
6357 + int flash_nvram_start_blk;
6358 + int flash_nvram_number_blk;
6359 + int flash_nvram_length;
6360 + unsigned long flash_nvram_blk_offset;
6361 +} FLASH_ADDR_INFO, *PFLASH_ADDR_INFO;
6362 +
6363 +// scratch pad defines
6364 +/* SP - Persisten Scratch Pad format:
6365 + sp header : 32 bytes
6366 + tokenId-1 : 8 bytes
6367 + tokenId-1 len : 4 bytes
6368 + tokenId-1 data
6369 + ....
6370 + tokenId-n : 8 bytes
6371 + tokenId-n len : 4 bytes
6372 + tokenId-n data
6373 +*/
6374 +
6375 +#define MAGIC_NUM_LEN 8
6376 +#define MAGIC_NUMBER "gOGoBrCm"
6377 +#define TOKEN_NAME_LEN 16
6378 +#define SP_VERSION 1
6379 +#define SP_MAX_LEN 8 * 1024 // 8k buf before psi
6380 +#define SP_RESERVERD 16
6381 +
6382 +typedef struct _SP_HEADER
6383 +{
6384 + char SPMagicNum[MAGIC_NUM_LEN]; // 8 bytes of magic number
6385 + int SPVersion; // version number
6386 + int SPUsedLen; // used sp len
6387 + char SPReserved[SP_RESERVERD]; // reservied, total 32 bytes
6388 +} SP_HEADER, *PSP_HEADER;
6389 +
6390 +typedef struct _TOKEN_DEF
6391 +{
6392 + char tokenName[TOKEN_NAME_LEN];
6393 + int tokenLen;
6394 +} SP_TOKEN, *PSP_TOKEN;
6395 +
6396 +
6397 +/*****************************************************************************/
6398 +/* Function Prototypes */
6399 +/*****************************************************************************/
6400 +#if !defined(__ASM_ASM_H)
6401 +void dumpaddr( unsigned char *pAddr, int nLen );
6402 +
6403 +int kerSysNvRamGet(char *string, int strLen, int offset);
6404 +int kerSysNvRamSet(char *string, int strLen, int offset);
6405 +int kerSysPersistentGet(char *string, int strLen, int offset);
6406 +int kerSysPersistentSet(char *string, int strLen, int offset);
6407 +int kerSysScratchPadGet(char *tokName, char *tokBuf, int tokLen);
6408 +int kerSysScratchPadSet(char *tokName, char *tokBuf, int tokLen);
6409 +int kerSysBcmImageSet( int flash_start_addr, char *string, int size);
6410 +int kerSysGetMacAddress( unsigned char *pucaAddr, unsigned long ulId );
6411 +int kerSysReleaseMacAddress( unsigned char *pucaAddr );
6412 +int kerSysGetSdramSize( void );
6413 +void kerSysGetBootline(char *string, int strLen);
6414 +void kerSysSetBootline(char *string, int strLen);
6415 +void kerSysMipsSoftReset(void);
6416 +void kerSysLedCtrl(BOARD_LED_NAME, BOARD_LED_STATE);
6417 +void kerSysLedRegisterHwHandler( BOARD_LED_NAME, HANDLE_LED_FUNC, int );
6418 +int kerSysFlashSizeGet(void);
6419 +void kerSysRegisterDyingGaspHandler(char *devname, void *cbfn, void *context);
6420 +void kerSysDeregisterDyingGaspHandler(char *devname);
6421 +void kerSysWakeupMonitorTask( void );
6422 +#endif
6423 +
6424 +#define BOOT_CFE 0
6425 +#define BOOT_REDBOOT 1
6426 +
6427 +extern int boot_loader_type;
6428 +
6429 +#endif /* _BOARD_H */
6430 +
6431 diff -urN linux.old/arch/mips/bcm963xx/int-handler.S linux.dev/arch/mips/bcm963xx/int-handler.S
6432 --- linux.old/arch/mips/bcm963xx/int-handler.S 1970-01-01 01:00:00.000000000 +0100
6433 +++ linux.dev/arch/mips/bcm963xx/int-handler.S 2006-08-25 02:13:33.000000000 +0200
6434 @@ -0,0 +1,59 @@
6435 +/*
6436 +<:copyright-gpl
6437 + Copyright 2002 Broadcom Corp. All Rights Reserved.
6438 +
6439 + This program is free software; you can distribute it and/or modify it
6440 + under the terms of the GNU General Public License (Version 2) as
6441 + published by the Free Software Foundation.
6442 +
6443 + This program is distributed in the hope it will be useful, but WITHOUT
6444 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6445 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6446 + for more details.
6447 +
6448 + You should have received a copy of the GNU General Public License along
6449 + with this program; if not, write to the Free Software Foundation, Inc.,
6450 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
6451 +:>
6452 +*/
6453 +/*
6454 + * Generic interrupt handler for Broadcom MIPS boards
6455 + */
6456 +
6457 +#include <linux/autoconf.h>
6458 +
6459 +#include <asm/asm.h>
6460 +#include <asm/mipsregs.h>
6461 +#include <asm/regdef.h>
6462 +#include <asm/stackframe.h>
6463 +
6464 +/*
6465 + * MIPS IRQ Source
6466 + * -------- ------
6467 + * 0 Software (ignored)
6468 + * 1 Software (ignored)
6469 + * 2 Combined hardware interrupt (hw0)
6470 + * 3 Hardware
6471 + * 4 Hardware
6472 + * 5 Hardware
6473 + * 6 Hardware
6474 + * 7 R4k timer
6475 + */
6476 +
6477 + .text
6478 + .set noreorder
6479 + .set noat
6480 + .align 5
6481 + NESTED(brcmIRQ, PT_SIZE, sp)
6482 + SAVE_ALL
6483 + CLI
6484 + .set noreorder
6485 + .set at
6486 +
6487 + jal plat_irq_dispatch
6488 + move a0, sp
6489 +
6490 + j ret_from_irq
6491 + nop
6492 +
6493 + END(brcmIRQ)
6494 diff -urN linux.old/arch/mips/bcm963xx/irq.c linux.dev/arch/mips/bcm963xx/irq.c
6495 --- linux.old/arch/mips/bcm963xx/irq.c 1970-01-01 01:00:00.000000000 +0100
6496 +++ linux.dev/arch/mips/bcm963xx/irq.c 2006-08-25 03:54:34.000000000 +0200
6497 @@ -0,0 +1,256 @@
6498 +/*
6499 +<:copyright-gpl
6500 + Copyright 2002 Broadcom Corp. All Rights Reserved.
6501 +
6502 + This program is free software; you can distribute it and/or modify it
6503 + under the terms of the GNU General Public License (Version 2) as
6504 + published by the Free Software Foundation.
6505 +
6506 + This program is distributed in the hope it will be useful, but WITHOUT
6507 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6508 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6509 + for more details.
6510 +
6511 + You should have received a copy of the GNU General Public License along
6512 + with this program; if not, write to the Free Software Foundation, Inc.,
6513 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
6514 +:>
6515 +*/
6516 +/*
6517 + * Interrupt control functions for Broadcom 963xx MIPS boards
6518 + */
6519 +
6520 +#include <asm/atomic.h>
6521 +
6522 +#include <linux/delay.h>
6523 +#include <linux/init.h>
6524 +#include <linux/ioport.h>
6525 +#include <linux/irq.h>
6526 +#include <linux/interrupt.h>
6527 +#include <linux/kernel.h>
6528 +#include <linux/slab.h>
6529 +#include <linux/module.h>
6530 +
6531 +#include <asm/irq.h>
6532 +#include <asm/mipsregs.h>
6533 +#include <asm/addrspace.h>
6534 +#include <asm/signal.h>
6535 +#include <bcm_map_part.h>
6536 +#include <bcm_intr.h>
6537 +
6538 +static void irq_dispatch_int(struct pt_regs *regs)
6539 +{
6540 + unsigned int pendingIrqs;
6541 + static unsigned int irqBit;
6542 + static unsigned int isrNumber = 31;
6543 +
6544 + pendingIrqs = PERF->IrqStatus & PERF->IrqMask;
6545 + if (!pendingIrqs) {
6546 + return;
6547 + }
6548 +
6549 + while (1) {
6550 + irqBit <<= 1;
6551 + isrNumber++;
6552 + if (isrNumber == 32) {
6553 + isrNumber = 0;
6554 + irqBit = 0x1;
6555 + }
6556 + if (pendingIrqs & irqBit) {
6557 + PERF->IrqMask &= ~irqBit; // mask
6558 + do_IRQ(isrNumber + INTERNAL_ISR_TABLE_OFFSET);
6559 + break;
6560 + }
6561 + }
6562 +}
6563 +
6564 +static void irq_dispatch_ext(uint32 irq)
6565 +{
6566 + if (!(PERF->ExtIrqCfg & (1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_MASK_SHFT)))) {
6567 + printk("**** Ext IRQ mask. Should not dispatch ****\n");
6568 + }
6569 + /* disable and clear interrupt in the controller */
6570 + PERF->ExtIrqCfg |= (1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_CLEAR_SHFT));
6571 + PERF->ExtIrqCfg &= ~(1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_MASK_SHFT));
6572 + do_IRQ(irq);
6573 +}
6574 +
6575 +
6576 +extern void brcm_timer_interrupt(struct pt_regs *regs);
6577 +
6578 +asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
6579 +{
6580 + u32 cause;
6581 + while((cause = (read_c0_cause()& CAUSEF_IP))) {
6582 + if (cause & CAUSEF_IP7)
6583 + brcm_timer_interrupt(regs);
6584 + else if (cause & CAUSEF_IP2)
6585 + irq_dispatch_int(regs);
6586 + else if (cause & CAUSEF_IP3)
6587 + irq_dispatch_ext(INTERRUPT_ID_EXTERNAL_0);
6588 + else if (cause & CAUSEF_IP4)
6589 + irq_dispatch_ext(INTERRUPT_ID_EXTERNAL_1);
6590 + else if (cause & CAUSEF_IP5)
6591 + irq_dispatch_ext(INTERRUPT_ID_EXTERNAL_2);
6592 + else if (cause & CAUSEF_IP6)
6593 + irq_dispatch_ext(INTERRUPT_ID_EXTERNAL_3);
6594 + local_irq_disable();
6595 + }
6596 +}
6597 +
6598 +
6599 +void enable_brcm_irq(unsigned int irq)
6600 +{
6601 + unsigned long flags;
6602 +
6603 + local_irq_save(flags);
6604 + if( irq >= INTERNAL_ISR_TABLE_OFFSET ) {
6605 + PERF->IrqMask |= (1 << (irq - INTERNAL_ISR_TABLE_OFFSET));
6606 + }
6607 + else if (irq >= INTERRUPT_ID_EXTERNAL_0 && irq <= INTERRUPT_ID_EXTERNAL_3) {
6608 + /* enable and clear interrupt in the controller */
6609 + PERF->ExtIrqCfg |= (1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_CLEAR_SHFT));
6610 + PERF->ExtIrqCfg |= (1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_MASK_SHFT));
6611 + }
6612 + local_irq_restore(flags);
6613 +}
6614 +
6615 +void disable_brcm_irq(unsigned int irq)
6616 +{
6617 + unsigned long flags;
6618 +
6619 + local_irq_save(flags);
6620 + if( irq >= INTERNAL_ISR_TABLE_OFFSET ) {
6621 + PERF->IrqMask &= ~(1 << (irq - INTERNAL_ISR_TABLE_OFFSET));
6622 + }
6623 + else if (irq >= INTERRUPT_ID_EXTERNAL_0 && irq <= INTERRUPT_ID_EXTERNAL_3) {
6624 + /* disable interrupt in the controller */
6625 + PERF->ExtIrqCfg &= ~(1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_MASK_SHFT));
6626 + }
6627 + local_irq_restore(flags);
6628 +}
6629 +
6630 +void ack_brcm_irq(unsigned int irq)
6631 +{
6632 + /* Already done in brcm_irq_dispatch */
6633 +}
6634 +
6635 +unsigned int startup_brcm_irq(unsigned int irq)
6636 +{
6637 + enable_brcm_irq(irq);
6638 +
6639 + return 0; /* never anything pending */
6640 +}
6641 +
6642 +unsigned int startup_brcm_none(unsigned int irq)
6643 +{
6644 + return 0;
6645 +}
6646 +
6647 +void end_brcm_irq(unsigned int irq)
6648 +{
6649 + if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
6650 + enable_brcm_irq(irq);
6651 +}
6652 +
6653 +void end_brcm_none(unsigned int irq)
6654 +{
6655 +}
6656 +
6657 +static struct hw_interrupt_type brcm_irq_type = {
6658 + .typename = "MIPS",
6659 + .startup = startup_brcm_irq,
6660 + .shutdown = disable_brcm_irq,
6661 + .enable = enable_brcm_irq,
6662 + .disable = disable_brcm_irq,
6663 + .ack = ack_brcm_irq,
6664 + .end = end_brcm_irq,
6665 + .set_affinity = NULL
6666 +};
6667 +
6668 +static struct hw_interrupt_type brcm_irq_no_end_type = {
6669 + .typename = "MIPS",
6670 + .startup = startup_brcm_none,
6671 + .shutdown = disable_brcm_irq,
6672 + .enable = enable_brcm_irq,
6673 + .disable = disable_brcm_irq,
6674 + .ack = ack_brcm_irq,
6675 + .end = end_brcm_none,
6676 + .set_affinity = NULL
6677 +};
6678 +
6679 +void __init arch_init_irq(void)
6680 +{
6681 + int i;
6682 +
6683 + clear_c0_status(ST0_BEV);
6684 + change_c0_status(ST0_IM, (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4));
6685 +
6686 + for (i = 0; i < NR_IRQS; i++) {
6687 + irq_desc[i].status = IRQ_DISABLED;
6688 + irq_desc[i].action = 0;
6689 + irq_desc[i].depth = 1;
6690 + irq_desc[i].handler = &brcm_irq_type;
6691 + }
6692 +}
6693 +
6694 +int request_external_irq(unsigned int irq,
6695 + FN_HANDLER handler,
6696 + unsigned long irqflags,
6697 + const char * devname,
6698 + void *dev_id)
6699 +{
6700 + unsigned long flags;
6701 +
6702 + local_irq_save(flags);
6703 +
6704 + PERF->ExtIrqCfg |= (1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_CLEAR_SHFT)); // Clear
6705 + PERF->ExtIrqCfg &= ~(1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_MASK_SHFT)); // Mask
6706 + PERF->ExtIrqCfg &= ~(1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_INSENS_SHFT)); // Edge insesnsitive
6707 + PERF->ExtIrqCfg |= (1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_LEVEL_SHFT)); // Level triggered
6708 + PERF->ExtIrqCfg &= ~(1 << (irq - INTERRUPT_ID_EXTERNAL_0 + EI_SENSE_SHFT)); // Low level
6709 +
6710 + local_irq_restore(flags);
6711 +
6712 + return( request_irq(irq, handler, irqflags, devname, dev_id) );
6713 +}
6714 +
6715 +/* VxWorks compatibility function(s). */
6716 +
6717 +unsigned int BcmHalMapInterrupt(FN_HANDLER pfunc, unsigned int param,
6718 + unsigned int interruptId)
6719 +{
6720 + int nRet = -1;
6721 + char *devname;
6722 +
6723 + devname = kmalloc(16, GFP_KERNEL);
6724 + if (devname)
6725 + sprintf( devname, "brcm_%d", interruptId );
6726 +
6727 + /* Set the IRQ description to not automatically enable the interrupt at
6728 + * the end of an ISR. The driver that handles the interrupt must
6729 + * explicitly call BcmHalInterruptEnable or enable_brcm_irq. This behavior
6730 + * is consistent with interrupt handling on VxWorks.
6731 + */
6732 + irq_desc[interruptId].handler = &brcm_irq_no_end_type;
6733 +
6734 + if( interruptId >= INTERNAL_ISR_TABLE_OFFSET )
6735 + {
6736 + nRet = request_irq( interruptId, pfunc, SA_SAMPLE_RANDOM | SA_INTERRUPT,
6737 + devname, (void *) param );
6738 + }
6739 + else if (interruptId >= INTERRUPT_ID_EXTERNAL_0 && interruptId <= INTERRUPT_ID_EXTERNAL_3)
6740 + {
6741 + nRet = request_external_irq( interruptId, pfunc, SA_SAMPLE_RANDOM | SA_INTERRUPT,
6742 + devname, (void *) param );
6743 + }
6744 +
6745 + return( nRet );
6746 +}
6747 +
6748 +
6749 +EXPORT_SYMBOL(enable_brcm_irq);
6750 +EXPORT_SYMBOL(disable_brcm_irq);
6751 +EXPORT_SYMBOL(request_external_irq);
6752 +EXPORT_SYMBOL(BcmHalMapInterrupt);
6753 +
6754 diff -urN linux.old/arch/mips/bcm963xx/Kconfig linux.dev/arch/mips/bcm963xx/Kconfig
6755 --- linux.old/arch/mips/bcm963xx/Kconfig 1970-01-01 01:00:00.000000000 +0100
6756 +++ linux.dev/arch/mips/bcm963xx/Kconfig 2006-08-25 01:22:39.000000000 +0200
6757 @@ -0,0 +1,138 @@
6758 +# Kernel and Driver configuration for Broadcom Commengine ADSL board
6759 +choice
6760 + prompt "Broadcom Commengine ADSL board"
6761 + depends on BCM963XX
6762 + default BCM96345
6763 + help
6764 + Select different Broadcom ADSL board
6765 +
6766 +config BCM96338
6767 + bool "96338 ADSL board"
6768 + select DMA_NONCOHERENT
6769 + select HW_HAS_PCI
6770 +
6771 +config BCM96345
6772 + bool "96345 ADSL board"
6773 + select DMA_NONCOHERENT
6774 + select HW_HAS_PCI
6775 +
6776 +config BCM96348
6777 + bool "96348 ADSL board"
6778 + select DMA_NONCOHERENT
6779 + select HW_HAS_PCI
6780 +
6781 +endchoice
6782 +
6783 +config BCM_BOARD
6784 + bool "Support for Broadcom Board"
6785 + depends on BCM96338 || BCM96345 || BCM96348
6786 +
6787 +config BCM_SERIAL
6788 + bool "Support for Serial Port"
6789 + depends on BCM96338 || BCM96345 || BCM96348
6790 +
6791 +config BCM_ENET
6792 + tristate "Support for Ethernet"
6793 + depends on BCM96338 || BCM96345 || BCM96348
6794 +
6795 +config BCM_USB
6796 + tristate "Support for USB"
6797 + depends on BCM96338 || BCM96345 || BCM96348
6798 +
6799 +config BCM_WLAN
6800 + tristate "Support for Wireless"
6801 + depends on BCM96338 || BCM96345 || BCM96348
6802 +
6803 +config BCM_PCI
6804 + bool "Support for PCI"
6805 + depends on BCM96338 || BCM96345 || BCM96348
6806 + select PCI
6807 +
6808 +config BCM_ATMAPI
6809 + tristate "Support for ATM"
6810 + depends on BCM96338 || BCM96345 || BCM96348
6811 +
6812 +config BCM_ATMTEST
6813 + tristate "Support for ATM Diagnostic"
6814 + depends on BCM96338 || BCM96345 || BCM96348
6815 +
6816 +config BCM_ADSL
6817 + tristate "Support for ADSL"
6818 + depends on BCM96338 || BCM96345 || BCM96348
6819 +
6820 +config BCM_ENDPOINT
6821 + tristate "Support for VOICE"
6822 + depends on BCM96338 || BCM96345 || BCM96348
6823 +
6824 +config BCM_PROCFS
6825 + tristate "Support for PROCFS"
6826 + depends on BCM96338 || BCM96345 || BCM96348
6827 +
6828 +config BCM_VDSL
6829 + tristate "Support for VDSL"
6830 + depends on BCM96338 || BCM96345 || BCM96348
6831 +
6832 +config BCM_SECURITY
6833 + tristate "Support for SECURITY"
6834 + depends on BCM96338 || BCM96345 || BCM96348
6835 +
6836 +config BCM_HPNA
6837 + tristate "Support for HPNA"
6838 + depends on BCM96338 || BCM96345 || BCM96348
6839 +
6840 +config BCM_BOARD_IMPL
6841 + int "Implementation index for ADSL Board"
6842 + depends on BCM96338 || BCM96345 || BCM96348
6843 +
6844 +config BCM_SERIAL_IMPL
6845 + int "Implementation index for Serial"
6846 + depends on BCM96338 || BCM96345 || BCM96348
6847 +
6848 +config BCM_ENET_IMPL
6849 + int "Implementation index for Ethernet"
6850 + depends on BCM96338 || BCM96345 || BCM96348
6851 +
6852 +config BCM_USB_IMPL
6853 + int "Implementation index for USB"
6854 + depends on BCM96338 || BCM96345 || BCM96348
6855 +
6856 +config BCM_WLAN_IMPL
6857 + int "Implementation index for WIRELESS"
6858 + depends on BCM96338 || BCM96345 || BCM96348
6859 +
6860 +config BCM_ATMAPI_IMPL
6861 + int "Implementation index for ATM"
6862 + depends on BCM96338 || BCM96345 || BCM96348
6863 +
6864 +config BCM_ATMTEST_IMPL
6865 + int "Implementation index for ATM Diagnostic"
6866 + depends on BCM96338 || BCM96345 || BCM96348
6867 +
6868 +config BCM_BLAA_IMPL
6869 + int "Implementation index for BLAA"
6870 + depends on BCM96338 || BCM96345 || BCM96348
6871 +
6872 +config BCM_ADSL_IMPL
6873 + int "Implementation index for ADSL"
6874 + depends on BCM96338 || BCM96345 || BCM96348
6875 +
6876 +config BCM_ENDPOINT_IMPL
6877 + int "Implementation index for VOICE"
6878 + depends on BCM96338 || BCM96345 || BCM96348
6879 +
6880 +config BCM_PROCFS_IMPL
6881 + int "Implementation index for PROCFS"
6882 + depends on BCM96338 || BCM96345 || BCM96348
6883 +
6884 +config BCM_VDSL_IMPL
6885 + int "Implementation index for VDSL"
6886 + depends on BCM96338 || BCM96345 || BCM96348
6887 +
6888 +config BCM_SECURITY_IMPL
6889 + int "Implementation index for SECURITY"
6890 + depends on BCM96338 || BCM96345 || BCM96348
6891 +
6892 +config BCM_HPNA_IMPL
6893 + int "Implementation index for HPNA"
6894 + depends on BCM96338 || BCM96345 || BCM96348
6895 +
6896 diff -urN linux.old/arch/mips/bcm963xx/Makefile linux.dev/arch/mips/bcm963xx/Makefile
6897 --- linux.old/arch/mips/bcm963xx/Makefile 1970-01-01 01:00:00.000000000 +0100
6898 +++ linux.dev/arch/mips/bcm963xx/Makefile 2006-08-25 02:04:27.000000000 +0200
6899 @@ -0,0 +1,23 @@
6900 +#
6901 +# Makefile for generic Broadcom MIPS boards
6902 +#
6903 +# Copyright (C) 2004 Broadcom Corporation
6904 +#
6905 +obj-y := irq.o prom.o setup.o time.o ser_init.o bcm63xx_led.o board.o boardparms.o int-handler.o
6906 +
6907 +SRCBASE := $(TOPDIR)
6908 +EXTRA_CFLAGS += -I$(SRCBASE)/include
6909 +#EXTRA_CFLAGS += -I$(INC_ADSLDRV_PATH) -DDBG
6910 +EXTRA_CFLAGS += -I$(INC_ADSLDRV_PATH)
6911 +
6912 +
6913 +ifeq "$(ADSL)" "ANNEX_B"
6914 +EXTRA_CFLAGS += -DADSL_ANNEXB
6915 +endif
6916 +ifeq "$(ADSL)" "SADSL"
6917 +EXTRA_CFLAGS += -DADSL_SADSL
6918 +endif
6919 +ifeq "$(ADSL)" "ANNEX_C"
6920 +EXTRA_CFLAGS += -DADSL_ANNEXC
6921 +endif
6922 +
6923 diff -urN linux-2.6.17/arch/mips/bcm963xx/prom.c linux-2.6.17-brcm63xx/arch/mips/bcm963xx/prom.c
6924 --- linux-2.6.17/arch/mips/bcm963xx/prom.c 1970-01-01 01:00:00.000000000 +0100
6925 +++ linux-2.6.17-brcm63xx/arch/mips/bcm963xx/prom.c 2006-08-29 07:10:10.000000000 +0200
6926 @@ -0,0 +1,143 @@
6927 +/*
6928 +<:copyright-gpl
6929 + Copyright 2004 Broadcom Corp. All Rights Reserved.
6930 +
6931 + This program is free software; you can distribute it and/or modify it
6932 + under the terms of the GNU General Public License (Version 2) as
6933 + published by the Free Software Foundation.
6934 +
6935 + This program is distributed in the hope it will be useful, but WITHOUT
6936 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6937 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
6938 + for more details.
6939 +
6940 + You should have received a copy of the GNU General Public License along
6941 + with this program; if not, write to the Free Software Foundation, Inc.,
6942 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
6943 +:>
6944 +*/
6945 +/*
6946 + * prom.c: PROM library initialization code.
6947 + *
6948 + */
6949 +#include <linux/init.h>
6950 +#include <linux/mm.h>
6951 +#include <linux/sched.h>
6952 +#include <linux/bootmem.h>
6953 +#include <linux/blkdev.h>
6954 +#include <asm/addrspace.h>
6955 +#include <asm/bootinfo.h>
6956 +#include <asm/cpu.h>
6957 +#include <asm/time.h>
6958 +
6959 +#include <bcm_map_part.h>
6960 +#include <board.h>
6961 +#include "boardparms.h"
6962 +#include "softdsl/AdslCoreDefs.h"
6963 +
6964 +
6965 +//char arcs_cmdline[CL_SIZE] __initdata = {0};
6966 +/* inv_xde */
6967 +int boot_loader_type;
6968 +int prom_argc;
6969 +char **prom_argv, **prom_envp;
6970 +
6971 +extern int do_syslog(int, char *, int);
6972 +extern void serial_init(void);
6973 +extern void __init InitNvramInfo( void );
6974 +extern void kerSysFlashInit( void );
6975 +extern unsigned long get_nvram_start_addr(void);
6976 +void __init create_root_nfs_cmdline( char *cmdline );
6977 +
6978 +#define MACH_BCM MACH_BCM96348
6979 +
6980 +const char *get_system_type(void)
6981 +{
6982 + /*PNVRAM_DATA pNvramData = (PNVRAM_DATA) get_nvram_start_addr();
6983 +
6984 + return( pNvramData->szBoardId );*/
6985 + return "brcm63xx";
6986 +}
6987 +
6988 +unsigned long getMemorySize(void)
6989 +{
6990 + unsigned long ulSdramType = BOARD_SDRAM_TYPE;
6991 +
6992 + unsigned long ulSdramSize;
6993 +
6994 + switch( ulSdramType )
6995 + {
6996 + case BP_MEMORY_16MB_1_CHIP:
6997 + case BP_MEMORY_16MB_2_CHIP:
6998 + ulSdramSize = 16 * 1024 * 1024;
6999 + break;
7000 + case BP_MEMORY_32MB_1_CHIP:
7001 + case BP_MEMORY_32MB_2_CHIP:
7002 + ulSdramSize = 32 * 1024 * 1024;
7003 + break;
7004 + case BP_MEMORY_64MB_2_CHIP:
7005 + ulSdramSize = 64 * 1024 * 1024;
7006 + break;
7007 + default:
7008 + ulSdramSize = 8 * 1024 * 1024;
7009 + break;
7010 + }
7011 + if (boot_loader_type == BOOT_CFE)
7012 + return ulSdramSize;
7013 + else
7014 + // assume that there is one contiguous memory map
7015 + return boot_mem_map.map[0].size;
7016 +}
7017 +
7018 +/* --------------------------------------------------------------------------
7019 + Name: prom_init
7020 + -------------------------------------------------------------------------- */
7021 +void __init prom_init(void)
7022 +{
7023 + extern ulong r4k_interval;
7024 +
7025 + serial_init();
7026 +
7027 + prom_argc = fw_arg0;
7028 + prom_argv = (char **) fw_arg1;
7029 + prom_envp = (char **) fw_arg2;
7030 +
7031 + if ((prom_argv > 0x80000000) && (prom_argv < 0x82000000)) {
7032 + strncpy(arcs_cmdline, prom_argv[1], CL_SIZE);
7033 + }
7034 +
7035 + if (strncmp(arcs_cmdline, "boot_loader=RedBoot", 19) != 0) {
7036 + boot_loader_type = BOOT_CFE;
7037 + }
7038 + else {
7039 + boot_loader_type = BOOT_REDBOOT;
7040 + }
7041 +
7042 + do_syslog(8, NULL, 8);
7043 +
7044 + printk( "%s prom init\n", get_system_type() );
7045 +
7046 + PERF->IrqMask = 0;
7047 +
7048 + arcs_cmdline[0] = '\0';
7049 +
7050 + if (boot_loader_type == BOOT_CFE)
7051 + add_memory_region(0, (getMemorySize() - ADSL_SDRAM_IMAGE_SIZE), BOOT_MEM_RAM);
7052 + else
7053 + add_memory_region(0, (0x01000000 - ADSL_SDRAM_IMAGE_SIZE), BOOT_MEM_RAM);
7054 +
7055 + mips_machgroup = MACH_GROUP_BRCM;
7056 + mips_machtype = MACH_BCM;
7057 +
7058 + BpSetBoardId("96348GW-10");
7059 +}
7060 +
7061 +/* --------------------------------------------------------------------------
7062 + Name: prom_free_prom_memory
7063 +Abstract:
7064 + -------------------------------------------------------------------------- */
7065 +void __init prom_free_prom_memory(void)
7066 +{
7067 +
7068 +}
7069 +
7070 diff -urN linux.old/arch/mips/bcm963xx/ser_init.c linux.dev/arch/mips/bcm963xx/ser_init.c
7071 --- linux.old/arch/mips/bcm963xx/ser_init.c 1970-01-01 01:00:00.000000000 +0100
7072 +++ linux.dev/arch/mips/bcm963xx/ser_init.c 2006-08-25 00:39:38.000000000 +0200
7073 @@ -0,0 +1,180 @@
7074 +/*
7075 +<:copyright-gpl
7076 + Copyright 2004 Broadcom Corp. All Rights Reserved.
7077 +
7078 + This program is free software; you can distribute it and/or modify it
7079 + under the terms of the GNU General Public License (Version 2) as
7080 + published by the Free Software Foundation.
7081 +
7082 + This program is distributed in the hope it will be useful, but WITHOUT
7083 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7084 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7085 + for more details.
7086 +
7087 + You should have received a copy of the GNU General Public License along
7088 + with this program; if not, write to the Free Software Foundation, Inc.,
7089 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
7090 +:>
7091 +*/
7092 +/*
7093 + * Broadcom bcm63xx serial port initialization, also prepare for printk
7094 + * by registering with console_init
7095 + *
7096 + */
7097 +
7098 +#include <linux/autoconf.h>
7099 +#include <linux/init.h>
7100 +#include <linux/interrupt.h>
7101 +#include <linux/kernel.h>
7102 +#include <linux/types.h>
7103 +#include <linux/console.h>
7104 +#include <linux/sched.h>
7105 +
7106 +#include <asm/addrspace.h>
7107 +#include <asm/irq.h>
7108 +#include <asm/reboot.h>
7109 +#include <asm/gdb-stub.h>
7110 +#include <asm/mc146818rtc.h>
7111 +
7112 +#include <bcm_map_part.h>
7113 +#include <board.h>
7114 +
7115 +#define SER63XX_DEFAULT_BAUD 115200
7116 +#define BD_BCM63XX_TIMER_CLOCK_INPUT (FPERIPH)
7117 +#define stUart ((volatile Uart * const) UART_BASE)
7118 +
7119 +// Transmit interrupts
7120 +#define TXINT (TXFIFOEMT | TXUNDERR | TXOVFERR)
7121 +// Receive interrupts
7122 +#define RXINT (RXFIFONE | RXOVFERR)
7123 +
7124 +/* --------------------------------------------------------------------------
7125 + Name: serial_init
7126 + Purpose: Initalize the UART
7127 +-------------------------------------------------------------------------- */
7128 +void __init serial_init(void)
7129 +{
7130 + UINT32 tmpVal = SER63XX_DEFAULT_BAUD;
7131 + ULONG clockFreqHz;
7132 +
7133 +#if defined(CONFIG_BCM96345)
7134 + // Make sure clock is ticking
7135 + PERF->blkEnables |= UART_CLK_EN;
7136 +#endif
7137 +
7138 + /* Dissable channel's receiver and transmitter. */
7139 + stUart->control &= ~(BRGEN|TXEN|RXEN);
7140 +
7141 + /*--------------------------------------------------------------------*/
7142 + /* Write the table value to the clock select register. */
7143 + /* DPullen - this is the equation to use: */
7144 + /* value = clockFreqHz / baud / 32-1; */
7145 + /* (snmod) Actually you should also take into account any necessary */
7146 + /* rounding. Divide by 16, look at lsb, if 0, divide by 2 */
7147 + /* and subtract 1. If 1, just divide by 2 */
7148 + /*--------------------------------------------------------------------*/
7149 + clockFreqHz = BD_BCM63XX_TIMER_CLOCK_INPUT;
7150 + tmpVal = (clockFreqHz / tmpVal) / 16;
7151 + if( tmpVal & 0x01 )
7152 + tmpVal /= 2; //Rounding up, so sub is already accounted for
7153 + else
7154 + tmpVal = (tmpVal / 2) - 1; // Rounding down so we must sub 1
7155 + stUart->baudword = tmpVal;
7156 +
7157 + /* Finally, re-enable the transmitter and receiver. */
7158 + stUart->control |= (BRGEN|TXEN|RXEN);
7159 +
7160 + stUart->config = (BITS8SYM | ONESTOP);
7161 + // Set the FIFO interrupt depth ... stUart->fifocfg = 0xAA;
7162 + stUart->fifoctl = RSTTXFIFOS | RSTRXFIFOS;
7163 + stUart->intMask = 0;
7164 + stUart->intMask = RXINT | TXINT;
7165 +}
7166 +
7167 +
7168 +/* prom_putc()
7169 + * Output a character to the UART
7170 + */
7171 +void prom_putc(char c)
7172 +{
7173 + /* Wait for Tx uffer to empty */
7174 + while (! (READ16(stUart->intStatus) & TXFIFOEMT));
7175 + /* Send character */
7176 + stUart->Data = c;
7177 +}
7178 +
7179 +/* prom_puts()
7180 + * Write a string to the UART
7181 + */
7182 +void prom_puts(const char *s)
7183 +{
7184 + while (*s) {
7185 + if (*s == '\n') {
7186 + prom_putc('\r');
7187 + }
7188 + prom_putc(*s++);
7189 + }
7190 +}
7191 +
7192 +
7193 +/* prom_getc_nowait()
7194 + * Returns a character from the UART
7195 + * Returns -1 if no characters available or corrupted
7196 + */
7197 +int prom_getc_nowait(void)
7198 +{
7199 + uint16 uStatus;
7200 + int cData = -1;
7201 +
7202 + uStatus = READ16(stUart->intStatus);
7203 +
7204 + if (uStatus & RXFIFONE) { /* Do we have a character? */
7205 + cData = READ16(stUart->Data) & 0xff; /* Read character */
7206 + if (uStatus & (RXFRAMERR | RXPARERR)) { /* If we got an error, throw it away */
7207 + cData = -1;
7208 + }
7209 + }
7210 +
7211 + return cData;
7212 +}
7213 +
7214 +/* prom_getc()
7215 + * Returns a charcter from the serial port
7216 + * Will block until it receives a valid character
7217 +*/
7218 +char prom_getc(void)
7219 +{
7220 + int cData = -1;
7221 +
7222 + /* Loop until we get a valid character */
7223 + while(cData == -1) {
7224 + cData = prom_getc_nowait();
7225 + }
7226 + return (char) cData;
7227 +}
7228 +
7229 +/* prom_testc()
7230 + * Returns 0 if no characters available
7231 + */
7232 +int prom_testc(void)
7233 +{
7234 + uint16 uStatus;
7235 +
7236 + uStatus = READ16(stUart->intStatus);
7237 +
7238 + return (uStatus & RXFIFONE);
7239 +}
7240 +
7241 +#if defined (CONFIG_REMOTE_DEBUG)
7242 +/* Prevent other code from writing to the serial port */
7243 +void _putc(char c) { }
7244 +void _puts(const char *ptr) { }
7245 +#else
7246 +/* Low level outputs call prom routines */
7247 +void _putc(char c) {
7248 + prom_putc(c);
7249 +}
7250 +void _puts(const char *ptr) {
7251 + prom_puts(ptr);
7252 +}
7253 +#endif
7254 diff -urN linux.old/arch/mips/bcm963xx/setup.c linux.dev/arch/mips/bcm963xx/setup.c
7255 --- linux.old/arch/mips/bcm963xx/setup.c 1970-01-01 01:00:00.000000000 +0100
7256 +++ linux.dev/arch/mips/bcm963xx/setup.c 2006-08-25 02:26:58.000000000 +0200
7257 @@ -0,0 +1,525 @@
7258 +/*
7259 +<:copyright-gpl
7260 + Copyright 2002 Broadcom Corp. All Rights Reserved.
7261 +
7262 + This program is free software; you can distribute it and/or modify it
7263 + under the terms of the GNU General Public License (Version 2) as
7264 + published by the Free Software Foundation.
7265 +
7266 + This program is distributed in the hope it will be useful, but WITHOUT
7267 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7268 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7269 + for more details.
7270 +
7271 + You should have received a copy of the GNU General Public License along
7272 + with this program; if not, write to the Free Software Foundation, Inc.,
7273 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
7274 +:>
7275 +*/
7276 +/*
7277 + * Generic setup routines for Broadcom 963xx MIPS boards
7278 + */
7279 +
7280 +#include <linux/autoconf.h>
7281 +#include <linux/init.h>
7282 +#include <linux/interrupt.h>
7283 +#include <linux/kernel.h>
7284 +#include <linux/kdev_t.h>
7285 +#include <linux/types.h>
7286 +#include <linux/console.h>
7287 +#include <linux/sched.h>
7288 +#include <linux/mm.h>
7289 +#include <linux/slab.h>
7290 +#include <linux/module.h>
7291 +#include <linux/pm.h>
7292 +
7293 +#include <asm/addrspace.h>
7294 +#include <asm/bcache.h>
7295 +#include <asm/irq.h>
7296 +#include <asm/time.h>
7297 +#include <asm/reboot.h>
7298 +#include <asm/gdb-stub.h>
7299 +
7300 +extern void brcm_time_init(void);
7301 +extern void brcm_timer_setup(struct irqaction *irq);
7302 +extern unsigned long getMemorySize(void);
7303 +
7304 +#if defined(CONFIG_BCM96348) && defined(CONFIG_PCI)
7305 +#include <linux/pci.h>
7306 +#include <linux/delay.h>
7307 +#include <bcm_map_part.h>
7308 +#include <bcmpci.h>
7309 +
7310 +static volatile MpiRegisters * mpi = (MpiRegisters *)(MPI_BASE);
7311 +#endif
7312 +
7313 +/* This function should be in a board specific directory. For now,
7314 + * assume that all boards that include this file use a Broadcom chip
7315 + * with a soft reset bit in the PLL control register.
7316 + */
7317 +static void brcm_machine_restart(char *command)
7318 +{
7319 + const unsigned long ulSoftReset = 0x00000001;
7320 + unsigned long *pulPllCtrl = (unsigned long *) 0xfffe0008;
7321 + *pulPllCtrl |= ulSoftReset;
7322 +}
7323 +
7324 +static void brcm_machine_halt(void)
7325 +{
7326 + printk("System halted\n");
7327 + while (1);
7328 +}
7329 +
7330 +#if defined(CONFIG_BCM96348) && defined(CONFIG_PCI)
7331 +
7332 +static void mpi_SetLocalPciConfigReg(uint32 reg, uint32 value)
7333 +{
7334 + /* write index then value */
7335 + mpi->pcicfgcntrl = PCI_CFG_REG_WRITE_EN + reg;;
7336 + mpi->pcicfgdata = value;
7337 +}
7338 +
7339 +static uint32 mpi_GetLocalPciConfigReg(uint32 reg)
7340 +{
7341 + /* write index then get value */
7342 + mpi->pcicfgcntrl = PCI_CFG_REG_WRITE_EN + reg;;
7343 + return mpi->pcicfgdata;
7344 +}
7345 +
7346 +/*
7347 + * mpi_ResetPcCard: Set/Reset the PcCard
7348 + */
7349 +static void mpi_ResetPcCard(int cardtype, BOOL bReset)
7350 +{
7351 + if (cardtype == MPI_CARDTYPE_NONE) {
7352 + return;
7353 + }
7354 +
7355 + if (cardtype == MPI_CARDTYPE_CARDBUS) {
7356 + bReset = ! bReset;
7357 + }
7358 +
7359 + if (bReset) {
7360 + mpi->pcmcia_cntl1 = (mpi->pcmcia_cntl1 & ~PCCARD_CARD_RESET);
7361 + } else {
7362 + mpi->pcmcia_cntl1 = (mpi->pcmcia_cntl1 | PCCARD_CARD_RESET);
7363 + }
7364 +}
7365 +
7366 +/*
7367 + * mpi_ConfigCs: Configure an MPI/EBI chip select
7368 + */
7369 +static void mpi_ConfigCs(uint32 cs, uint32 base, uint32 size, uint32 flags)
7370 +{
7371 + mpi->cs[cs].base = ((base & 0x1FFFFFFF) | size);
7372 + mpi->cs[cs].config = flags;
7373 +}
7374 +
7375 +/*
7376 + * mpi_InitPcmciaSpace
7377 + */
7378 +static void mpi_InitPcmciaSpace(void)
7379 +{
7380 + // ChipSelect 4 controls PCMCIA Memory accesses
7381 + mpi_ConfigCs(PCMCIA_COMMON_BASE, pcmciaMem, EBI_SIZE_1M, (EBI_WORD_WIDE|EBI_ENABLE));
7382 + // ChipSelect 5 controls PCMCIA Attribute accesses
7383 + mpi_ConfigCs(PCMCIA_ATTRIBUTE_BASE, pcmciaAttr, EBI_SIZE_1M, (EBI_WORD_WIDE|EBI_ENABLE));
7384 + // ChipSelect 6 controls PCMCIA I/O accesses
7385 + mpi_ConfigCs(PCMCIA_IO_BASE, pcmciaIo, EBI_SIZE_64K, (EBI_WORD_WIDE|EBI_ENABLE));
7386 +
7387 + mpi->pcmcia_cntl2 = ((PCMCIA_ATTR_ACTIVE << RW_ACTIVE_CNT_BIT) |
7388 + (PCMCIA_ATTR_INACTIVE << INACTIVE_CNT_BIT) |
7389 + (PCMCIA_ATTR_CE_SETUP << CE_SETUP_CNT_BIT) |
7390 + (PCMCIA_ATTR_CE_HOLD << CE_HOLD_CNT_BIT));
7391 +
7392 + mpi->pcmcia_cntl2 |= (PCMCIA_HALFWORD_EN | PCMCIA_BYTESWAP_DIS);
7393 +}
7394 +
7395 +/*
7396 + * cardtype_vcc_detect: PC Card's card detect and voltage sense connection
7397 + *
7398 + * CD1#/ CD2#/ VS1#/ VS2#/ Card Initial Vcc
7399 + * CCD1# CCD2# CVS1 CVS2 Type
7400 + *
7401 + * GND GND open open 16-bit 5 vdc
7402 + *
7403 + * GND GND GND open 16-bit 3.3 vdc
7404 + *
7405 + * GND GND open GND 16-bit x.x vdc
7406 + *
7407 + * GND GND GND GND 16-bit 3.3 & x.x vdc
7408 + *
7409 + *====================================================================
7410 + *
7411 + * CVS1 GND CCD1# open CardBus 3.3 vdc
7412 + *
7413 + * GND CVS2 open CCD2# CardBus x.x vdc
7414 + *
7415 + * GND CVS1 CCD2# open CardBus y.y vdc
7416 + *
7417 + * GND CVS2 GND CCD2# CardBus 3.3 & x.x vdc
7418 + *
7419 + * CVS2 GND open CCD1# CardBus x.x & y.y vdc
7420 + *
7421 + * GND CVS1 CCD2# open CardBus 3.3, x.x & y.y vdc
7422 + *
7423 + */
7424 +static int cardtype_vcc_detect(void)
7425 +{
7426 + uint32 data32;
7427 + int cardtype;
7428 +
7429 + cardtype = MPI_CARDTYPE_NONE;
7430 + mpi->pcmcia_cntl1 = 0x0000A000; // Turn on the output enables and drive
7431 + // the CVS pins to 0.
7432 + data32 = mpi->pcmcia_cntl1;
7433 + switch (data32 & 0x00000003) // Test CD1# and CD2#, see if card is plugged in.
7434 + {
7435 + case 0x00000003: // No Card is in the slot.
7436 + printk("mpi: No Card is in the PCMCIA slot\n");
7437 + break;
7438 +
7439 + case 0x00000002: // Partial insertion, No CD2#.
7440 + printk("mpi: Card in the PCMCIA slot partial insertion, no CD2 signal\n");
7441 + break;
7442 +
7443 + case 0x00000001: // Partial insertion, No CD1#.
7444 + printk("mpi: Card in the PCMCIA slot partial insertion, no CD1 signal\n");
7445 + break;
7446 +
7447 + case 0x00000000:
7448 + mpi->pcmcia_cntl1 = 0x0000A0C0; // Turn off the CVS output enables and
7449 + // float the CVS pins.
7450 + mdelay(1);
7451 + data32 = mpi->pcmcia_cntl1;
7452 + // Read the Register.
7453 + switch (data32 & 0x0000000C) // See what is on the CVS pins.
7454 + {
7455 + case 0x00000000: // CVS1 and CVS2 are tied to ground, only 1 option.
7456 + printk("mpi: Detected 3.3 & x.x 16-bit PCMCIA card\n");
7457 + cardtype = MPI_CARDTYPE_PCMCIA;
7458 + break;
7459 +
7460 + case 0x00000004: // CVS1 is open or tied to CCD1/CCD2 and CVS2 is tied to ground.
7461 + // 2 valid voltage options.
7462 + switch (data32 & 0x00000003) // Test the values of CCD1 and CCD2.
7463 + {
7464 + case 0x00000003: // CCD1 and CCD2 are tied to 1 of the CVS pins.
7465 + // This is not a valid combination.
7466 + printk("mpi: Unknown card plugged into slot\n");
7467 + break;
7468 +
7469 + case 0x00000002: // CCD2 is tied to either CVS1 or CVS2.
7470 + mpi->pcmcia_cntl1 = 0x0000A080; // Drive CVS1 to a 0.
7471 + mdelay(1);
7472 + data32 = mpi->pcmcia_cntl1;
7473 + if (data32 & 0x00000002) { // CCD2 is tied to CVS2, not valid.
7474 + printk("mpi: Unknown card plugged into slot\n");
7475 + } else { // CCD2 is tied to CVS1.
7476 + printk("mpi: Detected 3.3, x.x and y.y Cardbus card\n");
7477 + cardtype = MPI_CARDTYPE_CARDBUS;
7478 + }
7479 + break;
7480 +
7481 + case 0x00000001: // CCD1 is tied to either CVS1 or CVS2.
7482 + // This is not a valid combination.
7483 + printk("mpi: Unknown card plugged into slot\n");
7484 + break;
7485 +
7486 + case 0x00000000: // CCD1 and CCD2 are tied to ground.
7487 + printk("mpi: Detected x.x vdc 16-bit PCMCIA card\n");
7488 + cardtype = MPI_CARDTYPE_PCMCIA;
7489 + break;
7490 + }
7491 + break;
7492 +
7493 + case 0x00000008: // CVS2 is open or tied to CCD1/CCD2 and CVS1 is tied to ground.
7494 + // 2 valid voltage options.
7495 + switch (data32 & 0x00000003) // Test the values of CCD1 and CCD2.
7496 + {
7497 + case 0x00000003: // CCD1 and CCD2 are tied to 1 of the CVS pins.
7498 + // This is not a valid combination.
7499 + printk("mpi: Unknown card plugged into slot\n");
7500 + break;
7501 +
7502 + case 0x00000002: // CCD2 is tied to either CVS1 or CVS2.
7503 + mpi->pcmcia_cntl1 = 0x0000A040; // Drive CVS2 to a 0.
7504 + mdelay(1);
7505 + data32 = mpi->pcmcia_cntl1;
7506 + if (data32 & 0x00000002) { // CCD2 is tied to CVS1, not valid.
7507 + printk("mpi: Unknown card plugged into slot\n");
7508 + } else {// CCD2 is tied to CVS2.
7509 + printk("mpi: Detected 3.3 and x.x Cardbus card\n");
7510 + cardtype = MPI_CARDTYPE_CARDBUS;
7511 + }
7512 + break;
7513 +
7514 + case 0x00000001: // CCD1 is tied to either CVS1 or CVS2.
7515 + // This is not a valid combination.
7516 + printk("mpi: Unknown card plugged into slot\n");
7517 + break;
7518 +
7519 + case 0x00000000: // CCD1 and CCD2 are tied to ground.
7520 + cardtype = MPI_CARDTYPE_PCMCIA;
7521 + printk("mpi: Detected 3.3 vdc 16-bit PCMCIA card\n");
7522 + break;
7523 + }
7524 + break;
7525 +
7526 + case 0x0000000C: // CVS1 and CVS2 are open or tied to CCD1/CCD2.
7527 + // 5 valid voltage options.
7528 +
7529 + switch (data32 & 0x00000003) // Test the values of CCD1 and CCD2.
7530 + {
7531 + case 0x00000003: // CCD1 and CCD2 are tied to 1 of the CVS pins.
7532 + // This is not a valid combination.
7533 + printk("mpi: Unknown card plugged into slot\n");
7534 + break;
7535 +
7536 + case 0x00000002: // CCD2 is tied to either CVS1 or CVS2.
7537 + // CCD1 is tied to ground.
7538 + mpi->pcmcia_cntl1 = 0x0000A040; // Drive CVS2 to a 0.
7539 + mdelay(1);
7540 + data32 = mpi->pcmcia_cntl1;
7541 + if (data32 & 0x00000002) { // CCD2 is tied to CVS1.
7542 + printk("mpi: Detected y.y vdc Cardbus card\n");
7543 + } else { // CCD2 is tied to CVS2.
7544 + printk("mpi: Detected x.x vdc Cardbus card\n");
7545 + }
7546 + cardtype = MPI_CARDTYPE_CARDBUS;
7547 + break;
7548 +
7549 + case 0x00000001: // CCD1 is tied to either CVS1 or CVS2.
7550 + // CCD2 is tied to ground.
7551 +
7552 + mpi->pcmcia_cntl1 = 0x0000A040; // Drive CVS2 to a 0.
7553 + mdelay(1);
7554 + data32 = mpi->pcmcia_cntl1;
7555 + if (data32 & 0x00000001) {// CCD1 is tied to CVS1.
7556 + printk("mpi: Detected 3.3 vdc Cardbus card\n");
7557 + } else { // CCD1 is tied to CVS2.
7558 + printk("mpi: Detected x.x and y.y Cardbus card\n");
7559 + }
7560 + cardtype = MPI_CARDTYPE_CARDBUS;
7561 + break;
7562 +
7563 + case 0x00000000: // CCD1 and CCD2 are tied to ground.
7564 + cardtype = MPI_CARDTYPE_PCMCIA;
7565 + printk("mpi: Detected 5 vdc 16-bit PCMCIA card\n");
7566 + break;
7567 + }
7568 + break;
7569 +
7570 + default:
7571 + printk("mpi: Unknown card plugged into slot\n");
7572 + break;
7573 +
7574 + }
7575 + }
7576 + return cardtype;
7577 +}
7578 +
7579 +/*
7580 + * mpi_DetectPcCard: Detect the plugged in PC-Card
7581 + * Return: < 0 => Unknown card detected
7582 + * 0 => No card detected
7583 + * 1 => 16-bit card detected
7584 + * 2 => 32-bit CardBus card detected
7585 + */
7586 +static int mpi_DetectPcCard(void)
7587 +{
7588 + int cardtype;
7589 +
7590 + cardtype = cardtype_vcc_detect();
7591 + switch(cardtype) {
7592 + case MPI_CARDTYPE_PCMCIA:
7593 + mpi->pcmcia_cntl1 &= ~0x0000e000; // disable enable bits
7594 + //mpi->pcmcia_cntl1 = (mpi->pcmcia_cntl1 & ~PCCARD_CARD_RESET);
7595 + mpi->pcmcia_cntl1 |= (PCMCIA_ENABLE | PCMCIA_GPIO_ENABLE);
7596 + mpi_InitPcmciaSpace();
7597 + mpi_ResetPcCard(cardtype, FALSE);
7598 + // Hold card in reset for 10ms
7599 + mdelay(10);
7600 + mpi_ResetPcCard(cardtype, TRUE);
7601 + // Let card come out of reset
7602 + mdelay(100);
7603 + break;
7604 + case MPI_CARDTYPE_CARDBUS:
7605 + // 8 => CardBus Enable
7606 + // 1 => PCI Slot Number
7607 + // C => Float VS1 & VS2
7608 + mpi->pcmcia_cntl1 = (mpi->pcmcia_cntl1 & 0xFFFF0000) |
7609 + CARDBUS_ENABLE |
7610 + (CARDBUS_SLOT << 8)|
7611 + VS2_OEN |
7612 + VS1_OEN;
7613 + /* access to this memory window will be to/from CardBus */
7614 + mpi->l2pmremap1 |= CARDBUS_MEM;
7615 +
7616 + // Need to reset the Cardbus Card. There's no CardManager to do this,
7617 + // and we need to be ready for PCI configuration.
7618 + mpi_ResetPcCard(cardtype, FALSE);
7619 + // Hold card in reset for 10ms
7620 + mdelay(10);
7621 + mpi_ResetPcCard(cardtype, TRUE);
7622 + // Let card come out of reset
7623 + mdelay(100);
7624 + break;
7625 + default:
7626 + break;
7627 + }
7628 + return cardtype;
7629 +}
7630 +
7631 +static int mpi_init(void)
7632 +{
7633 + unsigned long data;
7634 + unsigned int chipid;
7635 + unsigned int chiprev;
7636 + unsigned int sdramsize;
7637 +
7638 + chipid = (PERF->RevID & 0xFFFF0000) >> 16;
7639 + chiprev = (PERF->RevID & 0xFF);
7640 + sdramsize = getMemorySize();
7641 + /*
7642 + * Init the pci interface
7643 + */
7644 + data = GPIO->GPIOMode; // GPIO mode register
7645 + data |= GROUP2_PCI | GROUP1_MII_PCCARD; // PCI internal arbiter + Cardbus
7646 + GPIO->GPIOMode = data; // PCI internal arbiter
7647 +
7648 + /*
7649 + * In the BCM6348 CardBus support is defaulted to Slot 0
7650 + * because there is no external IDSEL for CardBus. To disable
7651 + * the CardBus and allow a standard PCI card in Slot 0
7652 + * set the cbus_idsel field to 0x1f.
7653 + */
7654 + /*
7655 + uData = mpi->pcmcia_cntl1;
7656 + uData |= CARDBUS_IDSEL;
7657 + mpi->pcmcia_cntl1 = uData;
7658 + */
7659 + // Setup PCI I/O Window range. Give 64K to PCI I/O
7660 + mpi->l2piorange = ~(BCM_PCI_IO_SIZE_64KB-1);
7661 + // UBUS to PCI I/O base address
7662 + mpi->l2piobase = BCM_PCI_IO_BASE & BCM_PCI_ADDR_MASK;
7663 + // UBUS to PCI I/O Window remap
7664 + mpi->l2pioremap = (BCM_PCI_IO_BASE | MEM_WINDOW_EN);
7665 +
7666 + // enable PCI related GPIO pins and data swap between system and PCI bus
7667 + mpi->locbuscntrl = (EN_PCI_GPIO | DIR_U2P_NOSWAP);
7668 +
7669 + /* Enable 6348 BusMaster and Memory access mode */
7670 + data = mpi_GetLocalPciConfigReg(PCI_COMMAND);
7671 + data |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
7672 + mpi_SetLocalPciConfigReg(PCI_COMMAND, data);
7673 +
7674 + /* Configure two 16 MByte PCI to System memory regions. */
7675 + /* These memory regions are used when PCI device is a bus master */
7676 + /* Accesses to the SDRAM from PCI bus will be "byte swapped" for this region */
7677 + mpi_SetLocalPciConfigReg(PCI_BASE_ADDRESS_3, BCM_HOST_MEM_SPACE1);
7678 + mpi->sp0remap = 0x0;
7679 +
7680 + /* Accesses to the SDRAM from PCI bus will not be "byte swapped" for this region */
7681 + mpi_SetLocalPciConfigReg(PCI_BASE_ADDRESS_4, BCM_HOST_MEM_SPACE2);
7682 + mpi->sp1remap = 0x0;
7683 + mpi->pcimodesel |= (PCI_BAR2_NOSWAP | 0x40);
7684 +
7685 + if ((chipid == 0x6348) && (chiprev == 0xb0)) {
7686 + mpi->sp0range = ~(sdramsize-1);
7687 + mpi->sp1range = ~(sdramsize-1);
7688 + }
7689 + /*
7690 + * Change 6348 PCI Cfg Reg. offset 0x40 to PCI memory read retry count infinity
7691 + * by set 0 in bit 8~15. This resolve read Bcm4306 srom return 0xffff in
7692 + * first read.
7693 + */
7694 + data = mpi_GetLocalPciConfigReg(BRCM_PCI_CONFIG_TIMER);
7695 + data &= ~BRCM_PCI_CONFIG_TIMER_RETRY_MASK;
7696 + data |= 0x00000080;
7697 + mpi_SetLocalPciConfigReg(BRCM_PCI_CONFIG_TIMER, data);
7698 +
7699 + /* enable pci interrupt */
7700 + mpi->locintstat |= (EXT_PCI_INT << 16);
7701 +
7702 + mpi_DetectPcCard();
7703 +
7704 + ioport_resource.start = BCM_PCI_IO_BASE;
7705 + ioport_resource.end = BCM_PCI_IO_BASE + BCM_PCI_IO_SIZE_64KB;
7706 +
7707 +#if defined(CONFIG_USB)
7708 + PERF->blkEnables |= USBH_CLK_EN;
7709 + mdelay(100);
7710 + *USBH_NON_OHCI = NON_OHCI_BYTE_SWAP;
7711 +#endif
7712 +
7713 + return 0;
7714 +}
7715 +#endif
7716 +
7717 +static int __init brcm63xx_setup(void)
7718 +{
7719 + extern int panic_timeout;
7720 +
7721 + _machine_restart = brcm_machine_restart;
7722 + _machine_halt = brcm_machine_halt;
7723 + pm_power_off = brcm_machine_halt;
7724 +
7725 + board_time_init = brcm_time_init;
7726 + board_timer_setup = brcm_timer_setup;
7727 +
7728 + panic_timeout = 5;
7729 +
7730 +#if defined(CONFIG_BCM96348) && defined(CONFIG_PCI)
7731 + /* mpi initialization */
7732 + mpi_init();
7733 +#endif
7734 + return 0;
7735 +}
7736 +
7737 +void plat_setup(void)
7738 +{
7739 + brcm63xx_setup();
7740 +}
7741 +
7742 +/***************************************************************************
7743 + * C++ New and delete operator functions
7744 + ***************************************************************************/
7745 +
7746 +/* void *operator new(unsigned int sz) */
7747 +void *_Znwj(unsigned int sz)
7748 +{
7749 + return( kmalloc(sz, GFP_KERNEL) );
7750 +}
7751 +
7752 +/* void *operator new[](unsigned int sz)*/
7753 +void *_Znaj(unsigned int sz)
7754 +{
7755 + return( kmalloc(sz, GFP_KERNEL) );
7756 +}
7757 +
7758 +/* placement new operator */
7759 +/* void *operator new (unsigned int size, void *ptr) */
7760 +void *ZnwjPv(unsigned int size, void *ptr)
7761 +{
7762 + return ptr;
7763 +}
7764 +
7765 +/* void operator delete(void *m) */
7766 +void _ZdlPv(void *m)
7767 +{
7768 + kfree(m);
7769 +}
7770 +
7771 +/* void operator delete[](void *m) */
7772 +void _ZdaPv(void *m)
7773 +{
7774 + kfree(m);
7775 +}
7776 +
7777 +EXPORT_SYMBOL(_Znwj);
7778 +EXPORT_SYMBOL(_Znaj);
7779 +EXPORT_SYMBOL(ZnwjPv);
7780 +EXPORT_SYMBOL(_ZdlPv);
7781 +EXPORT_SYMBOL(_ZdaPv);
7782 +
7783 diff -urN linux.old/arch/mips/bcm963xx/softdsl/AdslCoreDefs.h linux.dev/arch/mips/bcm963xx/softdsl/AdslCoreDefs.h
7784 --- linux.old/arch/mips/bcm963xx/softdsl/AdslCoreDefs.h 1970-01-01 01:00:00.000000000 +0100
7785 +++ linux.dev/arch/mips/bcm963xx/softdsl/AdslCoreDefs.h 2006-08-25 00:39:38.000000000 +0200
7786 @@ -0,0 +1,2 @@
7787 +#define ADSL_SDRAM_IMAGE_SIZE (384*1024)
7788 +
7789 diff -urN linux.old/arch/mips/bcm963xx/time.c linux.dev/arch/mips/bcm963xx/time.c
7790 --- linux.old/arch/mips/bcm963xx/time.c 1970-01-01 01:00:00.000000000 +0100
7791 +++ linux.dev/arch/mips/bcm963xx/time.c 2006-08-25 03:58:22.000000000 +0200
7792 @@ -0,0 +1,114 @@
7793 +/*
7794 +<:copyright-gpl
7795 + Copyright 2004 Broadcom Corp. All Rights Reserved.
7796 +
7797 + This program is free software; you can distribute it and/or modify it
7798 + under the terms of the GNU General Public License (Version 2) as
7799 + published by the Free Software Foundation.
7800 +
7801 + This program is distributed in the hope it will be useful, but WITHOUT
7802 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7803 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7804 + for more details.
7805 +
7806 + You should have received a copy of the GNU General Public License along
7807 + with this program; if not, write to the Free Software Foundation, Inc.,
7808 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
7809 +:>
7810 +*/
7811 +/*
7812 + * Setup time for Broadcom 963xx MIPS boards
7813 + */
7814 +
7815 +#include <linux/autoconf.h>
7816 +#include <linux/init.h>
7817 +#include <linux/kernel_stat.h>
7818 +#include <linux/sched.h>
7819 +#include <linux/spinlock.h>
7820 +#include <linux/interrupt.h>
7821 +#include <linux/module.h>
7822 +#include <linux/time.h>
7823 +#include <linux/timex.h>
7824 +
7825 +#include <asm/mipsregs.h>
7826 +#include <asm/ptrace.h>
7827 +#include <asm/div64.h>
7828 +#include <asm/time.h>
7829 +
7830 +#include <bcm_map_part.h>
7831 +#include <bcm_intr.h>
7832 +
7833 +static unsigned long r4k_offset; /* Amount to increment compare reg each time */
7834 +static unsigned long r4k_cur; /* What counter should be at next timer irq */
7835 +
7836 +/* *********************************************************************
7837 + * calculateCpuSpeed()
7838 + * Calculate the BCM6348 CPU speed by reading the PLL strap register
7839 + * and applying the following formula:
7840 + * cpu_clk = (.25 * 64MHz freq) * (N1 + 1) * (N2 + 2) / (M1_CPU + 1)
7841 + * Input parameters:
7842 + * none
7843 + * Return value:
7844 + * none
7845 + ********************************************************************* */
7846 +
7847 +static inline unsigned long __init calculateCpuSpeed(void)
7848 +{
7849 + UINT32 pllStrap = PERF->PllStrap;
7850 + int n1 = (pllStrap & PLL_N1_MASK) >> PLL_N1_SHFT;
7851 + int n2 = (pllStrap & PLL_N2_MASK) >> PLL_N2_SHFT;
7852 + int m1cpu = (pllStrap & PLL_M1_CPU_MASK) >> PLL_M1_CPU_SHFT;
7853 +
7854 + return (16 * (n1 + 1) * (n2 + 2) / (m1cpu + 1)) * 1000000;
7855 +}
7856 +
7857 +
7858 +static inline unsigned long __init cal_r4koff(void)
7859 +{
7860 + mips_hpt_frequency = calculateCpuSpeed() / 2;
7861 + return (mips_hpt_frequency / HZ);
7862 +}
7863 +
7864 +
7865 +/*
7866 + * There are a lot of conceptually broken versions of the MIPS timer interrupt
7867 + * handler floating around. This one is rather different, but the algorithm
7868 + * is provably more robust.
7869 + */
7870 +irqreturn_t brcm_timer_interrupt(struct pt_regs *regs)
7871 +{
7872 + int irq = MIPS_TIMER_INT;
7873 +
7874 + irq_enter();
7875 + kstat_this_cpu.irqs[irq]++;
7876 +
7877 + timer_interrupt(irq, NULL, regs);
7878 + irq_exit();
7879 + return IRQ_HANDLED;
7880 +}
7881 +
7882 +
7883 +void __init brcm_time_init(void)
7884 +{
7885 + unsigned int est_freq, flags;
7886 + local_irq_save(flags);
7887 +
7888 + printk("calculating r4koff... ");
7889 + r4k_offset = cal_r4koff();
7890 + printk("%08lx(%d)\n", r4k_offset, (int)r4k_offset);
7891 +
7892 + est_freq = 2 * r4k_offset * HZ;
7893 + est_freq += 5000; /* round */
7894 + est_freq -= est_freq % 10000;
7895 + printk("CPU frequency %d.%02d MHz\n", est_freq / 1000000,
7896 + (est_freq % 1000000) * 100 / 1000000);
7897 + local_irq_restore(flags);
7898 +}
7899 +
7900 +
7901 +void __init brcm_timer_setup(struct irqaction *irq)
7902 +{
7903 + r4k_cur = (read_c0_count() + r4k_offset);
7904 + write_c0_compare(r4k_cur);
7905 + set_c0_status(IE_IRQ5);
7906 +}
7907 diff -urN linux.old/arch/mips/Kconfig linux.dev/arch/mips/Kconfig
7908 --- linux.old/arch/mips/Kconfig 2006-08-25 00:43:39.000000000 +0200
7909 +++ linux.dev/arch/mips/Kconfig 2006-08-25 01:57:46.000000000 +0200
7910 @@ -12,6 +12,15 @@
7911 prompt "System type"
7912 default SGI_IP22
7913
7914 +config BCM963XX
7915 + bool "Support for the Broadcom boards"
7916 + select SYS_SUPPORTS_32BIT_KERNEL
7917 + select SYS_SUPPORTS_BIG_ENDIAN
7918 + select SYS_HAS_CPU_MIPS32_R1
7919 + select IRQ_CPU
7920 + help
7921 + This is a fmaily of boards based on the Broadcom MIPS32
7922 +
7923 config MIPS_MTX1
7924 bool "4G Systems MTX-1 board"
7925 select DMA_NONCOHERENT
7926 @@ -780,6 +789,7 @@
7927
7928 endchoice
7929
7930 +source "arch/mips/bcm963xx/Kconfig"
7931 source "arch/mips/ddb5xxx/Kconfig"
7932 source "arch/mips/gt64120/ev64120/Kconfig"
7933 source "arch/mips/jazz/Kconfig"
7934 diff -urN linux.old/arch/mips/kernel/cpu-probe.c linux.dev/arch/mips/kernel/cpu-probe.c
7935 --- linux.old/arch/mips/kernel/cpu-probe.c 2006-08-25 00:43:39.000000000 +0200
7936 +++ linux.dev/arch/mips/kernel/cpu-probe.c 2006-08-25 00:39:38.000000000 +0200
7937 @@ -568,6 +568,25 @@
7938 return;
7939 }
7940
7941 +static inline void cpu_probe_broadcom(struct cpuinfo_mips *c)
7942 +{
7943 + decode_configs(c);
7944 + switch (c->processor_id & 0xff00) {
7945 + case PRID_IMP_BCM6338:
7946 + c->cputype = CPU_BCM6338;
7947 + break;
7948 + case PRID_IMP_BCM6345:
7949 + c->cputype = CPU_BCM6345;
7950 + break;
7951 + case PRID_IMP_BCM6348:
7952 + c->cputype = CPU_BCM6348;
7953 + break;
7954 + default:
7955 + c->cputype = CPU_UNKNOWN;
7956 + break;
7957 + }
7958 +}
7959 +
7960 static inline void cpu_probe_mips(struct cpuinfo_mips *c)
7961 {
7962 decode_configs(c);
7963 @@ -704,6 +723,9 @@
7964 case PRID_COMP_LEGACY:
7965 cpu_probe_legacy(c);
7966 break;
7967 + case PRID_COMP_BROADCOM:
7968 + cpu_probe_broadcom(c);
7969 + break;
7970 case PRID_COMP_MIPS:
7971 cpu_probe_mips(c);
7972 break;
7973 diff -urN linux.old/arch/mips/kernel/proc.c linux.dev/arch/mips/kernel/proc.c
7974 --- linux.old/arch/mips/kernel/proc.c 2006-08-25 00:43:39.000000000 +0200
7975 +++ linux.dev/arch/mips/kernel/proc.c 2006-08-25 00:39:38.000000000 +0200
7976 @@ -85,6 +85,9 @@
7977 [CPU_VR4181A] = "NEC VR4181A",
7978 [CPU_SR71000] = "Sandcraft SR71000",
7979 [CPU_PR4450] = "Philips PR4450",
7980 + [CPU_BCM6338] = "BCM6338",
7981 + [CPU_BCM6345] = "BCM6345",
7982 + [CPU_BCM6348] = "BCM6348",
7983 };
7984
7985
7986 diff -urN linux.old/arch/mips/Makefile linux.dev/arch/mips/Makefile
7987 --- linux.old/arch/mips/Makefile 2006-08-25 00:43:39.000000000 +0200
7988 +++ linux.dev/arch/mips/Makefile 2006-08-25 15:39:54.000000000 +0200
7989 @@ -145,6 +145,15 @@
7990 #
7991
7992 #
7993 +# Broadcom board
7994 +#
7995 +core-$(CONFIG_BCM963XX) += arch/mips/bcm963xx/
7996 +cflags-$(CONFIG_BCM963XX) += -Iinclude/asm-mips/mach-bcm963xx
7997 +cflags-$(CONFIG_BCM963XX) += -Iarch/mips/bcm963xx/include
7998 +load-$(CONFIG_BCM963XX) += 0xffffffff80010000
7999 +
8000 +
8001 +#
8002 # Acer PICA 61, Mips Magnum 4000 and Olivetti M700.
8003 #
8004 core-$(CONFIG_MACH_JAZZ) += arch/mips/jazz/
8005 diff -urN linux.old/arch/mips/mm/c-r4k.c linux.dev/arch/mips/mm/c-r4k.c
8006 --- linux.old/arch/mips/mm/c-r4k.c 2006-08-25 00:43:39.000000000 +0200
8007 +++ linux.dev/arch/mips/mm/c-r4k.c 2006-08-25 00:39:38.000000000 +0200
8008 @@ -914,6 +914,13 @@
8009 if (!(config & MIPS_CONF_M))
8010 panic("Don't know how to probe P-caches on this cpu.");
8011
8012 + if (c->cputype == CPU_BCM6338 || c->cputype == CPU_BCM6345 || c->cputype == CPU_BCM6348)
8013 + {
8014 + printk("brcm mips: enabling icache and dcache...\n");
8015 + /* Enable caches */
8016 + write_c0_diag(read_c0_diag() | 0xC0000000);
8017 + }
8018 +
8019 /*
8020 * So we seem to be a MIPS32 or MIPS64 CPU
8021 * So let's probe the I-cache ...
8022 diff -urN linux.old/arch/mips/mm/tlbex.c linux.dev/arch/mips/mm/tlbex.c
8023 --- linux.old/arch/mips/mm/tlbex.c 2006-08-25 00:43:39.000000000 +0200
8024 +++ linux.dev/arch/mips/mm/tlbex.c 2006-08-25 00:39:38.000000000 +0200
8025 @@ -882,6 +882,9 @@
8026 case CPU_4KSC:
8027 case CPU_20KC:
8028 case CPU_25KF:
8029 + case CPU_BCM6338:
8030 + case CPU_BCM6345:
8031 + case CPU_BCM6348:
8032 tlbw(p);
8033 break;
8034
8035 diff -urN linux-2.6.17/arch/mips/pci/fixup-bcm96348.c linux-2.6.17-brcm63xx/arch/mips/pci/fixup-bcm96348.c
8036 --- linux-2.6.17/arch/mips/pci/fixup-bcm96348.c 1970-01-01 01:00:00.000000000 +0100
8037 +++ linux-2.6.17-brcm63xx/arch/mips/pci/fixup-bcm96348.c 2006-08-29 10:25:22.000000000 +0200
8038 @@ -0,0 +1,93 @@
8039 +/*
8040 +<:copyright-gpl
8041 + Copyright 2002 Broadcom Corp. All Rights Reserved.
8042 +
8043 + This program is free software; you can distribute it and/or modify it
8044 + under the terms of the GNU General Public License (Version 2) as
8045 + published by the Free Software Foundation.
8046 +
8047 + This program is distributed in the hope it will be useful, but WITHOUT
8048 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8049 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
8050 + for more details.
8051 +
8052 + You should have received a copy of the GNU General Public License along
8053 + with this program; if not, write to the Free Software Foundation, Inc.,
8054 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
8055 +:>
8056 +*/
8057 +#include <linux/init.h>
8058 +#include <linux/types.h>
8059 +#include <linux/pci.h>
8060 +
8061 +#include <bcmpci.h>
8062 +#include <bcm_intr.h>
8063 +#include <bcm_map_part.h>
8064 +
8065 +static volatile MpiRegisters * mpi = (MpiRegisters *)(MPI_BASE);
8066 +
8067 +static char irq_tab_bcm96348[] __initdata = {
8068 + [0] = INTERRUPT_ID_MPI,
8069 + [1] = INTERRUPT_ID_MPI,
8070 +#if defined(CONFIG_USB)
8071 + [USB_HOST_SLOT] = INTERRUPT_ID_USBH
8072 +#endif
8073 +};
8074 +
8075 +int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
8076 +{
8077 + return irq_tab_bcm96348[slot];
8078 +}
8079 +
8080 +static void bcm96348_fixup(struct pci_dev *dev)
8081 +{
8082 + uint32 memaddr;
8083 + uint32 size;
8084 +
8085 + memaddr = pci_resource_start(dev, 0);
8086 + size = pci_resource_len(dev, 0);
8087 +
8088 + switch (PCI_SLOT(dev->devfn)) {
8089 + case 0:
8090 + // UBUS to PCI address range
8091 + // Memory Window 1. Mask determines which bits are decoded.
8092 + mpi->l2pmrange1 = ~(size-1);
8093 + // UBUS to PCI Memory base address. This is akin to the ChipSelect base
8094 + // register.
8095 + mpi->l2pmbase1 = memaddr & BCM_PCI_ADDR_MASK;
8096 + // UBUS to PCI Remap Address. Replaces the masked address bits in the
8097 + // range register with this setting.
8098 + // Also, enable direct I/O and direct Memory accesses
8099 + mpi->l2pmremap1 = (memaddr | MEM_WINDOW_EN);
8100 + break;
8101 +
8102 + case 1:
8103 + // Memory Window 2
8104 + mpi->l2pmrange2 = ~(size-1);
8105 + // UBUS to PCI Memory base address.
8106 + mpi->l2pmbase2 = memaddr & BCM_PCI_ADDR_MASK;
8107 + // UBUS to PCI Remap Address
8108 + mpi->l2pmremap2 = (memaddr | MEM_WINDOW_EN);
8109 + break;
8110 +
8111 +#if defined(CONFIG_USB)
8112 + case USB_HOST_SLOT:
8113 + dev->resource[0].start = USB_HOST_BASE;
8114 + dev->resource[0].end = USB_HOST_BASE+USB_BAR0_MEM_SIZE-1;
8115 + break;
8116 +#endif
8117 + }
8118 +}
8119 +
8120 +int pcibios_plat_dev_init(struct pci_dev *dev)
8121 +{
8122 + return 0;
8123 +}
8124 +
8125 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_BROADCOM, PCI_ANY_ID,
8126 + bcm96348_fixup);
8127 +
8128 +/*struct pci_fixup pcibios_fixups[] = {
8129 + { PCI_FIXUP_FINAL, PCI_ANY_ID, PCI_ANY_ID, bcm96348_fixup },
8130 + {0}
8131 +};*/
8132 diff -urN linux.old/arch/mips/pci/Makefile linux.dev/arch/mips/pci/Makefile
8133 --- linux.old/arch/mips/pci/Makefile 2006-08-25 00:43:29.000000000 +0200
8134 +++ linux.dev/arch/mips/pci/Makefile 2006-08-25 00:39:38.000000000 +0200
8135 @@ -18,6 +18,7 @@
8136 obj-$(CONFIG_MIPS_TX3927) += ops-tx3927.o
8137 obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o
8138 obj-$(CONFIG_NEC_CMBVR4133) += fixup-vr4133.o
8139 +obj-$(CONFIG_BCM_PCI) += fixup-bcm96348.o pci-bcm96348.o ops-bcm96348.o
8140
8141 #
8142 # These are still pretty much in the old state, watch, go blind.
8143 diff -urN linux.old/arch/mips/pci/ops-bcm96348.c linux.dev/arch/mips/pci/ops-bcm96348.c
8144 --- linux.old/arch/mips/pci/ops-bcm96348.c 1970-01-01 01:00:00.000000000 +0100
8145 +++ linux.dev/arch/mips/pci/ops-bcm96348.c 2006-08-25 00:39:38.000000000 +0200
8146 @@ -0,0 +1,276 @@
8147 +/*
8148 +<:copyright-gpl
8149 + Copyright 2002 Broadcom Corp. All Rights Reserved.
8150 +
8151 + This program is free software; you can distribute it and/or modify it
8152 + under the terms of the GNU General Public License (Version 2) as
8153 + published by the Free Software Foundation.
8154 +
8155 + This program is distributed in the hope it will be useful, but WITHOUT
8156 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8157 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
8158 + for more details.
8159 +
8160 + You should have received a copy of the GNU General Public License along
8161 + with this program; if not, write to the Free Software Foundation, Inc.,
8162 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
8163 +:>
8164 +*/
8165 +#include <linux/types.h>
8166 +#include <linux/pci.h>
8167 +#include <linux/kernel.h>
8168 +#include <linux/init.h>
8169 +#include <asm/addrspace.h>
8170 +
8171 +#include <bcm_intr.h>
8172 +#include <bcm_map_part.h>
8173 +#include <bcmpci.h>
8174 +
8175 +#include <linux/delay.h>
8176 +
8177 +#if defined(CONFIG_USB)
8178 +#if 0
8179 +#define DPRINT(x...) printk(x)
8180 +#else
8181 +#define DPRINT(x...)
8182 +#endif
8183 +
8184 +static int
8185 +pci63xx_int_read(unsigned int devfn, int where, u32 * value, int size);
8186 +static int
8187 +pci63xx_int_write(unsigned int devfn, int where, u32 * value, int size);
8188 +
8189 +static bool usb_mem_size_rd = FALSE;
8190 +static uint32 usb_mem_base = 0;
8191 +static uint32 usb_cfg_space_cmd_reg = 0;
8192 +#endif
8193 +static bool pci_mem_size_rd = FALSE;
8194 +
8195 +static volatile MpiRegisters * mpi = (MpiRegisters *)(MPI_BASE);
8196 +
8197 +static void mpi_SetupPciConfigAccess(uint32 addr)
8198 +{
8199 + mpi->l2pcfgctl = (DIR_CFG_SEL | DIR_CFG_USEREG | addr) & ~CONFIG_TYPE;
8200 +}
8201 +
8202 +static void mpi_ClearPciConfigAccess(void)
8203 +{
8204 + mpi->l2pcfgctl = 0x00000000;
8205 +}
8206 +
8207 +#if defined(CONFIG_USB)
8208 +/* --------------------------------------------------------------------------
8209 + Name: pci63xx_int_write
8210 +Abstract: PCI Config write on internal device(s)
8211 + -------------------------------------------------------------------------- */
8212 +static int
8213 +pci63xx_int_write(unsigned int devfn, int where, u32 * value, int size)
8214 +{
8215 + if (PCI_SLOT(devfn) != USB_HOST_SLOT) {
8216 + return PCIBIOS_SUCCESSFUL;
8217 + }
8218 +
8219 + switch (size) {
8220 + case 1:
8221 + DPRINT("W => Slot: %d Where: %2X Len: %d Data: %02X\n",
8222 + PCI_SLOT(devfn), where, size, *value);
8223 + break;
8224 + case 2:
8225 + DPRINT("W => Slot: %d Where: %2X Len: %d Data: %04X\n",
8226 + PCI_SLOT(devfn), where, size, *value);
8227 + switch (where) {
8228 + case PCI_COMMAND:
8229 + usb_cfg_space_cmd_reg = *value;
8230 + break;
8231 + default:
8232 + break;
8233 + }
8234 + break;
8235 + case 4:
8236 + DPRINT("W => Slot: %d Where: %2X Len: %d Data: %08lX\n",
8237 + PCI_SLOT(devfn), where, size, *value);
8238 + switch (where) {
8239 + case PCI_BASE_ADDRESS_0:
8240 + if (*value == 0xffffffff) {
8241 + usb_mem_size_rd = TRUE;
8242 + } else {
8243 + usb_mem_base = *value;
8244 + }
8245 + break;
8246 + default:
8247 + break;
8248 + }
8249 + break;
8250 + default:
8251 + break;
8252 + }
8253 +
8254 + return PCIBIOS_SUCCESSFUL;
8255 +}
8256 +
8257 +/* --------------------------------------------------------------------------
8258 + Name: pci63xx_int_read
8259 +Abstract: PCI Config read on internal device(s)
8260 + -------------------------------------------------------------------------- */
8261 +static int
8262 +pci63xx_int_read(unsigned int devfn, int where, u32 * value, int size)
8263 +{
8264 + uint32 retValue = 0xFFFFFFFF;
8265 +
8266 + if (PCI_SLOT(devfn) != USB_HOST_SLOT) {
8267 + return PCIBIOS_SUCCESSFUL;
8268 + }
8269 +
8270 + // For now, this is specific to the USB Host controller. We can
8271 + // make it more general if we have to...
8272 + // Emulate PCI Config accesses
8273 + switch (where) {
8274 + case PCI_VENDOR_ID:
8275 + case PCI_DEVICE_ID:
8276 + retValue = PCI_VENDOR_ID_BROADCOM | 0x63000000;
8277 + break;
8278 + case PCI_COMMAND:
8279 + case PCI_STATUS:
8280 + retValue = (0x0006 << 16) | usb_cfg_space_cmd_reg;
8281 + break;
8282 + case PCI_CLASS_REVISION:
8283 + case PCI_CLASS_DEVICE:
8284 + retValue = (PCI_CLASS_SERIAL_USB << 16) | (0x10 << 8) | 0x01;
8285 + break;
8286 + case PCI_BASE_ADDRESS_0:
8287 + if (usb_mem_size_rd) {
8288 + retValue = USB_BAR0_MEM_SIZE;
8289 + } else {
8290 + if (usb_mem_base != 0)
8291 + retValue = usb_mem_base;
8292 + else
8293 + retValue = USB_HOST_BASE;
8294 + }
8295 + usb_mem_size_rd = FALSE;
8296 + break;
8297 + case PCI_CACHE_LINE_SIZE:
8298 + case PCI_LATENCY_TIMER:
8299 + retValue = 0;
8300 + break;
8301 + case PCI_HEADER_TYPE:
8302 + retValue = PCI_HEADER_TYPE_NORMAL;
8303 + break;
8304 + case PCI_SUBSYSTEM_VENDOR_ID:
8305 + retValue = PCI_VENDOR_ID_BROADCOM;
8306 + break;
8307 + case PCI_SUBSYSTEM_ID:
8308 + retValue = 0x6300;
8309 + break;
8310 + case PCI_INTERRUPT_LINE:
8311 + retValue = INTERRUPT_ID_USBH;
8312 + break;
8313 + default:
8314 + break;
8315 + }
8316 +
8317 + switch (size) {
8318 + case 1:
8319 + *value = (retValue >> ((where & 3) << 3)) & 0xff;
8320 + DPRINT("R <= Slot: %d Where: %2X Len: %d Data: %02X\n",
8321 + PCI_SLOT(devfn), where, size, *value);
8322 + break;
8323 + case 2:
8324 + *value = (retValue >> ((where & 3) << 3)) & 0xffff;
8325 + DPRINT("R <= Slot: %d Where: %2X Len: %d Data: %04X\n",
8326 + PCI_SLOT(devfn), where, size, *value);
8327 + break;
8328 + case 4:
8329 + *value = retValue;
8330 + DPRINT("R <= Slot: %d Where: %2X Len: %d Data: %08lX\n",
8331 + PCI_SLOT(devfn), where, size, *value);
8332 + break;
8333 + default:
8334 + break;
8335 + }
8336 +
8337 + return PCIBIOS_SUCCESSFUL;
8338 +}
8339 +#endif
8340 +
8341 +static int bcm96348_pcibios_read(struct pci_bus *bus, unsigned int devfn,
8342 + int where, int size, u32 * val)
8343 +{
8344 + volatile unsigned char *ioBase = (unsigned char *)(mpi->l2piobase | KSEG1);
8345 + uint32 data;
8346 +
8347 +#if defined(CONFIG_USB)
8348 + if (PCI_SLOT(devfn) == USB_HOST_SLOT)
8349 + return pci63xx_int_read(devfn, where, val, size);
8350 +#endif
8351 +
8352 + mpi_SetupPciConfigAccess(BCM_PCI_CFG(PCI_SLOT(devfn), PCI_FUNC(devfn), where));
8353 + data = *(uint32 *)ioBase;
8354 + switch(size) {
8355 + case 1:
8356 + *val = (data >> ((where & 3) << 3)) & 0xff;
8357 + break;
8358 + case 2:
8359 + *val = (data >> ((where & 3) << 3)) & 0xffff;
8360 + break;
8361 + case 4:
8362 + *val = data;
8363 + /* Special case for reading PCI device range */
8364 + if ((where >= PCI_BASE_ADDRESS_0) && (where <= PCI_BASE_ADDRESS_5)) {
8365 + if (pci_mem_size_rd) {
8366 + /* bcm6348 PCI memory window minimum size is 64K */
8367 + *val &= PCI_SIZE_64K;
8368 + }
8369 + }
8370 + break;
8371 + default:
8372 + break;
8373 + }
8374 + pci_mem_size_rd = FALSE;
8375 + mpi_ClearPciConfigAccess();
8376 +
8377 + return PCIBIOS_SUCCESSFUL;
8378 +}
8379 +
8380 +static int bcm96348_pcibios_write(struct pci_bus *bus, unsigned int devfn,
8381 + int where, int size, u32 val)
8382 +{
8383 + volatile unsigned char *ioBase = (unsigned char *)(mpi->l2piobase | KSEG1);
8384 + uint32 data;
8385 +
8386 +#if defined(CONFIG_USB)
8387 + if (PCI_SLOT(devfn) == USB_HOST_SLOT)
8388 + return pci63xx_int_write(devfn, where, &val, size);
8389 +#endif
8390 + mpi_SetupPciConfigAccess(BCM_PCI_CFG(PCI_SLOT(devfn), PCI_FUNC(devfn), where));
8391 + data = *(uint32 *)ioBase;
8392 + switch(size) {
8393 + case 1:
8394 + data = (data & ~(0xff << ((where & 3) << 3))) |
8395 + (val << ((where & 3) << 3));
8396 + break;
8397 + case 2:
8398 + data = (data & ~(0xffff << ((where & 3) << 3))) |
8399 + (val << ((where & 3) << 3));
8400 + break;
8401 + case 4:
8402 + data = val;
8403 + /* Special case for reading PCI device range */
8404 + if ((where >= PCI_BASE_ADDRESS_0) && (where <= PCI_BASE_ADDRESS_5)) {
8405 + if (val == 0xffffffff)
8406 + pci_mem_size_rd = TRUE;
8407 + }
8408 + break;
8409 + default:
8410 + break;
8411 + }
8412 + *(uint32 *)ioBase = data;
8413 + udelay(500);
8414 + mpi_ClearPciConfigAccess();
8415 +
8416 + return PCIBIOS_SUCCESSFUL;
8417 +}
8418 +
8419 +struct pci_ops bcm96348_pci_ops = {
8420 + .read = bcm96348_pcibios_read,
8421 + .write = bcm96348_pcibios_write
8422 +};
8423 diff -urN linux-2.6.17/arch/mips/pci/pci-bcm96348.c linux-2.6.17-brcm63xx/arch/mips/pci/pci-bcm96348.c
8424 --- linux-2.6.17/arch/mips/pci/pci-bcm96348.c 1970-01-01 01:00:00.000000000 +0100
8425 +++ linux-2.6.17-brcm63xx/arch/mips/pci/pci-bcm96348.c 2006-08-29 10:25:13.000000000 +0200
8426 @@ -0,0 +1,54 @@
8427 +/*
8428 +<:copyright-gpl
8429 + Copyright 2002 Broadcom Corp. All Rights Reserved.
8430 +
8431 + This program is free software; you can distribute it and/or modify it
8432 + under the terms of the GNU General Public License (Version 2) as
8433 + published by the Free Software Foundation.
8434 +
8435 + This program is distributed in the hope it will be useful, but WITHOUT
8436 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8437 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
8438 + for more details.
8439 +
8440 + You should have received a copy of the GNU General Public License along
8441 + with this program; if not, write to the Free Software Foundation, Inc.,
8442 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
8443 +:>
8444 +*/
8445 +#include <linux/types.h>
8446 +#include <linux/pci.h>
8447 +#include <linux/kernel.h>
8448 +#include <linux/init.h>
8449 +
8450 +//#include <asm/pci_channel.h>
8451 +#include <bcmpci.h>
8452 +
8453 +static struct resource bcm_pci_io_resource = {
8454 + .name = "bcm96348 pci IO space",
8455 + .start = BCM_PCI_IO_BASE,
8456 + .end = BCM_PCI_IO_BASE + BCM_PCI_IO_SIZE_64KB - 1,
8457 + .flags = IORESOURCE_IO
8458 +};
8459 +
8460 +static struct resource bcm_pci_mem_resource = {
8461 + .name = "bcm96348 pci memory space",
8462 + .start = BCM_PCI_MEM_BASE,
8463 + .end = BCM_PCI_MEM_BASE + BCM_PCI_MEM_SIZE_16MB - 1,
8464 + .flags = IORESOURCE_MEM
8465 +};
8466 +
8467 +extern struct pci_ops bcm96348_pci_ops;
8468 +
8469 +struct pci_controller bcm96348_controller = {
8470 + .pci_ops = &bcm96348_pci_ops,
8471 + .io_resource = &bcm_pci_io_resource,
8472 + .mem_resource = &bcm_pci_mem_resource,
8473 +};
8474 +
8475 +static void bcm96348_pci_init(void)
8476 +{
8477 + register_pci_controller(&bcm96348_controller);
8478 +}
8479 +
8480 +arch_initcall(bcm96348_pci_init);
8481 diff -urN linux.old/drivers/serial/bcm63xx_cons.c linux.dev/drivers/serial/bcm63xx_cons.c
8482 --- linux.old/drivers/serial/bcm63xx_cons.c 1970-01-01 01:00:00.000000000 +0100
8483 +++ linux.dev/drivers/serial/bcm63xx_cons.c 2006-08-25 15:37:34.000000000 +0200
8484 @@ -0,0 +1,1049 @@
8485 +/*
8486 +<:copyright-gpl
8487 + Copyright 2002 Broadcom Corp. All Rights Reserved.
8488 +
8489 + This program is free software; you can distribute it and/or modify it
8490 + under the terms of the GNU General Public License (Version 2) as
8491 + published by the Free Software Foundation.
8492 +
8493 + This program is distributed in the hope it will be useful, but WITHOUT
8494 + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8495 + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
8496 + for more details.
8497 +
8498 + You should have received a copy of the GNU General Public License along
8499 + with this program; if not, write to the Free Software Foundation, Inc.,
8500 + 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
8501 +:>
8502 +*/
8503 +
8504 +/* Description: Serial port driver for the BCM963XX. */
8505 +
8506 +#define CARDNAME "bcm963xx_serial driver"
8507 +#define VERSION "2.0"
8508 +#define VER_STR CARDNAME " v" VERSION "\n"
8509 +
8510 +
8511 +#include <linux/kernel.h>
8512 +#include <linux/module.h>
8513 +#include <linux/version.h>
8514 +#include <linux/init.h>
8515 +#include <linux/slab.h>
8516 +#include <linux/interrupt.h>
8517 +#include <linux/spinlock.h>
8518 +
8519 +/* for definition of struct console */
8520 +#include <linux/console.h>
8521 +#include <linux/tty.h>
8522 +#include <linux/tty_flip.h>
8523 +#include <linux/serial.h>
8524 +#include <linux/serialP.h>
8525 +#include <asm/uaccess.h>
8526 +
8527 +#include <bcmtypes.h>
8528 +#include <board.h>
8529 +#include <bcm_map_part.h>
8530 +#include <bcm_intr.h>
8531 +
8532 +static DEFINE_SPINLOCK(bcm963xx_serial_lock);
8533 +
8534 +extern void _putc(char);
8535 +extern void _puts(const char *);
8536 +
8537 +typedef struct bcm_serial {
8538 + volatile Uart * port;
8539 + int type;
8540 + int flags;
8541 + int irq;
8542 + int baud_base;
8543 + int blocked_open;
8544 + unsigned short close_delay;
8545 + unsigned short closing_wait;
8546 + unsigned short line; /* port/line number */
8547 + unsigned short cflags; /* line configuration flag */
8548 + unsigned short x_char; /* xon/xoff character */
8549 + unsigned short read_status_mask; /* mask for read condition */
8550 + unsigned short ignore_status_mask; /* mask for ignore condition */
8551 + unsigned long event; /* mask used in BH */
8552 + int xmit_head; /* Position of the head */
8553 + int xmit_tail; /* Position of the tail */
8554 + int xmit_cnt; /* Count of the chars in the buffer */
8555 + int count; /* indicates how many times it has been opened */
8556 + int magic;
8557 +
8558 + struct async_icount icount; /* keep track of things ... */
8559 + struct tty_struct *tty; /* tty associated */
8560 + struct termios normal_termios;
8561 +
8562 + wait_queue_head_t open_wait;
8563 + wait_queue_head_t close_wait;
8564 +
8565 + long session; /* Session of opening process */
8566 + long pgrp; /* pgrp of opening process */
8567 +
8568 + unsigned char is_initialized;
8569 +} Context;
8570 +
8571 +
8572 +/*---------------------------------------------------------------------*/
8573 +/* Define bits in the Interrupt Enable register */
8574 +/*---------------------------------------------------------------------*/
8575 +/* Enable receive interrupt */
8576 +#define RXINT (RXFIFONE|RXOVFERR)
8577 +
8578 +/* Enable transmit interrupt */
8579 +#define TXINT (TXFIFOEMT|TXUNDERR|TXOVFERR)
8580 +
8581 +/* Enable receiver line status interrupt */
8582 +#define LSINT (RXBRK|RXPARERR|RXFRAMERR)
8583 +
8584 +#define BCM_NUM_UARTS 1
8585 +
8586 +#define BD_BCM63XX_TIMER_CLOCK_INPUT (FPERIPH)
8587 +
8588 +
8589 +static struct bcm_serial multi[BCM_NUM_UARTS];
8590 +static struct bcm_serial *lines[BCM_NUM_UARTS];
8591 +static struct tty_driver *serial_driver;
8592 +static struct termios *serial_termios[BCM_NUM_UARTS];
8593 +static struct termios *serial_termios_locked[BCM_NUM_UARTS];
8594 +
8595 +
8596 +static void bcm_stop (struct tty_struct *tty);
8597 +static void bcm_start (struct tty_struct *tty);
8598 +static inline void receive_chars (struct bcm_serial * info);
8599 +static int startup (struct bcm_serial *info);
8600 +static void shutdown (struct bcm_serial * info);
8601 +static void change_speed( volatile Uart *pUart, tcflag_t cFlag );
8602 +static void bcm63xx_cons_flush_chars (struct tty_struct *tty);
8603 +static int bcm63xx_cons_write (struct tty_struct *tty,
8604 + const unsigned char *buf, int count);
8605 +static int bcm63xx_cons_write_room (struct tty_struct *tty);
8606 +static int bcm_chars_in_buffer (struct tty_struct *tty);
8607 +static void bcm_flush_buffer (struct tty_struct *tty);
8608 +static void bcm_throttle (struct tty_struct *tty);
8609 +static void bcm_unthrottle (struct tty_struct *tty);
8610 +static void bcm_send_xchar (struct tty_struct *tty, char ch);
8611 +static int get_serial_info(struct bcm_serial *info, struct serial_struct *retinfo);
8612 +static int set_serial_info (struct bcm_serial *info, struct serial_struct *new_info);
8613 +static int get_lsr_info (struct bcm_serial *info, unsigned int *value);
8614 +static void send_break (struct bcm_serial *info, int duration);
8615 +static int bcm_ioctl (struct tty_struct * tty, struct file * file,
8616 + unsigned int cmd, unsigned long arg);
8617 +static void bcm_set_termios (struct tty_struct *tty, struct termios *old_termios);
8618 +static void bcm63xx_cons_close (struct tty_struct *tty, struct file *filp);
8619 +static void bcm_hangup (struct tty_struct *tty);
8620 +static int block_til_ready (struct tty_struct *tty, struct file *filp, struct bcm_serial *info);
8621 +static int bcm63xx_cons_open (struct tty_struct * tty, struct file * filp);
8622 +static int __init bcm63xx_serialinit(void);
8623 +
8624 +
8625 +/*
8626 + * ------------------------------------------------------------
8627 + * rs_stop () and rs_start ()
8628 + *
8629 + * These routines are called before setting or resetting
8630 + * tty->stopped. They enable or disable transmitter interrupts,
8631 + * as necessary.
8632 + * ------------------------------------------------------------
8633 + */
8634 +static void bcm_stop (struct tty_struct *tty)
8635 +{
8636 +}
8637 +
8638 +static void bcm_start (struct tty_struct *tty)
8639 +{
8640 + _puts(CARDNAME " Start\n");
8641 +}
8642 +
8643 +/*
8644 + * ------------------------------------------------------------
8645 + * receive_char ()
8646 + *
8647 + * This routine deals with inputs from any lines.
8648 + * ------------------------------------------------------------
8649 + */
8650 +static inline void receive_chars (struct bcm_serial * info)
8651 +{
8652 + struct tty_struct *tty = 0;
8653 + struct async_icount * icount;
8654 + int ignore = 0;
8655 + unsigned short status, tmp;
8656 + UCHAR ch = 0;
8657 + while ((status = info->port->intStatus) & RXINT)
8658 + {
8659 + char flag_char = TTY_NORMAL;
8660 +
8661 + if (status & RXFIFONE)
8662 + ch = info->port->Data; // Read the character
8663 + tty = info->tty; /* now tty points to the proper dev */
8664 + icount = &info->icount;
8665 + if (! tty)
8666 + break;
8667 + if (!tty_buffer_request_room(tty, 1))
8668 + break;
8669 + icount->rx++;
8670 + if (status & RXBRK)
8671 + {
8672 + flag_char = TTY_BREAK;
8673 + icount->brk++;
8674 + }
8675 + // keep track of the statistics
8676 + if (status & (RXFRAMERR | RXPARERR | RXOVFERR))
8677 + {
8678 + if (status & RXPARERR) /* parity error */
8679 + icount->parity++;
8680 + else
8681 + if (status & RXFRAMERR) /* frame error */
8682 + icount->frame++;
8683 + if (status & RXOVFERR)
8684 + {
8685 + // Overflow. Reset the RX FIFO
8686 + info->port->fifoctl |= RSTRXFIFOS;
8687 + icount->overrun++;
8688 + }
8689 + // check to see if we should ignore the character
8690 + // and mask off conditions that should be ignored
8691 + if (status & info->ignore_status_mask)
8692 + {
8693 + if (++ignore > 100 )
8694 + break;
8695 + goto ignore_char;
8696 + }
8697 + // Mask off the error conditions we want to ignore
8698 + tmp = status & info->read_status_mask;
8699 + if (tmp & RXPARERR)
8700 + {
8701 + flag_char = TTY_PARITY;
8702 + }
8703 + else
8704 + if (tmp & RXFRAMERR)
8705 + {
8706 + flag_char = TTY_FRAME;
8707 + }
8708 + if (tmp & RXOVFERR)
8709 + {
8710 + tty_insert_flip_char(tty, ch, flag_char);
8711 + ch = 0;
8712 + flag_char = TTY_OVERRUN;
8713 + if (!tty_buffer_request_room(tty, 1))
8714 + break;
8715 + }
8716 + }
8717 + tty_insert_flip_char(tty, ch, flag_char);
8718 + }
8719 +ignore_char:;
8720 + tty_flip_buffer_push(tty);
8721 + tty_schedule_flip(tty);
8722 +
8723 +}
8724 +
8725 +
8726 +/*
8727 + * ------------------------------------------------------------
8728 + * bcm_interrupt ()
8729 + *
8730 + * this is the main interrupt routine for the chip.
8731 + * It deals with the multiple ports.
8732 + * ------------------------------------------------------------
8733 + */
8734 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
8735 +static irqreturn_t bcm_interrupt (int irq, void * dev)
8736 +#else
8737 +static void bcm_interrupt (int irq, void * dev, struct pt_regs * regs)
8738 +#endif
8739 +{
8740 + struct bcm_serial * info = lines[0];
8741 + UINT16 intStat;
8742 +
8743 + /* get pending interrupt flags from UART */
8744 +
8745 + /* Mask with only the serial interrupts that are enabled */
8746 + intStat = info->port->intStatus & info->port->intMask;
8747 + while (intStat)
8748 + {
8749 + if (intStat & RXINT)
8750 + receive_chars (info);
8751 + else
8752 + if (intStat & TXINT)
8753 + info->port->intStatus = TXINT;
8754 + else /* don't know what it was, so let's mask it */
8755 + info->port->intMask &= ~intStat;
8756 +
8757 + intStat = info->port->intStatus & info->port->intMask;
8758 + }
8759 +
8760 + // Clear the interrupt
8761 + BcmHalInterruptEnable (INTERRUPT_ID_UART);
8762 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
8763 + return IRQ_HANDLED;
8764 +#endif
8765 +}
8766 +
8767 +/*
8768 + * -------------------------------------------------------------------
8769 + * startup ()
8770 + *
8771 + * various initialization tasks
8772 + * -------------------------------------------------------------------
8773 + */
8774 +static int startup (struct bcm_serial *info)
8775 +{
8776 + // Port is already started...
8777 + return 0;
8778 +}
8779 +
8780 +/*
8781 + * -------------------------------------------------------------------
8782 + * shutdown ()
8783 + *
8784 + * This routine will shutdown a serial port; interrupts are disabled, and
8785 + * DTR is dropped if the hangup on close termio flag is on.
8786 + * -------------------------------------------------------------------
8787 + */
8788 +static void shutdown (struct bcm_serial * info)
8789 +{
8790 + unsigned long flags;
8791 + if (!info->is_initialized)
8792 + return;
8793 +
8794 + spin_lock_irqsave(&bcm963xx_serial_lock, flags);
8795 +
8796 + info->port->control &= ~(BRGEN|TXEN|RXEN);
8797 + if (info->tty)
8798 + set_bit (TTY_IO_ERROR, &info->tty->flags);
8799 + info->is_initialized = 0;
8800 +
8801 + spin_unlock_irqrestore(&bcm963xx_serial_lock, flags);
8802 +}
8803 +/*
8804 + * -------------------------------------------------------------------
8805 + * change_speed ()
8806 + *
8807 + * Set the baud rate, character size, parity and stop bits.
8808 + * -------------------------------------------------------------------
8809 + */
8810 +static void change_speed( volatile Uart *pUart, tcflag_t cFlag )
8811 +{
8812 + unsigned long ulFlags, ulBaud, ulClockFreqHz, ulTmp;
8813 +
8814 + spin_lock_irqsave(&bcm963xx_serial_lock, ulFlags);
8815 + switch( cFlag & (CBAUD | CBAUDEX) )
8816 + {
8817 + case B115200:
8818 + ulBaud = 115200;
8819 + break;
8820 + case B57600:
8821 + ulBaud = 57600;
8822 + break;
8823 + case B38400:
8824 + ulBaud = 38400;
8825 + break;
8826 + case B19200:
8827 + ulBaud = 19200;
8828 + break;
8829 + case B9600:
8830 + ulBaud = 9600;
8831 + break;
8832 + case B4800:
8833 + ulBaud = 4800;
8834 + break;
8835 + case B2400:
8836 + ulBaud = 2400;
8837 + break;
8838 + case B1800:
8839 + ulBaud = 1800;
8840 + break;
8841 + case B1200:
8842 + ulBaud = 1200;
8843 + break;
8844 + case B600:
8845 + ulBaud = 600;
8846 + break;
8847 + case B300:
8848 + ulBaud = 300;
8849 + break;
8850 + case B200:
8851 + ulBaud = 200;
8852 + break;
8853 + case B150:
8854 + ulBaud = 150;
8855 + break;
8856 + case B134:
8857 + ulBaud = 134;
8858 + break;
8859 + case B110:
8860 + ulBaud = 110;
8861 + break;
8862 + case B75:
8863 + ulBaud = 75;
8864 + break;
8865 + case B50:
8866 + ulBaud = 50;
8867 + break;
8868 + default:
8869 + ulBaud = 115200;
8870 + break;
8871 + }
8872 +
8873 + /* Calculate buad rate. */
8874 + ulClockFreqHz = BD_BCM63XX_TIMER_CLOCK_INPUT;
8875 + ulTmp = (ulClockFreqHz / ulBaud) / 16;
8876 + if( ulTmp & 0x01 )
8877 + ulTmp /= 2; /* Rounding up, so sub is already accounted for */
8878 + else
8879 + ulTmp = (ulTmp / 2) - 1; /* Rounding down so we must sub 1 */
8880 + pUart->baudword = ulTmp;
8881 +
8882 + /* Set character size, stop bits and parity. */
8883 + switch( cFlag & CSIZE )
8884 + {
8885 + case CS5:
8886 + ulTmp = BITS5SYM; /* select transmit 5 bit data size */
8887 + break;
8888 + case CS6:
8889 + ulTmp = BITS6SYM; /* select transmit 6 bit data size */
8890 + break;
8891 + case CS7:
8892 + ulTmp = BITS7SYM; /* select transmit 7 bit data size */
8893 + break;
8894 + default:
8895 + ulTmp = BITS8SYM; /* select transmit 8 bit data size */
8896 + break;
8897 + }
8898 + if( cFlag & CSTOPB )
8899 + ulTmp |= TWOSTOP; /* select 2 stop bits */
8900 + else
8901 + ulTmp |= ONESTOP; /* select one stop bit */
8902 +
8903 + /* Write these values into the config reg. */
8904 + pUart->config = ulTmp;
8905 + pUart->control &= ~(RXPARITYEN | TXPARITYEN | RXPARITYEVEN | TXPARITYEVEN);
8906 + switch( cFlag & (PARENB | PARODD) )
8907 + {
8908 + case PARENB|PARODD:
8909 + pUart->control |= RXPARITYEN | TXPARITYEN;
8910 + break;
8911 + case PARENB:
8912 + pUart->control |= RXPARITYEN | TXPARITYEN | RXPARITYEVEN | TXPARITYEVEN;
8913 + break;
8914 + default:
8915 + pUart->control |= 0;
8916 + break;
8917 + }
8918 +
8919 + /* Reset and flush uart */
8920 + pUart->fifoctl = RSTTXFIFOS | RSTRXFIFOS;
8921 + spin_unlock_irqrestore(&bcm963xx_serial_lock, ulFlags);
8922 +}
8923 +
8924 +
8925 +/*
8926 + * -------------------------------------------------------------------
8927 + * bcm_flush_char ()
8928 + *
8929 + * Nothing to flush. Polled I/O is used.
8930 + * -------------------------------------------------------------------
8931 + */
8932 +static void bcm63xx_cons_flush_chars (struct tty_struct *tty)
8933 +{
8934 +}
8935 +
8936 +
8937 +/*
8938 + * -------------------------------------------------------------------
8939 + * bcm63xx_cons_write ()
8940 + *
8941 + * Main output routine using polled I/O.
8942 + * -------------------------------------------------------------------
8943 + */
8944 +static int bcm63xx_cons_write (struct tty_struct *tty,
8945 + const unsigned char *buf, int count)
8946 +{
8947 + int c;
8948 +
8949 + for (c = 0; c < count; c++)
8950 + _putc(buf[c]);
8951 + return count;
8952 +}
8953 +
8954 +/*
8955 + * -------------------------------------------------------------------
8956 + * bcm63xx_cons_write_room ()
8957 + *
8958 + * Compute the amount of space available for writing.
8959 + * -------------------------------------------------------------------
8960 + */
8961 +static int bcm63xx_cons_write_room (struct tty_struct *tty)
8962 +{
8963 + /* Pick a number. Any number. Polled I/O is used. */
8964 + return 1024;
8965 +}
8966 +
8967 +/*
8968 + * -------------------------------------------------------------------
8969 + * bcm_chars_in_buffer ()
8970 + *
8971 + * compute the amount of char left to be transmitted
8972 + * -------------------------------------------------------------------
8973 + */
8974 +static int bcm_chars_in_buffer (struct tty_struct *tty)
8975 +{
8976 + return 0;
8977 +}
8978 +
8979 +/*
8980 + * -------------------------------------------------------------------
8981 + * bcm_flush_buffer ()
8982 + *
8983 + * Empty the output buffer
8984 + * -------------------------------------------------------------------
8985 + */
8986 +static void bcm_flush_buffer (struct tty_struct *tty)
8987 +{
8988 + tty_wakeup(tty);
8989 +}
8990 +
8991 +/*
8992 + * ------------------------------------------------------------
8993 + * bcm_throttle () and bcm_unthrottle ()
8994 + *
8995 + * This routine is called by the upper-layer tty layer to signal that
8996 + * incoming characters should be throttled (or not).
8997 + * ------------------------------------------------------------
8998 + */
8999 +static void bcm_throttle (struct tty_struct *tty)
9000 +{
9001 + struct bcm_serial *info = (struct bcm_serial *)tty->driver_data;
9002 + if (I_IXOFF(tty))
9003 + info->x_char = STOP_CHAR(tty);
9004 +}
9005 +
9006 +static void bcm_unthrottle (struct tty_struct *tty)
9007 +{
9008 + struct bcm_serial *info = (struct bcm_serial *)tty->driver_data;
9009 + if (I_IXOFF(tty))
9010 + {
9011 + if (info->x_char)
9012 + info->x_char = 0;
9013 + else
9014 + info->x_char = START_CHAR(tty);
9015 + }
9016 +}
9017 +
9018 +static void bcm_send_xchar (struct tty_struct *tty, char ch)
9019 +{
9020 + struct bcm_serial *info = (struct bcm_serial *)tty->driver_data;
9021 + info->x_char = ch;
9022 + if (ch)
9023 + bcm_start (info->tty);
9024 +}
9025 +
9026 +/*
9027 + * ------------------------------------------------------------
9028 + * rs_ioctl () and friends
9029 + * ------------------------------------------------------------
9030 + */
9031 +static int get_serial_info(struct bcm_serial *info, struct serial_struct *retinfo)
9032 +{
9033 + struct serial_struct tmp;
9034 +
9035 + if (!retinfo)
9036 + return -EFAULT;
9037 +
9038 + memset (&tmp, 0, sizeof(tmp));
9039 + tmp.type = info->type;
9040 + tmp.line = info->line;
9041 + tmp.port = (int) info->port;
9042 + tmp.irq = info->irq;
9043 + tmp.flags = 0;
9044 + tmp.baud_base = info->baud_base;
9045 + tmp.close_delay = info->close_delay;
9046 + tmp.closing_wait = info->closing_wait;
9047 +
9048 + return copy_to_user (retinfo, &tmp, sizeof(*retinfo));
9049 +}
9050 +
9051 +static int set_serial_info (struct bcm_serial *info, struct serial_struct *new_info)
9052 +{
9053 + struct serial_struct new_serial;
9054 + struct bcm_serial old_info;
9055 + int retval = 0;
9056 +
9057 + if (!new_info)
9058 + return -EFAULT;
9059 +
9060 + copy_from_user (&new_serial, new_info, sizeof(new_serial));
9061 + old_info = *info;
9062 +
9063 + if (!capable(CAP_SYS_ADMIN))
9064 + return -EPERM;
9065 +
9066 +
9067 + if (info->count > 1)
9068 + return -EBUSY;
9069 +
9070 + /* OK, past this point, all the error checking has been done.
9071 + * At this point, we start making changes.....
9072 + */
9073 + info->baud_base = new_serial.baud_base;
9074 + info->type = new_serial.type;
9075 + info->close_delay = new_serial.close_delay;
9076 + info->closing_wait = new_serial.closing_wait;
9077 + retval = startup (info);
9078 + return retval;
9079 +}
9080 +
9081 +/*
9082 + * get_lsr_info - get line status register info
9083 + *
9084 + * Purpose: Let user call ioctl() to get info when the UART physically
9085 + * is emptied. On bus types like RS485, the transmitter must
9086 + * release the bus after transmitting. This must be done when
9087 + * the transmit shift register is empty, not be done when the
9088 + * transmit holding register is empty. This functionality
9089 + * allows an RS485 driver to be written in user space.
9090 + */
9091 +static int get_lsr_info (struct bcm_serial *info, unsigned int *value)
9092 +{
9093 + return( 0 );
9094 +}
9095 +
9096 +/*
9097 + * This routine sends a break character out the serial port.
9098 + */
9099 +static void send_break (struct bcm_serial *info, int duration)
9100 +{
9101 + unsigned long flags;
9102 +
9103 + if (!info->port)
9104 + return;
9105 +
9106 + current->state = TASK_INTERRUPTIBLE;
9107 +
9108 + /*save_flags (flags);
9109 + cli();*/
9110 + spin_lock_irqsave(&bcm963xx_serial_lock, flags);
9111 +
9112 + info->port->control |= XMITBREAK;
9113 + schedule_timeout(duration);
9114 + info->port->control &= ~XMITBREAK;
9115 +
9116 + spin_unlock_irqrestore(&bcm963xx_serial_lock, flags);
9117 + //restore_flags (flags);
9118 +}
9119 +
9120 +static int bcm_ioctl (struct tty_struct * tty, struct file * file,
9121 + unsigned int cmd, unsigned long arg)
9122 +{
9123 + int error;
9124 + struct bcm_serial * info = (struct bcm_serial *)tty->driver_data;
9125 + int retval;
9126 +
9127 + if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
9128 + (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGWILD) &&
9129 + (cmd != TIOCSERSWILD) && (cmd != TIOCSERGSTRUCT))
9130 + {
9131 + if (tty->flags & (1 << TTY_IO_ERROR))
9132 + return -EIO;
9133 + }
9134 + switch (cmd)
9135 + {
9136 +
9137 + case TCSBRK: /* SVID version: non-zero arg --> no break */
9138 + retval = tty_check_change (tty);
9139 + if (retval)
9140 + return retval;
9141 + tty_wait_until_sent (tty, 0);
9142 + if (!arg)
9143 + send_break (info, HZ/4); /* 1/4 second */
9144 + return 0;
9145 +
9146 + case TCSBRKP: /* support for POSIX tcsendbreak() */
9147 + retval = tty_check_change (tty);
9148 + if (retval)
9149 + return retval;
9150 + tty_wait_until_sent (tty, 0);
9151 + send_break (info, arg ? arg*(HZ/10) : HZ/4);
9152 + return 0;
9153 +
9154 + case TIOCGSOFTCAR:
9155 + error = access_ok (VERIFY_WRITE, (void *)arg, sizeof(long));
9156 + if (!error)
9157 + return -EFAULT;
9158 + else
9159 + {
9160 + put_user (C_CLOCAL(tty) ? 1 : 0, (unsigned long *)arg);
9161 + return 0;
9162 + }
9163 +
9164 + case TIOCSSOFTCAR:
9165 + error = get_user (arg, (unsigned long *)arg);
9166 + if (error)
9167 + return error;
9168 + tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) | (arg ? CLOCAL : 0));
9169 + return 0;
9170 +
9171 + case TIOCGSERIAL:
9172 + error = access_ok (VERIFY_WRITE, (void *)arg, sizeof(struct serial_struct));
9173 + if (!error)
9174 + return -EFAULT;
9175 + else
9176 + return get_serial_info (info, (struct serial_struct *)arg);
9177 +
9178 + case TIOCSSERIAL:
9179 + return set_serial_info (info, (struct serial_struct *) arg);
9180 +
9181 + case TIOCSERGETLSR: /* Get line status register */
9182 + error = access_ok (VERIFY_WRITE, (void *)arg, sizeof(unsigned int));
9183 + if (!error)
9184 + return -EFAULT;
9185 + else
9186 + return get_lsr_info (info, (unsigned int *)arg);
9187 +
9188 + case TIOCSERGSTRUCT:
9189 + error = access_ok (VERIFY_WRITE, (void *)arg, sizeof(struct bcm_serial));
9190 + if (!error)
9191 + return -EFAULT;
9192 + else
9193 + {
9194 + copy_to_user((struct bcm_serial *)arg, info, sizeof(struct bcm_serial));
9195 + return 0;
9196 + }
9197 +
9198 + default:
9199 + return -ENOIOCTLCMD;
9200 + }
9201 + return 0;
9202 +}
9203 +
9204 +static void bcm_set_termios (struct tty_struct *tty, struct termios *old_termios)
9205 +{
9206 + struct bcm_serial *info = (struct bcm_serial *)tty->driver_data;
9207 +
9208 + if( tty->termios->c_cflag != old_termios->c_cflag )
9209 + change_speed (info->port, tty->termios->c_cflag);
9210 +}
9211 +
9212 +/*
9213 + * ------------------------------------------------------------
9214 + * bcm63xx_cons_close()
9215 + *
9216 + * This routine is called when the serial port gets closed. First, we
9217 + * wait for the last remaining data to be sent. Then, we turn off
9218 + * the transmit enable and receive enable flags.
9219 + * ------------------------------------------------------------
9220 + */
9221 +static void bcm63xx_cons_close (struct tty_struct *tty, struct file *filp)
9222 +{
9223 + struct bcm_serial * info = (struct bcm_serial *)tty->driver_data;
9224 + unsigned long flags;
9225 +
9226 + if (!info)
9227 + return;
9228 +
9229 + /*save_flags (flags);
9230 + cli();*/
9231 + spin_lock_irqsave(&bcm963xx_serial_lock, flags);
9232 +
9233 + if (tty_hung_up_p (filp))
9234 + {
9235 + spin_unlock_irqrestore(&bcm963xx_serial_lock, flags);
9236 + //restore_flags (flags);
9237 + return;
9238 + }
9239 +
9240 + if ((tty->count == 1) && (info->count != 1))
9241 + {
9242 +
9243 + /* Uh, oh. tty->count is 1, which means that the tty
9244 + * structure will be freed. Info->count should always
9245 + * be one in these conditions. If it's greater than
9246 + * one, we've got real problems, since it means the
9247 + * serial port won't be shutdown.
9248 + */
9249 + printk("bcm63xx_cons_close: bad serial port count; tty->count is 1, "
9250 + "info->count is %d\n", info->count);
9251 + info->count = 1;
9252 + }
9253 +
9254 + if (--info->count < 0)
9255 + {
9256 + printk("ds_close: bad serial port count for ttys%d: %d\n",
9257 + info->line, info->count);
9258 + info->count = 0;
9259 + }
9260 +
9261 + if (info->count)
9262 + {
9263 + //restore_flags (flags);
9264 + spin_unlock_irqrestore(&bcm963xx_serial_lock, flags);
9265 + return;
9266 + }
9267 +
9268 + /* Now we wait for the transmit buffer to clear; and we notify
9269 + * the line discipline to only process XON/XOFF characters.
9270 + */
9271 + tty->closing = 1;
9272 +
9273 + /* At this point we stop accepting input. To do this, we
9274 + * disable the receive line status interrupts.
9275 + */
9276 + shutdown (info);
9277 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
9278 + if (tty->driver->flush_buffer)
9279 + tty->driver->flush_buffer (tty);
9280 +#else
9281 + if (tty->driver.flush_buffer)
9282 + tty->driver.flush_buffer (tty);
9283 +#endif
9284 + if (tty->ldisc.flush_buffer)
9285 + tty->ldisc.flush_buffer (tty);
9286 +
9287 + tty->closing = 0;
9288 + info->event = 0;
9289 + info->tty = 0;
9290 + if (tty->ldisc.num != tty_ldisc_get(N_TTY)->num)
9291 + {
9292 + if (tty->ldisc.close)
9293 + (tty->ldisc.close)(tty);
9294 + tty->ldisc = *tty_ldisc_get(N_TTY);
9295 + tty->termios->c_line = N_TTY;
9296 + if (tty->ldisc.open)
9297 + (tty->ldisc.open)(tty);
9298 + }
9299 + if (info->blocked_open)
9300 + {
9301 + if (info->close_delay)
9302 + {
9303 + current->state = TASK_INTERRUPTIBLE;
9304 + schedule_timeout(info->close_delay);
9305 + }
9306 + wake_up_interruptible (&info->open_wait);
9307 + }
9308 + wake_up_interruptible (&info->close_wait);
9309 +
9310 + //restore_flags (flags);
9311 + spin_unlock_irqrestore(&bcm963xx_serial_lock, flags);
9312 +}
9313 +
9314 +/*
9315 + * bcm_hangup () --- called by tty_hangup() when a hangup is signaled.
9316 + */
9317 +static void bcm_hangup (struct tty_struct *tty)
9318 +{
9319 +
9320 + struct bcm_serial *info = (struct bcm_serial *)tty->driver_data;
9321 +
9322 + shutdown (info);
9323 + info->event = 0;
9324 + info->count = 0;
9325 + info->tty = 0;
9326 + wake_up_interruptible (&info->open_wait);
9327 +}
9328 +
9329 +/*
9330 + * ------------------------------------------------------------
9331 + * rs_open() and friends
9332 + * ------------------------------------------------------------
9333 + */
9334 +static int block_til_ready (struct tty_struct *tty, struct file *filp,
9335 + struct bcm_serial *info)
9336 +{
9337 + return 0;
9338 +}
9339 +
9340 +/*
9341 + * This routine is called whenever a serial port is opened. It
9342 + * enables interrupts for a serial port. It also performs the
9343 + * serial-specific initialization for the tty structure.
9344 + */
9345 +static int bcm63xx_cons_open (struct tty_struct * tty, struct file * filp)
9346 +{
9347 + struct bcm_serial *info;
9348 + int retval, line;
9349 +
9350 + // Make sure we're only opening on of the ports we support
9351 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
9352 + line = MINOR(tty->driver->cdev.dev) - tty->driver->minor_start;
9353 +#else
9354 + line = MINOR(tty->device) - tty->driver.minor_start;
9355 +#endif
9356 +
9357 + if ((line < 0) || (line >= BCM_NUM_UARTS))
9358 + return -ENODEV;
9359 +
9360 + info = lines[line];
9361 +
9362 + tty->low_latency=1;
9363 + info->port->intMask = 0; /* Clear any pending interrupts */
9364 + info->port->intMask = RXINT; /* Enable RX */
9365 +
9366 + info->count++;
9367 + tty->driver_data = info;
9368 + info->tty = tty;
9369 + BcmHalInterruptEnable (INTERRUPT_ID_UART);
9370 +
9371 + // Start up serial port
9372 + retval = startup (info);
9373 + if (retval)
9374 + return retval;
9375 +
9376 + retval = block_til_ready (tty, filp, info);
9377 + if (retval)
9378 + return retval;
9379 +
9380 +
9381 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
9382 + info->pgrp = process_group(current);
9383 + info->session = current->signal->session;
9384 +#else
9385 + info->session = current->session;
9386 + info->pgrp = current->pgrp;
9387 +#endif
9388 +
9389 + return 0;
9390 +}
9391 +
9392 +
9393 +static struct tty_operations rs_ops = {
9394 + .open = bcm63xx_cons_open,
9395 + .close = bcm63xx_cons_close,
9396 + .write = bcm63xx_cons_write,
9397 + .flush_chars = bcm63xx_cons_flush_chars,
9398 + .write_room = bcm63xx_cons_write_room,
9399 + .chars_in_buffer = bcm_chars_in_buffer,
9400 + .flush_buffer = bcm_flush_buffer,
9401 + .ioctl = bcm_ioctl,
9402 + .throttle = bcm_throttle,
9403 + .unthrottle = bcm_unthrottle,
9404 + .send_xchar = bcm_send_xchar,
9405 + .set_termios = bcm_set_termios,
9406 + .stop = bcm_stop,
9407 + .start = bcm_start,
9408 + .hangup = bcm_hangup,
9409 +};
9410 +
9411 +/* --------------------------------------------------------------------------
9412 + Name: bcm63xx_serialinit
9413 + Purpose: Initialize our BCM63xx serial driver
9414 +-------------------------------------------------------------------------- */
9415 +static int __init bcm63xx_serialinit(void)
9416 +{
9417 + int i, flags;
9418 + struct bcm_serial * info;
9419 +
9420 + // Print the driver version information
9421 + printk(VER_STR);
9422 + serial_driver = alloc_tty_driver(BCM_NUM_UARTS);
9423 + if (!serial_driver)
9424 + return -ENOMEM;
9425 +
9426 + serial_driver->owner = THIS_MODULE;
9427 + serial_driver->devfs_name = "tts/";
9428 +// serial_driver.magic = TTY_DRIVER_MAGIC;
9429 + serial_driver->name = "ttyS";
9430 + serial_driver->major = TTY_MAJOR;
9431 + serial_driver->minor_start = 64;
9432 +// serial_driver.num = BCM_NUM_UARTS;
9433 + serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
9434 + serial_driver->subtype = SERIAL_TYPE_NORMAL;
9435 + serial_driver->init_termios = tty_std_termios;
9436 + serial_driver->init_termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
9437 + serial_driver->flags = TTY_DRIVER_REAL_RAW;
9438 +
9439 + serial_driver->termios = serial_termios;
9440 + serial_driver->termios_locked = serial_termios_locked;
9441 +
9442 + tty_set_operations(serial_driver, &rs_ops);
9443 +
9444 + if (tty_register_driver (serial_driver))
9445 + panic("Couldn't register serial driver\n");
9446 +
9447 + //save_flags(flags); cli();
9448 + spin_lock_irqsave(&bcm963xx_serial_lock, flags);
9449 +
9450 + for (i = 0; i < BCM_NUM_UARTS; i++)
9451 + {
9452 + info = &multi[i];
9453 + lines[i] = info;
9454 + info->magic = SERIAL_MAGIC;
9455 + info->port = (Uart *) ((char *)UART_BASE + (i * 0x20));
9456 + info->tty = 0;
9457 + info->irq = (2 - i) + 8;
9458 + info->line = i;
9459 + info->close_delay = 50;
9460 + info->closing_wait = 3000;
9461 + info->x_char = 0;
9462 + info->event = 0;
9463 + info->count = 0;
9464 + info->blocked_open = 0;
9465 + info->normal_termios = serial_driver->init_termios;
9466 + init_waitqueue_head(&info->open_wait);
9467 + init_waitqueue_head(&info->close_wait);
9468 +
9469 + /* If we are pointing to address zero then punt - not correctly
9470 + * set up in setup.c to handle this.
9471 + */
9472 + if (! info->port)
9473 + return 0;
9474 + BcmHalMapInterrupt(bcm_interrupt, 0, INTERRUPT_ID_UART);
9475 + }
9476 +
9477 + /* order matters here... the trick is that flags
9478 + * is updated... in request_irq - to immediatedly obliterate
9479 + * it is unwise.
9480 + */
9481 + spin_unlock_irqrestore(&bcm963xx_serial_lock, flags);
9482 + return 0;
9483 +}
9484 +
9485 +module_init(bcm63xx_serialinit);
9486 +
9487 +/* --------------------------------------------------------------------------
9488 + Name: bcm_console_print
9489 + Purpose: bcm_console_print is registered for printk.
9490 + The console_lock must be held when we get here.
9491 +-------------------------------------------------------------------------- */
9492 +static void bcm_console_print (struct console * cons, const char * str,
9493 + unsigned int count)
9494 +{
9495 + unsigned int i;
9496 + //_puts(str);
9497 + for(i=0; i<count; i++, str++)
9498 + {
9499 + _putc(*str);
9500 + if (*str == 10)
9501 + {
9502 + _putc(13);
9503 + }
9504 + }
9505 +}
9506 +
9507 +static struct tty_driver * bcm_console_device(struct console * c, int *index)
9508 +{
9509 + *index = c->index;
9510 + return serial_driver;
9511 +}
9512 +
9513 +static int __init bcm_console_setup(struct console * co, char * options)
9514 +{
9515 + return 0;
9516 +}
9517 +
9518 +static struct console bcm_sercons = {
9519 + .name = "ttyS",
9520 + .write = bcm_console_print,
9521 + .device = bcm_console_device,
9522 + .setup = bcm_console_setup,
9523 + .flags = CON_PRINTBUFFER,
9524 + .index = -1,
9525 +};
9526 +
9527 +static int __init bcm63xx_console_init(void)
9528 +{
9529 + register_console(&bcm_sercons);
9530 + return 0;
9531 +}
9532 +
9533 +console_initcall(bcm63xx_console_init);
9534 diff -urN linux.old/drivers/serial/Makefile linux.dev/drivers/serial/Makefile
9535 --- linux.old/drivers/serial/Makefile 2006-06-18 03:49:35.000000000 +0200
9536 +++ linux.dev/drivers/serial/Makefile 2006-08-25 15:38:44.000000000 +0200
9537 @@ -55,3 +55,4 @@
9538 obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o
9539 obj-$(CONFIG_SERIAL_SGI_IOC3) += ioc3_serial.o
9540 obj-$(CONFIG_SERIAL_AT91) += at91_serial.o
9541 +obj-$(CONFIG_BCM_SERIAL) += bcm63xx_cons.o
9542 diff -urN linux.old/include/asm-mips/bootinfo.h linux.dev/include/asm-mips/bootinfo.h
9543 --- linux.old/include/asm-mips/bootinfo.h 2006-08-25 00:43:22.000000000 +0200
9544 +++ linux.dev/include/asm-mips/bootinfo.h 2006-08-25 00:39:38.000000000 +0200
9545 @@ -218,6 +218,14 @@
9546 #define MACH_GROUP_TITAN 22 /* PMC-Sierra Titan */
9547 #define MACH_TITAN_YOSEMITE 1 /* PMC-Sierra Yosemite */
9548
9549 +/*
9550 + * Valid machtype for group BRCM
9551 + */
9552 +#define MACH_GROUP_BRCM 23 /* Broadcom boards */
9553 +#define MACH_BCM96338 0
9554 +#define MACH_BCM96345 1
9555 +#define MACH_BCM96348 2
9556 +
9557 #define CL_SIZE COMMAND_LINE_SIZE
9558
9559 const char *get_system_type(void);
9560 diff -urN linux.old/include/asm-mips/cpu.h linux.dev/include/asm-mips/cpu.h
9561 --- linux.old/include/asm-mips/cpu.h 2006-08-25 00:43:22.000000000 +0200
9562 +++ linux.dev/include/asm-mips/cpu.h 2006-08-25 00:39:38.000000000 +0200
9563 @@ -103,6 +103,13 @@
9564
9565 #define PRID_IMP_SR71000 0x0400
9566
9567 +/* These are the PRID's for when 23:16 == PRID_COMP_BROADCOM
9568 + */
9569 +
9570 +#define PRID_IMP_BCM6338 0x9000
9571 +#define PRID_IMP_BCM6345 0x8000
9572 +#define PRID_IMP_BCM6348 0x9100
9573 +
9574 /*
9575 * Definitions for 7:0 on legacy processors
9576 */
9577 @@ -200,7 +207,10 @@
9578 #define CPU_SB1A 62
9579 #define CPU_74K 63
9580 #define CPU_R14000 64
9581 -#define CPU_LAST 64
9582 +#define CPU_BCM6338 65
9583 +#define CPU_BCM6345 66
9584 +#define CPU_BCM6348 67
9585 +#define CPU_LAST 67
9586
9587 /*
9588 * ISA Level encodings
9589 diff -urN linux.old/include/asm-mips/mach-bcm963xx/cpu-feature-overrides.h linux.dev/include/asm-mips/mach-bcm963xx/cpu-feature-overrides.h
9590 --- linux.old/include/asm-mips/mach-bcm963xx/cpu-feature-overrides.h 1970-01-01 01:00:00.000000000 +0100
9591 +++ linux.dev/include/asm-mips/mach-bcm963xx/cpu-feature-overrides.h 2006-08-25 11:27:40.000000000 +0200
9592 @@ -0,0 +1,36 @@
9593 +#ifndef __ASM_MACH_BCM963XX_CPU_FEATURE_OVERRIDES_H
9594 +#define __ASM_MACH_BCM963XX_CPU_FEATURE_OVERRIDES_H
9595 +
9596 +#define cpu_has_tlb 1
9597 +#define cpu_has_4kex 4
9598 +#define cpu_has_4ktlb 8
9599 +#define cpu_has_fpu 0
9600 +#define cpu_has_32fpr 0
9601 +#define cpu_has_counter 0x40
9602 +#define cpu_has_watch 0
9603 +#define cpu_has_mips16 0
9604 +#define cpu_has_divec 0x200
9605 +#define cpu_has_vce 0
9606 +#define cpu_has_cache_cdex_p 0
9607 +#define cpu_has_cache_cdex_s 0
9608 +#define cpu_has_prefetch 0x40000
9609 +#define cpu_has_mcheck 0x2000
9610 +#define cpu_has_ejtag 0x4000
9611 +#define cpu_has_llsc 0x10000
9612 +#define cpu_has_vtag_icache 0
9613 +#define cpu_has_dc_aliases 0
9614 +#define cpu_has_ic_fills_f_dc 0
9615 +
9616 +#define cpu_has_nofpuex 0
9617 +#define cpu_has_64bits 0
9618 +#define cpu_has_64bit_zero_reg 0
9619 +#define cpu_has_64bit_gp_regs 0
9620 +#define cpu_has_64bit_addresses 0
9621 +
9622 +#define cpu_has_subset_pcaches 0
9623 +
9624 +#define cpu_dcache_line_size() 16
9625 +#define cpu_icache_line_size() 16
9626 +#define cpu_scache_line_size() 0
9627 +
9628 +#endif /* __ASM_MACH_BCM963XX_CPU_FEATURE_OVERRIDES_H */
9629 diff -urN linux.old/include/asm-mips/mach-generic/param.h linux.dev/include/asm-mips/mach-generic/param.h
9630 --- linux.old/include/asm-mips/mach-generic/param.h 2006-08-25 00:43:22.000000000 +0200
9631 +++ linux.dev/include/asm-mips/mach-generic/param.h 2006-08-25 00:39:38.000000000 +0200
9632 @@ -8,6 +8,6 @@
9633 #ifndef __ASM_MACH_GENERIC_PARAM_H
9634 #define __ASM_MACH_GENERIC_PARAM_H
9635
9636 -#define HZ 1000 /* Internal kernel timer frequency */
9637 +#define HZ 200 /* Internal kernel timer frequency */
9638
9639 #endif /* __ASM_MACH_GENERIC_PARAM_H */
9640 diff -urN linux.old/include/asm-mips/module.h linux.dev/include/asm-mips/module.h
9641 --- linux.old/include/asm-mips/module.h 2006-08-25 00:43:22.000000000 +0200
9642 +++ linux.dev/include/asm-mips/module.h 2006-08-25 00:39:38.000000000 +0200
9643 @@ -113,6 +113,12 @@
9644 #define MODULE_PROC_FAMILY "RM9000 "
9645 #elif defined CONFIG_CPU_SB1
9646 #define MODULE_PROC_FAMILY "SB1 "
9647 +#elif defined CONFIG_CPU_BCM6338
9648 +#define MODULE_PROC_FAMILY "BCM6338 "
9649 +#elif defined CONFIG_CPU_BCM6345
9650 +#define MODULE_PROC_FAMILY "BCM6345 "
9651 +#elif defined CONFIG_CPU_BCM6348
9652 +#define MODULE_PROC_FAMILY "BCM6348 "
9653 #else
9654 #error MODULE_PROC_FAMILY undefined for your processor configuration
9655 #endif
9656
This page took 0.430491 seconds and 5 git commands to generate.