Annotation of qemu/roms/SLOF/slof/fs/usb/usb-static.fs, revision 1.1

1.1     ! root        1: \ *****************************************************************************
        !             2: \ * Copyright (c) 2004, 2008 IBM Corporation
        !             3: \ * All rights reserved.
        !             4: \ * This program and the accompanying materials
        !             5: \ * are made available under the terms of the BSD License
        !             6: \ * which accompanies this distribution, and is available at
        !             7: \ * http://www.opensource.org/licenses/bsd-license.php
        !             8: \ *
        !             9: \ * Contributors:
        !            10: \ *     IBM Corporation - initial implementation
        !            11: \ ****************************************************************************/
        !            12: 
        !            13: \ #include "scsi-support.fs"
        !            14: 
        !            15: \ Set usb-debug flag to TRUE for debugging output:
        !            16: 0 VALUE usb-debug-flag
        !            17: false VALUE scan-time?
        !            18: 
        !            19: VARIABLE ihandle-bulk-tran
        !            20: \ -scsi-supp-  VARIABLE ihandle-scsi-tran
        !            21: 
        !            22: \ uDOC (Micro-Disk-On-Chip) is a FLASH-device
        !            23: \ normally connected to usb-port 5 on ELBA
        !            24: \
        !            25: 0 VALUE uDOC-present       \ device present and working?
        !            26: 
        !            27: \ Print a debug message when usb-debug-flag is set
        !            28: : usb-debug-print  ( str len -- )
        !            29:    usb-debug-flag  IF type cr ELSE 2drop THEN
        !            30: ;
        !            31: 
        !            32: \ Print a debug message with corresponding value when usb-debug-flag is set
        !            33: : usb-debug-print-val  ( str len val -- )
        !            34:    usb-debug-flag  IF -ROT type . cr ELSE drop 2drop THEN
        !            35: ;
        !            36: 
        !            37: \ show proceeding propeller only during scan process.
        !            38: \ As soon USB-keyboard can be used, this must be suppressed.
        !            39: 0 VALUE proceed-char
        !            40: : show-proceed ( -- )
        !            41:    scan-time?              \ are we on usb-scan ?
        !            42:    IF
        !            43:       proceed-char
        !            44:       CASE
        !            45:          0   OF 2d ENDOF   \ show '-'
        !            46:          1   OF 5c ENDOF   \ show '\'
        !            47:          2   OF 7c ENDOF   \ show '|'
        !            48:          dup OF 2f ENDOF   \ show '/'
        !            49:       ENDCASE
        !            50:       emit 8 emit
        !            51:       proceed-char 1 + 3 AND to proceed-char
        !            52:    THEN
        !            53: ;
        !            54: 
        !            55: \ delay with proceeding signs
        !            56: : wait-proceed ( nl -- )
        !            57:    show-proceed
        !            58:    BEGIN
        !            59:       dup d# 100 >         ( nl true|false )
        !            60:       WHILE
        !            61:       100 - show-proceed
        !            62:       100 ms               \ do it in steps of 100ms
        !            63:    REPEAT
        !            64:    ms                      \ rest delay
        !            65: ;
        !            66: 
        !            67: \ register device alias
        !            68: : do-alias-setting ( num name-str name-len )
        !            69:    rot $cathex strdup            \ create alias name
        !            70:    get-node node>path            \ get path string
        !            71:    set-alias                     \ and set the alias
        !            72: ;
        !            73: 
        !            74: 
        !            75: 0 VALUE ohci-alias-num
        !            76: 
        !            77: \ create a new ohci device alias for the current node:
        !            78: : set-ohci-alias  ( -- )
        !            79:    ohci-alias-num dup 1+ TO ohci-alias-num    ( num )
        !            80:    s" ohci"
        !            81:    do-alias-setting
        !            82: ;
        !            83: 
        !            84: 0 VALUE cdrom-alias-num
        !            85: 0 VALUE disk-alias-num        \ shall start with: pci-disk-num
        !            86: FALSE VALUE ext-disk-alias    \ first external disk: not yet assigned
        !            87: 
        !            88: \ create a new ohci device alias for the current node:
        !            89: : set-drive-alias  ( --  )
        !            90:    space 5b emit
        !            91:    s" cdrom" drop                ( name-str )
        !            92:    get-node node>name comp 0=    ( true|false )
        !            93:    IF                            \ is this a cdrom ?
        !            94:       cdrom-alias-num dup 1+ TO cdrom-alias-num    ( num )
        !            95:       s" cdrom"                  \ yes, alias = cdrom
        !            96:    ELSE
        !            97:       s" sbc-dev" drop           \ is this a scsi-block-device?
        !            98:       get-node node>name comp 0= ( true|false )
        !            99:       IF
        !           100:          disk-alias-num dup 1 + to disk-alias-num
        !           101:          s" disk"                \ all block devices will be named "disk"
        !           102: 
        !           103:          \ this is a block-device.
        !           104:          \ check if parent is 'usb' and not 'hub'
        !           105:          \ if so this block-device is directly connected
        !           106:          \ to root-hub and must be the uDOC-device in Elba
        !           107:          s" usb" drop            \ parent = usb controller ? (not hub)
        !           108:          get-node node>parent @ node>name
        !           109:          comp 0=                 \ parent node starts with 'usb' ?
        !           110:          IF                      ( true|false )
        !           111:             1 s" hdd"            \ add extra alias hdd1 for IntFlash
        !           112:             2dup type 2 pick .
        !           113:             8 emit 2f emit
        !           114:             do-alias-setting
        !           115:             uDOC-present 1 and
        !           116:             IF
        !           117:                uDOC-present 2 or to uDOC-present \ present and ready
        !           118:             THEN
        !           119:          ELSE
        !           120:             ext-disk-alias not   \ flag for first ext. disk already assigned
        !           121:             IF
        !           122:                TRUE to ext-disk-alias
        !           123:                2 s" hdd"         \ add extra alias hdd2 for first USB disk
        !           124:                2dup type 2 pick .
        !           125:                8 emit 2f emit
        !           126:                do-alias-setting
        !           127:             THEN
        !           128:          THEN
        !           129:       ELSE
        !           130:          0 s" ??? "              \ unknown device
        !           131:       THEN
        !           132:    THEN     ( num name-str name-len )
        !           133:    2dup type 2 pick .
        !           134:    8 emit 5d emit cr
        !           135:    do-alias-setting
        !           136: ;
        !           137: 
        !           138: : usb-create-alias-name ( num -- str len )
        !           139:     >r s" ohciX" 2dup + 1-           ( str len last-char-ptr  R: num )
        !           140:     r> [char] 0 + swap c!            ( str len  R: )
        !           141: ;
        !           142: 
        !           143: 
        !           144: \ *****************************************************
        !           145: \ This is a final check to see, if a uDOC-device
        !           146: \ is ready for booting
        !           147: \ If physically present, but not working, an
        !           148: \ Error-LED must be activated (on ELBA only!)
        !           149: \ *****************************************************
        !           150: \ uDOC is now replaced by ModFD (Modular-Flash-Drive)
        !           151: \ due to right properties
        !           152: \ 'sys-signal-modfd-fault' sends an IPMI-Message to
        !           153: \ aMM for generating a log entry and to switch on
        !           154: \ an error LED (call to libsystem->libipmi)
        !           155: \ *****************************************************
        !           156: \ although there are IPMI-warnings defined concerning
        !           157: \ detected media errors, it doesn't make sense to send
        !           158: \ a warning when booting from this device is impossible.
        !           159: \ The decision was made to send an error call in this
        !           160: \ case as well
        !           161: \ *****************************************************
        !           162: \ uDOC-present bits:
        !           163: \ *****************************************************
        !           164: \ D0: any device is connected on port 3 of root-hub
        !           165: \ D1: device on port 3 is directly connected (no hub)
        !           166: \ D2: warnings were received (scancodes)
        !           167: \ D3: OverCurrentIndicator on USB-Port was set
        !           168: \ D7: flag, set while ModFD is beeing processed
        !           169: 
        !           170: : uDOC-check   ( -- )
        !           171: #ifdef ELBA
        !           172:    uDOC-present 7 and               \ flags concerning ModFD device
        !           173:    CASE
        !           174:       0  OF                         \ not present not detected
        !           175:          uDOC-present 8 and 0<>     \ not detected due to OverCurrent?
        !           176:          IF
        !           177:             0d emit ."   * OverCurrent on ModFD *" cr
        !           178:             sys-signal-modfd-fault     ( -- )      \ send IPMI-call to BMC
        !           179:          ELSE
        !           180:             0d emit ."   ModFD not present" cr
        !           181:          THEN
        !           182:       ENDOF
        !           183: 
        !           184:       1  OF       \ present but not detected by USB
        !           185:          0d emit ."   * ModFD not accessible *" cr
        !           186:          sys-signal-modfd-fault     ( -- )      \ send IPMI-call to BMC
        !           187:       ENDOF
        !           188: 
        !           189:       3  OF       \ present and detected
        !           190: \        0d emit ."   ModFD OK" cr
        !           191:       ENDOF
        !           192: 
        !           193:       7  OF       \ present and detected but with warnings
        !           194:          0d emit ."   * ModFD Warnings *" cr
        !           195:          sys-signal-modfd-fault     ( -- )      \ send IPMI-call to BMC
        !           196:       ENDOF
        !           197: 
        !           198:       dup OF      \ we have a fault in our firmware !
        !           199:          s"   *** ModFD detection error ***" usb-debug-print
        !           200:       ENDOF
        !           201:    ENDCASE
        !           202: #endif
        !           203: ;
        !           204: 
        !           205: \ *****************************************************
        !           206: \ check if actual processed device is ModFD and
        !           207: \ then sets its warning bit
        !           208: \ *****************************************************
        !           209: : uDOC-failure?   ( -- )
        !           210:    uDOC-present 80 and 0<>                \ is ModFD actual beeing processed?
        !           211:    IF
        !           212:       uDOC-present 04 or to uDOC-present  \ set Warning flag
        !           213:    THEN
        !           214: ;
        !           215: 
        !           216: \ Scan all USB host controllers for attached devices:
        !           217: : usb-scan
        !           218:    \ Scan all OHCI chips:
        !           219:    space ." Scan USB... " cr
        !           220:    true to scan-time?            \ show proceeding signs
        !           221:    0 to uDOC-present             \ mark as not present
        !           222:    0 to disk-alias-num           \ start with disk0
        !           223:    s" pci-disk-num" $find        \ previously detected disks ?
        !           224:    IF
        !           225:       execute to disk-alias-num  \ overwrite start number
        !           226:    ELSE
        !           227:       2drop
        !           228:    THEN
        !           229: 
        !           230:    0 >r                             \ Counter for alias
        !           231:    BEGIN
        !           232:       r@ usb-create-alias-name
        !           233:       find-alias ?dup               ( false | str len len  R: num )
        !           234:    WHILE
        !           235:       usb-debug-flag IF
        !           236:          ." * Scanning hub " 2dup type ." ..." cr
        !           237:       THEN
        !           238:       open-dev ?dup IF              ( ihandle  R: num )
        !           239:          dup to my-self
        !           240:          dup ihandle>phandle dup set-node
        !           241:           child ?dup IF
        !           242:               delete-node s" Deleting node" usb-debug-print
        !           243:           THEN
        !           244:          >r s" enumerate" r@ $call-method   \ Scan host controller
        !           245:          r> close-dev  0 set-node 0 to my-self
        !           246:       THEN                          ( R: num )
        !           247:       r> 1+ >r                      ( R: num+1 )
        !           248:    REPEAT   r> drop
        !           249:    0 TO ohci-alias-num
        !           250:    0 TO cdrom-alias-num
        !           251:    s" cdrom0" find-alias            ( false | dev-path len )
        !           252:    dup IF
        !           253:        s" cdrom" 2swap              ( alias-name len' dev-path len )
        !           254:        set-alias                    ( -- )
        !           255:        \ cdrom-alias-num 1 + TO cdrom-alias-num
        !           256:    ELSE 
        !           257:        drop                         ( -- )
        !           258:    THEN
        !           259:    uDOC-check  \ check if uDOC-device is present and working (ELBA only)
        !           260:    false to scan-time?                 \ suppress proceeding signs
        !           261: ;
        !           262: 
        !           263: : usb-probe
        !           264: 
        !           265:   usb-scan
        !           266: 
        !           267:   cdrom-alias-num 0= IF
        !           268:      ." Not found CDROM! " cr
        !           269:   THEN
        !           270:      ." CDROM found " cdrom-alias-num . cr 
        !           271: ;
        !           272: 
        !           273:  
        !           274: : usb-dev-test ( -- TRUE )
        !           275:    s" USB Device Test " usb-debug-print
        !           276:    1 usb-create-alias-name
        !           277:    find-alias ?dup IF
        !           278:       ." * open " 2dup type . cr
        !           279:    ELSE
        !           280:       s" can't found alias " usb-debug-print
        !           281:    THEN
        !           282:    open-dev ?dup IF
        !           283:       dup to my-self
        !           284:       dup ihandle>phandle dup set-node
        !           285:       s" bulk" $open-package ihandle-bulk-tran !
        !           286: \      make-media-ready
        !           287:       s" close all " usb-debug-print
        !           288:       close-dev 0 set-node 0 to my-self
        !           289: 
        !           290:       ihandle-bulk-tran close-package
        !           291:    ELSE
        !           292:       s" can't open usb hub" usb-debug-print
        !           293:    THEN
        !           294: 
        !           295:    TRUE
        !           296: ;
        !           297: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.