Annotation of qemu/roms/SLOF/board-qemu/slof/vio-vscsi.fs, revision 1.1

1.1     ! root        1: \ *****************************************************************************
        !             2: \ * Copyright (c) 2011 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: ." Populating " pwd
        !            14: 
        !            15: 0 CONSTANT vscsi-debug
        !            16: 
        !            17: 0 VALUE vscsi-unit
        !            18: 
        !            19: \ -----------------------------------------------------------
        !            20: \ Direct DMA conversion hack
        !            21: \ -----------------------------------------------------------
        !            22: : l2dma ( laddr - dma_addr)      
        !            23: ;
        !            24: 
        !            25: \ -----------------------------------------------------------
        !            26: \ CRQ related functions
        !            27: \ -----------------------------------------------------------
        !            28: 
        !            29: 0    VALUE     crq-base
        !            30: 0    VALUE     crq-dma
        !            31: 0    VALUE     crq-offset
        !            32: 1000 CONSTANT  CRQ-SIZE
        !            33: 
        !            34: CREATE crq 10 allot
        !            35: 
        !            36: : crq-alloc ( -- )
        !            37:     \ XXX We rely on SLOF alloc-mem being aligned
        !            38:     CRQ-SIZE alloc-mem to crq-base 0 to crq-offset
        !            39:     crq-base l2dma to crq-dma
        !            40: ;
        !            41: 
        !            42: : crq-free ( -- )
        !            43:     vscsi-unit hv-free-crq
        !            44:     crq-base CRQ-SIZE free-mem 0 to crq-base
        !            45: ;
        !            46: 
        !            47: : crq-init ( -- res )
        !            48:     \ Allocate CRQ. XXX deal with fail
        !            49:     crq-alloc
        !            50: 
        !            51:     vscsi-debug IF
        !            52:         ." VSCSI: allocated crq at " crq-base . cr
        !            53:     THEN
        !            54: 
        !            55:     \ Clear buffer
        !            56:     crq-base CRQ-SIZE erase
        !            57: 
        !            58:     \ Register with HV
        !            59:     vscsi-unit crq-dma CRQ-SIZE hv-reg-crq
        !            60: 
        !            61:     \ Fail case
        !            62:     dup 0 <> IF
        !            63:         ." VSCSI: Error " . ."  registering CRQ !" cr
        !            64:        crq-free
        !            65:     THEN
        !            66: ;
        !            67: 
        !            68: : crq-cleanup ( -- )
        !            69:     crq-base 0 = IF EXIT THEN
        !            70: 
        !            71:     vscsi-debug IF
        !            72:         ." VSCSI: freeing crq at " crq-base . cr
        !            73:     THEN
        !            74:     crq-free
        !            75: ;
        !            76: 
        !            77: : crq-send ( msgaddr -- true | false )
        !            78:     vscsi-unit swap hv-send-crq 0 =
        !            79: ;
        !            80: 
        !            81: : crq-poll ( -- true | false)
        !            82:     crq-offset crq-base + dup
        !            83:     vscsi-debug IF
        !            84:         ." VSCSI: crq poll " dup .
        !            85:     THEN
        !            86:     c@
        !            87:     vscsi-debug IF
        !            88:         ."  value=" dup . cr
        !            89:     THEN
        !            90:     80 and 0 <> IF
        !            91:         dup crq 10 move
        !            92:        0 swap c!
        !            93:        crq-offset 10 + dup CRQ-SIZE >= IF drop 0 THEN to crq-offset
        !            94:        true
        !            95:     ELSE drop false THEN
        !            96: ;
        !            97: 
        !            98: : crq-wait ( -- true | false)
        !            99:     \ FIXME: Add timeout
        !           100:     0 BEGIN drop crq-poll dup not WHILE d# 1 ms REPEAT
        !           101:     dup not IF
        !           102:         ." VSCSI: Timeout waiting response !" cr EXIT
        !           103:     ELSE
        !           104:         vscsi-debug IF
        !           105:             ." VSCSI: got crq: " crq dup l@ . ."  " 4 + dup l@ . ."  "
        !           106:            4 + dup l@ . ."  " 4 + l@ . cr
        !           107:         THEN
        !           108:     THEN
        !           109: ;
        !           110: 
        !           111: \ -----------------------------------------------------------
        !           112: \ CRQ encapsulated SRP definitions
        !           113: \ -----------------------------------------------------------
        !           114: 
        !           115: 01 CONSTANT VIOSRP_SRP_FORMAT
        !           116: 02 CONSTANT VIOSRP_MAD_FORMAT
        !           117: 03 CONSTANT VIOSRP_OS400_FORMAT
        !           118: 04 CONSTANT VIOSRP_AIX_FORMAT
        !           119: 06 CONSTANT VIOSRP_LINUX_FORMAT
        !           120: 07 CONSTANT VIOSRP_INLINE_FORMAT
        !           121: 
        !           122: struct
        !           123:    1 field >crq-valid
        !           124:    1 field >crq-format
        !           125:    1 field >crq-reserved
        !           126:    1 field >crq-status
        !           127:    2 field >crq-timeout
        !           128:    2 field >crq-iu-len
        !           129:    8 field >crq-iu-data-ptr
        !           130: constant /crq
        !           131: 
        !           132: : srp-send-crq ( addr len -- )
        !           133:     80                crq >crq-valid c!
        !           134:     VIOSRP_SRP_FORMAT crq >crq-format c!
        !           135:     0                 crq >crq-reserved c!
        !           136:     0                 crq >crq-status c!
        !           137:     0                 crq >crq-timeout w!
        !           138:     ( len )           crq >crq-iu-len w!
        !           139:     ( addr ) l2dma    crq >crq-iu-data-ptr x!
        !           140:     crq crq-send
        !           141:     not IF
        !           142:         ." VSCSI: Error sending CRQ !" cr
        !           143:     THEN
        !           144: ;
        !           145: 
        !           146: : srp-wait-crq ( -- [tag true] | false )
        !           147:     crq-wait not IF false EXIT THEN
        !           148: 
        !           149:     crq >crq-format c@ VIOSRP_SRP_FORMAT <> IF
        !           150:        ." VSCSI: Unsupported SRP response: "
        !           151:        crq >crq-format c@ . cr
        !           152:        false EXIT
        !           153:     THEN
        !           154: 
        !           155:     crq >crq-iu-data-ptr x@ true
        !           156: ;
        !           157: 
        !           158: \ Add scsi functions to dictionary
        !           159: scsi-open
        !           160: 
        !           161: 
        !           162: \ -----------------------------------------------------------
        !           163: \ SRP definitions
        !           164: \ -----------------------------------------------------------
        !           165: 
        !           166: 0 VALUE >srp_opcode
        !           167: 
        !           168: 00 CONSTANT SRP_LOGIN_REQ
        !           169: 01 CONSTANT SRP_TSK_MGMT
        !           170: 02 CONSTANT SRP_CMD
        !           171: 03 CONSTANT SRP_I_LOGOUT
        !           172: c0 CONSTANT SRP_LOGIN_RSP
        !           173: c1 CONSTANT SRP_RSP
        !           174: c2 CONSTANT SRP_LOGIN_REJ
        !           175: 80 CONSTANT SRP_T_LOGOUT
        !           176: 81 CONSTANT SRP_CRED_REQ
        !           177: 82 CONSTANT SRP_AER_REQ
        !           178: 41 CONSTANT SRP_CRED_RSP
        !           179: 42 CONSTANT SRP_AER_RSP
        !           180: 
        !           181: 02 CONSTANT SRP_BUF_FORMAT_DIRECT
        !           182: 04 CONSTANT SRP_BUF_FORMAT_INDIRECT
        !           183: 
        !           184: struct
        !           185:    1 field >srp-login-opcode
        !           186:    3 +
        !           187:    8 field >srp-login-tag
        !           188:    4 field >srp-login-req-it-iu-len
        !           189:    4 +
        !           190:    2 field >srp-login-req-buf-fmt
        !           191:    1 field >srp-login-req-flags
        !           192:    5 +
        !           193:   10 field >srp-login-init-port-ids
        !           194:   10 field >srp-login-trgt-port-ids
        !           195: constant /srp-login
        !           196: 
        !           197: struct
        !           198:    1 field >srp-lresp-opcode
        !           199:    3 +
        !           200:    4 field >srp-lresp-req-lim-delta
        !           201:    8 field >srp-lresp-tag
        !           202:    4 field >srp-lresp-max-it-iu-len
        !           203:    4 field >srp-lresp-max-ti-iu-len
        !           204:    2 field >srp-lresp-buf-fmt
        !           205:    1 field >srp-lresp-flags
        !           206: constant /srp-login-resp
        !           207: 
        !           208: struct
        !           209:    1 field >srp-lrej-opcode
        !           210:    3 +
        !           211:    4 field >srp-lrej-reason
        !           212:    8 field >srp-lrej-tag
        !           213:    8 +
        !           214:    2 field >srp-lrej-buf-fmt
        !           215: constant /srp-login-rej
        !           216: 
        !           217: 00 CONSTANT SRP_NO_DATA_DESC
        !           218: 01 CONSTANT SRP_DATA_DESC_DIRECT
        !           219: 02 CONSTANT SRP_DATA_DESC_INDIRECT
        !           220: 
        !           221: struct
        !           222:     1 field >srp-cmd-opcode
        !           223:     1 field >srp-cmd-sol-not
        !           224:     3 +
        !           225:     1 field >srp-cmd-buf-fmt
        !           226:     1 field >srp-cmd-dout-desc-cnt
        !           227:     1 field >srp-cmd-din-desc-cnt
        !           228:     8 field >srp-cmd-tag
        !           229:     4 +
        !           230:     8 field >srp-cmd-lun
        !           231:     1 +
        !           232:     1 field >srp-cmd-task-attr
        !           233:     1 +
        !           234:     1 field >srp-cmd-add-cdb-len
        !           235:    10 field >srp-cmd-cdb
        !           236:     0 field >srp-cmd-cdb-add
        !           237: constant /srp-cmd
        !           238: 
        !           239: struct
        !           240:     1 field >srp-rsp-opcode
        !           241:     1 field >srp-rsp-sol-not
        !           242:     2 +
        !           243:     4 field >srp-rsp-req-lim-delta
        !           244:     8 field >srp-rsp-tag
        !           245:     2 +
        !           246:     1 field >srp-rsp-flags
        !           247:     1 field >srp-rsp-status
        !           248:     4 field >srp-rsp-dout-res-cnt
        !           249:     4 field >srp-rsp-din-res-cnt
        !           250:     4 field >srp-rsp-sense-len
        !           251:     4 field >srp-rsp-resp-len
        !           252:     0 field >srp-rsp-data
        !           253: constant /srp-rsp
        !           254: 
        !           255: \ Storage for up to 256 bytes SRP request */
        !           256: CREATE srp 100 allot
        !           257: 0 VALUE srp-len
        !           258: 
        !           259: : srp-prep-cmd-nodata ( id lun -- )
        !           260:     srp /srp-cmd erase
        !           261:     SRP_CMD srp >srp-cmd-opcode c!
        !           262:     1 srp >srp-cmd-tag x!
        !           263:     srp >srp-cmd-lun 1 + c!    \ lun
        !           264:     srp >srp-cmd-lun c!                \ id
        !           265:     /srp-cmd to srp-len   
        !           266: ;
        !           267: 
        !           268: : srp-prep-cmd-io ( addr len id lun -- )
        !           269:     srp-prep-cmd-nodata                ( addr len )
        !           270:     swap l2dma                 ( len dmaaddr )
        !           271:     srp srp-len +              ( len dmaaddr descaddr )
        !           272:     dup >r x! r> 8 +           ( len descaddr+8 )
        !           273:     dup 0 swap l! 4 +          ( len descaddr+c )
        !           274:     l!    
        !           275:     srp-len 10 + to srp-len
        !           276: ;
        !           277: 
        !           278: : srp-prep-cmd-read ( addr len id lun -- )
        !           279:     srp-prep-cmd-io
        !           280:     01 srp >srp-cmd-buf-fmt c! \ in direct buffer
        !           281:     1 srp >srp-cmd-din-desc-cnt c!
        !           282: ;
        !           283: 
        !           284: : srp-prep-cmd-write ( addr len id lun -- )
        !           285:     srp-prep-cmd-io
        !           286:     10 srp >srp-cmd-buf-fmt c! \ out direct buffer
        !           287:     1 srp >srp-cmd-dout-desc-cnt c!
        !           288: ;
        !           289: 
        !           290: : srp-send-cmd ( -- )
        !           291:     vscsi-debug IF
        !           292:         ." VSCSI: Sending SCSI cmd " srp >srp-cmd-cdb c@ . cr
        !           293:     THEN
        !           294:     srp srp-len srp-send-crq
        !           295: ;
        !           296: 
        !           297: : srp-rsp-find-sense ( -- addr )
        !           298:     \ XXX FIXME: Always in same position
        !           299:     srp >srp-rsp-data
        !           300: ;
        !           301: 
        !           302: : srp-wait-rsp ( -- true | [ ascq asc sense-key false ] )
        !           303:     srp-wait-crq not IF false EXIT THEN
        !           304:     dup 1 <> IF
        !           305:         ." VSCSI: Invalid CRQ response tag, want 1 got " . cr
        !           306:        false EXIT
        !           307:     THEN drop
        !           308:     
        !           309:     srp >srp-rsp-tag x@ dup 1 <> IF
        !           310:         ." VSCSI: Invalid SRP response tag, want 1 got " . cr
        !           311:        false EXIT
        !           312:     THEN drop
        !           313:     
        !           314:     srp >srp-rsp-status c@
        !           315:     vscsi-debug IF
        !           316:         ." VSCSI: Got response status: "
        !           317:        dup .status-text cr
        !           318:     THEN
        !           319: 
        !           320:     0 <> IF
        !           321:        srp-rsp-find-sense
        !           322:        scsi-get-sense-data
        !           323:        vscsi-debug IF
        !           324:            ." VSCSI: Sense key: " dup .sense-text cr      
        !           325:        THEN
        !           326:        false EXIT
        !           327:     THEN
        !           328:     true
        !           329: ;
        !           330: 
        !           331: 
        !           332: \ -----------------------------------------------------------
        !           333: \ Core VSCSI
        !           334: \ -----------------------------------------------------------
        !           335: 
        !           336: CREATE sector d# 512 allot
        !           337: 
        !           338: 0 VALUE current-id
        !           339: 0 VALUE current-lun
        !           340: 
        !           341: \ SCSI test-unit-read
        !           342: : test-unit-ready ( -- true | [ ascq asc sense-key false ] )
        !           343:     current-id current-lun srp-prep-cmd-nodata
        !           344:     srp >srp-cmd-cdb scsi-build-test-unit-ready
        !           345:     srp-send-cmd
        !           346:     srp-wait-rsp
        !           347: ;
        !           348: 
        !           349: : inquiry ( -- true | false )
        !           350:     \ WARNING: ATAPI devices with libata seem to ignore the MSB of
        !           351:     \ the allocation length... let's only ask for ff bytes
        !           352:     sector ff current-id current-lun srp-prep-cmd-read
        !           353:     ff srp >srp-cmd-cdb scsi-build-inquiry
        !           354:     srp-send-cmd
        !           355:     srp-wait-rsp
        !           356:     dup not IF nip nip nip EXIT THEN \ swallow sense
        !           357: ;
        !           358: 
        !           359: : read-capacity ( -- true | false )
        !           360:     sector scsi-length-read-cap-10 current-id current-lun srp-prep-cmd-read
        !           361:     srp >srp-cmd-cdb scsi-build-read-cap-10
        !           362:     srp-send-cmd
        !           363:     srp-wait-rsp
        !           364:     dup not IF nip nip nip EXIT THEN \ swallow sense    
        !           365: ;
        !           366: 
        !           367: : start-stop-unit ( state# -- true | false )
        !           368:     current-id current-lun srp-prep-cmd-nodata
        !           369:     srp >srp-cmd-cdb scsi-build-start-stop-unit
        !           370:     srp-send-cmd
        !           371:     srp-wait-rsp
        !           372:     dup not IF nip nip nip EXIT THEN \ swallow sense    
        !           373: ;
        !           374: 
        !           375: : get-media-event ( -- true | false )
        !           376:     sector scsi-length-media-event current-id current-lun srp-prep-cmd-read
        !           377:     srp >srp-cmd-cdb scsi-build-get-media-event
        !           378:     srp-send-cmd
        !           379:     srp-wait-rsp
        !           380:     dup not IF nip nip nip EXIT THEN \ swallow sense    
        !           381: ;
        !           382: 
        !           383: : read-blocks ( -- addr block# #blocks blksz -- [ #read-blocks true ] | false )
        !           384:     over *                                     ( addr block# #blocks len )    
        !           385:     >r rot r>                                  ( block# #blocks addr len )
        !           386:     5 0 DO
        !           387:        2dup current-id current-lun
        !           388:        srp-prep-cmd-read                       ( block# #blocks addr len )
        !           389:         2swap                                  ( addr len block# #blocks )
        !           390:         2dup srp >srp-cmd-cdb scsi-build-read-10 ( addr len block# #blocks )
        !           391:        2swap                                   ( block# #blocks addr len )
        !           392:         srp-send-cmd
        !           393:        srp-wait-rsp
        !           394:        IF 2drop nip true UNLOOP EXIT THEN
        !           395:        srp >srp-rsp-status c@ 8 <> IF
        !           396:            nip nip nip 2drop 2drop false EXIT
        !           397:        THEN
        !           398:        3drop
        !           399:        100 ms
        !           400:     LOOP
        !           401:     2drop 2drop false
        !           402: ;
        !           403: 
        !           404: \ Cleanup behind us
        !           405: : vscsi-cleanup
        !           406:     ." VSCSI: Cleaning up" cr
        !           407: 
        !           408:     crq-cleanup
        !           409: 
        !           410:     \ Disable TCE bypass
        !           411:     vscsi-unit 0 rtas-set-tce-bypass
        !           412: ;
        !           413: 
        !           414: \ Initialize our vscsi instance
        !           415: : vscsi-init ( -- true | false )
        !           416:     ." VSCSI: Initializing" cr
        !           417: 
        !           418:     \ Can't use my-unit bcs we aren't instanciating (fix this ?)
        !           419:     " reg" get-node get-package-property IF
        !           420:         ." VSCSI: Not reg property !!!" 0
        !           421:     THEN
        !           422:     decode-int to vscsi-unit 2drop
        !           423: 
        !           424:     \ Enable TCE bypass special qemu feature
        !           425:     vscsi-unit 1 rtas-set-tce-bypass
        !           426: 
        !           427:     \ Initialize CRQ
        !           428:     crq-init 0 <> IF false EXIT THEN
        !           429: 
        !           430:     \ Send init command
        !           431:     " "(C0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00)" drop
        !           432:     crq-send not IF
        !           433:         ." VSCSI: Error sending init command"
        !           434:         crq-cleanup false EXIT
        !           435:     THEN
        !           436: 
        !           437:     \ Wait reply
        !           438:     crq-wait not IF
        !           439:         crq-cleanup false EXIT
        !           440:     THEN
        !           441: 
        !           442:     \ Check init reply
        !           443:     crq c@ c0 <> crq 1 + c@ 02 <> or IF
        !           444:         ." VSCSI: Initial handshake failed"
        !           445:        crq-cleanup false EXIT
        !           446:     THEN
        !           447: 
        !           448:     \ We should now login etc.. but we really don't need to
        !           449:     \ with our qemu model
        !           450: 
        !           451:     \ Ensure we cleanup after booting
        !           452:     ['] vscsi-cleanup add-quiesce-xt
        !           453: 
        !           454:     true
        !           455: ;
        !           456: 
        !           457: \ -----------------------------------------------------------
        !           458: \ SCSI scan at boot and child device support
        !           459: \ -----------------------------------------------------------
        !           460: 
        !           461: 0 INSTANCE VALUE target-id
        !           462: 0 INSTANCE VALUE target-lun
        !           463: 
        !           464: : set-address ( lun id -- )
        !           465:     to target-id to target-lun 
        !           466: ;
        !           467: 
        !           468: : dev-max-transfer ( -- n )
        !           469:     10000 \ Larger value seem to have problems with some CDROMs
        !           470: ;
        !           471: 
        !           472: : dev-get-capacity ( -- blocksize #blocks )
        !           473:     target-id to current-id target-lun to current-lun
        !           474:     read-capacity not IF 0 0 EXIT THEN
        !           475:     sector scsi-get-capacity-10
        !           476: ;
        !           477: 
        !           478: : dev-read-blocks ( -- addr block# #blocks blksize -- #read-blocks )
        !           479:     target-id to current-id target-lun to current-lun
        !           480:     read-blocks    
        !           481: ;
        !           482: 
        !           483: : initial-test-unit-ready ( -- true | [ ascq asc sense-key false ] )
        !           484:     0 0 0 false
        !           485:     3 0 DO
        !           486:         2drop 2drop
        !           487:         test-unit-ready dup IF UNLOOP EXIT THEN
        !           488:     LOOP    
        !           489: ;
        !           490: 
        !           491: : compare-sense ( ascq asc key ascq2 asc2 key2 -- true | false )
        !           492:     3 pick =       ( ascq asc key ascq2 asc2 keycmp )
        !           493:     swap 4 pick =   ( ascq asc key ascq2 keycmp asccmp )
        !           494:     rot 5 pick =    ( ascq asc key keycmp asccmp ascqcmp )
        !           495:     and and nip nip nip
        !           496: ;
        !           497: 
        !           498: 0 CONSTANT CDROM-READY
        !           499: 1 CONSTANT CDROM-NOT-READY
        !           500: 2 CONSTANT CDROM-NO-DISK
        !           501: 3 CONSTANT CDROM-TRAY-OPEN
        !           502: 4 CONSTANT CDROM-INIT-REQUIRED
        !           503: 5 CONSTANT CDROM-TRAY-MAYBE-OPEN
        !           504: 
        !           505: : cdrom-status ( -- status )
        !           506:     initial-test-unit-ready
        !           507:     IF CDROM-READY EXIT THEN
        !           508: 
        !           509:     vscsi-debug IF
        !           510:         ." TestUnitReady sense: " 3dup . . . cr
        !           511:     THEN
        !           512: 
        !           513:     3dup 1 4 2 compare-sense IF
        !           514:         3drop CDROM-NOT-READY EXIT
        !           515:     THEN
        !           516: 
        !           517:     get-media-event IF
        !           518:         sector w@ 4 >= IF
        !           519:            sector 2 + c@ 04 = IF
        !           520:                sector 5 + c@
        !           521:                dup 02 and 0<> IF drop 3drop CDROM-READY EXIT THEN
        !           522:                dup 01 and 0<> IF drop 3drop CDROM-TRAY-OPEN EXIT THEN
        !           523:                drop 3drop CDROM-NO-DISK EXIT
        !           524:            THEN
        !           525:        THEN
        !           526:     THEN
        !           527: 
        !           528:     3dup 2 4 2 compare-sense IF
        !           529:         3drop CDROM-INIT-REQUIRED EXIT
        !           530:     THEN
        !           531:     over 4 = over 2 = and IF
        !           532:         \ Format in progress... what do we do ? Just ignore
        !           533:        3drop CDROM-READY EXIT
        !           534:     THEN
        !           535:     over 3a = IF
        !           536:         3drop CDROM-NO-DISK EXIT
        !           537:     THEN
        !           538: 
        !           539:     \ Other error...
        !           540:     3drop CDROM-TRAY-MAYBE-OPEN    
        !           541: ;
        !           542: 
        !           543: : cdrom-try-close-tray ( -- )
        !           544:     scsi-const-load start-stop-unit drop
        !           545: ;
        !           546: 
        !           547: : cdrom-must-close-tray ( -- )
        !           548:     scsi-const-load start-stop-unit not IF
        !           549:         ." Tray open !" cr -65 throw
        !           550:     THEN
        !           551: ;
        !           552: 
        !           553: : dev-prep-cdrom ( -- )
        !           554:     target-id to current-id target-lun to current-lun
        !           555: 
        !           556:     5 0 DO
        !           557:         cdrom-status CASE
        !           558:            CDROM-READY           OF UNLOOP EXIT ENDOF
        !           559:            CDROM-NO-DISK         OF ." No medium !" cr -65 THROW ENDOF
        !           560:            CDROM-TRAY-OPEN       OF cdrom-must-close-tray ENDOF
        !           561:            CDROM-INIT-REQUIRED   OF cdrom-try-close-tray ENDOF
        !           562:            CDROM-TRAY-MAYBE-OPEN OF cdrom-try-close-tray ENDOF
        !           563:        ENDCASE
        !           564:        d# 1000 ms
        !           565:     LOOP
        !           566:     ." Drive not ready !" cr -65 THROW
        !           567: ;
        !           568: 
        !           569: : dev-prep-disk ( -- )
        !           570: ;
        !           571: 
        !           572: : vscsi-create-disk    ( lun id -- )
        !           573:     " disk" 0 " vio-vscsi-device.fs" included
        !           574: ;
        !           575: 
        !           576: : vscsi-create-cdrom   ( lun id -- )
        !           577:     " cdrom" 1 " vio-vscsi-device.fs" included
        !           578: ;
        !           579: 
        !           580: : wrapped-inquiry ( -- true | false )
        !           581:     inquiry not IF false EXIT THEN
        !           582:     \ Skip devices with PQ != 0
        !           583:     sector inquiry-data>peripheral c@ e0 and 0 =
        !           584: ;
        !           585: 
        !           586: 8 CONSTANT #dev
        !           587: : vscsi-find-disks      ( -- )   
        !           588:     ." VSCSI: Looking for disks" cr
        !           589:     #dev 0 DO                                      \ check 8 devices (no LUNs)
        !           590:         i to current-id 0 to current-lun
        !           591:        wrapped-inquiry IF      
        !           592:            ."   SCSI ID " i .
        !           593:            \ XXX FIXME: Check top bits to ignore unsupported units
        !           594:            \            and maybe provide better printout & more cases
        !           595:            sector inquiry-data>peripheral c@ CASE
        !           596:                 0   OF ." DISK     : " 0 i vscsi-create-disk  ENDOF
        !           597:                 5   OF ." CD-ROM   : " 0 i vscsi-create-cdrom ENDOF
        !           598:                 7   OF ." OPTICAL  : " 0 i vscsi-create-cdrom ENDOF
        !           599:                 e   OF ." RED-BLOCK: " 0 i vscsi-create-disk  ENDOF
        !           600:                 dup dup OF ." ? (" . 8 emit 29 emit 5 spaces ENDOF
        !           601:             ENDCASE
        !           602:            sector .inquiry-text cr
        !           603:        THEN
        !           604:     LOOP
        !           605: ;
        !           606: 
        !           607: \ Remove scsi functions from word list
        !           608: scsi-close
        !           609: 
        !           610: : setup-alias
        !           611:     " scsi" find-alias 0= IF
        !           612:         " scsi" get-node node>path set-alias
        !           613:     ELSE THEN 
        !           614: ;
        !           615: 
        !           616: : vscsi-init-and-scan  ( -- )
        !           617:     vscsi-init IF
        !           618:         vscsi-find-disks
        !           619:        setup-alias
        !           620:     THEN
        !           621: ;
        !           622: 
        !           623: vscsi-init-and-scan

unix.superglobalmegacorp.com

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